X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fgame_sp%2FBugsTerminals.c;h=afa7345e8bf40d7a843b5df8cdbf18667cecdd3f;hp=f31e6d8c77f753dfe1efa9d155e897bbf623fe91;hb=3ff2e8a0b5c27b99a9920bdf5ed82bc41bf40181;hpb=8d3d7d213a9691455a49544624bf380e85f43461 diff --git a/src/game_sp/BugsTerminals.c b/src/game_sp/BugsTerminals.c index f31e6d8c..afa7345e 100644 --- a/src/game_sp/BugsTerminals.c +++ b/src/game_sp/BugsTerminals.c @@ -4,154 +4,129 @@ #include "BugsTerminals.h" -// static char *VB_Name = "modBugTerminal"; -// --- Option Explicit +byte TerminalState[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE]; -long GetTickCount(); - -byte *TerminalState; int TerminalMaxCycles; -#define aniTerminal (0x80) + // ========================================================================== // SUBROUTINE // Animate bugs // ========================================================================== -int subAnimateBugs(int si) +void subAnimateBugs(int si) { - int subAnimateBugs; - - // int ax, bx, cx, dx, di; - // int ah, bh, ch, dh, al, bl, cl, dl; - int cx; int bl; if (fiBug != LowByte(PlayField16[si])) - return subAnimateBugs; + return; - if (0 != (TimerVar & 3)) - return subAnimateBugs; + bl = SgnHighByte(PlayField16[si]); // get and increment sequence number - bl = SgnHighByte(PlayField16[si]); // get and increment sequence# - bl = bl + 1; - if (bl >= 0xE) + if ((TimerVar & 3) == 0) { - bl = subGetRandomNumber(); // generate new random number - bl = -((bl & 0x3F) + 0x20); + bl = bl + 1; + if (bl >= 14) // bugs animation has 14 frames + { + bl = subGetRandomNumber(); // generate new random number + bl = -((bl & 0x3F) + 0x20); + } + + MovHighByte(&PlayField16[si], bl); // save sequence number } - MovHighByte(&PlayField16[si], bl); // save sequence# - if (bl < 0) // bug sleeps / is inactive - return subAnimateBugs; + if (bl < 0) // bug sleeps / is inactive + return; // now the bug is active! Beware Murphy! - if ((ByteMask && PlayField16[si - FieldWidth - 1]) == fiMurphy) - goto markPlaySound; - - if ((ByteMask && PlayField16[si - FieldWidth]) == fiMurphy) - goto markPlaySound; - - if ((ByteMask && PlayField16[si - FieldWidth + 1]) == fiMurphy) - goto markPlaySound; - - if ((ByteMask && PlayField16[si - 1]) == fiMurphy) - goto markPlaySound; - - if ((ByteMask && PlayField16[si + 1]) == fiMurphy) - goto markPlaySound; - - if ((ByteMask && PlayField16[si + FieldWidth - 1]) == fiMurphy) - goto markPlaySound; + if ((TimerVar & 3) == 0 && + (LowByte(PlayField16[si - FieldWidth - 1]) == fiMurphy || + LowByte(PlayField16[si - FieldWidth]) == fiMurphy || + LowByte(PlayField16[si - FieldWidth + 1]) == fiMurphy || + LowByte(PlayField16[si - 1]) == fiMurphy || + LowByte(PlayField16[si + 1]) == fiMurphy || + LowByte(PlayField16[si + FieldWidth - 1]) == fiMurphy || + LowByte(PlayField16[si + FieldWidth]) == fiMurphy || + LowByte(PlayField16[si + FieldWidth + 1]) == fiMurphy)) + subSoundFX(si, fiBug, actActive); // play dangerous sound - if ((ByteMask && PlayField16[si + FieldWidth]) == fiMurphy) - goto markPlaySound; - - if ((ByteMask && PlayField16[si + FieldWidth + 1]) == fiMurphy) - goto markPlaySound; - - goto markDisplay; - -markPlaySound: - subSoundFXBug(); // play dangerous sound - -markDisplay: // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - cx = aniBug[bl]; - StretchedSprites.BltEx(GetStretchX(si), GetStretchY(si), cx); + GfxGraphic[GetX(si)][GetY(si)] = (bl == 0 ? aniBugActivating : + bl == 12 ? aniBugDeactivating : + bl == 13 ? aniBug : aniBugActive); // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +} - return subAnimateBugs; -} // subAnimateBugs // ========================================================================== // SUBROUTINE // Animate terminals // ========================================================================== -int subAnimateTerminals(int si) + +void subAnimateTerminals(int si) { - int subAnimateTerminals; + int bl; - // int bl, ax, al, X, Y; - int bl, al, X, Y; + int lx = GetX(si); + int ly = GetY(si); + int graphic; if (LowByte(PlayField16[si]) != fiTerminal) - return subAnimateTerminals; + return; - bl = HighByte(PlayField16[si]); - if ((bl & 0x80) == 0x80) - bl = (bl | 0xFF00); + /* use native frame handling (undo frame incrementation in main loop) */ + if (game.use_native_sp_graphics_engine) + GfxFrame[lx][ly]--; + + /* get last random animation delay */ + bl = SgnHighByte(PlayField16[si]); bl = bl + 1; - if (bl <= 0) + if (bl <= 0) /* return if random animation delay not yet reached */ { MovHighByte(&PlayField16[si], bl); - return subAnimateTerminals; + + return; } + /* calculate new random animation delay */ bl = -(subGetRandomNumber() & TerminalMaxCycles); // generate new random number - MovHighByte(&PlayField16[si], bl); // save new sequence# + MovHighByte(&PlayField16[si], bl); // save new sequence number + + /* check terminal state (active or inactive) */ bl = TerminalState[si] + 1; if (bl == 8) - { bl = 0; - } else if (15 < bl) - { bl = 8; - } TerminalState[si] = bl; + // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - al = aniTerminal + bl; - X = GetStretchX(si); - Y = GetStretchY(si); - StretchedSprites.BltEx(X, Y, al); + + graphic = (bl < 8 ? aniTerminal : aniTerminalActive); + + if (game.use_native_sp_graphics_engine) + GfxFrame[lx][ly] += getGraphicInfo_Delay(graphic); + + GfxGraphic[lx][ly] = (bl < 8 ? aniTerminal : aniTerminalActive); + // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +} - return subAnimateTerminals; -} // subAnimateElectrons // ========================================================================== // SUBROUTINE // Randomize random number generator // ========================================================================== -int subRandomize() +void subRandomize() { - int subRandomize; - - long Tick, Tmp; - - Tick = GetTickCount(); - Tmp = ((Tick ^ (long)(Tick / (1 << 16))) & 0xFFFF); - RandomSeed = 0x7FFF & Tmp; - if ((Tmp & 0x8000) != 0) - RandomSeed = RandomSeed | 0x8000; + int Tick = MyGetTickCount(); - return subRandomize; -} // subRandomize + RandomSeed = (Tick ^ (Tick >> 16)) & 0xFFFF; +} // ========================================================================== @@ -161,27 +136,14 @@ int subRandomize() int subGetRandomNumber() { - int subGetRandomNumber; + RandomSeed = (RandomSeed * 0x5E5 + 0x31) & 0xFFFF; - long Tmp, RSeed; + return (RandomSeed >> 1); - RSeed = (long)(0x7FFF & RandomSeed); - if (0x8000 == (RandomSeed & 0x8000)) - RSeed = RSeed | 0x8000; - - Tmp = 0xFFFF & (((0x5E5 * RandomSeed) & 0xFFFF) + 0x31); - RandomSeed = 0x7FFF & Tmp; - if ((Tmp & 0x8000) != 0) - RandomSeed = RandomSeed | 0x8000; - - subGetRandomNumber = Tmp / 2; // Mov ax, randomseed // Mov bx, &H5E5 // mul bx ' dx:ax = reg * ax // Add ax, &H31 // Mov randomseed, ax // shr ax,1 - - return subGetRandomNumber; -} // subGetRandomNumber - +}