feat(duelo-yugioh): modo speed duel estilo Duel Links - #31
Merged
Conversation
Added: - public/assets/icons/logo.png Modified: - components/ygo/YgoBoard.tsx Change summary: updates logic Details: updates logo, YgoBoard
Feat/duelo yugioh
Contributor
Author
Owner
|
que genial. |
mcsscalabrin
added a commit
that referenced
this pull request
Aug 15, 2026
Conflito semantico de merge, nao conflito textual: o PR #31 entrou na main em paralelo trazendo dois fixtures de Card, e o campo `axis` desta branch os invalidou. Arquivos diferentes, entao o git mergeou limpo e so o tsc percebeu. E so isso mesmo. Nada em lib/duel/ nem em lib/ygo/ le `Card.axis` -- o unico `.axis` de la e o `AxisRating.axis` do radar, em duel/engine.ts, que e outra coisa. E as rotas obtem carta por getProfileCard, que popula o campo. Por isso os 277 testes passavam com o tipo quebrado: o Vitest transpila sem checar tipo, e em execucao o campo sempre esteve la.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

What changed, and why
Esta branch traz o Speed Duel — o modo estilo Yu-Gi-Oh que o produto pedia —, a navegação que o liga ao duelo existente e uma reescrita do arrastar-e-soltar da nova arena.
Speed Duel (modo Yu-Gi-Oh)
O produto já tinha dois confrontos: a batalha (um lance único de pontuação) e o duelo (por turnos, dirigido pelo visitante). O Speed Duel é o terceiro e o mais jogável: uma partida estilo Duel Links entre dois logins do GitHub numa mesa 3D, cada lado com LP, um deck de monstros/feitiços/armadilhas sorteado do elenco de perfis (
lib/ygo/roster.ts) e fases draw/main/battle/end com janela de armadilha.A restrição importante é como a partida é decidida. A arena roda o mesmo motor do servidor em lockstep:
lib/ygo/engine.tsé executado no navegador do visitante e de novo emPOST /api/ygo, na mesma semente e consumindo o PRNG na mesma ordem. O visitante é sempre o lado A; o lado B é a IA (aiAct, mesma heurística e disciplina de RNG do duelo). Ao fim, as ações do visitante são enviadas uma única vez, re-executadas e persistidas no servidor, e a arena redireciona para o resultado estável/ygo/<id>— replay (components/ygo/YgoReplay.tsx) e pôster (lib/og/renderYgo.tsx,app/api/ygo/[ygoId]/image) seguem as convenções do duelo v2, com cache immutable no pôster.Duel v2
O modo foi construído sobre o sistema de duelo v2, que entra junto neste mesmo PR (motor, árbitro, board, replay e pôster em
lib/duel/,components/duel/,app/duel/). O v2 é dirigido: o visitante escolhe a cada turno, a IA responde num timer, e os dois lados são perfis reais do GitHub.Navegação entre modos
/duel/<a>/vs/<b>) ganhou o link "Versão Yu-Gi-Oh" para o mesmo confronto; a arena mostra "Versão Duelo" de volta — só quando os dois lados são do elenco (ROSTER_LOGINS), porque a arena ygo sorteia do pool do elenco enquanto o duelo aceita qualquer perfil do GitHub./ygo/<a>/vs/<b>.home.modeBattle,home.modeYgo,battle.asYgo,ygo.asDuel).Arrastar-e-soltar da arena (reescrita + duas correções)
A primeira versão da arena usava drag nativo do HTML5, e havia dois problemas: o summon ignorava a zona do drop (o motor pegava a primeira vaga livre) e as cartas eram arrastáveis fora da vez do jogador (nada acendia, parecia morto). A ação
summonganhou umzoneopcional, que o motor honra com fallback para a IA/ações legadas; o arrasto passou a ser liberado porcanDrag = myTurn && !trapWindow.A mudança maior: o
draggabledo HTML5 foi substituído por pointer events. Opointerdowninicia o arrasto com captura de ponteiro, uma carta-fantasma segue o cursor, o alvo é resolvido viaelementFromPointcontra.ygo-zone[data-side][data-type][data-zone], e zonas válidas acendem. Opointerupdistingue clique (deslocamento < 6px) de arrasto, e o summon abre o seletor de posição já ligado à zona escolhida. Isso também é o que faz a arena funcionar em toque, onde o drag nativo do HTML5 não existe.What you saw
A arena é 3D e sensível a layout, então segue o que conferir:
Para dirigir:
npm run devem/ygo/<a>/vs/<b>,/duel/<a>/vs/<b>e/.Checks
npm run lintnpm run typechecknpm test(263 passaram)lib/cards/index.ts/CARD_VERSIONintactos.