Category:Gamevar manipulation: Difference between revisions

From EDukeWiki
Jump to navigation Jump to search
Updated according to the latest available snapshot
Mention global var hoisting
 
(18 intermediate revisions by 7 users not shown)
Line 1: Line 1:
A gamevar is a game variable that can be used to store numerical data which can then be referenced between [[actor]]s.
== Definition ==
'''gamevar''' <varname> <value> <flags>


The syntax for defining a gamevar is 'gamevar <varname> <value> <flags>'
'''var''' <varname> <value> <flags>


A gamevar's flags determine how it is referenced by the game.  A gamevar with flags of 0 is known as a global variable.  A global variable exists once in the code, and any time a global variable is set, the new value is seen by all [[actor]]s.  A gamevar with flags of 1 is a per-player variable.  Per-player variables exist once per player in the game, with each player having their own copy of the variable.  A gamevar with flags of 2 is a per-[[actor]] variable.  A per-[[actor]] variable exists as many times in the code as there are [[sprite]]s in the map. Each [[sprite]] has its own copy of a per-[[actor]] variable in memory.
A gamevar is a variable that can be used to store numerical data which can then be referenced between [[actor]]s, [[state]]s and [[event]]s. '''var''' is hereby semantically equivalent to '''gamevar'''.


{| {{prettytable}}
The gamevar's flags define a bitmap that determines how the variable is treated by the game. For instance, a gamevar with flags of 0 is known as a global variable.  A global variable exists once in the code, and any time a global variable is set, the new value is seen by all [[actor]]s and [[event]]s.  A gamevar with flag bit 1 set is a per-player variable, which exists once for each player in the game.  A gamevar with flag bit 2 set is a per-[[actor]] variable, which exists as many times in the code as there are [[sprite]]s in the map.  This means that each [[sprite]] has its own copy of a per-[[actor]] variable stored in memory. '''Note that a gamevar can only be defined as either global, per-player, or per-actor, but not as a combination thereof.'''
!Name!!Number!!Description!!Page where such variables should be listed
|-
|GAMEVAR_FLAG_GLOBAL||0||global variable; this is the default||
|-
|GAMEVAR_FLAG_PERPLAYER||1||per-player variable||
|-
|GAMEVAR_FLAG_PERACTOR||2||per-actor variable||
|-
|GAMEVAR_FLAG_USER_MASK||3||bitmask controling what flags can be set from con||
|-
|GAMEVAR_FLAG_DEFAULT||256||allow override||
|-
|GAMEVAR_FLAG_SECRET||512||don't dump...||
|-
|GAMEVAR_FLAG_NODEFAULT||1024||don't add to 'default' array.||
|-
|GAMEVAR_FLAG_SYSTEM||2048||cannot change mode flags...(only default value)||
|-
|GAMEVAR_FLAG_READONLY||4096||values are read-only (no setvar allowed)||
|-
|GAMEVAR_FLAG_INTPTR||8192||plValue is a pointer to an int||[[Constantly updated gamevars]]
|-
|GAMEVAR_FLAG_SYNCCHECK||16384||check event sync when translating||
|-
|GAMEVAR_FLAG_SHORTPTR||32768||plValue is a pointer to a short||[[Constantly updated gamevars]]
|-
|GAMEVAR_FLAG_CHARPTR||65536||plValue is a pointer to a char||[[Constantly updated gamevars]]
|-
|GAMEVAR_FLAG_NORESET||131072||var values are not reset when restoring map state||
|}


All of the commands in this category are commands that alter the value of one or more gamevars in some way, as opposed to commands which alter [[sprite]]s, [[sector]]s or [[wall]]s.
Gamevars are stored as '''signed 32-bit integers''' and therefore have a value range of ''-2,147,483,648 (-2<sup>31</sup>)'' to ''2,147,483,647 (2<sup>31</sup>-1)''. Going above and below this range causes the value to overflow and underflow respectively.
 
Note that it is possible to omit the <value> and <flags> parameters entirely to define a global variable with an initial value of 0, with no other flags set. Example:
var TEMP1
 
It is also possible to chain flags separately at the end of the gamevar definition, instead of compiling them into a single value, as follows:
var TEMP2 10 1 4096    // This defines a per-player (1), read-only (4096) variable with initial value 10.
 
Keep in mind that global variables are still global, even when defined within a state block. The variable definition is effectively "hoisted," so the variable will not be reset to the initial value each time its definition is encountered.
 
The following pages contain information on basic gamevar operations as well as conditional statements:
*[[gamevar operators]]
*[[ifvar conditions]]
 
== Flags ==
 
The following table shows all currently defined gamevar flags. The first 2 are the only ones needed under normal circumstances, but one can also assign higher flags to user-defined gamevars (given that you know what you are doing).
 
{{gamevar flags}}


[[Category:All commands]]
[[Category:All commands]]

Latest revision as of 16:32, 9 July 2020

Definition

gamevar <varname> <value> <flags>

var <varname> <value> <flags>

A gamevar is a variable that can be used to store numerical data which can then be referenced between actors, states and events. var is hereby semantically equivalent to gamevar.

The gamevar's flags define a bitmap that determines how the variable is treated by the game. For instance, a gamevar with flags of 0 is known as a global variable. A global variable exists once in the code, and any time a global variable is set, the new value is seen by all actors and events. A gamevar with flag bit 1 set is a per-player variable, which exists once for each player in the game. A gamevar with flag bit 2 set is a per-actor variable, which exists as many times in the code as there are sprites in the map. This means that each sprite has its own copy of a per-actor variable stored in memory. Note that a gamevar can only be defined as either global, per-player, or per-actor, but not as a combination thereof.

Gamevars are stored as signed 32-bit integers and therefore have a value range of -2,147,483,648 (-231) to 2,147,483,647 (231-1). Going above and below this range causes the value to overflow and underflow respectively.

Note that it is possible to omit the <value> and <flags> parameters entirely to define a global variable with an initial value of 0, with no other flags set. Example:

var TEMP1

It is also possible to chain flags separately at the end of the gamevar definition, instead of compiling them into a single value, as follows:

var TEMP2 10 1 4096    // This defines a per-player (1), read-only (4096) variable with initial value 10.

Keep in mind that global variables are still global, even when defined within a state block. The variable definition is effectively "hoisted," so the variable will not be reset to the initial value each time its definition is encountered.

The following pages contain information on basic gamevar operations as well as conditional statements:

Flags

The following table shows all currently defined gamevar flags. The first 2 are the only ones needed under normal circumstances, but one can also assign higher flags to user-defined gamevars (given that you know what you are doing).


Exposed Value Hex Label Description
Yes 1 0x00000001 GAMEVAR_PERPLAYER Per-player variable.
Yes 2 0x00000002 GAMEVAR_PERACTOR Per-actor variable.
3 0x00000003 GAMEVAR_USER_MASK Bitmask controlling what flags can be set from con; only flags less than this can.
Internal 8 0x00000008 GAMEVAR_RESET
256 0x00000100 GAMEVAR_DEFAULT Allow override (not used, but always cleared for user-defined gamevars).
512 0x00000200 GAMEVAR_FLAG_SECRET Don't dump... (no longer defined in eduke32 source code as of r10016)
Yes 1024 0x00000400 GAMEVAR_NODEFAULT Don't reset on actor spawn. Useful if you want a variable to be set once you start the game (otherwise it's reset each time you start a new game).
2048 0x00000800 GAMEVAR_SYSTEM Cannot change mode flags...(only default value)
4096 0x00001000 GAMEVAR_READONLY Values are read-only (no setvar allowed)
8192 0x00002000 GAMEVAR_INT32PTR plValues is a pointer to an int32_t
16384 0x00004000 GAMEVAR_FLAG_SYNCCHECK check event sync when translating (no longer defined in eduke32 source code as of r10016)
32768 0x00008000 GAMEVAR_INT16PTR plValues is a pointer to a short
Yes 131072 0x00020000 GAMEVAR_NORESET Variable values are not reset when restoring map state
262144 0x00040000 GAMEVAR_SPECIAL Flag for structure member shortcut vars
Yes 524288 0x00080000 GAMEVAR_NOMULTI Don't attach to multiplayer packets
1048576 0x00100000 GAMEVAR_Q16PTR plValues is a pointer to a q16.16
Yes 2097152 0x00200000 GAMEVAR_SERIALIZE Write into permasaves