[Add] Escorts and fighter bays are starting to work quite nicely.

This commit is contained in:
Allanis 2013-12-31 04:01:11 +00:00
parent 1411001943
commit 843067a0f3
6 changed files with 42 additions and 10 deletions

View File

@ -5,10 +5,17 @@
include("../scripts/ai/include/attack_generic.lua") include("../scripts/ai/include/attack_generic.lua")
include("../scripts/ai/include/attack_bomber.lua") include("../scripts/ai/include/attack_bomber.lua")
atk_think = true
--[[ --[[
-- Wrapper for the think functions. -- Wrapper for the think functions.
--]] --]]
function attack_think() function attack_think()
-- Not everyone wants to think..
if atk_think == false then
return
end
if mem.atk_think ~= nil then if mem.atk_think ~= nil then
mem.atk_think() mem.atk_think()
else else

View File

@ -1,6 +1,11 @@
include("../scripts/ai/tpl/generic.lua") -- Simple create function. include("../scripts/ai/tpl/generic.lua") -- Simple create function.
function create() -- Shouldn't think, should only obey orders.
atk_think = false
function create(master)
mem.escort = master
mem.command = true -- On by default.
attack_choose() attack_choose()
end end
@ -22,12 +27,16 @@ function escort()
dist = ai.dist(ai.pos(target)) dist = ai.dist(ai.pos(target))
bdist = ai.mindbrakedist() bdist = ai.mindbrakedist()
-- Close enough.
if ai.isstopped() and dist < 300 then
return
-- Brake. -- Brake.
if not ai.isstopped() and dist < bdist then elseif dist < bdist then
ai.pushtask(0, "brake") ai.pushtask(0, "brake")
-- Must approach. -- Must approach.
elseif dir < 10 and dist > 200 then elseif dir < 10 and dist > 300 then
ai.accel() ai.accel()
end end
end end
@ -96,7 +105,7 @@ end
-- Clear orders. -- Clear orders.
function e_clear() function e_clear()
if mem.command then if mem.command then
while ai.taskname ~= "none" do while ai.taskname() ~= "none" do
ai.poptask() ai.poptask()
end end
end end

View File

@ -42,6 +42,7 @@ int escort_create(unsigned int parent, char* ship,
Pilot* p, *pe; Pilot* p, *pe;
char buf[16]; char buf[16];
unsigned int e, f; unsigned int e, f;
double dir;
/* Get important stuff. */ /* Get important stuff. */
p = pilot_get(parent); p = pilot_get(parent);
@ -52,8 +53,12 @@ int escort_create(unsigned int parent, char* ship,
f = PILOT_ESCORT; f = PILOT_ESCORT;
if(carried) f |= PILOT_CARRIED; if(carried) f |= PILOT_CARRIED;
/* Get the direction. */
if(carried) dir = p->solid->dir;
else dir = 0.;
/* Create the pilot. */ /* Create the pilot. */
e = pilot_create(s, NULL, p->faction, buf, 0., pos, vel, f); e = pilot_create(s, NULL, p->faction, buf, dir, pos, vel, f);
pe = pilot_get(e); pe = pilot_get(e);
pe->parent = parent; pe->parent = parent;

View File

@ -91,6 +91,9 @@ char* faction_name(int f) {
WARN("Faction id '%d' is invalid.", f); WARN("Faction id '%d' is invalid.", f);
return NULL; return NULL;
} }
/* Don't want player to see her escorts as "Player" faction. */
if(f == FACTION_PLAYER)
return "Escort";
return faction_stack[f].name; return faction_stack[f].name;
} }
@ -347,6 +350,9 @@ int areAllies(int a, int b) {
Faction* fa, *fb; Faction* fa, *fb;
int i; int i;
/* If they are the same, they must be allies. */
if(a == b) return 1;
/* We assume player becomes allies with high rating. */ /* We assume player becomes allies with high rating. */
if(a == FACTION_PLAYER) { if(a == FACTION_PLAYER) {
if(faction_isFaction(b)) { if(faction_isFaction(b)) {
@ -387,8 +393,6 @@ int areAllies(int a, int b) {
return 0; return 0;
} }
if(a == b) return 0;
if(fa && fb) { if(fa && fb) {
/* Both are factions. */ /* Both are factions. */
for(i = 0; i < fa->nallies; i++) for(i = 0; i < fa->nallies; i++)

View File

@ -388,6 +388,7 @@ void pilot_hit(Pilot* p, const Solid* w, const unsigned int shooter,
int mod; int mod;
double damage_shield, damage_armour, knockback, dam_mod; double damage_shield, damage_armour, knockback, dam_mod;
Pilot* pshooter;
/* Calculate the damage. */ /* Calculate the damage. */
outfit_calcDamage(&damage_shield, &damage_armour, &knockback, dtype, damage); outfit_calcDamage(&damage_shield, &damage_armour, &knockback, dtype, damage);
@ -421,7 +422,8 @@ void pilot_hit(Pilot* p, const Solid* w, const unsigned int shooter,
if(!pilot_isFlag(p, PILOT_DEAD)) { if(!pilot_isFlag(p, PILOT_DEAD)) {
pilot_dead(p); pilot_dead(p);
/* Adjust the combat rating based on pilot mass and ditto faction. */ /* Adjust the combat rating based on pilot mass and ditto faction. */
if(shooter == PLAYER_ID) { pshooter = pilot_get(shooter);
if(pshooter->faction == FACTION_PLAYER) {
mod = (int)MAX(1, ceil(pow(p->ship->mass, 1./3.))-1.); mod = (int)MAX(1, ceil(pow(p->ship->mass, 1./3.))-1.);
player_crating += MAX(1, mod); player_crating += MAX(1, mod);
faction_modPlayer(p->faction, -mod); faction_modPlayer(p->faction, -mod);

View File

@ -593,10 +593,13 @@ static void weapon_update(Weapon* w, const double dt, WeaponLayer layer) {
* @param pos Position of the hit. * @param pos Position of the hit.
*/ */
static void weapon_hit(Weapon* w, Pilot* p, WeaponLayer layer, Vec2* pos) { static void weapon_hit(Weapon* w, Pilot* p, WeaponLayer layer, Vec2* pos) {
Pilot* parent;
/* Someone should let the ai know it's been attacked. */ /* Someone should let the ai know it's been attacked. */
if(!pilot_isPlayer(p)) { if(!pilot_isPlayer(p)) {
if((player->target == p->id) || (RNGF() > 0.33)) { /* 33% chance. */ if((player->target == p->id) || (RNGF() > 0.33)) { /* 33% chance. */
if((w->parent == PLAYER_ID) && parent = pilot_get(w->parent);
if((parent->faction == FACTION_PLAYER) &&
(!pilot_isFlag(p, PILOT_HOSTILE) || (RNGF() < 0.5))) { /* 50% chance. */ (!pilot_isFlag(p, PILOT_HOSTILE) || (RNGF() < 0.5))) { /* 50% chance. */
faction_modPlayer(p->faction, -1); /* Slowly lower faction. */ faction_modPlayer(p->faction, -1); /* Slowly lower faction. */
pilot_setFlag(p, PILOT_HOSTILE); pilot_setFlag(p, PILOT_HOSTILE);
@ -631,11 +634,13 @@ static void weapon_hitBeam(Weapon* w, Pilot* p, WeaponLayer layer,
Vec2 pos[2], const double dt) { Vec2 pos[2], const double dt) {
(void)layer; (void)layer;
Pilot* parent;
/* Inform the ai it has been attacked, useless if player. */ /* Inform the ai it has been attacked, useless if player. */
if(!pilot_isPlayer(p)) { if(!pilot_isPlayer(p)) {
if((player->target == p->id) || (RNGF() < 0.30*dt)) { /* 30% chance per second. */ if((player->target == p->id) || (RNGF() < 0.30*dt)) { /* 30% chance per second. */
if((w->parent == PLAYER_ID) && parent = pilot_get(w->parent);
if((parent->faction == FACTION_PLAYER) &&
(!pilot_isFlag(p, PILOT_HOSTILE) || (RNGF() < 0.5))) { /* 50% chance. */ (!pilot_isFlag(p, PILOT_HOSTILE) || (RNGF() < 0.5))) { /* 50% chance. */
faction_modPlayer(p->faction, -1); /* Slowly lower faction. */ faction_modPlayer(p->faction, -1); /* Slowly lower faction. */
pilot_setFlag(p, PILOT_HOSTILE); pilot_setFlag(p, PILOT_HOSTILE);