Reply to Burning screenmatched trees
If you don't have an account, just leave the password field blank.
Everyone here knows that when you burn a tree that's on border of the screen, the matching tree in adjacent screen stays unburned. A bit annoying, isn't it?
I think that there was some discussion on how to solve this back in the day, but I can't find it now, so I ended up making my own cross-screen burnable tree script.
I'd like to know if anyone remembers any earlier scripts for burnable screenmatched trees?
Edit: fixed computation of stored editor_seq
Edit2: Removed load_screen()'s
I think that there was some discussion on how to solve this back in the day, but I can't find it now, so I ended up making my own cross-screen burnable tree script.
I'd like to know if anyone remembers any earlier scripts for burnable screenmatched trees?
void main (void)
{
&save_x = sp_x(¤t_sprite, -1);
&save_y = sp_y(¤t_sprite, -1);
check_burned(&save_x, &save_y, &player_map);
if(&return == 1)
{
//Tree's burned
sp_pseq(¤t_sprite, 20);
sp_pframe(¤t_sprite, 29);
draw_hard_map();
kill_this_task();
}
}
void check_burned ( void )
{
//Check if tree centered on another screen is burned
if(&arg2 < 0)
{
if(&arg3 > 32)
{
&player_map -= 32;
&save_y += 400;
}
else
{
goto checkfail;
}
}
if(&arg2 > 399)
{
if(&arg3 < 737)
{
&player_map += 32;
&save_y -= 400;
}
else
{
goto checkfail;
}
}
if(&arg1 < 20)
{
math_mod(&player_map, 32);
if(&return != 1)
{
&save_x += 600;
&player_map -= 1;
}
else
{
goto checkfail;
}
}
if(&arg1 > 619)
{
math_mod(&player_map, 32);
if(&return != 0)
{
&save_x -= 600;
&player_map += 1;
}
else
{
goto checkfail;
}
}
if(inside_box(&save_x, &save_y, 20, 0, 619, 399) != 1)
{
debug("Tree on screen &arg3, x=&arg1 y=&arg2 is WAY out of bounds!");
goto checkfail;
}
&save_x /= 2;
&save_y /= 2;
&save_y *= 300;
&save_x += &save_y;
&save_y = 99;
checkloop:
if(editor_frame(&save_y, -1) == 255)
{
if(editor_seq(&save_y, -1) == &save_x)
{
goto checktrue;
}
}
&save_y -= 1;
if(&save_y > 0)
{
goto checkloop;
}
goto checkfail;
checktrue:
&player_map = &arg3;
&save_x = &arg1;
&save_y = &arg2;
return(1);
checkfail:
&player_map = &arg3;
&save_x = &arg1;
&save_y = &arg2;
return(0);
}
void die(void)
{
&save_x = sp_x(¤t_sprite, -1);
&save_y = sp_y(¤t_sprite, -1);
mark_burned(&save_x, &save_y, &player_map);
sp_pseq(¤t_sprite, 20);
sp_pframe(¤t_sprite, 29);
sp_hard(¤t_sprite, 0);
draw_hard_sprite(¤t_sprite);
sp_seq(¤t_sprite, 20);
playsound(6, 8000,0,¤t_sprite,0);
return;
}
void mark_burned(void)
{
if(sp_editor_num(¤t_sprite) == 0)
{
debug("Tree not placed on editor, skip marking");
return;
}
if(&arg2 < 0)
{
if(&arg3 > 32)
{
&player_map -= 32;
&save_y += 400;
}
else
{
goto simplesave;
}
}
if(&arg2 > 399)
{
if(&arg3 < 737)
{
&player_map += 32;
&save_y -= 400;
}
else
{
goto simplesave;
}
}
if(&arg1 < 20)
{
math_mod(&player_map, 32);
if(&return != 1)
{
&save_x += 600;
&player_map -= 1;
}
else
{
goto simplesave;
}
}
if(&arg1 > 619)
{
math_mod(&player_map, 32)
if(&return != 0)
{
&save_x -= 600;
&player_map += 1;
}
else
{
goto simplesave;
}
}
if(inside_box(&save_x, &save_y, 20, 0, 619, 399) != 1)
{
debug("Tree on screen &arg3, x=&arg1 y=&arg2 is WAY out of bounds!");
goto markend;
}
&save_x /= 2;
&save_y /= 2;
&save_y *= 300;
&save_x += &save_y;
&save_y = 99;
markloop:
if(editor_frame(&save_y, -1) == 255)
{
if(editor_seq(&save_y, -1) == &save_x)
{
debug("mark_burned(&arg1, &arg2, &arg3): tree was already burned");
goto markend;
}
}
if(editor_frame(&save_y, -1) == 0)
{
if(editor_seq(&save_y, -1) == 0)
{
//Found unused editor slot
editor_frame(&save_y, 255);
editor_seq(&save_y, &save_x);
goto markend;
}
}
&save_y -= 1;
//Editor slots don't have to be limited 50-99 range, but hopefully this makes is less likely to screw up anything
if(&save_y > 49)
{
goto markloop;
}
else
{
debug("Could not find unused editor slot on screen &player_map.");
}
markend:
&player_map = &arg3;
&save_x = &arg1;
&save_y = &arg2;
return;
simplesave:
&save_x = sp_editor_num(¤t_sprite);
if (&save_x != 0)
{
editor_type(&save_x, 4);
editor_seq(&save_x, 20);
editor_frame(&save_x, 29);
}
&save_x = &arg1;
&save_y = &arg2;
return;
}
Edit: fixed computation of stored editor_seq
Edit2: Removed load_screen()'s






