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)
void InitGame()
{
- int i,x,y;
+ int i, x,y;
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;
+ for(i=0; i<MAX_PLAYERS; i++)
+ stored_player[i].active = FALSE;
+
+ local_player->nr = 1;
+ local_player->active = TRUE;
+ local_player->local = TRUE;
+
+ player = local_player;
+
+ player->score = 0;
+ player->gems_still_needed = level.edelsteine;
+ player->sokobanfields_still_needed = 0;
+ player->lights_still_needed = 0;
+ player->friends_still_needed = 0;
+
+ for(i=0; i<4; i++)
+ player->key[i] = FALSE;
+
+ player->dynamite = 0;
+ player->dynabomb_count = 0;
+ player->dynabomb_size = 0;
+ player->dynabombs_left = 0;
+ player->dynabomb_xl = FALSE;
+
MampferNr = 0;
FrameCounter = 0;
TimeFrames = 0;
TimeLeft = level.time;
ScreenMovPos = 0;
- PlayerMovDir = MV_NO_MOVING;
- PlayerMovPos = 0;
- PlayerGfxPos = 0;
- PlayerFrame = 0;
- PlayerPushing = FALSE;
- PlayerGone = LevelSolved = GameOver = SiebAktiv = FALSE;
+
+ player->MovDir = MV_NO_MOVING;
+ player->MovPos = 0;
+ player->Pushing = FALSE;
+ player->GfxPos = 0;
+ player->Frame = 0;
+
+ player->frame_reset_delay = 0;
+
+ player->push_delay = 0;
+ player->push_delay_value = 5;
+
+ player->move_delay = 0;
+ player->last_move_dir = MV_NO_MOVING;
+
+ player->lastJX = player->lastJY = 0;
+ player->JX = player->JY = 0;
+
+ lastJX = lastJY = 0;
JX = JY = 0;
ZX = ZY = -1;
+
+ /* test */
+ for(i=1; i<MAX_PLAYERS; i++)
+ {
+ stored_player[i] = stored_player[0];
+ stored_player[i].nr = i+1;
+ stored_player[i].active = TRUE;
+ stored_player[i].local = FALSE;
+ }
+
+
+
+ PlayerGone = LevelSolved = GameOver = SiebAktiv = FALSE;
+
DigField(0,0,0,0,DF_NO_PUSH);
SnapField(0,0);
{
Feld[x][y] = Ur[x][y];
MovPos[x][y] = MovDir[x][y] = MovDelay[x][y] = 0;
- Store[x][y] = Store2[x][y] = Frame[x][y] = AmoebaNr[x][y] = 0;
+ Store[x][y] = Store2[x][y] = StorePlayer[x][y] = 0;
+ Frame[x][y] = 0;
+ AmoebaNr[x][y] = 0;
JustHit[x][y] = 0;
if (emulate_bd && !IS_BD_ELEMENT(Feld[x][y]))
{
case EL_SPIELFIGUR:
case EL_SPIELER1:
+ StorePlayer[x][y] = EL_SPIELER1;
Feld[x][y] = EL_LEERRAUM;
JX = lastJX = x;
JY = lastJY = y;
+
+ player->JX = JX;
+ player->JY = JY;
+ player->lastJX = lastJX;
+ player->lastJY = lastJY;
+
break;
case EL_SPIELER2:
+ case EL_SPIELER3:
+ case EL_SPIELER4:
+ StorePlayer[x][y] = Feld[x][y];
Feld[x][y] = EL_LEERRAUM;
+
+ stored_player[StorePlayer[x][y] - EL_SPIELER1].JX = x;
+ stored_player[StorePlayer[x][y] - EL_SPIELER1].JY = y;
+ stored_player[StorePlayer[x][y] - EL_SPIELER1].lastJX = x;
+ stored_player[StorePlayer[x][y] - EL_SPIELER1].lastJY = y;
+
break;
case EL_BADEWANNE:
if (x<lev_fieldx-1 && Feld[x+1][y]==EL_SALZSAEURE)
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:
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);
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(10);
}
FadeSounds();
/* Hero disappears */
- DrawLevelElement(ExitX,ExitY,Feld[ExitX][ExitY]);
+ DrawLevelField(ExitX, ExitY);
BackToFront();
if (tape.playing)
SaveLevelTape(tape.level_nr); /* Ask to save tape */
}
- if (level_nr==player.handicap &&
- level_nr<leveldir[leveldir_nr].levels-1)
+ if (level_nr == local_player->handicap &&
+ 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);
LoadScore(level_nr);
- if (!strcmp(player.alias_name,EMPTY_ALIAS) ||
- Score<highscore[MAX_SCORE_ENTRIES-1].Score)
+ if (!strcmp(local_player->alias_name,EMPTY_ALIAS) ||
+ local_player->score < highscore[MAX_SCORE_ENTRIES-1].Score)
return(-1);
for(k=0;k<MAX_SCORE_ENTRIES;k++)
{
- if (Score>highscore[k].Score) /* Spieler kommt in Highscore-Liste */
+ if (local_player->score > highscore[k].Score)
{
+ /* Spieler kommt in Highscore-Liste */
+
if (k<MAX_SCORE_ENTRIES-1)
{
int m = MAX_SCORE_ENTRIES-1;
#ifdef ONE_PER_NAME
for(l=k;l<MAX_SCORE_ENTRIES;l++)
- if (!strcmp(player.alias_name,highscore[l].Name))
+ if (!strcmp(local_player->alias_name,highscore[l].Name))
m = l;
if (m==k) /* Spieler überschreibt seine alte Position */
goto put_into_list;
#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
if (element != EL_LEERRAUM &&
element != EL_ERDREICH &&
element != EL_EXPLODING &&
- !DynaBombXL)
+ !player->dynabomb_xl)
break;
}
}
- DynaBombsLeft++;
+ player->dynabombs_left++;
}
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,player->dynabomb_size);
break;
case EL_BIRNE_AUS:
case EL_BIRNE_EIN:
if (CAN_FALL(element) && y<lev_fieldy-1)
{
- if (PlayerPushing && PlayerMovPos)
+ /* check if this element is just being pushed */
+ if ((x>0 && IS_PLAYER(x-1,y)) || (x<lev_fieldx-1 && IS_PLAYER(x+1,y)))
{
- int nextJX = JX + (JX - lastJX);
- int nextJY = JY + (JY - lastJY);
+ int i;
- if (x == nextJX && y == nextJY)
- return;
+ for(i=0; i<MAX_PLAYERS; i++)
+ {
+ struct PlayerInfo *pl = &stored_player[i];
+
+ if (pl->active && pl->Pushing && pl->MovPos)
+ {
+ int nextJX = pl->JX + (pl->JX - pl->lastJX);
+ int nextJY = pl->JY + (pl->JY - pl->lastJY);
+
+ if (x == nextJX && y == nextJY)
+ return;
+ }
+ }
}
if (element==EL_MORAST_VOLL)
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;
else if (!IS_FREE(newx,newy))
{
if (IS_PLAYER(x,y))
- DrawPlayerField();
+ DrawPlayerField(x,y);
else
DrawLevelField(x,y);
return;
else if (!IS_FREE(newx,newy))
{
if (IS_PLAYER(x,y))
- DrawPlayerField();
+ DrawPlayerField(x,y);
else
DrawLevelField(x,y);
return;
if (!IS_FREE(newx,newy))
{
if (IS_PLAYER(x,y))
- DrawPlayerField();
+ DrawPlayerField(x,y);
else
DrawLevelField(x,y);
return;
element1 != EL_BURNING && element2 != EL_BURNING)
{
if (IS_PLAYER(x,y))
- DrawPlayerField();
+ DrawPlayerField(x,y);
else
DrawLevelField(x,y);
DrawGraphicAnimation(x,y, el2gfx(element), 2, 4, ANIM_NORMAL);
else if (element==EL_SONDE)
{
- int nextJX = JX + (JX - lastJX);
- int nextJY = JY + (JY - lastJY);
+ int i;
+
+ /* check if this element is just being pushed */
+ for(i=0; i<MAX_PLAYERS; i++)
+ {
+ struct PlayerInfo *pl = &stored_player[i];
+
+ if (pl->active && pl->Pushing && pl->GfxPos)
+ {
+ int nextJX = pl->JX + (pl->JX - pl->lastJX);
+ int nextJY = pl->JY + (pl->JY - pl->lastJY);
+
+ if (x == nextJX && y == nextJY)
+ return;
+ }
+ }
- if (!(PlayerPushing && PlayerGfxPos && x == nextJX && y == nextJY))
- DrawGraphicAnimation(x,y, GFX_SONDE_START, 8, 2, ANIM_NORMAL);
+ DrawGraphicAnimation(x,y, GFX_SONDE_START, 8, 2, ANIM_NORMAL);
}
return;
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;
}
}
-void GameActions()
+void PlayerActions(int player_action)
+{
+ BOOL moved = FALSE, snapped = FALSE, bombed = FALSE;
+ int left = player_action & JOY_LEFT;
+ int right = player_action & JOY_RIGHT;
+ int up = player_action & JOY_UP;
+ int down = player_action & JOY_DOWN;
+ int button1 = player_action & JOY_BUTTON_1;
+ int button2 = player_action & JOY_BUTTON_2;
+ int dx = (left ? -1 : right ? 1 : 0);
+ int dy = (up ? -1 : down ? 1 : 0);
+
+ if (player_action)
+ {
+ player->frame_reset_delay = 0;
+
+ if (button1)
+ snapped = SnapField(dx,dy);
+ else
+ {
+ if (button2)
+ bombed = PlaceBomb();
+ moved = MoveFigure(dx,dy);
+ }
+
+ if (tape.recording && (moved || snapped || bombed))
+ {
+ if (bombed && !moved)
+ player_action &= JOY_BUTTON;
+ TapeRecordAction(player_action);
+ }
+ else if (tape.playing && snapped)
+ SnapField(0,0); /* stop snapping */
+ }
+ else
+ {
+ DigField(0,0,0,0,DF_NO_PUSH);
+ SnapField(0,0);
+ if (++player->frame_reset_delay > MoveSpeed)
+ player->Frame = 0;
+ }
+
+ if (tape.playing && !tape.pausing && !player_action &&
+ tape.counter < tape.length)
+ {
+ int next_joy = tape.pos[tape.counter].joystickdata & (JOY_LEFT|JOY_RIGHT);
+
+ if (next_joy == JOY_LEFT || next_joy == JOY_RIGHT)
+ {
+ int dx = (next_joy == JOY_LEFT ? -1 : +1);
+
+ if (IN_LEV_FIELD(JX+dx,JY) && IS_PUSHABLE(Feld[JX+dx][JY]))
+ {
+ int el = Feld[JX+dx][JY];
+ int push_delay = (IS_SB_ELEMENT(el) || el==EL_SONDE ? 2 : 10);
+
+ if (tape.delay_played + push_delay >= tape.pos[tape.counter].delay)
+ {
+ player->MovDir = next_joy;
+ player->Frame = FrameCounter % 4;
+ player->Pushing = TRUE;
+ }
+ }
+ }
+ }
+}
+
+void GameActions(int player_action)
{
static long action_delay = 0;
long action_delay_value;
int sieb_x = 0, sieb_y = 0;
- int x, y, element;
+ int i, x,y, element;
if (game_status != PLAYING)
return;
#ifdef DEBUG
action_delay_value =
- (tape.playing && tape.fast_forward ? FFWD_FRAME_DELAY : GameSpeed);
+ (tape.playing && tape.fast_forward ? FFWD_FRAME_DELAY : GameFrameDelay);
#else
action_delay_value =
(tape.playing && tape.fast_forward ? FFWD_FRAME_DELAY : GAME_FRAME_DELAY);
#endif
- if (PlayerMovPos)
- ScrollFigure(0);
-
/* main game synchronization point */
WaitUntilDelayReached(&action_delay, action_delay_value);
+ for(i=0; i<MAX_PLAYERS; i++)
+ {
+ player = &stored_player[i];
+ JX = player->JX;
+ JY = player->JY;
+ lastJX = player->lastJX;
+ lastJY = player->lastJY;
+
+ if (!player->active)
+ continue;
+
+ PlayerActions(player_action);
+
+ if (player->MovPos)
+ ScrollFigure(0);
+ }
+
+ player = local_player;
+ JX = player->JX;
+ JY = player->JY;
+ lastJX = player->lastJX;
+ lastJY = player->lastJY;
+
if (tape.pausing || (tape.playing && !TapePlayDelay()))
return;
else if (tape.recording)
}
}
- if (TimeLeft>0 && TimeFrames>=(1000/GameSpeed) && !tape.pausing)
+ if (TimeLeft>0 && TimeFrames>=(1000/GameFrameDelay) && !tape.pausing)
{
TimeFrames = 0;
TimeLeft--;
KillHero();
}
- DrawPlayerField();
+
+
+
+ for(i=0; i<MAX_PLAYERS; i++)
+ {
+ player = &stored_player[i];
+ JX = player->JX;
+ JY = player->JY;
+ lastJX = player->lastJX;
+ lastJY = player->lastJY;
+
+ if (!player->active)
+ continue;
+
+ DrawPlayerField(player->JX,player->JY);
+ }
+
+ player = local_player;
+ JX = player->JX;
+ JY = player->JY;
+ lastJX = player->lastJX;
+ lastJY = player->lastJY;
+
+ /*
+ DrawPlayerField(JX,JY);
+ */
}
void ScrollLevel(int dx, int dy)
int softscroll_offset = (soft_scrolling_on ? TILEX : 0);
int x,y;
- ScreenMovPos = PlayerGfxPos;
+ ScreenMovPos = player->GfxPos;
XCopyArea(display,drawto_field,drawto_field,gc,
FX + TILEX*(dx==-1) - softscroll_offset,
if (PlayerGone || (!dx && !dy))
return(MF_NO_ACTION);
- PlayerMovDir = (dx < 0 ? MV_LEFT :
- dx > 0 ? MV_RIGHT :
- dy < 0 ? MV_UP :
- dy > 0 ? MV_DOWN : MV_NO_MOVING);
+ player->MovDir = (dx < 0 ? MV_LEFT :
+ dx > 0 ? MV_RIGHT :
+ dy < 0 ? MV_UP :
+ dy > 0 ? MV_DOWN : MV_NO_MOVING);
if (!IN_LEV_FIELD(newJX,newJY))
return(MF_NO_ACTION);
if (can_move != MF_MOVING)
return(can_move);
- lastJX = JX;
- lastJY = JY;
- JX = newJX;
- JY = newJY;
+ lastJX = player->lastJX = JX;
+ lastJY = player->lastJY = JY;
+ JX = player->JX = newJX;
+ JY = player->JY = newJY;
+
+ StorePlayer[lastJX][lastJY] = EL_LEERRAUM;
+ StorePlayer[JX][JY] = EL_SPIELER1;
- PlayerMovPos = (dx > 0 || dy > 0 ? -1 : 1) * 7*TILEX/8;
+ player->MovPos = (dx > 0 || dy > 0 ? -1 : 1) * 7*TILEX/8;
ScrollFigure(-1);
BOOL MoveFigure(int dx, int dy)
{
- static long move_delay = 0;
- static int last_move_dir = MV_NO_MOVING;
int moved = MF_NO_ACTION;
int oldJX = JX, oldJY = JY;
if (PlayerGone || (!dx && !dy))
return(FALSE);
- if (!FrameReached(&move_delay,MoveSpeed) && !tape.playing)
+ if (!FrameReached(&player->move_delay,MoveSpeed) && !tape.playing)
return(FALSE);
- if (last_move_dir & (MV_LEFT | MV_RIGHT))
+ if (player->last_move_dir & (MV_LEFT | MV_RIGHT))
{
if (!(moved |= MoveFigureOneStep(0,dy, dx,dy)))
moved |= MoveFigureOneStep(dx,0, dx,dy);
moved |= MoveFigureOneStep(0,dy, dx,dy);
}
- last_move_dir = MV_NO_MOVING;
- if (moved & MF_MOVING)
+ /*
+ player->last_move_dir = MV_NO_MOVING;
+ */
+
+
+ if (moved & MF_MOVING && player == local_player)
{
int old_scroll_x = scroll_x, old_scroll_y = scroll_y;
int offset = (scroll_delay_on ? 3 : 0);
ScrollLevel(old_scroll_x - scroll_x, old_scroll_y - scroll_y);
}
- if (!(moved & MF_MOVING) && !PlayerPushing)
- PlayerFrame = 0;
+ if (!(moved & MF_MOVING) && !player->Pushing)
+ player->Frame = 0;
else
- PlayerFrame = (PlayerFrame + 1) % 4;
+ player->Frame = (player->Frame + 1) % 4;
if (moved & MF_MOVING)
{
if (oldJX != JX && oldJY == JY)
- PlayerMovDir = (oldJX < JX ? MV_RIGHT : MV_LEFT);
+ player->MovDir = (oldJX < JX ? MV_RIGHT : MV_LEFT);
else if (oldJX == JX && oldJY != JY)
- PlayerMovDir = (oldJY < JY ? MV_DOWN : MV_UP);
+ player->MovDir = (oldJY < JY ? MV_DOWN : MV_UP);
DrawLevelField(JX,JY); /* für "ErdreichAnbroeckeln()" */
- last_move_dir = PlayerMovDir;
+ player->last_move_dir = player->MovDir;
}
TestIfHeroHitsBadThing();
if (init)
{
- PlayerGfxPos = ScrollStepSize * (PlayerMovPos / ScrollStepSize);
actual_frame_counter = FrameCounter;
- /*
- 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;
- */
+ player->GfxPos = ScrollStepSize * (player->MovPos / ScrollStepSize);
if (Feld[lastJX][lastJY] == EL_LEERRAUM)
Feld[lastJX][lastJY] = EL_PLAYER_IS_LEAVING;
- DrawPlayerField();
+ DrawPlayerField(JX,JY);
return;
}
else if (!FrameReached(&actual_frame_counter,1))
return;
- PlayerMovPos += (PlayerMovPos > 0 ? -1 : 1) * TILEX/8;
- PlayerGfxPos = ScrollStepSize * (PlayerMovPos / ScrollStepSize);
+ player->MovPos += (player->MovPos > 0 ? -1 : 1) * TILEX/8;
+ player->GfxPos = ScrollStepSize * (player->MovPos / ScrollStepSize);
- if (ScreenMovPos && ScreenMovPos != PlayerGfxPos)
+ if (ScreenMovPos && ScreenMovPos != local_player->GfxPos)
{
- ScreenMovPos = PlayerGfxPos;
+ ScreenMovPos = local_player->GfxPos;
redraw_mask |= REDRAW_FIELD;
}
if (Feld[lastJX][lastJY] == EL_PLAYER_IS_LEAVING)
Feld[lastJX][lastJY] = EL_LEERRAUM;
- DrawPlayerField();
+ DrawPlayerField(JX,JY);
- if (!PlayerMovPos)
+ if (!player->MovPos)
{
lastJX = JX;
lastJY = JY;
{
int dx = x-JX, dy = y-JY;
int element;
- static long push_delay = 0;
- static int push_delay_value = 5;
- if (!PlayerMovPos)
- PlayerPushing = FALSE;
+ if (!player->MovPos)
+ player->Pushing = FALSE;
if (mode == DF_NO_PUSH)
{
- push_delay = 0;
+ player->push_delay = 0;
return(MF_NO_ACTION);
}
- if (IS_MOVING(x,y))
+ if (IS_MOVING(x,y) || IS_PLAYER(x,y))
return(MF_NO_ACTION);
element = Feld[x][y];
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++;
+ 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++;
+ player->dynabomb_count++;
+ player->dynabombs_left++;
RaiseScoreElement(EL_DYNAMIT);
PlaySoundLevel(x,y,SND_PONG);
break;
case EL_DYNABOMB_SZ:
Feld[x][y] = EL_LEERRAUM;
- DynaBombSize++;
+ player->dynabomb_size++;
RaiseScoreElement(EL_DYNAMIT);
PlaySoundLevel(x,y,SND_PONG);
break;
case EL_DYNABOMB_XL:
Feld[x][y] = EL_LEERRAUM;
- DynaBombXL = TRUE;
+ player->dynabomb_xl = TRUE;
RaiseScoreElement(EL_DYNAMIT);
PlaySoundLevel(x,y,SND_PONG);
break;
int key_nr = element-EL_SCHLUESSEL1;
Feld[x][y] = EL_LEERRAUM;
- Key[key_nr] = TRUE;
+ player->key[key_nr] = TRUE;
RaiseScoreElement(EL_SCHLUESSEL);
DrawMiniGraphicExt(drawto,gc,
DX_KEYS+key_nr*MINI_TILEX,DY_KEYS,
if (dy || mode==DF_SNAP)
return(MF_NO_ACTION);
- PlayerPushing = TRUE;
+ player->Pushing = TRUE;
if (!IN_LEV_FIELD(x+dx,y+dy) || Feld[x+dx][y+dy] != EL_LEERRAUM)
return(MF_NO_ACTION);
return(MF_NO_ACTION);
}
- if (push_delay == 0)
- push_delay = FrameCounter;
- if (!FrameReached(&push_delay,push_delay_value) && !tape.playing)
+ if (player->push_delay == 0)
+ player->push_delay = FrameCounter;
+ if (!FrameReached(&player->push_delay, player->push_delay_value) &&
+ !tape.playing)
return(MF_NO_ACTION);
Feld[x][y] = EL_LEERRAUM;
Feld[x+dx][y+dy] = element;
- push_delay_value = 2+RND(8);
+ player->push_delay_value = 2+RND(8);
DrawLevelField(x+dx,y+dy);
if (element==EL_FELSBROCKEN)
case EL_PFORTE2:
case EL_PFORTE3:
case EL_PFORTE4:
- if (!Key[element-EL_PFORTE1])
+ if (!player->key[element-EL_PFORTE1])
return(MF_NO_ACTION);
break;
case EL_PFORTE2X:
case EL_PFORTE3X:
case EL_PFORTE4X:
- if (!Key[element-EL_PFORTE1X])
+ if (!player->key[element-EL_PFORTE1X])
return(MF_NO_ACTION);
break;
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);
if (mode==DF_SNAP)
return(MF_NO_ACTION);
- PlayerPushing = TRUE;
+ player->Pushing = TRUE;
if (!IN_LEV_FIELD(x+dx,y+dy)
|| (Feld[x+dx][y+dy] != EL_LEERRAUM
return(MF_NO_ACTION);
}
- if (push_delay == 0)
- push_delay = FrameCounter;
- if (!FrameReached(&push_delay,push_delay_value) && !tape.playing)
+ if (player->push_delay == 0)
+ player->push_delay = FrameCounter;
+ if (!FrameReached(&player->push_delay, player->push_delay_value) &&
+ !tape.playing)
return(MF_NO_ACTION);
if (IS_SB_ELEMENT(element))
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;
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);
}
Feld[x+dx][y+dy] = element;
}
- push_delay_value = 2;
+ player->push_delay_value = 2;
DrawLevelField(x,y);
DrawLevelField(x+dx,y+dy);
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);
break;
}
- push_delay = 0;
+ player->push_delay = 0;
return(MF_MOVING);
}
if (snapped)
return(FALSE);
- PlayerMovDir = (dx < 0 ? MV_LEFT :
- dx > 0 ? MV_RIGHT :
- dy < 0 ? MV_UP :
- dy > 0 ? MV_DOWN : MV_NO_MOVING);
+ player->MovDir = (dx < 0 ? MV_LEFT :
+ dx > 0 ? MV_RIGHT :
+ dy < 0 ? MV_UP :
+ dy > 0 ? MV_DOWN : MV_NO_MOVING);
if (!DigField(x,y, 0,0, DF_SNAP))
return(FALSE);
{
int element;
- if (PlayerGone || PlayerMovPos)
+ if (PlayerGone || player->MovPos)
return(FALSE);
element = Feld[JX][JY];
- if ((Dynamite==0 && DynaBombsLeft==0) ||
+ if ((player->dynamite==0 && 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 (player->dynamite)
{
Feld[JX][JY] = EL_DYNAMIT;
MovDelay[JX][JY] = 96;
- Dynamite--;
- DrawText(DX_DYNAMITE,DY_DYNAMITE,int2str(Dynamite,3),FS_SMALL,FC_YELLOW);
+ 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--;
+ player->dynabombs_left--;
DrawGraphicThruMask(SCROLLX(JX),SCROLLY(JY),GFX_DYNABOMB);
}
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)