I worked some more on this problem and made a small step forward, though I still miss the big idea to make everything work as expected.
I made a storage (much like nabeshin's storage in DotP2012... I actually started from his work

) that can be used to save power and toughness of */* tokens. The complexity of the cards generating */* tokens isn't higher than before, and the code for the tokens themselves is modular (I mean you can copy-paste it).
Here is the functions file, and an example, the RTR card Slime Molding:
- Functions file | Open
- Code: Select all
COMPARTMENT_ID_STAR_TOKEN_INDEX = 2222
STMChest = {}
function StarTokensManager()
local v = {}
v.CreateNext = function()
local i = 0
while STMChest[i] ~= nil do
i = i + 1
end
local subchest = {}
subchest[1] = -1
subchest[2] = -1
STMChest[i] = subchest
return i
end
v.Set = function(index, power, toughness)
if STMChest[index] ~= nil then
STMChest[index][1] = power
STMChest[index][2] = toughness
end
end
v.GetPower = function(index)
return STMChest[index] and STMChest[index][1]
end
v.GetToughness = function(index)
return STMChest[index] and STMChest[index][2]
end
return v
end
- Slime Molding | Open
- Code: Select all
<?xml version='1.0'?>
<CARD_V2>
<FILENAME text="SLIME_MOLDING_290533" />
<CARDNAME text="SLIME_MOLDING" />
<TITLE>
<LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Slime Molding]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[Plasmare la Melma]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Schleimformung]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[Façonnage de boue]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Moldear el cieno]]></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[Moldagem de Limo]]></LOCALISED_TEXT>
</TITLE>
<MULTIVERSEID value="290533" />
<ARTID value="A290533" />
<ARTIST name="Marco Nelor" />
<CASTING_COST cost="{X}{G}" />
<FLAVOURTEXT>
<LOCALISED_TEXT LanguageCode="en-US"><![CDATA[“Give me enough refuse and mana and I will summon an ooze that can engulf all of Ravnica.”
—Cevraya, Golgari shaman]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[“Dammi abbastanza rifiuti e mana e ti evocherò una melma in grado di ingoiare Ravnica intera.”
—Cevraya, sciamana Golgari]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[„Gib mir nur genug Abfälle und Mana, und ich beschwöre einen Schleim herbei, der ganz Ravnica verschlingen kann.”
—Cevraya, Golgari-Schamane]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[« Donnez-moi suffisamment de déchets et de mana et j’invoquerai un limon capable d’engloutir tout Ravnica. »
—Cevraya, shamane de Golgari]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[“Dame suficientes desechos y maná e invocaré un cieno que sepultará toda Rávnica.”
—Cevraya, chamán golgari]]></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[“Com lixo e mana suficiente, eu posso invocar um lodo capaz de engolir toda Ravnica.” — Cevraya, xamã Golgari]]></LOCALISED_TEXT>
</FLAVOURTEXT>
<TYPE metaname="Sorcery" />
<EXPANSION value="RTR" />
<RARITY metaname="U" />
<SPELL_ABILITY>
<LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Put an X/X green Ooze creature token onto the battlefield.]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[Metti sul campo di battaglia una pedina creatura Melma X/X verde.]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Bringe einen X/X grünen Schlammwesen-Kreaturenspielstein ins Spiel.]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[Mettez sur le champ de bataille un jeton de créature X/X verte Limon.]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Pon en el campo de batalla una ficha de criatura Cieno verde X/X.]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[緑のX/Xのウーズ・クリーチャー・トークンを1体戦場に出す。]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[X/X 녹색 점액괴물 생물 토큰 한 개를 전장에 놓는다.]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[Положите на поле битвы одну фишку существа Х/Х зеленая Тина.]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[Coloque no campo de batalha uma ficha de criatura verde X/X do tipo Lodo.]]></LOCALISED_TEXT>
<RESOLUTION_TIME_ACTION>
local x = GetObjectX()
local index = StarTokensManager().CreateNext()
StarTokensManager().Set(index, x, x)
EffectDC():Set_Int(0, index)
MTG():PutTokensIntoPlay( "TOKEN_OOZE_S_S_19990127", 1, EffectController(), EffectDC():Make_Chest(1) )
</RESOLUTION_TIME_ACTION>
<RESOLUTION_TIME_ACTION>
local chest = EffectDC():Get_Chest(1)
if chest ~= nil then
local n = 0
while chest:Get_CardPtr(n) ~= nil do
chest:Get_CardPtr(n):GetDataChest():Set_Int( COMPARTMENT_ID_STAR_TOKEN_INDEX, EffectDC():Get_Int(0) )
n = n + 1
end
end
</RESOLUTION_TIME_ACTION>
</SPELL_ABILITY>
<TOKEN_REGISTRATION reservation="1" type="TOKEN_OOZE_S_S_19990127" />
<AI_BASE_SCORE score="600" zone="ZONE_HAND" />
</CARD_V2>
- Ooze token | Open
- Code: Select all
<?xml version='1.0'?>
<CARD_V2>
<FILENAME text="TOKEN_OOZE_S_S_19990127" />
<CARDNAME text="OOZE" />
<TITLE>
<LOCALISED_TEXT LanguageCode="en-US"><![CDATA[OOZE]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[LIMON]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[CIENO]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[SCHLAMMWESEN]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[MELMA]]></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[LODO]]></LOCALISED_TEXT>
</TITLE>
<MULTIVERSEID value="19990127" />
<ARTID value="A19990127" />
<COLOUR value="G" />
<ARTIST name="Marco Nelor" />
<CASTING_COST cost="" />
<TYPE metaname="Creature" />
<SUB_TYPE metaname="Ooze" />
<EXPANSION value="DPG" />
<RARITY metaname="T" />
<POWER value="*" />
<TOUGHNESS value="*" />
<TOKEN />
<STATIC_ABILITY filter_zone="ZONE_IN_PLAY">
<CONTINUOUS_ACTION layer="7A">
local index = ObjectDC():Get_Int(COMPARTMENT_ID_STAR_TOKEN_INDEX)
local stm = StarTokensManager()
local power = stm.GetPower(index)
local toughness = stm.GetToughness(index)
local characteristics = Object():GetCurrentCharacteristics()
characteristics:Power_Set(power)
characteristics:Toughness_Set(toughness)
</CONTINUOUS_ACTION>
</STATIC_ABILITY>
<SFX text="COMBAT_BLUNT_LARGE_ATTACK" power_boundary_min="4" power_boundary_max="-1" />
<SFX text="COMBAT_BLUNT_SMALL_ATTACK" power_boundary_min="1" power_boundary_max="3" />
</CARD_V2>
As you can see, calling StarTokensManager().CreateNext() makes a new space available, automatically incrementing the index and returning it afterwards. This index is used to store power and toughness and to retrieve those values from the token.
This is also compatible with Doubling Season (and similar cards)! The "while" loop passes the index to any number of generated tokens.
With this code, the base power and toughness of every */* token are in a safe place, and passing the index to the created token is easy with GetDataChest()... but the main problem is still unsolved: is there a way to pass the same index to a copy of the token without recoding all the cards that can copy tokens (Clone, Rite of Replication, etc.)? I really can't think of anything.
