Jump to content


Photo

Spell Cooldowns [FIXED]


  • Please log in to reply
17 replies to this topic

#1 Criminon

Criminon

    Final Element

  • GMC Member
  • 155 posts
  • Version:GM:Studio

Posted 30 April 2012 - 12:13 AM

I'm trying to think of a way to show spell cooldowns visually. Similar to the way it works in world of warcraft. I have created a cooldown sprite with 26 images inside of it. This cooldown sprite just shows the cooldown resetting in a clock-sweep manner.

The cooldown sprite looks like this: Posted Image (except it's speed would be based off of how long the cooldown was)

Each of my spells have different cooldowns. I have them set in the spell array like this:
global.spell[3,0]= "Prismatic Shield" ///name
global.spell[3,1] = (mage_atk4_1); ///sprite index
global.spell[3,2] = spell_snd ///sound to play
global.spell[3,3] = 0 ///type of attack (0 = beneficial, 1 = light, 2 = medium, 3 = heavy, 4 = ultra)
global.spell[3,4] = 2 ///mana cost
global.spell[3,5] = 800 ///purchase price
global.spell[3,6] = 0 ///class (0=mage, 1 = knight, 2 = priest, 3 =rogue, 4 = all)
global.spell[3,7] = 3 ///spell number
global.spell[3,8] = 20 ///spell cooldown <---- THIS IS THE SPELL COOLDOWN
global.spell[3,9] = 13 ///sprite length 
global.spell[3,10] = Magic_Hitspark
global.spell[3,11] = Magic_Hitspark

I have the concept of how I would make this work, but I have no real idea how to implement it.

My spell icon is drawn like this:
draw_sprite(Spell,global.spellslot1,view_xview[0]+28,view_yview[0]+250)

now I would need to have a timer variable that would change based on what number the timer was at. then I would have to make another draw event to draw over my existing spell sprite that would be like:
if cooldown1=true{
draw_sprite(spellcooldown,WHATEVERTHISVARIABLEWOULDBE,view_xview[0]+28,view_yview[0]+250)}


Anyone know a good way to do this?

Edited by Criminon, 30 April 2012 - 05:03 AM.

  • 0

#2 C_Pike

C_Pike

    GMC Member

  • GMC Member
  • 565 posts
  • Version:GM8.1

Posted 30 April 2012 - 12:53 AM

if cooldown1=true{
draw_sprite(spellcooldown,WHATEVERTHISVARIABLEWOULDBE,
view_xview[0]+28,view_yview[0]+250)}


26 images is hard to work with. 5-10-20-25 are good image amounts to work with

So we will use the number 100 to represent 100% (cause its easy to visualize)
// In the create event
image_speed = 0; //we dont want the image playing on its own (we dont use image_index here, but you might)
cooldown1 = 100; // represents 100% cool down needed
cooldown1_speed = 1; // don't use a number like 3, 3 is not evenly divisible by 100, 2.5 is good. 1.1 is good. 

// in the draw event after everything else is drawn
if (cooldown1 != 0) // if we arent cooled down
    {
    draw_sprite(spellcooldown,cooldown1/(100/image_number),view_xview[0]+28,view_yview[0]+250)
    cooldown1 -= cooldown1_speed; //if you have 20 images, (100/image_number) will be 5. Divide cooldown1 by 5 and get the image number
                                                  // 100 / 5 = 20 for example
    };    

This runs from the last image to the first. You can reverse the animation in the sprite editor... or you can use your awesome math skills to make my code work in reverse.
Have fun!

Edited by C_Pike, 30 April 2012 - 12:59 AM.

  • 0

#3 Criminon

Criminon

    Final Element

  • GMC Member
  • 155 posts
  • Version:GM:Studio

Posted 30 April 2012 - 02:02 AM

if cooldown1=true{
draw_sprite(spellcooldown,WHATEVERTHISVARIABLEWOULDBE,
view_xview[0]+28,view_yview[0]+250)}


26 images is hard to work with. 5-10-20-25 are good image amounts to work with

So we will use the number 100 to represent 100% (cause its easy to visualize)

// In the create event
image_speed = 0; //we dont want the image playing on its own (we dont use image_index here, but you might)
cooldown1 = 100; // represents 100% cool down needed
cooldown1_speed = 1; // don't use a number like 3, 3 is not evenly divisible by 100, 2.5 is good. 1.1 is good. 

// in the draw event after everything else is drawn
if (cooldown1 != 0) // if we arent cooled down
    {
    draw_sprite(spellcooldown,cooldown1/(100/image_number),view_xview[0]+28,view_yview[0]+250)
    cooldown1 -= cooldown1_speed; //if you have 20 images, (100/image_number) will be 5. Divide cooldown1 by 5 and get the image number
                                                  // 100 / 5 = 20 for example
    };    

This runs from the last image to the first. You can reverse the animation in the sprite editor... or you can use your awesome math skills to make my code work in reverse.
Have fun!


Thanks a lot for your information! I had a few questions before wanting to try this out:

Now this is a controller that controls other images as well. Will putting "image_speed = 0;" screw that up?

Also, cooldown1 is already defined in my code as a timer. Basically, in my array, I have say spell 1's cooldown set to 20. Whenever you press a button, it sets alarm[1] to spell 1's cooldown. written in code it looks like this:
alarm[11]=global.spell[global.spellslot1,8]

There are 4 cooldowns. cooldown1, cooldown2, cooldown3, and cooldown4.
To give you a better idea about this, there are 37 total spells in the game. Depending on which one is active, changes the cooldown speed. Hence why I'm referencing an array. Would I need to change anything in this code for it to work properly going off this information?

Now if I was keeping this format you gave me, editing my cooldowns on the array is no problem, just to make everything work with this system, turning the cooldowns to numbers divisible by 100 is fine.
But where would I tell this code to reference that cooldown from the array?

Once again, thanks for all the help! I can't wait to get this working, and I super appreciate you taking the time to help with this.

Edit- Also, I've reduced the image size to 25

Edited by Criminon, 30 April 2012 - 02:14 AM.

  • 0

#4 FoxInABox

FoxInABox

    GMC Member

  • GMC Member
  • 5417 posts
  • Version:GM:Studio

Posted 30 April 2012 - 02:30 AM

draw_skill_recharge.gmk
this draws a few vertexs over the slot, making it look smoother on long cooldowns, but using a sprite should still be more effective >>;;
  • 0

#5 Criminon

Criminon

    Final Element

  • GMC Member
  • 155 posts
  • Version:GM:Studio

Posted 30 April 2012 - 02:37 AM

draw_skill_recharge.gmk
this draws a few vertexs over the slot, making it look smoother on long cooldowns, but using a sprite should still be more effective >>;;


checking it out now! Thanks a bunch!

Crap. I think this is a bit too advanced for me yet. Can't think of a way to implement this into my current game. I'll keep looking at it, and I greatly appreciate you taking the time to make this for me. I'll keep looking into it.



Edit - After looking at the code, would I have to change anything in the script? Or just edit the draw command? If it's just editing the draw command, it looks incredibly simple. My spell icons are 13px by 12px

Edited by Criminon, 30 April 2012 - 02:46 AM.

  • 0

#6 C_Pike

C_Pike

    GMC Member

  • GMC Member
  • 565 posts
  • Version:GM8.1

Posted 30 April 2012 - 02:44 AM

You can just add a new variable and not mess with what you have.
cooldown1_timer = 100; for example.
when cooldown1 is true, cooldown1_timer counts down (or up, whichever). When it hits 0, it sets cooldown1 to false.
Remember to reset the timer before you set cooldown1 to true
  • 0

#7 Criminon

Criminon

    Final Element

  • GMC Member
  • 155 posts
  • Version:GM:Studio

Posted 30 April 2012 - 03:11 AM

You can just add a new variable and not mess with what you have.
cooldown1_timer = 100; for example.
when cooldown1 is true, cooldown1_timer counts down (or up, whichever). When it hits 0, it sets cooldown1 to false.
Remember to reset the timer before you set cooldown1 to true



This is what I've got right now:

create event:
image_speed = 0; //we dont want the image playing on its own (we dont use image_index here, but you might)
cooldown1_timer = 100; // represents 100% cool down needed
cooldown1_speed = 1; // don't use a number like 3, 3 is not evenly divisible by 100, 2.5 is good. 1.1 is good. 
cooldown2_timer = 100; // represents 100% cool down needed
cooldown2_speed = 1; // don't use a number like 3, 3 is not evenly divisible by 100, 2.5 is good. 1.1 is good. 
cooldown3_timer = 100; // represents 100% cool down needed
cooldown3_speed = 1; // don't use a number like 3, 3 is not evenly divisible by 100, 2.5 is good. 1.1 is good. 
cooldown4_timer = 100; // represents 100% cool down needed
cooldown4_speed = 1; // don't use a number like 3, 3 is not evenly divisible by 100, 2.5 is good. 1.1 is good. 

draw event:
// in the draw event after everything else is drawn
if (cooldown1 != 0) // if we arent cooled down
    {
    draw_sprite(spellcooldown,global.spell[global.spellslot1,8]/(100/4),
view_xview[0]+28,view_yview[0]+250)
    cooldown1_timer -= cooldown1_speed; //if you have 20 images, (100/image_number) will be 5. Divide cooldown1 by 5 and get the image number
                                                  // 100 / 5 = 20 for example
    };  
    

if (cooldown2 != 0) // if we arent cooled down
    {
    draw_sprite(spellcooldown,global.spell[global.spellslot2,8]/(100/4),
view_xview[0]+28,view_yview[0]+250)
    cooldown2_timer -= cooldown2_speed; //if you have 20 images, (100/image_number) will be 5. Divide cooldown1 by 5 and get the image number
                                                  // 100 / 5 = 20 for example
    }; 
    

if (cooldown3 != 0) // if we arent cooled down
    {
    draw_sprite(spellcooldown,global.spell[global.spellslot3,8]/(100/4),
view_xview[0]+28,view_yview[0]+250)
    cooldown3_timer -= cooldown3_speed; //if you have 20 images, (100/image_number) will be 5. Divide cooldown1 by 5 and get the image number
                                                  // 100 / 5 = 20 for example
    }; 
    

if (cooldown4 != 0) // if we arent cooled down
    {
    draw_sprite(spellcooldown,global.spell[global.spellslot4,8]/(100/4),
view_xview[0]+28,view_yview[0]+250)
    cooldown4_timer -= cooldown4_speed; //if you have 20 images, (100/image_number) will be 5. Divide cooldown1 by 5 and get the image number
                                                  // 100 / 5 = 20 for example
    }; 

It's still not working properly. Currently, it's not drawing the new sprite.


Edit- It is now drawing the sprite, but it's not animating it. It stays at the first image index, then disappears at the correct time.


After looking at the code again, should I adjust the cooldown1_speed to match the timer? global.spell[global.spellslot1,8] is the cooldown in the array. So should I make a step event that says cooldown1_speed = global.spell[spellslot1,8] ?


Edit - I'm making progress. It's now slightly animated, but It's not starting the cooldown image from the beginning. It uses the image, then subtracts the frames that wouldn't show. IE - If the cooldown timer isn't 100, it doesn't show all of the sprite. It starts the sprite in the middle, then counts down.


Edit, actually, I don't know what it's doing. Even with the cooldown set to 100, it just starts the animation half way, then doesn't animate it. 50 works semi.

Edited by Criminon, 30 April 2012 - 03:34 AM.

  • 0

#8 C_Pike

C_Pike

    GMC Member

  • GMC Member
  • 565 posts
  • Version:GM8.1

Posted 30 April 2012 - 03:33 AM

Clearly I have been confusing.
Let me give you the simplest way:

//create code
cooldown1 = 0;
cooldown1_speed = 0.5;
// in the draw event after everything else is drawn
if (cooldown1 < image_number-1) 
    {
    draw_sprite(spellcooldown,cooldown1,view_xview[0]+28,view_yview[0]+250)
    cooldown1 += cooldown1_speed; 
    };    


So, when cooldown1 is set lower than the total number if images in the index, cooldown1 will begin to climb
back up. So set cooldown1 to 0 when you want the cooldown1 picture to appear.
Sorry I didn't think of this sooner.

Edited by C_Pike, 30 April 2012 - 03:50 AM.

  • 0

#9 Criminon

Criminon

    Final Element

  • GMC Member
  • 155 posts
  • Version:GM:Studio

Posted 30 April 2012 - 03:46 AM

// in the draw event after everything else is drawn
if (cooldown1 != 0) // if we arent cooled down
    {
    draw_sprite(spellcooldown,global.spell[global.spellslot1,8]/(100/4),
view_xview[0]+28,view_yview[0]+250)
    cooldown1_timer -= cooldown1_speed; //if you have 20 images, (100/image_number) will be 5. Divide cooldown1 by 5 and get the image number
                                                  // 100 / 5 = 20 for example
    };  

global.spell[global.spellslot1,8]/(100/4) ....this is your problem, in all the cooldowns.
This section of the code is refering to the image_index
thats why I had: cooldown1/(100/image_number)
If you dont want to use image_number
// in the draw event after everything else is drawn
if (cooldown1 != 0) // if we arent cooled down
    {
    draw_sprite(spellcooldown, cooldown1/5,view_xview[0]+28,view_yview[0]+250)
    cooldown1_timer -= cooldown1_speed; 
    };  

You were dividing 20 by 5. global.spell[global.spellslot1,8]= 20



My apologies for derailing you. the cooldown1 variable is a simple true/false variable. I noticed it and changed it after I said that. I put in if (cooldown1=true) instead of if (cooldown1!=0), that's how I got it to semi- work.

Now you said to get rid of global.spell[global.spellslot1,8]/(100/4). How will this timer know to accurately calculate how to play the image without me directing it to the timer? For instance: If my spell cooldown for spell 1 is 20, how will this draw event know that? I'm not seeing the correlation between your code and my input. That's why I keep struggling to put that global.spell[global.spellslot1,8] in somewhere.


so say spellslot1 is spell 1, spell 1 has a cooldown of 5. If I use this draw event for spellslot 1, and (say it works), then I change spellslot1 to spell 2, and spell 2 has a cooldown of 50 and try it again, how would this still work for spell slot 1 without changing any code?

I guess I'm confused about "cooldown1/5," what cooldown1 is meant to represent. Is cooldown1 supposed to be the variable in which I put the cooldown timer?

Edited by Criminon, 30 April 2012 - 03:51 AM.

  • 0

#10 C_Pike

C_Pike

    GMC Member

  • GMC Member
  • 565 posts
  • Version:GM8.1

Posted 30 April 2012 - 03:51 AM

Lol.. deleted my last post by accident... at least the new code is much better.

Look at my last post, I changed the code to make more sense. I am dumb sometimes.

global.spell[global.spellslot1,8] is the cooldown1_timer


global.spell[3,8] = 0.5 ///spell cooldown <---- THIS IS THE SPELL COOLDOWN

//create event
cooldown1 = 0;
// in the draw event after everything else is drawn
if (cooldown1 < image_number-1) 
    {
    draw_sprite(spellcooldown,cooldown1,view_xview[0]+28,view_yview[0]+250)
    cooldown1 += global.spell[global.spellslot1,8]; 
    };    

there...
I believe that this should be it.

Edited by C_Pike, 30 April 2012 - 03:59 AM.

  • 0

#11 FoxInABox

FoxInABox

    GMC Member

  • GMC Member
  • 5417 posts
  • Version:GM:Studio

Posted 30 April 2012 - 04:00 AM

Edit - After looking at the code, would I have to change anything in the script? Or just edit the draw command? If it's just editing the draw command, it looks incredibly simple. My spell icons are 13px by 12px

no, you simply use the draw command .. that's it
  • 0

#12 Criminon

Criminon

    Final Element

  • GMC Member
  • 155 posts
  • Version:GM:Studio

Posted 30 April 2012 - 04:02 AM

Lol.. deleted my last post by accident... at least the new code is much better.

Look at my last post, I changed the code to make more sense. I am dumb sometimes.

global.spell[global.spellslot1,8] is the cooldown1_timer


global.spell[3,8] = 0.5 ///spell cooldown <---- THIS IS THE SPELL COOLDOWN

//create event
cooldown1 = 0;
// in the draw event after everything else is drawn
if (cooldown1 < image_number-1) 
    {
    draw_sprite(spellcooldown,cooldown1,view_xview[0]+28,view_yview[0]+250)
    cooldown1 += global.spell[global.spellslot1,8]; 
    };    

there...



I feel really bad. That just confused me more. So you're telling me to drop all of the code that you just gave me, and use the new code that you supplied. Now I'm guessing that this code is only supposed to show the timer when the timer has become lower than the amount of frames in the image? And if this is true, and you tell me to set "cooldown1" to 0 when I want the cooldown image to appear, are you saying that I should drop the new variable we created called "cooldown1_timer"? Or should I change your code that you just gave me to reflect the changes we made, meaning to put "cooldown1_timer" instead of "cooldown1". Because cooldown1 is a variable that already exists, it's what controls if my player can use the spell again or not. I'm so sorry for wasting all of your time, and I GREATLY APPRECIATE you hanging in there with me. I know this is probably much more simple than I'm making it out to be, so I'm more than thankful.


Edit - Just saw your last post. It quoted it before I actually read it. Trying it out now.

Edited by Criminon, 30 April 2012 - 04:04 AM.

  • 0

#13 C_Pike

C_Pike

    GMC Member

  • GMC Member
  • 565 posts
  • Version:GM8.1

Posted 30 April 2012 - 04:06 AM

LOL!
This is my fault. I overcomplicated things.
its a small re-write. Drop the cooldown1_timer.
the global.spell holds the speed of the cooldown (like you originally intended)

global.spell[3,8] = 0.5 ///spell cooldown <---- THIS IS THE SPELL COOLDOWN

//create event
cooldown1 = 0;
// in the draw event after everything else is drawn
if (cooldown1 < 24) //if you have 25 images 
    {
    draw_sprite(spellcooldown,cooldown1,view_xview[0]+28,view_yview[0]+250)
    cooldown1 += global.spell[global.spellslot1,8]; 
    };    
It counts up from 0 to the number of images in the image index. When you want to use the spell, set cooldown1 to 0.
thats is.
if you DONT want the spell cooldown to show:
cooldown1 = 24; (frames in the sprite)

--sigh

I keep messing this up... image_number wont work for you as you are calling the sprite externally.
replace image_number with 24 (one less than the total images)

This should work now :rolleyes:

Edited by C_Pike, 30 April 2012 - 04:17 AM.

  • 0

#14 Criminon

Criminon

    Final Element

  • GMC Member
  • 155 posts
  • Version:GM:Studio

Posted 30 April 2012 - 04:17 AM

LOL!
This is my fault. I overcomplicated things.
its a small re-write. Drop the cooldown1_timer.
the global.spell holds the speed of the cooldown (like you originally intended)

global.spell[3,8] = 0.5 ///spell cooldown <---- THIS IS THE SPELL COOLDOWN

//create event
cooldown1 = 0;
// in the draw event after everything else is drawn
if (cooldown1 < 24) //if you have 25 images 
    {
    draw_sprite(spellcooldown,cooldown1,view_xview[0]+28,view_yview[0]+250)
    cooldown1 += global.spell[global.spellslot1,8]; 
    };    
It counts up from 0 to the number of images in the image index. When you want to use the spell, set cooldown1 to 0.
thats is.
if you DONT want the spell cooldown to show:
cooldown1 = 24; (frames in the sprite)

--sigh

I keep messing this up



This still doesn't seem to be working. So you're saying cooldown1 is the image_index. Now if I take the image_index and +=100 (100 is one of the cooldown numbers) The image doesn't even show.

Edit - also, in the create event, wouldn't we put 24, if we don't want it to show immediately? And if there are 25 images in the sprite, why would we put it to 24?

Edited by Criminon, 30 April 2012 - 04:24 AM.

  • 0

#15 C_Pike

C_Pike

    GMC Member

  • GMC Member
  • 565 posts
  • Version:GM8.1

Posted 30 April 2012 - 04:24 AM

cooldown1 should start at 0
global.spell[global.spellslot1,8]; should be set to 0.5

Make sure your code matches this code:
// in the draw event after everything else is drawn
if (cooldown1 < 24) //if you have 25 images 
    {
    draw_sprite(spellcooldown,cooldown1,view_xview[
0]+28,view_yview[0]+250)
    cooldown1 += global.spell[global.spellslot1,8]; 
    };    
if (cooldown1 < 24) thats the improtant bit. It checks to see if cooldown1 is less than the total amount of images

http://www.freefilehosting.net/cooldownexample

I'm off to bed (sorry! I'm sure you will get it)
Good luck!!!!!

Edited by C_Pike, 30 April 2012 - 04:30 AM.

  • 0

#16 Criminon

Criminon

    Final Element

  • GMC Member
  • 155 posts
  • Version:GM:Studio

Posted 30 April 2012 - 04:26 AM

cooldown1 should start at 0
global.spell[global.spellslot1,8]; should be set to 0.5

/ in the draw event after everything else is drawn
if (cooldown1 < 24) //if you have 25 images 
    {
    draw_sprite(spellcooldown,cooldown1,view_xview[
0]+28,view_yview[0]+250)
    cooldown1 += global.spell[global.spellslot1,8]; 
    };    



Okay, so check this:

global.spell[3,0]= "Prismatic Shield" ///name
global.spell[3,1] = (mage_atk4_1); ///sprite index
global.spell[3,2] = spell_snd ///sound to play
global.spell[3,3] = 0 ///type of attack (0 = beneficial, 1 = light, 2 = medium, 3 = heavy, 4 = ultra)
global.spell[3,4] = 2 ///mana cost
global.spell[3,5] = 800 ///purchase price
global.spell[3,6] = 0 ///class (0=mage, 1 = knight, 2 = priest, 3 =rogue, 4 = all)
global.spell[3,7] = 3 ///spell number
global.spell[3,8] = 20 ///spell cooldown 
global.spell[3,9] = 13 ///sprite length 
global.spell[3,10] = Magic_Hitspark
global.spell[3,11] = Magic_Hitspark

Now we are referencing [3,8]. That's the spell cooldown. When I press the attack button, it takes that number and says alarm[11]=global.spell[spellslot1,8].
If I change global.spell[spellslot1,8] to that, it would screw up the whole system.

Edited by Criminon, 30 April 2012 - 04:27 AM.

  • 0

#17 Criminon

Criminon

    Final Element

  • GMC Member
  • 155 posts
  • Version:GM:Studio

Posted 30 April 2012 - 05:02 AM

So for those of you who find this thread wondering how to do this, this is the appropriate way to do it. I thank the both of you for helping, I finally got it working.

In the create event for your spell controller:
cooldown1_timer = 0;
cooldown2_timer = 0;
cooldown3_timer = 0;
cooldown4_timer = 0;

In the step event for your spell controller:
if (keyboard_check(global.control_spell1)&& global.spellslot1>=0){
cooldown1_timer=global.spell[global.spellslot1,8]
}
}


In the draw event for your spell controller:

if cooldown1=true && global.spellslot1>=0{
if (cooldown1_timer >= 25) 
    {
    draw_sprite(spellcooldown2,1,view_xview[0]+28,view_yview[0]+250)
    
    }; 

if (cooldown1_timer < 25) 
    {
    draw_sprite(spellcooldown,cooldown1_timer,view_xview[0]+28,view_yview[0]+250)
    };  
cooldown1_timer -= 1 
}
if cooldown2=true && global.spellslot2>=0{
if (cooldown2_timer >= 25) 
    {
    draw_sprite(spellcooldown2,1,view_xview[0]+42,view_yview[0]+250)
    
    }; 

if (cooldown2_timer < 25) 
    {
    draw_sprite(spellcooldown,cooldown2_timer,view_xview[0]+42,view_yview[0]+250)
    };  
cooldown2_timer -= 1 
}
if cooldown3=true && global.spellslot3>=0{
if (cooldown3_timer >= 25) 
    {
    draw_sprite(spellcooldown2,1,view_xview[0]+57,view_yview[0]+250)
    
    }; 

if (cooldown3_timer < 25) 
    {
    draw_sprite(spellcooldown,cooldown3_timer,view_xview[0]+57,view_yview[0]+250)
    };  
cooldown3_timer -=1
}
if cooldown4=true && global.spellslot4>=0{
if (cooldown4_timer >= 25) 
    {
    draw_sprite(spellcooldown2,1,view_xview[0]+72,view_yview[0]+250)
    
    }; 

if (cooldown4_timer < 25) 
    {
    draw_sprite(spellcooldown,cooldown4_timer,view_xview[0]+72,view_yview[0]+250)
    };  
cooldown4_timer -= 1 }
}


If anyone has any questions about the code I just put down, let me know in a PM, I will be happy to answer any questions about it. Once again, thanks to the both of you. I wouldn't have been able to get it to work without you.
  • 0

#18 Sathirax

Sathirax

    GMC Member

  • New Member
  • 11 posts
  • Version:GM:Studio

Posted 24 September 2012 - 01:47 PM

GMK examples please!... :thumbsup:
  • 0




0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users