Latest Additions: Difference between revisions

From Archon Wiki
Jump to navigation Jump to search
No edit summary
 
(133 intermediate revisions by 2 users not shown)
Line 1: Line 1:
= Clickable Links =
= Achievement Values =
It is now possible to include clickable links in text controls by using correct markup. See [[UI#Strings|Here]] for details
You can now get and set values for a campaign that are saved in the achievements file.  New script commands
SetAchievementValue, 2, 2, "(name, value) set the value of the named achievementvalue.  If doesn't exist will be created.")
GetAchievementValue, 1, 1, "(name) get the value of the named achievementvalue.  If doesn't exist, returns 0.")


= ShaderValue Attrib =
= Region Map Highlights =
Tile. If an attrib exits named ShaderValue then the value for a given unit is passed in as the .w component of c30 (which is usually filled with pseudo-random values when rendering units) to the vertex and pixel shadersThis can allow for conditional shader code to be executed based on either static (from the squads file) or dynamic values in the attrib.
You can now enable dynamic highlights as the mouse moves over a region mapSee [[UI#REGIONMAP]].


= New UI Animation Commands =
= String File Naming =
New commands SCALE and ROTATEFormat is:
You can now name string files with additional descriptive informationThe filenames must be of the form:
  <nowiki>ANIM SCALE <frame> <startScaleX> <startScaleY> <endScaleX> <endScaleY> <ticks>
  Text<number><string>.TXT
ANIM SCALE <frame> <startRot> <endRot> <ticks> <loop></nowiki>
Or
Text<number><string>_<tag>.TXT
Where tag is the standard 3 character language tag.  Note that the string entries do not need to be the same for all the members of a given text file group.  E.g. the follow would be valid
Text2General.txt
Text2_FRE.txt
Text2German_GER.txt
Restrictions are: you cannot start the description string with a number (can lead to ambiguous filenames).  You cannot duplicate the _??? pattern at the end of a non-localised text filename.


= Antialias Support =
= Stricter String File Checking =
Tile. You can enable AA support in the options panel by providing a listbox (OptionsAAList) and the appropriate strings (IDS_AA_NONE and IDS_AA_SAMPLES).  Note that IDS_AA_SAMPLES expects to be a formatted string which takes the number of samples to be used.
There is now stricter string checking to determine that lines are either of the form
<nowiki>IDS_AA_SAMPLES,"%d samples",</nowiki>
TAG,"string",
or
// comment
By default these check failures are shown as warnings, but you can enable error throwing by using the line
MAXDEBUG 2
in the USER.TXT file.  Note that comments can still follow a correctly formatted string line.


= Per-Man Status Display =
= ELO Reroll Allows =
Tile. You can display status information over the selected and moused-over units.  This is in the form of a bar over each man. To use it you need a callback of the form
If there is a checkbox named LobbyAllowRerolls in the MP challenge setup screen, then an allow rerolls bool will be set in the misc dataThis is passed into the MP lobby tooltip callbacks as an ALLOWREROLLS param.
<nowiki>FUNCTION STATUS_BAR_CALLBACK(me, man)</nowiki>
Which returns the percentage value for the bar.  Returning -1 hides the bar for that man.  The positioning and appearance can be controlled by optional per-unit attributes
<nowiki>StatusOffset // the percentage of the IconHeight attribute to position the bar at (in 100ths), defaults to 80
StatusSize // height of the bar in 100ths, defaults to 50
StatusWidth // multiple of the height for the width of the bar, in 16ths. Cannot be larger than 255.</nowiki>
The default shader uses the center 50% of the texture (DECALBAR0 and 1 in UI/DATA/TEXTURES) for the area around the percentage position, and repeats the outer 25% on each side along the remaining barThe decalbar.txt shader can be customised as desired.


= ShowConfirm Script Command =
There is a new callback in battle RESIGN_BATTLE_CALLBACK. This should return -1 to do nothing.  If it returns 1, then the skip rating flag will be set when sending the turnTo facilitate this, there are new script commands:
You can show a confirm popup using the new command
GameAllowsRerolls
<nowiki>//show a confirm popup using UI string 0, and callback the given function with the result (see wiki for details) empty string for no callback. flags denote the buttons to show, zero for off, 1 for on, for OK and Cancel buttons for bits 0 and 1 respectively
IsRanked
ShowConfirm(callbackFunction, [flags])</nowiki>
The callback function should be of the form
<nowiki>FUNCTION MyCallback(ok)</nowiki>
Where ok will be 1 or 0 depending upon the choice the user makesNote that you cannot use Get/SetGlobal calls in this callback function.


= Reaction Display =
= UI and Font Scaling =
Tile. The reaction display was failing to display.  This has now been fixed, but there is also a new tweak DISPLAYREACTION which allows it to be disabled as desired.  This defaults to 1, but a value of zero disables display of the reaction ring.
See: [[UI#UI_and_Font_Scaling]]


= CUSTOM_UNIT_ANIM_CALLBACK =
= Copy + Paste in Edit Boxes =
Tile. You can intercept and change requests by the game to change the animationThe format of the function is
You can now copy and paste in Edit boxesThere is a new tag SELECTIONCOLOUR which allows you to alter the colour of the selection box displayed when selecting for copy.
<nowiki>FUNCTION CUSTOM_UNIT_ANIM_CALLBACK(me, man, flags, currentRand, currentIndex)</nowiki>
Where me is the unit, man is the index in the unit of the specific man, flags is various helper flags (see below), currentRand is the random animation value, and currentIndex is the animation variation of the currently playing animation.  The string tags for the upcoming and current animations are in work strings 0 and 1 respectively.


If you wish to change the animation that gets played, put the new tag into work string 0, and return the new random index value (or the incoming currentRand if you wish to leave it as is).
You cannot copy from a password box.  You cannot paste over text (e.g. paste into a selection thus replacing it).


Note that this function can be called almost every frame with the same animation, depending on the internal unit state, not just when animations finish or are triggered.
You can also copy from textmode listboxes (as used by the MP chat box).  This is only possible if you add an ALLOWCOPY tag to the UI control.  There is also a TEXTSELECTIONCOLOUR tag which can be set on these controls.


Additionally, you can now add a FLAGS byte to animation definitionsIf you wish for an animation to act like a MOVE or DIE animation, you need to set bits 0 and 1 respectively in a FLAGS value.  E.g.
= 4:3 Ratio UI overrides =
<nowiki>[MOVE_CUSTOM00]
In the rare case where a UI file needs special formatting for 4:3 ratio screens, you can define a different UI file to be loaded where appropriateSimply create a folder called 43 in the same folder as the UI files.  Any file in the 43 folder, which has the same name as a file in the parent folder, will be loaded instead, when running at a resolution with a 4:3 aspect ratio or lower.
FLAGS 1
...</nowiki>


flags bit values:
= Pick Callback =
1 - attempting to change from a move animation to wait after movement finishes
Tile. Use the following HELPERS.BSF callback to control picking/selection in battle.
PICK_CALLBACK(blocking)
Where blocking is set to 1 when the mouse is over any UI block set with BlockUIArea during a render call.  Return 0 to pick normally, 1 to prevent picking/selection.


= Zoom Speed Option =
= Custom Mouse Handling =
Allows zoom speed to be altered between 25% and 500%Requires options screen controls OptionsZoomSpeedLabel and OptionsZoomSpeedButton (works in the same way as scroll speed).  Also IDS_ZOOMSPEED string for descriptor.
Tile. Callbacks exist for custom mouse handlingThese are
MOUSE_CLICK_HANDLER(action, tilex, tiley)    // in HELPERS.BSF
DEBUG_MOUSE_CLICK_HANDLER(action, tilex, tiley) // in DEBUG_HELPERS.BSF when enabled
They are triggered on mouse upaction is 0 for LMB, 1 for RMB.  Return non-zero in MOUSE_CLICK_HANDLER to prevent normal mouse handling.


= Key Mapping =
= User Folder Redirection =
You can map keys in the options.  It requires a listbox named OptionsKeyList. This gets a list of the remappable keys (these are defined in code). The user can then remap them and the remapping is saved in the options file.  Note that ESC cannot be used as a remapped key.
If the user places a REDIRECT.TXT file in their local folder (e.g. Documents/My Games/<game>) which contains the line
  FOLDER <fullpath>
Then the game will treat the provided folder as the user folder for this game.


You need to define strings for each of the remappable keys in the form IDS_KEYDESC_<keyname>, so examples would be IDS_KEYDESC_W and IDS_KEYDESC_LEFT.
= Hotkey Tooltips =
You can now enable automatic hotkey tooltips.  See the UI button documentation.


Please speak to us if you desire other keys to be remappable.
= Hotkey Modifiers =
Can now have UI control hotkeys with SHIFT and/or CTRL modifiers.  See the UI documentation.


= SetMusicFile =
= New Tile Callbacks =
Allows you to point to a music file which is used.
Tile. New callbacks
<nowiki>//set a music file to be loaded and used. Looks in local then core files. A ? as filename means leave the existing music entry.
SetMusicFile(filename)</nowiki>


= Hexadecimal Values and Colour Strings =
// Allows for additional text to be added to skirmish descriptions in the MP creation screen.
You can now use hex values in script as integer literals. So
  // Place any string to be added in the first UI string
  <nowiki>var = 0xFF8800FF ;</nowiki>
FUNCTION SKIRMISH_COMMENT_CALLBACK()
is now a valid script line.


As part of this change, most script functions which take a colour string can now also take integer values.  So these are both valid and equivalent
// Called immediately after loading the userdata when a game is loaded
  <nowiki>SetUITooltipColour( "FFFF00FF" ) ;
  // skirmish param is zero or one.  Userdata is in the first work array.
SetUITooltipColour( 0xFFFF00FF ) ;</nowiki>
  FUNCTION LOAD_USERDATA_CALLBACK(skirmish)
NOTE: one caveat is that due to the fact you can pass strings around as integers (for historical reasons) you should note that passing a string into a user function that takes a parameter can strip the type information from the value, meaning you get an incorrect result.
  <nowiki>FUNCTION SetTT(colourString)
{
  SetUITooltipColour( colourString ) ;
}
...
  SetTT( "FFFF00FF" ) ;</nowiki>
This will set the colour incorrectly (SetUITooltipColour will treat colourString as an integer value and set the colour to whatever the internal string pointer value happens to be). To prevent this, type your functions appropriately:
  <nowiki>FUNCTION SetTT(char colourString[32])
{
  SetUITooltipColour( colourString ) ;
}
...
  SetTT( "FFFF00FF" ) ;</nowiki>


= SetShowAIMoves =
= StartCampaign & ReplaceUnit Script Commands =
Tile. New script command.
Tile. StartCampaign can now take no params at which point it loads the ||SKIRMISH campaign as per skirmish battles.  ReplaceUnit replaces one unit with anotherIn order to handle any custom setup (esp anything which is used in animation callbacks) there is a REPLACE_CALLBACK(me) callback where any required data can be set up after the new replacement unit has been initialized but before we try and sync up animations etcSo you will need to save out any specific attribs from the unit that you care about and then reset then in the callback (if needed) or after the ReplaceUnit call returns.
  <nowiki>//if state is 0 then automatic viewing of AI moves is disabled, otherwise it is enabled (default).  Note this resets at the start of each turn.
SetShowAIMoves(state)</nowiki>


= PlayUIAnimation =
= Screenshot/Movie Capture =
Tile. New script command.
Updates:  there is now an onscreen flash when capturing a screenshot. You can also place entries for SCREENSHOTSFX and MOVIESFX into the UIDefaults.txt file in SystemThese should be numeric index values into the sfx list for sounds to be played when screenshotting, and when beginning a movie capture respectively.
  <nowiki>//play the animation on the denoted UI screen (the objectName must be the root object of the screen).
PlayUIAnimation(objectName, animationName)</nowiki>


= LoadVariableFromParserFile =
= Global saves =
This command loads data from a parser file into a variable. The chunks should be named [0], [1], etc for each element in the array.
You can now pass an empty string into Load/SaveVariableData and it will load and save from a GLOBAL_DATA.TXT file in (e.g.) My Documents/My Games/FieldOfGlory2.  This can be used to set up a global structure for persistent data across the game, e.g. hi scores or battles won.
<nowiki>//read a parser file to the named var (must be an array of structs). Only int values currently supported. Numbered chunks (base 0) are read to the corresponding array element in the named array. Each value is read to corresponding item in the structure. See wiki for details.
LoadVariableFromParserFile(variableName, filename)</nowiki>
An example input file might be of the form:
<nowiki>[0]
side 10
data[0] 89
data[2] 5


[3]
= Load Sequence Function =
side 33</nowiki>
Tile. If the script CORE/LOADINIT.BSF exists then the function LoadInit from within it will be called at the very start of the main loading sequence, immediately after the first loadbar frame is shown.
And would be used as such:
<nowiki>struct TLoad
{
  int side ;
  int data[4] ;
}
TLoad gLoad[256] ;
...
  LoadVariableFromParserFile("gLoad", "MapData") ;</nowiki>


= SetCameraPositionPrecise & StopSFX =
= Progress Bars Accept KEEPSQUARE =
Tile. New script commands.
You can now use a KEEPSQUARE tag for progress bars if desired.
<nowiki>//set the camera to instantly point to the given point (defined in 100ths), centering it on the screen
SetCameraPositionPrecise(x, y)


//stop a playing sample using a playback IDHas no effect if the sample is over, or has been stopped by the system.
= Global Orders =
StopSFX(playbackID)</nowiki>
Tile. You can now include global orders which do not require a unit to be selectedThese are defined in the CORE.BSF script, and should follow the template for standard unit orders (i.e. CHECK_, UIBUTTON_, etc functions must exist).  These orders use a CORE_ prefix, rather than TILE_, UNIT_, or ALL_.
Note that the playbackID is newly returned from SFX playback functions.


= Object Terrain Priority =
= Gamma Adjustment =
Tile. You can add a tag to an object PRIORITY. The default value is 0. Of the objects on a tile, the object with the highest priority value will denote the terrain (assuming it has a terrain override set). PRIORITY value must be [0,255].
Two new commands allow for adjusting the gamma values when in fullscreen.  To allow for saving of the gamma value (or others) there are 3 additional Custom* options values available. Custom1, Custom2, Custom3.  All default to zero. Suggested values for gamma would be 0.5 to 2.0 or so, depending on the variation you wish to allow.
<nowiki>//set the gamma value, if possible.  gamma is in 1000ths.
SetGamma(gamma)


= Unit Scaling =
//returns 1 if the current setup allows for gamma adjustment (e.g. driver support, or because gamma requires fullscreen).
Tile.  You can add an attrib UnitScaling which allows for scaling of unit sizes. The value is in 1000ths, a value of zero is ignored.
AllowsGamma()</nowiki>


= Textbox Rescale and Scrolling =
= Get/SetUnitString Script Commands =
You can now have rescaling text boxes which will convert to scrolling if they exceed a given height, set using the RESCALEMAX tagSo an object can have the RESCALE and SCROLLING tags both set, and will rescale up to the height set by RESCALEMAX, and then stay at that size and use scrolling to allow access to the full text.
Tile. New commands to allow a custom unicode string to be attached to a unit.
  //place the contents of the first UI string as a custom string for the unit.  
SetUnitString(me)


= Force Selection Script Additions =
  //place the contents of the unit custom string into the first UI stringReturns 0 if there is no custom string, 1 otherwise
Tile. Additional script commands to allow for custom force controls.
GetUnitString(me)
  <nowiki>//set the selected state of a given unit on tile x,y on the deployment mapIf select is 0 then the unit is unselected, otherwise selected. Note can fail if unit is fixed or not enough points.
SetForceControlSelected(objectName, x, y, select)


//returns 0 if the unit on x,y is unselected, 1 if selected, 2 if fixed, (-1 if no unit is on the tile)
= User Content Debugging =
GetForceControlSelected(objectName, x, y)
Tile. When in DEBUGMODE is set to 2, the system will additionally load list_debug.txt into the user content list from the server.  This is to allow for simpler testing of user content from the server without polluting the release list.


//set the zoom level for the camera in battle
= GetSkirmishPoints & GetCurrentMod =
SetZoom(zoom)</nowiki>
Tile. New script commands to fetch the currently set skirmish points, and to query the current mod.
There is now an additional tag for ForceSelection UI objects.  HIDEBUTTONS will entirely hide the display of the normal force control buttons.
<nowiki>//sets the first 4 values in the first work array with the current skirmish points values (fixed0, fixed1, select0, select1)
GetSkirmishPoints()


= OBJ_UI_RENDER/HANDLE Change =
//if a mod is selected, place the name of the current mod into the first UI string and return its index, otherwise return -1Always returns -1 in multiplayer.
The UI script callback functions UI_OBJ_RENDER and UI_OBJ_HANDLE now also has a name parameter containing the name of the rendering object.
GetCurrentMod()</nowiki>
  <nowiki>FUNCTION UI_OBJ_RENDER(x,y,width,height,pass, name)
FUNCTION UI_OBJ_HANDLE(data, event, id, name)</nowiki>


= Water =
= Modding Updates =
1st pass water implementedYou can now add a SKYDOME <name> line to a lighting fileThe name should not include the type extensionNote that only the skydome texture from the daytime lighting file is used by the system when loading the skydome.  This texture should be in the DATA/BATTLE/TEXTURES folder (either main or campaign local).  It is available in the shaders in sampler 7.
TileMods can now override S4F and their animation files for unitsThey can also override scripts for AI, unit, HELPERS, and CORE BSF filesNOTE: to package global mods, you need a ModsPackage named button on the mod UI panel.


= Flying Units =
= Lobby Colouring Tweak =
Tile. You now tag objects with FLYHEIGHT valuesThese are used to generate a per-tile max heightThen, if your squads file has a FlyingFollow attrib, then any unit with a non-zero value will remain above the ground by a value made up of the per-tile max height plus the value of the FlyingFollow attribute for the unit.
Tile. You can now use the VALUE5 entry for the accept games list to define the RGB value for disabled games (where you do not have the necessary campaign etc)Alpha is set to 0xFF by the gameZero uses the default colouring.


= GetPositionDistance Script Command =
= String Attribs =
Takes two positions (in 100ths) and returns the distance between them.
Tile.  You can have up to 8 read-only strings attached to a squad template.  These must be defined in the squads file using tags ##0 to ##7.  The string data for each element must have 27 characters or less, and spaces are not permitted.  You can then retrieve these using the new command
  <nowiki>//return the distance in 100ths between two points that are also in 100ths
  <nowiki>//place the given attrib string into the first work string.  typeIndex is the index of the unit type. index is currently [0,7].
GetPositionDistance(x1,y1,x2,y2)</nowiki>
GetAttribString(typeIndex, index)</nowiki>
Note that the string returned will have been converted into upper case.


= Terrain Following Objects =
= UpdateUserStringFromUI and GetUIEditboxToInt Script Commands =
You can use the TERRAINFOLLOW tag to allow objects to align themselves to the terrain.
<nowiki>//take the UI string from an editbox object and update it if it has changed (or is new).  Return 1 if a change has been made, zero otherwise.
UpdateUserStringFromUI(objectName, tag)


= New Script Functions =
//takes the contents of the UI editbox and converts them to a string.  If there are any non-numeric characters in the string, then the return value is invalidValueSkips leading and trailing whitespace.
You can now use the Sort function to sort a generic array, and the FindStringInArray function to search for an array entry based on a string element.
GetUIEditboxToInt(objectName, invalidValue)</nowiki>
  <nowiki>//sort the array by the elementName entry (which must be an integer)If direction included, 0 is ascending (the default), 1 is descending.
Sort(elementName, array, count, [direction])


//returns the index of the first array item containing and element called elementName which is the search stringelementName is a string entry, array is the variable array itself
= Review Battlefield After Battle =
FindStringInArray(string, elementName, array)</nowiki>
Tile. You can now set up the UI to allow the user to review the battlefield after a battle ends.  To do this you should:
* Add a button the the EndBattle control called EndBattleReview
* Create a new UI screen to allow the user to exit after they have finished reviewingThis screen should be called EndReview, and should include a button named EndReviewOK.  EndReview should not be modal, but should have the same HANDLER as EndBattle (DeployHandler).
This should allow the player to review the battlefield, with all units shown.


An example would be
= ShowUIListboxItem =
  <nowiki>struct TTest
New script command which moves the viewable area (if needed) to show the given item.
{
  //move the UI listbox to show the given item index. Scrolls unless immediate is non-zero, in which case it instantly changes the view
  char name[32] ;
ShowUIListboxItem(objectName, index, [immediate])
  int value ;
}
...
TTest array[2][32] ;


  Sort("value", array[1], 32) ;</nowiki>
= GetString Control Change =
If the UI object GetStringTitle exists, then the title text for the system GetString control will be placed there, rather than in the title of the GetString object window as per default.


= AddVizUnitFormation Command =
= DEPLOY_DRAG_CALLBACK =
This command allows to you trigger and wait for a formation change.
Tile. Unit script function that is called each time a unit is moved by dragging when in deployment.
FUNCTION DEPLOY_DRAG_CALLBACK(me, tilex, tiley)


<nowiki>//do a call to the unit placement function (potentially calling the FORMATION_CALLBACK) and wait until all the men are in position and facing the correct way.
= Multiline for UI Edit Controls =
AddVizUnitFormation(id)</nowiki>
Adding a CHATMODE tag to edit controls will now allow them to contain more than one line.


=Formation Facing Control =
= Further INCLUDE Functionality for UI Files =
Use the new command SetFormationFacing in the FORMATION_CALLBACK function to set the facing of the nth man in the unit.  Use -1 to just have the man face in the default direction of the unit as a whole, as was the previous behaviour. Note that the facing is specified relative to the facing of the unit, not in terms of absolute facing. So to make a man face 45 degrees anticlockwise from the facing of the unit, the facing would be 45.
You can now use a prefix to rename included UI file components, allowing reuse of UI fragments. See here:[[UI]]


  <nowiki>//set the facing of the nth man in the unitUse -1 to just have the man face in the default direction of the unit as a whole. Only relevant in FORMATION_CALLBACK
= User Music Control =
SetFormationFacing(n, facing)</nowiki>
Tile.  You can alter the music that is playing using the new script command
  <nowiki>//switch to the denoted music trackMust be [0,5] currently as per the MUSIC.TXT file order.
SwitchMusic(track)</nowiki>
Can be combined with the new tweak DisableDefaultMusic, which stops all hardcoded changes of music (NOTE: other than the initial playing of the main menu music, and some other changes back to the main menu music when internal code takes the UI back to the main menu).


= Scrollable Text Controls =
It is also worth reminding of the existence of the SetMusicFile command
Text controls can now be made scrollable.  Add
  <nowiki>//set a music file to be loaded and used. Looks in local then core files. A ? as filename means leave the existing music entry.
 
SetMusicFile(filename)</nowiki>
<nowiki>SCROLLING <control texture> </nowiki>
 
to the control definition and the control will (if the text is too large to fit in the control) add a scrollbar to allow for scrolling to view the ful text.  Note that this will not work correctly when combined with rescaling text boxes.  You can also use BARSIZE to control the size of the scrollbar.
 
= String Manipulation and Creation =
You can allow the user to create string entries (expected in the editor) via script.  The new functions are:
 
  <nowiki>//places the contents of the edit box into the first UI string.
GetUIEditbox(objectName)
 
//creates a string of the form IDS_<tagBody>_<number> finding the first empty slot in the string table, and fills it with the contents of the first UI string
AddUserString(tagBody)
 
//remove the denoted user string from the temporary store.  Has no effect if the string has already been written out to the file.
RemoveUserString(tag)
 
//flush out any user strings to the TEXT9.TXT file.  NOTE: this is done automatically at map save and editor exit.
FlushUserStrings()
 
//returns the highest N for which a string exists with the form IDS_<tagBody>_<N>, up to a max of 100000. Returns -1 if none exist.
GetHighestStringIndex(tagBody)
 
//return 1 if the string exists, 0 otherwise
DoesStringExist(tag)
 
//get the denoted string into the first UI string if it exists.  Empty otherwise
GetString(tag)</nowiki>
 
So users can type in strings which are then added to the list of strings available to use ingame.
 
= Script Updates =
1 - the break directive to trigger the debugger has changed to DebugBreak ; to prevent confusion with the C break statement.
 
2 - while loops are now supported.  Note that the test cannot be an operation, so
<code>while(i--)</code>
will not work, as the scripting does not treat the left hand of an expression as a value in the same way as C.
 
= Custom UI Object Rendering (inc Listbox Items) =
Individual UI objects can now have their own scripts attached, including their own rendering callbacks.  As before the rendering callback is of the form
 
<code>FUNCTION UI_OBJ_RENDER(x,y,width,height,pass)</code>
 
Where pass is 0/1 for pre/post normal control rendering.
 
Listboxes can also include
 
<code>FUNCTION UI_OBJ_RENDER_ITEM(x,y,width,height,pass,flags, item, name)</code>
 
which operates in the same way but for each listbox item.  The flags param has bits set for selection (bit 0) and mouseover (bit 1), item is the index of the item in the listbox, name is the UI object name.
 
= Listboxes: Multiple Selection =
You can enable multiple selection for listboxes with the MULTISELECT tag in their UI definition.  Then use
 
<nowiki>//return 1 if the specified item is selected, zero otherwise
IsUIListboxItemSelected(object, index)
 
//returns the number of items in a listbox
GetUIListboxCount(object)</nowiki>
 
to interrogate the listbox. 
 
<i>Note: This means that it is possible to get UI script triggers from listboxes which are actually a CTRL+ event which unselects the item.</i>
 
= Scripting: GetWorkString =
You can now use GetWorkString on the RHS of an assignment expression, e.g.
<code>char myString[32] ;
myString = GetWorkString() ;</code>
The contents will be safely truncated to the source string's size.


= 3DVIEW UI Control =
= New Script Commands: GetMapStyle & DeleteUserCampaign =
Tile.
<nowiki>//place the current map style string into the first work string.
GetMapStyle()


Creates a 3D viewport into which you can load 3D models for viewing.  The COLOUR tag for this control sets the background clear colour (use zero for a transparent background, FF000000 for black).
//delete a user campaign.  The filename is expected to include the CAMPAIGNS or MULTIPLAYER path element depending upon where the campaign is.  E.g. MULTIPLAYER/MYCAMPAIGN.  NOTE: it is good practice to prompt the user to confirm deletion.
DeleteUserCampaign(filename)</nowiki>


Script commands to control this are:
= Including Templates in UI Files =
You can now include other files in UI files.  Note this should be used with care as objects with the same names are still prohibited.  All includes must be the first thing in the UI file.  Lines must be of the form
#include "file.txt"
or
include "file.txt"
The template files must be in DATA/UI/TEMPLATES


  <nowiki>
= AreNewDownloads Script Command =
//if filename starts with # then defaults to standard unit loading paths.
  //returns 1 if there are new user content downloads available, 0 otherwise
UIObject3DLoad(objectName, filename, [texturePath])
AreNewDownloads()


//automatically set the zoom and camera origin to the size of the currently loaded object
= Button Text Colour Updates =
UIObject3DAuto(objectName)
You can now define different colours for buttons to use when they are being actioned.  These colours can be set globally in the UIDEFAULTS.TXT file using
BUTTONOVERCOLOUR <hex>
BUTTONDOWNCOLOUR <hex>
BUTTONDISABLEDCOLOUR <hex>
You can also over-ride these values on a per-button basis in the UI text file using
OVERCOLOUR <hex>
DOWNCOLOUR <hex>
DISABLEDCOLOUR <hex>


//set the origin position and vertical angle of the camera.
= PRESTARTEDITOR Callback =
SetUIObject3DCamera(objectName, x,y,z,angle,[zoom])
Tile. There is now a callback when the editor starts.  This can be located in either or both the CORE.BSF and scenario scripts.  The function is of the same form as PRESTARTBATTLE:
<nowiki>FUNCTION PreStartEditor(mode)</nowiki>


//set the options for the view.  0 for off, nonzero for on.
= Older Entries =
SetUIObject3DOptions(objectName, allowZoom, allowHorizontalRotate, allowVerticalRotate)
[[Archive_1]]
</nowiki>

Latest revision as of 21:58, 4 November 2024

Achievement Values

You can now get and set values for a campaign that are saved in the achievements file. New script commands

SetAchievementValue, 2, 2, "(name, value) set the value of the named achievementvalue.  If doesn't exist will be created.") 
GetAchievementValue, 1, 1, "(name) get the value of the named achievementvalue.  If doesn't exist, returns 0.")

Region Map Highlights

You can now enable dynamic highlights as the mouse moves over a region map. See UI#REGIONMAP.

String File Naming

You can now name string files with additional descriptive information. The filenames must be of the form:

Text<number><string>.TXT

Or

Text<number><string>_<tag>.TXT

Where tag is the standard 3 character language tag. Note that the string entries do not need to be the same for all the members of a given text file group. E.g. the follow would be valid

Text2General.txt
Text2_FRE.txt
Text2German_GER.txt

Restrictions are: you cannot start the description string with a number (can lead to ambiguous filenames). You cannot duplicate the _??? pattern at the end of a non-localised text filename.

Stricter String File Checking

There is now stricter string checking to determine that lines are either of the form

TAG,"string",

or

// comment

By default these check failures are shown as warnings, but you can enable error throwing by using the line

MAXDEBUG 2

in the USER.TXT file. Note that comments can still follow a correctly formatted string line.

ELO Reroll Allows

If there is a checkbox named LobbyAllowRerolls in the MP challenge setup screen, then an allow rerolls bool will be set in the misc data. This is passed into the MP lobby tooltip callbacks as an ALLOWREROLLS param.

There is a new callback in battle RESIGN_BATTLE_CALLBACK. This should return -1 to do nothing. If it returns 1, then the skip rating flag will be set when sending the turn. To facilitate this, there are new script commands:

GameAllowsRerolls
IsRanked

UI and Font Scaling

See: UI#UI_and_Font_Scaling

Copy + Paste in Edit Boxes

You can now copy and paste in Edit boxes. There is a new tag SELECTIONCOLOUR which allows you to alter the colour of the selection box displayed when selecting for copy.

You cannot copy from a password box. You cannot paste over text (e.g. paste into a selection thus replacing it).

You can also copy from textmode listboxes (as used by the MP chat box). This is only possible if you add an ALLOWCOPY tag to the UI control. There is also a TEXTSELECTIONCOLOUR tag which can be set on these controls.

4:3 Ratio UI overrides

In the rare case where a UI file needs special formatting for 4:3 ratio screens, you can define a different UI file to be loaded where appropriate. Simply create a folder called 43 in the same folder as the UI files. Any file in the 43 folder, which has the same name as a file in the parent folder, will be loaded instead, when running at a resolution with a 4:3 aspect ratio or lower.

Pick Callback

Tile. Use the following HELPERS.BSF callback to control picking/selection in battle.

PICK_CALLBACK(blocking)

Where blocking is set to 1 when the mouse is over any UI block set with BlockUIArea during a render call. Return 0 to pick normally, 1 to prevent picking/selection.

Custom Mouse Handling

Tile. Callbacks exist for custom mouse handling. These are

MOUSE_CLICK_HANDLER(action, tilex, tiley)    // in HELPERS.BSF
DEBUG_MOUSE_CLICK_HANDLER(action, tilex, tiley) // in DEBUG_HELPERS.BSF when enabled

They are triggered on mouse up. action is 0 for LMB, 1 for RMB. Return non-zero in MOUSE_CLICK_HANDLER to prevent normal mouse handling.

User Folder Redirection

If the user places a REDIRECT.TXT file in their local folder (e.g. Documents/My Games/<game>) which contains the line

FOLDER <fullpath>

Then the game will treat the provided folder as the user folder for this game.

Hotkey Tooltips

You can now enable automatic hotkey tooltips. See the UI button documentation.

Hotkey Modifiers

Can now have UI control hotkeys with SHIFT and/or CTRL modifiers. See the UI documentation.

New Tile Callbacks

Tile. New callbacks

// Allows for additional text to be added to skirmish descriptions in the MP creation screen.
// Place any string to be added in the first UI string
FUNCTION SKIRMISH_COMMENT_CALLBACK()
// Called immediately after loading the userdata when a game is loaded
// skirmish param is zero or one.  Userdata is in the first work array.
FUNCTION LOAD_USERDATA_CALLBACK(skirmish)

StartCampaign & ReplaceUnit Script Commands

Tile. StartCampaign can now take no params at which point it loads the ||SKIRMISH campaign as per skirmish battles. ReplaceUnit replaces one unit with another. In order to handle any custom setup (esp anything which is used in animation callbacks) there is a REPLACE_CALLBACK(me) callback where any required data can be set up after the new replacement unit has been initialized but before we try and sync up animations etc. So you will need to save out any specific attribs from the unit that you care about and then reset then in the callback (if needed) or after the ReplaceUnit call returns.

Screenshot/Movie Capture

Updates: there is now an onscreen flash when capturing a screenshot. You can also place entries for SCREENSHOTSFX and MOVIESFX into the UIDefaults.txt file in System. These should be numeric index values into the sfx list for sounds to be played when screenshotting, and when beginning a movie capture respectively.

Global saves

You can now pass an empty string into Load/SaveVariableData and it will load and save from a GLOBAL_DATA.TXT file in (e.g.) My Documents/My Games/FieldOfGlory2. This can be used to set up a global structure for persistent data across the game, e.g. hi scores or battles won.

Load Sequence Function

Tile. If the script CORE/LOADINIT.BSF exists then the function LoadInit from within it will be called at the very start of the main loading sequence, immediately after the first loadbar frame is shown.

Progress Bars Accept KEEPSQUARE

You can now use a KEEPSQUARE tag for progress bars if desired.

Global Orders

Tile. You can now include global orders which do not require a unit to be selected. These are defined in the CORE.BSF script, and should follow the template for standard unit orders (i.e. CHECK_, UIBUTTON_, etc functions must exist). These orders use a CORE_ prefix, rather than TILE_, UNIT_, or ALL_.

Gamma Adjustment

Two new commands allow for adjusting the gamma values when in fullscreen. To allow for saving of the gamma value (or others) there are 3 additional Custom* options values available. Custom1, Custom2, Custom3. All default to zero. Suggested values for gamma would be 0.5 to 2.0 or so, depending on the variation you wish to allow.

//set the gamma value, if possible.  gamma is in 1000ths.
SetGamma(gamma)

//returns 1 if the current setup allows for gamma adjustment (e.g. driver support, or because gamma requires fullscreen).
AllowsGamma()

Get/SetUnitString Script Commands

Tile. New commands to allow a custom unicode string to be attached to a unit.

//place the contents of the first UI string as a custom string for the unit. 
SetUnitString(me)
//place the contents of the unit custom string into the first UI string.  Returns 0 if there is no custom string, 1 otherwise
GetUnitString(me)

User Content Debugging

Tile. When in DEBUGMODE is set to 2, the system will additionally load list_debug.txt into the user content list from the server. This is to allow for simpler testing of user content from the server without polluting the release list.

GetSkirmishPoints & GetCurrentMod

Tile. New script commands to fetch the currently set skirmish points, and to query the current mod.

//sets the first 4 values in the first work array with the current skirmish points values (fixed0, fixed1, select0, select1)
GetSkirmishPoints()

//if a mod is selected, place the name of the current mod into the first UI string and return its index, otherwise return -1.  Always returns -1 in multiplayer.
GetCurrentMod()

Modding Updates

Tile. Mods can now override S4F and their animation files for units. They can also override scripts for AI, unit, HELPERS, and CORE BSF files. NOTE: to package global mods, you need a ModsPackage named button on the mod UI panel.

Lobby Colouring Tweak

Tile. You can now use the VALUE5 entry for the accept games list to define the RGB value for disabled games (where you do not have the necessary campaign etc). Alpha is set to 0xFF by the game. Zero uses the default colouring.

String Attribs

Tile. You can have up to 8 read-only strings attached to a squad template. These must be defined in the squads file using tags ##0 to ##7. The string data for each element must have 27 characters or less, and spaces are not permitted. You can then retrieve these using the new command

//place the given attrib string into the first work string.  typeIndex is the index of the unit type. index is currently [0,7].
GetAttribString(typeIndex, index)

Note that the string returned will have been converted into upper case.

UpdateUserStringFromUI and GetUIEditboxToInt Script Commands

//take the UI string from an editbox object and update it if it has changed (or is new).  Return 1 if a change has been made, zero otherwise.
UpdateUserStringFromUI(objectName, tag)

//takes the contents of the UI editbox and converts them to a string.  If there are any non-numeric characters in the string, then the return value is invalidValue.  Skips leading and trailing whitespace.
GetUIEditboxToInt(objectName, invalidValue)

Review Battlefield After Battle

Tile. You can now set up the UI to allow the user to review the battlefield after a battle ends. To do this you should:

  • Add a button the the EndBattle control called EndBattleReview
  • Create a new UI screen to allow the user to exit after they have finished reviewing. This screen should be called EndReview, and should include a button named EndReviewOK. EndReview should not be modal, but should have the same HANDLER as EndBattle (DeployHandler).

This should allow the player to review the battlefield, with all units shown.

ShowUIListboxItem

New script command which moves the viewable area (if needed) to show the given item.

//move the UI listbox to show the given item index.  Scrolls unless immediate is non-zero, in which case it instantly changes the view
ShowUIListboxItem(objectName, index, [immediate])

GetString Control Change

If the UI object GetStringTitle exists, then the title text for the system GetString control will be placed there, rather than in the title of the GetString object window as per default.

DEPLOY_DRAG_CALLBACK

Tile. Unit script function that is called each time a unit is moved by dragging when in deployment.

FUNCTION DEPLOY_DRAG_CALLBACK(me, tilex, tiley)

Multiline for UI Edit Controls

Adding a CHATMODE tag to edit controls will now allow them to contain more than one line.

Further INCLUDE Functionality for UI Files

You can now use a prefix to rename included UI file components, allowing reuse of UI fragments. See here:UI

User Music Control

Tile. You can alter the music that is playing using the new script command

//switch to the denoted music track.  Must be [0,5] currently as per the MUSIC.TXT file order.
SwitchMusic(track)

Can be combined with the new tweak DisableDefaultMusic, which stops all hardcoded changes of music (NOTE: other than the initial playing of the main menu music, and some other changes back to the main menu music when internal code takes the UI back to the main menu).

It is also worth reminding of the existence of the SetMusicFile command

//set a music file to be loaded and used. Looks in local then core files. A ? as filename means leave the existing music entry.
SetMusicFile(filename)

New Script Commands: GetMapStyle & DeleteUserCampaign

Tile.

//place the current map style string into the first work string.
GetMapStyle()

//delete a user campaign.  The filename is expected to include the CAMPAIGNS or MULTIPLAYER path element depending upon where the campaign is.  E.g. MULTIPLAYER/MYCAMPAIGN.  NOTE: it is good practice to prompt the user to confirm deletion.
DeleteUserCampaign(filename)

Including Templates in UI Files

You can now include other files in UI files. Note this should be used with care as objects with the same names are still prohibited. All includes must be the first thing in the UI file. Lines must be of the form

#include "file.txt"

or

include "file.txt"

The template files must be in DATA/UI/TEMPLATES

AreNewDownloads Script Command

//returns 1 if there are new user content downloads available, 0 otherwise
AreNewDownloads()

Button Text Colour Updates

You can now define different colours for buttons to use when they are being actioned. These colours can be set globally in the UIDEFAULTS.TXT file using

BUTTONOVERCOLOUR <hex>
BUTTONDOWNCOLOUR <hex>
BUTTONDISABLEDCOLOUR <hex>

You can also over-ride these values on a per-button basis in the UI text file using

OVERCOLOUR <hex>
DOWNCOLOUR <hex>
DISABLEDCOLOUR <hex>

PRESTARTEDITOR Callback

Tile. There is now a callback when the editor starts. This can be located in either or both the CORE.BSF and scenario scripts. The function is of the same form as PRESTARTBATTLE:

FUNCTION PreStartEditor(mode)

Older Entries

Archive_1