I'm not sure if this is a bug or not, so I'll just ask here...
I've been working on a script for Bombs that act like those from the classic Bomberman games, in that the explosions go off in a + pattern, and stop at solid blocks. I've got the skeleton of the bombs down:
Code:
import "std.zh"
bool isspiked = false;
bool isremote = false;
bool CanCreate = true;
global script Bomberman
{
void run()
{
int bombtimer1 = 0;
int bombtimer2 = 0;
int bombtimer3 = 0;
int bombtimer4 = 0;
int bombtimer5 = 0;
int bombtimer6 = 0;
int BombX;
int BombY;
int LastMap;
int LastScreen;
int bombcount = 0;
int nrmbmb = 400;
int spkbmb = 400;
int rmtbmb = 400;
lweapon bomb1;
lweapon bomb2;
lweapon bomb3;
lweapon bomb4;
lweapon bomb5;
lweapon bomb6;
bool IsRem1 = false;
bool IsRem2 = false;
bool IsRem3 = false;
bool IsRem4 = false;
bool IsRem5 = false;
bool IsRem6 = false;
bool IsPlaced1 = false;
bool IsPlaced2 = false;
bool IsPlaced3 = false;
bool IsPlaced4 = false;
bool IsPlaced5 = false;
bool IsPlaced6 = false;
bool IsSpike1 = false;
bool IsSpike2 = false;
bool IsSpike3 = false;
bool IsSpike4 = false;
bool IsSpike5 = false;
bool IsSpike6 = false;
while(true)
{
if(Game->GetCurMap() != LastMap || Game->GetCurScreen() != LastScreen)
{
bombcount = 0;
bombtimer1 = 0;
bombtimer2 = 0;
bombtimer3 = 0;
bombtimer4 = 0;
bombtimer5 = 0;
bombtimer6 = 0;
CanCreate = true;
}
if(bombcount < Game->Counter[2] && Link->InputA && CanCreate)
{
if(bombcount >= 0 && !IsPlaced1)
{
BombX = Link->X;
BombY = Link->Y;
if(Screen->ComboS[ComboAt(BombX, BombY)] != 0)
{
BombX = Link->X;
BombY = Link->Y - 8;
}
Screen->CreateLWeapon(255);
int numwpns = Screen->NumLWeapons();
lweapon bomb1 = Screen->LoadLWeapon(numwpns);
bomb1->Step = 0;
bomb1->Damage = 0;
bomb1->X = BombX;
bomb1->Y = BombY;
bomb1->CSet = 7;
bomb1->DeadState = -1;
if(isspiked)
{
bomb1->Tile = spkbmb;
IsSpike1 = true;
IsRem1 = false;
}
else if(isremote)
{
bomb1->Tile = rmtbmb;
IsSpike1 = false;
IsRem1 = true;
}
else
{
bomb1->Tile = nrmbmb;
IsSpike1 = false;
IsRem1 = false;
}
bombtimer1 = 180;
Game->PlaySound(21);
IsPlaced1 = true;
}
else if(bombcount >= 1)
{
}
else if(bombcount >= 2)
{
}
else if(bombcount >= 3)
{
}
else if(bombcount >= 4)
{
}
else if(bombcount == 5)
{
}
}
if(IsPlaced1)
{
if(bombtimer1 > 0)
{
if(!isremote && !IsRem1)
{
bombtimer1--;
}
}
if(Link->InputB && isremote && IsRem1)
{
bombtimer1 = 0;
}
if(bombtimer1 == 0)
{
bomb1->DeadState = WDS_DEAD;
if(Screen->ComboS[ComboAt(BombX, BombY-16)] == 0)
{
Screen->CreateLWeapon(254);
int numwpns = Screen->NumLWeapons();
lweapon fire1 = Screen->LoadLWeapon(numwpns);
fire1->Step = 0;
fire1->Damage = 2;
fire1->X = BombX;
fire1->Y = BombY - 16;
fire1->ASpeed = 8;
fire1->NumFrames = 8;
fire1->OriginalTile = 440;
fire1->DeadState = 60;
fire1->CSet = 7;
}
if(Screen->ComboS[ComboAt(BombX-16, BombY)] == 0)
{
Screen->CreateLWeapon(254);
int numwpns = Screen->NumLWeapons();
lweapon fire2 = Screen->LoadLWeapon(numwpns);
fire2->Step = 0;
fire2->Damage = 2;
fire2->X = BombX - 16;
fire2->Y = BombY;
fire2->ASpeed = 8;
fire2->NumFrames = 8;
fire2->OriginalTile = 385;
fire2->DeadState = 60;
fire2->CSet = 7;
}
if(Screen->ComboS[ComboAt(BombX+16, BombY)] == 0)
{
Screen->CreateLWeapon(254);
int numwpns = Screen->NumLWeapons();
lweapon fire3 = Screen->LoadLWeapon(numwpns);
fire3->Step = 0;
fire3->Damage = 2;
fire3->X = BombX + 16;
fire3->Y = BombY;
fire3->ASpeed = 8;
fire3->NumFrames = 8;
fire3->OriginalTile = 405;
fire3->DeadState = 60;
fire3->CSet = 7;
}
if(Screen->ComboS[ComboAt(BombX, BombY+16)] == 0)
{
Screen->CreateLWeapon(254);
int numwpns = Screen->NumLWeapons();
lweapon fire4 = Screen->LoadLWeapon(numwpns);
fire4->Step = 0;
fire4->Damage = 2;
fire4->X = BombX;
fire4->Y = BombY + 16;
fire4->ASpeed = 8;
fire4->NumFrames = 8;
fire4->OriginalTile = 500;
fire4->DeadState = 60;
fire4->CSet = 7;
}
Screen->CreateLWeapon(254);
int numwpns = Screen->NumLWeapons();
lweapon fire5 = Screen->LoadLWeapon(numwpns);
fire5->Step = 0;
fire5->Damage = 2;
fire5->X = BombX;
fire5->Y = BombY;
fire5->ASpeed = 8;
fire5->NumFrames = 8;
fire5->OriginalTile = 480;
fire5->DeadState = 60;
fire5->CSet = 7;
Game->PlaySound(3);
IsPlaced1 = false;
}
}
while(Link->InputA)
{
CanCreate = false;
Waitframe();
}
if(!Link->InputA)
{
CanCreate = true;
}
LastMap = Game->GetCurMap();
LastScreen = Game->GetCurScreen();
Waitframe();
}
}
}
The problem? The Bomb never dies when its DeadState is set to 0. The explosion fires seem to vanish at first sight, but then they start cycling through a few combos as THEIR DeadState starts going down to 0. Honestly, I'm hoping it's not a bug with DeadState... Also, on a side note, why are certain values on the way to 0 set aside for specific actions? Wouldn't that, y'know...BREAK THIS THING? Just a thought...