Start of civilian ships: will follow player when close and flee in to extraction points.
This commit is contained in:
parent
9de4bf6255
commit
ad405c57ae
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
]
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 1.9 KiB |
Binary file not shown.
After Width: | Height: | Size: 2.2 KiB |
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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++;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue