Commit Graph

142 Commits

Author SHA1 Message Date
MpakobecEx d4e6e9d8c0 Add match protocol spec and shared network contracts 2026-10-21 14:14:52 +05:00
MpakobecEx 9e1ed87d5d Add session handoff with current state and next steps
docs/HANDOFF.md records the completed engine, card coverage, replay, stress results, key files, decisions, remaining server/meta/client work and the pitfalls found during development. README links to it.
2026-10-21 14:06:10 +05:00
MpakobecEx 99532b6e8f Stress-test 1000 bot games and fix the guard-step deadlock
GameInvariants checks card counts, unique instance ids and damage. The CLI stress command runs random legal bot games and fails on the first violation. It exposed a real bug: an optional OnGuard ability that could not be paid (or was declined) reset the step from Guard to None while the battle was still open. OfferAbility now reports Skipped/Paused/Resolved and callers continue only when needed. 1000/1000 games finish with no errors.
2026-10-21 14:03:14 +05:00
MpakobecEx 66d52169fc Finish the card set: Tejas, Yaksha, back-row attacks and replay
Normal units can no longer attack the back row; Wyvern Strike, Tejas attacks the back row of its own column. Demonic Dragon Berserker, Yaksha rides itself from hand when an opponent's rear-guard is retired during the main phase. Match replay: CommandCodec, MatchRecord, MatchRecorder, ReplayRunner and an FNV event hash; a JSON round-trip replays a full bot game bit-for-bit. Three tests; 116 total.
2026-10-21 14:00:16 +05:00
MpakobecEx 4524c0f19f Legal intents and a 50-game bot invariant test
GameEngine.LegalCommands returns every meaningful command for the current phase, pending trigger, ability, order or choice. A random bot plays 50 deterministic games and checks that each player always has 50 cards across zones, instance ids stay unique and damage never exceeds six. Fixes found by the bot: search-to-call no longer loses a card when there is no empty circle (InTransit), a stand trigger with no rear-guards can resolve, unpayable optional abilities no longer stall the order, and legal intents skip impossible retire-self and repeated intercept commands.
2026-10-21 13:56:24 +05:00
MpakobecEx d30be8cec2 Finish TD01/TD02 scripts and the last BT01 effects
New triggers: OnBoostedHit, OnRetireFromRC, OnOpponentRetire, OnGuard; activated abilities from hand and drop zone; superior ride from drop. Cards: Voidmaster, Hagakure, Dreadmaster, Monster Frank, Blightops, Llew, Dragon Knight Aleph, Gancelot hand effect, Deathrex second effect, Brigitte, Bors, Tristan, Starlight Unicorn, Goku, Berserk Dragon, Aermo, Joka, Rakshasa. Four tests; 111 total.
2026-10-21 13:51:45 +05:00
MpakobecEx 7ca53975d7 Drive-check and guardian triggers, return-to-deck effects, 8 more cards
Asura Kaiser reacts to grade 3 Nova Grappler drive checks; Rock the Wall and Redshoe Milly move from the guardian circle to soul; Juggernaut and Brakki return to deck after battle; Lozenge and Battleraizer return at end of turn; Guiding Zombie puts itself into soul and mills three. Four tests; 102 total.
2026-10-21 13:47:00 +05:00
MpakobecEx 80095da51f Script 21 more BT01 cards
New scripts: Mocha, Randolf, Chigasumi, Queen of Heart, Jarran, Milk, Nightmare Baby, Hungry Dumpty, Clay Doll Mechanic, Blue Dust, Karma Queen, Hell Spider, Dragonic Overlord, Gancelot, Aleph, Apollon, Lohengrin, Vortex Dragon, Amaterasu, Mr. Invincible, Brutal Jack. Engine additions: OnBoosted trigger, reusable effect helpers (soul charge, retire all, flip damage, return hand card to deck, opponent discard), boost-trigger chaining so attack-declared waits for boost resolution. Four new tests; 98 total.
2026-10-21 13:44:39 +05:00
MpakobecEx 1965816808 Restore Cyrillic comments corrupted by PowerShell re-encoding
Two files were rewritten with Get-Content/Set-Content and lost their UTF-8 encoding. Restored the clean versions and re-applied the changes with an encoding-safe editor.
2026-10-21 13:39:44 +05:00
MpakobecEx ff7774b236 Multi-target choices, action restrictions and rear-guard hit triggers
AskUnitMultiChoice asks one target at a time, offers Done once the minimum is met and resolves automatically at the maximum. CardRestriction models cannot-stand/attack/boost/intercept with source, effect id and duration, including UntilOwnerNextStand. Restraint can be overridden by effects. OnAttackHit now fires when the attack hits a rear-guard. Five tests.
2026-10-21 13:38:21 +05:00
MpakobecEx 1fcb3b80df Structured stat modifiers and grantable abilities
StatModifier stores value, source card, effect id and duration (battle / turn / permanent), so a specific effect can be removed without touching others. GrantedAbility lets effects add abilities that are not printed on the card; the engine merges printed and granted abilities. Boost and trigger bonuses now use modifiers. Three tests.
2026-10-21 13:33:50 +05:00
MpakobecEx 6f5bd4e287 Card choice from hand as an effect cost
AskHandCardChoice pauses on the hand and returns the chosen card, so abilities can pay discard costs interactively. Knight of Rose, Morgana implemented: on attack, optionally discard a card for +4000 until end of turn. Test covers the full pause chain and the return to the guard step.
2026-10-21 13:29:16 +05:00
MpakobecEx 6538a470da Hit effects resolve after damage; effects never nest
OnAttackHit now fires after the damage check and after the card enters the damage zone, with a continuation when damage triggers pause. Added a resolution queue: triggers raised while an effect is resolving are stored and played back strictly one after another (depth counter on ResolveAbility and Choose). New test asserts damage exists before the hit effect is offered.
2026-10-21 13:26:59 +05:00
MpakobecEx 4333bb5bd0 Wire phase-start, attack-declared and attack-hit triggers
Added a command guard while an ability resolves, a continuation mechanism for mid-battle pauses, and TriggerAll for scanning the field. Cards: Demon Eater (soul charge at main phase start), Tyrant Deathrex (+5000 when attacking), Maiden of Libra (Counter Blast 2 and draw on hit). Three tests.
2026-10-21 13:23:36 +05:00
MpakobecEx a5fef89984 Top-deck look and search-to-call/ride
LookTopAndReorder asks top or bottom without revealing the deck. SearchDeckToCall and SearchDeckToRide wrap the search primitive; Alfred searches a Royal Paladin grade 2 or lower and calls it, Cocoa looks at the top card. Five tests.
2026-10-21 13:20:47 +05:00
MpakobecEx fa507576d9 Server-side deck search without exposing the deck
SearchDeck hides the deck and returns matches only: none -> SearchFailedEvent and shuffle, one -> straight to the effect, several -> PendingChoice. Different arts are separate results, labelled with the printing id. Wired into Conroe, which pays Counter Blast 1 and retires itself. Four tests.
2026-10-21 13:18:57 +05:00
MpakobecEx a1e7c250bf Target selection and Activated abilities
PendingChoice/ChooseCommand let effects ask the player to pick a unit. Added Counter Blast and Soul Blast cost helpers. Blaster Blade implemented for both zones with its CB2 cost and rear-guard target. Activated abilities pay rest-self and discard; Lake Maiden Lien, Gojo and Shout draw a card. Seven tests.
2026-10-21 13:14:16 +05:00
MpakobecEx 5262b6b93c Add a test proving guard also protects a rear-guard from retirement 2026-10-21 13:10:03 +05:00
MpakobecEx b7473f73d7 Ability bus, Check Timing and the first card scripts
CardScript model with Triggered and Continuous abilities. Check Timing collects triggered abilities, orders them (turn player first, player picks the order via SelectTriggerCommand), and pauses on optional abilities (ResolveAbilityCommand). Continuous effects are recomputed on demand in EffectivePower. Scripts: Barcgal (optional call from soul), Wingal (+4000 when boosting Blaster Blade), Alfred (+2000 per Royal Paladin rear-guard). Six tests.
2026-10-21 00:53:36 +05:00
MpakobecEx bf2ea337f8 Drive checks belong to the attacking card
Grade 0-2 vanguard performs one check, grade 3+ performs two, rear-guards perform none by default. CardInstance.DriveChecksOverride lets effects remove Twin Drive or grant checks to a rear-guard. Added DriveCheckedEvent for the log. Five tests.
2026-10-21 00:47:44 +05:00
MpakobecEx 71db856480 Move: rear-guard moves within its column and swaps with an occupied circle
MoveCommand(from, to) in the Main phase. Only 0-3 (left) and 2-4 (right) are valid pairs; the center back row has no partner. Rested state stays with the card. Five tests.
2026-10-21 00:45:15 +05:00
MpakobecEx 4dd96e6f02 Intercept also works when the vanguard is attacked
Removed the rear-guard-only restriction. Interceptor resolution now runs before the vanguard damage branch, so a successful intercept retires the interceptor and the vanguard takes no damage. The attacked rear-guard still cannot intercept itself. Two tests.
2026-10-21 00:43:10 +05:00
MpakobecEx fdc21c8a26 Intercept: grade 2 front-row rear-guard moves to the guardian circle
InterceptCommand during the guard step. The interceptor leaves its circle, becomes the power reference for the attack and goes to the drop zone at the end of the battle; the original target survives. Grade 1 cannot intercept, back row only with InterceptFromBackRow granted by an effect. Five tests.
2026-10-21 00:40:23 +05:00
MpakobecEx 830785a8d6 Perfect Guard: pay the cost to nullify the attack, otherwise zero shield
GuardCommand takes an optional discard. Sentinel cards have zero shield; paying with a card of the same clan sets Nullified on the battle so power no longer matters. Three tests: paid, unpaid, wrong clan.
2026-10-21 00:37:05 +05:00
MpakobecEx 66f2ecc3f5 Implement Boost as a separate ability that effects can grant or remove
Cards of grade 0 and 1 have boost by default (HasBoost); CardInstance.BoostOverride lets an effect grant or remove it at runtime. AttackCommand takes an optional BoosterSlot: the back-row unit in the same column adds its power for that battle only and becomes rested. Four new tests.
2026-10-21 00:34:58 +05:00
MpakobecEx c2480bab63 Trigger buffs last until end of turn; trigger cards go through the trigger zone first
Order is now: reveal -> trigger zone -> resolve effects -> hand (drive check) or damage (damage check). Damage is added only after the trigger resolves, so heal compares the pre-damage count. Temporary power/crit are cleared at end of turn instead of end of battle.
2026-10-21 00:30:28 +05:00
MpakobecEx ebbfb46834 Damage check triggers also pause for target selection
Damage check now places the card, then pauses on a trigger with PendingTrigger(DamageCheck) and the remaining damage count. Resolving applies the same +5000 and secondary effect as drive check, then continues the remaining damage or closes the battle. 34 tests.
2026-10-21 00:27:09 +05:00
MpakobecEx a4457c6d21 Trigger targeting: +5000 and secondary effect are chosen by the player
Drive check now pauses on a trigger and waits for ResolveTriggerCommand(powerTarget, effectTarget). Power and crit modifiers moved from the battle to the unit and are cleared at the end of the battle. Stand stands the chosen rear-guard; Critical applies +1 crit to the chosen unit. Damage-check triggers still apply only the secondary effect.
2026-10-21 00:24:21 +05:00
MpakobecEx 1b317b6532 Game engine skeleton: phases, ride, call, battle, drive and damage
Pure rules library with no Orleans or database. Command in, events out. Deterministic RNG stored in GameState. Covers setup with starting vanguard and mulligan, six phases, ride, call, attack, guard, drive check, damage check with triggers, retirement and win at six damage. 8 engine tests, 30 total. Sentinel, boost and card abilities are the next step.
2026-10-21 00:20:10 +05:00
MpakobecEx 7687d2f0b6 Confirm polite 'vy' address; translation canon is closed 2026-10-21 00:16:45 +05:00
MpakobecEx d63f223783 Fix translation tests for the required nameRu field 2026-10-21 00:15:45 +05:00
MpakobecEx b37845f33d Bring back nameRu as a reserved field filled with the English name
Card names stay English, but the field exists so renaming later does not require a schema change. translations build keeps existing nameRu values.
2026-10-21 00:15:26 +05:00
MpakobecEx b82927389d Finalize card text terminology: close step, call, zones
close step -> 'zavershayushchiy shag', call confirmed as 'prizvat', zone tooltips kept. Added a check for the old 'shag zaversheniya' wording.
2026-10-21 00:13:32 +05:00
MpakobecEx 6623a43d5e Confirm all six phase names and apply them to card texts
Stand -> Faza Podyoma, Draw -> Faza Dobora, Ride -> Faza Smeny, Main -> Osnovnaya faza, Battle -> Boevaya faza, End -> Zavershayushchaya faza. Card texts updated (9 occurrences). Checker now rejects the old wording.
2026-10-21 00:11:29 +05:00
MpakobecEx e7a5058775 Confirm translation terms: yo letter, boosted unit, retire
Added the yo letter (porazhyon), renamed boosted unit to 'usilennaya karta', confirmed 'unichtozhit' for retire. Refined the forbidden-term check to allow 'usilennaya' while still catching 'usilen'/'usilennyy'.
2026-10-21 00:06:50 +05:00
MpakobecEx 921a6dc081 Propagate customer translation canon to all card texts
Applied the style from the customer's edits: unit -> 'karta', place on -> 'pomeshchaetsya v', ride -> 'smena', boost -> 'podderzhivat', attack hits -> 'prokhodit', drive check -> 'proverka', Restraint -> 'Sderzhivanie', {heal} reminder simplified, long clauses split, pronouns instead of repeated 'eta karta'. Added a forbidden-terms check to translations check. Removed the one-off seed script: ru.yaml is now the source of truth.
2026-10-21 00:04:06 +05:00
MpakobecEx 7b7737a83e Apply customer terminology: Avangard, Aryergard, rank, drive check
Applied to all 66 texts: vanguard -> Avangard, rear-guard -> Aryergard (capitalized), grade -> rank, drive check reveals -> 'v draiveke okazyvaetsya', from a zone -> 'iz'. Updated zone tooltips and translation rules to v0.2.
2026-10-20 21:54:12 +05:00
MpakobecEx d1f4e433db Draft Russian translation of all card texts and translation rules
66 effect texts translated with icon tokens preserved. Added docs/translation-rules.md with terminology, syntax patterns and open terminology questions. Normalized the source typo Own(VC/RC) to [AUTO](VC/RC).
2026-10-20 21:43:58 +05:00
MpakobecEx edd6a7506c Keep card names in English, translate only effect text
Dropped nameRu from the translation workflow and from content validation warnings. Progress now counts cards whose text is filled; vanilla cards without text count as done.
2026-10-20 21:40:45 +05:00
MpakobecEx 625ed36f94 Card text tokenization, keyword catalog and RU translation workflow
Card texts are stored as templates with icon tokens ({auto}, {cb:3}, {vcrc}, {clan:kagero}). Keyword catalog maps tokens to icons and captions. translations build generates content/translations/ru.yaml preserving existing work; translations check verifies completeness and token integrity. 21 tests.
2026-10-20 21:35:55 +05:00
MpakobecEx 0b771bf8bb Server skeleton, content pipeline and 94-card catalog
Solution on .NET 10 LTS with rules, content and CLI projects. Content importer pulls stats from the official card list, merges trigger/rarity data, emits three YAML sets (94 cards, 124 printings). Validator checks the grade-0 shield invariant, sentinel shield, parallel printing links, and deck construction limits. 14 tests cover catalog integrity and deck validation.
2026-10-20 21:27:45 +05:00
MpakobecEx 83fd1b74d1 Base version: design docs, card catalog, implementation checklist 2026-10-20 21:15:00 +05:00