It is currently 26 Apr 2024, 05:41
   
Text Size

General DotP 2014 Coding Questions

Moderator: CCGHQ Admins

Re: General DotP 2014 Coding Questions

Postby GrovyleXShinyCelebi » 02 Nov 2013, 19:01

Hey mates, is SetAttackController() and SetBlockController() defective in Duels 2014? I just made Odric, Master Tactician and it appears SetBlockController() won't allow me to select blocking creatures:

Code: Select all
 <TRIGGERED_ABILITY>
    <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Whenever Odric, Master Tactician and at least three other creatures attack, you choose which creatures block this combat and how those creatures block.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[À chaque fois qu’Odric, maître tacticien et au moins trois autres créatures attaquent, vous choisissez quelles créatures bloquent ce combat et comment elles bloquent.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Siempre que Odric, maestro estratega y al menos otras tres criaturas ataquen, tú eliges qué criaturas bloquean este combate y cómo bloquean esas criaturas.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Immer wenn Odric der Meistertaktiker und mindestens drei andere Kreaturen angreifen, bestimmst du, welche Kreaturen in diesem Kampf blocken und wie sie blocken.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[Ogniqualvolta Odric, Grande Stratega e almeno altre tre creature attaccano, scegli quali creature bloccano in questo combattimento e come bloccano.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[熟練の戦術家、オドリックと少なくとも3体の他のクリーチャーが攻撃するたび、あなたは、この戦闘でどのクリーチャーがどのようにブロックするかを選ぶ。]]></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 Odric, Estrategista Mestre, e pelo menos três outras criaturas atacam, você escolhe quais criaturas bloqueiam neste combate e como elas bloqueiam.]]></LOCALISED_TEXT>
  <TRIGGER value="ATTACKING" simple_qualifier="self" />
   <INTERVENING_IF>
    local filter = ClearFilter()
    filter:Add( FE_TYPE, OP_IS, CARD_TYPE_CREATURE  )
    filter:Add( FE_IS_ATTACKING, true )
    filter:Add( FE_CARD_INSTANCE, OP_NOT, EffectSource() )
   local number = filter:CountStopAt(3)
   if number == 3 then
   return true
   end
   return false
   </INTERVENING_IF>
   <RESOLUTION_TIME_ACTION>
    local player = EffectController()
    if player ~= nil then
       player:DisplayMessage("CARD_MESSAGE_ODRIC")
    end
    </RESOLUTION_TIME_ACTION>
    <CONTINUOUS_ACTION>
    local num_players = MTG():GetNumberOfPlayers()
    for i=0,num_players-1 do
       local player = MTG():GetNthPlayer(i)
       if player ~= nil then
          player:GetCurrentCharacteristics():SetBlockController(EffectController())
       end
    end
    </CONTINUOUS_ACTION>
    <DURATION simple_duration="UntilEOT" />
    <AUTO_SKIP always="1" />
  </TRIGGERED_ABILITY>
User avatar
GrovyleXShinyCelebi
 
Posts: 294
Joined: 12 Jun 2013, 18:23
Has thanked: 14 times
Been thanked: 37 times

Re: General DotP 2014 Coding Questions

Postby thefiremind » 02 Nov 2013, 20:19

GrovyleXShinyCelebi wrote:Hey mates, is SetAttackController() and SetBlockController() defective in Duels 2014? I just made Odric, Master Tactician and it appears SetBlockController() won't allow me to select blocking creatures:
Unfortunately yes, I discovered it not long ago with my Leyline of Deity: SetAttackController works, but SetBlockController doesn't. The only thing you can do with SetBlockController is to declare no blockers. :(
< 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: General DotP 2014 Coding Questions

Postby GrovyleXShinyCelebi » 03 Nov 2013, 00:29

*sigh* So there are no workarounds nor approximations?

And is it true that DUEL_CHARACTERISTIC_MAX_ONE_ATTACKER is bugged as well?
User avatar
GrovyleXShinyCelebi
 
Posts: 294
Joined: 12 Jun 2013, 18:23
Has thanked: 14 times
Been thanked: 37 times

Re: General DotP 2014 Coding Questions

Postby thefiremind » 03 Nov 2013, 00:33

GrovyleXShinyCelebi wrote:*sigh* So there are no workarounds nor approximations?
If "creature A blocks creature B this turn if able" were possible, maybe... but since it's not, I don't think there's a chance.

GrovyleXShinyCelebi wrote:And is it true that DUEL_CHARACTERISTIC_MAX_ONE_ATTACKER is bugged as well?
I have never tried... try and see.
< 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: General DotP 2014 Coding Questions

Postby GrovyleXShinyCelebi » 03 Nov 2013, 19:11

Another thing, I have a question about Capricious Efreet.

I'm trying to make his ability:

Code: Select all
  <TRIGGERED_ABILITY>
    <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[At the beginning of your upkeep, choose target nonland permanent you control and up to two target nonland permanents you don’t control. Destroy one of them at random.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[Au début de votre entretien, choisissez un permanent non-terrain ciblé que vous contrôlez et jusqu’à deux permanents non-terrain ciblés que vous ne contrôlez pas. Détruisez l’un d’eux au hasard.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Al comienzo de tu mantenimiento, elige el permanente objetivo que no sea tierra que controles y hasta dos permanentes objetivos que no sean tierras que no controles. Destruye uno de ellos al azar.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Bestimme zu Beginn deines Versorgungssegments eine bleibende Karte deiner Wahl, die du kontrollierst, und bis zu zwei bleibende Karten deiner Wahl, die du nicht kontrollierst. Keine dieser bleibenden Karten darf ein Land sein. Bestimme eine davon zufällig und zerstöre sie.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[All’inizio del tuo mantenimento, scegli un permanente non terra bersaglio che controlli e fino a due permanenti non terra bersaglio che non controlli. Distruggi uno di essi a caso.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[あなたのアップキープの開始時に、あなたがコントロールする土地でないパーマネント1つを対象とし、あなたがコントロールしていない土地でないパーマネントを最大2つまで対象とする。それらのうち無作為に選んだ1つを破壊する。]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[At the beginning of your upkeep, choose target nonland permanent you control and up to two target nonland permanents you don’t control. Destroy one of them at random.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[At the beginning of your upkeep, choose target nonland permanent you control and up to two target nonland permanents you don’t control. Destroy one of them at random.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[At the beginning of your upkeep, choose target nonland permanent you control and up to two target nonland permanents you don’t control. Destroy one of them at random.]]></LOCALISED_TEXT>
  <TRIGGER value="BEGINNING_OF_PLAYERS_STEP" simple_qualifier="controller">
    return MTG():GetStep() == STEP_UPKEEP
    </TRIGGER>
    <SFX text="TARGET_BLADE_PLAY" />
    <TARGET tag="CARD_QUERY_CHOOSE_NONLAND_PERMANENT_TO_DESTROY" definition="0" compartment="1" count="2" up_to="1"/>
    <TARGET_DEFINITION id="0">
    local filter = ClearFilter()
    filter:Add( FE_IS_PERMANENT, true )
    filter:Add( FE_TYPE, OP_NOT, CARD_TYPE_LAND )
    filter:Add( FE_CONTROLLER, OP_NOT, EffectController() )
    </TARGET_DEFINITION>
    <TARGET tag="CARD_QUERY_CHOOSE_NONLAND_PERMANENT_TO_DESTROY" definition="1" compartment="0" count="1"/>
    <TARGET_DEFINITION id="1">
    local filter = ClearFilter()
    filter:Add( FE_IS_PERMANENT, true )
    filter:Add( FE_TYPE, OP_NOT, CARD_TYPE_LAND )
    filter:Add( FE_CONTROLLER, OP_IS, EffectController() )
    </TARGET_DEFINITION>
    <RESOLUTION_TIME_ACTION>
    local target = EffectDC():Get_Targets(0):Get_CardPtr(0)
    if target ~= nil then   
       target:Destroy() 
    end
    </RESOLUTION_TIME_ACTION>
    <RESOLUTION_TIME_ACTION>
    local target_one = EffectDC():Get_Targets(0) and EffectDC():Get_Targets(0):Get_CardPtr(0)
    local target_two = EffectDC():Get_Targets(1) and EffectDC():Get_Targets(1):Get_CardPtr(0)
    local target_three = EffectDC():Get_Targets(1) and EffectDC():Get_Targets(1):Get_CardPtr(1)
    local count = 0
    if target_one ~= nil then
      count = count + 1
    end
    if target_two ~= nil then
      count = count + 1
    end
    if target_three ~= nil then
      count = count + 1
    end
    if count &gt; 0 then
       local random = MTG():RandomNumberBetween(1,count)
       if target_one ~= nil then
         random = random - 1
         if random == 0 then
          target_one:Destroy()
          return
         end
       end
       
       if target_two ~= nil then
         random = random - 1
         if random == 0 then
          target_two:Destroy()
          return
         end
       end
       
       if target_three ~= nil then
         random = random - 1
         if random == 0 then
          target_three:Destroy()
          return
         end
       end
    end
    </RESOLUTION_TIME_ACTION>
    <SFX text="TARGET_FLAME_PLAY" />
  </TRIGGERED_ABILITY>
Thing is, whenever I test it it seems to always destroy the target that I control AND a target that I don't control, and I don't get why. When I take out the random = random - 1 and make it like so:

Code: Select all
  <TRIGGERED_ABILITY>
    <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[At the beginning of your upkeep, choose target nonland permanent you control and up to two target nonland permanents you don’t control. Destroy one of them at random.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[Au début de votre entretien, choisissez un permanent non-terrain ciblé que vous contrôlez et jusqu’à deux permanents non-terrain ciblés que vous ne contrôlez pas. Détruisez l’un d’eux au hasard.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Al comienzo de tu mantenimiento, elige el permanente objetivo que no sea tierra que controles y hasta dos permanentes objetivos que no sean tierras que no controles. Destruye uno de ellos al azar.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Bestimme zu Beginn deines Versorgungssegments eine bleibende Karte deiner Wahl, die du kontrollierst, und bis zu zwei bleibende Karten deiner Wahl, die du nicht kontrollierst. Keine dieser bleibenden Karten darf ein Land sein. Bestimme eine davon zufällig und zerstöre sie.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[All’inizio del tuo mantenimento, scegli un permanente non terra bersaglio che controlli e fino a due permanenti non terra bersaglio che non controlli. Distruggi uno di essi a caso.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[あなたのアップキープの開始時に、あなたがコントロールする土地でないパーマネント1つを対象とし、あなたがコントロールしていない土地でないパーマネントを最大2つまで対象とする。それらのうち無作為に選んだ1つを破壊する。]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[At the beginning of your upkeep, choose target nonland permanent you control and up to two target nonland permanents you don’t control. Destroy one of them at random.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[At the beginning of your upkeep, choose target nonland permanent you control and up to two target nonland permanents you don’t control. Destroy one of them at random.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[At the beginning of your upkeep, choose target nonland permanent you control and up to two target nonland permanents you don’t control. Destroy one of them at random.]]></LOCALISED_TEXT>
  <TRIGGER value="BEGINNING_OF_PLAYERS_STEP" simple_qualifier="controller">
    return MTG():GetStep() == STEP_UPKEEP
    </TRIGGER>
    <SFX text="TARGET_BLADE_PLAY" />
    <TARGET tag="CARD_QUERY_CHOOSE_NONLAND_PERMANENT_TO_DESTROY" definition="0" compartment="1" count="2" up_to="1"/>
    <TARGET_DEFINITION id="0">
    local filter = ClearFilter()
    filter:Add( FE_IS_PERMANENT, true )
    filter:Add( FE_TYPE, OP_NOT, CARD_TYPE_LAND )
    filter:Add( FE_CONTROLLER, OP_NOT, EffectController() )
    </TARGET_DEFINITION>
    <TARGET tag="CARD_QUERY_CHOOSE_NONLAND_PERMANENT_TO_DESTROY" definition="1" compartment="0" count="1"/>
    <TARGET_DEFINITION id="1">
    local filter = ClearFilter()
    filter:Add( FE_IS_PERMANENT, true )
    filter:Add( FE_TYPE, OP_NOT, CARD_TYPE_LAND )
    filter:Add( FE_CONTROLLER, OP_IS, EffectController() )
    </TARGET_DEFINITION>
    <RESOLUTION_TIME_ACTION>
    local target = EffectDC():Get_Targets(0):Get_CardPtr(0)
    if target ~= nil then   
       target:Destroy() 
    end
    </RESOLUTION_TIME_ACTION>
    <RESOLUTION_TIME_ACTION>
    local target_one = EffectDC():Get_Targets(0) and EffectDC():Get_Targets(0):Get_CardPtr(0)
    local target_two = EffectDC():Get_Targets(1) and EffectDC():Get_Targets(1):Get_CardPtr(0)
    local target_three = EffectDC():Get_Targets(1) and EffectDC():Get_Targets(1):Get_CardPtr(1)
    local count = 0
    if target_one ~= nil then
      count = count + 1
    end
    if target_two ~= nil then
      count = count + 1
    end
    if target_three ~= nil then
      count = count + 1
    end
    if count &gt; 0 then
       local random = MTG():RandomNumberBetween(1,count)
       if target_one ~= nil then
         if random == 1 then
          target_one:Destroy()
          return
         end
       end
       
       if target_two ~= nil then
         if random == 2 then
          target_two:Destroy()
          return
         end
       end
       
       if target_three ~= nil then
         if random == 3 then
          target_three:Destroy()
          return
         end
       end
    end
    </RESOLUTION_TIME_ACTION>
    <SFX text="TARGET_FLAME_PLAY" />
  </TRIGGERED_ABILITY>
...it will always choose the target that I control. Know what's going on?
User avatar
GrovyleXShinyCelebi
 
Posts: 294
Joined: 12 Jun 2013, 18:23
Has thanked: 14 times
Been thanked: 37 times

Re: General DotP 2014 Coding Questions

Postby MC Brodie » 03 Nov 2013, 19:18

You have a Resolution Time Action block directly after the Target ID #1 block that destroys the target in compartment 0. :)
-----------------------------------------------------------------------
Song of the Day: 46 and 2 (cover)
MC Brodie
 
Posts: 310
Joined: 01 Jun 2013, 00:10
Has thanked: 44 times
Been thanked: 34 times

Re: General DotP 2014 Coding Questions

Postby GrovyleXShinyCelebi » 03 Nov 2013, 19:22

Aah! Stupid mistake #9001 :oops: Many apologies, I'm trying to get 21 decks done as fast as possible #-o

But in all seriousness, what's the difference between the two methods of choosing a target randomly (reducing "random" variable to 0 and just outright choosing "if random is 1 destroy X")? Why does the first seem to work but the second doesn't?
User avatar
GrovyleXShinyCelebi
 
Posts: 294
Joined: 12 Jun 2013, 18:23
Has thanked: 14 times
Been thanked: 37 times

Re: General DotP 2014 Coding Questions

Postby thefiremind » 03 Nov 2013, 20:39

GrovyleXShinyCelebi wrote:what's the difference between the two methods of choosing a target randomly (reducing "random" variable to 0 and just outright choosing "if random is 1 destroy X")? Why does the first seem to work but the second doesn't?
To be honest I'm not sure about it, but I see that Bloodbraid Elf uses Remove_RandomCardPtr in order to get a random pointer from a chest, so the following code should work and be a sure hit:
Code: Select all
    <RESOLUTION_TIME_ACTION>
    local target_one = EffectDC():Get_Targets(0) and EffectDC():Get_Targets(0):Get_CardPtr(0)
    local target_two = EffectDC():Get_Targets(1) and EffectDC():Get_Targets(1):Get_CardPtr(0)
    local target_three = EffectDC():Get_Targets(1) and EffectDC():Get_Targets(1):Get_CardPtr(1)
    local count = 0
    local chest = EffectDC():Make_Chest(2)
    if target_one ~= nil then
       chest:Set_CardPtr(count, target_one)
       count = count + 1
    end
    if target_two ~= nil then
       chest:Set_CardPtr(count, target_two)
       count = count + 1
    end
    if target_three ~= nil then
       chest:Set_CardPtr(count, target_three)
       count = count + 1
    end
    if count &gt; 0 then
       local random = chest:Remove_RandomCardPtr()
       if random ~= nil then
          random:Destroy()
       end
    end
    </RESOLUTION_TIME_ACTION>
< 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: General DotP 2014 Coding Questions

Postby GrovyleXShinyCelebi » 06 Nov 2013, 01:03

Hey mate, another quick debug question since I'm a little short on time today (apologies for bothering you on what might be another stupid mistake)

Know what might be wrong with Deus of Calamity here?

Code: Select all
<?xml version='1.0' encoding='UTF-8'?>
<CARD_V2 ExportVersion="1">
  <FILENAME text="DEUS_OF_CALAMITY_99373363" />
  <CARDNAME text="DEUS_OF_CALAMITY" />
  <TITLE>
    <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Deus of Calamity]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[Deus of Calamity]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Deus of Calamity]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Deus of Calamity]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[Deus of Calamity]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[災難の大神]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[Deus of Calamity]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[Deus of Calamity]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[Deus of Calamity]]></LOCALISED_TEXT>
  </TITLE>
  <MULTIVERSEID value="99373363" />
  <ARTID value="111663" />
  <ARTIST name="Todd Lockwood" />
  <CASTING_COST cost="{R/G}{R/G}{R/G}{R/G}{R/G}" />
  <FLAVOURTEXT>
    <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[“He bears the marks of ages upon his skin, memories of dreams long dead and best left buried.”
—The Seer’s Parables]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[“He bears the marks of ages upon his skin, memories of dreams long dead and best left buried.”
—The Seer’s Parables]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[“He bears the marks of ages upon his skin, memories of dreams long dead and best left buried.”
—The Seer’s Parables]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[“He bears the marks of ages upon his skin, memories of dreams long dead and best left buried.”
—The Seer’s Parables]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[“He bears the marks of ages upon his skin, memories of dreams long dead and best left buried.”
—The Seer’s Parables]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[「彼は肌に、死して永く忘れ去った方が望ましい歳月の印を帯びている。」
――「予見者の寓話」]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[“He bears the marks of ages upon his skin, memories of dreams long dead and best left buried.”
—The Seer’s Parables]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[“He bears the marks of ages upon his skin, memories of dreams long dead and best left buried.”
—The Seer’s Parables]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[“He bears the marks of ages upon his skin, memories of dreams long dead and best left buried.”
—The Seer’s Parables]]></LOCALISED_TEXT>
  </FLAVOURTEXT>
  <TYPE metaname="Creature" />
  <SUB_TYPE metaname="Spirit" />
  <SUB_TYPE metaname="Avatar" />
  <EXPANSION value="DDL" />
  <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>
    <INTRINSIC characteristic="CHARACTERISTIC_TRAMPLE" />
  </STATIC_ABILITY>
  <TRIGGERED_ABILITY>
    <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Whenever Deus of Calamity deals 6 or more damage to an opponent, destroy target land that player controls.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[Whenever Deus of Calamity deals 6 or more damage to an opponent, destroy target land that player controls.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Whenever Deus of Calamity deals 6 or more damage to an opponent, destroy target land that player controls.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Whenever Deus of Calamity deals 6 or more damage to an opponent, destroy target land that player controls.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[Ogniqualvolta il Dio delle Calamità infligge 6 o più danni a un avversario, distruggi una terra bersaglio controllata da quel giocatore.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[Whenever Deus of Calamity deals 6 or more damage to an opponent, destroy target land that player controls.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[Whenever Deus of Calamity deals 6 or more damage to an opponent, destroy target land that player controls.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[Whenever Deus of Calamity deals 6 or more damage to an opponent, destroy target land that player controls.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[Whenever Deus of Calamity deals 6 or more damage to an opponent, destroy target land that player controls.]]></LOCALISED_TEXT>
   <SFX text="TARGET_BLUNT_PLAY" />
    <TRIGGER value="SOURCE_DEALS_DAMAGE_TO_PLAYER" simple_qualifier="self" damage_type="all" >
    return (Damage():GetAmount() &gt; 5) and (SecondaryPlayer():GetTeam() == EffectController():GetTeam())
    </TRIGGER>
    <TARGET tag="CARD_QUERY_CHOOSE_LAND_TO_DESTROY" definition="0" compartment="0" count="1" />
    <TARGET_DEFINITION id="0">
    if SecondaryPlayer() ~= nil then
       local filter = ClearFilter()
       filter:Add( FE_TYPE, OP_IS, CARD_TYPE_LAND )
    filter:Add( FE_CONTROLLER, OP_IS, SecondaryPlayer() )
    end
    </TARGET_DEFINITION>   
   <RESOLUTION_TIME_ACTION>
    local target = EffectDC():Get_Targets(0):Get_CardPtr(0)
    if target ~= nil then   
       target:Destroy() 
    end       
   </RESOLUTION_TIME_ACTION>
  </TRIGGERED_ABILITY>
  <HELP title="MORE_INFO_BADGE_TITLE_1" body="MORE_INFO_BADGE_BODY_1" zone="ZONE_ANY" />
  <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>
User avatar
GrovyleXShinyCelebi
 
Posts: 294
Joined: 12 Jun 2013, 18:23
Has thanked: 14 times
Been thanked: 37 times

Re: General DotP 2014 Coding Questions

Postby RiiakShiNal » 06 Nov 2013, 01:16

You are triggering only when it deals damage to a player on the same team as EffectController() (which in general this card should not be able to do). It should check to see that the SecondaryPlayer():GetTeam() ~= EffectController():GetTeam().
RiiakShiNal
Programmer
 
Posts: 2185
Joined: 16 May 2011, 21:37
Has thanked: 75 times
Been thanked: 497 times

Re: General DotP 2014 Coding Questions

Postby GrovyleXShinyCelebi » 07 Nov 2013, 00:39

Alright, I got another card I need help debugging, Vengeful Rebirth.

Apologies for all this, I'm making quite a few cards at once.

Code: Select all
  <SPELL_ABILITY>
    <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Return target card from your graveyard to your hand. If you return a nonland card to your hand this way, Vengeful Rebirth deals damage equal to that card’s converted mana cost to target creature or player.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[Renvoyez une carte ciblée depuis votre cimetière dans votre main. Si vous renvoyez une carte non-terrain dans votre main de cette manière, la Renaissance vengeresse inflige à une cible, créature ou joueur, un nombre de blessures égal au coût converti de mana de cette carte.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Regresa la carta objetivo de tu cementerio a tu mano. Si regresas una carta que no sea tierra a tu mano de esta manera, el Renacimiento vengativo hace daño a la criatura o jugador objetivo igual al coste de maná convertido de esa carta. ]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Bringe eine Karte deiner Wahl aus deinem Friedhof auf deine Hand zurück. Falls du auf diese Weise eine Karte auf deine Hand zurückbringst, die kein Land ist, fügt Rachsüchtige Wiedergeburt einer Kreatur oder einem Spieler deiner Wahl Schadenspunkte in Höhe der umgewandelten Manakosten dieser Karte zu.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[Riprendi in mano una carta bersaglio dal tuo cimitero. Se riprendi in mano una carta non terra in questo modo, la Rinascita Vendicativa infligge danno pari al costo di mana convertito di quella carta a una creatura o a un giocatore bersaglio.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[あなたの墓地にあるカード1枚を対象とし、クリーチャー1体かプレイヤー1人を対象とする。その前者をあなたの手札に戻す。 これにより土地でないカードをあなたの手札に戻した場合、復讐に燃えた再誕はそのクリーチャーやプレイヤーに、そのカードの点数で見たマナ・コストに等しい点数のダメージを与える。]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[Return target card from your graveyard to your hand. If you return a nonland card to your hand this way, Vengeful Rebirth deals damage equal to that card’s converted mana cost to target creature or player.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[Return target card from your graveyard to your hand. If you return a nonland card to your hand this way, Vengeful Rebirth deals damage equal to that card’s converted mana cost to target creature or player.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[Return target card from your graveyard to your hand. If you return a nonland card to your hand this way, Vengeful Rebirth deals damage equal to that card’s converted mana cost to target creature or player.]]></LOCALISED_TEXT>
     <SFX text="TARGET_PESTS_PLAY" />
    <TARGET tag="CARD_QUERY_CHOOSE_CARD_TO_RETURN" definition="0" compartment="0" count="1" />
    <TARGET_DEFINITION id="0">
    local filter = ClearFilter()
    filter:SetZone( ZONE_GRAVEYARD, EffectController() )
    </TARGET_DEFINITION>
    <TARGET tag="CARD_QUERY_CHOOSE_CREATURE_TO_DAMAGE" definition="1" compartment="1">
   local target = EffectDC():Get_Targets(0):Get_CardPtr(0)
   if target ~= nil then
      if target:GetCardType():Test( CARD_TYPE_LAND ) == false then
             MTG():SetTargetCount(1)
             return   
      end   
   end
     MTG():SetTargetCount(0)
    </TARGET>
    <TARGET_DEFINITION id="1">
    local filter = ClearFilter()
    filter:SetFilterType( FILTER_TYPE_CARDS + FILTER_TYPE_PLAYERS )
    filter:Add( FE_TYPE, OP_IS, CARD_TYPE_CREATURE )
    </TARGET_DEFINITION>
    <RESOLUTION_TIME_ACTION>
    local tarjeta = EffectDC():Get_Targets(0):Get_CardPtr(0)
    if tarjeta ~= nil then
      local target = EffectDC():Get_Targets(1):Get_CardPtr(0)
      local player = EffectDC():Get_Targets(1):Get_PlayerPtr(0)
      local cmc = tarjeta:GetConvertedManaCost()
      if target ~= nil then
       EffectSourceLKI():DealDamageTo( cmc, target )
      elseif player ~= nil then
       EffectSourceLKI():DealDamageTo( cmc, player )
    end
  end
    </RESOLUTION_TIME_ACTION>
    <RESOLUTION_TIME_ACTION>
    local target = EffectDC():Get_Targets(0):Get_CardPtr(0)
    if  target ~= nil then
       target:PutInHand()
    end 
    </RESOLUTION_TIME_ACTION>
  </SPELL_ABILITY>
User avatar
GrovyleXShinyCelebi
 
Posts: 294
Joined: 12 Jun 2013, 18:23
Has thanked: 14 times
Been thanked: 37 times

Re: General DotP 2014 Coding Questions

Postby thefiremind » 07 Nov 2013, 00:45

The first two questions are from my PM inbox, but I like answers to be public when other people can get a benefit from them.
GrovyleXShinyCelebi wrote:-What does the "replacement_effect" and "pre_trigger" tags do, exactly? I noticed I need the former for damage redirection/manipulation effects and effects that take place in ZONE_TRANSITION, and I'm curious about in what other situations should I use them.
I'll recicle an old answer:
thefiremind wrote:
MC Brodie wrote:replacement_effect="1" means whenever a certain effect occurs, there is an effect or action that replaces the first effect.
This is the "official" explanation of what a replacement effect is in Magic, but using replacement_effect="1" has a wider purpose: it makes the triggered ability totally transparent to the players. The card doesn't glow not even for a moment, players can't respond to it, and triggers (some of them or all of them, I'm not totally sure) can't be triggered inside it. So it's useful not only for replacement effects, but also for any ability that we need to hide from the players (like wiping a register at the end of each turn).
Don't forget that there's also replacement_query="1" that is basically the same, but allows to ask for queries inside the ability (with replacement_effect="1" the queries don't work properly).
I was sure I already had explained pre_trigger, too, but I can't find where, so: pre_trigger makes the trigger start before the event actually happens. This is useful everytime you need to change something about the event: for example, if you waited for damage to be actually dealt, you couldn't prevent it, that's why pre_trigger is needed.

GrovyleXShinyCelebi wrote:-What abilities are affected by layers, anyways, if any? Just wondering because it seems cumbersome to put layers on every CONTINUOUS_ACTION. And why is it that only CONTINUOUS_ACTION blocks seem to have layers?
It's not cumbersome, it's fundamental: layers exist in the official Magic rules and they define the order in which the effects are applied. Why do you get a 4/4 even if you play Giant Growth before Turn to Frog on a creature? Because P/T modifiers are applied after P/T setters. How can the game know that? By checking the layers: Giant Growth acts on 7C, Turn to Frog on 7B (for the P/T part). Continuous actions are re-evaluated continuously all together, so they are the only ones that need ordering... resolution time actions act one-shot and one by one so an order wouldn't make any sense. The only differences between DotP and real Magic are layer 7D and 8: 7D should be used for P/T changing through counters, but DotP manages that automatically so layer 7D isn't needed. Layer 8 doesn't exist in real Magic, but it's handy in DotP when adding characteristics that don't follow the layer system. (There's also layer 3 that we can't use in DotP because it's for text changing effects, but since we are totally missing the chance to manage those effects, I'm just forgetting about it.)
Here is a good article to read.

GrovyleXShinyCelebi wrote:Alright, I got another card I need help debugging, Vengeful Rebirth.
Just forget about the SetTargetCount thing: you need to choose all the targets for the spell anyway, then you'll deal damage to the second target if the first target was a nonland card, but that should be checked on resolution. And yes there's a scenario where it counts: even with only lands in your graveyard, you can use Vengeful Rebirth to kill a Phantasmal Image.
< 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: General DotP 2014 Coding Questions

Postby MC Brodie » 07 Nov 2013, 03:29

Your original pre_trigger explanation for Sigarda, Host of Herons in the FRT found here (well I think it's the original you are referring to)

thefiremind wrote:
MC Brodie wrote:I understand how the 2nd - 5th triggers work with the first one, but what I don't understand is how the first trigger does anything without a Resolution TIme Action block?
When a TRIGGERED_ABILITY has replacement_effect="1" (or internal="1" in the previous DotP games) and pre_trigger="1" and no resolution, its trigger implicitly overrides the event that caused the trigger. This particular trigger, for example, overrides the sacrifice.
-----------------------------------------------------------------------
Song of the Day: 46 and 2 (cover)
MC Brodie
 
Posts: 310
Joined: 01 Jun 2013, 00:10
Has thanked: 44 times
Been thanked: 34 times

Re: General DotP 2014 Coding Questions

Postby thefiremind » 07 Nov 2013, 09:40

MC Brodie wrote:Your original pre_trigger explanation for Sigarda, Host of Herons in the FRT found here (well I think it's the original you are referring to)
No, it wasn't this one, but thanks anyway for searching. This was the explanation of a particular scenario involving pre_trigger (replacement + pre_trigger + no resolution = automatic override of the event).

-----------------------------------------------------------------------

Another PM question:
GrovyleXShinyCelebi wrote:Also, can you give me a brief explanation of how interrogations work? I've been trying to make cards like Maelstrom Nexus, Tainted Sigil that require me to "interrogate" for stuff like life lost per turn, first spell played, etc, (according to official cards) and I want to learn what other stuff can I use interrogations to, well, interrogate, and how should I use them so I can use them myself.
With interrogations you can usually do what you can come up with by combining the INTERROGATE constants that you can find here. There's a chance that what you'd like to do is impossible, though, because not every combination asks for a result that the game actually counts. For example I tried to count the elapsed turns by interrogating the amount of elapsed end phases with INTERROGATE_COUNT_PHASES and INTERROGATE_THIS_GAME, but the result was always 0, because the game probably doesn't keep count of the elapsed phases for the whole duel. In short, look at the existing cards, see how they count something, try to modify the constants and the objects involved until you manage to ask for the result you need, then test it in game. If it works, you're set; if not, you'll have to keep count of that result some other way.
< 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: General DotP 2014 Coding Questions

Postby GrovyleXShinyCelebi » 04 Dec 2013, 22:37

Hey mate, I have a question.

Is there anything wrong with the Lys Alana Huntmaster shown below:

Code: Select all
<?xml version='1.0' encoding='UTF-8'?>
<CARD_V2 ExportVersion="1">
  <FILENAME text="LYS_ALANA_HUNTMASTER_99158125" />
  <CARDNAME text="LYS_ALANA_HUNTMASTER" />
  <TITLE>
    <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Lys Alana Huntmaster]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[Lys Alana Huntmaster]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Lys Alana Huntmaster]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Lys Alana Huntmaster]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[Lys Alana Huntmaster]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[Lys Alana Huntmaster]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[Lys Alana Huntmaster]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[Lys Alana Huntmaster]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[Lys Alana Huntmaster]]></LOCALISED_TEXT>
  </TITLE>
  <MULTIVERSEID value="158125" />
  <ARTID value="105324" />
  <ARTIST name="Pete Venters" />
  <CASTING_COST cost="{2}{G}{G}" />
  <FLAVOURTEXT>
    <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[From the highest tiers of Dawn’s Light Palace to the deepest shade of Wren’s Run, the silver notes of the horn shimmer through the air, and all who hear it feel its pull.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[From the highest tiers of Dawn’s Light Palace to the deepest shade of Wren’s Run, the silver notes of the horn shimmer through the air, and all who hear it feel its pull.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[From the highest tiers of Dawn’s Light Palace to the deepest shade of Wren’s Run, the silver notes of the horn shimmer through the air, and all who hear it feel its pull.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[From the highest tiers of Dawn’s Light Palace to the deepest shade of Wren’s Run, the silver notes of the horn shimmer through the air, and all who hear it feel its pull.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[From the highest tiers of Dawn’s Light Palace to the deepest shade of Wren’s Run, the silver notes of the horn shimmer through the air, and all who hear it feel its pull.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[From the highest tiers of Dawn’s Light Palace to the deepest shade of Wren’s Run, the silver notes of the horn shimmer through the air, and all who hear it feel its pull.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[From the highest tiers of Dawn’s Light Palace to the deepest shade of Wren’s Run, the silver notes of the horn shimmer through the air, and all who hear it feel its pull.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[From the highest tiers of Dawn’s Light Palace to the deepest shade of Wren’s Run, the silver notes of the horn shimmer through the air, and all who hear it feel its pull.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[From the highest tiers of Dawn’s Light Palace to the deepest shade of Wren’s Run, the silver notes of the horn shimmer through the air, and all who hear it feel its pull.]]></LOCALISED_TEXT>
  </FLAVOURTEXT>
  <TYPE metaname="Creature" />
  <SUB_TYPE metaname="Elf" />
  <SUB_TYPE metaname="Warrior" />
  <EXPANSION value="EVG" />
  <RARITY metaname="C" />
  <POWER value="3" />
  <TOUGHNESS value="3" />
  <TRIGGERED_ABILITY>
    <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Whenever you cast an Elf spell, you may put a 1/1 green Elf Warrior creature token onto the battlefield.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[Whenever you cast an Elf spell, you may put a 1/1 green Elf Warrior creature token onto the battlefield.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Whenever you cast an Elf spell, you may put a 1/1 green Elf Warrior creature token onto the battlefield.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Whenever you cast an Elf spell, you may put a 1/1 green Elf Warrior creature token onto the battlefield.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[Ogniqualvolta lanci una magia Elfo, puoi mettere sul campo di battaglia una pedina creatura Guerriero Elfo 1/1 verde.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[Whenever you cast an Elf spell, you may put a 1/1 green Elf Warrior creature token onto the battlefield.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[Whenever you cast an Elf spell, you may put a 1/1 green Elf Warrior creature token onto the battlefield.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[Whenever you cast an Elf spell, you may put a 1/1 green Elf Warrior creature token onto the battlefield.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[Whenever you cast an Elf spell, you may put a 1/1 green Elf Warrior creature token onto the battlefield.]]></LOCALISED_TEXT>
    <TRIGGER value="SPELL_PLAYED" simple_qualifier="objectyoucontrol">
    return TriggerObject():GetSubType():Test( CREATURE_TYPE_ELF )
    </TRIGGER>
  <RESOLUTION_TIME_ACTION>
   MTG():PutTokensOntoBattlefield( "TOKEN_ELF_WARRIOR_1_1_G_350753", 1, EffectController() )
  </RESOLUTION_TIME_ACTION>
  </TRIGGERED_ABILITY>
<TOKEN_REGISTRATION reservation="1" type="TOKEN_ELF_WARRIOR_1_1_G_350753" />
  <SFX text="COMBAT_CHOP_LARGE_ATTACK" power_boundary_min="4" power_boundary_max="-1" />
  <SFX text="COMBAT_CHOP_SMALL_ATTACK" power_boundary_min="1" power_boundary_max="3" />
  <AI_BASE_SCORE score="1050" zone="ZONE_BATTLEFIELD" />
</CARD_V2>
One of my mates has had trouble with this card working (apparently the trigger doesn't activate), but it seems to work fine for me. I tried putting "== true" after the (CREATURE_TYPE_ELF) but it still doesn't seem to work. Know what might be the issue here?
User avatar
GrovyleXShinyCelebi
 
Posts: 294
Joined: 12 Jun 2013, 18:23
Has thanked: 14 times
Been thanked: 37 times

PreviousNext

Return to Programming Talk

Who is online

Users browsing this forum: No registered users and 43 guests


Who is online

In total there are 43 users online :: 0 registered, 0 hidden and 43 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 43 guests

Login Form