You can actually make
X/
X tokens by using layer 7B effects (Power_Set / Toughness_Set). Maybe they could have problems when interacting with other layer 7B effects but there aren't many in the game anyway. I can give you one of the most intricated examples, that I managed to code with a lot of effort:
Kalitas, Bloodchief of Ghet. The tokens are just tokens with no abilities and */* as P/T, the code is in the card that produces them.
- Code: Select all
<?xml version='1.0'?>
<CARD_V2 custom="true">
<FILENAME text="KALITAS_BLOODCHIEF_OF_GHET_19991435" />
<CARDNAME text="KALITAS_BLOODCHIEF_OF_GHET" />
<TITLE>
<LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Kalitas, Bloodchief of Ghet]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[]]></LOCALISED_TEXT>
</TITLE>
<MULTIVERSEID value="19991435" />
<ARTID value="19991435" />
<FRAMECOLOUR name="B" />
<COLOUR value="B" />
<ARTIST name="Todd Lockwood" />
<CASTING_COST cost="{5}{B}{B}" />
<SUPERTYPE metaname="Legendary" order_de-DE="0" order_es-ES="1" order_fr-FR="1" order_it-IT="1" order_jp-JA="0" />
<TYPE metaname="Creature" order_de-DE="1" order_es-ES="0" order_fr-FR="0" order_it-IT="0" order_jp-JA="0" />
<SUB_TYPE metaname="Vampire" order_de-DE="0" order_es-ES="1" order_fr-FR="0" order_it-IT="1" order_jp-JA="0" />
<SUB_TYPE metaname="Warrior" order_de-DE="1" order_es-ES="0" order_fr-FR="1" order_it-IT="0" order_jp-JA="1" />
<EXPANSION value="ZEN" />
<RARITY metaname="M" />
<POWER value="5" />
<TOUGHNESS value="5" />
<TOKEN_REGISTRATION reservation="2" type="TOKEN_VAMPIRE_X_X_19990107" />
<ACTIVATED_ABILITY>
<LOCALISED_TEXT LanguageCode="en-US"><![CDATA[{B}{B}{B}, {T}: Destroy target creature. If that creature dies this way, put a black Vampire creature token onto the battlefield. Its power is equal to that creature’s power and its toughness is equal to that creature’s toughness.]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[]]></LOCALISED_TEXT>
<LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[]]></LOCALISED_TEXT>
<COST type="Mana" cost="{B}{B}{B}" />
<COST type="TapSelf" />
<TARGET_DETERMINATION>
local filter = Object():GetFilter()
filter:Clear()
filter:AddCardType( CARD_TYPE_CREATURE )
filter:SetZone( ZONE_IN_PLAY )
return TargetBadF()
</TARGET_DETERMINATION>
<PLAY_TIME_ACTION target_choosing="1">
ChooseTarget( "CARD_QUERY_CHOOSE_CREATURE_TO_DESTROY" )
</PLAY_TIME_ACTION>
<PLAY_TIME_ACTION>
local target = Object():GetTargetCard()
if target ~= nil then
MTG():ObjectDataChest():Set_ProtectedCardPtr( 1, target )
MTG():ObjectDataChest():Set_Int( 3, target:GetCurrentPower() )
MTG():ObjectDataChest():Set_Int( 4, target:GetCurrentToughness() )
end
</PLAY_TIME_ACTION>
<RESOLUTION_TIME_ACTION>
local target = MTG():ObjectDataChest():Get_ProtectedCardPtr( 1 )
if target ~= nil then
Object():RetainDataChest()
target:Destroy()
end
</RESOLUTION_TIME_ACTION>
</ACTIVATED_ABILITY>
<TRIGGERED_ABILITY internal="1" active_zone="any">
<TRIGGER value="ABILITY_RESOLVED" simple_qualifier="self">
local last_target = MTG():ObjectDataChest():Get_ProtectedCardPtr( 1 )
if last_target ~= nil and last_target:GetZone() == ZONE_GRAVEYARD then
return true
else
Object():ReleaseDataChest()
return false
end
</TRIGGER>
<RESOLUTION_TIME_ACTION>
local target = MTG():ObjectDataChest():Get_ProtectedCardPtr( 1 )
if target ~= nil then
local base_token = MTG():ObtainToken( "TOKEN_VAMPIRE_X_X_19990107", Object():GetPlayer() )
if base_token ~= nil then
local token = MTG():ObtainTokenFromSpec( base_token:GetSpec(), Object():GetPlayer() )
if token ~= nil then
local store = Storage( Object() )
store.push( token )
store.push( MTG():ObjectDataChest():Get_Int( 3 ) )
store.push( MTG():ObjectDataChest():Get_Int( 4 ) )
token:PutIntoPlay( Object():GetPlayer() )
end
end
end
Object():ReleaseDataChest()
</RESOLUTION_TIME_ACTION>
</TRIGGERED_ABILITY>
<TRIGGERED_ABILITY internal="1" active_zone="any" layer="7B">
<TRIGGER value="COMING_INTO_PLAY">
local store = Storage( Object() )
return store.test( TriggerObject() ) ~= -1
</TRIGGER>
<CONTINUOUS_ACTION>
local store = Storage( Object() )
local index = store.test( TriggerObject() )
if index ~= -1 then
local power = store.get( index+1 )
local toughness = store.get( index+2 )
if power ~= nil and toughness ~= nil then
TriggerObject():GetCurrentCharacteristics():Power_Set( power )
TriggerObject():GetCurrentCharacteristics():Toughness_Set( toughness )
end
end
</CONTINUOUS_ACTION>
</TRIGGERED_ABILITY>
<TRIGGERED_ABILITY internal="1" active_zone="any">
<TRIGGER value="ZONECHANGE">
local store = Storage( Object() )
return TriggerObject():GetErstwhileZone() == ZONE_IN_PLAY and store.test( TriggerObject() ) ~= -1
</TRIGGER>
<CONTINUOUS_ACTION>
local store = Storage( Object() )
local index = store.test( TriggerObject() )
if index ~= -1 then
store.erase( index+2 )
store.erase( index+1 )
store.erase( index )
end
</CONTINUOUS_ACTION>
</TRIGGERED_ABILITY>
<SFX text="COMBAT_FANG_LARGE_ATTACK" power_boundary_min="4" power_boundary_max="-1" />
<SFX text="COMBAT_FANG_SMALL_ATTACK" power_boundary_min="1" power_boundary_max="3" />
</CARD_V2>
I hope I remember enough to explain how it works...
Let's start with the activated ability: you target the creature, and the ability saves a pointer to it and its P/T values in the data chest, before destroying. The ability is resolved, so the second ability triggers. It puts the token into play and saves a pointer to it, together with the previously saved P/T, in nabeshin's storage. This is necessary because we want to keep track of more than 1 token. The third ability triggers when something saved in the storage is coming into play, and that's the case for the token. It reads the P/T values and assigns them to the token continuously. The fourth ability cleans the storage when a token leaves play.
Your examples should be easier to make: Kalitas needs to save the information about the destroyed creature, while you just need to use GetManaX() for P/T.
EDIT: I just read about the idea of making transform cards. If you want to try, I wish you good luck. I tried some months ago, and the only thing I got was a lot of anger. The idea was to use nabeshin's clone mechanic in order to make them clone what they were transforming in. I was at a good point, but it would have been pointless without
Full Moon's Rise, so I tweaked the code in order to make them transform with the change of a flag: this way I could have made some other card order them to transform. Since that time, I hadn't been able to make them work again, not even by coming back to the code I was using earlier (I probably forgot something about it), so I gave up.