[Fix] Fixed some escort ai issues, also allowed for fighters to return to ship.
This commit is contained in:
parent
843067a0f3
commit
3a87ce36ff
@ -4,6 +4,7 @@ include("../scripts/ai/tpl/escort.lua")
|
||||
armour_run = 40
|
||||
armour_return = 70
|
||||
aggressive = true
|
||||
command = false
|
||||
|
||||
function create()
|
||||
mem.escort = ai.getPlayer()
|
||||
|
@ -2,10 +2,11 @@ include("../scripts/ai/tpl/generic.lua") -- Simple create function.
|
||||
|
||||
-- Shouldn't think, should only obey orders.
|
||||
atk_think = false
|
||||
command = true
|
||||
|
||||
function create(master)
|
||||
mem.escort = master
|
||||
mem.command = true -- On by default.
|
||||
mem.carrier = true
|
||||
attack_choose()
|
||||
end
|
||||
|
||||
@ -32,7 +33,7 @@ function escort()
|
||||
return
|
||||
|
||||
-- Brake.
|
||||
elseif dist < bdist then
|
||||
elseif dist+100 < bdist then
|
||||
ai.pushtask(0, "brake")
|
||||
|
||||
-- Must approach.
|
||||
@ -83,28 +84,28 @@ end
|
||||
--]]
|
||||
--Attack target.
|
||||
function e_attack(target)
|
||||
if mem.command then
|
||||
if command then
|
||||
ai.pushtask(0, "attack", target)
|
||||
end
|
||||
end
|
||||
|
||||
-- Hold position.
|
||||
function e_hold()
|
||||
if mem.command then
|
||||
if command then
|
||||
ai.pushtask(0, "hold")
|
||||
end
|
||||
end
|
||||
|
||||
-- Return to carrier.
|
||||
function e_return()
|
||||
if mem.command and mem.carrier then
|
||||
if command and mem.carrier then
|
||||
ai.pushtask(0, "flyback")
|
||||
end
|
||||
end
|
||||
|
||||
-- Clear orders.
|
||||
function e_clear()
|
||||
if mem.command then
|
||||
if command then
|
||||
while ai.taskname() ~= "none" do
|
||||
ai.poptask()
|
||||
end
|
||||
|
21
src/ai.c
21
src/ai.c
@ -150,6 +150,7 @@ static int ai_getrndplanet(lua_State* L); /* Vec2 getrndplanet() */
|
||||
static int ai_getlandplanet(lua_State* L); /* Vec2 getlandplanet() */
|
||||
static int ai_hyperspace(lua_State* L); /* [number] hyperspace() */
|
||||
static int ai_stop(lua_State* L); /* stop() */
|
||||
static int ai_dock(lua_State* L); /* dock(number) */
|
||||
/* Combat. */
|
||||
static int ai_combat(lua_State* L); /* combat(number) */
|
||||
static int ai_settarget(lua_State* L); /* settarget(number) */
|
||||
@ -207,6 +208,7 @@ static const luaL_Reg ai_methods[] = {
|
||||
{ "brake", ai_brake },
|
||||
{ "stop", ai_stop },
|
||||
{ "hyperspace", ai_hyperspace },
|
||||
{ "dock", ai_dock },
|
||||
/* Combat. */
|
||||
{ "aim", ai_aim },
|
||||
{ "combat", ai_combat },
|
||||
@ -529,8 +531,8 @@ void ai_think(Pilot* pilot) {
|
||||
cur_pilot->solid->dir);
|
||||
|
||||
/* Fire weapons if needs be. */
|
||||
if(ai_isFlag(AI_PRIMARY)) pilot_shoot(pilot, 0); /* Primary. */
|
||||
if(ai_isFlag(AI_SECONDARY)) pilot_shoot(pilot, 1); /* Secondary. */
|
||||
if(ai_isFlag(AI_PRIMARY)) pilot_shoot(cur_pilot, 0); /* Primary. */
|
||||
if(ai_isFlag(AI_SECONDARY)) pilot_shoot(cur_pilot, 1); /* Secondary. */
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1116,6 +1118,21 @@ static int ai_stop(lua_State* L) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Docks the ship. */
|
||||
static int ai_dock(lua_State* L) {
|
||||
Pilot* p;
|
||||
|
||||
/* Target is another ship. */
|
||||
if(lua_isnumber(L, 1)) {
|
||||
p = pilot_get(lua_tonumber(L, 1));
|
||||
if(p == NULL) return 0;
|
||||
pilot_dock(cur_pilot, p);
|
||||
}
|
||||
else LLUA_INVALID_PARAMETER();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Aim at the pilot, trying to hit it. */
|
||||
static int ai_aim(lua_State* L) {
|
||||
int id;
|
||||
|
@ -98,7 +98,7 @@ static int escort_command(Pilot* parent, int cmd, int param) {
|
||||
continue;
|
||||
|
||||
/* Check if command makes sense. */
|
||||
if((cmd == ESCORT_RETURN) && !pilot_isFlag(parent, PILOT_CARRIED))
|
||||
if((cmd == ESCORT_RETURN) && !pilot_isFlag(e, PILOT_CARRIED))
|
||||
continue;
|
||||
|
||||
n++; /* Amount of escorts left. */
|
||||
|
@ -15,9 +15,9 @@
|
||||
*/
|
||||
typedef enum OutfitType_ {
|
||||
OUTFIT_TYPE_NULL, /**< NULL type. */
|
||||
OUTFIT_TYPE_BOLT, /**< @todo Fixed bolt cannon. */
|
||||
OUTFIT_TYPE_BOLT, /**< Fixed bolt cannon. */
|
||||
OUTFIT_TYPE_BEAM, /**< Fixed beam cannon. */
|
||||
OUTFIT_TYPE_TURRET_BOLT, /**< @todo Rotaty bolt turret. */
|
||||
OUTFIT_TYPE_TURRET_BOLT, /**< Rotaty bolt turret. */
|
||||
OUTFIT_TYPE_TURRET_BEAM, /**< Rotary bolt turret. */
|
||||
OUTFIT_TYPE_MISSILE_DUMB, /**< Dumb missile launcher. */
|
||||
OUTFIT_TYPE_MISSILE_DUMB_AMMO, /**< Dumb missile ammo. */
|
||||
|
38
src/pilot.c
38
src/pilot.c
@ -580,6 +580,40 @@ void pilot_setAfterburner(Pilot* p) {
|
||||
p->afterburner = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* @fn int pilot_dock(Pilot* p, Pilot* target)
|
||||
*
|
||||
* @brief Dock the pilot on its target pilot.
|
||||
* @param p Pilot that wants to dock.
|
||||
* @param target Pilot to dock on.
|
||||
* @return 0 on successful docking.
|
||||
*/
|
||||
int pilot_dock(Pilot* p, Pilot* target) {
|
||||
int i;
|
||||
Outfit* o;
|
||||
|
||||
/* Check to see if target has an available bay. */
|
||||
for(i = 0; i < target->noutfits; i++) {
|
||||
if(outfit_isFighterBay(target->outfits[i].outfit)) {
|
||||
o = outfit_get(outfit_ammo(target->outfits[i].outfit));
|
||||
if(outfit_isFighter(o) &&
|
||||
(strcmp(p->ship->name, o->u.fig.ship)==0))
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(i >= target->noutfits)
|
||||
return -1;
|
||||
|
||||
/* Add the pilots outfit. */
|
||||
if(pilot_addOutfit(target, o, 1) != 1)
|
||||
return -1;
|
||||
|
||||
/* Destroy the pilot. */
|
||||
pilot_setFlag(p, PILOT_DELETE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
void pilot_explode(double x, double y, double radius,
|
||||
@ -1283,9 +1317,9 @@ void pilot_init(Pilot* pilot, Ship* ship, char* name, int faction,
|
||||
|
||||
/* Escort stuff. */
|
||||
if(flags & PILOT_ESCORT) {
|
||||
pilot->flags |= PILOT_ESCORT;
|
||||
pilot_setFlag(pilot, PILOT_ESCORT);
|
||||
if(flags & PILOT_CARRIED)
|
||||
pilot->flags |= PILOT_CARRIED;
|
||||
pilot_setFlag(pilot, PILOT_CARRIED);
|
||||
}
|
||||
|
||||
/* AI. */
|
||||
|
@ -235,6 +235,8 @@ void pilot_setSecondary(Pilot* p, const char* secondary);
|
||||
void pilot_setAmmo(Pilot* p);
|
||||
int pilot_getAmmo(Pilot* p, Outfit* o);
|
||||
void pilot_setAfterburner(Pilot* p);
|
||||
/* Escort stuff. */
|
||||
int pilot_dock(Pilot* p, Pilot* target);
|
||||
/* Explosion. */
|
||||
void pilot_explode(double x, double y, double radius,
|
||||
DamageType dtype, double damage, unsigned int parent);
|
||||
|
Loading…
Reference in New Issue
Block a user