X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fgame_sp%2FBugsTerminals.c;h=afa7345e8bf40d7a843b5df8cdbf18667cecdd3f;hp=f12a1a0b64ce5da8fa6633afc9216235045f0e10;hb=3ff2e8a0b5c27b99a9920bdf5ed82bc41bf40181;hpb=e85f102990a880fc2ec51e64a1f1ced4ad9e19df diff --git a/src/game_sp/BugsTerminals.c b/src/game_sp/BugsTerminals.c index f12a1a0b..afa7345e 100644 --- a/src/game_sp/BugsTerminals.c +++ b/src/game_sp/BugsTerminals.c @@ -4,266 +4,129 @@ #include "BugsTerminals.h" -// static char *VB_Name = "modBugTerminal"; -// --- Option Explicit +byte TerminalState[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE]; -long MyGetTickCount(); - -byte *TerminalState; int TerminalMaxCycles; -#if 0 -#define aniTerminal (0x80) -#endif // ========================================================================== // 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 graphic, sync_frame; int bl; if (fiBug != LowByte(PlayField16[si])) - return subAnimateBugs; - -#if 0 - if (0 != (TimerVar & 3)) - return subAnimateBugs; -#endif + return; - bl = SgnHighByte(PlayField16[si]); // get and increment sequence# + bl = SgnHighByte(PlayField16[si]); // get and increment sequence number -#if 1 if ((TimerVar & 3) == 0) { bl = bl + 1; - if (bl >= 0xE) + if (bl >= 14) // bugs animation has 14 frames { - bl = subGetRandomNumber(); // generate new random number + bl = subGetRandomNumber(); // generate new random number bl = -((bl & 0x3F) + 0x20); } - MovHighByte(&PlayField16[si], bl); // save sequence# - } -#else - bl = bl + 1; - if (bl >= 0xE) - { - bl = subGetRandomNumber(); // generate new random number - bl = -((bl & 0x3F) + 0x20); + MovHighByte(&PlayField16[si], bl); // save sequence number } - MovHighByte(&PlayField16[si], bl); // save sequence# -#endif - if (bl < 0) // bug sleeps / is inactive - return subAnimateBugs; - -#if 1 - if ((TimerVar & 3) != 0) - goto markDisplay; -#endif + 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: // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -#if 1 - -#if 1 - - graphic = (bl == 0 ? aniBugActivating : - bl == 12 ? aniBugDeactivating : - bl == 13 ? aniBug : aniBugActive); - sync_frame = (bl >= 1 && bl <= 11 ? (bl - 1) * 4 : 0) + (TimerVar & 3); - - // printf("::: %d [%d]\n", sync_frame, gfx.anim_random_frame); - - /* a general random frame treatment would be needed for _all_ animations */ - if (isRandomAnimation_SP(graphic) && - !isNextAnimationFrame_SP(graphic, sync_frame)) - return subAnimateBugs; - - subCopyAnimToScreen(si, graphic, sync_frame); - -#else - subCopyFieldToScreen(si, aniFramesBug[bl]); -#endif - -#else - cx = aniFramesBug[bl]; - StretchedSprites.BltEx(GetStretchX(si), GetStretchY(si), cx); -#endif + 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) -{ - int subAnimateTerminals; - // int bl, ax, al, X, Y; -#if 1 - short bl; -#else - int bl, al, X, Y; -#endif +void subAnimateTerminals(int si) +{ + int bl; -#if 1 int lx = GetX(si); int ly = GetY(si); int graphic; -#endif if (LowByte(PlayField16[si]) != fiTerminal) - return subAnimateTerminals; + return; /* 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 = HighByte(PlayField16[si]); - if ((bl & 0x80) == 0x80) - bl = (bl | 0xFF00); + bl = SgnHighByte(PlayField16[si]); bl = bl + 1; if (bl <= 0) /* return if random animation delay not yet reached */ { MovHighByte(&PlayField16[si], bl); -#if 1 - if (game.use_native_sp_graphics_engine) - return subAnimateTerminals; -#else - return subAnimateTerminals; -#endif + 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; // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -#if 1 graphic = (bl < 8 ? aniTerminal : aniTerminalActive); if (game.use_native_sp_graphics_engine) GfxFrame[lx][ly] += getGraphicInfo_Delay(graphic); -#if 1 - subCopyAnimToScreen(si, graphic, GfxFrame[lx][ly]); -#else - X = GetStretchX(si); - Y = GetStretchY(si); - StretchedSprites.BltImg(X, Y, graphic, GfxFrame[lx][ly]); -#endif - -#else - - al = aniTerminal + bl; + GfxGraphic[lx][ly] = (bl < 8 ? aniTerminal : aniTerminalActive); -#if 1 - subCopyFieldToScreen(si, al); -#else - X = GetStretchX(si); - Y = GetStretchY(si); - StretchedSprites.BltEx(X, Y, al); -#endif - -#endif // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +} - return subAnimateTerminals; -} // subAnimateElectrons // ========================================================================== // SUBROUTINE // Randomize random number generator // ========================================================================== -int subRandomize() +void subRandomize() { - int subRandomize; - - long Tick, Tmp; + int Tick = MyGetTickCount(); - Tick = MyGetTickCount(); - Tmp = ((Tick ^ (long)(Tick / (1 << 16))) & 0xFFFF); - RandomSeed = 0x7FFF & Tmp; - if ((Tmp & 0x8000) != 0) - RandomSeed = RandomSeed | 0x8000; - -#if 0 - { - int i; - - for (i = 0; i < 10; i++) - printf("::: TEST random number: %d\n", subGetRandomNumber()); - } -#endif - -#if 0 - printf("::: BugsTerminals.c: ========== subRandomize()\n"); -#endif - - return subRandomize; -} // subRandomize + RandomSeed = (Tick ^ (Tick >> 16)) & 0xFFFF; +} // ========================================================================== @@ -273,25 +136,9 @@ int subRandomize() int subGetRandomNumber() { - int subGetRandomNumber; + RandomSeed = (RandomSeed * 0x5E5 + 0x31) & 0xFFFF; - long Tmp, RSeed; - - RSeed = (long)(0x7FFF & RandomSeed); - if (0x8000 == (RandomSeed & 0x8000)) - RSeed = RSeed | 0x8000; - -#if 0 - /* !!! TEST !!! */ - Tmp = 0xFFFF & (((0x5E5 * RSeed) & 0xFFFF) + 0x31); -#else - Tmp = 0xFFFF & (((0x5E5 * RandomSeed) & 0xFFFF) + 0x31); -#endif - RandomSeed = 0x7FFF & Tmp; - if ((Tmp & 0x8000) != 0) - RandomSeed = RandomSeed | 0x8000; - - subGetRandomNumber = Tmp / 2; + return (RandomSeed >> 1); // Mov ax, randomseed // Mov bx, &H5E5 @@ -299,11 +146,4 @@ int subGetRandomNumber() // Add ax, &H31 // Mov randomseed, ax // shr ax,1 - -#if 0 - printf("::: BugsTerminals.c: ---------- subGetRandomNumber(): %d\n", - subGetRandomNumber); -#endif - - return subGetRandomNumber; -} // subGetRandomNumber +}