Skip to content

Commit

Permalink
qtscript: Add new event enumSelectionChanged(objects) and new function
Browse files Browse the repository at this point in the history
enumSelected(), each giving you an array of selected game objects, which
may be empty if all objects are deselected by the player.
  • Loading branch information
perim committed Dec 30, 2012
1 parent 2bee384 commit 1072228
Show file tree
Hide file tree
Showing 10 changed files with 101 additions and 21 deletions.
28 changes: 15 additions & 13 deletions src/display.cpp
Expand Up @@ -75,6 +75,7 @@
#include "transporter.h"
#include "intorder.h"
#include "multiplay.h"
#include "qtscript.h"
#include "warzoneconfig.h"

struct _dragBox dragBox3D,wallDrag;
Expand Down Expand Up @@ -1385,8 +1386,7 @@ void startDeliveryPosition(FLAG_POSITION *psFlag)
}

//clear the selected delivery point
for (psFlagPos = apsFlagPosLists[selectedPlayer]; psFlagPos;
psFlagPos = psFlagPos->psNext)
for (psFlagPos = apsFlagPosLists[selectedPlayer]; psFlagPos; psFlagPos = psFlagPos->psNext)
{
psFlagPos->selected = false;
}
Expand Down Expand Up @@ -1434,8 +1434,7 @@ void finishDeliveryPosition()
flagPos.coords.x, flagPos.coords.y, selectedPlayer, true);
}
//deselect once moved
for (psFlagPos = apsFlagPosLists[selectedPlayer]; psFlagPos;
psFlagPos = psFlagPos->psNext)
for (psFlagPos = apsFlagPosLists[selectedPlayer]; psFlagPos; psFlagPos = psFlagPos->psNext)
{
psFlagPos->selected = false;
}
Expand Down Expand Up @@ -1660,6 +1659,7 @@ static void dealWithLMBDroid(DROID* psDroid, SELECTION_TYPE selection)
if (bMultiPlayer && !bRightClickOrders)
{
psDroid->selected = true;
triggerEventSelected();
}
else
{
Expand Down Expand Up @@ -1878,6 +1878,7 @@ static void dealWithLMBStructure(STRUCTURE* psStructure, SELECTION_TYPE selectio
}
/* Establish new one */
psStructure->selected = true;
triggerEventSelected();
}
//determine if LasSat structure has been selected
bLasSatStruct = lasSatStructSelected(psStructure);
Expand All @@ -1897,6 +1898,7 @@ static void dealWithLMBStructure(STRUCTURE* psStructure, SELECTION_TYPE selectio
}
/* Establish new one */
psStructure->selected = true;
triggerEventSelected();
}
bSensorAssigned = false;
orderSelectedObjAdd(selectedPlayer, (BASE_OBJECT*)psStructure, ctrlShiftDown());
Expand Down Expand Up @@ -2367,6 +2369,7 @@ static void dealWithRMB( void )
{
psStructure->selected = false;
intObjectSelected(NULL);
triggerEventSelected();
}
else if (!structureIsBlueprint(psStructure))
{
Expand All @@ -2389,6 +2392,7 @@ static void dealWithRMB( void )
FeedbackOrderGiven();

bLasSatStruct = lasSatStructSelected(psStructure);
triggerEventSelected();
}
}
else if (StructIsFactory(psStructure))
Expand Down Expand Up @@ -2871,39 +2875,37 @@ bool cyborgDroidSelected(UDWORD player)
}

/* Clear the selection flag for a player */
void clearSel(void)
void clearSel()
{
DROID *psCurrDroid;
STRUCTURE *psStruct;
//FEATURE *psFeat;
FLAG_POSITION *psFlagPos;

for(psCurrDroid = apsDroidLists[selectedPlayer]; psCurrDroid;
psCurrDroid = psCurrDroid->psNext)
for (psCurrDroid = apsDroidLists[selectedPlayer]; psCurrDroid; psCurrDroid = psCurrDroid->psNext)
{
psCurrDroid->selected = false;
}
for(psStruct = apsStructLists[selectedPlayer]; psStruct;
psStruct = psStruct->psNext)
for (psStruct = apsStructLists[selectedPlayer]; psStruct; psStruct = psStruct->psNext)
{
psStruct->selected = false;
}
bLasSatStruct = false;
//clear the Deliv Point if one
for (psFlagPos = apsFlagPosLists[selectedPlayer]; psFlagPos;
psFlagPos = psFlagPos->psNext)
for (psFlagPos = apsFlagPosLists[selectedPlayer]; psFlagPos; psFlagPos = psFlagPos->psNext)
{
psFlagPos->selected = false;
}

setSelectedGroup(UBYTE_MAX);
setSelectedCommander(UBYTE_MAX);
intRefreshScreen();

triggerEventSelected();
}

// Clear the selection and stop driver mode.
//
void clearSelection(void)
void clearSelection()
{
StopDriverMode(); // Cancel driver mode ( if active ).
clearSel();
Expand Down
4 changes: 2 additions & 2 deletions src/display.h
Expand Up @@ -46,9 +46,9 @@ extern void setMouseScroll(bool);
extern bool DrawnInLastFrame(SDWORD Frame);

// Clear all selections.
extern void clearSel(void);
extern void clearSel();
// Clear all selections and stop driver mode.
extern void clearSelection(void);
extern void clearSelection();
// deal with selecting a droid
extern void dealWithDroidSelect(DROID *psDroid, bool bDragBox);

Expand Down
6 changes: 2 additions & 4 deletions src/droid.cpp
Expand Up @@ -3407,9 +3407,6 @@ bool checkValidWeaponForProp(DROID_TEMPLATE *psTemplate)
return true;
}




// Select a droid and do any necessary housekeeping.
//
void SelectDroid(DROID *psDroid)
Expand All @@ -3420,15 +3417,16 @@ void SelectDroid(DROID *psDroid)
psDroid->selected = true;
intRefreshScreen();
}
triggerEventSelected();
}


// De-select a droid and do any necessary housekeeping.
//
void DeSelectDroid(DROID *psDroid)
{
psDroid->selected = false;
intRefreshScreen();
triggerEventSelected();
}

/** Callback function for stopped audio tracks
Expand Down
8 changes: 7 additions & 1 deletion src/hci.cpp
Expand Up @@ -1926,6 +1926,7 @@ static void intSelectDroid(BASE_OBJECT *psObj)
clearSelection();
((DROID *)psObj)->selected = true;
}
triggerEventSelected();
}


Expand Down Expand Up @@ -2011,6 +2012,7 @@ static void intProcessObject(UDWORD id)
widgSetButtonState(psWScreen, statButID, WBUT_CLICKLOCK);
intAddObjectStats(psObj, statButID);
}
triggerEventSelected();
}
else if (id >= IDOBJ_OBJSTART && id <= IDOBJ_OBJEND)
{
Expand Down Expand Up @@ -2039,6 +2041,7 @@ static void intProcessObject(UDWORD id)

/* Select new one */
((STRUCTURE *)psObj)->selected = true;
triggerEventSelected();
}

if (!driveModeActive())
Expand Down Expand Up @@ -2130,6 +2133,7 @@ static void intProcessObject(UDWORD id)
psCurr->selected = false;
}
psObj->selected = true;
triggerEventSelected();
}
}
}
Expand Down Expand Up @@ -5401,7 +5405,7 @@ STRUCTURE *intCheckForStructure(UDWORD structType)
psSel = psStruct;
}
}

triggerEventSelected();
return psSel;
}

Expand Down Expand Up @@ -5707,6 +5711,8 @@ STRUCTURE *intGotoNextStructureType(UDWORD structType, bool JumpTo, bool CancelD
intSetMapPos(CurrentStruct->pos.x, CurrentStruct->pos.y);
}

triggerEventSelected();

return CurrentStruct;
}

Expand Down
9 changes: 9 additions & 0 deletions src/keybind.cpp
Expand Up @@ -1143,6 +1143,7 @@ void kf_SelectGrouping( UDWORD groupNumber)
audio_QueueTrack( ID_SOUND_REPORTING );
audio_QueueTrack( ID_SOUND_RADIOCLICK_1+(rand()%6) );
}
triggerEventSelected();
}

// --------------------------------------------------------------------------
Expand Down Expand Up @@ -1850,7 +1851,9 @@ STRUCTURE *psCurr;
{
setKeyButtonMapping(IDRET_MANUFACTURE);
}
triggerEventSelected();
}

// --------------------------------------------------------------------------
void kf_SelectNextResearch(void)
{
Expand All @@ -1859,12 +1862,16 @@ void kf_SelectNextResearch(void)
{
setKeyButtonMapping(IDRET_RESEARCH);
}
triggerEventSelected();
}

// --------------------------------------------------------------------------
void kf_SelectNextPowerStation(void)
{
selNextSpecifiedBuilding(REF_POWER_GEN);
triggerEventSelected();
}

// --------------------------------------------------------------------------
void kf_SelectNextCyborgFactory(void)
{
Expand All @@ -1887,7 +1894,9 @@ STRUCTURE *psCurr;
{
setKeyButtonMapping(IDRET_MANUFACTURE);
}
triggerEventSelected();
}

// --------------------------------------------------------------------------


Expand Down
31 changes: 31 additions & 0 deletions src/qtscript.cpp
Expand Up @@ -47,6 +47,10 @@

#define ATTACK_THROTTLE 100

/// selection changes are too often and too erratic to trigger immediately,
/// so until we have a queue system for events, delay triggering this way.
static bool selectionChanged = false;

enum timerType
{
TIMER_REPEAT, TIMER_ONESHOT_READY, TIMER_ONESHOT_DONE
Expand Down Expand Up @@ -309,6 +313,19 @@ bool shutdownScripts()

bool updateScripts()
{
// Call delayed triggers here
if (selectionChanged)
{
for (int i = 0; i < scripts.size(); ++i)
{
QScriptEngine *engine = scripts.at(i);
QScriptValueList args;
args += js_enumSelected(NULL, engine);
callFunction(engine, "eventSelectionChanged", args);
}
selectionChanged = false;
}

// Update gameTime
for (int i = 0; i < scripts.size(); ++i)
{
Expand Down Expand Up @@ -939,6 +956,20 @@ bool triggerEventBeaconRemoved(int from, int to)
return true;
}

//__ \subsection{eventSelectionChanged(objects)}
//__ An event that is triggered whenever the host player selects one or more game objects.
//__ The \emph{objects} parameter contains an array of the currently selected game objects.
//__ Keep in mind that the player may drag and drop select many units at once, select one
//__ unit specifically, or even add more selections to a current selection one at a time.
//__ This event will trigger once for each user action, not once for each selected or
//__ deselected object. If all selected game objects are deselected, \emph{objects} will
//__ be empty.
bool triggerEventSelected()
{
selectionChanged = true;
return true;
}

//__ \subsection{eventGroupLoss(object, group id, new size)}
//__ An event that is run whenever a group becomes empty. Input parameter
//__ is the about to be killed object, the group's id, and the new group size.
Expand Down
1 change: 1 addition & 0 deletions src/qtscript.h
Expand Up @@ -99,5 +99,6 @@ bool triggerEventCheatMode(bool entered);
bool triggerEventGroupLoss(BASE_OBJECT *psObj, int group, int size, QScriptEngine *engine);
bool triggerEventDroidMoved(DROID *psDroid, int oldx, int oldy);
bool triggerEventArea(QString label, DROID *psDroid);
bool triggerEventSelected();

#endif
29 changes: 29 additions & 0 deletions src/qtscriptfuncs.cpp
Expand Up @@ -847,6 +847,34 @@ static QScriptValue js_enumBlips(QScriptContext *context, QScriptEngine *engine)
return result;
}

//-- \subsection{enumSelected()}
//-- Return an array containing all game objects currently selected by the host player.
QScriptValue js_enumSelected(QScriptContext *, QScriptEngine *engine)
{
QList<BASE_OBJECT *> matches;
for (DROID *psDroid = apsDroidLists[selectedPlayer]; psDroid; psDroid = psDroid->psNext)
{
if (psDroid->selected)
{
matches.push_back(psDroid);
}
}
for (STRUCTURE *psStruct = apsStructLists[selectedPlayer]; psStruct; psStruct = psStruct->psNext)
{
if (psStruct->selected)
{
matches.push_back(psStruct);
}
}
// TODO - also add selected delivery points
QScriptValue result = engine->newArray(matches.size());
for (int i = 0; i < matches.size(); i++)
{
result.setProperty(i, convMax(matches.at(i), engine));
}
return result;
}

//-- \subsection{enumGateways()}
//-- Return an array containing all the gateways on the current map. The array contains object with the properties
//-- x1, y1, x2 and y2.
Expand Down Expand Up @@ -3544,6 +3572,7 @@ bool registerFunctions(QScriptEngine *engine, QString scriptName)
engine->globalObject().setProperty("enumGroup", engine->newFunction(js_enumGroup));
engine->globalObject().setProperty("enumFeature", engine->newFunction(js_enumFeature));
engine->globalObject().setProperty("enumBlips", engine->newFunction(js_enumBlips));
engine->globalObject().setProperty("enumSelected", engine->newFunction(js_enumSelected));
engine->globalObject().setProperty("enumResearch", engine->newFunction(js_enumResearch));
engine->globalObject().setProperty("enumRange", engine->newFunction(js_enumRange));
engine->globalObject().setProperty("enumArea", engine->newFunction(js_enumArea));
Expand Down
3 changes: 3 additions & 0 deletions src/qtscriptfuncs.h
Expand Up @@ -60,6 +60,9 @@ QScriptValue convMax(BASE_OBJECT *psObj, QScriptEngine *engine);
QScriptValue convResearch(RESEARCH *psResearch, QScriptEngine *engine, int player);
BASE_OBJECT *IdToObject(OBJECT_TYPE type, int id, int player);

// Script functions useful also in qtscript.cpp
QScriptValue js_enumSelected(QScriptContext *, QScriptEngine *engine);

/// Assert for scripts that give useful backtraces and other info.
#define SCRIPT_ASSERT(context, expr, ...) \
do { bool _wzeval = (expr); \
Expand Down
3 changes: 2 additions & 1 deletion src/selection.cpp
Expand Up @@ -42,7 +42,7 @@
#include "display3d.h"
#include "warcam.h"
#include "display.h"

#include "qtscript.h"

// ---------------------------------------------------------------------
// Selects all units owned by the player - onscreen toggle.
Expand Down Expand Up @@ -543,6 +543,7 @@ void selNextSpecifiedBuilding(STRUCTURE_TYPE structType)
psOldStruct->selected = false;
}
psResult->selected = true;
triggerEventSelected();
}
else
{
Expand Down

0 comments on commit 1072228

Please sign in to comment.