void APBGameMode::setBarEnergy(float benergy) { if (benergy == 0) { OnGameOver(); } }
//---------------------------------------------------------------------------- // Nome: Execute(void) // Desc: Executa o jogo. Verifica cada estado da máquina e chama o método adequado. // Pams: nenhum //---------------------------------------------------------------------------- void CLevel::Execute(void) { switch(State) { case GS_MENU: { OnMenu(); break; } case GS_GAME: { OnGame(); break; } case GS_PAUSE: { OnPause(); break; } case GS_CONGRATULATIONS: { OnCongratulations(); break; } case GS_GAMEOVER: { OnGameOver(); break; } } }
void Game::RemoveLife() { if (defender_lives > 0) { SetLives(defender_lives - 1); if (defender_lives == 0) { OnGameOver(); } } }
//------------------------------------------------------------------------------ int CMulti::OnExecute() { Running = 1; if(OnInit() == false) { return -1; } SDL_Event Event; while(Running==1) { while(SDL_PollEvent(&Event)) { OnEvent(&Event); } OnLoop(); OnRender(); OnGameOver(); } OnCleanup(); return Running; }
void GameView::OnUpdate() { if (m_gameover) { if (!m_fadeQuad->GetColorAnim().isPlaying()) { // we are done SendCommand(seed::eAppCommand::SWITCH_VIEW, "GameOverView"); return; } UpdateCamera(); UpdateUIs(); return; } else { if (!m_fadeQuad->GetColorAnim().isPlaying()) { m_fadeQuad->SetVisible(false); } } UpdateTime(); UpdateDanceSequence(); UpdateMonsterSpawning(); UpdateEntities(); UpdateCamera(); UpdateUIs(); // check if we are game over if (AllPlayersAreDead()) { OnGameOver(); } ClearEntities(); }
void CGameClient::OnNewSnapshot() { m_NewTick = true; // clear out the invalid pointers mem_zero(&g_GameClient.m_Snap, sizeof(g_GameClient.m_Snap)); m_Snap.m_LocalClientID = -1; // secure snapshot { int Num = Client()->SnapNumItems(IClient::SNAP_CURRENT); for(int Index = 0; Index < Num; Index++) { IClient::CSnapItem Item; void *pData = Client()->SnapGetItem(IClient::SNAP_CURRENT, Index, &Item); if(m_NetObjHandler.ValidateObj(Item.m_Type, pData, Item.m_DataSize) != 0) { if(g_Config.m_Debug) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "invalidated index=%d type=%d (%s) size=%d id=%d", Index, Item.m_Type, m_NetObjHandler.GetObjName(Item.m_Type), Item.m_DataSize, Item.m_ID); Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf); } Client()->SnapInvalidateItem(IClient::SNAP_CURRENT, Index); } } } ProcessEvents(); if(g_Config.m_DbgStress) { if((Client()->GameTick()%100) == 0) { char aMessage[64]; int MsgLen = rand()%(sizeof(aMessage)-1); for(int i = 0; i < MsgLen; i++) aMessage[i] = 'a'+(rand()%('z'-'a')); aMessage[MsgLen] = 0; CNetMsg_Cl_Say Msg; Msg.m_Team = rand()&1; Msg.m_pMessage = aMessage; Client()->SendPackMsg(&Msg, MSGFLAG_VITAL); } } // go trough all the items in the snapshot and gather the info we want { m_Snap.m_aTeamSize[TEAM_RED] = m_Snap.m_aTeamSize[TEAM_BLUE] = 0; int Num = Client()->SnapNumItems(IClient::SNAP_CURRENT); for(int i = 0; i < Num; i++) { IClient::CSnapItem Item; const void *pData = Client()->SnapGetItem(IClient::SNAP_CURRENT, i, &Item); if(Item.m_Type == NETOBJTYPE_CLIENTINFO) { const CNetObj_ClientInfo *pInfo = (const CNetObj_ClientInfo *)pData; int ClientID = Item.m_ID; IntsToStr(&pInfo->m_Name0, 4, m_aClients[ClientID].m_aName); IntsToStr(&pInfo->m_Clan0, 3, m_aClients[ClientID].m_aClan); m_aClients[ClientID].m_Country = pInfo->m_Country; IntsToStr(&pInfo->m_Skin0, 6, m_aClients[ClientID].m_aSkinName); m_aClients[ClientID].m_UseCustomColor = pInfo->m_UseCustomColor; m_aClients[ClientID].m_ColorBody = pInfo->m_ColorBody; m_aClients[ClientID].m_ColorFeet = pInfo->m_ColorFeet; // prepare the info if(m_aClients[ClientID].m_aSkinName[0] == 'x' || m_aClients[ClientID].m_aSkinName[1] == '_') str_copy(m_aClients[ClientID].m_aSkinName, "default", 64); m_aClients[ClientID].m_SkinInfo.m_ColorBody = m_pSkins->GetColorV4(m_aClients[ClientID].m_ColorBody); m_aClients[ClientID].m_SkinInfo.m_ColorFeet = m_pSkins->GetColorV4(m_aClients[ClientID].m_ColorFeet); m_aClients[ClientID].m_SkinInfo.m_Size = 64; // find new skin m_aClients[ClientID].m_SkinID = g_GameClient.m_pSkins->Find(m_aClients[ClientID].m_aSkinName); if(m_aClients[ClientID].m_SkinID < 0) { m_aClients[ClientID].m_SkinID = g_GameClient.m_pSkins->Find("default"); if(m_aClients[ClientID].m_SkinID < 0) m_aClients[ClientID].m_SkinID = 0; } if(m_aClients[ClientID].m_UseCustomColor) m_aClients[ClientID].m_SkinInfo.m_Texture = g_GameClient.m_pSkins->Get(m_aClients[ClientID].m_SkinID)->m_ColorTexture; else { m_aClients[ClientID].m_SkinInfo.m_Texture = g_GameClient.m_pSkins->Get(m_aClients[ClientID].m_SkinID)->m_OrgTexture; m_aClients[ClientID].m_SkinInfo.m_ColorBody = vec4(1,1,1,1); m_aClients[ClientID].m_SkinInfo.m_ColorFeet = vec4(1,1,1,1); } m_aClients[ClientID].UpdateRenderInfo(); } else if(Item.m_Type == NETOBJTYPE_PLAYERINFO) { const CNetObj_PlayerInfo *pInfo = (const CNetObj_PlayerInfo *)pData; m_aClients[pInfo->m_ClientID].m_Team = pInfo->m_Team; m_aClients[pInfo->m_ClientID].m_Active = true; m_Snap.m_paPlayerInfos[pInfo->m_ClientID] = pInfo; m_Snap.m_NumPlayers++; if(pInfo->m_Local) { m_Snap.m_LocalClientID = Item.m_ID; m_Snap.m_pLocalInfo = pInfo; if(pInfo->m_Team == TEAM_SPECTATORS) { m_Snap.m_SpecInfo.m_Active = true; m_Snap.m_SpecInfo.m_SpectatorID = SPEC_FREEVIEW; } } // calculate team-balance if(pInfo->m_Team != TEAM_SPECTATORS) m_Snap.m_aTeamSize[pInfo->m_Team]++; } else if(Item.m_Type == NETOBJTYPE_CHARACTER) { const void *pOld = Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_CHARACTER, Item.m_ID); m_Snap.m_aCharacters[Item.m_ID].m_Cur = *((const CNetObj_Character *)pData); if(pOld) { m_Snap.m_aCharacters[Item.m_ID].m_Active = true; m_Snap.m_aCharacters[Item.m_ID].m_Prev = *((const CNetObj_Character *)pOld); if(m_Snap.m_aCharacters[Item.m_ID].m_Prev.m_Tick) Evolve(&m_Snap.m_aCharacters[Item.m_ID].m_Prev, Client()->PrevGameTick()); if(m_Snap.m_aCharacters[Item.m_ID].m_Cur.m_Tick) Evolve(&m_Snap.m_aCharacters[Item.m_ID].m_Cur, Client()->GameTick()); } } else if(Item.m_Type == NETOBJTYPE_SPECTATORINFO) { m_Snap.m_pSpectatorInfo = (const CNetObj_SpectatorInfo *)pData; m_Snap.m_pPrevSpectatorInfo = (const CNetObj_SpectatorInfo *)Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_SPECTATORINFO, Item.m_ID); m_Snap.m_SpecInfo.m_SpectatorID = m_Snap.m_pSpectatorInfo->m_SpectatorID; } else if(Item.m_Type == NETOBJTYPE_GAMEINFO) { static bool s_GameOver = 0; m_Snap.m_pGameInfoObj = (const CNetObj_GameInfo *)pData; if(!s_GameOver && m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER) OnGameOver(); else if(s_GameOver && !(m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER)) OnStartGame(); s_GameOver = m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER; } else if(Item.m_Type == NETOBJTYPE_GAMEDATA) { m_Snap.m_pGameDataObj = (const CNetObj_GameData *)pData; m_Snap.m_GameDataSnapID = Item.m_ID; if(m_Snap.m_pGameDataObj->m_FlagCarrierRed == FLAG_TAKEN) { if(m_FlagDropTick[TEAM_RED] == 0) m_FlagDropTick[TEAM_RED] = Client()->GameTick(); } else if(m_FlagDropTick[TEAM_RED] != 0) m_FlagDropTick[TEAM_RED] = 0; if(m_Snap.m_pGameDataObj->m_FlagCarrierBlue == FLAG_TAKEN) { if(m_FlagDropTick[TEAM_BLUE] == 0) m_FlagDropTick[TEAM_BLUE] = Client()->GameTick(); } else if(m_FlagDropTick[TEAM_BLUE] != 0) m_FlagDropTick[TEAM_BLUE] = 0; } else if(Item.m_Type == NETOBJTYPE_FLAG) m_Snap.m_paFlags[Item.m_ID%2] = (const CNetObj_Flag *)pData; } } // setup local pointers if(m_Snap.m_LocalClientID >= 0) { CSnapState::CCharacterInfo *c = &m_Snap.m_aCharacters[m_Snap.m_LocalClientID]; if(c->m_Active) { m_Snap.m_pLocalCharacter = &c->m_Cur; m_Snap.m_pLocalPrevCharacter = &c->m_Prev; m_LocalCharacterPos = vec2(m_Snap.m_pLocalCharacter->m_X, m_Snap.m_pLocalCharacter->m_Y); } else if(Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_CHARACTER, m_Snap.m_LocalClientID)) { // player died m_pControls->OnPlayerDeath(); } } else { m_Snap.m_SpecInfo.m_Active = true; if(Client()->State() == IClient::STATE_DEMOPLAYBACK && DemoPlayer()->GetDemoType() == IDemoPlayer::DEMOTYPE_SERVER && m_DemoSpecID != SPEC_FREEVIEW && m_Snap.m_aCharacters[m_DemoSpecID].m_Active) m_Snap.m_SpecInfo.m_SpectatorID = m_DemoSpecID; else m_Snap.m_SpecInfo.m_SpectatorID = SPEC_FREEVIEW; } // clear out unneeded client data for(int i = 0; i < MAX_CLIENTS; ++i) { if(!m_Snap.m_paPlayerInfos[i] && m_aClients[i].m_Active) m_aClients[i].Reset(); } // update friend state for(int i = 0; i < MAX_CLIENTS; ++i) { if(i == m_Snap.m_LocalClientID || !m_Snap.m_paPlayerInfos[i] || !Friends()->IsFriend(m_aClients[i].m_aName, m_aClients[i].m_aClan, true)) m_aClients[i].m_Friend = false; else m_aClients[i].m_Friend = true; } // sort player infos by score mem_copy(m_Snap.m_paInfoByScore, m_Snap.m_paPlayerInfos, sizeof(m_Snap.m_paInfoByScore)); for(int k = 0; k < MAX_CLIENTS-1; k++) // ffs, bubblesort { for(int i = 0; i < MAX_CLIENTS-k-1; i++) { if(m_Snap.m_paInfoByScore[i+1] && (!m_Snap.m_paInfoByScore[i] || m_Snap.m_paInfoByScore[i]->m_Score < m_Snap.m_paInfoByScore[i+1]->m_Score)) { const CNetObj_PlayerInfo *pTmp = m_Snap.m_paInfoByScore[i]; m_Snap.m_paInfoByScore[i] = m_Snap.m_paInfoByScore[i+1]; m_Snap.m_paInfoByScore[i+1] = pTmp; } } } // sort player infos by team int Teams[3] = { TEAM_RED, TEAM_BLUE, TEAM_SPECTATORS }; int Index = 0; for(int Team = 0; Team < 3; ++Team) { for(int i = 0; i < MAX_CLIENTS && Index < MAX_CLIENTS; ++i) { if(m_Snap.m_paPlayerInfos[i] && m_Snap.m_paPlayerInfos[i]->m_Team == Teams[Team]) m_Snap.m_paInfoByTeam[Index++] = m_Snap.m_paPlayerInfos[i]; } } CTuningParams StandardTuning; CServerInfo CurrentServerInfo; Client()->GetServerInfo(&CurrentServerInfo); if(CurrentServerInfo.m_aGameType[0] != '0') { if(str_comp(CurrentServerInfo.m_aGameType, "DM") != 0 && str_comp(CurrentServerInfo.m_aGameType, "TDM") != 0 && str_comp(CurrentServerInfo.m_aGameType, "CTF") != 0) m_ServerMode = SERVERMODE_MOD; else if(mem_comp(&StandardTuning, &m_Tuning, sizeof(CTuningParams)) == 0) m_ServerMode = SERVERMODE_PURE; else m_ServerMode = SERVERMODE_PUREMOD; } // add tuning to demo if(DemoRecorder()->IsRecording() && mem_comp(&StandardTuning, &m_Tuning, sizeof(CTuningParams)) != 0) { CMsgPacker Msg(NETMSGTYPE_SV_TUNEPARAMS); int *pParams = (int *)&m_Tuning; for(unsigned i = 0; i < sizeof(m_Tuning)/sizeof(int); i++) Msg.AddInt(pParams[i]); Client()->SendMsg(&Msg, MSGFLAG_RECORD|MSGFLAG_NOSEND); } if(!m_DDRaceMsgSent && m_Snap.m_pLocalInfo) { CNetMsg_Cl_IsDDRace Msg; Client()->SendPackMsg(&Msg, MSGFLAG_VITAL); m_DDRaceMsgSent = true; } if(m_ShowOthers == -1 || (m_ShowOthers != -1 && m_ShowOthers != g_Config.m_ClShowOthers)) { // no need to send, default settings //if(!(m_ShowOthers == -1 && g_Config.m_ClShowOthers)) { CNetMsg_Cl_ShowOthers Msg; Msg.m_Show = g_Config.m_ClShowOthers; Client()->SendPackMsg(&Msg, MSGFLAG_VITAL); } // update state m_ShowOthers = g_Config.m_ClShowOthers; } }
void Game::MoveInvaders() { Rocket::Core::Vector2f new_positions[NUM_INVADERS]; // We loop through all invaders, calculating their new positions, if any of them go over the screen bounds, // then we switch direction, move the invaders down and start at 0 again for (int i = 0; i < NUM_INVADERS; i++) { if (invaders[i]->GetState() == Invader::DEAD) continue; new_positions[i] = invaders[i]->GetPosition(); new_positions[i].x += INVADER_MOVEMENT * current_invader_direction; if (new_positions[i].x < 0 || new_positions[i].x + INVADER_SPACING_X > WINDOW_WIDTH) { // Switch direction and start back at 0 (-1 as the for loop increments) current_invader_direction *= -1.0f; i = -1; // Move all invaders down for (int j = 0; j < NUM_INVADERS; j++) { if (invaders[j]->GetState() == Invader::DEAD) continue; Rocket::Core::Vector2f position = invaders[j]->GetPosition(); position.y += INVADER_SPACING_Y; invaders[j]->SetPosition(position); } // Increase speed of invaders invader_move_freq *= INVADER_UPDATE_MODIFIER; } } // Assign invaders their new position and advance their animation frame bool invaders_alive = false; for (int i = 0; i < NUM_INVADERS; i++) { if (invaders[i]->GetState() == Invader::DEAD) continue; invaders[i]->SetPosition(new_positions[i]); invaders[i]->UpdateAnimation(); // If an invader hits the bottom, instant death if (new_positions[i].y >= GetWindowDimensions().y - INVADER_SPACING_Y) { OnGameOver(); return; } invaders_alive = true; } if (!invaders_alive) { SetWave(GameDetails::GetWave() + 1); InitialiseWave(); } }
void CGameClient::OnNewSnapshot() { m_NewTick = true; // clear out the invalid pointers mem_zero(&g_GameClient.m_Snap, sizeof(g_GameClient.m_Snap)); m_Snap.m_LocalCid = -1; // secure snapshot { int Num = Client()->SnapNumItems(IClient::SNAP_CURRENT); for(int Index = 0; Index < Num; Index++) { IClient::CSnapItem Item; void *pData = Client()->SnapGetItem(IClient::SNAP_CURRENT, Index, &Item); if(m_NetObjHandler.ValidateObj(Item.m_Type, pData, Item.m_DataSize) != 0) { if(g_Config.m_Debug) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "invalidated index=%d type=%d (%s) size=%d id=%d", Index, Item.m_Type, m_NetObjHandler.GetObjName(Item.m_Type), Item.m_DataSize, Item.m_Id); Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf); } Client()->SnapInvalidateItem(IClient::SNAP_CURRENT, Index); } } } ProcessEvents(); if(g_Config.m_DbgStress) { if((Client()->GameTick()%100) == 0) { char aMessage[64]; int MsgLen = rand()%(sizeof(aMessage)-1); for(int i = 0; i < MsgLen; i++) aMessage[i] = 'a'+(rand()%('z'-'a')); aMessage[MsgLen] = 0; CNetMsg_Cl_Say Msg; Msg.m_Team = rand()&1; Msg.m_pMessage = aMessage; Client()->SendPackMsg(&Msg, MSGFLAG_VITAL); } } // go trough all the items in the snapshot and gather the info we want { m_Snap.m_aTeamSize[TEAM_RED] = m_Snap.m_aTeamSize[TEAM_BLUE] = 0; int Num = Client()->SnapNumItems(IClient::SNAP_CURRENT); for(int i = 0; i < Num; i++) { IClient::CSnapItem Item; const void *pData = Client()->SnapGetItem(IClient::SNAP_CURRENT, i, &Item); if(Item.m_Type == NETOBJTYPE_CLIENTINFO) { const CNetObj_ClientInfo *pInfo = (const CNetObj_ClientInfo *)pData; int Cid = Item.m_Id; IntsToStr(&pInfo->m_Name0, 6, m_aClients[Cid].m_aName); IntsToStr(&pInfo->m_Skin0, 6, m_aClients[Cid].m_aSkinName); m_aClients[Cid].m_UseCustomColor = pInfo->m_UseCustomColor; m_aClients[Cid].m_ColorBody = pInfo->m_ColorBody; m_aClients[Cid].m_ColorFeet = pInfo->m_ColorFeet; // prepare the info if(m_aClients[Cid].m_aSkinName[0] == 'x' || m_aClients[Cid].m_aSkinName[1] == '_') str_copy(m_aClients[Cid].m_aSkinName, "default", 64); m_aClients[Cid].m_SkinInfo.m_ColorBody = m_pSkins->GetColorV4(m_aClients[Cid].m_ColorBody); m_aClients[Cid].m_SkinInfo.m_ColorFeet = m_pSkins->GetColorV4(m_aClients[Cid].m_ColorFeet); m_aClients[Cid].m_SkinInfo.m_Size = 64; // find new skin m_aClients[Cid].m_SkinId = g_GameClient.m_pSkins->Find(m_aClients[Cid].m_aSkinName); if(m_aClients[Cid].m_SkinId < 0) { m_aClients[Cid].m_SkinId = g_GameClient.m_pSkins->Find("default"); if(m_aClients[Cid].m_SkinId < 0) m_aClients[Cid].m_SkinId = 0; } if(m_aClients[Cid].m_UseCustomColor) m_aClients[Cid].m_SkinInfo.m_Texture = g_GameClient.m_pSkins->Get(m_aClients[Cid].m_SkinId)->m_ColorTexture; else { m_aClients[Cid].m_SkinInfo.m_Texture = g_GameClient.m_pSkins->Get(m_aClients[Cid].m_SkinId)->m_OrgTexture; m_aClients[Cid].m_SkinInfo.m_ColorBody = vec4(1,1,1,1); m_aClients[Cid].m_SkinInfo.m_ColorFeet = vec4(1,1,1,1); } m_aClients[Cid].UpdateRenderInfo(); g_GameClient.m_Snap.m_NumPlayers++; } else if(Item.m_Type == NETOBJTYPE_PLAYERINFO) { const CNetObj_PlayerInfo *pInfo = (const CNetObj_PlayerInfo *)pData; m_aClients[pInfo->m_ClientId].m_Team = pInfo->m_Team; m_Snap.m_paPlayerInfos[pInfo->m_ClientId] = pInfo; if(pInfo->m_Local) { m_Snap.m_LocalCid = Item.m_Id; m_Snap.m_pLocalInfo = pInfo; if(pInfo->m_Team == TEAM_SPECTATORS) m_Snap.m_Spectate = true; } // calculate team-balance if(pInfo->m_Team != TEAM_SPECTATORS) m_Snap.m_aTeamSize[pInfo->m_Team]++; } else if(Item.m_Type == NETOBJTYPE_CHARACTER) { const void *pOld = Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_CHARACTER, Item.m_Id); if(pOld) { m_Snap.m_aCharacters[Item.m_Id].m_Active = true; m_Snap.m_aCharacters[Item.m_Id].m_Prev = *((const CNetObj_Character *)pOld); m_Snap.m_aCharacters[Item.m_Id].m_Cur = *((const CNetObj_Character *)pData); if(m_Snap.m_aCharacters[Item.m_Id].m_Prev.m_Tick) Evolve(&m_Snap.m_aCharacters[Item.m_Id].m_Prev, Client()->PrevGameTick()); if(m_Snap.m_aCharacters[Item.m_Id].m_Cur.m_Tick) Evolve(&m_Snap.m_aCharacters[Item.m_Id].m_Cur, Client()->GameTick()); } } else if(Item.m_Type == NETOBJTYPE_GAME) { static int s_GameOver = 0; m_Snap.m_pGameobj = (CNetObj_Game *)pData; if(s_GameOver == 0 && m_Snap.m_pGameobj->m_GameOver != 0) OnGameOver(); else if(s_GameOver != 0 && m_Snap.m_pGameobj->m_GameOver == 0) OnStartGame(); s_GameOver = m_Snap.m_pGameobj->m_GameOver; } else if(Item.m_Type == NETOBJTYPE_FLAG) m_Snap.m_paFlags[Item.m_Id%2] = (const CNetObj_Flag *)pData; } } // setup local pointers if(m_Snap.m_LocalCid >= 0) { CSnapState::CCharacterInfo *c = &m_Snap.m_aCharacters[m_Snap.m_LocalCid]; if(c->m_Active) { m_Snap.m_pLocalCharacter = &c->m_Cur; m_Snap.m_pLocalPrevCharacter = &c->m_Prev; m_LocalCharacterPos = vec2(m_Snap.m_pLocalCharacter->m_X, m_Snap.m_pLocalCharacter->m_Y); } else if(Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_CHARACTER, m_Snap.m_LocalCid)) { // player died m_pControls->OnPlayerDeath(); } } else m_Snap.m_Spectate = true; CTuningParams StandardTuning; CServerInfo CurrentServerInfo; Client()->GetServerInfo(&CurrentServerInfo); if(CurrentServerInfo.m_aGameType[0] != '0') { if(str_comp(CurrentServerInfo.m_aGameType, "DM") != 0 && str_comp(CurrentServerInfo.m_aGameType, "TDM") != 0 && str_comp(CurrentServerInfo.m_aGameType, "CTF") != 0) m_ServerMode = SERVERMODE_MOD; else if(mem_comp(&StandardTuning, &m_Tuning, sizeof(CTuningParams)) == 0) m_ServerMode = SERVERMODE_PURE; else m_ServerMode = SERVERMODE_PUREMOD; } }
void CGameClient::OnNewSnapshot() { // clear out the invalid pointers mem_zero(&m_Snap, sizeof(m_Snap)); // secure snapshot { int Num = Client()->SnapNumItems(IClient::SNAP_CURRENT); for(int Index = 0; Index < Num; Index++) { IClient::CSnapItem Item; const void *pData = Client()->SnapGetItem(IClient::SNAP_CURRENT, Index, &Item); if(m_NetObjHandler.ValidateObj(Item.m_Type, pData, Item.m_DataSize) != 0) { if(g_Config.m_Debug) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "invalidated index=%d type=%d (%s) size=%d id=%d", Index, Item.m_Type, m_NetObjHandler.GetObjName(Item.m_Type), Item.m_DataSize, Item.m_ID); Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf); } Client()->SnapInvalidateItem(IClient::SNAP_CURRENT, Index); } } } ProcessEvents(); if(g_Config.m_DbgStress) { if((Client()->GameTick()%100) == 0) { char aMessage[64]; int MsgLen = random_int()%(sizeof(aMessage)-1); for(int i = 0; i < MsgLen; i++) aMessage[i] = 'a'+(random_int()%('z'-'a')); aMessage[MsgLen] = 0; CNetMsg_Cl_Say Msg; Msg.m_Mode = random_int()&1; Msg.m_Target = -1; Msg.m_pMessage = aMessage; Client()->SendPackMsg(&Msg, MSGFLAG_VITAL); } } CTuningParams StandardTuning; if(Client()->State() == IClient::STATE_DEMOPLAYBACK) { m_Tuning = StandardTuning; mem_zero(&m_GameInfo, sizeof(m_GameInfo)); } // go trough all the items in the snapshot and gather the info we want { int Num = Client()->SnapNumItems(IClient::SNAP_CURRENT); for(int i = 0; i < Num; i++) { IClient::CSnapItem Item; const void *pData = Client()->SnapGetItem(IClient::SNAP_CURRENT, i, &Item); // demo items if(Client()->State() == IClient::STATE_DEMOPLAYBACK) { if(Item.m_Type == NETOBJTYPE_DE_CLIENTINFO) { const CNetObj_De_ClientInfo *pInfo = (const CNetObj_De_ClientInfo *)pData; int ClientID = Item.m_ID; CClientData *pClient = &m_aClients[ClientID]; if(pInfo->m_Local) m_LocalClientID = ClientID; pClient->m_Active = true; pClient->m_Team = pInfo->m_Team; IntsToStr(pInfo->m_aName, 4, pClient->m_aName); IntsToStr(pInfo->m_aClan, 3, pClient->m_aClan); pClient->m_Country = pInfo->m_Country; for(int p = 0; p < NUM_SKINPARTS; p++) { IntsToStr(pInfo->m_aaSkinPartNames[p], 6, pClient->m_aaSkinPartNames[p]); pClient->m_aUseCustomColors[p] = pInfo->m_aUseCustomColors[p]; pClient->m_aSkinPartColors[p] = pInfo->m_aSkinPartColors[p]; } m_GameInfo.m_NumPlayers++; // calculate team-balance if(pClient->m_Team != TEAM_SPECTATORS) m_GameInfo.m_aTeamSize[pClient->m_Team]++; } else if(Item.m_Type == NETOBJTYPE_DE_GAMEINFO) { const CNetObj_De_GameInfo *pInfo = (const CNetObj_De_GameInfo *)pData; m_GameInfo.m_GameFlags = pInfo->m_GameFlags; m_GameInfo.m_ScoreLimit = pInfo->m_ScoreLimit; m_GameInfo.m_TimeLimit = pInfo->m_TimeLimit; m_GameInfo.m_MatchNum = pInfo->m_MatchNum; m_GameInfo.m_MatchCurrent = pInfo->m_MatchCurrent; } else if(Item.m_Type == NETOBJTYPE_DE_TUNEPARAMS) { const CNetObj_De_TuneParams *pInfo = (const CNetObj_De_TuneParams *)pData; mem_copy(&m_Tuning, pInfo->m_aTuneParams, sizeof(m_Tuning)); m_ServerMode = SERVERMODE_PURE; } } // network items if(Item.m_Type == NETOBJTYPE_PLAYERINFO) { const CNetObj_PlayerInfo *pInfo = (const CNetObj_PlayerInfo *)pData; int ClientID = Item.m_ID; if(m_aClients[ClientID].m_Active) { m_Snap.m_paPlayerInfos[ClientID] = pInfo; m_Snap.m_aInfoByScore[ClientID].m_pPlayerInfo = pInfo; m_Snap.m_aInfoByScore[ClientID].m_ClientID = ClientID; if(m_LocalClientID == ClientID) { m_Snap.m_pLocalInfo = pInfo; if(m_aClients[ClientID].m_Team == TEAM_SPECTATORS) { m_Snap.m_SpecInfo.m_Active = true; m_Snap.m_SpecInfo.m_SpecMode = SPEC_FREEVIEW; m_Snap.m_SpecInfo.m_SpectatorID = -1; } } } } else if(Item.m_Type == NETOBJTYPE_CHARACTER) { const void *pOld = Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_CHARACTER, Item.m_ID); m_Snap.m_aCharacters[Item.m_ID].m_Cur = *((const CNetObj_Character *)pData); // clamp ammo count for non ninja weapon if(m_Snap.m_aCharacters[Item.m_ID].m_Cur.m_Weapon != WEAPON_NINJA) m_Snap.m_aCharacters[Item.m_ID].m_Cur.m_AmmoCount = clamp(m_Snap.m_aCharacters[Item.m_ID].m_Cur.m_AmmoCount, 0, 10); if(pOld) { m_Snap.m_aCharacters[Item.m_ID].m_Active = true; m_Snap.m_aCharacters[Item.m_ID].m_Prev = *((const CNetObj_Character *)pOld); if(m_Snap.m_aCharacters[Item.m_ID].m_Prev.m_Tick) EvolveCharacter(&m_Snap.m_aCharacters[Item.m_ID].m_Prev, Client()->PrevGameTick()); if(m_Snap.m_aCharacters[Item.m_ID].m_Cur.m_Tick) EvolveCharacter(&m_Snap.m_aCharacters[Item.m_ID].m_Cur, Client()->GameTick()); } if(Item.m_ID != m_LocalClientID || Client()->State() == IClient::STATE_DEMOPLAYBACK) ProcessTriggeredEvents(m_Snap.m_aCharacters[Item.m_ID].m_Cur.m_TriggeredEvents, vec2(m_Snap.m_aCharacters[Item.m_ID].m_Cur.m_X, m_Snap.m_aCharacters[Item.m_ID].m_Cur.m_Y)); } else if(Item.m_Type == NETOBJTYPE_SPECTATORINFO) { m_Snap.m_pSpectatorInfo = (const CNetObj_SpectatorInfo *)pData; m_Snap.m_pPrevSpectatorInfo = (const CNetObj_SpectatorInfo *)Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_SPECTATORINFO, Item.m_ID); m_Snap.m_SpecInfo.m_Active = true; m_Snap.m_SpecInfo.m_SpecMode = m_Snap.m_pSpectatorInfo->m_SpecMode; m_Snap.m_SpecInfo.m_SpectatorID = m_Snap.m_pSpectatorInfo->m_SpectatorID; } else if(Item.m_Type == NETOBJTYPE_GAMEDATA) { m_Snap.m_pGameData = (const CNetObj_GameData *)pData; static bool s_GameOver = 0; if(!s_GameOver && m_Snap.m_pGameData->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER) OnGameOver(); else if(s_GameOver && !(m_Snap.m_pGameData->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER)) OnStartGame(); s_GameOver = m_Snap.m_pGameData->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER; } else if(Item.m_Type == NETOBJTYPE_GAMEDATATEAM) { m_Snap.m_pGameDataTeam = (const CNetObj_GameDataTeam *)pData; } else if(Item.m_Type == NETOBJTYPE_GAMEDATAFLAG) { m_Snap.m_pGameDataFlag = (const CNetObj_GameDataFlag *)pData; m_Snap.m_GameDataFlagSnapID = Item.m_ID; } else if(Item.m_Type == NETOBJTYPE_FLAG) m_Snap.m_paFlags[Item.m_ID%2] = (const CNetObj_Flag *)pData; } } // setup local pointers if(m_LocalClientID >= 0) { CSnapState::CCharacterInfo *c = &m_Snap.m_aCharacters[m_LocalClientID]; if(c->m_Active) { m_Snap.m_pLocalCharacter = &c->m_Cur; m_Snap.m_pLocalPrevCharacter = &c->m_Prev; m_LocalCharacterPos = vec2(m_Snap.m_pLocalCharacter->m_X, m_Snap.m_pLocalCharacter->m_Y); } else if(Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_CHARACTER, m_LocalClientID)) { // player died m_pControls->OnPlayerDeath(); } } else { m_Snap.m_SpecInfo.m_Active = true; if(Client()->State() == IClient::STATE_DEMOPLAYBACK && DemoPlayer()->GetDemoType() == IDemoPlayer::DEMOTYPE_SERVER && m_DemoSpecID != -1 && m_Snap.m_aCharacters[m_DemoSpecID].m_Active) { m_Snap.m_SpecInfo.m_SpecMode = SPEC_PLAYER; m_Snap.m_SpecInfo.m_SpectatorID = m_DemoSpecID; } else { if (m_DemoSpecMode == SPEC_PLAYER) { m_Snap.m_SpecInfo.m_SpecMode = SPEC_FREEVIEW; m_Snap.m_SpecInfo.m_SpectatorID = -1; } else { m_Snap.m_SpecInfo.m_SpecMode = m_DemoSpecMode; m_Snap.m_SpecInfo.m_SpectatorID = m_DemoSpecID; } } } // sort player infos by score for(int k = 0; k < MAX_CLIENTS-1; k++) // ffs, bubblesort { for(int i = 0; i < MAX_CLIENTS-k-1; i++) { if(m_Snap.m_aInfoByScore[i+1].m_pPlayerInfo && (!m_Snap.m_aInfoByScore[i].m_pPlayerInfo || m_Snap.m_aInfoByScore[i].m_pPlayerInfo->m_Score < m_Snap.m_aInfoByScore[i+1].m_pPlayerInfo->m_Score)) { CPlayerInfoItem Tmp = m_Snap.m_aInfoByScore[i]; m_Snap.m_aInfoByScore[i] = m_Snap.m_aInfoByScore[i+1]; m_Snap.m_aInfoByScore[i+1] = Tmp; } } } // calc some player stats for(int i = 0; i < MAX_CLIENTS; ++i) { if(!m_Snap.m_paPlayerInfos[i]) continue; // count not ready players if((m_Snap.m_pGameData->m_GameStateFlags&(GAMESTATEFLAG_STARTCOUNTDOWN|GAMESTATEFLAG_PAUSED|GAMESTATEFLAG_WARMUP)) && m_Snap.m_pGameData->m_GameStateEndTick == 0 && m_aClients[i].m_Team != TEAM_SPECTATORS && !(m_Snap.m_paPlayerInfos[i]->m_PlayerFlags&PLAYERFLAG_READY)) m_Snap.m_NotReadyCount++; // count alive players per team if((m_GameInfo.m_GameFlags&GAMEFLAG_SURVIVAL) && m_aClients[i].m_Team != TEAM_SPECTATORS && !(m_Snap.m_paPlayerInfos[i]->m_PlayerFlags&PLAYERFLAG_DEAD)) m_Snap.m_AliveCount[m_aClients[i].m_Team]++; } if(Client()->State() == IClient::STATE_DEMOPLAYBACK) { for(int i = 0; i < MAX_CLIENTS; ++i) { if(m_aClients[i].m_Active) m_aClients[i].UpdateRenderInfo(this, true); } } CServerInfo CurrentServerInfo; Client()->GetServerInfo(&CurrentServerInfo); if(str_comp(CurrentServerInfo.m_aGameType, "DM") != 0 && str_comp(CurrentServerInfo.m_aGameType, "TDM") != 0 && str_comp(CurrentServerInfo.m_aGameType, "CTF") != 0 && str_comp(CurrentServerInfo.m_aGameType, "LMS") != 0 && str_comp(CurrentServerInfo.m_aGameType, "SUR") != 0) m_ServerMode = SERVERMODE_MOD; else if(mem_comp(&StandardTuning, &m_Tuning, sizeof(CTuningParams)) == 0) m_ServerMode = SERVERMODE_PURE; else m_ServerMode = SERVERMODE_PUREMOD; }
//============================================================================== void CApp::OnLoop() { count++; if (count == 5) { Samus.X = 50; Samus.Y = 50; Simon.X = 50; Simon.Y = 50; OnPosReset(); } //-------------------------------------------------------------------------- // Entities //-------------------------------------------------------------------------- for(int i = 0;i < CEntity::EntityList.size();i++) { if(!CEntity::EntityList[i]) continue; CEntity::EntityList[i]->OnLoop();//call the loop function of each entity } //loop through all collision incidents for(int i = 0;i < CEntityCol::EntityColList.size();i++) { CEntity* EntityA = CEntityCol::EntityColList[i].EntityA;//load first entity CEntity* EntityB = CEntityCol::EntityColList[i].EntityB;//load second entity if(EntityA == NULL || EntityB == NULL) continue;//if there were no entitys colided with then keep going if(EntityA->OnCollision(EntityB)) {//load oncollision for entity A with b EntityB->OnCollision(EntityA);//load onCollision for entity b with a } } CEntityCol::EntityColList.clear();//clear the collision list CFPS::FPSControl.OnLoop();//loop to check the frames per second char Buffer[255]; sprintf(Buffer, "%d", CFPS::FPSControl.GetFPS()); SDL_WM_SetCaption(Buffer, Buffer);// set the caption of game if(metroid) {//if we are playing samus update the appropriate enemys on her current position //skeleton player tracking Alpha.playerPos = Samus.X; Alpha.yPlayerPos= Samus.Y; Bravo.playerPos = Samus.X; Bravo.yPlayerPos = Samus.Y; Charlie.playerPos = Samus.X; Charlie.yPlayerPos= Samus.Y; Delta.playerPos = Samus.X; Delta.yPlayerPos= Samus.Y; Echo.playerPos = Samus.X; Echo.yPlayerPos= Samus.Y; Foxtrot.playerPos = Samus.X; Foxtrot.yPlayerPos= Samus.Y; Golf.playerPos = Samus.X; Golf.yPlayerPos= Samus.Y; Hotel.playerPos = Samus.X; Hotel.yPlayerPos= Samus.Y; India.playerPos = Samus.X; India.yPlayerPos= Samus.Y; //dog player tracking Ramza.playerPos = Samus.X; Ramza.yPlayerPos= Samus.Y; Firion.playerPos = Samus.X; Firion.yPlayerPos = Samus.Y; Luneth.playerPos = Samus.X; Luneth.yPlayerPos= Samus.Y; Cecil.playerPos = Samus.X; Cecil.yPlayerPos= Samus.Y; Bartz.playerPos = Samus.X; Bartz.yPlayerPos= Samus.Y; Terra.playerPos = Samus.X; Terra.yPlayerPos= Samus.Y; Cloud.playerPos = Samus.X; Cloud.yPlayerPos= Samus.Y; Squall.playerPos = Samus.X; Squall.yPlayerPos= Samus.Y; Zidane.playerPos = Samus.X; Zidane.yPlayerPos= Samus.Y; Tidus.playerPos = Samus.X; Tidus.yPlayerPos= Samus.Y; Mog.playerPos = Samus.X; Mog.yPlayerPos = Samus.Y; Vaan.playerPos = Samus.X; Vaan.yPlayerPos = Samus.Y; Lightning.playerPos = Samus.X; Lightning.yPlayerPos= Samus.Y; if(Samus.Dead==true) {//if she is dead OnGameOver();//run onGameOver } } if(castlevania) {//if we are playing simon update the appropriate enemys on his current position //skeleton player tracking Alpha.playerPos = Simon.X; Alpha.yPlayerPos= Simon.Y; Bravo.playerPos = Simon.X; Bravo.yPlayerPos = Simon.Y; Charlie.playerPos = Simon.X; Charlie.yPlayerPos= Simon.Y; Delta.playerPos = Simon.X; Delta.yPlayerPos= Simon.Y; Echo.playerPos = Simon.X; Echo.yPlayerPos= Simon.Y; Foxtrot.playerPos = Simon.X; Foxtrot.yPlayerPos= Simon.Y; Golf.playerPos = Simon.X; Golf.yPlayerPos= Simon.Y; Hotel.playerPos = Simon.X; Hotel.yPlayerPos= Simon.Y; India.playerPos = Simon.X; India.yPlayerPos= Simon.Y; //dog player tracking Ramza.playerPos = Simon.X; Ramza.yPlayerPos= Simon.Y; Firion.playerPos = Simon.X; Firion.yPlayerPos = Simon.Y; Luneth.playerPos = Simon.X; Luneth.yPlayerPos= Simon.Y; Cecil.playerPos = Simon.X; Cecil.yPlayerPos= Simon.Y; Bartz.playerPos = Simon.X; Bartz.yPlayerPos= Simon.Y; Terra.playerPos = Simon.X; Terra.yPlayerPos= Simon.Y; Cloud.playerPos = Simon.X; Cloud.yPlayerPos= Simon.Y; Squall.playerPos = Simon.X; Squall.yPlayerPos= Simon.Y; Zidane.playerPos = Simon.X; Zidane.yPlayerPos= Simon.Y; Tidus.playerPos = Simon.X; Tidus.yPlayerPos= Simon.Y; Mog.playerPos = Simon.X; Mog.yPlayerPos = Simon.Y; Vaan.playerPos = Simon.X; Vaan.yPlayerPos = Simon.Y; Lightning.playerPos = Simon.X; Lightning.yPlayerPos= Simon.Y; if(Simon.Dead==true) {//if he is dead OnGameOver();//run onGameOver } if(Simon.Attack && Simon.AttackTimer > 30 && Simon.AttackTimer <= 90 && Simon.PointUp) {//if simon has been attacking for 30 cycles already and is pointing up CWhip* VerticalWhip = new CWhip;//declare a new verticalwhip entity VerticalWhip->OnLoad("./images/VerticalWhip.png", 6, 52, 2);//load its image if(Simon.faceRight) {//if hes facing to the right make the whip appear in the appropriate spot in relation to simon VerticalWhip->X = Simon.X + 19; VerticalWhip->Y = Simon.Y - 52; VerticalWhip->CurrentFrameCol = 0; } if(Simon.faceLeft) {//if hes facing left find the right spot VerticalWhip->X = Simon.X + 6; VerticalWhip->Y = Simon.Y - 52; VerticalWhip->CurrentFrameCol = 1; } CEntity::EntityList.push_back(VerticalWhip);//push the whip into the entity list } else if(Simon.Attack && Simon.AttackTimer > 60 && Simon.AttackTimer <= 90 && !Simon.PointUp) {//if simon has been attacking for 60 cycles already and is not pointin up CWhip* HorizontalWhip = new CWhip;//declare a new horizontalwhip entity HorizontalWhip->OnLoad("./images/HorizontalWhip.png", 50, 5, 2);//load the image if(Simon.faceRight) {//if simon is facing to the right make it appear in the correct spot HorizontalWhip->X = Simon.X + 30; HorizontalWhip->Y = Simon.Y + 15; HorizontalWhip->CurrentFrameCol = 0; } if(Simon.faceLeft) {//if simon is facing to the left make it appear in the correct spot HorizontalWhip->X = Simon.X - 50; HorizontalWhip->Y = Simon.Y + 15; HorizontalWhip->CurrentFrameCol = 1; } CEntity::EntityList.push_back(HorizontalWhip);//push the entity into the list } } std::vector<CEntity*>::iterator i;//declare an iterator of type centity pointer enemyCounter = 0;//reset the counter so that we can count the number of enemys again for(i = CEntity::EntityList.begin(); i != CEntity::EntityList.end(); i++){ if(((*i)->Type == ENTITY_TYPE_DOG) || ((*i)->Type == ENTITY_TYPE_INSECT) || ((*i)->Type == ENTITY_TYPE_SKELETON)){//if the entity is a killable enemy, increment the counter enemyCounter++; } if(((*i)->Type == ENTITY_TYPE_BULLET) && ((*i)->Dead == true)){//if the entity is of type bullet and its "dead" CExplode* expl = new CExplode;//declare a new entity of type explode expl->OnLoad("images/ShotDeath.png",34,34,0);//load the image of a shot "dieing" expl->X = (*i)->X-12;//find the proper coordinants of the explosion expl->Y = (*i)->Y-12; expl->fm = 7; expl->cyclelimit = 160; delete(*i);//delete the bullet if(i != CEntity::EntityList.end()) CEntity::EntityList.erase(i--);//remove it from the list if(i == CEntity::EntityList.end()) CEntity::EntityList.pop_back(); CEntity::EntityList.push_back(expl); //pushes back the explosion after deleting the bullet } if(((*i)->Type == ENTITY_TYPE_INSECT) && ((*i)->Dead == true)){//if the entity is of type insect and its dead (*i)->OnCleanup();//clean it up CExplode* bug = new CExplode;//declare a new entity of type explode (its our death class) bug->OnLoad("images/InsectDeath.png",60,50,0);//load the image of insect death bug->X = (*i)->X;//find the proper coordinants of the insect bug->Y = (*i)->Y; bug->fm = 4; bug->cyclelimit = 160; if(i != CEntity::EntityList.end()) CEntity::EntityList.erase(i--);//pop the insect out if(i == CEntity::EntityList.end()) CEntity::EntityList.pop_back(); CEntity::EntityList.push_back(bug); //push back the bug } if(((*i)->Type == ENTITY_TYPE_SKELETON) && ((*i)->Dead == true)){//if the entity is of type skeleton and its dead CExplode* bones = new CExplode;//declare its death entity bones->OnLoad("images/SkeletonDeath.png",30,52,0);//load its death image bones->X = (*i)->X;//update location bones->Y = (*i)->Y; bones->fm = 7; bones->cyclelimit = 200; (*i)->OnCleanup();//clean up skeleton if(i != CEntity::EntityList.end()) CEntity::EntityList.erase(i--);//pop skeleton out of list if(i == CEntity::EntityList.end()) CEntity::EntityList.pop_back(); CEntity::EntityList.push_back(bones); //push back the skeleton death } if (((*i)->Type == ENTITY_TYPE_DOG) && ((*i)->Dead == true)) {//if entity is of type dog and its dead CExplode* mutt = new CExplode;//declare its death entity mutt->OnLoad("images/DogDeath.png",35,25,0);//load its death image mutt->X = (*i)->X;//update its position mutt->Y = (*i)->Y; mutt->fm = 7; mutt->cyclelimit = 200; (*i)->OnCleanup();//clean it up if(i != CEntity::EntityList.end()) CEntity::EntityList.erase(i--);//pop the dog out if(i == CEntity::EntityList.end()) CEntity::EntityList.pop_back(); CEntity::EntityList.push_back(mutt);//push back dog death } if(((*i)->Type == ENTITY_TYPE_WHIP) && ((Simon.AttackTimer <= 60 && !Simon.PointUp) || (Simon.AttackTimer <= 30 && Simon.PointUp))){//if simon is not facing up and has been attacking less then 60 cycles or if he is facing up and has been attacking for less then 30 cycles delete(*i);//delete it if(i != CEntity::EntityList.end()) CEntity::EntityList.erase(i--);//pop it out if(i == CEntity::EntityList.end()) CEntity::EntityList.pop_back(); } if(((*i)->Type == ENTITY_TYPE_BOMB) && ((*i)->Dead == true)){ //delete the bomb pointers delete(*i);//delete it if(i != CEntity::EntityList.end()) CEntity::EntityList.erase(i--); //pop it out of list if(i == CEntity::EntityList.end()) CEntity::EntityList.pop_back(); } } if (enemyCounter == 0) {//if all enemys are death go to the victory screen after a short delay waitingCounter++; if (waitingCounter > 500) OnVictory(); } }