It is currently 26 Apr 2024, 13:23
   
Text Size

[REL] DotP 2014 - Core Fixes Mod v2.01

Moderator: CCGHQ Admins

Re: [REL] DotP 2014 - Core Fixes Mod v1.12

Postby Ferrix » 02 Apr 2014, 21:19

Unfortunately, some stuff is still broken:

Having two Eldrazi Conscription on the same creature lets one target two different players in 2HG.

Lord of the Void is still broken in 2HG (i.e. doesn't allow to choose a target), and probably many more.

Still many thanks for the nice work!
Ferrix
 
Posts: 32
Joined: 02 Apr 2014, 21:14
Has thanked: 2 times
Been thanked: 2 times

Re: [REL] DotP 2014 - Core Fixes Mod v1.12

Postby RiiakShiNal » 03 Apr 2014, 03:31

Ferrix wrote:Unfortunately, some stuff is still broken:
That is to be expected, I have my hands full (I'm currently working on trying to fix several cards in Two-Headed Giant as were reported in another thread, still working on an update to the Deck Builder, an update to my core mod to fix some problems there as well as add some more cards, still have my taxes to do, and dealing with a fallen tree) so I don't get around to checking every card in all situations (and some things just can't be fixed). As such I tend to rely on people reporting problems that they find.

Ferrix wrote:Having two Eldrazi Conscription on the same creature lets one target two different players in 2HG.
Noted, I'll see if I can fix that. This is already a workaround as DotP doesn't let you choose the defending player in Two-Headed Giant like it is supposed to (it only lets you attack the player immediately in front of you), so this may get even more tricky.

Ferrix wrote:Lord of the Void is still broken in 2HG (i.e. doesn't allow to choose a target), and probably many more.
Lord of the Void hasn't been fixed yet (the complete list of "fixed" cards as well as what has been fixed for each card can be found on my wiki page for this mod) so I haven't made a version to call broken. Also technically the card isn't even broken what is broken is the engine. If it worked like it should then you would attack the "team" and then choose which player to deal damage to for each creature. Then these cards wouldn't need to be "fixed" because they would do damage to the proper defending player and the abilities would trigger properly.

If you want to fuss at someone about cards that are "still" broken, complain to WotC/Stainless for not fixing their own cards.

2014/04/04 - Update on the multiple choices for defending player if creature has multiple effects (like 2 Annihilator abilities due to Eldrazi Conscription): The new method of determining a defending player will require my ObjectDC functions to allow multiple effects to read the defending player that was first chosen for any given attack (it should allow to choose different defending players for the same creature for different attacks in the same turn). This should be a drop-in replacement method so any cards already using my Annihilator functions should not need to be changed they will use this new method automatically.

The new method works like this:
  • Choosing a defending player:
    1. Check number of players on the defending team.
    2. If only 1 player then simply set the defending player in the ObjectDC to that player (no query).
    3. If more than 1 player on the team then get Turn Number and Combat Phases this turn (attacks, Interrogation query).
    4. Get the Defending Player Info chest from the ObjectDC.
    5. If the chest doesn't exist the create and initialize it with Turn Number = -1 and Combat Phases = -1.
    6. Compare the current Turn and Attacks to the stored Turn and Attacks.
    7. If Turn or Attacks is different from stored then it is a new attack and we store the new Turn and Attack information.
    8. If this is a new attack then let the creature's controller choose a defending player from all players on the defending team.
    9. Set the defending player in the ObjectDC to the selected player.
  • Retrieving a defending player:
    1. Get the ObjectDC.
    2. If ObjectDC is not nil then get the target chest from the ObjectDC.
    3. If the target chest is not nil then get the chosen player.
    4. Return the chosen player or nil.

I know the above seems like a lot of work, but for Annihilator abilities implementing it will be the same as previously:
Annihilator | Open
Code: Select all
   <TRIGGERED_ABILITY badge="BADGE_ANNIHILATOR">
      <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Annihilator 2]]></LOCALISED_TEXT>
      <TRIGGER value="ATTACKING" simple_qualifier="self" />
      <RESOLUTION_TIME_ACTION>
         RSN_Annihilator_Player_Choosing()
      </RESOLUTION_TIME_ACTION>
      <RESOLUTION_TIME_ACTION>
         RSN_Annihilator_Permanent_Choosing( 2 )
      </RESOLUTION_TIME_ACTION>
      <RESOLUTION_TIME_ACTION>
         RSN_Annihilator_Sacrificing()
      </RESOLUTION_TIME_ACTION>
   </TRIGGERED_ABILITY>
It should be just as easy to use the new method for other cards as well (such as Lord of the Void) with just a single function call to choose the defending player and a single function call to get the defending player. Though some cards won't be able to use this method due to how targets are chosen (like Colossal Whale), but there don't seem to be any cards in the core where this will actually pose a problem.

I still have tests to run and other cards to update to use the new method. So it may still be a couple of days before there is a Core Fixes update.

2014/04/06 - I did think of another instance that I had to code for. Multiple abilities on a card that picks targets for example a Colossal Whale with Eldrazi Conscription on it (can't use a simple workaround like changing FE_CONTROLLER to FE_TEAM as that wouldn't work right if they chose a specific player for the Annihilator 2 ability, they should be forced to choose a creature that player controls), you should still only be able to choose the defending player once. So far the tests are proceeding well (no script errors and cards seem to be working the way they should), I should know by end of tomorrow whether all the pieces are working properly together.

The code for cards like Colossal Whale isn't as simple as you need to put in a new TARGET block, a new TARGET_DEFINITION block, and modify another TARGET_DEFINITION block, but the code still isn't too complex (assuming it works exactly as intended) and part can be moved into a function to make the TARGET_DEFINITION easier.
RiiakShiNal
Programmer
 
Posts: 2185
Joined: 16 May 2011, 21:37
Has thanked: 75 times
Been thanked: 497 times

Re: [REL] DotP 2014 - Core Fixes Mod v1.12

Postby Ferrix » 07 Apr 2014, 02:04

I did in no way want to attack you with the Lord of the Void, I just thought it might be possible to create a similar LOL file for the data of such cards. Of course I know that it is broken because they didn't fix this bug that is around since the first game. I said "still" because of that, apologies since I'm a fluent English speaker but not native, so such subtleties of the language were in no way intended to cause harm but rather one of the few cases of missing knowledge on my part. I apologize for this!

Since Geist of Saint Traft works correctly (it lets you choose whom to attack with the token), isn't it possible to use something like that for creatures with Annihilator and other effects that go against a specific player?

I'm not a Magic coder, so probably it sounds easier than it is, but I thought it should be possible to choose the target when a creature attacks by using a similar code on self instead of the new token.

Courtesy the 2013 deck pack of GrovyleXShinyCelebi:
Geist of Saint Traft | Open
Code: Select all
<?xml version="1.0"?>
<CARD_V2 ExportVersion="2">
  <FILENAME text="GEIST_OF_SAINT_TRAFT_277037" />
  <CARDNAME text="GEIST_OF_SAINT_TRAFT" />
  <TITLE>
    <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Geist of Saint Traft]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[Geist de Saint Traft]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Geist de San Traft]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Geist von Sankt Traft]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[Geist di San Traft]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[聖トラフトの霊]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[성 트라프트의 심령]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[Привидение Святого Трафта]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[Geist de Santo Traft]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="zh-CN"><![CDATA[圣沙弗的游魂]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="zh-HK"><![CDATA[聖沙弗的遊魂]]></LOCALISED_TEXT>
  </TITLE>
  <MULTIVERSEID value="277037" />
  <ARTID value="139449" />
  <ARTIST name="Igor Kieryluk" />
  <CASTING_COST cost="{1}{W}{U}" />
  <SUPERTYPE metaname="Legendary" />
  <TYPE metaname="Creature" />
  <SUB_TYPE metaname="Spirit" />
  <SUB_TYPE metaname="Cleric" />
  <EXPANSION value="DPG" />
  <RARITY metaname="M" />
  <POWER value="2" />
  <TOUGHNESS value="2" />
  <STATIC_ABILITY>
    <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Hexproof]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[Défense talismanique]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Antimaleficio.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Fluchsicher]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[Anti-malocchio]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[呪禁]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[방호]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[Порчеустойчивость]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[Resistência a magia]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="zh-CN"><![CDATA[辟邪]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="zh-HK"><![CDATA[辟邪]]></LOCALISED_TEXT>
    <INTRINSIC characteristic="CHARACTERISTIC_HEXPROOF" />
  </STATIC_ABILITY>
  <TRIGGERED_ABILITY>
    <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Whenever Geist of Saint Traft attacks, put a 4/4 white Angel creature token with flying onto the battlefield tapped and attacking. Exile that token at end of combat.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[À chaque fois que le Geist de Saint Traft attaque, mettez sur le champ de bataille un jeton de créature 4/4 blanche Ange avec le vol, engagé et attaquant. Exilez ce jeton à la fin du combat.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Siempre que el Geist de San Traft ataque, pon en el campo de batalla una ficha de criatura Ángel blanco 4/4 con la habilidad de volar, girado y atacando. Exilia esa ficha al final del combate.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Immer wenn der Geist von Sankt Traft angreift, bringe einen 4/4 weißen Engel-Kreaturenspielstein mit Flugfähigkeit getappt und angreifend ins Spiel. Schicke den Spielstein am Ende des Kampfes ins Exil.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[Ogniqualvolta il Geist di San Traft attacca, metti sul campo di battaglia una pedina creatura Angelo 4/4 bianca con volare TAPpata e attaccante. Esilia quella pedina alla fine del combattimento.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[聖トラフトの霊が攻撃するたび、タップ状態で攻撃している飛行を持つ白の4/4の天使・クリーチャー・トークンを1体戦場に出す。 戦闘終了時に、そのトークンを追放する。]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[성 트라프트의 심령이 공격할 때마다, 비행 능력을 가진 4/4 백색 천사 생물 토큰 한 개를 탭되어서 공격하고 있는 채로 전장에 놓는다. 전투종료에 그 토큰을 추방한다.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[Каждый раз, когда Привидение Святого Трафта атакует, положите на поле битвы одну фишку существа 4/4 белый Ангел с Полетом повернутой и атакующей. Изгоните ту фишку в конце боя.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[Toda vez que Geist de Santo Traft atacar, coloque no campo de batalha uma ficha de criatura branca 4/4 do tipo Anjo com voar virada e atacando. Exile aquela ficha no final do combate.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="zh-CN"><![CDATA[每当圣沙弗的游魂攻击时,将一个4/4白色,具飞行异能的天使衍生生物横置放进战场且正进行攻击。在战斗结束时放逐该衍生物。]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="zh-HK"><![CDATA[每當聖沙弗的遊魂攻擊時,將一個4/4白色,具飛行異能的天使衍生生物橫置放進戰場且正進行攻擊。在戰鬥結束時放逐該衍生物。]]></LOCALISED_TEXT>
    <TRIGGER value="ATTACKING" simple_qualifier="self" />
    <RESOLUTION_TIME_ACTION>
    local filter = ClearFilter()
    filter:SetFilterType( FILTER_TYPE_PLAYERS )
    filter:Add( FE_TEAM, OP_NOT, EffectController():GetTeam() )
    EffectController():ChooseItem( "CARD_QUERY_CHOOSE_PLAYER_TO_ANGEL", EffectDC():Make_Targets(0) )
    </RESOLUTION_TIME_ACTION>
    <RESOLUTION_TIME_ACTION>
    local delayDC = EffectDC():Make_Chest(1)
    local attacked_player = EffectDC():Get_Targets(0):Get_PlayerPtr(0)
    if attacked_player ~= nil then
      MTG():PutTokensOntoBattlefieldTappedAndAttacking( "TOKEN_ANGEL_4_4_F_277468", 1, EffectController(), attacked_player, delayDC:Make_Chest(0) )
    end
    </RESOLUTION_TIME_ACTION>
    <RESOLUTION_TIME_ACTION>
    local i = 0
    local delayDC = EffectDC():Get_Chest(1)
    local token_chest = delayDC:Get_Chest(0)
    if token_chest ~= nil then
       local token = token_chest:Get_NthCardPtr(i)
       while (token ~= nil) do
          i = i + 1
          token = token_chest:Get_NthCardPtr(i)
      end
       delayDC:Set_Int(1, i)
      MTG():CreateDelayedTrigger(2, delayDC)
    end
    </RESOLUTION_TIME_ACTION>
    <CONTINUOUS_ACTION layer="8">
    local i = 0
    local token_chest = EffectDC():Get_Chest(1):Get_Chest(0)
    if token_chest ~= nil then
       local token = token_chest:Get_NthCardPtr(i)
       while (token ~= nil) do
         token:GetCurrentCharacteristics():AI_SetWorthless()
          i = i + 1
          token = token_chest:Get_NthCardPtr(i)
      end
    end
    </CONTINUOUS_ACTION>
    <DURATION>
    return MTG():GetStep() == STEP_END_OF_COMBAT
    </DURATION>
  </TRIGGERED_ABILITY>
  <TRIGGERED_ABILITY resource_id="2">
    <TRIGGER value="BEGINNING_OF_STEP">
    return MTG():GetStep() == STEP_END_OF_COMBAT
    </TRIGGER>
    <CLEANUP fire_once="1" />
    <RESOLUTION_TIME_ACTION>
    local token_count = EffectDC():Get_Int(1)
    local token_chest = EffectDC():Get_Chest(0)
    if token_chest ~= nil then
       for i = 0, (token_count-1) do
         local token = token_chest:Get_NthCardPtr(i)
        if token ~= nil then
           token:Exile()
        end
      end
    end
    </RESOLUTION_TIME_ACTION>
  </TRIGGERED_ABILITY>
  <TOKEN_REGISTRATION reservation="1" type="TOKEN_ANGEL_4_4_F_277468" />
  <HELP title="MORE_INFO_BADGE_TITLE_10" body="MORE_INFO_BADGE_BODY_10" zone="ZONE_ANY" />
  <HELP title="MORE_INFO_BADGE_TITLE_21" body="MORE_INFO_BADGE_BODY_21" zone="ZONE_ANY" />
  <SFX text="COMBAT_BLADE_LARGE_ATTACK" power_boundary_min="4" power_boundary_max="-1" />
  <SFX text="COMBAT_BLADE_SMALL_ATTACK" power_boundary_min="1" power_boundary_max="3" />
  <AI_BASE_SCORE score="900" zone="ZONE_BATTLEFIELD" />
</CARD_V2>
EDIT: Oh, sorry, read the edits to your reply too late. Glad it works, and many thanks that you took the time!
Ferrix
 
Posts: 32
Joined: 02 Apr 2014, 21:14
Has thanked: 2 times
Been thanked: 2 times

Re: [REL] DotP 2014 - Core Fixes Mod v1.12

Postby RiiakShiNal » 07 Apr 2014, 04:01

Part of the subtlety with English is that sometimes a single line can be read multiple ways and taken in multiple contexts (and how it is taken can even vary by the current mood of the reader and/or time of day, and yes I know it is the same with other languages as well). It can be very difficult (and sometimes may even be impossible) to phrase things in a way that can't be misunderstood.

There are three things of note with Geist of Saint Traft:
  • It was made by modders not by WotC/Stainless as such it is quite possible the modder was more careful about the rulings.
  • Geist of Saint Traft works differently than cards which care about the defending player or who was attacked. The ability of Geist of Saint Traft does not specify that the token attacks the player that Geist attacked so the token should be able to attack any player other than someone on the controller's team.
  • Geist of Saint Traft's ability doesn't have to worry about other effects also asking which player was attacked so it doesn't have to check what was chosen for other abilities or have other abilities check what was chosen for it.

Also Geist of Saint Traft can actually be made with less code as the modder uses some pieces of code that are actually unnecessary. For example instead of manually counting the tokens in the token chest you can use token_chest:Count(). There are instances where looping through all the pointers is necessary, but not usually to just count them.

Additionally, there is a bug in the code you posted where worthless will not be set on additional tokens if an earlier one has died (but that should not be too important since the tokens are exiled at end of combat). The way it is coded if you have something like Doubling Season in play and you get more than 1 token then if the first token dies before end of combat then it's pointer will become nil and thus break the loop prematurely (a for loop there from 0 to count - 1 would be more appropriate).

This is what my current version of Lord of the Void now looks like:
Lord of the Void (not yet tested) | Open
Code: Select all
<?xml version="1.0"?>
<CARD_V2 ExportVersion="15">
   <FILENAME text="LORD_OF_THE_VOID_359687" />
   <CARDNAME text="LORD_OF_THE_VOID" />
   <TITLE>
      <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Lord of the Void]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[Seigneur du vide]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Señor del vacío]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Fürst der Leere]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[Signore del Vuoto]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[虚(きょ)無(む)の王(おう)]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[공허의 군주]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[Повелитель Пустоты]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[Senhor do Vácuo]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="zh-CN"><![CDATA[虚空领主]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="zh-HK"><![CDATA[虛空領主]]></LOCALISED_TEXT>
   </TITLE>
   <MULTIVERSEID value="359687" />
   <ARTID value="147253" />
   <ARTIST name="Chris Rahn" />
   <CASTING_COST cost="{4}{B}{B}{B}" />
   <TYPE metaname="Creature" />
   <SUB_TYPE metaname="Demon" />
   <EXPANSION value="DPI" />
   <RARITY metaname="M" />
   <POWER value="7" />
   <TOUGHNESS value="7" />
   <STATIC_ABILITY>
      <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Flying]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[Vol]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Vuela.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Fliegend]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[Volare]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[飛行]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[비행]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[Полет]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[Voar]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="zh-CN"><![CDATA[飞行]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="zh-HK"><![CDATA[飛行]]></LOCALISED_TEXT>
      <INTRINSIC characteristic="CHARACTERISTIC_FLYING" />
   </STATIC_ABILITY>
   <TRIGGERED_ABILITY>
      <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Whenever Lord of the Void deals combat damage to a player, exile the top seven cards of that player’s library, then put a creature card from among them onto the battlefield under your control.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[À chaque fois que le Seigneur du vide inflige des blessures de combat à un joueur, exilez les sept cartes du dessus de la bibliothèque de ce joueur puis mettez sur le champ de bataille, sous votre contrôle, une carte de créature parmi celles-ci.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Siempre que el Señor del vacío haga daño de combate a un jugador, exilia las primeras siete cartas de la parte superior de la biblioteca de ese jugador, luego pon en el campo de batalla bajo tu control una carta de criatura de entre ellas.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Immer wenn der Fürst der Leere einem Spieler Kampfschaden zufügt, schicke die obersten sieben Karten der Bibliothek dieses Spielers ins Exil und bringe dann eine Kreaturenkarte davon unter deiner Kontrolle ins Spiel.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[Ogniqualvolta il Signore del Vuoto infligge danno da combattimento a un giocatore, esilia le prime sette carte del grimorio di quel giocatore, poi metti sul campo di battaglia sotto il tuo controllo una carta creatura scelta tra esse.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[虚無の王がプレイヤー1人に戦闘ダメージを与えるたび、そのプレイヤーのライブラリーの一番上から7枚のカードを追放する。その後、それらのカードの中からクリーチャー・カードを1枚あなたのコントロール下で戦場に出す。]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[공허의 군주가 플레이어에게 전투피해를 입힐 때마다, 그 플레이어의 서고 맨 위에서 카드 일곱 장을 추방한 다음 그중에서 생물 카드 한 장을 골라 당신의 조종하에 전장에 놓는다.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[Каждый раз, когда Повелитель Пустоты наносит боевые повреждения игроку, изгоните семь верхних карт библиотеки того игрока, затем положите находящуюся среди них карту существа на поле битвы под вашим контролем.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[Toda vez que Senhor do Vácuo causar dano de combate a um jogador, exile os sete cards do topo do grimório daquele jogador. Depois, coloque um card de criatura dentre eles no campo de batalha sob o seu controle.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="zh-CN"><![CDATA[每当虚空领主对任一牌手造成战斗伤害时,放逐该牌手牌库顶的七张牌,然后将其中一张生物牌在你的操控下放进战场。]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="zh-HK"><![CDATA[每當虛空領主對任一玩家造成戰鬥傷害時,放逐該玩家牌庫頂的七張牌,然後將其中一張生物牌在你的操控下放進戰場。]]></LOCALISED_TEXT>
      <TRIGGER value="SOURCE_DEALS_DAMAGE_TO_PLAYER" simple_qualifier="self" damage_type="combat" />
      <RESOLUTION_TIME_ACTION>
         RSN_ChooseDefendingPlayer( EffectSourceLKI(), SecondaryPlayer() )
      </RESOLUTION_TIME_ACTION>
      <RESOLUTION_TIME_ACTION>
         local voidDC = EffectDC():Make_Chest(0)
         local answerDC = EffectDC():Make_Targets(1)
         local secondaryPlayer = RSN_GetDefendingPlayer( EffectSourceLKI() )
         local effectController = EffectController()
         for i = 0,(7-1) do
            local card = secondaryPlayer:Library_GetNth( i )
            if card ~= nil then
               voidDC:Set_CardPtr( i, card)
               voidDC:Protect_CardPtr( i )
               card:Exile()
               if (card:GetCardType():Test(CARD_TYPE_CREATURE) == false) then
                  voidDC:QueryUnselect_CardPtr(i)
               end
            else
               break
            end
         end
         effectController:ChooseItemFromDC( "CARD_QUERY_CHOOSE_CREATURE_TO_PUT_ONTO_BATTLEFIELD", voidDC, answerDC )
      </RESOLUTION_TIME_ACTION>
      <RESOLUTION_TIME_ACTION>
         local targetDC = EffectDC():Get_Targets(1)
         if targetDC ~= nil then
            local target = targetDC:Get_CardPtr(0)
            if  target ~= nil then
               target:PutOntoBattlefield( EffectController() )
            end
         end
      </RESOLUTION_TIME_ACTION>
   </TRIGGERED_ABILITY>
   <HELP title="MORE_INFO_BADGE_TITLE_10" body="MORE_INFO_BADGE_BODY_10" zone="ZONE_ANY" />
   <SFX text="COMBAT_BLADE_LARGE_ATTACK" power_boundary_min="4" power_boundary_max="-1" />
   <SFX text="COMBAT_BLADE_SMALL_ATTACK" power_boundary_min="1" power_boundary_max="3" />
   <AI_BASE_SCORE score="600" zone="ZONE_BATTLEFIELD" />
</CARD_V2>
You will note that it has not changed much from the original (added Chinese localizations and minor changes to the TRIGGERED_ABILITY). I still have to test it before I finalize it for release though. There are 22 cards (not counting those with Annihilator) that I have found in the official cards that need fixes for "Defending Player" effects in Two-Headed Giant. Of those there are basically 3 variations:
  1. Those that work completely at resolution time (like Lord of the Void and Annihilator effects). These are the simplest to update.
  2. Those that target when attacking (like Colossal Whale and Cyclops Gladiator). These require a more complex solution.
  3. Those that target after combat damage (like Ink-Eyes, Servant of Oni and Skullsnatcher). These use basically the same solution as #2 (but with different parameters).
All three types must be tested in several circumstances to make sure they behave properly (including multiple abilities, FFA and 2HG, multiple attacks in the same turn, and mixing ability variations). Then of course all 22 cards have to be individually tested to make sure I didn't break the card (syntax error, missed a line when copying, etc...). The Annihilator cards only have to be variation tested as there were no changes to the actual cards (drop-in function replacement).

2014/04/08 - Update: I did not get to work on it at all yesterday, but I did manage to get the variation testing done today. My initial variation tests all worked, but were less than seamless as possible for players for abilities that TARGET (variations #2 and #3 in the list above). So after reworking them some I did manage to come up with something as seamless for the player as possible while still fixing the bugs with multiple abilities that target a defending player. The new method for targeted abilities doesn't require a new TARGET or TARGET_DEFINITION block, but will require modifications to the existing TARGET_DEFINITION blocks and an additional PLAY_TIME_ACTION block (which will need to be before any other PLAY_TIME_ACTIONs).

For example this is what the Scion of Darkness TARGET_DEFINITION block looked like before:
Code: Select all
    <TARGET_DEFINITION id="0">
    local filter = ClearFilter()
    filter:Add( FE_TYPE, OP_IS, CARD_TYPE_CREATURE )
    filter:SetZone( ZONE_GRAVEYARD, SecondaryPlayer() )
    </TARGET_DEFINITION>
And this is what my new "fixed" one looks like:
Code: Select all
      <TARGET_DEFINITION id="0">
         local oDefending = RSN_GetDefendingPlayer( EffectSourceLKI() )
         local filter = ClearFilter()
         filter:Add( FE_TYPE, OP_IS, CARD_TYPE_CREATURE )
         if (oDefending ~= nil) then
            -- A defending player has already been defined so use that one.
            filter:SetZone( ZONE_GRAVEYARD, oDefending )
         elseif (SecondaryPlayer():GetTeam():GetNumberOfPlayers() > 1) then
            -- No defending player defined and there is more than a single player on the team.
            filter:Add( FE_TEAM, OP_IS, SecondaryPlayer():GetTeam() )
            filter:SetZone( ZONE_GRAVEYARD )
         else
            -- No defending player defined and only one player on the team so use that player.
            filter:SetZone( ZONE_GRAVEYARD, SecondaryPlayer() )
         end
      </TARGET_DEFINITION>
Obviously, the new block is considerably larger and requires more thought to construct than the original (to be as seamless as possible), but it still shouldn't be too complex for most modders.

Scion of Darkness (tested, likely final) | Open
Code: Select all
<?xml version="1.0"?>
<CARD_V2 ExportVersion="15">
   <FILENAME text="SCION_OF_DARKNESS_373694" />
   <CARDNAME text="SCION_OF_DARKNESS" />
   <TITLE>
      <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Scion of Darkness]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[Scion des ténèbres]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Vástago de la oscuridad]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Spross der Dunkelheit]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[Progenie dell’Oscurità]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[闇の末裔]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[어둠의 후계자]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[Отпрыск Тьмы]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[Herdeiro da Escuridão]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="zh-CN"><![CDATA[Scion of Darkness]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="zh-HK"><![CDATA[Scion of Darkness]]></LOCALISED_TEXT>
   </TITLE>
   <MULTIVERSEID value="373694" />
   <ARTID value="47463" />
   <ARTIST name="Mark Zug" />
   <CASTING_COST cost="{5}{B}{B}{B}" />
   <TYPE metaname="Creature" />
   <SUB_TYPE metaname="Avatar" />
   <EXPANSION value="DPI" />
   <RARITY metaname="R" />
   <POWER value="6" />
   <TOUGHNESS value="6" />
   <STATIC_ABILITY>
      <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Trample]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[Piétinement]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Arrolla.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Verursacht Trampelschaden]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[Travolgere]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[トランプル]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[돌진]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[Пробивной удар]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[Atropelar]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="zh-CN"><![CDATA[践踏]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="zh-HK"><![CDATA[踐踏]]></LOCALISED_TEXT>
      <INTRINSIC characteristic="CHARACTERISTIC_TRAMPLE" />
   </STATIC_ABILITY>
   <TRIGGERED_ABILITY>
      <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Whenever Scion of Darkness deals combat damage to a player, you may put target creature card from that player’s graveyard onto the battlefield under your control.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[À chaque fois que le Scion des ténèbres inflige des blessures de combat à un joueur, vous pouvez mettre sur le champ de bataille, sous votre contrôle, une carte de créature ciblée du cimetière de ce joueur.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Siempre que el Vástago de la oscuridad haga daño de combate a un jugador, puedes poner en el campo de batalla bajo tu control la carta de criatura objetivo del cementerio de ese jugador.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Immer wenn der Spross der Dunkelheit einem Spieler Kampfschaden zufügt, kannst du eine Kreaturenkarte aus dem Friedhof dieses Spielers unter deiner Kontrolle ins Spiel bringen.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[Ogniqualvolta la Progenie dell’Oscurità infligge danno da combattimento a un giocatore, puoi mettere sul campo di battaglia sotto il tuo controllo una carta creatura bersaglio dal cimitero di quel giocatore.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[闇の末裔がプレイヤー1人に戦闘ダメージを与えるたび、そのプレイヤーの墓地にあるクリーチャー・カード1枚を対象とする。あなたはそれを、あなたのコントロール下で戦場に出してもよい。]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[어둠의 후계자가 플레이어에게 전투피해를 입힐 때마다, 그 플레이어의 무덤에 있는 생물 카드 한 장을 목표로 정한다. 당신은 그 카드를 당신의 조종하에 전장에 놓을 수 있다.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[Каждый раз, когда Отпрыск Тьмы наносит боевые повреждения игроку, вы можете положить целевую карту существа из кладбища того игрока на поле битвы под вашим контролем.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[Toda vez que Herdeiro da Escuridão causa dano de combate a um jogador, você pode colocar o card de criatura alvo do cemitério daquele jogador no campo de batalha sob seu controle.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="zh-CN"><![CDATA[Whenever Scion of Darkness deals combat damage to a player, you may put target creature card from that player’s graveyard onto the battlefield under your control.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="zh-HK"><![CDATA[Whenever Scion of Darkness deals combat damage to a player, you may put target creature card from that player’s graveyard onto the battlefield under your control.]]></LOCALISED_TEXT>
      <TRIGGER value="SOURCE_DEALS_DAMAGE_TO_PLAYER" simple_qualifier="self" damage_type="combat" />
      <MAY />
      <TARGET tag="CARD_QUERY_CHOOSE_CREATURE_TO_PUT_ONTO_BATTLEFIELD" definition="0" compartment="0" count="1" />
      <TARGET_DEFINITION id="0">
         local oDefending = RSN_GetDefendingPlayer( EffectSourceLKI() )
         local filter = ClearFilter()
         filter:Add( FE_TYPE, OP_IS, CARD_TYPE_CREATURE )
         if (oDefending ~= nil) then
            -- A defending player has already been defined so use that one.
            filter:SetZone( ZONE_GRAVEYARD, oDefending )
         elseif (SecondaryPlayer():GetTeam():GetNumberOfPlayers() > 1) then
            -- No defending player defined and there is more than a single player on the team.
            filter:Add( FE_TEAM, OP_IS, SecondaryPlayer():GetTeam() )
            filter:SetZone( ZONE_GRAVEYARD )
         else
            -- No defending player defined and only one player on the team so use that player.
            filter:SetZone( ZONE_GRAVEYARD, SecondaryPlayer() )
         end
      </TARGET_DEFINITION>
      <PLAY_TIME_ACTION>
         local oTarget = EffectDC():Get_Targets(0):Get_CardPtr(0)
         if (oTarget ~= nil) then
            RSN_SetDefendingPlayer( EffectSourceLKI(), oTarget:GetPlayer() )
         end
      </PLAY_TIME_ACTION>
      <RESOLUTION_TIME_ACTION>
         local target = EffectDC():Get_Targets(0):Get_CardPtr(0)
         if  target ~= nil then
            target:PutOntoBattlefield( EffectController() )
         end
      </RESOLUTION_TIME_ACTION>
   </TRIGGERED_ABILITY>
   <ACTIVATED_ABILITY active_zone="ZONE_HAND">
      <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Cycling {3}]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[Recyclage {3}]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Ciclo {3}.]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Umwandlung {3}]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[Ciclo {3}]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[サイクリング {3}]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[순환 {3}]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[Цикл {3}]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[Reciclar {3}]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="zh-CN"><![CDATA[循环{3}]]></LOCALISED_TEXT>
      <LOCALISED_TEXT LanguageCode="zh-HK"><![CDATA[循環{3}]]></LOCALISED_TEXT>
      <COST mana_cost="{3}" type="Mana" />
      <COST type="DiscardSelf" />
      <PLAY_TIME_ACTION>
         MTG():FireTrigger( TRIGGER_CYCLED, EffectSource() )
      </PLAY_TIME_ACTION>
      <RESOLUTION_TIME_ACTION>
         EffectController():DrawCards(1)
      </RESOLUTION_TIME_ACTION>
      <AI_AVAILABILITY window_step="end_of_turn" window_turn="their_turn" type="window" />
      <AI_AVAILABILITY window_step="main_1" window_turn="my_turn" type="window" />
      <AI_AVAILABILITY window_step="main_2" window_turn="my_turn" type="window" />
      <AI_AVAILABILITY window_step="end_of_turn" window_turn="their_turn" type="window" />
      <AI_AVAILABILITY window_step="declare_attackers" window_turn="their_turn" type="window" />
      <AI_AVAILABILITY window_step="main_2" window_turn="my_turn" type="window" />
      <AI_AVAILABILITY window_step="main_1" window_turn="my_turn" type="window" />
      <AI_AVAILABILITY type="in_response" response_source="1" />
      <AI_AVAILABILITY window_step="declare_blockers" type="window" />
      <AI_AVAILABILITY type="in_response" response_target="1" />
   </ACTIVATED_ABILITY>
   <HELP title="MORE_INFO_BADGE_TITLE_1" body="MORE_INFO_BADGE_BODY_1" zone="ZONE_ANY" />
   <HELP title="MORE_INFO_TITLE_CYCLING" body="MORE_INFO_BODY_CYCLING" zone="ZONE_ANY" />
   <SFX text="COMBAT_PESTS_LARGE_ATTACK" power_boundary_min="4" power_boundary_max="-1" />
   <SFX text="COMBAT_PESTS_SMALL_ATTACK" power_boundary_min="1" power_boundary_max="3" />
   <AI_BASE_SCORE score="1200" zone="ZONE_BATTLEFIELD" />
</CARD_V2>
So as of now all variation testing is done, all that is left is updating the remaining cards with the proper variations (with adjusting TARGET_DEFINITION blocks) and testing the cards to make sure I don't fall asleep while copy & pasting.
RiiakShiNal
Programmer
 
Posts: 2185
Joined: 16 May 2011, 21:37
Has thanked: 75 times
Been thanked: 497 times

Re: [REL] DotP 2014 - Core Fixes Mod v1.12

Postby Ferrix » 14 Apr 2014, 09:17

Wild Pair of the 2014 core is broken (when searching one MUST put something onto the battlefield instead of being able to find nothing). Maybe you can also fix this when you have some more time, please?
Ferrix
 
Posts: 32
Joined: 02 Apr 2014, 21:14
Has thanked: 2 times
Been thanked: 2 times

Re: [REL] DotP 2014 - Core Fixes Mod v1.12

Postby RiiakShiNal » 14 Apr 2014, 12:28

Ferrix wrote:Wild Pair of the 2014 core is broken (when searching one MUST put something onto the battlefield instead of being able to find nothing). Maybe you can also fix this when you have some more time, please?
Well, there are actually 2 parts to this card:
  1. You may search your library. This part works correctly as you are allowed to not search at all (assuming you have turned off the "Always use optional abilities" option in the game settings).
  2. Then according to the rules when you are searching a private zone you are allowed to not find something even if it is there. This part was not implemented because they did not include QUERY_FLAG_MAY in the ChooseItemFromDC() call.

This is an easy fix as it is just adding a flag. It will be in the next version (along with all the 2HG fixes mentioned previously).
RiiakShiNal
Programmer
 
Posts: 2185
Joined: 16 May 2011, 21:37
Has thanked: 75 times
Been thanked: 497 times

Re: [REL] DotP 2014 - Core Fixes Mod v1.12

Postby Ferrix » 14 Apr 2014, 14:00

Yes, I realised the "may" part is there for if you want to search (I mistook it first and thought the card to be broken twice, but it auto-triggers as I saw when checking the XML for the card), but - as you said - not when searching already.

I think there is not much practical use in the decks I saw so far, but since by searching and not finding anything one can shuffle his library (and by not searching one can keep the library as it is) there could be decks where it has a practical use, for instance in connection with the Oracle of Mul'Daya.

The only uses I found so far is in the Yeva Deck to keep that fling spider in the library if it is the only one, one has a synergetic card on the hand and expects the opponent to play a flier, or just if one expects a wipe. This is rare but there are certainly other uses for searching and not finding a creature if one makes custom decks.

So I thought I should report it. Thank you for the work!
Ferrix
 
Posts: 32
Joined: 02 Apr 2014, 21:14
Has thanked: 2 times
Been thanked: 2 times

Re: [REL] DotP 2014 - Core Fixes Mod v2.0

Postby RiiakShiNal » 16 Apr 2014, 21:23

Version 2.0 is now up and contains an additional 22 fixed cards, new Defending Player functions, updates to Annihilator functions to work properly in cases of multiple Defending Player effects, updates Mindleech Mass to use the new defending player functions.

IMPORTANT NOTE: Version 2.0 of the Core Fixes now requires my ObjectDC functions as they are needed for the Defending Player functions to work properly.
RiiakShiNal
Programmer
 
Posts: 2185
Joined: 16 May 2011, 21:37
Has thanked: 75 times
Been thanked: 497 times

Re: [REL] DotP 2014 - Core Fixes Mod v2.0

Postby Luchian » 18 Apr 2014, 21:07

I found a bug in their Gigantiform. It's kicker activates every time the card is cast. Here is the fixed trigger section for the card.
Code: Select all
      <TRIGGER value="ZONECHANGE_END" simple_qualifier="self" to_zone="ZONE_BATTLEFIELD" >
    return EffectSource():WasKicked() == true
    </TRIGGER>
      <RESOLUTION_TIME_ACTION>
    if EffectSource() ~= nil then
       local effectController = EffectController()
       local filter = ClearFilter()
       filter:SetZone( ZONE_LIBRARY, effectController )
       filter:Add( FE_CARD_NAME, OP_IS, "GIGANTIFORM")
       effectController:ChooseItem("CARD_QUERY_CHOOSE_CARD_NAMED_GIGANTIFORM", EffectDC():Make_Targets(1) )
    end

    </RESOLUTION_TIME_ACTION>
    <RESOLUTION_TIME_ACTION>
    local targetDC = EffectDC():Get_Targets(1)
    if targetDC ~= nil then
       local target = targetDC:Get_CardPtr(0)
       if  target ~= nil then
          target:PutOntoBattlefield( EffectController() )
       end
    end 
    </RESOLUTION_TIME_ACTION>
    <RESOLUTION_TIME_ACTION>
    EffectController():ShuffleLibrary()
    </RESOLUTION_TIME_ACTION>
    <MAY />
  </TRIGGERED_ABILITY>
Luchian
 
Posts: 20
Joined: 21 Mar 2014, 20:50
Has thanked: 10 times
Been thanked: 2 times

Re: [REL] DotP 2014 - Core Fixes Mod v2.0

Postby thefiremind » 18 Apr 2014, 22:16

Luchian wrote:I found a bug in their Gigantiform. It's kicker activates every time the card is cast.
To be more precise, the ability triggers everytime, but it allows you to search for another Gigantiform only when it was really kicked. Anyway it's still a bug, even if a minor one.

EDIT: I have a doubt, though: is the check
Code: Select all
if EffectSource() ~= nil then
correct? In other words: if the opponent plays a Naturalize on the original Gigantiform in response to its trigger activation, are you still allowed to search for another? With that check, you aren't allowed to do that. My opinion is that you should be allowed (the last known information about the card should still declare that it was kicked), but I'm not 100% sure.
Note that the official card would throw an error in this scenario, so the card needs a fix, no matter who's right.
< Former DotP 2012/2013/2014 modder >
Currently busy with life...
User avatar
thefiremind
Programmer
 
Posts: 3515
Joined: 07 Nov 2011, 10:55
Has thanked: 118 times
Been thanked: 721 times

Re: [REL] DotP 2014 - Core Fixes Mod v2.0

Postby RiiakShiNal » 19 Apr 2014, 13:48

Given how Gigantiform is written and the rules on how things should work, the ability should be written with an INTERVENING_IF (though I do recognize that it is pretty pointless to check it again after the trigger) and needs to use EffectSourceLKI() for the WasKicked() check. The triggered ability remains on the stack independent of the card once it has been triggered and will properly resolve regardless of whether the original card is still on the battlefield or not.

So the EffectSource() check in the RESOLUTION_TIME_ACTION is a problem as it would cause the ability not to resolve if the card leaves the battlefield before resolution (in contradiction to rules).

In some respects both of you are right, though triggering every time when cast technically isn't a problem because there isn't a card for which this extra interaction and delay would matter, it's only a minor annoyance to the player(s). Regardless, I will have a fixed version up shortly.

Edit: New version, v2.01, is now up.
RiiakShiNal
Programmer
 
Posts: 2185
Joined: 16 May 2011, 21:37
Has thanked: 75 times
Been thanked: 497 times

Re: [REL] DotP 2014 - Core Fixes Mod v2.01

Postby Luchian » 19 Apr 2014, 14:46

I'm still pretty new at card coding, just trying to help.
I know it can't find another copy of Gigantiform as they only put one in the deck, but when you cast their version the effect forces you to shuffle your library. You shouldn't be doing that if you didn't kick it and that's what I was trying to fix.
Luchian
 
Posts: 20
Joined: 21 Mar 2014, 20:50
Has thanked: 10 times
Been thanked: 2 times

Re: [REL] DotP 2014 - Core Fixes Mod v2.01

Postby RiiakShiNal » 19 Apr 2014, 16:02

Luchian wrote:I'm still pretty new at card coding, just trying to help.
I know it can't find another copy of Gigantiform as they only put one in the deck, but when you cast their version the effect forces you to shuffle your library. You shouldn't be doing that if you didn't kick it and that's what I was trying to fix.
Actually, you can have 3 copies of Gigantiform in the Enchanter's Arsenal deck (2 from unlocks and 1 from the promos).

Actually, you don't have to activate the ability even if you did kick it (it uses the may keyword in the ability and the ability is correctly marked with the MAY tag) so you can simply choose not to activate it (though why you wouldn't activate it if you paid the kicker cost I don't know). Regardless it is fixed now so there is no point going through it again and again.
RiiakShiNal
Programmer
 
Posts: 2185
Joined: 16 May 2011, 21:37
Has thanked: 75 times
Been thanked: 497 times

Re: [REL] DotP 2014 - Core Fixes Mod v2.01

Postby NEMESiS » 20 Jun 2014, 19:00

Here is one late entry; Grand Abolisher will prevent you from cycling cards on your opponents turn.
User avatar
NEMESiS
 
Posts: 460
Joined: 03 Jan 2013, 04:02
Location: Pools of Becoming
Has thanked: 70 times
Been thanked: 21 times

Re: [REL] DotP 2014 - Core Fixes Mod v2.01

Postby thefiremind » 20 Jun 2014, 19:39

NEMESiS wrote:Here is one late entry; Grand Abolisher will prevent you from cycling cards on your opponents turn.
If Grand Abolisher is controlled by the opponent who's playing the current turn, then that's fine, cycling is an activated ability.
< Former DotP 2012/2013/2014 modder >
Currently busy with life...
User avatar
thefiremind
Programmer
 
Posts: 3515
Joined: 07 Nov 2011, 10:55
Has thanked: 118 times
Been thanked: 721 times

PreviousNext

Return to 2014

Who is online

Users browsing this forum: No registered users and 51 guests


Who is online

In total there are 51 users online :: 0 registered, 0 hidden and 51 guests (based on users active over the past 10 minutes)
Most users ever online was 4143 on 23 Jan 2024, 08:21

Users browsing this forum: No registered users and 51 guests

Login Form