int PlayerEquip(int numPlayers, GraphicsDevice *graphics) { int i; WeaponMenu menus[MAX_PLAYERS]; for (i = 0; i < numPlayers; i++) { WeaponMenuCreate( &menus[i], numPlayers, i, &gCampaign.Setting.characters.players[i], &gPlayerDatas[i], &gInputDevices, graphics, &gConfig.Input); } debug(D_NORMAL, "\n"); for (;;) { int cmds[MAX_PLAYERS]; int isDone = 1; InputPoll(&gInputDevices, SDL_GetTicks()); if (KeyIsPressed(&gInputDevices.keyboard, SDLK_ESCAPE)) { return 0; // hack to exit from menu } GetPlayerCmds(&cmds, gPlayerDatas); for (i = 0; i < numPlayers; i++) { if (!MenuIsExit(&menus[i].ms)) { MenuProcessCmd(&menus[i].ms, cmds[i]); } else if (gPlayerDatas[i].weaponCount == 0) { // Check exit condition; must have selected at least one weapon // Otherwise reset the current menu menus[i].ms.current = menus[i].ms.root; } } for (i = 0; i < numPlayers; i++) { if (!MenuIsExit(&menus[i].ms)) { isDone = 0; } } if (isDone) { break; } GraphicsBlitBkg(graphics); for (i = 0; i < numPlayers; i++) { MenuDisplay(&menus[i].ms); } BlitFlip(graphics, &gConfig.Graphics); SDL_Delay(10); } for (i = 0; i < numPlayers; i++) { MenuSystemTerminate(&menus[i].ms); } return 1; }
bool PlayerEquip(void) { PlayerEquipData data; memset(&data, 0, sizeof data); data.IsOK = true; for (int i = 0, idx = 0; i < (int)gPlayerDatas.size; i++, idx++) { PlayerData *p = CArrayGet(&gPlayerDatas, i); if (!p->IsLocal) { idx--; continue; } // Remove unavailable weapons from players inventories RemoveUnavailableWeapons(p, &gMission.Weapons); WeaponMenuCreate( &data.menus[idx], GetNumPlayers(false, false, true), idx, i, &gEventHandlers, &gGraphicsDevice); // For AI players, pre-pick their weapons and go straight to menu end if (p->inputDevice == INPUT_DEVICE_AI) { const int lastMenuIndex = (int)data.menus[idx].ms.root->u.normal.subMenus.size - 1; data.menus[idx].ms.current = CArrayGet( &data.menus[idx].ms.root->u.normal.subMenus, lastMenuIndex); AICoopSelectWeapons(p, idx, &gMission.Weapons); } } GameLoopData gData = GameLoopDataNew( &data, PlayerEquipUpdate, &data, PlayerEquipDraw); GameLoop(&gData); for (int i = 0, idx = 0; i < (int)gPlayerDatas.size; i++, idx++) { PlayerData *p = CArrayGet(&gPlayerDatas, i); if (!p->IsLocal) { idx--; continue; } const NetMsgPlayerData d = NetMsgMakePlayerData(p); // Ready player definitions p->IsUsed = true; if (gCampaign.IsClient) { NetClientSendMsg(&gNetClient, MSG_PLAYER_DATA, &d); } else { NetServerBroadcastMsg(&gNetServer, MSG_PLAYER_DATA, &d); } } for (int i = 0; i < GetNumPlayers(false, false, true); i++) { MenuSystemTerminate(&data.menus[i].ms); } return data.IsOK; }