VC Arrays

From GTAMods Wiki
Revision as of 02:09, 15 December 2005 by Y_Less (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Arrays in Vice City

There are currently three methods of creating arrays. The first one (Barton Waterduck's method) has been largely depricated now due to the fact that, although simple to use in his builders (using psuedo commands), the generated code was large and complicated.

Example of array code in the builder (note: this feature was introduced about v1.3):

DEFINE ARRAY $my_array size 2 type INTEGER
// Integer arrays were also used for storing ingame objects.
:label_my_code_0
0004: $my_array_index = 0

:label_my_code_1
GET_ARRAY $my_array
// Get the data from the array at position $my_array_index.
// Do whatever with it.
$my_array += 1
SET_ARRAY $my_array
$my_array += 1
0002: jump ££label_my_code_1

Example of this code compiled and decomplied:

:label_my_array_get_0
00D6: if 0
        $my_array_index == 0
004D: jump_if_false ££label_my_array_get_1
      $my_array = $my_array_data_0
0051: return
:label_my_array_get_1
00D6: if 0
        $my_array_index == 1
004D: jump_if_false ££label_my_array_get_2
      $my_array = $my_array_data_1
0051: return
:label_my_array_get_2
0051: return
:label_my_array_set_0
00D6: if 0
        $my_array_index == 0
004D: jump_if_false ££label_my_array_get_1
      $my_array_data_0 = $my_array
0051: return
:label_my_array_set_1
00D6: if 0
        $my_array_index == 1
004D: jump_if_false ££label_my_array_get_2
      $my_array_data_1 = $my_array
0051: return
:label_my_array_set_2
0051: return
:label_my_code_1
0050: gosub ££label_my_array_get_0
// Get the data from the array at position $my_array_index.
// Do whatever with it.
$my_array += 1
0050: gosub ££label_my_array_get_1
$my_array += 1
0002: jump ££label_my_code_1

This method of array is still most notably used in PatrickW's Marina Carpark Mod.


:label
0006:  0@ =  10   //these are the values we want to return from the array
0051:  reutrn
0006:  0@ =  78   //the space that the 0006 and the 0051 opcodes take up in total is 9 bytes because:
0051:  return     //opcode(2 bytes) + ptype(1 byte) + var(2 bytes) + ptype(1 byte) + smallint(1 byte) + opcode(2 bytes) = 9
0006:  0@ =  36
0051:  return

<Here is where the code will start>
008B:  1@ = $index    //if we want the second value then $index = 1 (because for the first value $index = 0)
0012:  1@ *= 9        //9 * 1 = 9 (9 because the 0006 + 0051 opcodes take up 9 bytes in this case)
000A:  1@ +=  ££label //add the value of ££label to 1@
0050:  gosub 1@       //gosub to ££label + 9, so 0@ returns 78