Skip to content

Commit

Permalink
Merge branch 'bugfixes' into 3.1
Browse files Browse the repository at this point in the history
  • Loading branch information
automerge authored and cybersphinx committed Sep 21, 2012
2 parents 69c4474 + 4f85a5e commit efb9ebc
Show file tree
Hide file tree
Showing 9 changed files with 65 additions and 35 deletions.
2 changes: 1 addition & 1 deletion doc/warzone2100.6.asciidoc
Expand Up @@ -10,7 +10,7 @@ SYNOPSIS
--------
*warzone2100* ['OPTIONS']

DESCIPTION
DESCRIPTION
----------

This manual page documents briefly the warzone2100 command.
Expand Down
12 changes: 2 additions & 10 deletions src/display.cpp
Expand Up @@ -2607,17 +2607,9 @@ STRUCTURE *psStructure;
}
// If this building is a factory/power generator/research facility
// which isn't upgraded. Make the build icon available.
else if(((psStructure->pStructureType->type == REF_FACTORY
|| psStructure->pStructureType->type == REF_VTOL_FACTORY)
&& psStructure->pFunctionality->factory.capacity < NUM_FACTORY_MODULES)

|| (psStructure->pStructureType->type == REF_POWER_GEN
&& psStructure->pFunctionality->powerGenerator.capacity < NUM_POWER_MODULES)

|| (psStructure->pStructureType->type == REF_RESEARCH
&& psStructure->pFunctionality->researchFacility.capacity < NUM_RESEARCH_MODULES))
else if (nextModuleToBuild(psStructure, -1) > 0)
{
retVal = MT_OWNSTRINCOMP;
retVal = MT_OWNSTRINCOMP;
}
else
{
Expand Down
3 changes: 1 addition & 2 deletions src/effects.cpp
Expand Up @@ -1092,7 +1092,6 @@ static void updateGraviton(EFFECT *psEffect)
{
float accel;
Vector3i dv;
UDWORD groundHeight;
MAPTILE *psTile;
LIGHT light;

Expand Down Expand Up @@ -1125,7 +1124,7 @@ static void updateGraviton(EFFECT *psEffect)
return;
}

groundHeight = map_Height(psEffect->position.x, psEffect->position.z);
int groundHeight = map_Height(psEffect->position.x, psEffect->position.z);

/* If it's going up and it's still under the landscape, then remove it... */
if (psEffect->position.y<groundHeight
Expand Down
1 change: 1 addition & 0 deletions src/intorder.cpp
Expand Up @@ -1000,6 +1000,7 @@ void intRunOrder(void)
//
static bool SetSecondaryState(SECONDARY_ORDER sec, unsigned State)
{
// This code is similar to kfsf_SetSelectedDroidsState() in keybind.cpp. Unfortunately, it seems hard to un-duplicate the code.
for (unsigned i = 0; i < SelectedDroids.size(); ++i)
{
if (SelectedDroids[i])
Expand Down
4 changes: 3 additions & 1 deletion src/keybind.cpp
Expand Up @@ -2479,9 +2479,11 @@ static void kfsf_SetSelectedDroidsState( SECONDARY_ORDER sec, SECONDARY_STATE st
// This is a function to set unit orders via keyboard shortcuts. It should
// _not_ be disallowed in multiplayer games.

// This code is similar to SetSecondaryState() in intorder.cpp. Unfortunately, it seems hard to un-duplicate the code.
for(psDroid = apsDroidLists[selectedPlayer]; psDroid; psDroid = psDroid->psNext)
{
if(psDroid->selected)
// Only set the state if it's not a transporter.
if (psDroid->selected && psDroid->droidType != DROID_TRANSPORTER && psDroid->droidType != DROID_SUPERTRANSPORTER)
{
secondarySetState(psDroid,sec,state);
}
Expand Down
2 changes: 1 addition & 1 deletion src/multiint.cpp
Expand Up @@ -1449,12 +1449,12 @@ static void addGameOptions()
IMAGE_EDIT_GAME_HI, MULTIOP_GNAME_ICON);
// disable for one-player skirmish
widgSetButtonState(psWScreen, MULTIOP_GNAME, WEDBS_DISABLE);
widgSetButtonState(psWScreen, MULTIOP_GNAME_ICON, WBUT_DISABLE);
}
else
{
addMultiEditBox(MULTIOP_OPTIONS, MULTIOP_GNAME, MCOL0, MROW2, _("Select Game Name"), game.name, IMAGE_EDIT_GAME, IMAGE_EDIT_GAME_HI, MULTIOP_GNAME_ICON);
}
widgSetButtonState(psWScreen, MULTIOP_GNAME_ICON, WBUT_DISABLE);
// map chooser
addMultiEditBox(MULTIOP_OPTIONS, MULTIOP_MAP , MCOL0, MROW3, _("Select Map"), game.map, IMAGE_EDIT_MAP, IMAGE_EDIT_MAP_HI, MULTIOP_MAP_ICON);
// disable for challenges
Expand Down
36 changes: 29 additions & 7 deletions src/order.cpp
Expand Up @@ -1570,6 +1570,12 @@ void orderDroidBase(DROID *psDroid, DROID_ORDER_DATA *psOrder)
actionDroid(psDroid, DACTION_OBSERVE, psOrder->psObj);
break;
case DORDER_FIRESUPPORT:
if (psDroid->droidType == DROID_TRANSPORTER || psDroid->droidType == DROID_SUPERTRANSPORTER)
{
debug(LOG_ERROR, "Sorry, transports cannot be assigned to commanders.");
psDroid->order = DroidOrder(DORDER_NONE);
break;
}
if (psDroid->asWeaps[0].nStat == 0)
{
break;
Expand All @@ -1587,6 +1593,12 @@ void orderDroidBase(DROID *psDroid, DROID_ORDER_DATA *psOrder)
}
break;
case DORDER_COMMANDERSUPPORT:
if (psDroid->droidType == DROID_TRANSPORTER || psDroid->droidType == DROID_SUPERTRANSPORTER)
{
debug(LOG_ERROR, "Sorry, transports cannot be assigned to commanders.");
psDroid->order = DroidOrder(DORDER_NONE);
break;
}
cmdDroidAddDroid((DROID *)psOrder->psObj, psDroid);
break;
case DORDER_RETREAT:
Expand Down Expand Up @@ -1747,11 +1759,21 @@ void orderDroidBase(DROID *psDroid, DROID_ORDER_DATA *psOrder)
}
break;
case DORDER_EMBARK:
{
DROID *embarkee = castDroid(psOrder->psObj);
if (psDroid->droidType == DROID_TRANSPORTER || psDroid->droidType == DROID_SUPERTRANSPORTER // Embarker must not be transporter.
|| embarkee == NULL || !(embarkee->droidType == DROID_TRANSPORTER || embarkee->droidType == DROID_SUPERTRANSPORTER)) // Embarkee must be a transporter.
{
debug(LOG_ERROR, "Sorry, can only load things that aren't transporters into things that are.");
psDroid->order = DroidOrder(DORDER_NONE);
break;
}
// move the droid to the transporter location
psDroid->order = *psOrder;
psDroid->order.pos = removeZ(psOrder->psObj->pos);
actionDroid(psDroid, DACTION_MOVE, psOrder->psObj->pos.x, psOrder->psObj->pos.y);
break;
}
case DORDER_DISEMBARK:
//only valid in multiPlayer mode
if (bMultiPlayer)
Expand Down Expand Up @@ -2578,19 +2600,19 @@ DroidOrder chooseOrderObj(DROID *psDroid, BASE_OBJECT *psObj, bool altOrder)

if (altOrder && (psObj->type == OBJ_DROID || psObj->type == OBJ_STRUCTURE) && psDroid->player == psObj->player)
{
if ((psDroid->droidType == DROID_WEAPON) || cyborgDroid(psDroid) ||
(psDroid->droidType == DROID_COMMAND))
{
return DroidOrder(DORDER_ATTACK, psObj);
}
else if (psDroid->droidType == DROID_SENSOR)
if (psDroid->droidType == DROID_SENSOR)
{
return DroidOrder(DORDER_OBSERVE, psObj);
}
else if ((psDroid->droidType == DROID_REPAIR ||
psDroid->droidType == DROID_CYBORG_REPAIR) && psObj->type == OBJ_DROID)
{
return DroidOrder(DORDER_REPAIR, psObj);
return DroidOrder(DORDER_DROIDREPAIR, psObj);
}
else if ((psDroid->droidType == DROID_WEAPON) || cyborgDroid(psDroid) ||
(psDroid->droidType == DROID_COMMAND))
{
return DroidOrder(DORDER_ATTACK, psObj);
}
}
//check for transporters first
Expand Down
2 changes: 1 addition & 1 deletion src/selection.cpp
Expand Up @@ -115,7 +115,7 @@ static unsigned int selSelectAllSameDroid(unsigned int player, DROID_TYPE droidT
if (!bOnScreen || droidOnScreen(psDroid, 0))
{
/* Same as the droid type asked for*/
if (psDroid->droidType == droidType)
if (psDroid->droidType == droidType || (droidType == DROID_TRANSPORTER && psDroid->droidType == DROID_SUPERTRANSPORTER))
{
SelectDroid(psDroid);
count++;
Expand Down
38 changes: 26 additions & 12 deletions src/structure.cpp
Expand Up @@ -2109,7 +2109,8 @@ void assignFactoryCommandDroid(STRUCTURE *psStruct, DROID *psCommander)
}

psFact->psCommander = NULL;
syncDebug("Removed commander from factory %d", psStruct->id);
// TODO: Synchronise .psCommander.
//syncDebug("Removed commander from factory %d", psStruct->id);
if (!missionIsOffworld())
{
addFlagPosition(psFact->psAssemblyPoint); // add the assembly point back into the list
Expand Down Expand Up @@ -2441,18 +2442,29 @@ static bool structPlaceDroid(STRUCTURE *psStructure, DROID_TEMPLATE *psTempl,
assignCommander = true;
}

if ( psFact->psCommander != NULL )
bool isTransporter = psNewDroid->droidType == DROID_TRANSPORTER || psNewDroid->droidType == DROID_SUPERTRANSPORTER;
if (isVtolDroid(psNewDroid) && !isTransporter)
{
syncDebug("Has commander.");
if (idfDroid(psNewDroid) ||
moveToRearm(psNewDroid);
}
if (psFact->psCommander != NULL && myResponsibility(psStructure->player))
{
// TODO: Should synchronise .psCommander in all cases.
//syncDebug("Has commander.");
if (isTransporter)
{
// Transporters can't be assigned to commanders, due to abuse of .psGroup. Try to land on the commander instead. Hopefully the transport is heavy enough to crush the commander.
orderDroidLoc(psNewDroid, DORDER_MOVE, psFact->psCommander->pos.x, psFact->psCommander->pos.y, ModeQueue);
}
else if (idfDroid(psNewDroid) ||
isVtolDroid(psNewDroid))
{
orderDroidObj(psNewDroid, DORDER_FIRESUPPORT, psFact->psCommander, ModeImmediate);
moveToRearm(psNewDroid);
orderDroidObj(psNewDroid, DORDER_FIRESUPPORT, psFact->psCommander, ModeQueue);
//moveToRearm(psNewDroid);
}
else
{
orderDroidObj(psNewDroid, DORDER_COMMANDERSUPPORT, psFact->psCommander, ModeImmediate);
orderDroidObj(psNewDroid, DORDER_COMMANDERSUPPORT, psFact->psCommander, ModeQueue);
}
}
else
Expand All @@ -2469,10 +2481,6 @@ static bool structPlaceDroid(STRUCTURE *psStructure, DROID_TEMPLATE *psTempl,
}
//if vtol droid - send it to ReArm Pad if one exists
placed = false;
if (isVtolDroid(psNewDroid) && (psNewDroid->droidType != DROID_TRANSPORTER && psNewDroid->droidType != DROID_SUPERTRANSPORTER))
{
moveToRearm(psNewDroid);
}
if (!placed)
{
//find flag in question.
Expand Down Expand Up @@ -2517,13 +2525,19 @@ static bool structPlaceDroid(STRUCTURE *psStructure, DROID_TEMPLATE *psTempl,

static bool IsFactoryCommanderGroupFull(const FACTORY* psFactory)
{
if (bMultiPlayer)
{
// TODO: Synchronise .psCommander. Have to return false here, to avoid desynch.
return false;
}

unsigned int DroidsInGroup;

// If we don't have a commander return false (group not full)
if (psFactory->psCommander==NULL) return false;

// allow any number of IDF droids
if (templateIsIDF((DROID_TEMPLATE *)psFactory->psSubject))
if (templateIsIDF(psFactory->psSubject) || asPropulsionStats[psFactory->psSubject->asParts[COMP_PROPULSION]].propulsionType == PROPULSION_TYPE_LIFT)
{
return false;
}
Expand Down

0 comments on commit efb9ebc

Please sign in to comment.