Foreach

From the Fallout3 GECK Wiki
Revision as of 13:41, 14 September 2014 by imported>Odessa (exapnded, it works for containers + strings too)
Jump to navigation Jump to search

Added by NVSE 4. Used to repeat a script block for each entry in a collection. The collection may be either a container, array or string. In the case of a container, an entry is a ref to an item in its inventory. For an array, each entry is a stringmap with two fields, "key" and "value". For a string, each entry is a string containing a single character.

Within foreach loops, the command continue may be used to skip any remaining loop code for that entry, and move on to the next. In the same context, the command break may be used to end the loop immediately, ignoring any remaining code and entries.

Syntax

foreach Item:ref <- Container:ref
    ; Item is an item in container
loop
foreach Entry:array <- Collection:array
    ; Entry["key"] is the key (index) of each entry (0, 1, 2... for lists)
    ; Entry["value"] is the value of each entry in the array
loop
foreach Char:string <- String:string
    ; Char is a single character in String
loop

Example

array_var Beatles
array_var Entry
ref rMusician
int iPosition

let Beatles := ar_List JohnREF, PaulREF, GeorgeREF, RingoREF

foreach Entry <- Beatles
    let iPosition := Entry["key"]
    let rMusician := Entry["value"]
    Print "Entry #" + $iPosition + " is " + $rMusician
loop

; Will print in game:
; Entry #0 is John Lennon
; Entry #1 is Paul McCartney
; Entry #2 is George Harrison
; Entry #3 is Ringo Starr

Using continue:

foreach Entry <- Beatles
    let rMusician := Entry["value"]
    if rMusician.GetDead
        continue ; * Go direct to next entry: we ignore dead members
    endif
    rMusician.AddItem Beer, 1
loop

; Every living member of the Beatles is given a beer

Using break:

foreach Entry <- Beatles
    let rMusician := Entry["value"]
    if rMusician.GetInWorldSpace Liverpool
        rMusician.AddItem Beer, 1
    else
        break ; * End Loop immediately if we find a member is not in Liverpool
    endif
loop

; Give a beer to each member of the Beatles until one is found not to be in Liverpool- assume that all Beatles except Paul are in Liverpool; since Paul is the second entry of the array, only John, the first, gets a beer.

You can also use the Ar_Range command to approximate the traditional 'C' style for loop. The code below prints the numbers 0-10:

foreach Entry <- (Ar_Range 0, 10)
    Print $Entry["value"]
loop

Note that above we reference Entry["value"] in the Print function directly, rather than use an intermediary variable (let SomeVar := Entry["value"]..). This is only possible when using NVSE aware functions or the Script Compiler Override.

See Also

External Links