static void AddPickupAtObject(const TObject *o, const PickupType type) { GameEvent e = GameEventNew(GAME_EVENT_ADD_PICKUP); switch (type) { case PICKUP_JEWEL: CASSERT(false, "unexpected pickup type"); break; case PICKUP_HEALTH: if (!ConfigGetBool(&gConfig, "Game.HealthPickups")) { return; } strcpy(e.u.AddPickup.PickupClass, "health"); break; case PICKUP_AMMO: if (!ConfigGetBool(&gConfig, "Game.Ammo")) { return; } // Pick a random ammo type and spawn it { const int ammoId = rand() % AmmoGetNumClasses(&gAmmo); const Ammo *a = AmmoGetById(&gAmmo, ammoId); sprintf(e.u.AddPickup.PickupClass, "ammo_%s", a->Name); } break; case PICKUP_KEYCARD: CASSERT(false, "unexpected pickup type"); break; case PICKUP_GUN: // Pick a random mission gun type and spawn it { const int gunId = (int)(rand() % gMission.Weapons.size); const WeaponClass **wc = CArrayGet(&gMission.Weapons, gunId); sprintf(e.u.AddPickup.PickupClass, "gun_%s", (*wc)->name); } break; default: CASSERT(false, "unexpected pickup type"); break; } e.u.AddPickup.UID = PickupsGetNextUID(); e.u.AddPickup.Pos = Vec2ToNet(o->thing.Pos); e.u.AddPickup.IsRandomSpawned = true; e.u.AddPickup.SpawnerUID = -1; e.u.AddPickup.ThingFlags = 0; GameEventsEnqueue(&gGameEvents, e); }
void UpdateObjects(const int ticks) { for (int i = 0; i < (int)gObjs.size; i++) { TObject *obj = CArrayGet(&gObjs, i); if (!obj->isInUse) { continue; } switch (obj->Class->Type) { case MAP_OBJECT_TYPE_PICKUP_SPAWNER: if (gCampaign.IsClient) break; // If counter -1, it is inactive i.e. already spawned pickup if (obj->counter == -1) { break; } obj->counter -= ticks; if (obj->counter <= 0) { // Deactivate spawner by setting counter to -1 // Spawner reactivated only when ammo taken obj->counter = -1; GameEvent e = GameEventNew(GAME_EVENT_ADD_PICKUP); e.u.AddPickup.UID = PickupsGetNextUID(); strcpy( e.u.AddPickup.PickupClass, obj->Class->u.PickupClass->Name); e.u.AddPickup.IsRandomSpawned = false; e.u.AddPickup.SpawnerUID = obj->uid; e.u.AddPickup.TileItemFlags = 0; e.u.AddPickup.Pos = Vec2i2Net(Vec2iNew(obj->tileItem.x, obj->tileItem.y)); GameEventsEnqueue(&gGameEvents, e); } break; default: // Do nothing break; } } }