Пример #1
0
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);
		}
	}
}
Пример #2
0
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);
	}
}
Пример #3
0
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;
}
Пример #4
0
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;
}
Пример #5
0
static void DeleteItem(Mission *m, int idx)
{
	CArrayDelete(&m->Items, idx);
	CArrayDelete(&m->ItemDensities, idx);
}
Пример #6
0
static void DeleteSpecial(Mission *m, int idx)
{
	CArrayDelete(&m->SpecialChars, idx);
	CharacterStoreDeleteSpecial(&gCampaign.Setting.characters, idx);
}
Пример #7
0
static void DeleteCharacter(Mission *m, int idx)
{
	CArrayDelete(&m->Enemies, idx);
	CharacterStoreDeleteBaddie(&gCampaign.Setting.characters, idx);
}
Пример #8
0
static void DeleteObjective(Mission *m, int idx)
{
	CArrayDelete(&m->Objectives, idx);
}
Пример #9
0
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;
}
Пример #10
0
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);
}