Adjust populator functions to allow easy launching from station or planet

Fix pirate lurk calculations, tune a few other AI behaviours
This commit is contained in:
cim 2013-08-11 20:51:46 +01:00
parent 2da8ada948
commit 03f7fb174b
2 changed files with 210 additions and 81 deletions

View File

@ -2031,7 +2031,7 @@ AILib.prototype.behaviourApproachDestination = function()
if (waypoints != null)
{
this.ship.destination = waypoints[waypoints.length-1];
this.ship.desiredRange = 1000;
this.ship.desiredRange = 100;
}
var blocker = this.ship.checkCourseToDestination();
if (blocker)
@ -2041,7 +2041,18 @@ AILib.prototype.behaviourApproachDestination = function()
// the selected planet can't block
if (blocker.isSun || this.getParameter("oolite_selectedPlanet") != blocker)
{
if (this.distance(blocker) < blocker.radius * 3)
var dist = this.distance(blocker);
if (dist < blocker.radius * 1.3)
{
if (waypoints == null)
{
waypoints = [];
}
waypoints.push(this.ship.position.subtract(blocker.position.subtract(this.ship.position)));
this.ship.destination = waypoints[waypoints.length-1];
this.ship.desiredRange = 100;
}
else if (this.distance(blocker) < blocker.radius * 3)
{
if (waypoints == null)
{
@ -2049,7 +2060,7 @@ AILib.prototype.behaviourApproachDestination = function()
}
waypoints.push(this.ship.getSafeCourseToDestination());
this.ship.destination = waypoints[waypoints.length-1];
this.ship.desiredRange = 1000;
this.ship.desiredRange = 100;
}
}
}
@ -2066,7 +2077,7 @@ AILib.prototype.behaviourApproachDestination = function()
}
waypoints.push(this.ship.getSafeCourseToDestination());
this.ship.destination = waypoints[waypoints.length-1];
this.ship.desiredRange = 1000;
this.ship.desiredRange = 100;
}
}
}
@ -2293,7 +2304,7 @@ AILib.prototype.behaviourEnterWitchspace = function()
// wait for escorts to launch
if (!this.conditionAllEscortsInFlight())
{
this.ship.destination = this.ship.position;
this.ship.destination = this.ship.position.add(this.ship.vectorForward.multiply(30000));
this.ship.desiredRange = 10000;
this.ship.desiredSpeed = this.cruiseSpeed();
if (this.ship.checkCourseToDestination())
@ -2321,7 +2332,7 @@ AILib.prototype.behaviourEnterWitchspace = function()
this.communicate("oolite_engageWitchspaceDrive",{},4);
this.setParameter("oolite_witchspaceEntry",clock.seconds + 15);
}
this.ship.destination = this.ship.position;
this.ship.destination = this.ship.position.add(this.ship.vectorForward.multiply(30000));
this.ship.desiredRange = 10000;
this.ship.desiredSpeed = this.cruiseSpeed();
if (this.ship.checkCourseToDestination())
@ -2451,7 +2462,7 @@ AILib.prototype.behaviourFollowGroupLeader = function()
else
{
this.ship.destination = this.ship.group.leader.position;
this.ship.desiredRange = 2000+Math.random()*2000;
this.ship.desiredRange = 500+Math.random()*1000;
this.ship.desiredSpeed = this.ship.maxSpeed;
this.behaviourApproachDestination();
}
@ -3444,34 +3455,44 @@ AILib.prototype.configurationSetDestinationToPirateLurk = function()
}
else
{
var code = "WITCHPOINT";
if (this.distance(system.sun) > system.sun.radius*3 && this.distance(system.mainPlanet) > system.mainPlanet.radius * 3)
{
var p = this.ship.position;
// if already on a lane, stay on it
if (p.z < system.mainPlanet.position.z && ((p.x * p.x) + (p.y * p.y)) < this.scannerRange * this.scannerRange * 4)
if (p.z < (system.mainPlanet.position.z - system.mainPlanet.radius*2) && ((p.x * p.x) + (p.y * p.y)) < this.scannerRange * this.scannerRange * 4)
{
lurk = p;
}
else if (p.subtract(system.mainPlanet).dot(p.subtract(system.sun)) < -0.9)
else if (p.subtract(system.mainPlanet).direction().dot(p.subtract(system.sun).direction()) < -0.9)
{
lurk = p;
}
else if (p.dot(system.sun.position) > 0.9)
else if (p.direction().dot(system.sun.position.direction()) > 0.9)
{
lurk = p;
}
else // not on a lane, so pick somewhere at random
}
if (lurk == null)
{
// not on a lane, or too close to a sun/planet
var code;
var choice = Math.random();
if (choice < 0.8)
if (choice < 0.7)
{
code = "LANE_WP";
}
else
else if (choice < 0.8)
{
code = "LANE_PS";
}
// code = "LANE_WS"? "WITCHPOINT"?
// what about other locations in less policed systems?
else if (choice < 0.9)
{
code = "LANE_WS";
}
else
{
code = "WITCHPOINT";
}
lurk = system.locationFromCode(code);
}
this.setParameter("oolite_pirateLurk",lurk);

View File

@ -905,9 +905,12 @@ this.novaSystemWillPopulate = function()
/* Ship addition functions */
/* These functions use this._addShips/_addGroup so "pos" can either be
* a coordinate or a station, to simplify ship addition */
this._addFreighter = function(pos)
{
var t = system.addShips("trader",1,pos,0);
var t = this._addShips("trader",1,pos,0);
if (t[0])
{
if (Math.random() < 0.1)
@ -922,23 +925,32 @@ this._addFreighter = function(pos)
{
t[0].bounty = 0;
}
if (pos.isStation)
{
t[0].homeSystem = system.ID;
t[0].destinationSystem = this._weightedNearbyTradeSystem();
t[0].setCargoType("PLENTIFUL_GOODS");
}
else
{
t[0].homeSystem = this._weightedNearbyTradeSystem();
this._setFuel(t[0]);
t[0].destinationSystem = system.ID;
t[0].setCargoType("SCARCE_GOODS");
}
}
}
this._addCourier = function(pos)
{
if (this._roleExists("trader-courier"))
{
var t = system.addShips("trader-courier",1,pos,0);
var t = this._addShips("trader-courier",1,pos,0);
}
else
{
var t = system.addShips("trader",1,pos,0);
var t = this._addShips("trader",1,pos,0);
}
t[0].bounty = 0;
t[0].heatInsulation = 6;
@ -961,18 +973,35 @@ this._addCourierShort = function(pos)
if (t[0])
{
// don't need to worry at this stage where it came from before that
if (pos.isStation)
{
t[0].destinationSystem = this._nearbySystem(7);
t[0].homeSystem = system.ID;
t[0].setCargoType("PLENTIFUL_GOODS");
}
else
{
t[0].homeSystem = this._nearbySystem(7);
this._setFuel(t[0]);
t[0].destinationSystem = system.ID;
t[0].setCargoType("SCARCE_GOODS");
}
}
}
this._addCourierLong = function(pos)
{
var t = this._addCourier(pos);
if (t[0])
{
if (pos.isStation)
{
t[0].destinationSystem = this._nearbySystem(25);
t[0].homeSystem = system.ID;
t[0].setCargoType("PLENTIFUL_GOODS");
}
else
{
// don't need to worry at this stage where it came from before that
t[0].homeSystem = this._nearbySystem(7);
@ -981,24 +1010,33 @@ this._addCourierLong = function(pos)
t[0].setCargoType("SCARCE_GOODS");
}
}
}
this._addSmuggler = function(pos)
{
if (this._roleExists("trader-smuggler"))
{
var t = system.addShips("trader-smuggler",1,pos,0);
var t = this._addShips("trader-smuggler",1,pos,0);
}
else
{
var t = system.addShips("trader",1,pos,0);
var t = this._addShips("trader",1,pos,0);
}
if (t[0])
{
t[0].bounty = Math.ceil(Math.random()*20);
if (pos.isStation)
{
t[0].destinationSystem = this._nearbySystem(7);
t[0].homeSystem = system.ID;
}
else
{
t[0].homeSystem = this._nearbySystem(7);
this._setFuel(t[0]);
t[0].destinationSystem = system.ID;
}
t[0].setCargoType("ILLEGAL_GOODS");
t[0].awardEquipment("EQ_FUEL_INJECTION"); // smugglers always have injectors
}
@ -1007,49 +1045,34 @@ this._addSmuggler = function(pos)
this._addLightHunter = function(pos)
{
var h = system.addGroup("hunter",Math.floor(Math.random()*2)+Math.floor(Math.random()*2)+2,pos,2E3);
var h = this._addGroup("hunter",Math.floor(Math.random()*2)+Math.floor(Math.random()*2)+2,pos,2E3);
for (var i = 0 ; i < h.ships.length ; i++)
{
h.ships[i].bounty = 0;
h.ships[i].homeSystem = system.ID;
h.ships[i].destinationSystem = system.ID;
h.ships[i].AIScript.oolite_intership.initial_group = h.ships.length;
}
}
this._addMediumHunterLocal = function(pos)
{
this._addHunterPack(pos,system.ID,system.ID,"hunter-heavy");
}
this._addMediumHunterRemote = function(pos)
{
this._addHunterPack(pos,this._nearbySafeSystem(2),system.ID,"hunter-heavy");
}
// tmp for testing
this._addMediumHunterOutbound = function(pos)
{
this._addHunterPack(pos,system.ID,this._nearbyDangerousSystem(1),"hunter-medium");
}
this._addHeavyHunterLocal = function(pos)
{
this._addHunterPack(pos,system.ID,system.ID,"hunter-medium");
}
this._addHeavyHunterRemote = function(pos)
{
this._addHunterPack(pos,this._nearbySafeSystem(2),system.ID,"hunter-medium");
}
// tmp for testing
this._addHeavyHunterOutbound = function(pos)
{
this._addHunterPack(pos,system.ID,this._nearbyDangerousSystem(1),"hunter-heavy");
@ -1060,11 +1083,11 @@ this._addHunterPack = function(pos,home,dest,role)
{
if (this._roleExists(role))
{
var t = system.addShips(role,1,pos,0);
var t = this._addShips(role,1,pos,0);
}
else
{
var t = system.addShips("hunter",1,pos,0);
var t = this._addShips("hunter",1,pos,0);
}
if (t[0])
{
@ -1076,7 +1099,7 @@ this._addHunterPack = function(pos,home,dest,role)
var group = new ShipGroup("hunter group",t[0]);
t[0].group = group;
var hs = system.addShips("hunter",1+Math.floor(Math.random()*4)+Math.floor(Math.random()*4),pos,3E3);
var hs = this._addShips("hunter",1+Math.floor(Math.random()*4)+Math.floor(Math.random()*4),pos,3E3);
for (var i = 0; i<hs.length; i++)
{
hs[i].group = group;
@ -1098,7 +1121,7 @@ this._addIndependentPirate = function(pos)
{
size = 1+Math.floor(Math.random()*size);
}
var pg = system.addGroup("pirate",size,pos,2.5E3);
var pg = this._addGroup("pirate",size,pos,2.5E3);
for (var i=0;i<pg.ships.length;i++)
{
pg.ships[i].setBounty(20+system.government+size+Math.floor(Math.random()*8),"setup actions");
@ -1106,15 +1129,15 @@ this._addIndependentPirate = function(pos)
}
this._addPirateAssistant = function(role,lead)
this._addPirateAssistant = function(role,lead,pos)
{
if (this._roleExists(role))
{
var asst = system.addShips(role,1,lead.position,4E3);
var asst = this._addShips(role,1,pos,4E3);
}
else
{
var asst = system.addShips("pirate",1,lead.position,4E3);
var asst = this._addShips("pirate",1,pos,4E3);
}
asst[0].homeSystem = lead.homeSystem;
asst[0].destinationSystem = lead.destinationSystem;
@ -1139,12 +1162,12 @@ this._addPiratePack = function(pos,leader,lf,mf,hf,thug,home,destination)
{
if (this._roleExists(leader))
{
var lead = system.addShips(leader,1,pos,0);
var lead = this._addShips(leader,1,pos,0);
}
else
{
log(this.name,"Tried to add "+leader+" but no ships of that role found");
var lead = system.addShips("pirate",1,pos,0);
var lead = this._addShips("pirate",1,pos,0);
}
lead[0].setBounty(60+system.government+Math.floor(Math.random()*8),"setup actions");
lead[0].homeSystem = home;
@ -1154,19 +1177,19 @@ this._addPiratePack = function(pos,leader,lf,mf,hf,thug,home,destination)
lead[0].group = group;
for (var i = Math.floor(lf+(0.5+Math.random()-Math.random())); i > 0; i--)
{
this._addPirateAssistant("pirate-light-fighter",lead[0]);
this._addPirateAssistant("pirate-light-fighter",lead[0],pos);
}
for (var i = Math.floor(mf+(0.5+Math.random()-Math.random())); i > 0; i--)
{
this._addPirateAssistant("pirate-medium-fighter",lead[0]);
this._addPirateAssistant("pirate-medium-fighter",lead[0],pos);
}
for (var i = Math.floor(hf+(0.5+Math.random()-Math.random())); i > 0; i--)
{
this._addPirateAssistant("pirate-heavy-fighter",lead[0]);
this._addPirateAssistant("pirate-heavy-fighter",lead[0],pos);
}
for (var i = Math.floor(thug+(0.5+Math.random()-Math.random())); i > 0; i--)
{
this._addPirateAssistant("pirate-interceptor",lead[0]);
this._addPirateAssistant("pirate-interceptor",lead[0],pos);
}
lead[0].awardEquipment("EQ_SHIELD_BOOSTER");
lead[0].awardEquipment("EQ_ECM");
@ -1254,7 +1277,7 @@ this._addPolicePatrol = function(pos)
{
role = "interceptor";
}
var h = system.addGroup(role,Math.floor(Math.random()*2)+Math.floor(Math.random()*2)+2,pos,2E3);
var h = this._addGroup(role,Math.floor(Math.random()*2)+Math.floor(Math.random()*2)+2,pos,2E3);
for (var i = 0 ; i < h.ships.length ; i++)
{
h.ships[i].bounty = 0;
@ -1267,7 +1290,7 @@ this._addPolicePatrol = function(pos)
this._addInterceptors = function(pos)
{
var h = system.addGroup("interceptor",Math.floor(Math.random()*2)+Math.floor(Math.random()*2)+1+Math.ceil(system.info.techlevel/6),pos,2E3);
var h = this._addGroup("interceptor",Math.floor(Math.random()*2)+Math.floor(Math.random()*2)+1+Math.ceil(system.info.techlevel/6),pos,2E3);
for (var i = 0 ; i < h.ships.length ; i++)
{
h.ships[i].bounty = 0;
@ -1281,13 +1304,13 @@ this._addInterceptors = function(pos)
this._addThargoidScout = function(pos)
{
system.addShips("thargoid",1,pos,0);
this._addShips("thargoid",1,pos,0);
}
this._addThargoidStrike = function(pos)
{
system.addShips("thargoid",Math.floor(5+Math.random()*4),pos,10E3);
this._addShips("thargoid",Math.floor(5+Math.random()*4),pos,10E3);
}
/* Utility functions */
@ -1324,6 +1347,91 @@ this._setFuel = function(ship)
}
}
this._addShips = function(role,num,pos,spread)
{
if (pos.isStation)
{
var result = [];
for (var i = 0 ; i < num ; i++)
{
result.push(pos.launchShipWithRole(role));
}
return result;
}
else if (pos.isPlanet)
{
var result = system.addShips(role,num,pos,spread);
this._repositionForLaunch(pos,result);
return result;
}
else
{
return system.addShips(role,num,pos,spread);
}
}
this._addGroup = function(role,num,pos,spread)
{
if (pos.isStation)
{
var group = new ShipGroup;
for (var i = 0 ; i < num ; i++)
{
var ship = pos.launchShipWithRole(role);
ship.group = group;
group.addShip(ship);
}
return group;
}
else if (pos.isPlanet)
{
var result = system.addGroup(role,num,pos,spread);
this._repositionForLaunch(pos,result.ships);
return result;
}
else
{
return system.addGroup(role,num,pos,spread);
}
}
this._repositionForLaunch = function(planet,ships)
{
var launchvector;
var launchpos;
if (planet != system.mainPlanet)
{
launchvector = Vector3D.randomDirection();
}
else
{
if (system.sun.position.subtract(planet.position).dot(system.mainStation.position.subtract(planet.position)) < 0)
{
// sun and station on opposite sides of planet; best sneak
// vector probably the cross product
launchvector = system.sun.position.subtract(planet.position).cross(system.mainStation.position.subtract(planet.position)).direction();
}
else
{
// sun and station on same side of planet; best sneak
// vector probably the negative normalisation of the
// average
launchvector = system.sun.position.subtract(planet.position).direction().add(system.mainStation.position.subtract(planet.position).direction()).direction().multiply(-1);
}
}
launchpos = planet.position.add(launchvector.multiply(planet.radius+125));
for (var i=ships.length -1 ; i >= 0 ; i--)
{
var cross = launchvector.cross(Vector3D.randomDirection()).multiply(15000); // perpendicular to surface
launchvector = launchpos.add(cross).direction();
launchpos = planet.position.add(launchvector.multiply(planet.radius+250));
ships[i].position = launchpos;
ships[i].orientation = launchvector.rotationTo([0, 0, 1]);
ships[i].velocity = ships[i].vectorForward.multiply(ships[i].maxSpeed);
}
}
/* System selectors */
this._nearbySystem = function(range)
@ -1340,10 +1448,10 @@ this._nearbySystem = function(range)
this._nearbyDangerousSystem = function(gov)
{
var poss = this.$populatorVeryLocals;
var id = system.ID;
if (poss.length > 0)
{
var found = 0;
var id = system.ID
for (var i = 0 ; i < poss.length ; i++)
{
if (poss[i].government <= gov)
@ -1363,10 +1471,10 @@ this._nearbyDangerousSystem = function(gov)
this._nearbySafeSystem = function(gov)
{
var poss = this.$populatorVeryLocals;
var id = system.ID;
if (poss.length > 0)
{
var found = 0;
var id = system.ID
for (var i = 0 ; i < poss.length ; i++)
{
if (poss[i].government >= gov)