diff --git a/data/fighters/civilian.json b/data/fighters/civilian.json new file mode 100644 index 0000000..62b0786 --- /dev/null +++ b/data/fighters/civilian.json @@ -0,0 +1,10 @@ +{ + "name" : "Civilian", + "health" : 10, + "shield" : 0, + "speed" : 2, + "reloadTime" : 0, + "shieldRechargeRate" : 0, + "textureName" : "gfx/craft/civilian01.png", + "flags" : "EF_CIVILIAN+EF_FLEEING" +} diff --git a/data/fighters/list.json b/data/fighters/list.json index 1f599c8..451ccd7 100644 --- a/data/fighters/list.json +++ b/data/fighters/list.json @@ -11,5 +11,6 @@ "data/fighters/nymph.json", "data/fighters/firefly.json", "data/fighters/hyena.json", - "data/fighters/leopard.json" + "data/fighters/leopard.json", + "data/fighters/civilian.json" ] diff --git a/gfx/craft/civilian01.png b/gfx/craft/civilian01.png new file mode 100644 index 0000000..b99cb4e Binary files /dev/null and b/gfx/craft/civilian01.png differ diff --git a/gfx/craft/civilian02.png b/gfx/craft/civilian02.png new file mode 100644 index 0000000..5b208be Binary files /dev/null and b/gfx/craft/civilian02.png differ diff --git a/src/battle/ai.c b/src/battle/ai.c index d90f990..6190082 100644 --- a/src/battle/ai.c +++ b/src/battle/ai.c @@ -46,6 +46,10 @@ static void moveToPlayer(void); static int canAttack(Entity *f); static int selectWeapon(int type); static void flee(void); +static int nearExtractionPoint(void); +static int nearEnemies(void); +static void lookForPlayer(void); +static void moveToExtractionPoint(void); void doAI(void) { @@ -384,3 +388,68 @@ static void moveToPlayer(void) applyFighterThrust(); } } + +/* ====== Civilian AI ======= */ + +void doCivilianAI(void) +{ + if (!nearExtractionPoint() && !nearEnemies()) + { + lookForPlayer(); + } +} + +static int nearExtractionPoint(void) +{ + Entity *e, **candidates; + int i; + + candidates = getAllEntsWithin(self->x - 500, self->y - 500, 1000, 1000, self); + i = 0; + + e = candidates[i]; + + self->target = NULL; + + while (e) + { + if (e->type == ET_EXTRACTION_POINT) + { + self->target = e; + } + + i++; + + e = (i < MAX_GRID_CANDIDATES) ? candidates[i] : NULL; + } + + if (self->target != NULL) + { + self->action = moveToExtractionPoint; + } + + return self->target != NULL; +} + +static int nearEnemies(void) +{ + return 0; +} + +static void moveToExtractionPoint(void) +{ + faceTarget(self->target); + + applyFighterThrust(); +} + +static void lookForPlayer(void) +{ + if (getDistance(self->x, self->y, player->x, player->y) < 1000) + { + moveToPlayer(); + return; + } + + applyFighterBrakes(); +} diff --git a/src/battle/ai.h b/src/battle/ai.h index ad424ac..fdbeb50 100644 --- a/src/battle/ai.h +++ b/src/battle/ai.h @@ -34,6 +34,7 @@ extern float getAngle(int x1, int y1, int x2, int y2); extern void applyFighterThrust(void); extern void applyFighterBrakes(void); extern void addHudMessage(SDL_Color c, char *format, ...); +extern Entity **getAllEntsWithin(int x, int y, int w, int h, Entity *ignore); extern Battle battle; extern Colors colors; diff --git a/src/battle/extractionPoint.c b/src/battle/extractionPoint.c index 11efc35..f772a35 100644 --- a/src/battle/extractionPoint.c +++ b/src/battle/extractionPoint.c @@ -58,11 +58,17 @@ static void handleFleeingEntities(void) candidates = getAllEntsWithin(self->x, self->y, self->w, self->h, self); i = 0; - for (e = candidates[i] ; (e != NULL && i < MAX_GRID_CANDIDATES) ; i++) + e = candidates[i]; + + while (e) { if (e->health > 0 && e->flags & EF_FLEEING && getDistance(e->x, e->y, self->x, self->y) <= 64) { e->alive = ALIVE_DEAD; } + + i++; + + e = (i < MAX_GRID_CANDIDATES) ? candidates[i] : NULL; } } diff --git a/src/battle/fighterDefs.c b/src/battle/fighterDefs.c index 31cde82..e5b233a 100644 --- a/src/battle/fighterDefs.c +++ b/src/battle/fighterDefs.c @@ -126,6 +126,11 @@ static void loadFighterDef(char *filename) f->missiles.ammo = f->missiles.maxAmmo = cJSON_GetObjectItem(node, "ammo")->valueint; } + if (cJSON_GetObjectItem(root, "flags")) + { + f->flags = flagsToLong(cJSON_GetObjectItem(root, "flags")->valuestring); + } + f->separationRadius = MAX(f->w, f->h); f->separationRadius *= 2; diff --git a/src/battle/fighterDefs.h b/src/battle/fighterDefs.h index 57d2506..1db55c2 100644 --- a/src/battle/fighterDefs.h +++ b/src/battle/fighterDefs.h @@ -27,4 +27,5 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. extern char *readFile(char *filename); extern SDL_Texture *getTexture(char *filename); extern long lookup(char *name); +extern long flagsToLong(char *flags); diff --git a/src/battle/fighters.c b/src/battle/fighters.c index 04aad7f..be9fd47 100644 --- a/src/battle/fighters.c +++ b/src/battle/fighters.c @@ -71,7 +71,15 @@ Entity *spawnFighter(char *name, int x, int y, int side) randomizeDart(f); } - f->defaultAction = doAI; + if (f->flags & EF_CIVILIAN) + { + f->defaultAction = doCivilianAI; + } + else + { + f->defaultAction = doAI; + } + f->die = die; return f; @@ -271,17 +279,20 @@ static void separate(void) while (e) { - distance = getDistance(e->x, e->y, self->x, self->y); - - if (distance > 0 && distance < self->separationRadius) + if (e->type == ET_FIGHTER) { - angle = getAngle(self->x, self->y, e->x, e->y); + distance = getDistance(e->x, e->y, self->x, self->y); - dx += sin(TO_RAIDANS(angle)); - dy += -cos(TO_RAIDANS(angle)); - force += (self->separationRadius - distance) * 0.005; - - count++; + if (distance > 0 && distance < self->separationRadius) + { + angle = getAngle(self->x, self->y, e->x, e->y); + + dx += sin(TO_RAIDANS(angle)); + dy += -cos(TO_RAIDANS(angle)); + force += (self->separationRadius - distance) * 0.005; + + count++; + } } i++; diff --git a/src/battle/fighters.h b/src/battle/fighters.h index 1d59898..62ac8fe 100644 --- a/src/battle/fighters.h +++ b/src/battle/fighters.h @@ -25,6 +25,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. extern SDL_Texture *getTexture(char *filename); extern void doAI(void); +extern void doCivilianAI(void); extern void blitRotated(SDL_Texture *t, int x, int y, int angle); extern void blit(SDL_Texture *t, int x, int y, int center); extern float getAngle(int x1, int y1, int x2, int y2); diff --git a/src/defs.h b/src/defs.h index 35ac3bd..ba0e3e9 100644 --- a/src/defs.h +++ b/src/defs.h @@ -66,6 +66,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define EF_FLEES (2 << 4) #define EF_FLEEING (2 << 5) #define EF_NO_MT_BOX (2 << 6) +#define EF_CIVILIAN (2 << 7) enum { diff --git a/src/system/lookup.c b/src/system/lookup.c index 158b86e..ae29048 100644 --- a/src/system/lookup.c +++ b/src/system/lookup.c @@ -38,6 +38,8 @@ void initLookups(void) addLookup("EF_IMMORTAL", EF_IMMORTAL); addLookup("EF_MISSION_TARGET", EF_MISSION_TARGET); addLookup("EF_FLEES", EF_FLEES); + addLookup("EF_FLEEING", EF_FLEEING); + addLookup("EF_CIVILIAN", EF_CIVILIAN); addLookup("TT_DESTROY", TT_DESTROY); addLookup("TT_DISABLE", TT_DISABLE);