[Fix] Fixed some escort ai issues, also allowed for fighters to return to ship.

This commit is contained in:
Allanis 2013-12-31 04:28:05 +00:00
parent 843067a0f3
commit 3a87ce36ff
7 changed files with 68 additions and 13 deletions

View File

@ -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()

View File

@ -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

View File

@ -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;

View File

@ -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. */

View File

@ -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. */

View File

@ -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. */

View File

@ -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);