Commit graph

372 commits

Author SHA1 Message Date
Susucre
e26d0c1bb9 refactor: add FilterSource to match TargetSource (#13703)
Small fix of enabling TargetSource to choose/target a Command Object
2025-06-10 19:45:04 -07:00
Oleg Agafonov
26aa55d05d tests: added verify check for wrong target tags usage, improved work with tagged targets (related to 8b2a81cb42) 2025-06-10 19:45:04 -07:00
ssk97
3ff70a9696 refactor: remove notTarget targets from abilities (#13651)
Adds OneShotNonTargetEffect and PutCountersTargetCost
Fixes the target timing of spells/abilities, as non-targets should be chosen on resolution.
2025-06-10 19:45:04 -07:00
Steven Knipe
e2c8d32bf5 ForEachOpponentTargetsAdjuster -> ForEachPlayerTargetsAdjuster 2025-06-10 19:45:04 -07:00
theelk801
7d700989a2 [FIC] more text fixes 2025-06-10 19:45:03 -07:00
Susucre
dcf785ed12 implement [FIN] Sorceress's Schemes (#13694) ; small refactor of TargerCard 2025-06-10 19:45:02 -07:00
theelk801
0a850cc052 remove some more unnecessary filter arguments from target constructors 2025-06-10 19:44:16 -07:00
theelk801
6b2be185ce remove unnecessary filter constructors from TargetLandPermanent 2025-06-10 19:44:15 -07:00
theelk801
c9f7e916e4 remove filter constructors for TargetArtifactPermanent 2025-06-10 19:44:12 -07:00
theelk801
5d375993c6 remove unnecessary FilterEquipmentPermanent and TargetEquipmentPermanent classes 2025-06-10 19:44:12 -07:00
Oleg Agafonov
133e4fe425
other: reworked target selection: (#13638)
- WIP: AI and multi targets, human and X=0 use cases, human and impossible targets use cases;
- improved stability and shared logic (related to #13606, #11134, #11666, continue from a53eb66b58, close #13617, close #13613);
- improved test logs and debug info to show more target info on errors;
- improved test framework to support multiple addTarget calls;
- improved test framework to find bad commands order for targets (related to #11666);
- fixed game freezes on auto-choice usages with disconnected or under control players (related to #11285);
- gui, game: fixed that player doesn't mark avatar as selected/green in "up to" targeting;
- gui, game: fixed small font in some popup messages on big screens (related to #969);
- gui, game: added min targets info for target selection dialog;
- for devs: added new cheat option to call and test any game dialog (define own dialogs, targets, etc in HumanDialogsTester);
- for devs: now tests require complete an any or up to target selection by addTarget + TestPlayer.TARGET_SKIP or setChoice + TestPlayer.CHOICE_SKIP (if not all max/possible targets used);
- for devs: added detail targets info for activate/trigger/cast, can be useful to debug unit tests, auto-choose or AI (see DebugUtil.GAME_SHOW_CHOOSE_TARGET_LOGS)
2025-05-16 13:55:54 +04:00
Oleg Agafonov
a53eb66b58 other: reworked target selection (now it use same logic and methods in all places), fixed AI and selection freezes in some use cases (related to #13606, #11285) 2025-05-07 17:34:36 +04:00
Oleg Agafonov
62aa310a4f server: fixed game freeze on leaving player before finish target selection (example: Nethergoyf, close #13567, related to #11285) 2025-05-07 17:27:26 +04:00
Oleg Agafonov
00dc6f4742 refactor: removed useless getNumberOfTargets from Target (replaced with getMinNumberOfTargets) 2025-05-07 02:55:02 +04:00
theelk801
f16f9ac797 [DSK] Implement Trial of Agony 2025-04-23 09:49:49 -04:00
Oleg Agafonov
3dc606501d AI: improved stability and bug fixes (related to #13290):
- bug's reason: wrong usage of canTarget, add/addTarget, getOpponents, etc;
- fixed that it can target dead players in some use cases (close #13507);
- fixed that it wrongly choose targets in bad/good effects in some use cases;
- fixed that it can't find valid targets in some use cases;
- fixed game freezes and errors with some cards;
2025-04-19 07:04:55 +04:00
theelk801
af512ce3f4 [TDM] Implement Rite of Renewal 2025-04-13 18:09:01 -04:00
theelk801
f3ffca26fa [TDC] Implement Redoubled Stormsinger 2025-04-10 08:47:59 -04:00
Oleg Agafonov
bae3089abb Reworked cost adjuster logic for better support of X and cost modification effects:
Improves:
* refactor: split CostAdjuster logic in multiple parts - prepare X, prepare cost, increase cost, reduce cost;
* refactor: improved VariableManaCost to support min/max values, playable and AI calculations, test framework;
* refactor: improved EarlyTargetCost to support mana costs too (related to #13023);
* refactor: migrated some cards with CostAdjuster and X to EarlyTargetCost (Knollspine Invocation, etc - related to #13023);
* refactor: added shared code for "As an additional cost to cast this spell, discard X creature cards";
* refactor: added shared code for "X is the converted mana cost of the exiled card";
* tests: added dozens tests with cost adjusters;

Bug fixes:
* game: fixed that some cards with CostAdjuster ignore min/max limits for X (allow to choose any X, example: Scorched Earth, Open The Way);
* game: fixed that some cards ask to announce already defined X values (example: Bargaining Table);
* game: fixed that some cards with CostAdjuster do not support combo with other cost modification effects;
* game, gui: fixed missing game logs about predefined X values;
* game, gui: fixed wrong X icon for predefined X values;

Test framework:
* test framework: added X min/max check for wrong values;
* test framework: added X min/max info in miss X value announce;
* test framework: added check to find duplicated effect bugs (see assertNoDuplicatedEffects);

Cards:
* Open The Way - fixed that it allow to choose any X without limits (close #12810);
* Unbound Flourishing - improved combo support for activated abilities with predefined X mana costs like Bargaining Table;
2025-04-08 22:39:10 +04:00
theelk801
2e6e3cd4e7 [TDM] Implement Mardu Siegebreaker 2025-04-08 09:16:50 -04:00
Oleg Agafonov
f17cbbe72b AI: improved performance and fixed crashes on use cases with too much target options like "deals 5 damage divided as you choose" (related to #11285):
* added DebugUtil.AI_ENABLE_DEBUG_MODE for better IDE's debugging AI code;
 * it's a target amount optimizations;
 * it's use a grouping of possible targets due same static and dynamic stats (name, abilities, rules, damage, etc);
 * instead of going through all possible combinations, AI uses only meaningful targets from particular groups;
2025-02-06 17:40:22 +04:00
xenohedron
9c5c394c75
refactor: TargetCreatureOrPlayer inheritance (#13199)
* update TargetCreatureOrPlayer to be a subclass of TargetPermanentOrPlayer

closes #11161

* fix usages
2025-01-08 22:47:36 -05:00
Cameron Merkel
73b63d14ad
TargetAmount refactors (#13128)
* Add minimum and maximum target counts as parameters for TargetAmount and its subclasses; update/add several rules comments (and one actual text) for clarity; remove unused imports

* Get amount+description from target instead of parameters for DistributeCountersEffect and DamageMultiEffect; additions to TargetImpl.getDescription to accommodate

* Create separate method to check if "any number" phrasing should be used, override it in TargetAmount

* Check instanceof TargetAmount before casting

* Add new constructors to chain off of for TargetCreaturePermanentAmount & TargetCreatureOrPlaneswalkerAmount

* Fix text for Storm the Seedcore

* Use Integer.MAX_VALUE instead of 0 to represent no maximum targets

* Add comment about getUseAnyNumber()

* Use amount-only constructors in some TargetAmount subclasses, add clarifying documentation

* Fix a few calls

* Require more specific filters
2024-12-17 19:23:18 -05:00
xenohedron
682a9d1aa6 refactor: remove unused class and constructors 2024-11-30 15:44:58 -05:00
Oleg Agafonov
66b338c6fc dies triggers improves:
* tests: added additional tests and verify/runtime checks for wrong die trigger settings;
* refactor: removed some usage of short LKI ;
* fixed dies events support in "or trigger" and "conditional trigger" (use cases like sacrifice cost);
* fixed dies events support in shared triggered abilities (use cases like sacrifice cost);
2024-11-30 04:23:21 +04:00
xenohedron
d06d594934
rework batch events (#13066)
* add new framework for batch triggers

apply for tapped, untapped, sacrificed, milled

simplify Ob Nixilis, Captive Kingpin

* add a verify check

* fix mistakes

* add simple tests

* another test

* zone change - enters battlefield

* zone change: not battlefield

* zone change - leaves battlefield

* fix Kaya Spirit's Justice

* rename OneOrMoreCombatDamagePlayerTriggeredAbility

* refactor OneOrMoreDamagePlayerTriggeredAbility

* new YoureDealtDamageTriggeredAbility

* new OpponentDealtNoncombatDamageTriggeredAbility

* rework Risona, Asari Commander

* simplify War Elemental

* Add damage batch by source

rework some delayed triggered abilities

* fix Mindblade Render

* rework Initiative and a few others

* [temp] initiative test

* refactor: common style for DealsDamageSourceTriggeredAbility

* refactor cards to use common DealsDamageSourceTriggeredAbility

* update damage players batch triggers

* fix mistake in initiative

* new DealtDamageAnyTriggeredAbility

* new DealtCombatDamageToSourceTriggeredAbility

* update dealt damage to permanent batch triggered abilities

* refactor Hot Soup and param in DealtDamageAttachedTriggeredAbility

* a few more permanent batch triggered abilities

* fix mistake

* update some more damage batch triggers

* add test for Phyrexian Negator

* update Felix Five-Boots and enable test

update Wayta, Trainer Prodigy to align

* update damage batch by source triggers

* undo mistaken change

* fix verify

* cleanup unused methods

* Revert "[temp] initiative test"

This reverts commit 11ed19295fb4f54f5e0870acd4d3d515b54761f1.

* Revert "add a verify check"

This reverts commit e7de47a6562f13c127fdc4c29a7735a08f8da9ea.

* fixes from checking text discrepancies

* fix Shriekwood Devourer

* merge fix

---------

Co-authored-by: Susucre <34709007+Susucre@users.noreply.github.com>
2024-11-19 21:23:08 -05:00
xenohedron
5070f8bef7
Fix auto-choose targets for activated abilities and spells (#13036)
* rework Armory Automaton

* remove redundant "setRequired(false)" from effects that separate into piles

* replace setRequired(false) with minTargets 0

* remove setRequired(false) where minTargets already 0

* remove setRequired(false) where preceded by chooseUse

* Revert "Player auto-choose respects required targets (#10557)"

This reverts commit fb8424556e.
2024-10-26 20:23:50 -04:00
xenohedron
737e67963d
refactor: common logic for getting controller of target object (#13038) 2024-10-26 20:23:34 -04:00
ssk97
f2ff4828b3
Alternative solution to problem of unplayable cards from target adjustment (#12842)
* Alternative solution to problem of unplayable cards from target adjustment

* Review fixes
2024-10-19 19:13:39 -07:00
Oleg Agafonov
91c1d1dc72 Target spell abilities - fixed that it was playable in some non-playable use cases (example: Goblin Artisans) 2024-09-18 18:24:35 +04:00
xenohedron
64aeba659e implement [ACR] Eivor, Wolf-Kissed
closes #12499
2024-09-06 22:46:37 -04:00
PurpleCrowbar
8d249aa691
Improve attachment to permanent logic; implement [PIP] Codsworth, Handy Helper (#12098)
* [PIP] Implement Codsworth, Handy Helper

* Fix Codsworth and Halvar

* Write tests for attachments

* Fix auras going to graveyard when attaching to illegal targets

* Fix Captured by the Consulate interaction

* Fix failing tests, add additional test

* Add source name to log message

* Implement requested changes

* Revert removed null check

* Remove filter check, clean up code

* Add additional test

* Fix failing roles test

* Account for all current attachment edge cases

* Implement rule 303.4g

* Apply requested changes
2024-08-24 01:03:33 -04:00
ssk97
00770646f8
Create generic "Gains your choice of ability" effect, add [ACR] Assassin Initiate (#12619)
Create generic GainsChoiceOfAbilitiesEffect, covers both Target and Source cases.

Adds Assassin Initiate
2024-08-22 13:34:40 -07:00
xenohedron
7969ffb548 refactor: cleanup unneeded method (closes #12547) 2024-08-14 22:46:52 -04:00
ssk97
4c8f60e3a2
[PIP] Rampaging Yao Guai, Wild Wasteland, Synth Infiltrator, Paladin Elizabeth Taggerdy (#12613)
* Rampaging Yao Guai

* Wild Wasteland

* Synth Infiltrator

* Paladin Elizabeth Taggerdy

* Fix not including target count if name contains X value

* Fix missing {this}
2024-07-30 00:40:38 -04:00
xenohedron
d9287adea3 minor simplification to ConditionalTargetAdjuster
protect internal Targets list
2024-07-23 02:16:26 -04:00
ssk97
e8808c3ae3
Remove duplicate code for X costs (#12551)
* Replace "([a-zA-Z]+).getManaCostsToPay().getX()" with CardUtil.getSourceCostsTag(game, $1, "X", 0)
Fix Disrupting Shoal

* Change final card .getX() calls

* Condense all ManacostVariableValue enum values into "instance"

* Further removal of getX, Display X symbol for non-mana X cards

* Fix test

* Fully remove ManaCosts.getX

* Replace all different X dynamic values with GetXValue

* Remove individual cards checking getAmount for X values (leaving cost reduction that does not use X)

* Add null check for game object inside getSourceCostsTagsMap

* fix build errors

* fix Vicious Betrayal

* text fix
2024-07-23 01:57:47 -04:00
ssk97
a6e66d6209
Conditional target adjuster (#12585)
* Add ReplacingTargetAdjuster

* Use new target adjuster

* Change name to ConditionalTargetAdjuster, don't use blueprint

* Take a Targets list

* Add keepOldTargets option

* Add missed DamagedPlayerControlsTargetAdjuster to Sigil of Sleep

* Cards using updated ConditionalTargetAdjuster

* BLB gift cards currently implemented

* fix wrong default for keepOldTargets

* Fix Urborg Repossession missing 1st target tag
2024-07-23 00:14:28 -04:00
Susucre
3acab4a76d implement [DSK] Screaming Nemesis 2024-07-06 18:55:53 +02:00
ssk97
74804a468e
Additional fixes for target adjusters, part of #12528 (#12550)
* Add support for non-permanent targets to EachOpponentPermanentTargetsAdjuster, add ownership check
* Rename EachOpponentPermanentTargetsAdjuster to ForEachOpponentTargetsAdjuster
2024-07-02 11:57:56 +04:00
ssk97
7cb669603f
[WHO] Time Reaper, Add target adjuster for "that player controls/owns" damage trigger targets (#12528)
* Implement Time Reaper, start rework

* Create DamagedPlayerControlsTargetAdjuster, convert Aberrant to use it

* Always add targets for EachOpponentPermanentTargetsAdjuster

* Improve target name, finish Time Reaper

* Convert some cards

* Improve documentation, more cards

* More cards, fix cards that needed to use owner instead of controller

* Fix unfinished AlelaCunningConqueror changes

* more cards

* All remaining cards

* Fix target type

* Remove outdated attempt at TargetController.SOURCE_EFFECT_TARGET_POINTER

* Finish removal of SOURCE_EFFECT_TARGET_POINTER

* Change targetAdjuster blueprint target to be set inside setTargetAdjuster, add error checking

* Always add Target Adjuster after Target

* Add comment

* Fix TolarianContemptTest to skip opponent with no valid targets

* Forgot to git add the new abstract GenericTargetAdjuster

* Test now possible after merge, fix missed ChangeOfPlans adjuster order

* Text and optional-ness fixes

* Always set target pointer
2024-07-02 08:46:14 +04:00
theelk801
bac4e7b507 (refactor) break out assignment into its own package 2024-06-18 13:44:11 -04:00
ssk97
b335947afd
Fix TargetsCountAdjuster to always add target even if the max is 0. (#12478) 2024-06-16 06:39:33 +04:00
xenohedron
fdd244786b refactor: improve method name (related to 86fa9278) 2024-06-13 00:43:51 -04:00
xenohedron
723df8f53c fix some unnecessary usage of setTargetName
add docs on usage of methods
2024-06-13 00:43:51 -04:00
Susucre
86fa92788e improve target naming for Getaway Glamer 2024-06-09 18:05:01 +02:00
Susucre
2d625f0364 implement [MH3] Volatile Stormdrake ; provide source Ability to canBeTargetedBy and HexproofBaseAbility::checkObject 2024-06-06 17:36:11 +02:00
xenohedron
4025b312ad cleanup calls to respect range of influence 2024-06-02 21:28:14 -04:00
Susucre
60193e797d fix (mostly text) for [MH3] and [M3C] 2024-05-28 18:56:04 +02:00
Susucre
754b382e78
implement [MH3] Nethergoyf, refactor targets usages by game param (#12267) 2024-05-21 13:34:38 +02:00