

BW's GTA 3 Mission Builder version v5.0
---------------------------------------------------------------

1  What you get
1.1  Legal stuff
1.2  Included files
1.2.1  My codecreator
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




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

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.3  Source codes

No source codes in this version, except for the
'stripped.txt' file


1.2.4  Stripped mission scripts

One stripped mission script is included. Use it 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 was created from my GTA VC MB v1.3. It's the
only GTA 3 MB version using VC MB code format. It is not
compatible with any source codes made on any earlier version
of any editor. This version do not have a converter.

Note: If you're lucky or know what you're doing, you can
make some mods made for VC using the VC MB v1.3 work on
gta 3 using this version of the gta 3 MB.



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

2  Installation

Unzip to anywhere. Run 'GTA3Builder50.exe'. The first time
you run the program, you must specify where you installed Gta 3.

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 'GTA3Builder50.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 'scm.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 referenced
with the data type '' or ''. LOCAL jumps, meaning jump instructions used in missions
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 and from
the mission part of the mission script, use '' as data type. GLOBAL jumps ALWAYS
(except for the DEFINE MISSION command) jump to labels in the MAIN part of the mission
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 MAIN is to use '0417: start_mission <mission>'
...

;---Mission 23
...
0002: jump Label1   \\ NOT ALLOWED. Use '0050: gosub Label1' or '004F: create_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 <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 arrested 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 during 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 GTA 3 running at the same time.
- Press ESC in GTA 3 to exit to the main menu when you
  want to change something.
- Press Alt-TAB to switch between the builder and GTA 3.
- 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 GTA 3 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 'scm.ini' file. Don't blame me if you
mess it up. Create a backup first.

The format used in this version requires that the parameters
are separated by one or more spaces.



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


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.txt file.
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 know. 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/


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

