From 78ec772d11cb8823d8dca05c227b472da8708a07 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Fri, 19 Feb 1999 14:17:44 +0100 Subject: [PATCH] rnd-19990219-2 --- src/editor.c | 111 ++++++++++++------------------------------ src/events.c | 6 ++- src/files.c | 135 +++++++++++++++++++-------------------------------- src/game.c | 110 ++++++++++++++++++++--------------------- src/main.c | 7 +-- src/main.h | 43 ++++++++++------ src/misc.c | 86 +++++++++++++++++++++++--------- src/misc.h | 6 ++- src/tools.c | 7 ++- 9 files changed, 238 insertions(+), 273 deletions(-) diff --git a/src/editor.c b/src/editor.c index e909faa0..ee201420 100644 --- a/src/editor.c +++ b/src/editor.c @@ -51,10 +51,6 @@ #define MIN_SCORE 0 #define MAX_SCORE 255 -/* values for elements with content */ -#define MIN_ELEM_CONTENT 1 -#define MAX_ELEM_CONTENT 8 - /* values for the control window */ #define ED_CTRL_BUTTONS_GFX_YPOS 236 #define ED_CTRL_BUTTONS_ALT_GFX_YPOS 142 @@ -410,10 +406,10 @@ static struct }, { ED_COUNT_ELEM_CONTENT_XPOS, ED_COUNT_ELEM_CONTENT_YPOS, - MIN_ELEM_CONTENT, MAX_ELEM_CONTENT, + MIN_ELEMENT_CONTENTS, MAX_ELEMENT_CONTENTS, GADGET_ID_ELEM_CONTENT_DOWN, GADGET_ID_ELEM_CONTENT_UP, GADGET_ID_ELEM_CONTENT_TEXT, - &MampferMax, + &level.num_yam_contents, "element content", NULL }, { @@ -437,7 +433,7 @@ static struct 0, 999, GADGET_ID_LEVEL_COLLECT_DOWN, GADGET_ID_LEVEL_COLLECT_UP, GADGET_ID_LEVEL_COLLECT_TEXT, - &level.edelsteine, + &level.gems_needed, "number of emeralds to collect", NULL }, { @@ -667,7 +663,7 @@ static int last_drawing_function = GADGET_ID_SINGLE_ITEMS; static boolean draw_with_brush = FALSE; static int properties_element = 0; -static short ElementContent[MAX_ELEM_CONTENT][3][3]; +static short ElementContent[MAX_ELEMENT_CONTENTS][3][3]; static short FieldBackup[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; static short UndoBuffer[NUM_UNDO_STEPS][MAX_LEV_FIELDX][MAX_LEV_FIELDY]; static int undo_buffer_position = 0; @@ -1421,7 +1417,7 @@ static void CreateDrawingAreas() level_editor_gadget[id] = gi; /* ... up to eight areas for element content ... */ - for (i=0; i= GADGET_ID_ELEM_CONTENT_0 && id <= GADGET_ID_ELEM_CONTENT_7) - level.mampfer_inhalt[id - GADGET_ID_ELEM_CONTENT_0][sx][sy] = + level.yam_content[id - GADGET_ID_ELEM_CONTENT_0][sx][sy] = new_element; } break; diff --git a/src/events.c b/src/events.c index 8a03effd..b0022c35 100644 --- a/src/events.c +++ b/src/events.c @@ -299,13 +299,15 @@ void HandleFocusEvent(XFocusChangeEvent *event) would be far better) set for each X11 window individually. The effect would be keyboard auto repeat while playing the game (game_status == PLAYING), which is not desired. - To avoid this special case, we just wait 1/50 second before + To avoid this special case, we just wait 1/10 second before processing the 'FocusIn' event. */ - Delay(20); if (game_status == PLAYING) + { + Delay(100); XAutoRepeatOff(display); + } if (old_joystick_status != -1) joystick_status = old_joystick_status; } diff --git a/src/files.c b/src/files.c index e48a0991..d3e85c3f 100644 --- a/src/files.c +++ b/src/files.c @@ -287,11 +287,11 @@ static void setLevelInfoToDefaults() Feld[x][y] = Ur[x][y] = EL_ERDREICH; level.time = 100; - level.edelsteine = 0; - level.tempo_amoebe = 10; - level.dauer_sieb = 10; - level.dauer_ablenk = 10; - level.amoebe_inhalt = EL_DIAMANT; + level.gems_needed = 0; + level.amoeba_speed = 10; + level.time_magic_wall = 10; + level.time_wheel = 10; + level.amoeba_content = EL_DIAMANT; level.double_speed = FALSE; level.gravity = FALSE; @@ -306,11 +306,11 @@ static void setLevelInfoToDefaults() for(i=0; i= FILE_VERSION_1_2) { - /* first check header chunk identifier and chunk length */ - fgets(chunk, CHUNK_ID_LEN + 1, file); - chunk_length = - (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file); - + getFileChunk(file, chunk, &chunk_length, BYTE_ORDER_BIG_ENDIAN); if (strcmp(chunk, "HEAD") || chunk_length != TAPE_HEADER_SIZE) { Error(ERR_WARN, "wrong 'HEAD' chunk of tape file '%s'", filename); @@ -619,12 +616,9 @@ void LoadTape(int level_nr) } } - tape.random_seed = - (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file); - tape.date = - (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file); - tape.length = - (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file); + tape.random_seed = getFile32BitInteger(file, BYTE_ORDER_BIG_ENDIAN); + tape.date = getFile32BitInteger(file, BYTE_ORDER_BIG_ENDIAN); + tape.length = getFile32BitInteger(file, BYTE_ORDER_BIG_ENDIAN); /* read header fields that are new since version 1.2 */ if (file_version >= FILE_VERSION_1_2) @@ -659,10 +653,7 @@ void LoadTape(int level_nr) /* read chunk "BODY" */ if (file_version >= FILE_VERSION_1_2) { - /* next check body chunk identifier and chunk length */ - fgets(chunk, CHUNK_ID_LEN + 1, file); - chunk_length = - (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file); + getFileChunk(file, chunk, &chunk_length, BYTE_ORDER_BIG_ENDIAN); if (strcmp(chunk, "BODY") || chunk_length != (num_participating_players + 1) * tape.length) { @@ -735,7 +726,6 @@ void SaveTape(int level_nr) boolean new_tape = TRUE; byte store_participating_players; int num_participating_players; - int chunk_length; InitTapeDirectory(leveldir[leveldir_nr].filename); @@ -768,42 +758,19 @@ void SaveTape(int level_nr) fputs(TAPE_COOKIE, file); /* file identifier */ fputc('\n', file); - fputs("HEAD", file); /* chunk identifier for file header */ + putFileChunk(file, "HEAD", TAPE_HEADER_SIZE, BYTE_ORDER_BIG_ENDIAN); - chunk_length = TAPE_HEADER_SIZE; - - fputc((chunk_length >> 24) & 0xff, file); - fputc((chunk_length >> 16) & 0xff, file); - fputc((chunk_length >> 8) & 0xff, file); - fputc((chunk_length >> 0) & 0xff, file); - - fputc((tape.random_seed >> 24) & 0xff, file); - fputc((tape.random_seed >> 16) & 0xff, file); - fputc((tape.random_seed >> 8) & 0xff, file); - fputc((tape.random_seed >> 0) & 0xff, file); - - fputc((tape.date >> 24) & 0xff, file); - fputc((tape.date >> 16) & 0xff, file); - fputc((tape.date >> 8) & 0xff, file); - fputc((tape.date >> 0) & 0xff, file); - - fputc((tape.length >> 24) & 0xff, file); - fputc((tape.length >> 16) & 0xff, file); - fputc((tape.length >> 8) & 0xff, file); - fputc((tape.length >> 0) & 0xff, file); + putFile32BitInteger(file, tape.random_seed, BYTE_ORDER_BIG_ENDIAN); + putFile32BitInteger(file, tape.date, BYTE_ORDER_BIG_ENDIAN); + putFile32BitInteger(file, tape.length, BYTE_ORDER_BIG_ENDIAN); fputc(store_participating_players, file); for(i=0; i> 24) & 0xff, file); - fputc((chunk_length >> 16) & 0xff, file); - fputc((chunk_length >> 8) & 0xff, file); - fputc((chunk_length >> 0) & 0xff, file); + putFileChunk(file, "BODY", (num_participating_players + 1) * tape.length, + BYTE_ORDER_BIG_ENDIAN); for(i=0; iconnected) { player->active = TRUE; - player->gone = FALSE; /* remove potentially duplicate players */ if (StorePlayer[jx][jy] == Feld[x][y]) @@ -350,7 +349,7 @@ void InitGame() player->programmed_action = 0; player->score = 0; - player->gems_still_needed = level.edelsteine; + player->gems_still_needed = level.gems_needed; player->sokobanfields_still_needed = 0; player->lights_still_needed = 0; player->friends_still_needed = 0; @@ -385,8 +384,6 @@ void InitGame() player->snapped = FALSE; - player->gone = TRUE; - player->last_jx = player->last_jy = 0; player->jx = player->jy = 0; @@ -407,7 +404,7 @@ void InitGame() ZX = ZY = -1; - MampferNr = 0; + game.yam_content_nr = 0; FrameCounter = 0; TimeFrames = 0; TimePlayed = 0; @@ -420,8 +417,8 @@ void InitGame() ScrollStepSize = 0; /* will be correctly initialized by ScrollScreen() */ AllPlayersGone = FALSE; - SiebAktiv = FALSE; - SiebCount = 0; + game.magic_wall_active = FALSE; + game.magic_wall_time_left = 0; for (i=0; ipresent = TRUE; player->active = TRUE; - player->gone = FALSE; some_player->present = FALSE; StorePlayer[jx][jy] = player->element_nr; @@ -497,7 +493,6 @@ void InitGame() int jx = player->jx, jy = player->jy; player->active = FALSE; - player->gone = TRUE; StorePlayer[jx][jy] = 0; Feld[jx][jy] = EL_LEERRAUM; } @@ -519,7 +514,6 @@ void InitGame() int jx = player->jx, jy = player->jy; player->active = FALSE; - player->gone = TRUE; StorePlayer[jx][jy] = 0; Feld[jx][jy] = EL_LEERRAUM; } @@ -552,7 +546,7 @@ void InitGame() } } - game_emulation = (emulate_bd ? EMU_BOULDERDASH : + game.emulation = (emulate_bd ? EMU_BOULDERDASH : emulate_sb ? EMU_SOKOBAN : emulate_sp ? EMU_SUPAPLEX : EMU_NONE); @@ -1057,7 +1051,7 @@ void DrawDynamite(int x, int y) phase = 7 - phase; } - if (game_emulation == EMU_SUPAPLEX) + if (game.emulation == EMU_SUPAPLEX) DrawGraphic(sx, sy, GFX_SP_DISK_RED); else if (Store[x][y]) DrawGraphicThruMask(sx, sy, graphic + phase); @@ -1145,7 +1139,7 @@ void Explode(int ex, int ey, int phase, int mode) break; } - if (game_emulation == EMU_SUPAPLEX) + if (game.emulation == EMU_SUPAPLEX) Store[x][y] = EL_LEERRAUM; } else if (center_element == EL_MAULWURF) @@ -1159,9 +1153,9 @@ void Explode(int ex, int ey, int phase, int mode) else if (center_element == EL_SP_ELECTRON) Store[x][y] = EL_SP_INFOTRON; else if (center_element == EL_MAMPFER) - Store[x][y] = level.mampfer_inhalt[MampferNr][x-ex+1][y-ey+1]; + Store[x][y] = level.yam_content[game.yam_content_nr][x-ex+1][y-ey+1]; else if (center_element == EL_AMOEBA2DIAM) - Store[x][y] = level.amoebe_inhalt; + Store[x][y] = level.amoeba_content; else if (element == EL_ERZ_EDEL) Store[x][y] = EL_EDELSTEIN; else if (element == EL_ERZ_DIAM) @@ -1198,7 +1192,7 @@ void Explode(int ex, int ey, int phase, int mode) } if (center_element == EL_MAMPFER) - MampferNr = (MampferNr + 1) % MampferMax; + game.yam_content_nr = (game.yam_content_nr + 1) % level.num_yam_contents; return; } @@ -1254,7 +1248,7 @@ void Explode(int ex, int ey, int phase, int mode) { int graphic = GFX_EXPLOSION; - if (game_emulation == EMU_SUPAPLEX) + if (game.emulation == EMU_SUPAPLEX) graphic = (Store[x][y] == EL_SP_INFOTRON ? GFX_SP_EXPLODE_INFOTRON : GFX_SP_EXPLODE_EMPTY); @@ -1311,7 +1305,7 @@ void Bang(int x, int y) { int element = Feld[x][y]; - if (game_emulation == EMU_SUPAPLEX) + if (game.emulation == EMU_SUPAPLEX) PlaySoundLevel(x, y, SND_SP_BOOOM); else PlaySoundLevel(x, y, SND_ROAAAR); @@ -1454,8 +1448,8 @@ void Impact(int x, int y) if (Feld[x][y] == smashed) Feld[x][y] = activated_magic_wall; - SiebCount = level.dauer_sieb * FRAMES_PER_SECOND; - SiebAktiv = TRUE; + game.magic_wall_time_left = level.time_magic_wall * FRAMES_PER_SECOND; + game.magic_wall_active = TRUE; } if (IS_PLAYER(x, y+1)) @@ -1838,7 +1832,7 @@ void TurnRound(int x, int y) struct PlayerInfo *player = &stored_player[i]; int jx = player->jx, jy = player->jy; - if (!player->active || player->gone) + if (!player->active) continue; if (attr_x == -1 || ABS(jx-x)+ABS(jy-y) < ABS(attr_x-x)+ABS(attr_y-y)) @@ -1953,8 +1947,7 @@ static boolean JustBeingPushed(int x, int y) { struct PlayerInfo *player = &stored_player[i]; - if (player->active && !player->gone && - player->Pushing && player->MovPos) + if (player->active && player->Pushing && player->MovPos) { int next_jx = player->jx + (player->jx - player->last_jx); int next_jy = player->jy + (player->jy - player->last_jy); @@ -2097,7 +2090,7 @@ void StartMoving(int x, int y) if (left || right) { - if (left && right && game_emulation != EMU_BOULDERDASH) + if (left && right && game.emulation != EMU_BOULDERDASH) left = !(right = RND(2)); InitMovingField(x, y, left ? MV_LEFT : MV_RIGHT); @@ -2429,22 +2422,24 @@ void ContinueMoving(int x, int y) else if (Store[x][y] == EL_SIEB_VOLL) { Store[x][y] = 0; - element = Feld[newx][newy] = (SiebAktiv ? EL_SIEB_VOLL : EL_SIEB_TOT); + element = Feld[newx][newy] = + (game.magic_wall_active ? EL_SIEB_VOLL : EL_SIEB_TOT); } else if (Store[x][y] == EL_SIEB_LEER) { Store[x][y] = Store2[x][y] = 0; - Feld[x][y] = (SiebAktiv ? EL_SIEB_LEER : EL_SIEB_TOT); + Feld[x][y] = (game.magic_wall_active ? EL_SIEB_LEER : EL_SIEB_TOT); } else if (Store[x][y] == EL_SIEB2_VOLL) { Store[x][y] = 0; - element = Feld[newx][newy] = (SiebAktiv ? EL_SIEB2_VOLL : EL_SIEB2_TOT); + element = Feld[newx][newy] = + (game.magic_wall_active ? EL_SIEB2_VOLL : EL_SIEB2_TOT); } else if (Store[x][y] == EL_SIEB2_LEER) { Store[x][y] = Store2[x][y] = 0; - Feld[x][y] = (SiebAktiv ? EL_SIEB2_LEER : EL_SIEB2_TOT); + Feld[x][y] = (game.magic_wall_active ? EL_SIEB2_LEER : EL_SIEB2_TOT); } else if (Store[x][y] == EL_SALZSAEURE) { @@ -2701,7 +2696,7 @@ void AmoebeAbleger(int ax, int ay) { 0, +1 } }; - if (!level.tempo_amoebe) + if (!level.amoeba_speed) { Feld[ax][ay] = EL_AMOEBE_TOT; DrawLevelField(ax, ay); @@ -2709,7 +2704,7 @@ void AmoebeAbleger(int ax, int ay) } if (!MovDelay[ax][ay]) /* start making new amoeba field */ - MovDelay[ax][ay] = RND(FRAMES_PER_SECOND * 25 / (1 + level.tempo_amoebe)); + MovDelay[ax][ay] = RND(FRAMES_PER_SECOND * 25 / (1 + level.amoeba_speed)); if (MovDelay[ax][ay]) /* wait some time before making new amoeba */ { @@ -2764,7 +2759,7 @@ void AmoebeAbleger(int ax, int ay) if (newax == ax && neway == ay) /* amoeba cannot grow */ { - if (i == 4 && (!waiting_for_player || game_emulation == EMU_BOULDERDASH)) + if (i == 4 && (!waiting_for_player || game.emulation == EMU_BOULDERDASH)) { Feld[ax][ay] = EL_AMOEBE_TOT; DrawLevelField(ax, ay); @@ -2775,7 +2770,7 @@ void AmoebeAbleger(int ax, int ay) if (element == EL_AMOEBE_VOLL) AmoebeUmwandeln(ax, ay); else if (element == EL_AMOEBE_BD) - AmoebeUmwandelnBD(ax, ay, level.amoebe_inhalt); + AmoebeUmwandelnBD(ax, ay, level.amoeba_content); } } return; @@ -2899,7 +2894,7 @@ void Life(int ax, int ay) void Ablenk(int x, int y) { if (!MovDelay[x][y]) /* next animation frame */ - MovDelay[x][y] = level.dauer_ablenk * FRAMES_PER_SECOND; + MovDelay[x][y] = level.time_wheel * FRAMES_PER_SECOND; if (MovDelay[x][y]) /* wait some time before next frame */ { @@ -3342,7 +3337,7 @@ static void PlayerActions(struct PlayerInfo *player, byte player_action) stored_player_action[player->index_nr] = 0; num_stored_actions++; - if (!player->active || player->gone || tape.pausing) + if (!player->active || tape.pausing) return; if (player_action) @@ -3509,7 +3504,7 @@ void GameActions() #ifdef DEBUG #if 0 - if (TimeFrames == 0 && !local_player->gone) + if (TimeFrames == 0 && local_player->active) { extern unsigned int last_RND(); @@ -3610,7 +3605,7 @@ void GameActions() else if (element == EL_SP_TERMINAL_ACTIVE) DrawGraphicAnimation(x, y, GFX2_SP_TERMINAL_ACTIVE, 7, 4, ANIM_NORMAL); - if (SiebAktiv) + if (game.magic_wall_active) { boolean sieb = FALSE; int jx = local_player->jx, jy = local_player->jy; @@ -3637,15 +3632,15 @@ void GameActions() } } - if (SiebAktiv) + if (game.magic_wall_active) { - if (!(SiebCount % 4)) + if (!(game.magic_wall_time_left % 4)) PlaySoundLevel(sieb_x, sieb_y, SND_MIEP); - if (SiebCount > 0) + if (game.magic_wall_time_left > 0) { - SiebCount--; - if (!SiebCount) + game.magic_wall_time_left--; + if (!game.magic_wall_time_left) { for (y=0; ygone || (!dx && !dy)) + if (!player->active || (!dx && !dy)) return MF_NO_ACTION; player->MovDir = (dx < 0 ? MV_LEFT : @@ -3860,7 +3854,7 @@ boolean MoveFigure(struct PlayerInfo *player, int dx, int dy) int old_jx = jx, old_jy = jy; int moved = MF_NO_ACTION; - if (player->gone || (!dx && !dy)) + if (!player->active || (!dx && !dy)) return FALSE; if (!FrameReached(&player->move_delay, player->move_delay_value) && @@ -4004,7 +3998,7 @@ boolean MoveFigure(struct PlayerInfo *player, int dx, int dy) TestIfHeroHitsBadThing(jx, jy); - if (player->gone) + if (!player->active) RemoveHero(player); return moved; @@ -4016,7 +4010,7 @@ void ScrollFigure(struct PlayerInfo *player, int mode) int last_jx = player->last_jx, last_jy = player->last_jy; int move_stepsize = TILEX / player->move_delay_value; - if (!player->active || player->gone || !player->MovPos) + if (!player->active || !player->MovPos) return; if (mode == SCROLL_INIT) @@ -4263,7 +4257,7 @@ void KillHero(struct PlayerInfo *player) { int jx = player->jx, jy = player->jy; - if (player->gone) + if (!player->active) return; if (IS_PFORTE(Feld[jx][jy])) @@ -4277,7 +4271,7 @@ void BuryHero(struct PlayerInfo *player) { int jx = player->jx, jy = player->jy; - if (player->gone) + if (!player->active) return; PlaySoundLevel(jx, jy, SND_AUTSCH); @@ -4292,11 +4286,13 @@ void RemoveHero(struct PlayerInfo *player) int jx = player->jx, jy = player->jy; int i, found = FALSE; - player->gone = TRUE; + player->present = FALSE; + player->active = FALSE; + StorePlayer[jx][jy] = 0; for (i=0; isokobanfields_still_needed == 0 && - game_emulation == EMU_SOKOBAN) + game.emulation == EMU_SOKOBAN) { player->LevelSolved = player->GameOver = TRUE; PlaySoundLevel(x, y, SND_BUING); @@ -4743,7 +4739,7 @@ boolean SnapField(struct PlayerInfo *player, int dx, int dy) int jx = player->jx, jy = player->jy; int x = jx + dx, y = jy + dy; - if (player->gone || !IN_LEV_FIELD(x, y)) + if (!player->active || !IN_LEV_FIELD(x, y)) return FALSE; if (dx && dy) @@ -4778,7 +4774,7 @@ boolean PlaceBomb(struct PlayerInfo *player) int jx = player->jx, jy = player->jy; int element; - if (player->gone || player->MovPos) + if (!player->active || player->MovPos) return FALSE; element = Feld[jx][jy]; @@ -4800,7 +4796,7 @@ boolean PlaceBomb(struct PlayerInfo *player) FS_SMALL, FC_YELLOW); if (IN_SCR_FIELD(SCREENX(jx), SCREENY(jy))) { - if (game_emulation == EMU_SUPAPLEX) + if (game.emulation == EMU_SUPAPLEX) DrawGraphic(SCREENX(jx), SCREENY(jy), GFX_SP_DISK_RED); else DrawGraphicThruMask(SCREENX(jx), SCREENY(jy), GFX_DYNAMIT); diff --git a/src/main.c b/src/main.c index 225f204f..d7508917 100644 --- a/src/main.c +++ b/src/main.c @@ -98,11 +98,6 @@ int SBY_Upper, SBY_Lower; int ZX,ZY, ExitX,ExitY; int AllPlayersGone; int FrameCounter, TimeFrames, TimePlayed, TimeLeft; -int MampferMax, MampferNr; -boolean SiebAktiv; -int SiebCount; - -int game_emulation = EMU_NONE; boolean network_player_action_received = FALSE; @@ -116,6 +111,8 @@ struct OptionInfo options; struct SetupInfo setup; struct SetupFileList *setup_list = NULL; struct SetupFileList *level_setup_list = NULL; +struct GameInfo game; +struct GlobalInfo global; /* data needed for playing sounds */ char *sound_name[NUM_SOUNDS] = diff --git a/src/main.h b/src/main.h index cb50eb5a..59f504f3 100644 --- a/src/main.h +++ b/src/main.h @@ -208,6 +208,11 @@ typedef unsigned char byte; #define MAX_ELEMENTS 512 #define MAX_NUM_AMOEBA 100 +/* values for elements with content */ +#define MIN_ELEMENT_CONTENTS 1 +#define STD_ELEMENT_CONTENTS 4 +#define MAX_ELEMENT_CONTENTS 8 + #define LEVEL_SCORE_ELEMENTS 16 /* level elements with score */ /* fundamental game speed values */ @@ -305,12 +310,6 @@ struct PlayerInfo byte programmed_action; /* action forced by game itself (like moving through doors); overrides other actions */ - -#if 0 - byte programmed_speed; /* speed (for only one move) forced by game */ -#endif - - int joystick_fd; /* file descriptor of player's joystick */ int jx,jy, last_jx,last_jy; @@ -318,7 +317,7 @@ struct PlayerInfo int Frame; boolean Pushing; - boolean gone, LevelSolved, GameOver; + boolean LevelSolved, GameOver; boolean snapped; unsigned long move_delay; @@ -348,15 +347,16 @@ struct LevelInfo int fieldx; int fieldy; int time; - int edelsteine; + int gems_needed; char name[MAX_LEVEL_NAME_LEN + 1]; char author[MAX_LEVEL_AUTHOR_LEN + 1]; int score[LEVEL_SCORE_ELEMENTS]; - int mampfer_inhalt[8][3][3]; - int tempo_amoebe; - int dauer_sieb; - int dauer_ablenk; - int amoebe_inhalt; + int yam_content[MAX_ELEMENT_CONTENTS][3][3]; + int num_yam_contents; + int amoeba_speed; + int amoeba_content; + int time_magic_wall; + int time_wheel; boolean double_speed; boolean gravity; }; @@ -396,6 +396,18 @@ struct TapeInfo } pos[MAX_TAPELEN]; }; +struct GameInfo +{ + int emulation; + int yam_content_nr; + boolean magic_wall_active; + int magic_wall_time_left; +}; + +struct GlobalInfo +{ +}; + extern Display *display; extern Visual *visual; extern int screen; @@ -463,12 +475,9 @@ extern int SBY_Upper, SBY_Lower; extern int ZX,ZY, ExitX,ExitY; extern int AllPlayersGone; extern int FrameCounter, TimeFrames, TimePlayed, TimeLeft; -extern int MampferMax, MampferNr; extern boolean SiebAktiv; extern int SiebCount; -extern int game_emulation; - extern boolean network_player_action_received; extern struct LevelDirInfo leveldir[]; @@ -482,6 +491,8 @@ extern struct OptionInfo options; extern struct SetupInfo setup; extern struct SetupFileList *setup_list; extern struct SetupFileList *level_setup_list; +extern struct GameInfo game; +extern struct GlobalInfo global; extern char *sound_name[]; extern int background_loop[]; diff --git a/src/misc.c b/src/misc.c index efa04a14..2200460a 100644 --- a/src/misc.c +++ b/src/misc.c @@ -579,46 +579,84 @@ void *checked_calloc(unsigned long size) return ptr; } -void getFileChunk(FILE *file, char *chunk_buffer, int *chunk_length, - int byte_order) +short getFile16BitInteger(FILE *file, int byte_order) { - const int chunk_identifier_length = 4; - - fgets(chunk_buffer, chunk_identifier_length + 1, file); + if (byte_order == BYTE_ORDER_BIG_ENDIAN) + return ((fgetc(file) << 8) | + (fgetc(file) << 0)); + else /* BYTE_ORDER_LITTLE_ENDIAN */ + return ((fgetc(file) << 0) | + (fgetc(file) << 8)); +} +void putFile16BitInteger(FILE *file, short value, int byte_order) +{ if (byte_order == BYTE_ORDER_BIG_ENDIAN) - *chunk_length = ((fgetc(file) << 24) | - (fgetc(file) << 16) | - (fgetc(file) << 8) | - (fgetc(file) << 0)); + { + fputc((value >> 8) & 0xff, file); + fputc((value >> 0) & 0xff, file); + } else /* BYTE_ORDER_LITTLE_ENDIAN */ - *chunk_length = ((fgetc(file) << 0) | - (fgetc(file) << 8) | - (fgetc(file) << 16) | - (fgetc(file) << 24)); + { + fputc((value >> 0) & 0xff, file); + fputc((value >> 8) & 0xff, file); + } } -void putFileChunk(FILE *file, char *chunk_name, int chunk_length, - int byte_order) +int getFile32BitInteger(FILE *file, int byte_order) { - fputs(chunk_name, file); + if (byte_order == BYTE_ORDER_BIG_ENDIAN) + return ((fgetc(file) << 24) | + (fgetc(file) << 16) | + (fgetc(file) << 8) | + (fgetc(file) << 0)); + else /* BYTE_ORDER_LITTLE_ENDIAN */ + return ((fgetc(file) << 0) | + (fgetc(file) << 8) | + (fgetc(file) << 16) | + (fgetc(file) << 24)); +} +void putFile32BitInteger(FILE *file, int value, int byte_order) +{ if (byte_order == BYTE_ORDER_BIG_ENDIAN) { - fputc((chunk_length >> 24) & 0xff, file); - fputc((chunk_length >> 16) & 0xff, file); - fputc((chunk_length >> 8) & 0xff, file); - fputc((chunk_length >> 0) & 0xff, file); + fputc((value >> 24) & 0xff, file); + fputc((value >> 16) & 0xff, file); + fputc((value >> 8) & 0xff, file); + fputc((value >> 0) & 0xff, file); } else /* BYTE_ORDER_LITTLE_ENDIAN */ { - fputc((chunk_length >> 0) & 0xff, file); - fputc((chunk_length >> 8) & 0xff, file); - fputc((chunk_length >> 16) & 0xff, file); - fputc((chunk_length >> 24) & 0xff, file); + fputc((value >> 0) & 0xff, file); + fputc((value >> 8) & 0xff, file); + fputc((value >> 16) & 0xff, file); + fputc((value >> 24) & 0xff, file); } } +void getFileChunk(FILE *file, char *chunk_buffer, int *chunk_length, + int byte_order) +{ + const int chunk_identifier_length = 4; + + /* read chunk identifier */ + fgets(chunk_buffer, chunk_identifier_length + 1, file); + + /* read chunk length */ + *chunk_length = getFile32BitInteger(file, byte_order); +} + +void putFileChunk(FILE *file, char *chunk_name, int chunk_length, + int byte_order) +{ + /* write chunk identifier */ + fputs(chunk_name, file); + + /* write chunk length */ + putFile32BitInteger(file, chunk_length, byte_order); +} + #define TRANSLATE_KEYSYM_TO_KEYNAME 0 #define TRANSLATE_KEYSYM_TO_X11KEYNAME 1 #define TRANSLATE_X11KEYNAME_TO_KEYSYM 2 diff --git a/src/misc.h b/src/misc.h index 004b7e43..d45fceba 100644 --- a/src/misc.h +++ b/src/misc.h @@ -37,7 +37,7 @@ #define ERR_EXIT_NETWORK_SERVER (ERR_EXIT | ERR_NETWORK_SERVER) #define ERR_EXIT_NETWORK_CLIENT (ERR_EXIT | ERR_NETWORK_CLIENT) -/* values for getFileChunk() and putFileChunk() */ +/* values for getFile...() and putFile...() */ #define BYTE_ORDER_BIG_ENDIAN 0 #define BYTE_ORDER_LITTLE_ENDIAN 1 @@ -64,6 +64,10 @@ void GetOptions(char **); void Error(int, char *, ...); void *checked_malloc(unsigned long); void *checked_calloc(unsigned long); +short getFile16BitInteger(FILE *, int); +void putFile16BitInteger(FILE *, short, int); +int getFile32BitInteger(FILE *, int); +void putFile32BitInteger(FILE *, int, int); void getFileChunk(FILE *, char *, int *, int); void putFileChunk(FILE *, char *, int, int); char *getKeyNameFromKeySym(KeySym); diff --git a/src/tools.c b/src/tools.c index 258c99a6..2626f2e4 100644 --- a/src/tools.c +++ b/src/tools.c @@ -460,8 +460,7 @@ void DrawPlayer(struct PlayerInfo *player) int graphic, phase; boolean player_is_moving = (last_jx != jx || last_jy != jy ? TRUE : FALSE); - if (!player->active || player->gone || - !IN_SCR_FIELD(SCREENX(last_jx), SCREENY(last_jy))) + if (!player->active || !IN_SCR_FIELD(SCREENX(last_jx), SCREENY(last_jy))) return; #if DEBUG @@ -524,7 +523,7 @@ void DrawPlayer(struct PlayerInfo *player) /* draw player himself */ - if (game_emulation == EMU_SUPAPLEX) + if (game.emulation == EMU_SUPAPLEX) { static int last_dir = MV_LEFT; int action = (player->programmed_action ? player->programmed_action : @@ -649,7 +648,7 @@ void DrawPlayer(struct PlayerInfo *player) phase = 7 - phase; } - if (game_emulation == EMU_SUPAPLEX) + if (game.emulation == EMU_SUPAPLEX) DrawGraphic(sx, sy, GFX_SP_DISK_RED); else DrawGraphicThruMask(sx, sy, graphic + phase); -- 2.34.1