Difference between revisions of "0050"

From GTAMods Wiki
Jump to navigation Jump to search
(Created page with "{{Icon|trilogy}} '''GOSUB''' <hr /> <onlyinclude>{{#ifeq:{{{transcludesection|opcode}}}|opcode| '''Description''' : Gosub '''Syntax''' : 0050: gosub [''int''] : gosub [''int''...")
 
Line 14: Line 14:
 
}}</onlyinclude>
 
}}</onlyinclude>
  
== Examples ==
+
== Example ==
 
The following example, using Sanny Builder, will force a change to the colors of the specified vehicles.
 
The following example, using Sanny Builder, will force a change to the colors of the specified vehicles.
 
<source lang="scm">
 
<source lang="scm">
Line 52: Line 52:
 
03C0: PLAYER_CAR = actor $PLAYER_ACTOR car  
 
03C0: PLAYER_CAR = actor $PLAYER_ACTOR car  
 
0229: set_car PLAYER_CAR color_to PRIM_COLOR SECD_COLOR
 
0229: set_car PLAYER_CAR color_to PRIM_COLOR SECD_COLOR
 +
return
 +
</source>
 +
 +
== Tricks ==
 +
There are tricks one can use that Rockstar had never employed in their scripts.
 +
=== Array ===
 +
:''See also [[VC Arrays]]''
 +
The following example functions similarly to the code above but is slightly slower due to the while loop. As you can see it is more complicated but can be the preferred method if the array becomes huge.
 +
<source lang="scm">
 +
// set constants
 +
const
 +
PLAYER_CAR = 0@
 +
COLOR_LABEL = 1@
 +
CAR_MODEL = 2@
 +
end
 +
 +
while true
 +
    wait 10
 +
    COLOR_LABEL = @SET_COLOR  // gets the position of label SET_COLOR
 +
    CAR_MODEL = #LINERUN  // so that this code works for III/VC/SA
 +
    while #SENTINEL >= CAR_MODEL  // while CAR_MODEL is LINERUN, PEREN, or SENTINEL
 +
        wait 0
 +
        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
 +
        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
 +
        // 0229: PLAYER_CAR xx xx 0051: return
 +
        CAR_MODEL += 1  // increment car model ide number
 +
 +
    end
 +
end
 +
 +
:SET_COLOR
 +
0229: set_car PLAYER_CAR color_to 0 1
 +
return
 +
0229: set_car PLAYER_CAR color_to 10 11
 +
return                           
 +
0229: set_car PLAYER_CAR color_to 20 21
 
return
 
return
 
</source>
 
</source>
  
 
[[Category:OpCodes]]
 
[[Category:OpCodes]]

Revision as of 21:26, 5 February 2012

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 secrion acts like a simple subroutine. The subroutine is independent of the thread 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.

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 that Rockstar had never employed in their scripts.

Array

See also VC Arrays

The following example functions similarly to the code above but is slightly slower due to the while loop. As you can see it is more complicated but can be the preferred method if the array becomes huge.

// set constants
const
PLAYER_CAR = 0@
COLOR_LABEL = 1@
CAR_MODEL = 2@
end

while true
    wait 10
    COLOR_LABEL = @SET_COLOR  // gets the position of label SET_COLOR
    CAR_MODEL = #LINERUN  // so that this code works for III/VC/SA
    while #SENTINEL >= CAR_MODEL  // while CAR_MODEL is LINERUN, PEREN, or SENTINEL
        wait 0
        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
        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
        // 0229: PLAYER_CAR xx xx 0051: return
        CAR_MODEL += 1  // increment car model ide number

    end
end

:SET_COLOR
0229: set_car PLAYER_CAR color_to 0 1
return
0229: set_car PLAYER_CAR color_to 10 11
return                            
0229: set_car PLAYER_CAR color_to 20 21
return