From 423ac3df4f677606898ea9c968bc3652f3f9d7e3 Mon Sep 17 00:00:00 2001 From: Per Inge Mathisen Date: Fri, 15 Jan 2010 16:00:27 +0000 Subject: [PATCH] Use chained events instead of relying on a 40 second repeat trigger for research. This makes the AI much faster at researching, as it eliminates long delays. Also clean up the base expansion code and make it stop trying to expand when out of power. git-svn-id: https://warzone2100.svn.sourceforge.net/svnroot/warzone2100/trunk@9243 4a71c877-e1ca-e34f-864e-861f7616d084 --- data/base/multiplay/skirmish/ai.slo | 46 +++++++++++++---------------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/data/base/multiplay/skirmish/ai.slo b/data/base/multiplay/skirmish/ai.slo index cfdf7ba7f..c706c9d07 100644 --- a/data/base/multiplay/skirmish/ai.slo +++ b/data/base/multiplay/skirmish/ai.slo @@ -127,7 +127,8 @@ private GROUP defendGroup; private bool defendbusy; private BASEOBJ defendObj; -public RESEARCHSTAT nexusDefence; +public RESEARCHSTAT nexusDefence; +private RESEARCHSTAT research; //build private GROUP buildGroup; @@ -200,7 +201,7 @@ trigger attackStuffTr (every, 300 ); trigger allOutAttackTr (every, 4000); trigger defendWatchTr (CALL_STRUCT_ATTACKED, me, ref structure, ref baseobj); trigger defendReturnTr (every, 500 ); -trigger doResearchTr (every, 400 ); +trigger doResearchTr (CALL_RESEARCHCOMPLETED, ref research, ref structure, me); trigger vtolDefendTr (CALL_STRUCT_ATTACKED, me, ref structure, ref baseobj); trigger vtolStructsTr (every, 290); trigger buildVtolsTr (every, 360); @@ -233,6 +234,7 @@ event everySecEv; event manageDefendLocationEv; event structureDestroyed; event rebuildStructureEv; +event doResearch; /* Function prototypes */ function bool haveBeacon(int _player); @@ -279,7 +281,6 @@ function BASEOBJ chooseVtolTarget(bool bExclusiveTarget); function int getVtolTargetWeight(BASEOBJ _target); function bool vtolTargetAssigned(BASEOBJ _target); function int numBuildSameBuilding(STRUCTURESTAT _checkStat, int _x, int _y); -function void expandBase(DROID _truck); function int totalVtols(); function bool needTank(); function void setTechBranch(int _tech); @@ -435,6 +436,7 @@ event startLevel(startLevelTr) { setEventTrigger(buildFundamentals, chainloadTr); setEventTrigger(conDroids, chainloadTr); + setEventTrigger(doResearch, chainloadTr); setEventTrigger(startLevel, inactive); } @@ -952,14 +954,14 @@ event buildBase(buildBaseTr) ///////////////////////////////////////////////////////////////////// // build other stuff, grow the base slowly... event buildExpand( buildExpandTr ) -{ - expandBase(NULLOBJECT); -} - -function void expandBase(DROID _truck) { local int _numBuilders,_maxBuilders; + if (playerPower(me) < LOW_POWER) + { + exit; // do not expand base with low power + } + if(extraStruct == numExtraStructs[curTech]) // loop round { extraStruct = 0; @@ -976,27 +978,16 @@ function void expandBase(DROID _truck) _numBuilders = numBuildSameBuilding(extraStructs[curTech][extraStruct], buildX, buildY); _maxBuilders = 2; - if(_truck != NULLOBJECT) + initIterateGroup(buildGroup); // find idle droids in build group. + droid = iterateGroup(buildGroup); + while((droid != NULLOBJECT) and (_numBuilders < _maxBuilders)) { - if ((_truck.order != DORDER_BUILD) and (_truck.order != DORDER_LINEBUILD) and droidCanReach(_truck, buildX, buildY)) + if ((droid.order != DORDER_BUILD) and (droid.order != DORDER_LINEBUILD) and droidCanReach(droid, buildX, buildY)) { - orderDroidStatsLoc(_truck, DORDER_BUILD,extraStructs[curTech][extraStruct], buildX,buildY);// build it. + orderDroidStatsLoc(droid, DORDER_BUILD,extraStructs[curTech][extraStruct], buildX,buildY);// build it. _numBuilders++; } - } - else - { - initIterateGroup(buildGroup); // find idle droids in build group. droid = iterateGroup(buildGroup); - while((droid != NULLOBJECT) and (_numBuilders < _maxBuilders)) - { - if ((droid.order != DORDER_BUILD) and (droid.order != DORDER_LINEBUILD) and droidCanReach(droid, buildX, buildY)) - { - orderDroidStatsLoc(droid, DORDER_BUILD,extraStructs[curTech][extraStruct], buildX,buildY);// build it. - _numBuilders++; - } - droid = iterateGroup(buildGroup); - } } } } @@ -1407,6 +1398,10 @@ event structBuilt(structBuiltTr) } } } + else if (structure.stattype == REF_RESEARCH) + { + setEventTrigger(doResearch, chainloadTr); + } // Check if available trucks need to build more absolute necessities right away. We need a trigger here because // droids involved in building have not yet come out of their build orders. @@ -2166,6 +2161,7 @@ event doResearch(doResearchTr) structure = enumStruct(); } + setEventTrigger(doResearch, doResearchTr); } // find next available research of our research branch @@ -3854,7 +3850,7 @@ function FEATURE closestOil(int _x, int _y, bool _bAvoidThreat) _bestDist = 99999; _closestOil = NULLOBJECT; - initGetFeature(oilRes,me,me); + initGetFeature(oilRes, -1, me); _oil = getFeatureB(me); while(_oil != NULLOBJECT) {