X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=7e678bfbd4f063ea04e37486abb4c7143f408f2d;hb=e7f36cd97c8580345714b4a22d6b4ad291e50ed6;hp=640c248624ddd158dd29f6d33d2a9f3b06e677e0;hpb=35a6bb2e02a14cb70796f2a165736f515669208c;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 640c2486..7e678bfb 100644 --- a/src/game.c +++ b/src/game.c @@ -63,14 +63,22 @@ void InitGame() BOOL emulate_bd = TRUE; /* unless non-BOULDERDASH elements found */ BOOL emulate_sb = TRUE; /* unless non-SOKOBAN elements found */ + /* don't play tapes over network */ + network_playing = (network && !tape.playing); + for(i=0; iindex_nr = i; player->element_nr = EL_SPIELER1 + i; + + player->present = FALSE; player->active = FALSE; + + /* player->local = FALSE; + */ player->score = 0; player->gems_still_needed = level.edelsteine; @@ -126,23 +134,16 @@ void InitGame() player->GameOver = FALSE; } + /* local_player->active = TRUE; local_player->local = TRUE; + */ network_player_action_received = FALSE; - - /* initial null action */ - SendToServer_MovePlayer(MV_NO_MOVING); - - - - /* - printf("BLURB\n"); - */ - - + if (network_playing) + SendToServer_MovePlayer(MV_NO_MOVING); ZX = ZY = -1; @@ -187,16 +188,30 @@ void InitGame() struct PlayerInfo *player = &stored_player[Feld[x][y] - EL_SPIELER1]; int jx = player->jx, jy = player->jy; - /* remove duplicate players */ + /* + player->active = TRUE; + */ + + player->present = TRUE; + if (player->connected) + { + player->active = TRUE; + + printf("Player %d activated.\n", player->element_nr); + printf("[Local player is %d and currently %s.]\n", + local_player->element_nr, + local_player->active ? "active" : "not active"); + } + + /* remove potentially duplicate players */ if (StorePlayer[jx][jy] == Feld[x][y]) StorePlayer[jx][jy] = 0; - player->active = TRUE; - StorePlayer[x][y] = Feld[x][y]; Feld[x][y] = EL_LEERRAUM; player->jx = player->last_jx = x; player->jy = player->last_jy = y; + break; } case EL_BADEWANNE: @@ -274,6 +289,52 @@ void InitGame() } } + /* check if any connected player was not found in playfield */ + for(i=0; iconnected && !player->present) + { + printf("Oops!\n"); + + + for(j=0; jjx, jy = some_player->jy; + + /* assign first free player found that is present in the playfield */ + if (some_player->present && !some_player->connected) + { + player->present = TRUE; + player->active = TRUE; + some_player->present = FALSE; + + StorePlayer[jx][jy] = player->element_nr; + player->jx = player->last_jx = jx; + player->jy = player->last_jy = jy; + + break; + } + } + } + } + + for(i=0; ipresent, + player->connected, + player->active); + if (local_player == player) + printf("Player %d is local player.\n", i+1); + } + + game_emulation = (emulate_bd ? EMU_BOULDERDASH : emulate_sb ? EMU_SOKOBAN : EMU_NONE); @@ -330,6 +391,12 @@ void InitGame() PlaySoundLoop(background_loop[level_nr % num_bg_loops]); XAutoRepeatOff(display); + + + for (i=0;i<4;i++) + printf("Spieler %d %saktiv.\n", + i+1, (stored_player[i].active ? "" : "nicht ")); + } void InitMovDir(int x, int y) @@ -2888,7 +2955,7 @@ void GameActions(byte player_action) /* main game synchronization point */ WaitUntilDelayReached(&action_delay, action_delay_value); - if (!standalone && !network_player_action_received) + if (network_playing && !network_player_action_received) { /* #ifdef DEBUG @@ -2913,18 +2980,30 @@ void GameActions(byte player_action) } } + + if (tape.pausing || (tape.playing && !TapePlayDelay())) + return; + else if (tape.recording) + TapeRecordDelay(); + + if (tape.playing) recorded_player_action = TapePlayAction(); else recorded_player_action = NULL; - if (!standalone) + if (network_playing) SendToServer_MovePlayer(player_action); for(i=0; i