void ParticlesUpdate(const Uint32 ms) { for (int i = 0; i < (int)Particles.size; i++) { Particle *p = CArrayGet(&Particles, i); if (!ParticleUpdate(p, ms)) { CArrayDelete(&Particles, i); } } }
void DeleteMission(CampaignOptions *co) { CASSERT( co->MissionIndex < (int)co->Setting.Missions.size, "invalid mission index"); MissionTerminate(CampaignGetCurrentMission(co)); CArrayDelete(&co->Setting.Missions, co->MissionIndex); if (co->MissionIndex >= (int)co->Setting.Missions.size) { co->MissionIndex = MAX(0, (int)co->Setting.Missions.size - 1); } }
static bool TryRemoveMapObjectAt(const Vec2i pos, CArray *objs) { for (int i = 0; i < (int)objs->size; i++) { MapObjectPositions *mop = CArrayGet(objs, i); for (int j = 0; j < (int)mop->Positions.size; j++) { const Vec2i *mopPos = CArrayGet(&mop->Positions, j); if (Vec2iEqual(*mopPos, pos)) { CArrayDelete(&mop->Positions, j); if (mop->Positions.size == 0) { CArrayTerminate(&mop->Positions); CArrayDelete(objs, i); } return true; } } } return false; }
static int PlayerListInput(int cmd, void *data) { // Input: up/down scrolls list // CMD 1/2: exit PlayerList *pl = data; // Note: players can leave due to network disconnection // Update our lists CA_FOREACH(const int, playerUID, pl->playerUIDs) const PlayerData *p = PlayerDataGetByUID(*playerUID); if (p == NULL) { CArrayDelete(&pl->playerUIDs, _ca_index); _ca_index--; } CA_FOREACH_END() if (cmd == CMD_DOWN) { SoundPlay(&gSoundDevice, StrSound("door")); pl->scroll++; } else if (cmd == CMD_UP) { SoundPlay(&gSoundDevice, StrSound("door")); pl->scroll--; } else if (AnyButton(cmd)) { SoundPlay(&gSoundDevice, StrSound("pickup")); return 1; } // Scroll wrap-around pl->scroll = CLAMP_OPPOSITE(pl->scroll, 0, PlayerListMaxScroll(pl)); return 0; }
static void DeleteItem(Mission *m, int idx) { CArrayDelete(&m->Items, idx); CArrayDelete(&m->ItemDensities, idx); }
static void DeleteSpecial(Mission *m, int idx) { CArrayDelete(&m->SpecialChars, idx); CharacterStoreDeleteSpecial(&gCampaign.Setting.characters, idx); }
static void DeleteCharacter(Mission *m, int idx) { CArrayDelete(&m->Enemies, idx); CharacterStoreDeleteBaddie(&gCampaign.Setting.characters, idx); }
static void DeleteObjective(Mission *m, int idx) { CArrayDelete(&m->Objectives, idx); }
bool GameOptions(const GameMode gm) { // Create selection menus const int w = gGraphicsDevice.cachedConfig.Res.x; const int h = gGraphicsDevice.cachedConfig.Res.y; MenuSystem ms; MenuSystemInit( &ms, &gEventHandlers, &gGraphicsDevice, Vec2iZero(), Vec2iNew(w, h)); ms.align = MENU_ALIGN_CENTER; ms.allowAborts = true; AllowedWeaponsData awData; AllowedWeaponsDataInit(&awData, &gMission.Weapons); switch (gm) { case GAME_MODE_DEATHMATCH: ms.root = ms.current = MenuCreateNormal( "", "", MENU_TYPE_OPTIONS, 0); MenuAddConfigOptionsItem( ms.current, ConfigGet(&gConfig, "Game.PlayerHP")); MenuAddConfigOptionsItem( ms.current, ConfigGet(&gConfig, "Deathmatch.Lives")); MenuAddConfigOptionsItem( ms.current, ConfigGet(&gConfig, "Game.HealthPickups")); MenuAddConfigOptionsItem( ms.current, ConfigGet(&gConfig, "Game.Ammo")); MenuAddSubmenu(ms.current, MenuCreateAllowedWeapons("Weapons...", &awData)); MenuAddSubmenu(ms.current, MenuCreateSeparator("")); MenuAddSubmenu(ms.current, MenuCreateReturn("Done", 0)); break; case GAME_MODE_DOGFIGHT: ms.root = ms.current = MenuCreateNormal( "", "", MENU_TYPE_OPTIONS, 0); MenuAddConfigOptionsItem( ms.current, ConfigGet(&gConfig, "Dogfight.PlayerHP")); MenuAddConfigOptionsItem( ms.current, ConfigGet(&gConfig, "Dogfight.FirstTo")); MenuAddSubmenu(ms.current, MenuCreateAllowedWeapons("Weapons...", &awData)); MenuAddSubmenu(ms.current, MenuCreateSeparator("")); MenuAddSubmenu(ms.current, MenuCreateReturn("Done", 0)); break; default: CASSERT(false, "unknown game mode"); break; } MenuAddExitType(&ms, MENU_TYPE_RETURN); MenuLoop(&ms); const bool ok = !ms.hasAbort; if (ok) { ConfigApply(&gConfig); // Save options for later ConfigSave(&gConfig, GetConfigFilePath(CONFIG_FILE)); // Set allowed weapons // First check if the player has unwittingly disabled all weapons // if so, enable all weapons bool allDisabled = true; for (int i = 0, j = 0; i < (int)awData.allowed.size; i++, j++) { const bool *allowed = CArrayGet(&awData.allowed, i); if (*allowed) { allDisabled = false; break; } } if (!allDisabled) { for (int i = 0, j = 0; i < (int)awData.allowed.size; i++, j++) { const bool *allowed = CArrayGet(&awData.allowed, i); if (!*allowed) { CArrayDelete(&gMission.Weapons, j); j--; } } } } AllowedWeaponsDataTerminate(&awData); MenuSystemTerminate(&ms); return ok; }
void NetInputPoll(NetInput *n) { if (!n->server) { return; } n->PrevCmd = n->Cmd; n->Cmd = 0; ENetEvent event; int check; do { check = enet_host_service(n->server, &event, 0); if (check < 0) { fprintf(stderr, "Host check event failure\n"); enet_host_destroy(n->server); n->server = NULL; return; } else if (check > 0) { switch (event.type) { case ENET_EVENT_TYPE_CONNECT: printf("A new client connected from %x:%u.\n", event.peer->address.host, event.peer->address.port); CArrayPushBack(&n->peers, &event.peer); /* Store any relevant client information here. */ event.peer->data = (void *)n->peerId; n->peerId++; break; case ENET_EVENT_TYPE_RECEIVE: if (event.packet->dataLength > 0) { ClientMsg msg = *(uint32_t *)event.packet->data; switch (msg) { case CLIENT_MSG_CMD: { NetMsgCmd *nc = (NetMsgCmd *)(event.packet->data + NET_MSG_SIZE); CASSERT( event.packet->dataLength == NET_MSG_SIZE + sizeof *nc, "unexpected packet size"); n->Cmd = nc->cmd; } break; default: printf("Unknown message type %d\n", msg); break; } } //printf("A packet of length %u containing %s was received from %s on channel %u.\n", // event.packet->dataLength, // event.packet->data, // event.peer->data, // event.channelID); /* Clean up the packet now that we're done using it. */ enet_packet_destroy(event.packet); break; case ENET_EVENT_TYPE_DISCONNECT: { printf("disconnected %x:%u.\n", event.peer->address.host, event.peer->address.port); // Find the peer by id and delete bool found = false; for (int i = 0; i < (int)n->peers.size; i++) { ENetPeer **peer = CArrayGet(&n->peers, i); if ((int)(*peer)->data == (int)event.peer->data) { CArrayDelete(&n->peers, i); found = true; break; } } CASSERT(found, "Cannot find peer by id"); /* Reset the peer's client information. */ event.peer->data = NULL; } break; default: CASSERT(false, "Unknown event"); break; } } } while (check > 0); }