Difference between revisions of "0050"

From GTAMods Wiki
Jump to navigation Jump to search
m
(code fixed to calculate proper offset programmatically)
Line 59: Line 59:
 
The following example functions similarly to the example code above. As you can see it is more complicated but its extensibility allows for large arrays with fewer lines of code.
 
The following example functions similarly to the example code above. As you can see it is more complicated but its extensibility allows for large arrays with fewer lines of code.
 
<syntaxhighlight lang="scm">
 
<syntaxhighlight lang="scm">
// set constants
 
 
const
 
const
 
PLAYER_CAR = 0@
 
PLAYER_CAR = 0@
 
COLOR_LABEL = 1@
 
COLOR_LABEL = 1@
 
CAR_MODEL = 2@
 
CAR_MODEL = 2@
 +
COLOR_ARRAY_ITEM_SIZE = 3@
 
end
 
end
 
   
 
   
COLOR_LABEL = @SET_COLOR // gets the position of label SET_COLOR
+
COLOR_LABEL = @SET_COLOR_ARRAY // gets the position of SET_COLOR_ARRAY
 
CAR_MODEL = #LINERUN  // initializes here so that this example works for III/VC/SA
 
CAR_MODEL = #LINERUN  // initializes here so that this example works for III/VC/SA
 +
COLOR_ARRAY_ITEM_SIZE = @SET_COLOR_ARRAY
 +
COLOR_ARRAY_ITEM_SIZE *= -1
 +
COLOR_ARRAY_ITEM_SIZE += @SET_COLOR_ITEM // holds correct offset for the next array item
 
while true
 
while true
 
     wait 10
 
     wait 10
Line 73: Line 76:
 
         CAR_MODEL > #SENTINEL // reached past upper limit
 
         CAR_MODEL > #SENTINEL // reached past upper limit
 
     then
 
     then
         COLOR_LABEL = @SET_COLOR // reset position of label to beginning
+
         COLOR_LABEL = @SET_COLOR_ARRAY // reset position of label to beginning
 
         CAR_MODEL = #LINERUN  // reset car model to beginning
 
         CAR_MODEL = #LINERUN  // reset car model to beginning
 
     end
 
     end
Line 82: Line 85:
 
         gosub COLOR_LABEL  // gosub to set color
 
         gosub COLOR_LABEL  // gosub to set color
 
     end
 
     end
     COLOR_LABEL += 11  // add 11 bytes to go to the next set color
+
      
    // 29 02 03 00 00 04 xx 04 xx 51 00, 11 bytes, is equivalent to
+
    005A: COLOR_LABEL += COLOR_ARRAY_ITEM_SIZE
    // 0229: PLAYER_CAR xx xx 0051: return
 
    // Note: Use "-11" instead of "11" if you are using this code in a CLEO script
 
 
     CAR_MODEL += 1  // increment car model ide number
 
     CAR_MODEL += 1  // increment car model ide number
 
end
 
end
 
   
 
   
:SET_COLOR
+
:SET_COLOR_ARRAY
 
0229: set_car PLAYER_CAR color_to 0 1
 
0229: set_car PLAYER_CAR color_to 0 1
 
return
 
return
 +
:SET_COLOR_ITEM
 
0229: set_car PLAYER_CAR color_to 10 11
 
0229: set_car PLAYER_CAR color_to 10 11
 
return                             
 
return                             

Revision as of 13:40, 2 January 2016

GTA III Vice City San Andreas GOSUB


Description

Gosub

Syntax

0050: gosub [int]
gosub [int]

Parameter

[int]
The position in the script it will jump to; can also be a label

This opcode allows the code to jump to a line anywhere in the script. Between that line and a RETURN (0051), this section acts like a simple subroutine. The subroutine is independent of the script that the GOSUB is located. When the code reaches a RETURN, it will jump back to where the GOSUB is located and continues from there. GOSUBs can help dramatically simply repetitive code, and can help make the code cleaner and easier to read for the user. GOSUBs can be nested within GOSUBs (like a Matryoshka doll) but there is a limit of up to 6 nested in each other. Nesting more will crash the game. GOSUBs are also important to the structure of missions.

Example

The following example, using Sanny Builder, will force a change to the colors of the specified vehicles.

// set constants
const
PRIM_COLOR = 0@
SECD_COLOR = 1@
PLAYER_CAR = 2@
end

while true
    wait 10
    if
        00DD:   actor $PLAYER_ACTOR driving_vehicle_type #LINERUN
    then
        PRIM_COLOR = 0
        SECD_COLOR = 1
        gosub @SET_COLOR
    end
    if
        00DD:   actor $PLAYER_ACTOR driving_vehicle_type #PEREN
    then
        PRIM_COLOR = 10
        SECD_COLOR = 11
        gosub @SET_COLOR
    end
    if
        00DD:   actor $PLAYER_ACTOR driving_vehicle_type #SENTINEL
    then
        PRIM_COLOR = 20
        SECD_COLOR = 21
        gosub @SET_COLOR
    end
end

:SET_COLOR
03C0: PLAYER_CAR = actor $PLAYER_ACTOR car 
0229: set_car PLAYER_CAR color_to PRIM_COLOR SECD_COLOR
return

Tricks

There are tricks one can use with GOSUB that Rockstar had never employed in their scripts.

Array

See also VC Arrays

The following example functions similarly to the example code above. As you can see it is more complicated but its extensibility allows for large arrays with fewer lines of code.

const
PLAYER_CAR = 0@
COLOR_LABEL = 1@
CAR_MODEL = 2@
COLOR_ARRAY_ITEM_SIZE = 3@
end
 
COLOR_LABEL = @SET_COLOR_ARRAY  // gets the position of SET_COLOR_ARRAY
CAR_MODEL = #LINERUN  // initializes here so that this example works for III/VC/SA
COLOR_ARRAY_ITEM_SIZE = @SET_COLOR_ARRAY
COLOR_ARRAY_ITEM_SIZE *= -1
COLOR_ARRAY_ITEM_SIZE += @SET_COLOR_ITEM // holds correct offset for the next array item
while true
    wait 10
    if
        CAR_MODEL > #SENTINEL // reached past upper limit
    then
        COLOR_LABEL = @SET_COLOR_ARRAY  // reset position of label to beginning
        CAR_MODEL = #LINERUN  // reset car model to beginning
    end
    if
        00DD:   actor $PLAYER_ACTOR driving_vehicle_type CAR_MODEL
    then
        03C0: PLAYER_CAR = actor $PLAYER_ACTOR car
        gosub COLOR_LABEL  // gosub to set color
    end
    
    005A: COLOR_LABEL += COLOR_ARRAY_ITEM_SIZE
    CAR_MODEL += 1  // increment car model ide number
end
 
:SET_COLOR_ARRAY
0229: set_car PLAYER_CAR color_to 0 1
return
:SET_COLOR_ITEM
0229: set_car PLAYER_CAR color_to 10 11
return                            
0229: set_car PLAYER_CAR color_to 20 21
return