diff --git a/scripts/ai/API b/scripts/ai/API index fc2caf3..23162f7 100644 --- a/scripts/ai/API +++ b/scripts/ai/API @@ -140,6 +140,15 @@ combat([number b]) -- b - if 0 set the pilot to be in combat, if 1 or ommitted sets it to be in combat. -- return nil +settarget(number target) + -- Set the target for the pilot, should be called each frame. + -- target - Pilot to be targeted. + -- return nil. + +secondary() + -- Tries to set the best secondary weapon (defaults to launchers). + -- return the type of secondary weapon set ("None", "Weapon", "Launcher") + shoot([number weapon]) -- Make the pilot shoot weapons. -- weapon to shoot, 1 if primary, 2 if secondary, 3 if both. Defaults to 1. diff --git a/scripts/ai/pirate.lua b/scripts/ai/pirate.lua index 441cf0c..abfd37c 100644 --- a/scripts/ai/pirate.lua +++ b/scripts/ai/pirate.lua @@ -20,7 +20,7 @@ function control() -- Taunts. num = rng(0,4) if num == 0 then msg "Prepare to be boarded!" - elseif num == 1 then msg = "Whoa! Lookie we I found here!" + elseif num == 1 then msg = "Whoa! Lookie what we found here!" elseif num == 2 then msg = "What's a ship like you doing in a place like this?" end comm(enemy,msg) @@ -44,7 +44,7 @@ function attacked(attacker) -- Pirate isn't fighting or fleeing already. if task ~= "attack" and task ~= "runaway" then - taunt() + taunt(attacker) pushtask(0, "attack", attacker) -- Pirate is fighting bit switches to new target (doesn't forget the old on though). elseif task == "attack" then @@ -54,14 +54,14 @@ function attacked(attacker) end end -function taunt() +function taunt(target) num = rng(0,4) if num == 0 then msg = "How dare you attack me?!" elseif num == 1 then msg = "Aha! You think you can best ME?!" elseif num == 2 then msg = "JUST! DIE!" elseif num == 3 then msg = "Ohh, You're not going to enjoy this!" end - if msg then comm(attacker, msg) end + if msg then comm(target, msg) end end -- Run away from the target. diff --git a/scripts/ai/test.lua b/scripts/ai/test.lua index dac40b3..c8a26f5 100644 --- a/scripts/ai/test.lua +++ b/scripts/ai/test.lua @@ -13,18 +13,28 @@ function attacked(attacker) task = taskname() if task ~= "attack" and task ~= "runaway" then -- Let's have some taunts. - num = rng(0,4) - if num == 0 then msg = "You will never kill me!" - elseif num == 1 then msg = "DIE!" - elseif num == 2 then msg = "You won't survive!" - elseif num == 3 then msg = "I hate you!" - end - if msg then comm(attacker, msg) end + taunt(attacker) + -- Now pilot fights back. pushtask(0, "attack", attacker) + elseif task == "attack" then + if gettargetid() ~= attacker then + pushtask(0, "attack", attacker) + end end end +-- Taunts. +function taunt(target) + num = rng(0,4) + if num == 0 then msg = "You will never kill me!" + elseif num == 1 then msg = "DIE!" + elseif num == 2 then msg = "You won't survive!" + elseif num == 3 then msg = "I hate you!" + end + if msg then comm(attacker, msg) end +end + -- Runs away. function runaway() target = gettargetid() @@ -51,6 +61,12 @@ function attack() dir = face(target) dist = getdist(getpos(target)) + second = secondary() + + if secondary() == "Launcher" then + settarget(target) + shoot(2) + end if parmour() < 70 then poptask() diff --git a/src/ai.c b/src/ai.c index c71c9f5..bcc3be9 100644 --- a/src/ai.c +++ b/src/ai.c @@ -124,6 +124,7 @@ static int ai_hyperspace(lua_State* L); // [number] hyperspace() // Combat. static int ai_combat(lua_State* L); // combat(number) static int ai_settarget(lua_State* L); // settarget(number) +static int ai_secondary(lua_State* L); // string secondary() static int ai_shoot(lua_State* L); // shoot(number) number = 1,2,3. static int ai_getenemy(lua_State* L); // number getenemy(). static int ai_hostile(lua_State* L); // hostile(number). @@ -232,6 +233,7 @@ static int ai_loadProfile(char* filename) { // Combat. lua_regfunc(L, "combat", ai_combat); lua_regfunc(L, "settarget", ai_settarget); + lua_regfunc(L, "secondary", ai_secondary); lua_regfunc(L, "shoot", ai_shoot); lua_regfunc(L, "getenemy", ai_getenemy); lua_regfunc(L, "hostile", ai_hostile); @@ -699,6 +701,33 @@ static int ai_settarget(lua_State* L) { return 0; } +// Set the secondary weapon. Biassed towards launchers.. +static int ai_secondary(lua_State* L) { + if(cur_pilot->secondary) { + lua_pushstring(L, outfit_getTypeBroad(cur_pilot->secondary->outfit)); + return 1; + } + + PilotOutfit* po = NULL; + int i; + for(i = 0; i < cur_pilot->noutfits; i++) { + if((po == NULL) && (outfit_isWeapon(cur_pilot->outfits[i].outfit) || + outfit_isLauncher(cur_pilot->outfits[i].outfit))) + po = &cur_pilot->outfits[i]; + else if((po != NULL) && outfit_isWeapon(po->outfit) && + outfit_isLauncher(cur_pilot->outfits[i].outfit)) + po = &cur_pilot->outfits[i]; + } + if(po) { + cur_pilot->secondary = po; + pilot_setAmmo(cur_pilot); + lua_pushstring(L, outfit_getTypeBroad(po->outfit)); + return 1; + } + lua_pushstring(L, "None"); + return 1; +} + // Pew pew.. Says the pilot. static int ai_shoot(lua_State* L) { int n = 1; diff --git a/src/outfit.c b/src/outfit.c index edbc24a..f5479fc 100644 --- a/src/outfit.c +++ b/src/outfit.c @@ -37,6 +37,18 @@ int outfit_isWeapon(const Outfit* o) { return ((o->type == OUTFIT_TYPE_BOLT) || (o->type == OUTFIT_TYPE_BEAM)); } +// Return the broad outfit type. +const char* outfit_typenamebroad[] = { "NULL", "Weapon", "Launcher", "Ammo" }; + +const char* outfit_getTypeBroad(const Outfit* o) { + int i = 0; + if(outfit_isWeapon(o)) i = 1; + else if(outfit_isLauncher(o)) i = 2; + else if(outfit_isAmmo(0)) i = 3; + + return outfit_typenamebroad[i]; +} + // Return 1 if outfit is a launcher. int outfit_isLauncher(const Outfit* o) { return((o->type == OUTFIT_TYPE_MISSILE_DUMB) || diff --git a/src/outfit.h b/src/outfit.h index b6c5038..422d584 100644 --- a/src/outfit.h +++ b/src/outfit.h @@ -69,6 +69,7 @@ int outfit_isWeapon(const Outfit* o); int outfit_isLauncher(const Outfit* o); int outfit_isAmmo(const Outfit* o); const char* outfit_getType(const Outfit* o); +const char* outfit_getTypeBroad(const Outfit* o); // Load/free outfit stack. int outfit_load(void);