Editing MG/Lua
Jump to navigation
Jump to search
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
− | + | '''Glest versions 3.2.0 and newer includes lua scripting functionality for scripted scenarios.''' | |
− | + | The game includes 2 tutorial scenarios and one scripted normal scenario(storming) now. These demo scenarios show a bit what's possible now. Have a look at them if you want to learn it. | |
− | == | + | == Useful Links == |
− | === | + | *Omega's tutorial: [http://glest.org/glest_board/index.php?topic=3841.0 tutorial]. |
− | + | *[http://www.lua.org/pil/ Programming in Lua] | |
+ | *[http://lua-users.org/wiki/TutorialDirectory lua tutorials] | ||
+ | *[http://lua-users.org/wiki Lua-Users.org Wiki] | ||
+ | == Lua/XML Intermixture Problem == | ||
+ | Due to XML's nature of using angle brackets for elements the parser will get confused and give an error if you try to use the left angle bracket in the scenario's XML file. | ||
− | + | A solution is to either swap the logic: | |
− | |||
− | |||
− | == | + | ie. if you wanted,<br />a <= b<br />you would have to do,<br />b >= a |
− | |||
− | + | Or use an external lua file as mentioned in the next section. | |
− | |||
− | == | + | == Loading a Lua File == |
− | + | To run Lua code in an external file you use the dofile function and provide the file path from the executable. | |
− | + | Example: | |
− | |||
− | + | dofile("gae_scenarios/Tutorials/basic_tutorial/startup.lua") | |
− | |||
− | + | == Language System == | |
− | + | Each scenario is stored in its own folder. In this folder should be an xml file of the same name as the folder with xml as the extension. Glest also looks for a lng file (scenario_name_english.lng as default) to allow for translations of text. | |
− | === | + | === Example === |
− | + | In advanced_tutorial.xml is :<br />showMessage('MagicBrief', 'GlestAdvancedTutorial') | |
− | + | In advanced_tutorial_english.lng is :<br />MagicBrief=You are in command of the Magic faction, which uses mages and summoned creatures to fight. | |
− | + | == Coordinates == | |
− | + | Coordinates are specified as an array of two elements, the 'x' coordinate in the first element, and the 'y' coordinate in the second. | |
− | + | The origin {0,0} is at the 'top left' (or north-west if you like) of the screen. A map's size is defined in 'Tiles', each of which is a block of 2x2 Cells. For technical reasons the last row & column of Tiles are not valid. So a 64 * 64 map is (64-1)*2 = 126 Cells wide and high. The co-ordinates you supply in LUA are Cell coordinates, not Tile coordinates, and are 'zero indexed' (the first one is 0, the last is NumCells - 1). | |
− | |||
− | + | eg. A 128 x 128 Map has 254 x 254 Cells. The northwest corner is {0,0} and the southeast corner is {253,253}. | |
− | |||
− | |||
− | = | + | When a function returns a 'Vec2i' you can access the individual co-ordinates by sub-scripting the array, |
− | + | myPos = someFunction () | |
+ | x = myPos[1] | ||
+ | y = myPos[2] | ||
+ | When ever there is a parameter requiring positions of type Vec2i you can use the format '''{x,y}''' (where x and y are number values within the required range, as defined above) to select a position on the map. | ||
+ | someFunction ( {x,y} ) | ||
+ | Here 'x' and 'y' could be numbers, variables, or 'expressions'. | ||
− | + | You can also pass a 'pre created' array to these functions, which may be useful for scripting advanced scenarios. | |
− | |||
− | |||
− | + | == Faction Index and Players == | |
− | === | + | You need to specify the players like: |
− | + | <players> | |
+ | <player control="human" faction="tech" team="1"/> | ||
+ | <player control="cpu" faction="magic" team="2"/> | ||
+ | <player control="closed"/> | ||
+ | <player control="closed"/> | ||
+ | </players> | ||
+ | The first player's factionIndex is 0. The second player's factionIndex is 1 and so on. There must be exactly 4 player tags. | ||
− | |||
− | |||
− | + | == Commands == | |
− | |||
− | |||
− | |||
− | + | WARNING: All of these functions return type void and''' '''should''' not''' be used as arguments for other functions. | |
− | + | === showMessage ( text, header ) === | |
− | ''' | + | Displays a message box on the screen, that will have to be dismissed by the player. |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | === | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | Parameters:<br /> | + | Parameters:<br />'''text''' - a string identifying the'' text'' from a language file<br />'''header''' - a string identifying the'' title bar text ''from a language file |
− | ''' | ||
− | ''' | ||
− | === | + | === setDisplayText ( text ) === |
− | |||
− | |||
− | |||
− | + | Displays a message at the top of the 'playing area'. Will remain until dismissed with clearDisplayText() or setDisplayText() is called again. | |
− | |||
− | Parameters:<br /> | + | Parameters:<br />'''text''' - a string identifying the'' text'' from a language file |
− | ''' | ||
− | ''' | ||
− | |||
− | |||
− | === | + | === clearDisplayText () === |
− | + | Clears the message from the top of the playing area, previously set with setDisplayText(). | |
− | + | === setCameraPosition ( pos ) === | |
− | |||
− | |||
− | |||
− | |||
− | === setCameraPosition(pos) === | ||
Move the camera to the coordinates of pos. | Move the camera to the coordinates of pos. | ||
− | Parameters:<br /> | + | Parameters:<br />'''pos''' - an array of two elements, specifying the co-ordinates {x,y} |
− | '''pos''' - an array of two elements, specifying the co-ordinates {x,y} | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | === createUnit ( unit, faction, pos ) === | |
− | ''' | + | Spawns a unit. If pos is occupied a nearby cell will be chosen. The game attempts to keep a 2 cell 'border' between the new unit and other units or objects (ie. trees). '''Warning''': If a position can not be found, the game crashes. |
− | + | Parameters:<br />'''unit''' - name of a unit in the loaded factions.<br />'''faction''' - the index of the faction this unit will belong to.<br />'''pos''' - an array of two elements, specifying the co-ordinates {x,y} | |
− | |||
− | === | + | === giveResource ( resource, faction, amount ) === |
− | + | Give an amount of a specified resource to a player, negative values are valid and have the obvious effect.<br />Parameters:<br />'''resource''' - a corresponding resource in the tech tree<br />'''faction''' - the index of the faction to give the resource<br />'''amount''' - the amount of resource the faction will receive | |
− | + | === givePositionCommand ( unitId, command, pos ) === | |
− | ''' | + | Instruct a unit to carry out a command of type 'attack' or 'move'. |
− | |||
− | + | Parameters:<br />'''unitId''' - the id of a unit that has an attack and/or move command.<br />'''command''' - the type of command to carry out ('attack' or 'move')<br />'''pos''' - an array of two elements, specifying the co-ordinates {x,y} | |
− | |||
− | + | === giveProductionCommand ( unitId, produced ) === | |
− | |||
− | + | Instruct a unit to carry out a command of type 'produce'. | |
− | |||
− | === | + | Parameters:<br />'''unitId''' - the id of a unit that is to produce the new unit.<br />'''produced''' - the type of unit to create. (ie. "worker") |
− | + | === giveUpgradeCommand ( unitId, upgrade ) === | |
− | + | Instruct a unit to carry out a command of type 'upgrade'. | |
− | |||
− | + | Parameters:<br />'''unitId''' - the id of the unit to perform the upgrade.<br />'''upgrade '''- the type of upgrade to perform. (ie. "hell_gate") | |
− | |||
− | === | + | === setPlayerAsWinner ( faction ) === |
− | |||
− | |||
− | + | Sets the player with index 'faction' as the winner, would typically be followed by endGame(). | |
− | '' | ||
− | |||
− | + | Parameters:<br />'''faction '''- the index of the faction [0-3, Player1=0] | |
− | + | === endGame () === | |
− | ''''' | ||
− | + | End the scenario, usually would be called after setPlayerAsWinner() when victory conditions have been met. | |
− | '' | + | ===DisplayFormattedText (const char *fmt,...)=== |
− | + | Displays a message at the top of the 'playing area'. Will remain until dismissed with clearDisplayText() or setDisplayText() is called again. | |
− | |||
− | |||
− | + | Parameters: | |
− | ===enableAi(faction)=== | + | '''fmt''' - a string identifying the'' format of text (like in printf)'' |
+ | '''...''' - variable parameter list to pass values to fmt ''(like in printf)'' | ||
+ | ===enableAi ( int faction )=== | ||
Enables a factions AI. All of the faction's units will move with this command. | Enables a factions AI. All of the faction's units will move with this command. | ||
− | Parameters: | + | Parameters: |
− | '''faction '''- the index of the faction | + | '''faction '''- the index of the faction [0-7, Player1=0] |
− | + | ===disableAi ( int faction )=== | |
− | ===disableAi(faction)=== | ||
Disables a factions AI. None of the faction's units will move with this command. | Disables a factions AI. None of the faction's units will move with this command. | ||
− | Parameters: | + | Parameters: |
− | '''faction '''- the index of the faction | + | '''faction '''- the index of the faction [0-7, Player1=0] |
− | + | ===bool getAiEnabled ( int faction )=== | |
− | ===getAiEnabled(faction)=== | + | Checks the enabled status of a factions AI. |
− | Checks the enabled status of a factions AI | ||
− | |||
− | |||
− | |||
− | ===enableConsume(faction)=== | + | Parameters: |
+ | '''faction '''- the index of the faction [0-7, Player1=0] | ||
+ | ===enableConsume ( int faction )=== | ||
Enables a factions requirement to consume resources like food. All of the faction's units will consume food type resources with this command. | Enables a factions requirement to consume resources like food. All of the faction's units will consume food type resources with this command. | ||
− | Parameters: | + | Parameters: |
− | '''faction '''- the index of the faction | + | '''faction '''- the index of the faction [0-7, Player1=0] |
− | + | ===disableConsume ( int faction )=== | |
− | ===disableConsume(faction)=== | ||
Disbles a factions requirement to consume resources like food. All of the faction's units will not consume food type resources with this command. | Disbles a factions requirement to consume resources like food. All of the faction's units will not consume food type resources with this command. | ||
− | Parameters: | + | Parameters: |
− | '''faction '''- the index of the faction. | + | '''faction '''- the index of the faction [0-7, Player1=0] |
+ | ===bool getConsumeEnabled ( int faction )=== | ||
+ | Checks the consume status of a factions AI. | ||
− | === | + | Parameters: |
− | + | '''faction '''- the index of the faction [0-7, Player1=0] | |
+ | ===giveAttackCommand ( unitId, unitToAttackId )=== | ||
+ | Instruct a unit to carry out a command of type 'attack' on a specific unit. | ||
− | Parameters: | + | Parameters: |
− | ''' | + | '''unitId''' - the id of a unit that has an attack and/or move command. |
+ | '''unitId''' - the id of a unit that should be attacked. | ||
+ | ===int registerCellTriggerEventForUnitToUnit ( sourceUnitId, destUnitId )=== | ||
+ | Register a cell 'trigger' event. Any time sourceUnit comes next to destUnit the eventID returned by this function will be triggered | ||
− | + | inside an event called '<cellTriggerEvent>' | |
− | |||
− | |||
− | Parameters: | + | Parameters: |
− | ''' | + | '''sourceUnitId''' - the id of a unit moves next to destUnit. |
+ | '''destUnitId''' - the id of a unit that source moves next to. | ||
− | === | + | example: |
− | + | <startup> | |
− | + | ||
− | + | unitA = 'guard' | |
− | + | unitB = 'castle' | |
+ | |||
+ | |||
+ | createUnit(unitB, 1, startLocation(2)) | ||
+ | castleUnit= lastCreatedUnit() | ||
+ | createUnit(unitA, 0, startLocation(2)) | ||
+ | guard= lastCreatedUnit() | ||
+ | |||
+ | cell_event1 = registerCellTriggerEventForUnitToUnit(guard,castleUnit) | ||
+ | |||
+ | </startup> | ||
+ | <cellTriggerEvent> | ||
+ | if triggeredCellEventId() == cell_event1 then | ||
+ | clearDisplayText() | ||
+ | DisplayFormattedText('You captured the FLAG!') | ||
+ | unregisterCellTriggerEvent(cell_event1) | ||
+ | end | ||
+ | </cellTriggerEvent> | ||
− | === | + | ===int registerCellTriggerEventForUnitToLocation ( sourceUnitId, Vec2i pos )=== |
− | + | Register a cell 'trigger' event. Any time sourceUnit comes into the cell co-ordinates specified by pos, the | |
− | + | event called '<cellTriggerEvent>' is triggered using the eventid returned by this function | |
− | |||
− | === | + | Parameters: |
− | + | '''sourceUnitId''' - the id of a unit moves next to destUnit. | |
+ | '''Vec2i pos''' - the x and y cell co-ordinates that will trigger the event when sourceUnitID enters the cell | ||
+ | ===int registerCellTriggerEventForFactionToUnit ( sourceFactionId, destUnitId )=== | ||
+ | Register a cell 'trigger' event. Any time a unit from sourceFaction comes next to destUnit the eventID returned by this function will be triggered | ||
− | + | inside an event called '<cellTriggerEvent>' | |
− | |||
− | |||
− | Parameters: | + | Parameters: |
− | ''' | + | '''sourceFactionId''' - the id of a faction who has at least one unit that moves next to destUnit. |
− | ''' | + | '''destUnitId''' - the id of a unit that source moves next to. |
− | + | ===int registerCellTriggerEventForFactionToLocation ( sourceFactionId,Vec2i pos)=== | |
− | + | Register a cell 'trigger' event. Any time a unit from sourceFaction comes into the cell co-ordinates specified by pos, the | |
− | |||
− | |||
− | |||
− | + | event called '<cellTriggerEvent>' is triggered using the eventid returned by this function | |
− | |||
− | |||
− | |||
− | + | Parameters: | |
− | + | '''sourceFactionId''' - the id of a faction who has at least one unit that moves next to destUnit. | |
− | + | '''Vec2i pos''' - the x and y cell co-ordinates that will trigger the event when a unit from sourceFactionID enters the cell | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | === | + | ===int getCellTriggerEventCount ( eventId)=== |
− | + | Returns the number of times the event specified by eventId has been triggered. | |
− | Parameters: | + | Parameters: |
− | |||
− | |||
− | + | '''eventId''' - the id of a previously registered event | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | ===unregisterCellTriggerEvent (eventId)=== | |
− | + | Unregister the event specified by eventId. | |
− | |||
− | + | Parameters: | |
− | |||
− | + | '''eventId''' - the id of a previously registered event | |
− | ''' | ||
+ | ===int startTimerEvent ()=== | ||
+ | Registers a timer and returns its unqiue Id, which can later be compared within a '<timerTriggerEvent>' event. | ||
− | + | example: | |
− | + | <timerTriggerEvent> | |
− | + | ||
− | + | if triggeredTimerEventId() == timer_event1 then | |
− | < | + | if timerEventSecondsElapsed(triggeredTimerEventId()) >= captureTheFlagSeconds then |
− | + | clearDisplayText() | |
− | + | DisplayFormattedText('Your time ran out of time to capture the FLAG!') | |
− | + | stopTimerEvent(timer_event1) | |
− | + | unregisterCellTriggerEvent(cell_event1) | |
− | + | end | |
− | |||
− | |||
− | |||
end | end | ||
− | + | ||
− | </ | + | </timerTriggerEvent> |
− | === | + | ===int resetTimerEvent ( eventId)=== |
− | + | Reset the timer specified by eventId. This function also returns the number of seconds elapsed since the timer started. | |
− | + | Parameters: | |
− | |||
− | + | '''eventId''' - the id of a previously registered timer | |
− | |||
− | === | + | ===int stopTimerEvent ( eventId)=== |
− | + | Stop the timer specified by eventId. This function also returns the number of seconds elapsed since the timer started.<br /> | |
− | + | Parameters: | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | '''eventId''' - the id of a previously registered timer | |
− | |||
− | + | ===int timerEventSecondsElapsed ( eventId)=== | |
− | + | This function returns the number of seconds elapsed since the timer started. | |
− | |||
− | === | ||
− | |||
− | |||
− | |||
− | |||
− | Parameters: | + | Parameters: |
− | |||
− | === | + | '''eventId''' - the id of a previously registered timer |
− | + | ===int triggeredCellEventId ()=== | |
+ | This function returns the eventId that is currently triggering a '<cellTriggerEvent>' | ||
− | + | ===int triggeredTimerEventId ()=== | |
− | + | This function returns the eventId that is currently triggering a '<timerTriggerEvent>' | |
− | < | ||
− | |||
− | + | == Queries == | |
− | + | These function return useful information that can be used in command functions. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | === | + | === Vec2i startLocation ( faction ) === |
− | + | Returns the start location for a given faction. | |
− | + | Parameters: | |
− | + | '''faction '''- the index of the faction [0-3, Player1=0] | |
Example: | Example: | ||
− | + | createUnit ( "someunit", 0, {startLocation(0)[1] + 5, startLocation(0)[2]} ) | |
− | + | This would create a unit 5 cells east of startLocation 0. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | === | + | === Vec2i unitPosition ( unitId ) === |
− | |||
− | + | Returns the current location of a given unit. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Parameters: | |
− | |||
− | |||
− | + | '''unitId - '''the unitId of the unit whose position you wish to know. | |
− | ''' | ||
Example: | Example: | ||
− | + | if ( unitPosition(myUnit)[1] > 47 and 75 > unitPosition(myUnit)[1] | |
− | if (unitPosition(myUnit)[1] | + | |
− | + | and unitPostion(myUnit)[2] > 95 ) then | |
− | end | + | |
− | + | -- The unit's x co-ord is between 47 and 75, and its y cord is larger than 95. | |
+ | |||
+ | -- trigger some action here ? | ||
+ | |||
+ | end | ||
− | === unitFaction( | + | === int unitFaction ( unitId )=== |
− | Returns the faction index of the unit with | + | Returns the faction '''index''' of the unit with unitId. |
− | + | === int resourceAmount ( resource, faction ) === | |
− | |||
− | |||
Returns the amount of a given resource is possessed by a faction. | Returns the amount of a given resource is possessed by a faction. | ||
− | + | === string lastCreatedUnitName () === | |
− | |||
− | |||
− | |||
− | === | ||
− | |||
− | |||
− | |||
− | |||
− | + | Returns the unit type of the last created unit. | |
− | Returns the unit | + | === int lastCreatedUnit () === |
− | |||
Returns the unit ID of the last created unit. | Returns the unit ID of the last created unit. | ||
+ | === string lastDeadUnitName () === | ||
− | + | Returns the type of the last unit to die. | |
− | Returns the | + | === int lastDeadUnit ()=== |
− | |||
Returns the ID of the last unit to die. | Returns the ID of the last unit to die. | ||
+ | === int unitCount ( faction ) === | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Returns the number of units a given faction has. | Returns the number of units a given faction has. | ||
+ | === int unitCountOfType ( faction, type ) === | ||
− | + | Returns the number of units of a specific type a given faction has. | |
− | + | == Events == | |
− | + | These are xml tags used to execute lua code on its specified event. Variables can be used across different events. (TODO: see if events can be nested [Ed: This wont end well ;) -silnarm]) | |
− | |||
− | Returns the number of units of a specific | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | == | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | <startup><br />[insert code] | |
− | |||
− | + | <startup> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | = | + | <unitCreatedOfType type="unitname"><br />[insert code]<br /></unitCreatedOfType> |
− | |||
− | + | <unitDied><br />[insert code]<br /></unitDied> | |
− | |||
− | |||
− | + | <resourceHarvested><br />[insert code]<br /></resourceHarvested> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
[[Category:MG]] | [[Category:MG]] | ||
− | |||
− | |||
− |