blobwarsAttrition/src/entities/entityFactory.c

154 lines
4.6 KiB
C
Raw Permalink Normal View History

2018-01-29 23:12:18 +01:00
/*
2019-06-02 17:13:34 +02:00
Copyright (C) 2018-2019 Parallel Realities
2018-01-29 23:12:18 +01:00
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "entityFactory.h"
2018-01-30 09:29:09 +01:00
static void addEntityDef(char *name, Entity *(*initFunc)(void));
static Entity *initGenericEvilBlob(void);
static Entity *initGenericEyeDroid(void);
2018-01-29 23:12:18 +01:00
static EntityDef head;
static EntityDef *tail;
void initEntityFactory(void)
{
memset(&head, 0, sizeof(EntityDef));
tail = &head;
2019-06-02 17:13:34 +02:00
2018-01-30 09:29:09 +01:00
addEntityDef("AquaBlob", initAquaBlob);
addEntityDef("PistolBlob", initPistolBlob);
addEntityDef("PistolEyeDroid", initPistolDroid);
addEntityDef("GenericEvilBlob", initGenericEvilBlob);
addEntityDef("GenericEyeDroid", initGenericEyeDroid);
addEntityDef("MachineGunBlob", initMachineGunBlob);
2018-02-09 23:41:37 +01:00
addEntityDef("MachineGunEyeDroid", initMachineGunDroid);
2018-02-08 22:53:02 +01:00
addEntityDef("GrenadeBlob", initGrenadeBlob);
addEntityDef("GrenadeEyeDroid", initGrenadeDroid);
addEntityDef("ShotgunBlob", initShotgunBlob);
addEntityDef("ShotgunEyeDroid", initShotgunDroid);
addEntityDef("LaserBlob", initLaserBlob);
addEntityDef("LaserEyeDroid", initLaserDroid);
addEntityDef("SpreadGunBlob", initSpreadGunBlob);
addEntityDef("SpreadGunEyeDroid", initSpreadGunDroid);
addEntityDef("PlasmaEyeDroid", initPlasmaDroid);
addEntityDef("PlasmaBlob", initPlasmaBlob);
2018-02-14 23:31:21 +01:00
addEntityDef("Cannon", initCannon);
2018-02-24 16:58:14 +01:00
addEntityDef("Blaze", initBlaze);
addEntityDef("Frost", initFrost);
2018-02-24 17:53:03 +01:00
addEntityDef("EyeDroidCommander", initEyeDroidCommander);
2018-02-25 08:55:06 +01:00
addEntityDef("TankCommander", initTankCommander);
2019-06-02 17:13:34 +02:00
2018-01-30 09:29:09 +01:00
addEntityDef("Bob", initBob);
addEntityDef("MIA", initMIA);
addEntityDef("Teeka", initTeeka);
2019-06-02 17:13:34 +02:00
2018-01-30 09:29:09 +01:00
addEntityDef("Item", initItem);
addEntityDef("BronzeKey", initBronzeKey);
addEntityDef("SilverKey", initSilverKey);
addEntityDef("GoldKey", initGoldKey);
addEntityDef("GreenKeycard", initGreenKeycard);
addEntityDef("BlueKeycard", initBlueKeycard);
addEntityDef("RedKeycard", initRedKeycard);
addEntityDef("YellowKeycard", initYellowKeycard);
addEntityDef("WhiteKeycard", initWhiteKeycard);
2018-02-24 16:58:14 +01:00
addEntityDef("WeaponPickup", initWeaponPickup);
2019-06-02 17:13:34 +02:00
addEntityDef("Cell", initCell);
addEntityDef("Heart", initHeart);
2019-06-02 17:13:34 +02:00
2018-01-30 09:29:09 +01:00
addEntityDef("Exit", initExit);
addEntityDef("PowerPool", initPowerPool);
addEntityDef("Teleporter", initTeleporter);
addEntityDef("PressurePlate", initPressurePlate);
addEntityDef("InfoPoint", initInfoPoint);
addEntityDef("PowerPoint", initPowerPoint);
addEntityDef("PushBlock", initPushBlock);
addEntityDef("Lift", initLift);
addEntityDef("Door", initDoor);
addEntityDef("BronzeDoor", initBronzeDoor);
addEntityDef("SilverDoor", initSilverDoor);
addEntityDef("GoldDoor", initGoldDoor);
addEntityDef("HorizontalDoor", initHorizontalDoor);
addEntityDef("CardReader", initCardReader);
addEntityDef("LaserTrap", initLaserTrap);
addEntityDef("HorizontalLaserTrap", initHorizontalLaserTrap);
2018-02-14 23:31:21 +01:00
addEntityDef("Exit", initExit);
addEntityDef("Destructable", initDestructable);
2018-02-15 08:48:51 +01:00
addEntityDef("ItemPad", initItemPad);
2018-01-29 23:12:18 +01:00
}
Entity *createEntity(char *name)
{
EntityDef *def;
2019-06-02 17:13:34 +02:00
2018-01-29 23:12:18 +01:00
for (def = head.next ; def != NULL ; def = def->next)
{
if (strcmp(def->name, name) == 0)
{
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_DEBUG, "Creating '%s'", name);
2018-01-29 23:12:18 +01:00
return def->initFunc();
}
}
2019-06-02 17:13:34 +02:00
2018-01-29 23:12:18 +01:00
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_ERROR, "No such entity definition '%s'", name);
exit(1);
2019-06-02 17:13:34 +02:00
2018-01-29 23:12:18 +01:00
return NULL;
}
2018-01-30 09:29:09 +01:00
static void addEntityDef(char *name, Entity *(*initFunc)(void))
2018-01-29 23:12:18 +01:00
{
EntityDef *def;
2019-06-02 17:13:34 +02:00
2018-01-29 23:12:18 +01:00
def = malloc(sizeof(EntityDef));
memset(def, 0, sizeof(EntityDef));
tail->next = def;
tail = def;
2019-06-02 17:13:34 +02:00
2018-01-29 23:12:18 +01:00
STRNCPY(def->name, name, MAX_NAME_LENGTH);
def->initFunc = initFunc;
}
2018-01-30 09:29:09 +01:00
static Entity *initGenericEvilBlob(void)
{
int r;
char name[MAX_NAME_LENGTH];
strcpy(name, "");
2019-06-02 17:13:34 +02:00
2018-01-30 09:29:09 +01:00
r = rand() % world.numEnemyTypes;
2019-06-02 17:13:34 +02:00
2018-01-30 09:29:09 +01:00
sprintf(name, "%sBlob", world.enemyTypes[r]);
2019-06-02 17:13:34 +02:00
2018-01-30 09:29:09 +01:00
return createEntity(name);
}
static Entity *initGenericEyeDroid(void)
{
int r;
char name[MAX_NAME_LENGTH];
strcpy(name, "");
2019-06-02 17:13:34 +02:00
2018-01-30 09:29:09 +01:00
r = rand() % world.numEnemyTypes;
2019-06-02 17:13:34 +02:00
2018-01-30 09:29:09 +01:00
sprintf(name, "%sEyeDroid", world.enemyTypes[r]);
2019-06-02 17:13:34 +02:00
2018-01-30 09:29:09 +01:00
return createEntity(name);
}