Legacy GM [SOLVED] how to make a global variable from a string name

jobjorgos

Member
Im wondering how I can edit the value of a global variable from a string name as you can see below.

SCRIPT: scr_do_damage_to_enemy:
Code:
///scr_do_damage_to_enemy(enemy_id_number);

a = argument0; //the id of the enemy. it is just a number of 0 between 29 for every unique enemy

b = 'global.enemyhp'+string(a);

enemy_id = real(b);

if global.weapon == 0{
      enemy_id -=1; //should remove 1HP from the enemy (not working right now too bad)
}
if global.weapon == 1{
      enemy_id -=2; //should remove 2HP from the enemy (not working right now too bad)
}
if global.weapon == 2{
      enemy_id -=6; //should remove 6HP from the enemy (not working right now too bad)
}
if global.weapon == 3{
      enemy_id -=15; //should remove 15HP from the enemy (not working right now too bad)
}
//etc.
Somehow it does not affect the value of global.enemyhp0, global.enemyhp1, global.enemyhp2 etc.
I have about 40 different enemies and 30 different weapons, that would requires 40x30=1200 cases in a script which would make it way too big and messy.
Thats why I made this script to automate this and save time.
 
Last edited:

Simon Gust

Member
Unfortunately, that is not how variables work. Their names aren't a string in memory, their names are only for you and how you access them.
The real() function also only can make strings like "12392" to a number.

But if you already get an enemy id somehow (argument0) you can just edit it's hp variable.
Code:
///scr_do_damage_to_enemy(enemy_id_number)
var ID = argument0;
var damage = 0;

switch (global.weapon)
{
case 0: damage = 1; break;
case 1: damage = 2; break;
case 2: damage = 6; break;
case 3: damage = 15; break;
}

ID.hp -= damage;
assuming each enemy had an hp variable.
And also assuming the place you call the script from has collision functions that return the id of enemy instances.
You don't have to give ids manually if it's only for combat. They all have their own automatially.
 

Paskaler

Member
You shouldn't use global.enemyhp0, global.enemyhp1 and so on. You should simply make a hp instance variable inside the enemy object and then use something like the script @Simon Gust posted above.
 

jobjorgos

Member
Ah good to know that I should not use variables this way. you advise seems to be very valuable info to me because it made me to achieve to fix the problem! The switch system you advised Simon Gust worked out very well! So this is what I did afterall:

SCRIPT: scr_do_weapon_damage
Code:
///scr_do_weapon_damage(enemy_id);

enemy_id = argument0;

//gonna make a switch of this also
if global.weapon==0 damage = 1;
if global.weapon==1 damage = 2;
if global.weapon==2 damage = 6;
if global.weapon==3 damage = 15;
if global.weapon==4 damage = 18;
if global.weapon==5 damage = 25;
if global.weapon==6 damage = 35;
if global.weapon==7 damage = 45;
if global.weapon==8 damage = 55;
if global.weapon==9 damage = 65;
if global.weapon==10 damage = 75;
if global.weapon==11 damage = 85;
if global.weapon==12 damage = 95;
if global.weapon==13 damage = 105;
if global.weapon==14 damage = 115;
if global.weapon==15 damage = 125;
if global.weapon==16 damage = 135;
if global.weapon==17 damage = 145;
if global.weapon==18 damage = 155;
if global.weapon==19 damage = 165;
if global.weapon==20 damage = 175;

switch (enemy_id)
{
case 0: global.enemyhp0 -= damage; break;
case 1: global.enemyhp1 -= damage; break;
case 2: global.enemyhp2 -= damage; break;
case 3: global.enemyhp3 -= damage; break;
case 4: global.enemyhp4 -= damage; break;
case 5: global.enemyhp5 -= damage; break;
case 6: global.enemyhp6 -= damage; break;
case 7: global.enemyhp7 -= damage; break;
case 8: global.enemyhp8 -= damage; break;
case 9: global.enemyhp9 -= damage; break;
case 10: global.enemyhp10 -= damage; break;
case 11: global.enemyhp11 -= damage; break;
case 12: global.enemyhp12 -= damage; break;
case 13: global.enemyhp13 -= damage; break;
case 14: global.enemyhp14 -= damage; break;
case 15: global.enemyhp15 -= damage; break;
case 16: global.enemyhp16 -= damage; break;
case 19: global.enemyhp19 -= damage; break;
case 20: global.enemyhp20 -= damage; break;
case 21: global.enemyhp21 -= damage; break;
case 23: global.enemyhp23 -= damage; break;
case 24: global.enemyhp24 -= damage; break;
case 25: global.enemyhp25 -= damage; break;
case 26: global.enemyhp26 -= damage; break;
case 27: global.enemyhp27 -= damage; break;
case 28: global.enemyhp28 -= damage; break;
case 29: global.enemyhp29 -= damage; break;
}
I gonna make a switch of the weapon also, I guess it would make it a little easyer and effecienter.
Thanks alot for helping me solving this out :)
 
Top