Removing hardness forever
I have a snippet of code I use in a helper script that I can call from wherever I like to delete a sprite from the game forever. Problem is, it doesn't work. The sprite does not lose hardness nor does it disappear forever.
I do the following to remove an invisible barrier after using an item:
&actor2 = ¤t_sprite is set for the barrier sprite.
void killforever (void) { // Remove a sprite from the game forever so it no longer shows up on screenswap // Arg1 is the sprite sp_hard(&arg1, 1); draw_hard_sprite(&arg1); int &hold = sp_editor_num(&arg1); if (&hold != 0) { editor_type(&hold, 1); } }
I do the following to remove an invisible barrier after using an item:
sp_nodraw(&actor1, 0); &substory = 4; say("There we go, hope it holds.", 1); kill_cur_item(); draw_status(); external("helper", "killforever", &actor2); sp_kill(&actor2, 1);
&actor2 = ¤t_sprite is set for the barrier sprite.
Grabbed a piece of code from Historical Hero where I made a sprite disappear and lose hardness. Note, this piece of code only does that:
//remove sprite's hardness and sprite sp_hard(¤t_sprite, 1); draw_hard_map(¤t_sprite); sp_active(¤t_sprite, 0); playsound(43, 22050, 0,0,0); int &hold = sp_editor_num(¤t_sprite); if (&hold != 0) { //this was placed by the editor, lets make it not come back editor_type(&hold, 1); }
That's basically the same thing but changing sp_kill with sp_active. I'll see if it makes a difference. Though in one other case where I try the same thing, I don't use either sp_kill or sp_active, but set the brain and brain_parm to shrink and die and that also doesn't work.
Sounds like it hangs with the helper thing. I'm not too familiar with the fancy 108 stuff, but I know I've had problems with external before. I was trying to get the parent sprite to say something, IIRC, and it just wouldn't work, although stuff like sp_target(¤t_sprite,1); works just fine.
I'd chalk it to either the bugginess of external, or the bugginess of 108.
But keep trying, there's nothing wrong with the code itself as far as I can see. Perhaps using a temp global instead of passing an argument to external()?
EDIT: I mean using the helper script to to kill &actor2, instead of passing &actor2 to it with external().
I'd chalk it to either the bugginess of external, or the bugginess of 108.

EDIT: I mean using the helper script to to kill &actor2, instead of passing &actor2 to it with external().
It must be some random buggy function, because in some cases it works, in some it doesn't, and I can't seem to figure out what exactly the difference is between my working and non working cases of the same script implementation. Gonna try with sp_active, then by not using a helper external, then with a temp global (but I don't like those because it becomes hard to track which one I use).
Mind that the external()-ed script is attached to the same sprite (or 1000, or 0) as the script that called it. Specifically, this means that once you somehow get rid of ¤t_sprite, the external() script will stop as well.
(idle rambling: I'm not sure what happens with the caller script if you put script_attach(1000) in an external() procedure.)
From looking at the source, sp_kill and sp_active do the same thing (by which I mean that sp_kill eventually sets sp_active to 0), but you can put in some delay with sp_kill. There may or may not be a one-frame delay by default, I don't know that, but if there's a difference in behaviour, that's where it is.
(idle rambling: I'm not sure what happens with the caller script if you put script_attach(1000) in an external() procedure.)
From looking at the source, sp_kill and sp_active do the same thing (by which I mean that sp_kill eventually sets sp_active to 0), but you can put in some delay with sp_kill. There may or may not be a one-frame delay by default, I don't know that, but if there's a difference in behaviour, that's where it is.