It is currently 23 Jun 2025, 07:11
   
Text Size

Help with restoration angel

Moderator: CCGHQ Admins

Re: Help with restoration angel

Postby pcastellazzi » 26 Nov 2012, 23:53

The only strange thing i notice is the use of EffectDC():Get_Targets(0):Get_NthCardPtr(0) instead of EffectDC():Get_Targets(0):Get_CardPtr(0). I think that particular line of code should be:

Code: Select all
local target = EffectDC():Get_Targets(0) and EffectDC():Get_Targets(0):Get_CardPtr(0)
Accessing EffectDC():Get_Targets(0):Get_CardPtr(0) without checking if EffectDC():Get_Targets(0) is present is probably the cause of the crashes you are experimenting.

As a side note, in lua the expression "a and b" is equal to b when a and b are not null. This allow the resolution code to be reduced to:

Code: Select all
<RESOLUTION_TIME_ACTION>
  local target = EffectDC():Get_Targets(0) and EffectDC():Get_Targets(0):Get_CardPtr(0)
  if target then
     EffectDC():Get_Targets(0):Protect_CardPtr(0)
     target:RemoveFromGame()
  end
</RESOLUTION_TIME_ACTION>

<RESOLUTION_TIME_ACTION>
  local target = EffectDC():Get_Targets(0) and EffectDC():Get_Targets(0):Get_CardPtr(0)
  if target then
    target:PutIntoPlay( EffectController() )
  end
</RESOLUTION_TIME_ACTION>
Hope it helps.
The lights then came up and the crowd erupted in applause, because that's what the crowd does after it watches destruction on a large screen.
— Ben Kuchera, Mordern Warfare 3 review.
User avatar
pcastellazzi
 
Posts: 184
Joined: 25 Apr 2012, 00:40
Location: Montevideo, Uruguay
Has thanked: 11 times
Been thanked: 30 times

Re: Help with restoration angel

Postby thefiremind » 27 Nov 2012, 00:01

I always thought that Get_CardPtr and Get_NthCardPtr were synonims, with the latter remaining for compatibility with DotP2012 syntax, just as MTG():ObjectDataChest() which still works even if the new syntax is ObjectDC(). And that thing about checking the existance of the data chest still doesn't convince me, as it wasn't convincing me with that bug with Phyrexian Metamorph + Birthing Pod... there are tons of cards that don't check the existance of the data chest, and since the query is always presented in this case, EffectDC():Make_Targets(0) should always be executed, initialising the chest.
...That said, I'm willing to try everything at this point. :lol:

EDIT: As I predicted, nothing changed with your code. But you gave me another idea that I'm going to try immediately.
< 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: 722 times

Re: Help with restoration angel

Postby kpruss » 27 Nov 2012, 00:10

I will try this once I can just get over doing the side fix with the 0/1. After all the terrible things, I'm convincing myself that a slightly bigger germ isn't so bad, then at that moment I saw that Thrun could not swing into batterskull even with regen mana up efficiently. That kinda made me sad.
kpruss
 
Posts: 23
Joined: 17 Nov 2012, 04:07
Has thanked: 0 time
Been thanked: 1 time

Re: Help with restoration angel

Postby thefiremind » 27 Nov 2012, 00:18

thefiremind wrote:But you gave me another idea that I'm going to try immediately.
...and guess what? With this last idea I MADE IT!!! The advice from pcastellazzi wasn't working, but he made me think about the AI not liking a lost pointer, and so I had this idea: if Restoration Angel targets a token, do we really have to protect the pointer? A token disappears anyway when changing zone.

Make the following changes to the first RESOLUTION_TIME_ACTION of Restoration Angel:
Code: Select all
    <RESOLUTION_TIME_ACTION>
    local target = EffectDC():Get_Targets(0) and EffectDC():Get_Targets(0):Get_CardPtr(0)
    if target ~= nil then
       if target:IsToken() == 0 then
          EffectDC():Get_Targets(0):Protect_CardPtr(0)
       end
       target:RemoveFromGame()
    end
    </RESOLUTION_TIME_ACTION>
(Yes, I also kept pcastellazzi's code, it didn't help for the crash but it's much more elegant and clean :wink:)

As soon as I can gather a lot of patience, I'll browse through my cards and add this condition of not protecting the pointer wherever it could be a token.

EDIT: Now that I think about it, time ago I had a crash when using Boggart Mob, but I couldn't reproduce it anymore so I gave up finding the reason. This was probably the reason: the AI was evaluating the possibility of championing a token. A great finding!
< 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: 722 times

Re: Help with restoration angel

Postby kpruss » 27 Nov 2012, 07:18

You are my hero firemind, and i appreciate all the tips on cleaner code. When you mod so much junk, you need all the help to prevent the little crashes too.

Do you guys know anything about the AI values they put on the cards? From all the cards I've seen, I thought the trend was for higher value = meant this card was higher up on the AI to play list. I found a sakura-tribe elder file, and it had AI value at like -450, which kinda threw me for a loop. The comp actually dislikes playing this card a lot, like it will always play nature's lore or rampant growth, which have zero ai value, (actually i think those cards don't even have that listed) but it would rather leave mana open to regenerate a troll 3 times than play this dude. I'm going to try him out at 450 AI value instead.

And just messing with some lands, i took some stuff from cathedral of war, because it is similar, to make my version of treetop village. I have no idea what the AI value means but the lands are very similar in that they come into play tapped and produce one color of mana, so I tried using that on treetop. This is of course if you wanted it for the AI because you can prolly find/make a treetop village easily, but the AI are confused on how to use mana abilities that get put on the stack, which are already something I have to deal with on dual colored lands. Seeing as cathedral of war works fine for man, this code will work to however extent an AI values using mana or manning up, which I have no idea about for now.

Code: Select all
<?xml version='1.0'?>
<CARD_V2>
  <FILENAME text="TREETOP_VILLAGE_624329" />
  <CARDNAME text="TREETOP_VILLAGE" />
  <TITLE>
    <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Treetop Village]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[Treetop Village]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Treetop Village]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Treetop Village]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[Treetop Village]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[Treetop Village]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[Treetop Village]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[Treetop Village]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[Treetop Village]]></LOCALISED_TEXT>
  </TITLE>
  <MULTIVERSEID value="624329" />
  <ARTID value="624329" />
  <ARTIST name="Rob Alexander" />
  <CASTING_COST cost="" />
  <TYPE metaname="Land" />
  <EXPANSION value="DPG" />
  <RARITY metaname="U" />
  <TRIGGERED_ABILITY internal="1" filter_zone="ZONE_IN_PLAY">
    <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[Treetop Village enters the battlefield tapped.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[Treetop Village enters the battlefield tapped.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[Treetop Village enters the battlefield tapped.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[Treetop Village enters the battlefield tapped.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[Treetop Village enters the battlefield tapped.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[Treetop Village enters the battlefield tapped.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[Treetop Village enters the battlefield tapped.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[Treetop Village enters the battlefield tapped.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[Treetop Village enters the battlefield tapped.]]></LOCALISED_TEXT>
    <TRIGGER value="ZONECHANGE_END" simple_qualifier="self" to_zone="ZONE_IN_PLAY" />
    <RESOLUTION_TIME_ACTION>
    if TriggerObject() ~= nil then
       TriggerObject():ComesIntoPlayTapped() 
    end
    </RESOLUTION_TIME_ACTION>
  </TRIGGERED_ABILITY>
<MANA_ABILITY filter_zone="ZONE_IN_PLAY">
    <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[{T}: Add {G} to your mana pool.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[{T}: Ajoutez {G} à votre réserve.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[{T}: Agrega {G} a tu reserva de maná.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[{T}: Erhöhe deinen Manavorrat um {G}.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[{T}: Aggiungi {G} alla tua riserva di mana.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[{T}:あなたのマナ・プールに{G}を加える。]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[{T}: {G}를 당신의 마나풀에 담는다.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[{T}: добавьте {G} в ваше хранилище маны.]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[{T}: Adicione {G} à sua reserva de mana.]]></LOCALISED_TEXT>
    <COST type="TapSelf" />
    <PRODUCES amount="{G}" />
  </MANA_ABILITY>
  <AI_BASE_SCORE score="600" zone="ZONE_IN_PLAY" />
  <ACTIVATED_ABILITY filter_zone="ZONE_IN_PLAY">
    <LOCALISED_TEXT LanguageCode="en-US"><![CDATA[{1}{G}: Treetop Village becomes a 3/3 green Ape creature with trample until end of turn. It’s still a land. |(If it would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.)|]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="fr-FR"><![CDATA[{1}{G}: Treetop Village becomes a 3/3 green Ape creature with trample until end of turn. It’s still a land. |(If it would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.)|]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="es-ES"><![CDATA[{1}{G}: Treetop Village becomes a 3/3 green Ape creature with trample until end of turn. It’s still a land. |(If it would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.)|]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="de-DE"><![CDATA[{1}{G}: Treetop Village becomes a 3/3 green Ape creature with trample until end of turn. It’s still a land. |(If it would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.)|]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="it-IT"><![CDATA[{1}{G}: Treetop Village becomes a 3/3 green Ape creature with trample until end of turn. It’s still a land. |(If it would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.)|]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="jp-JA"><![CDATA[{1}{G}: Treetop Village becomes a 3/3 green Ape creature with trample until end of turn. It’s still a land. |(If it would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.)|]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ko-KR"><![CDATA[{1}{G}: Treetop Village becomes a 3/3 green Ape creature with trample until end of turn. It’s still a land. |(If it would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.)|]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="ru-RU"><![CDATA[{1}{G}: Treetop Village becomes a 3/3 green Ape creature with trample until end of turn. It’s still a land. |(If it would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.)|]]></LOCALISED_TEXT>
    <LOCALISED_TEXT LanguageCode="pt-BR"><![CDATA[{1}{G}: Treetop Village becomes a 3/3 green Ape creature with trample until end of turn. It’s still a land. |(If it would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.)|]]></LOCALISED_TEXT>
    <COST type="Mana" cost="{1}{G}" />
    <CONTINUOUS_ACTION layer="4">
    if Object() ~= nil then
      Object():GetCurrentCharacteristics():CardType_GetWritable(Object()):Add( CARD_TYPE_CREATURE, Object() )
    end
    </CONTINUOUS_ACTION>
    <CONTINUOUS_ACTION layer="4">
    if Object() ~= nil then
       local characteristics = Object():GetCurrentCharacteristics()
       characteristics:SubType_GetWritable(Object()):Add( CREATURE_TYPE_APE , Object() )
    end
    </CONTINUOUS_ACTION>
    <CONTINUOUS_ACTION layer="5">
    if Object() ~= nil then
       local characteristics = Object():GetCurrentCharacteristics()
       characteristics:Colour_Get():Add( COLOUR_GREEN )
    end
    </CONTINUOUS_ACTION>
    <CONTINUOUS_ACTION layer="7B">
    if Object() ~= nil then
       local characteristics = Object():GetCurrentCharacteristics()
       characteristics:Power_Set( 3 )
       characteristics:Toughness_Set( 3 )
    end
    </CONTINUOUS_ACTION>
    <CONTINUOUS_ACTION layer="6">
    if Object() ~= nil then
       local characteristics = Object():GetCurrentCharacteristics()
       characteristics:Characteristic_Set( CHARACTERISTIC_TRAMPLE, 1 )
    end
    </CONTINUOUS_ACTION>
    <DURATION simple_duration="UntilEOT" />
    <AI_AVAILABILITY type="in_response" />
    <AI_AVAILABILITY step="main_1" turn="my_turn" />
    <AI_AVAILABILITY step="main_2" turn="my_turn" />
    <AI_AVAILABILITY step="begin_combat" turn="my_turn" />
    <AI_AVAILABILITY step="declare_attackers" turn="their_turn" />
     <AI_AVAILABILITY behaviour="MakeCreature" />
  </ACTIVATED_ABILITY>
  <TOKEN_REGISTRATION reservation="1" type="_TOKEN_G_624998" />
  <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>
kpruss
 
Posts: 23
Joined: 17 Nov 2012, 04:07
Has thanked: 0 time
Been thanked: 1 time

Re: Help with restoration angel

Postby thefiremind » 27 Nov 2012, 09:38

kpruss wrote:Do you guys know anything about the AI values they put on the cards?
I'll tell you what I know by looking at other cards.
First, some score is automatically added to the cards according to how much each "standard" ability (like flying, vigilance, etc.) is worth, and other things (you can find all the default scores in DATA_CORE\DATA_ALL_PLATFORMS\CONFIGS\DEFAULT_AI_SETTINGS.XML). That score adds to the AI_BASE_SCORE that we write on the card, and lets the AI take decisions about "trades" (is it good for me to block that creature with this one if both die?), about which card should be destroyed when there's the chance, and so on. This, of course, has a meaning if we talk about the score of a card in play. When you define an AI_BASE_SCORE for ZONE_HAND, you are basically giving a score to what happens when you play that card, in fact you can see that kind of score on instants and sorceries, but also on permanent cards that have enter-the-battlefield effects. I think this also influences decisions made by the AI when choosing what to discard with Duress or similar cards.
If you need to define a variable score, you can use AI_CUSTOM_SCORE (always defining the zone), make your math (for example you may want to raise the score of a card with threshold when you actually have threshold), and finally use Object():AddScore(...).

kpruss wrote:I found a sakura-tribe elder file, and it had AI value at like -450, which kinda threw me for a loop. The comp actually dislikes playing this card a lot, like it will always play nature's lore or rampant growth, which have zero ai value, (actually i think those cards don't even have that listed) but it would rather leave mana open to regenerate a troll 3 times than play this dude.
The -450 for Sakura-Tribe Elder has a meaning if it's for ZONE_IN_PLAY because it's a creature that you don't mind if it dies (you would always sacrifice it in response). Maybe -450 is a bit exaggerated, I would give -150. Try adding another score for ZONE_HAND and set it to 450.

Your code for Treetop Village should be mostly OK. I'd just suggest some improvements:
  • Use EffectSource() instead of Object() inside the CONTINUOUS_ACTIONs of the activated ability, otherwise if the land gets killed when it is a creature, it will keep the transformation inside the graveyard until the end of turn, which isn't pleasant to see. EffectSource() gets cleaned when the card changes zone, Object() doesn't (in fact it's pointless to check if Object() ~= nil because Object() is never nil, while EffectSource() can be).
  • Make the layer of the first CONTINUOUS_ACTION equal to "3" instead of "4" (original cards use "3" for changing types and "4" for changing sub-types).
  • Remove the TOKEN_REGISTRATION since you aren't using mana tokens here.
Note that your land will have a colorless frame even if it produces green mana, but that can't be helped because card frames are decided automatically in DotP2013 with no overriding method (a decrease in quality from DotP2012). It will probably get the right frame when it is a creature because it becomes a green card.
< 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: 722 times

Re: Help with restoration angel

Postby kpruss » 27 Nov 2012, 17:30

Thanks again for the tips!

Yeah, I definitely noticed the color change of the card when I manned it up but it wasn't too major, as it will turn back into a land and all the nonbasic lands sit on top together with your artifacts so it's not too bad for them all to be the same color.

Sakura-tribe elder only had one ai value, should I add another? Like I said, the computer dislikes playing the card, but would just lowering the zone in play value let him play it more?

Nature lore does not have a ai value at all listed, but gets played pretty aggressively.
kpruss
 
Posts: 23
Joined: 17 Nov 2012, 04:07
Has thanked: 0 time
Been thanked: 1 time

Re: Help with restoration angel

Postby thefiremind » 27 Nov 2012, 17:51

kpruss wrote:Sakura-tribe elder only had one ai value, should I add another? Like I said, the computer dislikes playing the card, but would just lowering the zone in play value let him play it more?
I don't know, I guess that a low ZONE_IN_PLAY score (low meaning negative) without specifying a ZONE_HAND score makes the AI think that it's a useless card... try with a negative ZONE_IN_PLAY score and a positive ZONE_HAND score, and see what happens.
< 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: 722 times

Re: Help with restoration angel

Postby pcastellazzi » 27 Nov 2012, 22:25

thefiremind wrote:and guess what? With this last idea I MADE IT!!! The advice from pcastellazzi wasn't working, but he made me think about the AI not liking a lost pointer, and so I had this idea: if Restoration Angel targets a token, do we really have to protect the pointer? A token disappears anyway when changing zone.
Can you please try replacing the token test with EffectSource() ~= nil? I think it may work, and if it does it's a better representation of what we are trying to achieve.
The lights then came up and the crowd erupted in applause, because that's what the crowd does after it watches destruction on a large screen.
— Ben Kuchera, Mordern Warfare 3 review.
User avatar
pcastellazzi
 
Posts: 184
Joined: 25 Apr 2012, 00:40
Location: Montevideo, Uruguay
Has thanked: 11 times
Been thanked: 30 times

Re: Help with restoration angel

Postby thefiremind » 27 Nov 2012, 23:40

pcastellazzi wrote:Can you please try replacing the token test with EffectSource() ~= nil? I think it may work, and if it does it's a better representation of what we are trying to achieve.
May I ask you what are we trying to achieve? :lol: I thought we were trying to make a card that doesn't crash and doesn't break any rule at the same time. I'm not breaking any rule because tokens are supposed to get lost when leaving the battlefield, so if you don't give me a really good reason to touch the code again, I'm sorry but I'd prefer leaving it as it is, mostly because I already applied the same fix to all the cards that needed it in my mod, plus some in the core-fixing WAD. :mrgreen:
< 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: 722 times

Re: Help with restoration angel

Postby pcastellazzi » 28 Nov 2012, 00:52

thefiremind wrote:I'm sorry but I'd prefer leaving it as it is, mostly because I already applied the same fix to all the cards that needed it in my mod, plus some in the core-fixing WAD. :mrgreen:
You work fast! :P

I dont think tokens are the only problem. If it's as i think, what's causing the crash is the pointer being invalidated, this happend when a card is removed from the game while being protected. ie: if you trigger an exile when a card is expected to be sent to the graveyard (Gruesome Encore comes to mind right now) you may face the same problem.

This is just a theory, i am not really sure if this will happend nor if the EffectSource() presence check i suggested before will actually fix it.
The lights then came up and the crowd erupted in applause, because that's what the crowd does after it watches destruction on a large screen.
— Ben Kuchera, Mordern Warfare 3 review.
User avatar
pcastellazzi
 
Posts: 184
Joined: 25 Apr 2012, 00:40
Location: Montevideo, Uruguay
Has thanked: 11 times
Been thanked: 30 times

Re: Help with restoration angel

Postby thefiremind » 28 Nov 2012, 10:08

OK, now I understand. Well, if other crashes happen in the future, we'll still be in time for adding an EffectSource check. :wink:

EDIT: Now that I think about it, the EffectSource check would be totally wrong: for example, if you kill Restoration Angel in response to its activation, EffectSource becomes nil because of the zone change, but the ability must resolve correctly anyway.
< 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: 722 times

Previous

Return to 2013

Who is online

Users browsing this forum: No registered users and 298 guests

Main Menu

User Menu

Our Partners


Who is online

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

Login Form