#include "Globals.h"
+static int *PlayField16Mem;
+static byte *PlayField8Mem;
+
boolean LevelLoaded;
boolean DemoAvailable;
int FieldHeight; // standard size = 24
int HeaderSize; // standard size = 96
int FieldMax, LevelMax;
-long FileMax;
-#if 1
-int PlayField16[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE];
-byte PlayField8[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE];
-byte DisPlayField[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE];
-#else
int *PlayField16;
byte *PlayField8;
-byte *DisPlayField;
-#endif
+byte DisPlayField[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE];
int TimerVar;
-#if 1
short RandomSeed;
-#else
-int RandomSeed;
-#endif
int FreezeZonks;
int MurphyScreenXPos, MurphyScreenYPos;
int MurphyExplodePos, SplitMoveFlag, RedDiskReleaseMurphyPos;
int KillMurphyFlag, MurphyMoveCounter;
-long YawnSleepCounter;
+int YawnSleepCounter;
int MurphyVarFaceLeft;
int ScratchGravity, GravityFlag;
int RedDiskReleaseFlag, MovingPictureSequencePhase;
}
}
-void InitGlobals()
+void InitGlobals(void)
{
+ InitPrecedingPlayfieldMemory();
+
AutoScrollFlag = True;
FreezeZonks = 0;
LevelLoaded = False;
bPlaying = False;
menBorder = False;
-#if 0
- /* these defaults will be changed after reading a Supaplex level file */
- PlayField8 = REDIM_1D(sizeof(byte), 0, FieldMax);
- DisPlayField = REDIM_1D(sizeof(byte), 0, FieldMax);
- PlayField16 = REDIM_1D(sizeof(int), 0, FieldMax);
+ // add preceding playfield buffer (as large as preceding memory area)
+ PlayField16Mem = checked_calloc((game_sp.preceding_buffer_size +
+ SP_MAX_PLAYFIELD_SIZE +
+ SP_HEADER_SIZE) * sizeof(int));
+ PlayField16 = &PlayField16Mem[game_sp.preceding_buffer_size];
+
+ // add preceding playfield buffer (as large as one playfield row)
+ PlayField8Mem = checked_calloc((SP_MAX_PLAYFIELD_WIDTH +
+ SP_MAX_PLAYFIELD_SIZE +
+ SP_HEADER_SIZE) * sizeof(byte));
+ PlayField8 = &PlayField8Mem[SP_MAX_PLAYFIELD_WIDTH];
+}
- AnimationPosTable = REDIM_1D(sizeof(int), 0, LevelMax);
- AnimationSubTable = REDIM_1D(sizeof(byte), 0, LevelMax);
- TerminalState = REDIM_1D(sizeof(byte), 0, FieldMax);
-#endif
+void FreeGlobals(void)
+{
+ checked_free(PlayField16Mem);
+ checked_free(PlayField8Mem);
}
int GetSI(int X, int Y)
return StretchWidth * (si / FieldWidth);
}
-void PrepareLevel()
+void PrepareLevel(void)
{
copyInternalEngineVars_SP();
-#if 1
SetDisplayRegion();
SetScrollEdges();
-#endif
LevelLoaded = True;
}
-#if 0
-void Trace(char *Source, char *Message)
-{
- printf("::: Trace: Source == '%s', Message == '%s'\n", Source, Message);
-}
-
-void ReportError(char *Source, char *Message)
-{
- printf("::: ReportError: Source == '%s', Message == '%s'\n", Source, Message);
-}
-#endif
-
int Min(int A, int B)
{
return (A < B ? A : B);