Moves implementation of base settings into rules.js script. Handling of 'some base' option

is not the same as current, but since few play with that anyway, we can take some time to
think about what to do about that. Network sync is handled with an ugly hack for now.
master
Per Inge Mathisen 2011-12-17 14:29:19 +01:00
parent 9f47504584
commit e7aa1a7e97
3 changed files with 47 additions and 154 deletions

View File

@ -10,15 +10,6 @@ var lastHitTime = 0;
function eventGameInit() function eventGameInit()
{ {
//set up the reticule buttons
addReticuleButton(COMMAND);
addReticuleButton(CANCEL);
addReticuleButton(BUILD);
addReticuleButton(MANUFACTURE);
addReticuleButton(RESEARCH);
addReticuleButton(INTELMAP);
addReticuleButton(DESIGN);
for (var playnum = 0; playnum < maxPlayers; playnum++) for (var playnum = 0; playnum < maxPlayers; playnum++)
{ {
enableStructure("A0CommandCentre", playnum); // make structures available to build enableStructure("A0CommandCentre", playnum); // make structures available to build
@ -100,6 +91,20 @@ function eventGameInit()
{ {
completeResearch(techlist[count], playnum); completeResearch(techlist[count], playnum);
} }
// Keep only some structures for insane AI
hackNetOff();
var structs = enumStruct(playnum);
for (var i = 0; i < structs.length; i++)
{
var s = structs[i];
if (playerData[playnum].difficulty != INSANE
|| (s.stattype != WALL && s.stattype != DEFENSE && s.stattype != GATE
&& s.stattype != RESOURCE_EXTRACTOR))
{
removeStruct(s);
}
}
hackNetOn();
} }
else if (baseType == CAMP_BASE) else if (baseType == CAMP_BASE)
{ {
@ -108,6 +113,19 @@ function eventGameInit()
{ {
completeResearch(techlist[count], playnum); completeResearch(techlist[count], playnum);
} }
// Keep only some structures
hackNetOff();
var structs = enumStruct(playnum);
for (var i = 0; i < structs.length; i++)
{
var s = structs[i];
if ((playerData[playnum].difficulty != INSANE && (s.stattype == WALL || s.stattype == DEFENSE))
|| s.stattype == GATE || s.stattype == CYBORG_FACTORY || s.stattype == COMMAND_CONTROL)
{
removeStruct(s);
}
}
hackNetOn();
} }
else // CAMP_WALLS else // CAMP_WALLS
{ {

View File

@ -375,146 +375,6 @@ bool multiTemplateSetup(void)
return true; return true;
} }
// ////////////////////////////////////////////////////////////////////////////
// remove structures from map before campaign play.
static bool cleanMap(UDWORD player)
{
DROID *psD,*psD2;
STRUCTURE *psStruct;
bool firstFact,firstRes;
bMultiPlayer = false;
bMultiMessages = false;
firstFact = true;
firstRes = true;
switch(game.base)
{
case CAMP_CLEAN: //clean map
psStruct = apsStructLists[player];
while (psStruct) //strip away structures.
{
if ((psStruct->pStructureType->type != REF_WALL && psStruct->pStructureType->type != REF_WALLCORNER
&& psStruct->pStructureType->type != REF_DEFENSE && psStruct->pStructureType->type != REF_GATE
&& psStruct->pStructureType->type != REF_RESOURCE_EXTRACTOR)
|| NetPlay.players[player].difficulty != DIFFICULTY_INSANE || NetPlay.players[player].allocated)
{
removeStruct(psStruct, true);
psStruct = apsStructLists[player]; //restart,(list may have changed).
}
else
{
psStruct = psStruct->psNext;
}
}
psD = apsDroidLists[player]; // remove all but construction droids.
while(psD)
{
psD2=psD->psNext;
if (psD->droidType != DROID_CONSTRUCT && psD->droidType != DROID_CYBORG_CONSTRUCT)
{
killDroid(psD);
}
psD = psD2;
}
break;
case CAMP_BASE: //just structs, no walls
psStruct = apsStructLists[player];
while(psStruct)
{
if (((psStruct->pStructureType->type == REF_WALL || psStruct->pStructureType->type == REF_WALLCORNER
|| psStruct->pStructureType->type == REF_DEFENSE || psStruct->pStructureType->type == REF_GATE)
&& (NetPlay.players[player].difficulty != DIFFICULTY_INSANE || NetPlay.players[player].allocated))
|| psStruct->pStructureType->type == REF_BLASTDOOR
|| psStruct->pStructureType->type == REF_CYBORG_FACTORY
|| psStruct->pStructureType->type == REF_COMMAND_CONTROL)
{
removeStruct(psStruct, true);
psStruct= apsStructLists[player]; //restart,(list may have changed).
}
else if( (psStruct->pStructureType->type == REF_FACTORY)
||(psStruct->pStructureType->type == REF_RESEARCH)
||(psStruct->pStructureType->type == REF_POWER_GEN))
{
if(psStruct->pStructureType->type == REF_FACTORY )
{
if(firstFact == true)
{
firstFact = false;
removeStruct(psStruct, true);
psStruct= apsStructLists[player];
}
else // don't delete, just rejig!
{
if(((FACTORY*)psStruct->pFunctionality)->capacity != 0)
{
((FACTORY*)psStruct->pFunctionality)->capacity = 0;
((FACTORY*)psStruct->pFunctionality)->productionOutput = (UBYTE)((PRODUCTION_FUNCTION*)psStruct->pStructureType->asFuncList[0])->productionOutput;
psStruct->sDisplay.imd = psStruct->pStructureType->pIMD[0];
psStruct->body = (UWORD)(structureBody(psStruct));
}
psStruct = psStruct->psNext;
}
}
else if(psStruct->pStructureType->type == REF_RESEARCH)
{
if(firstRes == true)
{
firstRes = false;
removeStruct(psStruct, true);
psStruct= apsStructLists[player];
}
else
{
if(((RESEARCH_FACILITY*)psStruct->pFunctionality)->capacity != 0)
{ // downgrade research
((RESEARCH_FACILITY*)psStruct->pFunctionality)->capacity = 0;
((RESEARCH_FACILITY*)psStruct->pFunctionality)->researchPoints = ((RESEARCH_FUNCTION*)psStruct->pStructureType->asFuncList[0])->researchPoints;
psStruct->sDisplay.imd = psStruct->pStructureType->pIMD[0];
psStruct->body = (UWORD)(structureBody(psStruct));
}
psStruct=psStruct->psNext;
}
}
else if(psStruct->pStructureType->type == REF_POWER_GEN)
{
if(((POWER_GEN*)psStruct->pFunctionality)->capacity != 0)
{ // downgrade powergen.
((POWER_GEN*)psStruct->pFunctionality)->capacity = 0;
psStruct->sDisplay.imd = psStruct->pStructureType->pIMD[0];
psStruct->body = (UWORD)(structureBody(psStruct));
}
structurePowerUpgrade(psStruct);
psStruct=psStruct->psNext;
}
}
else
{
psStruct=psStruct->psNext;
}
}
break;
case CAMP_WALLS: //everything.
break;
default:
debug( LOG_FATAL, "Unknown Campaign Style" );
abort();
break;
}
bMultiPlayer = true;
bMultiMessages = true;
return true;
}
// //////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////
static bool gameInit(void) static bool gameInit(void)
{ {
@ -532,11 +392,6 @@ static bool gameInit(void)
return true; return true;
} }
for(player = 0;player<game.maxPlayers;player++) // clean up only to the player limit for this map..
{
cleanMap(player);
}
for (player = 1; player < MAX_PLAYERS; player++) for (player = 1; player < MAX_PLAYERS; player++)
{ {
// we want to remove disabled AI & all the other players that don't belong // we want to remove disabled AI & all the other players that don't belong

View File

@ -1015,6 +1015,22 @@ static QScriptValue js_isStructureAvailable(QScriptContext *context, QScriptEngi
&& asStructLimits[player][index].currentQuantity < asStructLimits[player][index].limit); && asStructLimits[player][index].currentQuantity < asStructLimits[player][index].limit);
} }
// FIXME - find a better way
static QScriptValue js_hackNetOff(QScriptContext *, QScriptEngine *)
{
bMultiPlayer = false;
bMultiMessages = false;
return QScriptValue();
}
// FIXME - find a better way
static QScriptValue js_hackNetOn(QScriptContext *, QScriptEngine *)
{
bMultiPlayer = true;
bMultiMessages = true;
return QScriptValue();
}
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
// Register functions with scripting system // Register functions with scripting system
@ -1024,6 +1040,10 @@ bool registerFunctions(QScriptEngine *engine)
engine->globalObject().setProperty("_", engine->newFunction(js_translate)); engine->globalObject().setProperty("_", engine->newFunction(js_translate));
engine->globalObject().setProperty("label", engine->newFunction(js_label)); engine->globalObject().setProperty("label", engine->newFunction(js_label));
// horrible hacks follow -- do not rely on these being present!
engine->globalObject().setProperty("hackNetOff", engine->newFunction(js_hackNetOff));
engine->globalObject().setProperty("hackNetOn", engine->newFunction(js_hackNetOn));
// General functions -- geared for use in AI scripts // General functions -- geared for use in AI scripts
engine->globalObject().setProperty("debug", engine->newFunction(js_debug)); engine->globalObject().setProperty("debug", engine->newFunction(js_debug));
engine->globalObject().setProperty("console", engine->newFunction(js_console)); engine->globalObject().setProperty("console", engine->newFunction(js_console));