You are on page 1of 21

BW's GTA VC Mission Builder version v1.

3
---------------------------------------------------------------
1 What you get
1.1 Legal stuff
1.2 Included files
1.2.1 My codecreator
1.2.2 My GTA VC GXT editor
1.2.3 Source codes
1.2.4 Stripped mission scripts
1.2.5 List of opcodes
1.3 Version info
2 Installation
2.1 Starting the mission builder
3 The IDE
3.1 Buttons and menues
3.1.1 The F1 key
3.2 Working with files
4 Mission coding
4.1 Definitions used in this readme
4.2 The mission script
4.2.1 The segments
4.2.2 The MAIN part of the mission script
4.2.3 The MISSION part of the mission script
4.3 Data types
4.3.1 Floating-point numbers
4.4 Local variables
4.5 Global variables
4.6 Equates
4.7 Arrays
4.8 Mathematical coding
4.8.1 Setting variables
4.8.2 Addition
4.8.3 Subtraction
4.8.4 Division
4.8.5 Multiplication
4.9 Conditional coding
4.10 Conditional math coding
4.10.1 Checking the value of variables
4.10.2 Using the NOT operator
4.11 Setting the data type of operations
4.12 Jump instructions
4.12.1 Using variables in jump instructions
4.13 Writing a mission script from scratch
4.14 Writing a mission from scratch
4.15 Rules that must be followed when coding
4.15.1 wait codes
4.15.2 create_thread commands
4.15.3 Requesting models
4.16 Practical Issues
5 Mission coding for newbies and retards :p
6 Support
7 Changes

------------------
1 What you get
1.1 Legal stuff
I take no responsibility for any persons use of the
mission builder in any way. Use it at your own risk.
Since this mission builder is based on others work and
since those other people made some rules about what their
work could be used for, I included some information about
that in the STUFF folder. You should read through these
files since some of them have some useful information
about using the IDE.

1.2 Included files


1.2.1 My codecreator
Use my CodeCreator program to get the world coordinates
of Tommy (or the player) in the game. More information
about the codecreator can be found in the readme file
for it.

1.2.2 My GTA VC GXT editor


Use my GTA VC GXT editor to modify the texts showing up
in the game. More info in its readme file.

1.2.3 Source codes


Source codes for mission mods and a discontinued
delivery man mission is included.

1.2.4 Stripped mission scripts


Stripped mission scripts are included. Use these to build
mission mods and missions on.

1.2.5 List of opcodes


The OPCODES.TXT file has most of the opcodes used in the
mission script. Some math opcodes are not included. It is
in alphabetical order.

1.3 Version info


This version is directly compatible with version 1.2.
Source codes from version 1.0 and 1.1 can't
be converted because of a bug in the decompiler in those
versions of the Mission Builder. Any source codes from
version 0.13 to version 0.22 can be converted to version
1.3 (this version)

---------------------------------------------------------------
2 Installation
Unzip to anywhere. Run 'ViceBuilder13.exe'. The first time
you run the program, you must specify where you installed Gta Vice.
NOTE! If you get an arrow with that hour-glass, you can still
use the arrow to set up the mission builder.

2.1 Starting the mission builder


Run 'ViceBuilder13.exe'.
-----------------------------------
3 The IDE
3.1 Buttons and menues
The menues and buttons should to some extent explain
themselves. The button that looks like 'open multiple files'
does something completely different - it disables global
variable names set in the 'vicescm.ini' file when decompiling.

3.1.1 The F1 key


Press F1 to find opcodes and parameters for commands.
Example, if you write:
end_thread

and press the F1 key, the line changes to:


004E: end_thread

This feature is pretty complex. It is based on 3 different


files that are loaded when the mission builder loads. It
searches for word matches. You can combine words by putting
and underscore between them. The above example searches for
the exact match "end thread" (or "end_thread") only. If you
just write:
thread

and press the F1 key, every time you press F1, you get another
match. When you press F1 on lines that doesn't have any
underscores at all, the result doesn't include any either.
With "thread", you get one of these:
00D7: create thread with wasted busted check ££Label011C74
004F: create thread ££Label0091D0
004E: end thread
03A4: name thread "MAIN"

Another example, you want to know what opcodes are used with
"create_actor". Every time you press F1, the line toggles
between these commands:
0129: $912 = create_actor 8 #HNB in_car $94C driverseat
01C8: $8F5 = create_actor 10 #CLB in_car $8F8 passenger_seat 0
009A: $2D3 = create_actor 4 #PGA at 10@ 11@ 12@

This version also allows you to search for keywords and logic
synonyms to keywords. Some of these keywords match keywords
used in GTAMA. Some keywords have up to 5 synonyms.
The list is in the 'keywords.txt' file. The MB reads this
list, so if you want more synonyms, you can add them to this
file.
If you want to add keywords to this file, you must follow
these rules:
- Use letters and numbers only.
- Spaces and underscores are not allowed inside keywords.
- After the keyword, add a single space.
- After the space, add the opcode that the synonym is to
be linked with. The opcode must be in hexadecimal format
and always 4 letters (or numbers) long.

3.2 Working with files


To load a text file or a .scm file, use the file menu or press
the 'open file' icon. If you load a .scm file, this happends:
- The file will be decompiled. The window title shows the progress.
- A file with the extention .TXT will be created. If you load the
original main.scm file, a file called main.scm.txt will be created.
If you load a file called something.scm, a file called
something.scm.txt will be created.
- The file being created will be loaded into the mission builder as
a text file.
If you load any file other than a .scm file, this happends:
- The file gets loaded as a text file into the mission builder.
If you activate the RUN menu and select compile or just press the
compile icon, this happends:
- The selected text file loaded into the mission builder editor gets
compiled into a .scm (mission script) file.
- If the name of the text file is something.scm.txt, a mission script
file called something.scm will be generated. If the name of the
selected text file is something.txt, a mission script file called
something.txt.scm will be generated.

------------------------
4 Mission coding
4.1 Definitions used in this readme
In this readme, a mission script is either a compiled '.scm'
file or a text file containing script source code.
A segment is a chunk of compiled code. The term "script code"
or "code line" is any line of text looking like this:
03CB: set_camera 807.0 -937.0 36.5625
| | |
| | |
| | |
| | |_____ *3
| |
| |___________________________ *2
|
|______________________________________ *1

*1 This is an opcodes.
*2 This is the command string. This part is ignored by this
version of this mission builder (and any future versions).
*3 This is a number.

When the opcode is not specified, the code line is processed


either as a code line containing only math instructions or
as a code line containing a mix of conditional checks or
commands related to functions in the mission builders.
The term "math coding" is related to code lines where the
opcode is not specified and commands related to math codes
or conditional checks are used.

4.2 The mission script


4.2.1 The segments
In this readme, a compiled mission script has 4 segments.
Segment 1 is the mission script memory.
Segment 2 is a table of 3D objects. When I talk about
"second segment objects", I talk about these 3D objects.
Segment 3 is a table of mission pointers.
Segment 4 is where the script code starts.

4.2.2 The MAIN part of the mission script


The MAIN part of the mission script is where the script code
starts. In other words, in this readme, the MAIN part of the
code is where the 4th segment starts. To find the MAIN part of
the mission script in the original decompiled mission script,
look for a line like this:
;-------------MAIN---------------

4.2.3 The MISSION part of the mission script


The MISSION part of the mission script is where the MAIN part
of the mission script ends. To find the mission part of the
mission script in the original decompiled mission script, look
for a line like this:
;-------------Mission 0---------------

4.3 Data types


Data types are used to identify numbers and labels. This version of the
mission builder uses 5 different data types. Strings that appear in the
mission scripts are enclosed in quotes.
DATA TYPE MEANING
££ Used with global jump instructions to labels in the MAIN
part of the mission script.
£ Used with local jump instructions in missions to labels
in missions only.
@ Stores 16-bit numbers used with internal timers and local
variables. Variable 0 to 15 is not used as timers. The rest
of them are. These variables can be set using the
create_thread command like this (not tested):
create_thread <label> <parameter 1> <parameter 2>
$ Used with global variables.
# Used as equates. To find the numbers, look inside the
'default.ide' file.

4.3.1 Floating-point numbers


All floating point operations require numbers to be set up as floating
point numbers. To set a number to a floating-point number, make sure it has
a DOT in it. Valid floating-point numbers: 0.0 1.0 1.2 2.3
If a number is NOT set up as a floating-point number, it is automatically
set up as an integer number.

4.4 Local variables


Local variables are local to the threads or missions they are used in.
Variables 16@ and 17@ are used as internal timers. Their values are
increased or decreased internally. Their values can be set and read
using script code.
4.5 Global variables
Global variables are global to the entire mission script. They can be set
in the MAIN part of the mission script and used in the mission part of the
mission script by any mission. They all use 4 bytes of the mission script
memory regardless of what they contain. The mission builder automatically
allocates 4 bytes of the mission script memory for each global variable
used in the mission script. The total size of the mission script memory
is not set automatically in this version. Use the DEFINE MEMORY command
to set the total size of the mission script memory.

4.6 Equates
Equates are variables set up internally in the mission builder. When
the mission builder is loading, it reads the 'default.ide' file and
stores all the definitions it finds in that file into equates. This
means that if you want to create a car and you need the number of
the model name of that car, you just use the equate of that car
instead. Like: $CarModelNumber = #cheetah

4.7 Arrays
Use DEFINE ARRAY $<global variable> <size> <INTEGER|FLOAT>
to set up an array.
Use
$<global variable>_index = <index>
to set the index of the array.
Use SET_ARRAY $<global variable>
to set $<global variable><index> to $<global variable>
Use GET_ARRAY $<global variable>
to set $<global variable> to $<global variable><index>
For more information about arrays, look into
'Mission Mods\CrazyBikeTraffic.txt'

4.8 Mathematical coding (or math coding, see definitions)


4.8.1 Setting variables
To set a global variable to an integer value, use
$<global variable name> = <integer number>
To set a global variable to a floating-point value, use
$<global variable name> = <floating-point number>
See '4.3.1 Floating-point numbers' for more information
about floating-point numbers and integer numbers.
To copy a global variable containing a floating-point number
to another global variable, use
FLOAT $<global variable name> = $<global variable name>
To copy a global variable containing an integer number
to another global variable, use
INT $<global variable name> = $<global variable name>
or INTEGER $<global variable name> = $<global variable name>
Use the same method to copy local variables to global variables.

4.8.2 Addition
To add an integer number to a global variable, use
$<global variable name> += <integer number>
To add a floating-point number to a global variable, use
$<global variable name> += <floating-point number>
To add a global variable containing an integer value to
another global variable also containing an integer value, use
INT $<global variable name> += $<global variable name>
To add a global variable containing a floating-point value to
another global variable also containing a floating-point value, use
FLOAT $<global variable name> += $<global variable name>
Use the same method with local variables and any combinations
of global and local variables. See '4.3.1 Floating-point numbers'
for more information about floating-point numbers and integer numbers.

4.8.3 Subtraction
To subtract an integer number from a global variable, use
$<global variable name> -= <integer number>
To subtract a floating-point number from a global variable, use
$<global variable name> -= <floating-point number>
To subtract a global variable containing an integer value from
another global variable also containing an integer value, use
INT $<global variable name> -= $<global variable name>
To subtract a global variable containing a floating-point value from
another global variable also containing a floating-point value, use
FLOAT $<global variable name> -= $<global variable name>
Use the same method with local variables and any combinations
of global and local variables. See '4.3.1 Floating-point numbers'
for more information about floating-point numbers and integer numbers.

4.8.4 Division
To divide a global variable with an integer number, use
$<global variable name> /= <integer number>
To divide a global variable with a floating-point number, use
$<global variable name> /= <floating-point number>
To divide a global variable containing an integer value with
another global variable also containing an integer value, use
INT $<global variable name> /= $<global variable name>
To divide a global variable containing a floating-point value with
another global variable also containing a floating-point value, use
FLOAT $<global variable name> /= $<global variable name>
Use the same method with local variables and any combinations
of global and local variables. See '4.3.1 Floating-point numbers'
for more information about floating-point numbers and integer numbers.

4.8.5 Multiplication
To multiply a global variable with an integer number, use
$<global variable name> *= <integer number>
To multiply a global variable with a floating-point number, use
$<global variable name> *= <floating-point number>
To multiply a global variable containing an integer value with
another global variable also containing an integer value, use
INT $<global variable name> *= $<global variable name>
To multiply a global variable containing a floating-point value with
another global variable also containing a floating-point value, use
FLOAT $<global variable name> *= $<global variable name>
Use the same method with local variables and any combinations
of global and local variables. See '4.3.1 Floating-point numbers'
for more information about floating-point numbers and integer numbers.

4.9 Conditional coding


Example:
00D6: if 1
0038: $ONMISSION == 1
0038: $BUSTED_PICKUP_MADE_FLAG == 1
004D: jump_if_false ££Label008FCA
There are TWO conditional checks in this code. The first
conditional check checks if the player is currently on a mission.
The second conditional check checks if the $BUSTED_PICKUP_MADE_FLAG
variable is equal to 1.
The first line defines the NUMBER OF CONDITIONS to include in the
conditional check and if the checking is to be done in an INCLUSIVE
or EXCLUSIVE manner.
The example code uses INCLUSIVE checking. With INCLUSIVE checking,
the number in the first line is equal to the number of lines with
conditional checks MINUS 1. The BASIC programming language uses
the operand 'AND' for INCLUSIVE conditional checking.
With EXCLUSIVE checking, the number in the first line is equal to
the number of lines with conditional checks PLUSS 19. The BASIC
programming language uses the operand 'OR' for EXCLUSIVE conditional
checking.
This is the BASIC equivalent to the example code above:
IF $ONMISSION=1 AND $BUSTED_PICKUP_MADE_FLAG = 1 THEN
With EXCLUSIVE checking the code looks like this:
00D6: if 21
0038: $ONMISSION == 1
0038: $BUSTED_PICKUP_MADE_FLAG == 1
004D: jump_if_false ££Label008FCA
Two conditional checks + 19 for EXCLUSIVE checking = 21 in the first line.
This is the BASIC equivalent to the example code with EXCLUSIVE
checking:
IF $ONMISSION=1 OR $BUSTED_PICKUP_MADE_FLAG = 1 THEN
When all the conditional checks are checked, the result of all the
checks is controlled by the '004D: jump_if_false' opcode and
command. If the result is FALSE, the code "jumps" to the label
in the command. If the result is TRUE, the code following the
'004D: jump_if_false' opcode and command is executed.
See '4.12 Jump instructions' for more information about jump
instructions.

4.10 Conditional math coding (comparing variables to numbers and


other variables)
Please not that you can't use conditional math coding without
first using the IF command. See 4.9 Conditional coding for more
information.
4.10.1 Checking the value of variables
To check if a global variable is equal to a specific integer
number, use
$<global variable name> == <integer number>
To check if a global variable is bigger than a specific integer
number, use
$<global variable name> > <integer number>
To check if a global variable is smaller than a specific integer
number, swap the number with the variable, like
<integer number> > $<global variable name>
Use the same method with floating-point numbers.
You can also use the same method with the operator '>='
To check if a global variable is equal to a floating-point
number, use
$<global variable name> == <floating-point number>
See '4.3.1 Floating-point numbers' for more information
about floating-point numbers and integer numbers.
To check if a global variable containing a floating-point number
is equal to another global variable, use
FLOAT $<global variable name> == $<global variable name>
To check if a global variable containing an integer number
is equal to another global variable, use
INT $<global variable name> == $<global variable name>
or INTEGER $<global variable name> = $<global variable name>
Use the same method with the operator '>' or '>=' to check if
a variable is bigger than another variable, like:
00D6: if 0
FLOAT $MyVar >= 0@
004D: jump_if_false ...

4.10.2 Checking the value of variables using the NOT operator


To check if a global variable is NOT equal to a specific integer
number, use
NOT $<global variable name> == <integer number>
To check if a global variable is NOT bigger than a specific integer
number, use
NOT $<global variable name> > <integer number>
To check if a global variable is NOT smaller than a specific integer
number, swap the number with the variable, like
NOT <integer number> > $<global variable name>
Use the same method with floating-point numbers.
You can also use the same method with the operator '>='
To check if a global variable is NOT equal to a floating-point
number, use
NOT $<global variable name> == <floating-point number>
See '4.3.1 Floating-point numbers' for more information
about floating-point numbers and integer numbers.
To check if a global variable containing a floating-point number
is NOT equal to another global variable, use
FLOAT NOT $<global variable name> == $<global variable name>
To check if a global variable containing an integer number
is NOT equal to another global variable, use
INT NOT $<global variable name> == $<global variable name>
or
INTEGER NOT $<global variable name> = $<global variable name>
Use the same method with the operator '>' or '>=' to check if
a variable is NOT bigger than another variable, like:
00D6: if 0
FLOAT NOT $MyVar >= 0@
004D: jump_if_false ...

4.11 Setting the data type of operations


This part of the readme is for old users. It explains the
new feature about using INT and FLOAT.
Variables can hold integer values or floating-point values.
Sometimes, one set of opcodes is used with floating-point
operations and another set of opcodes is used with integer
operations. When doing math coding (see definition above),
it is sometimes necessary to specify the data type of
the operation. These are examples on how to specify the
data type of operations:
INT $test = $mycar
FLOAT $MyXvar = $MyOtherXVar
FLOAT $MyXvar += $AnotherXVar
INT $MyXvar = $SomeIntegerVariable
if
INT $MyXvar == $SomeIntegerVariable
jf ...

4.12 Jump instructions


All jump instructions (gosub, jump, jump_if_false, create_thread call and such)
use
labels. Labels are defined with a colon in the beginning of a line and reference
d
with the data type '£' or '££'. LOCAL jumps, meaning jump instructions used in m
issions
only to labels in missions only, use the data type '£' before the mission label.
GLOBAL
jumps, meaning jump instructions from both the MAIN part of the mission script a
nd from
the mission part of the mission script, use '££' as data type. GLOBAL jumps ALWA
YS
(except for the DEFINE MISSION command) jump to labels in the MAIN part of the m
ission
script.
There are lots of situations where some commands work and other do not.
Examples of WORKING jump instructions:
;----MAIN
...
:Label1
...
:Label2
...
0002: jump ££Label1
...
;---Mission 23
...
0050: gosub ££Label1
...
004F: create_thread ££Label2
0002: jump £Label3
...
:Label3
...

Examples of INCORRECT jump instructions:


;----MAIN
...
:Label1
...
:Label2
...
0002: jump £Label1 \\ WRONG. Use 0002: jump ££Label1
...
0002: jump ££Label3 \\ NOT ALLOWED. The only way to access mission code from MA
IN is to use '0417: start_mission <mission>'
...
;---Mission 23
...
0002: jump ££Label1 \\ NOT ALLOWED. Use '0050: gosub ££Label1' or '004F: creat
e_thread ££Label1'
0050: gosub ££Label3 \\ WRONG. Use 0050: gosub £Label3
...
004F: create_thread £Label3 \\ NOT ALLOWED. All threads must be in MAIN.
0002: jump ££Label3 \\ WRONG. Use 0002: jump £Label3
...
:Label3
...

4.12.1 Using variables in jump instructions


You can use variables with jump instructions. This is however NOT
recommended if you want your scm files to be readable if they are
decompiled by others. You can't just recompile decompiled files
using variables with jump instructions without first manually
changing the decompiled code. This goes for GTAMA and any other
mission editor available. To set up a global variable with a jump,
use a code like this:
0004: $<global variable> = <data type for local or global jump><label>
...
(any code to alter the global variable goes here)
...
0002: jump $<global variable>
A topic on GTAFORUMS shows how to do this with GTAMA.

4.13 Writing a mission script from scratch


In this mission builder, the user is responsible for
setting up the first, second and third segments correctly.
If you decompile a mission script, you never need to do
this yourself. See '1.2.4 Stripped mission scripts' to get
files to build on.
If you want to start a mission script from
scratch, do this:
1. Create a new text file.
2. On the top line, put:
DEFINE VERSION VICE <version>
without it, it can't compile.
3. Start the code with a jump code like:
0002: jump ££SecondSegment
4. Put
DEFINE MEMORY <bytes>
after that. The DEFINE MEMORY command is used to set up
the amount of memory to allocate for the mission script.
You have now defined the first segment.
5. Put a label at the start of the second segment, like this:
:SecondSegment
The start of the second segment is now at the 4th line of your
text file.
6. Put another jump instruction in there, like:
0002: jump ££ThirdSegment
7. Now, set up the second segment using DEFINE OBJECTS and the number
of objects to define after that, like:
DEFINE OBJECTS 186
8. To complete the second segment, use DEFINE OBJECT with the names
of ALL the objects needed after that, like:
DEFINE OBJECT (no name)
DEFINE OBJECT PLAYERSDOOR
DEFINE OBJECT FAKETARGET
(and all the rest of them. Note that the first object is not used,
so you can put your signature there.)
9. Put another label at the beginning of the third segment, like:
:ThirdSegment
10. Define the entry of the MAIN part of the code by using a jump
instruction here (at the start of the third segment), like:
0002: jump ££Main
11. The total number of mission pointers goes next. Use DEFINE MISSIONS
and the number of missions, like:
DEFINE MISSIONS 80
12. After that, set up labels for each missions by using DEFINE MISSION
<zero-based number of mission> AT <label> like this:
DEFINE MISSION 0 AT ££SomeNewMajorIntro
DEFINE MISSION 1 AT ££ANewMissionOrSomeThing
(and the rest of them)
13. Now, set up the MAIN part of the code. This is a pretty complex
and big thing. See the original decompiled mission script text
file for clues.
4.14 Writing a mission from scratch
To write a mission from scratch, copy this code and change
everything enclosed in < > .
VERY IMPORTANT!!! All this code goes into the MISSION part of the code.
;-------------Mission <mission number>---------------
:Mission<mission number>
0050: gosub £<label where the mission code starts>
00D6: if 0
0112: wasted_or_busted
004D: jump_if_false £<label for skipping the mission failure code>
0050: gosub £<label for mission failure code. Executed if player dies or gets ar
rested during the mission>
:<label for skipping the mission failure code>
0050: gosub £<label for the mission cleanup code>
004E: end_thread
:<label where the mission code starts>
0317: increment_mission_attempts
03A4: name_thread "<thread name>"
0004: $onmission = 1
0110: player $PLAYER_CHAR wanted_level = 0
:<Label for mission loop>
0001: wait 0 ms
0002: jump £<Label for mission loop>
:<label for mission failure code. Executed if player dies or gets arrested durin
g the mission>
00BA: text_styled "M_FAIL" 4000 ms 1 \\ MISSION FAILED!
0051: return
:<label for the mission cleanup code>
0004: $ONMISSION = 0
00D8: mission_cleanup
0051: return

When you have done that, change this line 'DEFINE MISSIONS <number of missions>'
and add this line 'DEFINE MISSION <mission number> AT ££Mission<mission number>'
.
Adding code in the MAIN part of the code for starting the new mission is also
a good idea :-)

4.15 Rules that must be followed when coding


Obviessly, when coding with non-math codes, each code line
must fit the definition of a code line in
'4.1 Definitions used in this readme'.
Lines can be remarked using ';' or '\\'.
Old saved games are not compatible with newer mission scripts.
This means you must ALWAYS start a new game after modifying
the mission script.

4.15.1 wait codes


You can't code without using wait command. If the script loops and the
loop doesn't have any wait codes, the game will crash. In the MAIN
part of the code, it is recommended that you use 250 or higher values
with the wait code. In the mission part of the code, use 0.

4.15.2 create_thread commands


Unless proven otherways, these are the rules:
- NEVER use the 'create_thread' command unless you actually want your
missions to run multiple mission codes simultaniously.
- When using 'create_thread <label>' the label and the code following
it must in the MAIN part of the code.
- The 'create_thread' command can be issued from both the MAIN part of
the code and the MISSION part of the code.
- In the original script, most of the threads started with the
'create_thread' command runs in a 'low-priority' manner. Use
the 'wait' command to set the priority of a thread.
Example:
0001: wait $DEFAULT_WAIT_TIME ms
When using '0001: wait $DEFAULT_WAIT_TIME ms', the priority is set with
a "wait-state" of 250 milliseconds.
- It might be possible to "overload" the mission script by running
a certain number of high priority threads simultaniously. If it is
possible, it might hurt the frame-rate or the time it takes to
load the scenery.

4.15.3 Requesting models


You can't create anything without loading the models for the stuff
you want to create. To load the model of something, use
0247: request_model #<model name>
When you request something, it isn't loaded instantly. To check if
the stuff you have requested has been loaded, use a loop like this:
:LoadStuff
00D6: if 0
8248: NOT model #<model name> available
004D: jump_if_false £StuffLoaded
0001: wait 0 ms
0002: jump £LoadStuff
:StuffLoaded

4.16 Practical Issues


Doing simple changes, speeding stuff up
- Have the builder and VC running at the same time.
- Press ESC in VC to exit to the main menu when you
want to change something.
- Press Alt-TAB to switch between the builder and VC.
- Use the same video resolution in the game and in your
windows "desktop"
- Use the 'Compile & Copy' feature in the builder to
compile.
- Start a new game in VC when changes has been made.
- Use the F1 key to find the opcodes.

You can create missions to run in a single- or multi-task manner.


To make a mission run in multiple tasks, use the 'create_thread'
or the 'create_thread_with_wasted_busted_check' command.

You should NEVER EVER remove lines with the DEFINE OBJECT command
because you must then change ALL the commands in the mission script
that access these objects by their numbers. If you need to add an
object, add it to the end of the list and then change the total
number of objects defined.

IF YOU THINK IT LOOKS UGLY, YOU CAN CHANGE IT.


All the commands in my mission builders can be changed.
Just change the 'vicescm.ini' file. Don't blame me if you
mess it up. Create a backup first.
With version 0.125 and later of the Vice mission builders,
you MUST put a space between the parameters in the
'vicescm.ini' file.

------------------
5 Mission coding for newbies and retards :p
You got the mission builder. Got it running yet ? If not, look into
'2 Installation' and '2.1 Starting the mission builder'.
When you got it running, read and learn all parts of this readme.
Learn it twice.
OK, that part done. Now, load up the Stripped_complete.txt file
from the 'Stripped scripts' directory. Can't find the 'Stripped
scripts' directory ? It's where you installed this mission builder.
You're reading this readme, so you just SHOULD know where it is.
OK, we got a script loaded. Now we need some coordinates. Load up
the readme to my 'codecreator'. It's in the 'CodeCreator' directory.
When you have read the readme to the codecreator, you know how to
get those coordinates.
Lets create a parked car. How ? You should not. You read this
readme didn't you ? This readme says: "write parked_car and press F1".
So, do that, and create a parked car. In case you don't get any
parked car, make sure you have found the
'014C: set_parked_car_generator $Car cars_to_generate_to 101'
and make sure it is set to generate 101 cars. Still no car ?
Did you start a new game or load a saved game ? You can't load a saved
game. If you still haven't got any car, read the lines below, it says
'6 Support'. That should do it. :-)
------------------
6 Support
Just go to
http://www.gtaforums.com for
for all the support you'll ever need.

My web sites:
http://home.c2i.net/barton49
http://home.no.net/barton57
http://home.no/bobby-stalefish/

-----------------------

7 Changes
Changes since v1.2:
- Keywords added to the opcode search function.

Changes since v1.1:


- Editing option 'Remark and unremark selected texts' added to IDE.
- Compiler almost twice as fast
- More detailed messages with the IF checking feature.
- Another bug in the decompiler introduced with v1.0 removed.
- Replaced support for \\ with ;;

Changes since v1.0:


- The CodeCreator wasn't compatible at all :( Fixed.
- When defining arrays bigger than 30 variables, wait codes
is inserted after every 30 variable checks.
- A bug in the decompiler has been fixed. Decompiler rewritten and
optimized. Thanks to masterwakelam for finding it (not really).
- INT and FLOAT added.

Changes since v0.22:


- Changed the description of opcode 0054, 00A0, 00AA and
01BB because it annoyed me.
- Added an option to disable the "compiling success"
messagebox because it annoyed me.
- Removed data types '?', '??', '&', '&&' and changed data
type for float operations to GTAMA syntax. ( .0 crap )
- Direct mission script memory access support removed.
- Added ARRAY support. 8-)
- Added my VC GXT editor. It was made to easily port texts
from GTA 1 to VC. It wasn't released earlier because of
some weird issues about texts not showing up in the game.
- Converter improved. More data is included in the
converted source codes. It can convert all source codes
from version 0.13 to this version.
- My code creator updated to better support GTAMA
floating-point numbers.
- All math codes now included in the "opcodes guessing
system" (TM)
- When coding without specifying the opcode in the
beginning of each line, the compiler no longer modifies
the source code.
- Built-in multi-line non-opcode commands no longer require
compiling twice.

Changes since v0.21:


- Added some opcodes. Less opcodes have to be typed in.
Fixed messagebox related to direct compiling so it
makes some sense. Fixed reported size of MAIN and biggest
mission in the messagebox. Number of decimal places to
be returned by the CodeCreator can be changed.

Changes since v0.14 Deluxe:


- When compiling and copying, if the source file and the
destination file is the same file, you get a messagebox
saying just that.
- If compiling fails, the file being compiled is deleted to
prevent people from decompile files that have not been
compiled completely.
- "Math coding" made easier. You don't need to specify what
opcodes to use when using commands related to
math coding like +, -, /=, *=, and conditional
opcodes like checking if an internal variable is equal to
a number or another internal variable.
- Global hotkey F6 in the CodeCreator changed to F4 because it
conflicted with the F6 key in the mission builder (not good :)
- Can't remember if I forgot something :p

Changes since v0.14:


- Map automod tool, converter and WAR mission 2nd edition.

Changes since v0.135:


- Opcodes never used and opcodes from gta 3 added. Thanks for
those CyQ and TBM2k (and everybody else complaining about
any lack of credits in this stupid readme).
- Converter added

Changes since v0.13:


- Easier to set up the IDE with <alt>+<enter>. Annoying dialog
box removed. Everything changed is automatically saved. No
point in asking about it.
- Opens last directory accessed when opening files.
- Mission script size details returned when compiling and
decompiling.
- Major cleanup. Almost all opcodes changed. Opcodes that return
handles has been changed to
<returned handle> = <function that created handle>.
Names of old opcodes changed, like init_parked_car_generator,
parked_car_generator cars_to_generate,
remove_references_to_actor (from cleanup_actor),
destroy_actor_instantly, destroy_actor_with_fade (actor fades
away like a ghost), remove_references_to_object (from
destroy_object), one of the put_car codes changed to
unknown_car drive_to_point.
- Some opcodes needed added info. Info added to decompiled files
to clear things up, like:
001C: 1584?? > 4728?? \\ integer values only
0024: 3008?? > 2996?? \\ floating-point values only
003A: 6068?? == 5688?? \\ integer values and handles
004F: create_thread ££Label010011 \\ Special rules for create_thread commands
.
0058: 2904?? += 3076?? \\ integer values
0059: 3060?? += 3064?? \\ floating-point values
0060: 3428?? -= 3440?? \\ integer values
0061: 3052?? -= 3092?? \\ floating-point values
0068: 2988?? *= 2924?? \\ integer values
0069: 3032?? *= 3032?? \\ floating-point values
0070: 15640?? /= 15876?? \\ integer values
0071: 27940?? /= 19456?? \\ floating-point values
0084: 2892?? = 2896?? \\ integer values and handles
0086: 3052?? = 3088?? \\ floating-point values only
- Other info added just for kicks:
00D7: create_thread_with_wasted_busted_check ££Label012DE1 \\ Special rules f
or create_thread commands. Read the readme.
01B1: give_player $PLAYER_CHAR weapon 17? 68? \\ Load the weapon model befo
re using this
01B2: actor 2892?? weapon = 23? ammo = 9999& \\ Load the weapon model bef
ore using this
01C2: remove_references_to_actor 2892?? \\ Like turning an actor into a rando
m pedestrian
01C4: remove_references_to_object 10768?? \\ This object will now disappear
when the player looks away
034F: destroy_actor_with_fade 4148?? \\ The actor fades away like a ghost
- Vice (and gta 3 I guess) opcodes for calculations added.

Changes since v0.125:


- It now always overwrite read-only files (usually without asking).
- Opcode 000E fixed. No more E-nn numbers.
- Other opcodes corrected / description added.
- Some bug fixes.
- Most parts of the ReadMe file has been updated.
- Added my Saved Games Manager (works with any games)

Changes since v0.12:


- Opcodes.txt, findopc.txt, findopc2.txt, F1 key re-enabled,
CreateFiles.exe (creates new Opcodes.txt, findopc.txt, findopc2.txt files)

Changes since v0.11:


- New format, compiler is now more than 3 times faster
than any earlier mission builders.

Changes since v0.1:


- Now compatible with the PC version (and still compatible with
the PS2 version).
- Added two new opcodes (used in the PC version only).

You might also like