Merge branch 'bugfixes'

Conflicts:
	data/mp/multiplay/skirmish/nullbot-main.js.inc
master
haonoq 2013-11-02 01:00:04 +04:00
commit 4fda6753bc
7 changed files with 575 additions and 3 deletions

View File

@ -0,0 +1,4 @@
[AI]
name = "Hover AI"
js = nullbot-hover.js
tip = "An AI specially tweaked for sea maps, based on NullBot"

View File

@ -0,0 +1,8 @@
const DEF_LIGHT = 0; // change 0 to 1 to get a weaker AI with lower CPU usage
include("multiplay/skirmish/nullbot-header.js.inc");
include("multiplay/skirmish/nullbot-hover.js.inc");
include("multiplay/skirmish/nullbot-main.js.inc");

View File

@ -0,0 +1,250 @@
/******************************/
/* Hover branch specific code */
/******************************/
function constructPersonality() {
this.MIN_BUILDERS = 3; // the usual number of trucks that construct base structures
this.MAX_BUILDERS = 3; // the maximum number of trucks that construct base structures
this.MIN_OILERS = 2; // the usual number of trucks used for oil hunting
this.MAX_OILERS = 6; // the maximum number of trucks used for oil hunting
// special trick for Hover AI: need to make sure hover trucks are built
this.MIN_DEFENDERS = 1; // the minimum number of tanks before producing more trucks than necessary
this.DEFENSIVENESS = 3; // regulates chance of spending money on defensive structures
this.PEACE_TIME = 12; // the amount of minutes for free scouting (regrouping disabled, no defenses built)
this.THIS_AI_MAKES_TANKS = true;
this.THIS_AI_MAKES_CYBORGS = false;
this.THIS_AI_MAKES_VTOLS = true;
this.researchPathPrimary = [
"R-Sys-Engineering01",
"R-Struc-Research-Module",
"R-Wpn-Rocket05-MiniPod",
"R-Vehicle-Prop-Hover",
"R-Wpn-Rocket02-MRL",
"R-Vehicle-Body05",
"R-Wpn-Rocket-ROF01",
"R-Struc-RepairFacility",
"R-Defense-MRL",
"R-Defense-Pillbox06",
"R-Vehicle-Body11",
"R-Wpn-Rocket-ROF02",
"R-Struc-RprFac-Upgrade01",
"R-Defense-WallTower06",
];
this.researchPathFundamental = [
"R-Struc-Power-Upgrade01c",
"R-Sys-Sensor-Tower02",
"R-Vehicle-Body12",
"R-Struc-Power-Upgrade03a",
"R-Struc-Materials03",
"R-Struc-VTOLPad-Upgrade01",
"R-Struc-RprFac-Upgrade04",
"R-Vehicle-Body09",
"R-Vehicle-Body10",
"R-Struc-Research-Upgrade09",
"R-Struc-VTOLPad-Upgrade06",
"R-Vehicle-Body14",
"R-Wpn-LasSat",
"R-Struc-Materials09",
"R-Struc-RprFac-Upgrade06",
];
this.researchPathAT = [
"R-Wpn-Rocket-ROF03",
"R-Defense-Sunburst",
"R-Defense-Super-Rocket",
"R-Defense-HvyA-Trocket",
"R-Defense-WallTower-HvyA-Trocket",
"R-Defense-GuardTower-ATMiss",
"R-Defense-WallTower-A-Tmiss",
"R-Wpn-Missile-ROF03",
"R-Wpn-Missile-Damage03",
"R-Wpn-Missile-Accuracy02",
"R-Defense-Super-Missile",
];
this.researchPathAP = this.researchPathAT;
this.researchPathAA = [
"R-Defense-Sunburst",
"R-Defense-SamSite1",
"R-Defense-SamSite2",
];
this.researchPathAB = [
"R-Wpn-Rocket03-HvAT",
"R-Defense-IDFRocket",
"R-Defense-HvyArtMissile",
];
this.tankBodies = [
[
"Body14SUP", // dragon
"Body13SUP", // wyvern
"Body10MBT", // vengeance
"Body9REC", // tiger
"Body7ABT", // retribution
"Body12SUP", // mantis
"Body11ABT", // python
"Body8MBT", // scorpion
"Body5REC", // cobra
"Body1REC", // viper
],
];
this.tankPropulsions = [
[
"hover01", // hover
],
];
this.vtolBodies = [
"Body7ABT", // retribution
"Body6SUPP", // panther
"Body8MBT", // scorpion
"Body5REC", // cobra
];
// this particular AI doesn't research
// most of the AP weapons anyway, but it
// will utilize AP weapons researched
// by his allies or available at start
this.apWeapons = [
[
"Missile-MdArt", // seraph
"Laser2PULSEMk1", // pulse laser
"MG5TWINROTARY", // tag
"PlasmiteFlamer", // plasmite
"MG4ROTARYMk1", // ag
"Flame2", // inferno
"Rocket-MRL", // mini-rocket arty
],
];
this.atWeapons = [
[
"Missile-A-T", // scourge
"Rocket-HvyA-T", // tk
"Rocket-LtA-T", // lancer
],
];
this.abWeapons = [
[
"Missile-MdArt", // seraph
"Rocket-BB", // bunker buster
"Rocket-MRL", // mra
],
];
this.aaWeapons = [
[
"Missile-HvySAM", // vindicator
"Missile-LtSAM", // avenger
"Rocket-Sunburst", // sunburst
],
];
this.vtolWeapons = [
"Missile-VTOL-AT", // scourge
"Rocket-VTOL-HvyA-T", // tk
"Rocket-VTOL-LtA-T", // lancer
"Rocket-VTOL-Pod", // minipod
];
this.apCyborgStats = [
[
],
];
this.atCyborgStats = [
[
],
];
this.defenses = [
[
"GuardTower-ATMiss", // scourge tower
"Emplacement-HvyATrocket", // tk emplacement
"GuardTower5", // lancer tower
"GuardTower6", // minipod tower
],
[
"Emplacement-MdART-pit", // seraph emplacement
"Emplacement-MRL-pit", // mra emplacement
],
[
"X-Super-Missile", // super missile fort
"X-Super-Rocket", // super rocket fort
],
];
this.artillery = [
[
"Emplacement-HvART-pit", // archangel
"Emplacement-Rocket06-IDF", // ripples
],
];
this.antiair = [
"P0-AASite-Laser", // stormbringer
"P0-AASite-SAM2", // vindicator
"P0-AASite-SAM1", // avenger
"AASite-QuadRotMg", // whirlwind
"P0-AASite-Sunburst", // sunburst
"AASite-QuadBof", // flak cannon
"AASite-QuadMg1", // hurricane
];
this.hardpoints = [
[
"WallTower-Atmiss", // scourge
"WallTower-HvATrocket", // tk
"WallTower06", // lancer
],
];
}
// Builds initial structures in the following order:
// lab, lab, factory, lab, generator, generator, lab, CC, factory
// Doesn't build the 2nd factory until 10th minute of the game.
// Demolishes the 4th research lab when hovers are available
// Then build extra structures if necessary.
// Also make sure we have at least one generator before our initial money runs out
function buildOrder() {
var labCount = enumStruct(me, lab).length;
var factoryCount = enumStruct(me, factory).length;
var commandCount = enumStruct(me, command).length;
var genCount = enumStruct(me, generator).length;
var derrickCount = enumStruct(me, derrick).length;
var vtolCount = enumStruct(me, vtolfac).length;
var labsNeeded=4;
if (countAllies()>3)
--labsNeeded;
if (countAllies()>1 || iHaveHovers())
--labsNeeded;
if (genCount < 2 && playerPower(me) < EXTREME_LOW_POWER && isStructureAvailable(generator,me))
return buildBasicStructure(generator);
if (labCount < 2 && isStructureAvailable(lab,me))
return buildBasicStructure(lab);
if (factoryCount < 1 && isStructureAvailable(factory,me))
return buildBasicStructure(factory);
if (labCount < 3 && isStructureAvailable(lab,me))
return buildBasicStructure(lab,0);
if ((genCount < 2) && isStructureAvailable(generator,me))
return buildBasicStructure(generator);
if (labCount < labsNeeded && isStructureAvailable(lab,me))
return buildBasicStructure(lab,0);
if (commandCount < 1 && isStructureAvailable(command,me))
return buildBasicStructure(command);
if (factoryCount < 2 && isStructureAvailable(factory,me) && (!earlyGame(10)&&!UNUSUAL_SITUATION))
return buildBasicStructure(factory,0);
if (vtolCount < 1 && isStructureAvailable(vtolfac,me))
return buildBasicStructure(vtolfac,0);
return false;
}

View File

@ -23,6 +23,8 @@ var NUM_HARASS = 4; // the number of units to maintain in the harass group
var NUM_VTOL_GROUPS = MIN_VTOL_GROUPS;
var ABS_MAX_TRUCKS = 10; // try not to make too many trucks
var NO_VTOL = 0; // the script will set it to 1 if VTOLs are disabled via structure limits
var RATE_AP = 2; // these values affect the amount of a certain weapon class in the mix
var RATE_AT = 1; // this is for anti-tank
var RATE_AA = 0; // how much more AA do we need
@ -233,6 +235,8 @@ function dontRunOutOfPower() {
// checks if a structure is a dedicated anti-air defense
function isDedicatedAA(struct) {
if (NO_VTOL)
return false;
if (typeof(struct.canHitAir)!="undefined" && typeof(struct.canHitGround)!="undefined") {
return struct.canHitAir && !struct.canHitGround;
} else {
@ -262,7 +266,7 @@ function enemyCountBalance(enemy) {
borg:16,
vtol:4,
defs:2,
aa:7
aa:(NO_VTOL ? 0 : 7)
};
// the rest involves deity cheating
if (typeof(enemyInfo[enemy])!="undefined") {
@ -324,7 +328,7 @@ function groupCountBalance(gr) {
// the heart of the AI adaptation algorithm
function adaptationMatrix(ap, at, aa, ab, tank, borg, vtol, defs) {
if (difficulty == EASY || difficulty == MEDIUM)
return {ap:8,at:4,aa:2,ab:1};
return {ap:8,at:4,aa:(NO_VTOL?0:2),ab:1};
// the rest involves deity cheating
var newAP, newAT, newAA, newAB;
var totalMe=ap+at+aa+ab;
@ -339,6 +343,8 @@ function adaptationMatrix(ap, at, aa, ab, tank, borg, vtol, defs) {
newAT = Math.floor(newAT); if (newAT < 1) newAT=1;
newAA = Math.floor(newAA); if (newAA < 0) newAA=0;
newAB = Math.floor(newAB); if (newAB < 0) newAB=0;
if (NO_VTOL)
newAA = 0;
return {ap:newAP,at:newAT,aa:newAA,ab:newAB};
}
@ -361,7 +367,7 @@ function adapt() {
if (difficulty == EASY || difficulty == MEDIUM) {
RATE_AP = 16;
RATE_AT = 7;
RATE_AA = 3;
RATE_AA = (NO_VTOL ? 0 : 3);
RATE_AB = 3;
} else { // the rest involves deity cheating
var enemyBorgCount = 0, enemyTankCount = 0, enemyVtolCount = 0, enemyBuildingCount = 0;
@ -793,6 +799,8 @@ function buildCB() {
// build anti-air defenses at specific spots
function buildAA() {
if (NO_VTOL)
return false;
var x=lastAirAttackX, y = lastAirAttackY;
if (x == -1 || y == -1)
return false;
@ -1361,6 +1369,8 @@ function doResearch() {
ret.vtol = 1;
ret.defs = 1;
}
if (NO_VTOL)
ret.vtol = 0;
var total=ret.tank+ret.borg+ret.vtol+ret.defs;
if (random(total)<ret.borg)
if (followResearchPath(lablist[i],personality.researchPathAP)) {
@ -2638,6 +2648,9 @@ function eventGameInit() {
function eventStartLevel() {
if (typeof(global.scavengerPlayer)=="undefined") // HACK: until scavengerPlayer is exposed to scripts.
global.scavengerPlayer = Math.max(7, maxPlayers);
if (getStructureLimit(vtolfac, me) == 0) {
NO_VTOL = 1;
}
personality=new constructPersonality();
basePosition=startPositions[me];
if (isStructureAvailable(fmod,me)) {

View File

@ -0,0 +1,4 @@
[AI]
name = "Turtle AI"
js = nullbot-turtle.js
tip = "Tower wars AI, based on NullBot"

View File

@ -0,0 +1,8 @@
const DEF_LIGHT = 0; // change 0 to 1 to get a weaker AI with lower CPU usage
include("multiplay/skirmish/nullbot-header.js.inc");
include("multiplay/skirmish/nullbot-turtle.js.inc");
include("multiplay/skirmish/nullbot-main.js.inc");

View File

@ -0,0 +1,285 @@
/********************************/
/* Generic branch specific code */
/********************************/
function constructPersonality() {
this.MIN_BUILDERS = 2; // the usual number of trucks that construct base structures
this.MAX_BUILDERS = 3; // the maximum number of trucks that construct base structures
this.MIN_OILERS = 4; // the usual number of trucks used for oil hunting
this.MAX_OILERS = 15; // the maximum number of trucks used for oil hunting
this.MIN_DEFENDERS = 0; // the minimum number of tanks before producing more trucks than necessary
this.DEFENSIVENESS = 0; // regulates chance of spending money on defensive structures
this.PEACE_TIME = 0; // the amount of minutes for free scouting (regrouping disabled, no defenses built)
this.THIS_AI_MAKES_TANKS = false;
this.THIS_AI_MAKES_CYBORGS = false;
this.THIS_AI_MAKES_VTOLS = true;
this.researchPathPrimary = [
"R-Defense-Tower01",
"R-Wpn-MG-Damage03",
"R-Struc-PowerModuleMk1",
"R-Defense-Tower06",
"R-Defense-Pillbox01",
"R-Defense-WallTower01",
"R-Defense-WallUpgrade02",
"R-Defense-MRL",
"R-Wpn-Rocket-ROF01",
"R-Defense-MortarPit",
"R-Sys-Sensor-Tower02",
"R-Defense-Pillbox06",
"R-Defense-WallTower06",
"R-Defense-Sunburst",
"R-Defense-HvyMor",
"R-Defense-WallUpgrade03",
"R-Struc-Materials03",
"R-Vehicle-Body05",
"R-Vehicle-Metals02",
"R-Sys-CBSensor-Tower01",
"R-Defense-IDFRocket",
"R-Struc-Power-Upgrade01c",
"R-Struc-VTOLPad-Upgrade01",
"R-Wpn-Bomb02",
"R-Defense-Howitzer",
"R-Wpn-Rocket-ROF03",
"R-Defense-HvyA-Trocket",
"R-Defense-WallTower-HvyA-Trocket",
"R-Defense-Super-Rocket",
"R-Vehicle-Metals05",
"R-Wpn-Bomb-Accuracy03",
"R-Struc-VTOLPad-Upgrade03",
"R-Defense-WallUpgrade06",
"R-Struc-Materials06",
"R-Struc-Power-Upgrade03a",
"R-Sys-Autorepair-General",
"R-Sys-SpyTower",
"R-Wpn-Bomb05",
"R-Defense-HvyHowitzer",
"R-Defense-GuardTower-ATMiss",
"R-Defense-WallTower-A-Tmiss",
"R-Defense-SamSite1",
"R-Defense-HvyArtMissile",
"R-Vehicle-Metals09",
"R-Wpn-Missile-Damage03",
"R-Wpn-Missile-ROF03",
"R-Wpn-Missile-Accuracy02",
"R-Defense-SamSite2",
"R-Vehicle-Body07",
"R-Struc-Materials06",
"R-Wpn-LasSat",
"R-Defense-WallUpgrade09",
"R-Defense-Super-Missile",
"R-Defense-EMPMortar",
"R-Defense-EMPCannon",
"R-Struc-Materials09",
"R-Defense-WallUpgrade12",
"R-Struc-VTOLPad-Upgrade06",
];
this.researchPathFundamental = [
];
this.researchPathAP = [
];
this.researchPathAT = [
];
this.researchPathAA = [
];
this.researchPathAB = [
];
this.tankBodies = [
[
],
];
this.tankPropulsions = [
[
],
];
this.vtolBodies = [
"Body7ABT", // retribution
"Body6SUPP", // panther
"Body8MBT", // scorpion
"Body5REC", // cobra
];
this.apWeapons = [
[
],
];
this.atWeapons = [
[
],
];
this.abWeapons = [
[
],
];
this.aaWeapons = [
[
],
];
this.vtolWeapons = [
"Bomb5-VTOL-Plasmite", // plasmite bombs
"RailGun2-VTOL", // rail gun
"Bomb4-VTOL-HvyINC", // thermite bombs
"Bomb2-VTOL-HvHE", // heap bombs
"RailGun1-VTOL", // needle
"Missile-VTOL-AT", // scourge
"Laser2PULSE-VTOL", // pulse laser
"Cannon5Vulcan-VTOL", // ac
"Rocket-VTOL-HvyA-T", // tk
"Bomb3-VTOL-LtINC", // phosphor bombs
"MG4ROTARY-VTOL", // ag
"Cannon4AUTO-VTOL", // hpv
"Rocket-VTOL-LtA-T", // lancer
"Bomb1-VTOL-LtHE", // cluster bombs
"MG3-VTOL", // hmg
"Rocket-VTOL-Pod", // minipod
];
this.apCyborgStats = [
];
this.atCyborgStats = [
];
this.defenses = [
[
],
];
this.artillery = [
[
"Emplacement-Howitzer150", // ground shaker
"Emplacement-Howitzer-Incenediary", // incendiary howitzer
"Emplacement-RotHow", // hellstorm
"Emplacement-Howitzer105", // howitzer
"Emplacement-MortarPit-Incenediary", // incendiary mortar
"Emplacement-MortarPit02", // bombard
"Emplacement-RotMor", // pepperpot
"Emplacement-MortarPit01", // mortar
],
[
"Emplacement-HvART-pit", // archangel
"Emplacement-Rocket06-IDF", // ripples
"Emplacement-MortarPit02", // bombard
"Emplacement-MortarPit-Incenediary", // incendiary mortar
"Emplacement-RotMor", // pepperpot
"Emplacement-MortarPit01", // mortar
],
];
this.antiair = [
"P0-AASite-Laser", // stormbringer
"P0-AASite-SAM2", // vindicator
"P0-AASite-SAM1", // avenger
"AASite-QuadRotMg", // whirlwind
"P0-AASite-Sunburst", // sunburst
"AASite-QuadBof", // flak cannon
"AASite-QuadMg1", // hurricane
];
this.hardpoints = [
[
"GuardTower-ATMiss", // scourge tower
"GuardTower-ATMiss", // scourge tower
"Emplacement-HvyATrocket", // tk emplacement
"GuardTower5", // lancer tower
"GuardTower6", // minipod tower
"GuardTower1", // mg tower
],
[
"Emplacement-MdART-pit", // seraph
"Emplacement-MdART-pit", // seraph
"Emplacement-MdART-pit", // seraph
"Emplacement-MRL-pit", // mra emplacement
"WallTower01", // hmg
"PillBox1", // mg bunker
"GuardTower1", // mg tower
],
[
"X-Super-Missile", // super missile fort
"X-Super-Rocket", // super rocket fort
"GuardTower5", // lancer tower
"GuardTower6", // minipod tower
"PillBox1", // mg bunker
"GuardTower1", // mg tower
],
[
"Emplacement-MortarEMP", // emp mortar
"Sys-SpyTower", // nexus link tower
"Emplacement-MdART-pit", // seraph
"GuardTower-ATMiss", // scourge tower
"Emplacement-HvyATrocket", // tk emplacement
"Emplacement-MRL-pit", // mra emplacement
"GuardTower6", // minipod tower
"PillBox1", // mg bunker
"GuardTower1", // mg tower
],
[
"WallTower-Atmiss", // scourge
"WallTower-HvATrocket", // tk
"WallTower06", // lancer
"WallTower01", // hmg
"PillBox1", // mg bunker
"GuardTower1", // mg tower
],
[
"WallTower-EMP", // emp
"Emplacement-MdART-pit", // seraph
"Emplacement-MRL-pit", // mra emplacement
"WallTower01", // hmg
"PillBox1", // mg bunker
"GuardTower1", // mg tower
],
];
this.hardpoints = this.hardpoints.concat(this.artillery);
this.hardpoints[this.hardpoints.length]=this.antiair;
this.hardpoints[this.hardpoints.length]=this.antiair;
this.hardpoints[this.hardpoints.length]=this.antiair;
}
// Builds initial structures in the following order:
// factory, lab, cc, lab, lab
// Then build extra structures if necessary.
// Also make sure we have at least one generator before our initial money runs out
function buildOrder() {
var labCount = enumStruct(me, lab).length;
var factoryCount = enumStruct(me, factory).length;
var commandCount = enumStruct(me, command).length;
var genCount = enumStruct(me, generator).length;
var derrickCount = enumStruct(me, derrick).length;
var borgCount = enumStruct(me, borgfac).length;
var vtolCount = enumStruct(me, vtolfac).length;
if (genCount < 2 && playerPower(me) < EXTREME_LOW_POWER && isStructureAvailable(generator,me))
return buildBasicStructure(generator);
if (factoryCount < 1 && isStructureAvailable(factory,me))
return buildBasicStructure(factory);
if (labCount < 1 && isStructureAvailable(lab,me))
return buildBasicStructure(lab);
if (commandCount < 1 && isStructureAvailable(command,me))
return buildBasicStructure(command);
if (labCount < 2 && isStructureAvailable(lab,me))
return buildBasicStructure(lab,0);
if ((genCount < 2) && isStructureAvailable(generator,me))
return buildBasicStructure(generator);
if (labCount < 3 && isStructureAvailable(lab,me))
return buildBasicStructure(lab,0);
if (vtolCount < 1 && isStructureAvailable(vtolfac,me))
return buildBasicStructure(vtolfac,0);
return false;
}