[Add] Ai now calculates optimal distance when shooting.
This commit is contained in:
parent
b7c83b5b24
commit
71fdcffd07
@ -17,18 +17,22 @@ function attack()
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
dir = ai.face(target)
|
-- Get stats about enemy.
|
||||||
dist = ai.dist(ai.pos(target))
|
dir = ai.face(target) -- Face target.
|
||||||
second = ai.secondary()
|
dist = ai.dist(ai.pos(target)) -- Get distance.
|
||||||
|
second = ai.secondary() -- Get best secondary weapon.
|
||||||
|
|
||||||
if ai.secondary() == "Launcher" then
|
-- Shoot missiles if in range.
|
||||||
|
if ai.secondary() == "Launcher" and dist < ai.getweaprange(1) then
|
||||||
ai.settarget(target)
|
ai.settarget(target)
|
||||||
ai.shoot(2)
|
ai.shoot(2)
|
||||||
end
|
end
|
||||||
|
|
||||||
if dir < 10 and dist > 300 then
|
-- Attack if in range.
|
||||||
|
range = ai.getweaprange()
|
||||||
|
if dir < 10 and dist > range then
|
||||||
ai.accel()
|
ai.accel()
|
||||||
elseif(dir < 10 or ai.hasturrets()) and dist < 300 then
|
elseif(dir < 10 or ai.hasturrets()) and dist < range then
|
||||||
ai.shoot()
|
ai.shoot()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
44
src/ai.c
44
src/ai.c
@ -128,6 +128,7 @@ static int ai_hasturrets(lua_State* L); /* bool hasturrets() */
|
|||||||
static int ai_shoot(lua_State* L); /* shoot(number) number = 1,2,3. */
|
static int ai_shoot(lua_State* L); /* shoot(number) number = 1,2,3. */
|
||||||
static int ai_getenemy(lua_State* L); /* number getenemy(). */
|
static int ai_getenemy(lua_State* L); /* number getenemy(). */
|
||||||
static int ai_hostile(lua_State* L); /* hostile(number). */
|
static int ai_hostile(lua_State* L); /* hostile(number). */
|
||||||
|
static int ai_getweaprange(lua_State* L); /* number getweaprange(). */
|
||||||
/* Timers. */
|
/* Timers. */
|
||||||
static int ai_settimer(lua_State* L); /* settimer(number, number) */
|
static int ai_settimer(lua_State* L); /* settimer(number, number) */
|
||||||
static int ai_timeup(lua_State* L); /* boolean timeup(number) */
|
static int ai_timeup(lua_State* L); /* boolean timeup(number) */
|
||||||
@ -180,6 +181,7 @@ static const luaL_Reg ai_methods[] = {
|
|||||||
{ "shoot", ai_shoot },
|
{ "shoot", ai_shoot },
|
||||||
{ "getenemy", ai_getenemy },
|
{ "getenemy", ai_getenemy },
|
||||||
{ "hostile", ai_hostile },
|
{ "hostile", ai_hostile },
|
||||||
|
{ "getweaprange", ai_getweaprange },
|
||||||
/* Timers. */
|
/* Timers. */
|
||||||
{ "settime", ai_settimer },
|
{ "settime", ai_settimer },
|
||||||
{ "timeup", ai_timeup },
|
{ "timeup", ai_timeup },
|
||||||
@ -879,6 +881,48 @@ static int ai_hostile(lua_State* L) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return the maximum range of weapons if parameter is 1, then do secondary. */
|
||||||
|
static int ai_getweaprange(lua_State* L) {
|
||||||
|
int i;
|
||||||
|
double range, max;
|
||||||
|
Outfit* o;
|
||||||
|
|
||||||
|
/* If 1 is passed as parameter, secondary weapon is checked. */
|
||||||
|
if(lua_isnumber(L, 1) && ((int)lua_tonumber(L, 1) == 1))
|
||||||
|
if(cur_pilot->secondary != NULL) {
|
||||||
|
/* Get range, launchers use ammo's range. */
|
||||||
|
if(outfit_isLauncher(cur_pilot->secondary->outfit) && (cur_pilot->ammo != NULL))
|
||||||
|
range = outfit_range(cur_pilot->ammo->outfit);
|
||||||
|
else
|
||||||
|
range = outfit_range(cur_pilot->secondary->outfit);
|
||||||
|
|
||||||
|
if(range < 0.) return 0; /* Secondary doesn't have range. */
|
||||||
|
|
||||||
|
/* Secondary does have range. */
|
||||||
|
lua_pushnumber(L, range);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
max = -1.;
|
||||||
|
for(i = 0; i < cur_pilot->noutfits; i++) {
|
||||||
|
o = cur_pilot->outfits[i].outfit;
|
||||||
|
|
||||||
|
/* Not interested in secondary weapons nor ammunition. */
|
||||||
|
if(outfit_isProp(o, OUTFIT_PROP_WEAP_SECONDARY) || outfit_isAmmo(o))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Compare vs current outfit's range. */
|
||||||
|
range = outfit_range(o);
|
||||||
|
if(range > max)
|
||||||
|
max = range;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(max < 0.) return 0; /* No ranged weapons. */
|
||||||
|
|
||||||
|
lua_pushnumber(L, max);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* Set the timer. */
|
/* Set the timer. */
|
||||||
static int ai_settimer(lua_State* L) {
|
static int ai_settimer(lua_State* L) {
|
||||||
LLUA_MIN_ARGS(2);
|
LLUA_MIN_ARGS(2);
|
||||||
|
31
src/outfit.c
31
src/outfit.c
@ -180,48 +180,55 @@ int outfit_isMap(const Outfit* o) {
|
|||||||
|
|
||||||
/* Get the outfit graphics. */
|
/* Get the outfit graphics. */
|
||||||
glTexture* outfit_gfx(const Outfit* o) {
|
glTexture* outfit_gfx(const Outfit* o) {
|
||||||
if(outfit_isWeapon(o)) return o->u.blt.gfx_space;
|
if(outfit_isWeapon(o)) return o->u.blt.gfx_space;
|
||||||
else if(outfit_isAmmo(o)) return o->u.amm.gfx_space;
|
else if(outfit_isAmmo(o)) return o->u.amm.gfx_space;
|
||||||
else if(outfit_isTurret(o)) return o->u.blt.gfx_space;
|
else if(outfit_isTurret(o)) return o->u.blt.gfx_space;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the outfit spfx if applicable. */
|
/* Get the outfit spfx if applicable. */
|
||||||
int outfit_spfx(const Outfit* o) {
|
int outfit_spfx(const Outfit* o) {
|
||||||
if(outfit_isWeapon(o)) return o->u.blt.spfx;
|
if(outfit_isWeapon(o)) return o->u.blt.spfx;
|
||||||
else if(outfit_isAmmo(o)) return o->u.amm.spfx;
|
else if(outfit_isAmmo(o)) return o->u.amm.spfx;
|
||||||
else if(outfit_isTurret(o)) return o->u.blt.spfx;
|
else if(outfit_isTurret(o)) return o->u.blt.spfx;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
double outfit_damage(const Outfit* o) {
|
double outfit_damage(const Outfit* o) {
|
||||||
if(outfit_isWeapon(o)) return o->u.blt.damage;
|
if(outfit_isWeapon(o)) return o->u.blt.damage;
|
||||||
else if(outfit_isAmmo(o)) return o->u.amm.damage;
|
else if(outfit_isAmmo(o)) return o->u.amm.damage;
|
||||||
else if(outfit_isTurret(o)) return o->u.blt.damage;
|
else if(outfit_isTurret(o)) return o->u.blt.damage;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
DamageType outfit_damageType(const Outfit* o) {
|
DamageType outfit_damageType(const Outfit* o) {
|
||||||
if(outfit_isWeapon(o)) return o->u.blt.dtype;
|
if(outfit_isWeapon(o)) return o->u.blt.dtype;
|
||||||
else if(outfit_isAmmo(o)) return o->u.amm.dtype;
|
else if(outfit_isAmmo(o)) return o->u.amm.dtype;
|
||||||
else if(outfit_isTurret(o)) return o->u.blt.dtype;
|
else if(outfit_isTurret(o)) return o->u.blt.dtype;
|
||||||
return DAMAGE_TYPE_NULL;
|
return DAMAGE_TYPE_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int outfit_delay(const Outfit* o) {
|
int outfit_delay(const Outfit* o) {
|
||||||
if(outfit_isWeapon(o)) return o->u.blt.delay;
|
if(outfit_isWeapon(o)) return o->u.blt.delay;
|
||||||
else if(outfit_isLauncher(o)) return o->u.lau.delay;
|
else if(outfit_isLauncher(o)) return o->u.lau.delay;
|
||||||
else if(outfit_isTurret(o)) return o->u.blt.delay;
|
else if(outfit_isTurret(o)) return o->u.blt.delay;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
double outfit_energy(const Outfit* o) {
|
double outfit_energy(const Outfit* o) {
|
||||||
if(outfit_isWeapon(o)) return o->u.blt.energy;
|
if(outfit_isWeapon(o)) return o->u.blt.energy;
|
||||||
else if(outfit_isAmmo(o)) return o->u.amm.energy;
|
else if(outfit_isAmmo(o)) return o->u.amm.energy;
|
||||||
else if(outfit_isTurret(o)) return o->u.blt.energy;
|
else if(outfit_isTurret(o)) return o->u.blt.energy;
|
||||||
return -1.;
|
return -1.;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double outfit_range(const Outfit* o) {
|
||||||
|
if(outfit_isWeapon(o)) return o->u.blt.range;
|
||||||
|
else if(outfit_isAmmo(o)) return 0.8*o->u.amm.speed*o->u.amm.duration;
|
||||||
|
else if(outfit_isTurret(o)) return o->u.blt.range;
|
||||||
|
return -1.;
|
||||||
|
}
|
||||||
|
|
||||||
const char* outfit_typename[] = {
|
const char* outfit_typename[] = {
|
||||||
"NULL",
|
"NULL",
|
||||||
"Bolt Cannon",
|
"Bolt Cannon",
|
||||||
|
@ -145,6 +145,7 @@ double outfit_damage(const Outfit* o);
|
|||||||
DamageType outfit_damageType(const Outfit* o);
|
DamageType outfit_damageType(const Outfit* o);
|
||||||
int outfit_delay(const Outfit* o);
|
int outfit_delay(const Outfit* o);
|
||||||
double outfit_energy(const Outfit* o);
|
double outfit_energy(const Outfit* o);
|
||||||
|
double outfit_range(const Outfit* o);
|
||||||
|
|
||||||
/* Load/free outfit stack. */
|
/* Load/free outfit stack. */
|
||||||
int outfit_load(void);
|
int outfit_load(void);
|
||||||
|
Loading…
Reference in New Issue
Block a user