diff --git a/dat/missions/cargo.lua b/dat/missions/cargo.lua index 06b125d..9e0b944 100644 --- a/dat/missions/cargo.lua +++ b/dat/missions/cargo.lua @@ -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) diff --git a/scripts/ai/empire.lua b/scripts/ai/empire.lua index 805eba3..8cd115a 100644 --- a/scripts/ai/empire.lua +++ b/scripts/ai/empire.lua @@ -7,10 +7,10 @@ aggressive = true function create() ai.setcredits(rnd.int(1000, ai.shipprice()/70)) - if rnd.int(0,2)==0 then - ai.broadcast("The Empire is watching") - end - attack_choose() + if rnd.int(0,2)==0 then + ai.broadcast("The Empire is watching") + end + attack_choose() end function taunt(target, offence) diff --git a/scripts/ai/include/attack.lua b/scripts/ai/include/attack.lua index 6eeed27..a8b9b1f 100644 --- a/scripts/ai/include/attack.lua +++ b/scripts/ai/include/attack.lua @@ -13,6 +13,7 @@ function attack_think() mem.atk_think() else atk_g_think() + end end --[[ diff --git a/scripts/ai/include/attack_generic.lua b/scripts/ai/include/attack_generic.lua index fad34db..ce5d3b7 100644 --- a/scripts/ai/include/attack_generic.lua +++ b/scripts/ai/include/attack_generic.lua @@ -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 + + if dir < 10 or ai.hasturrets() then + ai.shoot() + end 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 -end - diff --git a/scripts/ai/include/basic.lua b/scripts/ai/include/basic.lua index a80be04..344b082 100644 --- a/scripts/ai/include/basic.lua +++ b/scripts/ai/include/basic.lua @@ -60,7 +60,7 @@ function runaway() return end - dir = ai.face(target, 1) + dir = ai.face(target, true) ai.accel() --[[ diff --git a/scripts/ai/merchant.lua b/scripts/ai/merchant.lua deleted file mode 100644 index b848c54..0000000 --- a/scripts/ai/merchant.lua +++ /dev/null @@ -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 - diff --git a/scripts/ai/trader.lua b/scripts/ai/trader.lua index db7f7a1..f2b82cd 100644 --- a/scripts/ai/trader.lua +++ b/scripts/ai/trader.lua @@ -1,4 +1,4 @@ -include("../scripts/ai/merchant.lua") +include("../scripts/ai/tpl/merchant.lua") function sos() msg = { diff --git a/src/ai.c b/src/ai.c index a814e66..ce746d3 100644 --- a/src/ai.c +++ b/src/ai.c @@ -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; diff --git a/src/input.c b/src/input.c index e8fa178..ee2b837 100644 --- a/src/input.c +++ b/src/input.c @@ -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. */