X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=c7b99a3da5a5ca4a8e1030eb718503933cbdfd86;hb=34b9fd6b89ffe8fa0637840118b43e4d36bb1798;hp=802c9f5b7874dd4ae8c5641b9e4468c750f335f6;hpb=4b0f1eb4220d2dbe4cffb288f745661b32c96a5b;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 802c9f5b..c7b99a3d 100644 --- a/src/game.c +++ b/src/game.c @@ -23,39 +23,29 @@ #include "tape.h" #include "joystick.h" - - -int tst = 0; -int tst2 = 0; - - - -extern int GameSpeed; -extern int MoveSpeed; - void GetPlayerConfig() { int old_joystick_nr = joystick_nr; if (sound_status==SOUND_OFF) - player.setup &= ~SETUP_SOUND; + local_player->setup &= ~SETUP_SOUND; if (!sound_loops_allowed) { - player.setup &= ~SETUP_SOUND_LOOPS; - player.setup &= ~SETUP_SOUND_MUSIC; + local_player->setup &= ~SETUP_SOUND_LOOPS; + local_player->setup &= ~SETUP_SOUND_MUSIC; } - sound_on = sound_simple_on = SETUP_SOUND_ON(player.setup); - sound_loops_on = SETUP_SOUND_LOOPS_ON(player.setup); - sound_music_on = SETUP_SOUND_MUSIC_ON(player.setup); - toons_on = SETUP_TOONS_ON(player.setup); - direct_draw_on = SETUP_DIRECT_DRAW_ON(player.setup); - fading_on = SETUP_FADING_ON(player.setup); - autorecord_on = SETUP_AUTO_RECORD_ON(player.setup); - joystick_nr = SETUP_2ND_JOYSTICK_ON(player.setup); - quick_doors = SETUP_QUICK_DOORS_ON(player.setup); - scroll_delay_on = SETUP_SCROLL_DELAY_ON(player.setup); - soft_scrolling_on = SETUP_SOFT_SCROLL_ON(player.setup); + sound_on = sound_simple_on = SETUP_SOUND_ON(local_player->setup); + sound_loops_on = SETUP_SOUND_LOOPS_ON(local_player->setup); + sound_music_on = SETUP_SOUND_MUSIC_ON(local_player->setup); + toons_on = SETUP_TOONS_ON(local_player->setup); + direct_draw_on = SETUP_DIRECT_DRAW_ON(local_player->setup); + fading_on = SETUP_FADING_ON(local_player->setup); + autorecord_on = SETUP_AUTO_RECORD_ON(local_player->setup); + joystick_nr = SETUP_2ND_JOYSTICK_ON(local_player->setup); + quick_doors = SETUP_QUICK_DOORS_ON(local_player->setup); + scroll_delay_on = SETUP_SCROLL_DELAY_ON(local_player->setup); + soft_scrolling_on = SETUP_SOFT_SCROLL_ON(local_player->setup); #ifndef MSDOS if (joystick_nr != old_joystick_nr) @@ -73,12 +63,27 @@ void InitGame() BOOL emulate_bd = TRUE; /* unless non-BOULDERDASH elements found */ BOOL emulate_sb = TRUE; /* unless non-SOKOBAN elements found */ - Dynamite = Score = 0; - Gems = level.edelsteine; - SokobanFields = Lights = Friends = 0; - DynaBombCount = DynaBombSize = DynaBombsLeft = 0; - DynaBombXL = FALSE; - Key[0] = Key[1] = Key[2] = Key[3] = FALSE; + local_player->active = TRUE; + local_player->local = TRUE; + + actual_player = local_player; + + actual_player->score = 0; + + actual_player->gems_still_needed = level.edelsteine; + actual_player->sokobanfields_still_needed = 0; + actual_player->lights_still_needed = 0; + actual_player->friends_still_needed = 0; + + for(i=0; i<4; i++) + actual_player->key[i] = FALSE; + + actual_player->dynamite = 0; + actual_player->dynabomb_count = 0; + actual_player->dynabomb_size = 0; + actual_player->dynabombs_left = 0; + actual_player->dynabomb_xl = FALSE; + MampferNr = 0; FrameCounter = 0; TimeFrames = 0; @@ -120,6 +125,8 @@ void InitGame() JY = lastJY = y; break; case EL_SPIELER2: + case EL_SPIELER3: + case EL_SPIELER4: Feld[x][y] = EL_LEERRAUM; break; case EL_BADEWANNE: @@ -179,14 +186,14 @@ void InitGame() MovDelay[x][y] = 96; break; case EL_BIRNE_AUS: - Lights++; + local_player->lights_still_needed++; break; case EL_SOKOBAN_FELD_LEER: - SokobanFields++; + local_player->sokobanfields_still_needed++; break; case EL_MAULWURF: case EL_PINGUIN: - Friends++; + local_player->friends_still_needed++; break; case EL_SCHWEIN: case EL_DRACHE: @@ -222,13 +229,13 @@ void InitGame() int2str(level_nr,2),FS_SMALL,FC_YELLOW); DrawTextExt(pix[PIX_DB_DOOR],gc, DOOR_GFX_PAGEX1+XX_EMERALDS,DOOR_GFX_PAGEY1+YY_EMERALDS, - int2str(Gems,3),FS_SMALL,FC_YELLOW); + int2str(local_player->gems_still_needed,3),FS_SMALL,FC_YELLOW); DrawTextExt(pix[PIX_DB_DOOR],gc, DOOR_GFX_PAGEX1+XX_DYNAMITE,DOOR_GFX_PAGEY1+YY_DYNAMITE, - int2str(Dynamite,3),FS_SMALL,FC_YELLOW); + int2str(local_player->dynamite,3),FS_SMALL,FC_YELLOW); DrawTextExt(pix[PIX_DB_DOOR],gc, DOOR_GFX_PAGEX1+XX_SCORE,DOOR_GFX_PAGEY1+YY_SCORE, - int2str(Score,5),FS_SMALL,FC_YELLOW); + int2str(local_player->score,5),FS_SMALL,FC_YELLOW); DrawTextExt(pix[PIX_DB_DOOR],gc, DOOR_GFX_PAGEX1+XX_TIME,DOOR_GFX_PAGEY1+YY_TIME, int2str(TimeLeft,3),FS_SMALL,FC_YELLOW); @@ -371,21 +378,21 @@ void GameWon() if (TimeLeft) { if (sound_loops_on) - PlaySoundExt(SND_SIRR,PSND_MAX_VOLUME,PSND_MAX_RIGHT,PSND_LOOP); + PlaySoundExt(SND_SIRR, PSND_MAX_VOLUME, PSND_MAX_RIGHT, PSND_LOOP); - while(TimeLeft>0) + while(TimeLeft > 0) { if (!sound_loops_on) - PlaySoundStereo(SND_SIRR,PSND_MAX_RIGHT); + PlaySoundStereo(SND_SIRR, PSND_MAX_RIGHT); if (TimeLeft && !(TimeLeft % 10)) RaiseScore(level.score[SC_ZEITBONUS]); if (TimeLeft > 100 && !(TimeLeft % 10)) TimeLeft -= 10; else TimeLeft--; - DrawText(DX_TIME,DY_TIME,int2str(TimeLeft,3),FS_SMALL,FC_YELLOW); + DrawText(DX_TIME, DY_TIME, int2str(TimeLeft,3), FS_SMALL, FC_YELLOW); BackToFront(); - Delay(10000); + Delay(10); } if (sound_loops_on) @@ -395,7 +402,7 @@ void GameWon() FadeSounds(); /* Hero disappears */ - DrawLevelElement(ExitX,ExitY,Feld[ExitX][ExitY]); + DrawLevelField(ExitX, ExitY); BackToFront(); if (tape.playing) @@ -409,15 +416,15 @@ void GameWon() SaveLevelTape(tape.level_nr); /* Ask to save tape */ } - if (level_nr==player.handicap && - level_nrhandicap && + level_nr < leveldir[leveldir_nr].levels-1) { - player.handicap++; + local_player->handicap++; bumplevel = TRUE; SavePlayerInfo(PLAYER_LEVEL); } - if ((hi_pos=NewHiScore())>=0) + if ((hi_pos=NewHiScore()) >= 0) { game_status = HALLOFFAME; DrawHallOfFame(hi_pos); @@ -442,21 +449,23 @@ BOOL NewHiScore() LoadScore(level_nr); - if (!strcmp(player.alias_name,EMPTY_ALIAS) || - Scorealias_name,EMPTY_ALIAS) || + local_player->score < highscore[MAX_SCORE_ENTRIES-1].Score) return(-1); for(k=0;khighscore[k].Score) /* Spieler kommt in Highscore-Liste */ + if (local_player->score > highscore[k].Score) { + /* Spieler kommt in Highscore-Liste */ + if (kalias_name,highscore[l].Name)) m = l; if (m==k) /* Spieler überschreibt seine alte Position */ goto put_into_list; @@ -472,14 +481,14 @@ BOOL NewHiScore() #ifdef ONE_PER_NAME put_into_list: #endif - sprintf(highscore[k].Name,player.alias_name); - highscore[k].Score = Score; + sprintf(highscore[k].Name,local_player->alias_name); + highscore[k].Score = local_player->score; position = k; break; } #ifdef ONE_PER_NAME - else if (!strcmp(player.alias_name,highscore[k].Name)) + else if (!strcmp(local_player->alias_name,highscore[k].Name)) break; /* Spieler schon mit besserer Punktzahl in der Liste */ #endif @@ -498,7 +507,7 @@ void InitMovingField(int x, int y, int direction) MovDir[x][y] = direction; MovDir[newx][newy] = direction; - if (Feld[newx][newy]==EL_LEERRAUM) + if (Feld[newx][newy] == EL_LEERRAUM) Feld[newx][newy] = EL_BLOCKED; } @@ -802,12 +811,12 @@ void DynaExplode(int ex, int ey, int size) if (element != EL_LEERRAUM && element != EL_ERDREICH && element != EL_EXPLODING && - !DynaBombXL) + !actual_player->dynabomb_xl) break; } } - DynaBombsLeft++; + actual_player->dynabombs_left++; } void Bang(int x, int y) @@ -833,7 +842,7 @@ void Bang(int x, int y) case EL_DYNABOMB_NR: case EL_DYNABOMB_SZ: case EL_DYNABOMB_XL: - DynaExplode(x,y,DynaBombSize); + DynaExplode(x,y,actual_player->dynabomb_size); break; case EL_BIRNE_AUS: case EL_BIRNE_EIN: @@ -875,7 +884,7 @@ void Blurb(int x, int y) if (MovDelay[x][y]) /* neue Phase / in Wartezustand */ { MovDelay[x][y]--; - if (MovDelay[x][y] && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) + if (MovDelay[x][y]/2 && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) DrawGraphic(SCROLLX(x),SCROLLY(y),graphic+4-MovDelay[x][y]/2); if (!MovDelay[x][y]) @@ -1657,8 +1666,8 @@ void StartMoving(int x, int y) if (IN_SCR_FIELD(SCROLLX(newx),SCROLLY(newy))) DrawGraphicThruMask(SCROLLX(newx),SCROLLY(newy),el2gfx(element)); - Friends--; - if (!Friends && PlayerGone && !GameOver) + local_player->friends_still_needed--; + if (!local_player->friends_still_needed && PlayerGone && !GameOver) LevelSolved = GameOver = TRUE; return; @@ -1791,7 +1800,13 @@ void StartMoving(int x, int y) else if (element == EL_BUTTERFLY || element == EL_FIREFLY) DrawGraphicAnimation(x,y, el2gfx(element), 2, 4, ANIM_NORMAL); else if (element==EL_SONDE) - DrawGraphicAnimation(x,y, GFX_SONDE_START, 8, 2, ANIM_NORMAL); + { + int nextJX = JX + (JX - lastJX); + int nextJY = JY + (JY - lastJY); + + if (!(PlayerPushing && PlayerGfxPos && x == nextJX && y == nextJY)) + DrawGraphicAnimation(x,y, GFX_SONDE_START, 8, 2, ANIM_NORMAL); + } return; } @@ -2045,7 +2060,7 @@ void AmoebeWaechst(int x, int y) { MovDelay[x][y] = 7; - if (DelayReached(&sound_delay,sound_delay_value)) + if (DelayReached(&sound_delay, sound_delay_value)) { PlaySoundLevel(x,y,SND_AMOEBE); sound_delay_value = 30; @@ -2055,7 +2070,7 @@ void AmoebeWaechst(int x, int y) if (MovDelay[x][y]) /* neue Phase / in Wartezustand */ { MovDelay[x][y]--; - if (MovDelay[x][y] && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) + if (MovDelay[x][y]/2 && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) DrawGraphic(SCROLLX(x),SCROLLY(y),GFX_AMOEBING+3-MovDelay[x][y]/2); if (!MovDelay[x][y]) @@ -2316,7 +2331,10 @@ void Birne(int x, int y) void Blubber(int x, int y) { - DrawGraphicAnimation(x,y, GFX_GEBLUBBER, 4, 10, ANIM_NORMAL); + if (y > 0 && IS_MOVING(x,y-1) && MovDir[x][y-1] == MV_DOWN) + DrawLevelField(x,y-1); + else + DrawGraphicAnimation(x,y, GFX_GEBLUBBER, 4, 10, ANIM_NORMAL); } void NussKnacken(int x, int y) @@ -2327,7 +2345,7 @@ void NussKnacken(int x, int y) if (MovDelay[x][y]) /* neue Phase / in Wartezustand */ { MovDelay[x][y]--; - if (MovDelay[x][y] && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) + if (MovDelay[x][y]/2 && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) DrawGraphic(SCROLLX(x),SCROLLY(y),GFX_CRACKINGNUT+3-MovDelay[x][y]/2); if (!MovDelay[x][y]) @@ -2340,14 +2358,16 @@ void NussKnacken(int x, int y) void SiebAktivieren(int x, int y, int typ) { - if (SiebAktiv%2 && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) + if (!(SiebAktiv % 4) && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) DrawGraphic(SCROLLX(x),SCROLLY(y), - (typ==1 ? GFX_SIEB_VOLL : GFX_SIEB2_VOLL)+3-(SiebAktiv%8)/2); + (typ==1 ? GFX_SIEB_VOLL : GFX_SIEB2_VOLL)+3-(SiebAktiv%16)/4); } void AusgangstuerPruefen(int x, int y) { - if (!Gems && !SokobanFields && !Lights) + if (!local_player->gems_still_needed && + !local_player->sokobanfields_still_needed && + !local_player->lights_still_needed) { Feld[x][y] = EL_AUSGANG_ACT; @@ -2413,14 +2433,25 @@ void EdelsteinFunkeln(int x, int y) int src_x,src_y, dest_x,dest_y; int phase = (MovDelay[x][y]-1)/2; - src_x = SX+GFX_PER_LINE*TILEX; - src_y = SY+(phase > 2 ? 4-phase : phase)*TILEY; - dest_x = FX+SCROLLX(x)*TILEX; - dest_y = FY+SCROLLY(y)*TILEY; + if (phase > 2) + phase = 4-phase; + src_x = SX + GFX_PER_LINE*TILEX; + src_y = SY + phase*TILEY; + dest_x = FX + SCROLLX(x)*TILEX; + dest_y = FY + SCROLLY(y)*TILEY; + + /* XSetClipOrigin(display,clip_gc[PIX_BACK],dest_x-src_x,dest_y-src_y); XCopyArea(display,pix[PIX_BACK],drawto_field,clip_gc[PIX_BACK], src_x,src_y, TILEX,TILEY, dest_x,dest_y); + */ + + XSetClipMask(display, tile_clip_gc, + tile_clipmask[GFX_MASK_SPARKLING + phase]); + XSetClipOrigin(display, tile_clip_gc, dest_x,dest_y); + XCopyArea(display, pix[PIX_BACK], drawto_field, tile_clip_gc, + src_x,src_y, TILEX,TILEY, dest_x,dest_y); if (direct_draw_on) { @@ -2570,247 +2601,154 @@ void GameActions() { static long action_delay = 0; long action_delay_value; + int sieb_x = 0, sieb_y = 0; + int x, y, element; if (game_status != PLAYING) return; -/* +#ifdef DEBUG action_delay_value = - (tape.playing && tape.fast_forward ? FFWD_FRAME_DELAY : GAME_FRAME_DELAY); -*/ - + (tape.playing && tape.fast_forward ? FFWD_FRAME_DELAY : GameFrameDelay); +#else action_delay_value = - (tape.playing && tape.fast_forward ? FFWD_FRAME_DELAY : GameSpeed); - - /* - if (DelayReached(&action_delay, action_delay_value)) - */ - - + (tape.playing && tape.fast_forward ? FFWD_FRAME_DELAY : GAME_FRAME_DELAY); +#endif if (PlayerMovPos) ScrollFigure(0); - DrawPlayerField(); - - - - - tst++; + /* main game synchronization point */ + WaitUntilDelayReached(&action_delay, action_delay_value); - if (0) - { - static long last_Counter = 0; - long new_Counter = Counter(); - - printf("--> %ld / %ld [%d]\n", - new_Counter - last_Counter, - new_Counter, - FrameCounter); - last_Counter = new_Counter; - } - - - - - /* - if (!DelayReached(&action_delay, action_delay_value)) + if (tape.pausing || (tape.playing && !TapePlayDelay())) return; - */ - - - while(!DelayReached(&action_delay, action_delay_value)) - Delay(1000); - - - - - /* - printf("-----------\n"); - */ - - + else if (tape.recording) + TapeRecordDelay(); FrameCounter++; + TimeFrames++; - - - /* - if (PlayerMovPos) - ScrollFigure(0); - - DrawPlayerField(); - */ - - - tst2 = tst; - tst = 0; - - - - if (0) + for(y=0;y %ld / %ld [%d]\n", - new_Counter - last_Counter, - new_Counter, - FrameCounter); - last_Counter = new_Counter; - } + Stop[x][y] = FALSE; + if (JustHit[x][y]>0) + JustHit[x][y]--; - - /* - printf("--> %ld / ", Counter()); - */ - - - { - int x,y,element; - int sieb_x = 0, sieb_y = 0; - - if (tape.pausing || (tape.playing && !TapePlayDelay())) - return; - else if (tape.recording) - TapeRecordDelay(); - - - /* - FrameCounter++; - */ - - - TimeFrames++; - - for(y=0;y0) - JustHit[x][y]--; + int oldx,oldy; -#if DEBUG - if (IS_BLOCKED(x,y)) + Blocked2Moving(x,y,&oldx,&oldy); + if (!IS_MOVING(oldx,oldy)) { - int oldx,oldy; - - Blocked2Moving(x,y,&oldx,&oldy); - if (!IS_MOVING(oldx,oldy)) - { - printf("GameActions(): (BLOCKED=>MOVING) context corrupted!\n"); - printf("GameActions(): BLOCKED: x = %d, y = %d\n",x,y); - printf("GameActions(): !MOVING: oldx = %d, oldy = %d\n",oldx,oldy); - printf("GameActions(): This should never happen!\n"); - } + printf("GameActions(): (BLOCKED=>MOVING) context corrupted!\n"); + printf("GameActions(): BLOCKED: x = %d, y = %d\n",x,y); + printf("GameActions(): !MOVING: oldx = %d, oldy = %d\n",oldx,oldy); + printf("GameActions(): This should never happen!\n"); } + } #endif + } - } + for(y=0;y0 && TimeFrames>=(100/GameSpeed) && !tape.pausing) + if (TimeLeft>0 && TimeFrames>=(1000/GameFrameDelay) && !tape.pausing) { TimeFrames = 0; TimeLeft--; @@ -2828,8 +2766,6 @@ void GameActions() } DrawPlayerField(); - - BackToFront(); } void ScrollLevel(int dx, int dy) @@ -2985,79 +2921,23 @@ BOOL MoveFigure(int dx, int dy) void ScrollFigure(int init) { static long actual_frame_counter = 0; - static int oldJX = -1, oldJY = -1; if (init) { - - - PlayerGfxPos = ScrollStepSize * (PlayerMovPos / ScrollStepSize); - - + actual_frame_counter = FrameCounter; /* - ScreenMovPos = PlayerGfxPos; - redraw_mask |= REDRAW_FIELD; - */ - - - - if (0) - { - static long last_Counter = 0; - long new_Counter = Counter(); - - printf("--> %ld / %ld [%d, %d]\n", - new_Counter - last_Counter, - new_Counter, - FrameCounter, - tst2); - last_Counter = new_Counter; - } - - - - - if (oldJX != -1 && oldJY != -1) - DrawLevelElement(oldJX,oldJY, Feld[oldJX][oldJY]); - if (Feld[lastJX][lastJY] == EL_LEERRAUM && IN_LEV_FIELD(lastJX,lastJY-1) && CAN_FALL(Feld[lastJX][lastJY-1])) Feld[lastJX][lastJY] = EL_PLAYER_IS_LEAVING; - DrawLevelElement(lastJX,lastJY, Feld[lastJX][lastJY]); - DrawPlayerField(); - - oldJX = lastJX; - oldJY = lastJY; - actual_frame_counter = FrameCounter; - - if (PlayerPushing) - { - int nextJX = JX + (JX - lastJX); - int nextJY = JY + (JY - lastJY); + */ - if (Feld[nextJX][nextJY] == EL_SOKOBAN_FELD_VOLL) - DrawLevelElement(nextJX,nextJY, EL_SOKOBAN_FELD_LEER); - else - DrawLevelElement(nextJX,nextJY, EL_LEERRAUM); - } + if (Feld[lastJX][lastJY] == EL_LEERRAUM) + Feld[lastJX][lastJY] = EL_PLAYER_IS_LEAVING; DrawPlayerField(); - - if (Store[lastJX][lastJY]) - { - DrawGraphic(SCROLLX(lastJX),SCROLLY(lastJY), - el2gfx(Store[lastJX][lastJY])); - DrawGraphicThruMask(SCROLLX(lastJX),SCROLLY(lastJY), - el2gfx(Feld[lastJX][lastJY])); - } - else if (Feld[lastJX][lastJY]==EL_DYNAMIT) - DrawDynamite(lastJX,lastJY); - else - DrawLevelField(lastJX,lastJY); - return; } else if (!FrameReached(&actual_frame_counter,1)) @@ -3066,59 +2946,21 @@ void ScrollFigure(int init) PlayerMovPos += (PlayerMovPos > 0 ? -1 : 1) * TILEX/8; PlayerGfxPos = ScrollStepSize * (PlayerMovPos / ScrollStepSize); - - /* - printf("PlayerGfxPos = %d\n", PlayerGfxPos); - */ - - if (ScreenMovPos && ScreenMovPos != PlayerGfxPos) { ScreenMovPos = PlayerGfxPos; redraw_mask |= REDRAW_FIELD; } - if (Feld[oldJX][oldJY] == EL_PLAYER_IS_LEAVING) - Feld[oldJX][oldJY] = EL_LEERRAUM; + if (Feld[lastJX][lastJY] == EL_PLAYER_IS_LEAVING) + Feld[lastJX][lastJY] = EL_LEERRAUM; - DrawLevelElement(oldJX,oldJY, Feld[oldJX][oldJY]); DrawPlayerField(); - - - if (Store[oldJX][oldJY]) - { - DrawGraphic(SCROLLX(oldJX),SCROLLY(oldJY),el2gfx(Store[oldJX][oldJY])); - DrawGraphicThruMask(SCROLLX(oldJX),SCROLLY(oldJY), - el2gfx(Feld[oldJX][oldJY])); - } - else if (Feld[oldJX][oldJY]==EL_DYNAMIT) - DrawDynamite(oldJX,oldJY); - else - DrawLevelField(oldJX,oldJY); - - if (PlayerPushing) - { - int nextJX = JX + (JX - lastJX); - int nextJY = JY + (JY - lastJY); - - if (PlayerGfxPos) - { - if (Feld[nextJX][nextJY] == EL_SOKOBAN_FELD_VOLL) - DrawLevelElement(nextJX,nextJY, EL_SOKOBAN_FELD_LEER); - else - DrawLevelElement(nextJX,nextJY, EL_LEERRAUM); - } - else - DrawLevelElement(nextJX,nextJY, Feld[nextJX][nextJY]); - } - if (!PlayerMovPos) { lastJX = JX; lastJY = JY; - - oldJX = oldJY = -1; } } @@ -3340,49 +3182,55 @@ int DigField(int x, int y, int real_dx, int real_dy, int mode) case EL_EDELSTEIN_LILA: Feld[x][y] = EL_LEERRAUM; MovDelay[x][y] = 0; /* wegen EDELSTEIN_BD-Funkeln! */ - if (Gems>0) - Gems--; + if (local_player->gems_still_needed > 0) + local_player->gems_still_needed--; RaiseScoreElement(EL_EDELSTEIN); - DrawText(DX_EMERALDS,DY_EMERALDS,int2str(Gems,3),FS_SMALL,FC_YELLOW); - PlaySoundLevel(x,y,SND_PONG); + DrawText(DX_EMERALDS, DY_EMERALDS, + int2str(local_player->gems_still_needed, 3), + FS_SMALL, FC_YELLOW); + PlaySoundLevel(x, y, SND_PONG); break; case EL_DIAMANT: Feld[x][y] = EL_LEERRAUM; - Gems -= 3; - if (Gems<0) - Gems=0; + local_player->gems_still_needed -= 3; + if (local_player->gems_still_needed < 0) + local_player->gems_still_needed = 0; RaiseScoreElement(EL_DIAMANT); - DrawText(DX_EMERALDS,DY_EMERALDS,int2str(Gems,3),FS_SMALL,FC_YELLOW); - PlaySoundLevel(x,y,SND_PONG); + DrawText(DX_EMERALDS, DY_EMERALDS, + int2str(local_player->gems_still_needed, 3), + FS_SMALL, FC_YELLOW); + PlaySoundLevel(x, y, SND_PONG); break; case EL_DYNAMIT_AUS: Feld[x][y] = EL_LEERRAUM; - Dynamite++; + actual_player->dynamite++; RaiseScoreElement(EL_DYNAMIT); - DrawText(DX_DYNAMITE,DY_DYNAMITE,int2str(Dynamite,3),FS_SMALL,FC_YELLOW); + DrawText(DX_DYNAMITE, DY_DYNAMITE, + int2str(local_player->dynamite, 3), + FS_SMALL, FC_YELLOW); PlaySoundLevel(x,y,SND_PONG); break; case EL_DYNABOMB_NR: Feld[x][y] = EL_LEERRAUM; - DynaBombCount++; - DynaBombsLeft++; + actual_player->dynabomb_count++; + actual_player->dynabombs_left++; RaiseScoreElement(EL_DYNAMIT); PlaySoundLevel(x,y,SND_PONG); break; case EL_DYNABOMB_SZ: Feld[x][y] = EL_LEERRAUM; - DynaBombSize++; + actual_player->dynabomb_size++; RaiseScoreElement(EL_DYNAMIT); PlaySoundLevel(x,y,SND_PONG); break; case EL_DYNABOMB_XL: Feld[x][y] = EL_LEERRAUM; - DynaBombXL = TRUE; + actual_player->dynabomb_xl = TRUE; RaiseScoreElement(EL_DYNAMIT); PlaySoundLevel(x,y,SND_PONG); break; @@ -3395,14 +3243,14 @@ int DigField(int x, int y, int real_dx, int real_dy, int mode) int key_nr = element-EL_SCHLUESSEL1; Feld[x][y] = EL_LEERRAUM; - Key[key_nr] = TRUE; + actual_player->key[key_nr] = TRUE; RaiseScoreElement(EL_SCHLUESSEL); - DrawMiniGraphicExtHiRes(drawto,gc, - DX_KEYS+key_nr*MINI_TILEX,DY_KEYS, - GFX_SCHLUESSEL1+key_nr); - DrawMiniGraphicExtHiRes(window,gc, - DX_KEYS+key_nr*MINI_TILEX,DY_KEYS, - GFX_SCHLUESSEL1+key_nr); + DrawMiniGraphicExt(drawto,gc, + DX_KEYS+key_nr*MINI_TILEX,DY_KEYS, + GFX_SCHLUESSEL1+key_nr); + DrawMiniGraphicExt(window,gc, + DX_KEYS+key_nr*MINI_TILEX,DY_KEYS, + GFX_SCHLUESSEL1+key_nr); PlaySoundLevel(x,y,SND_PONG); break; } @@ -3456,7 +3304,7 @@ int DigField(int x, int y, int real_dx, int real_dy, int mode) case EL_PFORTE2: case EL_PFORTE3: case EL_PFORTE4: - if (!Key[element-EL_PFORTE1]) + if (!actual_player->key[element-EL_PFORTE1]) return(MF_NO_ACTION); break; @@ -3464,7 +3312,7 @@ int DigField(int x, int y, int real_dx, int real_dy, int mode) case EL_PFORTE2X: case EL_PFORTE3X: case EL_PFORTE4X: - if (!Key[element-EL_PFORTE1X]) + if (!actual_player->key[element-EL_PFORTE1X]) return(MF_NO_ACTION); break; @@ -3481,14 +3329,14 @@ int DigField(int x, int y, int real_dx, int real_dy, int mode) PlayerGone = TRUE; PlaySoundLevel(x,y,SND_BUING); - if (!Friends) + if (!local_player->friends_still_needed) LevelSolved = GameOver = TRUE; break; case EL_BIRNE_AUS: Feld[x][y] = EL_BIRNE_EIN; - Lights--; + local_player->lights_still_needed--; DrawLevelField(x,y); PlaySoundLevel(x,y,SND_DENG); return(MF_ACTION); @@ -3541,7 +3389,7 @@ int DigField(int x, int y, int real_dx, int real_dy, int mode) if (element == EL_SOKOBAN_FELD_VOLL) { Feld[x][y] = EL_SOKOBAN_FELD_LEER; - SokobanFields++; + local_player->sokobanfields_still_needed++; } else Feld[x][y] = EL_LEERRAUM; @@ -3549,7 +3397,7 @@ int DigField(int x, int y, int real_dx, int real_dy, int mode) if (Feld[x+dx][y+dy] == EL_SOKOBAN_FELD_LEER) { Feld[x+dx][y+dy] = EL_SOKOBAN_FELD_VOLL; - SokobanFields--; + local_player->sokobanfields_still_needed--; if (element == EL_SOKOBAN_OBJEKT) PlaySoundLevel(x,y,SND_DENG); } @@ -3569,7 +3417,8 @@ int DigField(int x, int y, int real_dx, int real_dy, int mode) PlaySoundLevel(x+dx,y+dy,SND_PUSCH); if (IS_SB_ELEMENT(element) && - SokobanFields == 0 && game_emulation == EMU_SOKOBAN) + local_player->sokobanfields_still_needed == 0 && + game_emulation == EMU_SOKOBAN) { LevelSolved = GameOver = TRUE; PlaySoundLevel(x,y,SND_BUING); @@ -3634,26 +3483,28 @@ BOOL PlaceBomb(void) element = Feld[JX][JY]; - if ((Dynamite==0 && DynaBombsLeft==0) || + if ((actual_player->dynamite==0 && actual_player->dynabombs_left==0) || element==EL_DYNAMIT || element==EL_DYNABOMB || element==EL_EXPLODING) return(FALSE); if (element != EL_LEERRAUM) Store[JX][JY] = element; - if (Dynamite) + if (actual_player->dynamite) { Feld[JX][JY] = EL_DYNAMIT; MovDelay[JX][JY] = 96; - Dynamite--; - DrawText(DX_DYNAMITE,DY_DYNAMITE,int2str(Dynamite,3),FS_SMALL,FC_YELLOW); + actual_player->dynamite--; + DrawText(DX_DYNAMITE, DY_DYNAMITE, + int2str(local_player->dynamite, 3), + FS_SMALL, FC_YELLOW); DrawGraphicThruMask(SCROLLX(JX),SCROLLY(JY),GFX_DYNAMIT); } else { Feld[JX][JY] = EL_DYNABOMB; MovDelay[JX][JY] = 96; - DynaBombsLeft--; + actual_player->dynabombs_left--; DrawGraphicThruMask(SCROLLX(JX),SCROLLY(JY),GFX_DYNABOMB); } @@ -3697,8 +3548,10 @@ void PlaySoundLevel(int x, int y, int sound_nr) void RaiseScore(int value) { - Score += value; - DrawText(DX_SCORE,DY_SCORE,int2str(Score,5),FS_SMALL,FC_YELLOW); + local_player->score += value; + DrawText(DX_SCORE, DY_SCORE, + int2str(local_player->score, 5), + FS_SMALL, FC_YELLOW); } void RaiseScoreElement(int element)