[Fix] Fixed god damn ai!

This commit is contained in:
Allanis 2013-12-31 03:07:05 +00:00
parent 8047f198e9
commit b26a1ca968
9 changed files with 76 additions and 139 deletions

View File

@ -160,8 +160,8 @@ function land()
tk.msg(msg_title[2], string.format(msg_msg[2], carg_type))
-- Modify the faction standing.
if player.getFaction("Merchant") < 70 then
player.modFactionRaw("Merchant", misn_faction)
if player.getFaction("Trader") < 70 then
player.modFactionRaw("Trader", misn_faction)
end
if player.getFaction("Independent") < 30 then
player.modFactionRaw("Independent", misn_faction/2)

View File

@ -14,6 +14,7 @@ function attack_think()
else
atk_g_think()
end
end
--[[
-- Wrapper for the attack functions.

View File

@ -6,31 +6,78 @@
-- Mainly manages targetting nearest enemy.
--]]
function atk_g_think()
if mem.atk_think ~= nil then
mem.atk_think()
else
atk_g_think()
enemy = ai.getenemy()
target = ai.targetid()
-- Get new target if it's closer.
if enemy ~= target then
dist = ai.dist(ai.pos(target))
range = ai.getweaprange()
-- Shouldn't switch targets if close.
if dist > range * 1.3 then
ai.poptask()
ai.pushtask(0, "attack", enemy)
end
end
end
--[[
-- Generic "brute force" attack. Doesn't really do anything interesting.
--]]
function atk_g()
if mem.atk ~= nil then
mem.atk()
target = ai.targetid()
ai.hostile(target) -- Mark as hostile.
-- Make sure pilot exists.
if not ai.exists(target) then
ai.poptask()
return
end
ai.settarget(target)
-- Get stats about enemy.
dist = ai.dist(ai.pos(target)) -- Get distance.
range = ai.getweaprange()
-- We first bias towards range.
if dist > range then
dir = ai.face(target) -- Normal face the target.
secondary, special, ammo = ai.secondary("Launcher")
-- Shoot missiles if in range.
if secondary == "Launcher" and
dist < ai.getweaprange(1) then
-- More lenient with aiming.
if special == "Smart" and dir < 30 then
ai.shoot(2)
-- Non-smart miss more.
elseif dir < 10 then
ai.shoot(2)
end
end
-- Approach for melee.
if dir < 10 then
ai.accel()
end
-- Close enough to melee.
else
atk_g()
secondary, special = ai.secondary("Beam Weapon")
dir = ai.aim(target) -- We aim instead of face.
-- Fire non-smart secondary weapons.
if(secondary == "Launcher" and special ~= "Smart") or
secondary == "Beam Weapon" then
if dir < 10 or special == "Turret" then -- Need good accuracy.
ai.shoot(2)
end
end
--[[
-- Generic function to choose what attack functions match the ship best.
--]]
function attack_choose()
class = ai.shipclass()
if class == "Bomber" then
mem.atk_think = atk_b_think
mem.atk = atk_b
if dir < 10 or ai.hasturrets() then
ai.shoot()
end
end
end

View File

@ -60,7 +60,7 @@ function runaway()
return
end
dir = ai.face(target, 1)
dir = ai.face(target, true)
ai.accel()
--[[

View File

@ -1,111 +0,0 @@
include("../scripts/ai/include/basic.lua")
-- Required control rate.
control_rate = 2
-- Required "control" function.
function control()
task = ai.taskname()
enemy = ai.getenemy()
-- Runaway if enemy is near.
if task ~= "runaway" and enemy ~= nil and ai.dist(enemy) < 500 then
if task ~= "none" then
ai.poptask()
end
ai.pushtask(0, "runaway", enemy)
-- Enter hyperspace if possible.
elseif task == "hyperspace" then
ai.hyperspace() -- Try to go to hyperspace.
-- Try to jump when far enough away.
elseif task == "runaway" then
if ai.dist(ai.pos(ai.targetid())) > 400 then
ai.hyperspace()
end
-- Find something to do.
elseif task == "none" then
planet = ai.landplanet()
-- Planet must exist.
if planet == nil then
ai.pushtask(0, "hyperspace")
else
ai.pushtask(0, "hyperspace")
ai.pushtask(0, "land", planet)
end
end
end
-- Required "attacked" function.
function attacked(attacker)
if ai.taskname() ~= "runaway" then
sos = {
"Mayday! We are under attack!",
"Requesting assistance. We are under attack!",
"Merchant vessle here under attack! HALP!"
}
ai.broadcast(sos[rnd.int(1, #sos)])
-- So bravely run away!
ai.pushtask(0, "runaway", attacker)
else -- Runaway from the new bad guys.
ai.poptask()
ai.pushtask(0, "runaway", attacker)
end
end
function create()
ai.setcredits(rnd.int(100, ai.shipprice()/50))
-- Some stuff has more chance than other.
num = rnd.int(12)
if num < 5 then
cargo = "Food"
elseif num < 8 then
cargo = "Ore"
elseif num < 10 then
cargo = "Industrial Goods"
elseif num < 12 then
cargo = "Luxury Goods"
else
cargo = "Medicine"
end
ai.setcargo(cargo, rnd.int(0, ai.cargofree()))
end
-- Fly to the target.
function go()
target = ai.target()
dir = ai.face(target)
dist = ai.dist(target)
bdist = ai.minbrakedist()
if dir < 10 and dist > bdist then
ai.accel()
elseif dir < 10 and dist < bdist then
ai.poptask()
ai.pushtask(0, "stop")
end
end
-- Backthrust.
function stop()
ai.brake()
if ai.isstopped() then
ai.stop()
ai.poptask()
ai.settimer(0, rnd.int(8000, 15000)) -- We wait during a while.
ai.pushtask(0, "land")
else
ai.brake()
end
end
--Waits.
function land()
if ai.timeup(0) then
ai.pushtask(0, "hyperspace")
end
end

View File

@ -1,4 +1,4 @@
include("../scripts/ai/merchant.lua")
include("../scripts/ai/tpl/merchant.lua")
function sos()
msg = {

View File

@ -502,7 +502,7 @@ void ai_think(Pilot* pilot) {
L = cur_pilot->ai->L; /* Set the AI profile to the current pilot's. */
/* Clean up some variables. */
pilot_acc = 0.;
pilot_acc = 0;
pilot_turn = 0.;
pilot_flags = 0;
cur_pilot->target = cur_pilot->id;

View File

@ -80,7 +80,7 @@ void input_setDefault(void) {
input_setKeybind("e_attack", KEYBIND_KEYBOARD, SDLK_f, KMOD_NONE, 0);
input_setKeybind("e_hold", KEYBIND_KEYBOARD, SDLK_g, KMOD_NONE, 0);
input_setKeybind("e_return", KEYBIND_KEYBOARD, SDLK_r, KMOD_NONE, 0);
input_setKeybind("e_cleark", KEYBIND_KEYBOARD, SDLK_c, KMOD_NONE, 0);
input_setKeybind("e_clear", KEYBIND_KEYBOARD, SDLK_c, KMOD_NONE, 0);
/* Secondary weapon. */