Files of the program:
ATR3.exe - the program
ATR3.hlp - program help file
ATR3.cnt - program help contents - I like to refer to cnt files as "cunt files" :)))
ATR3.htm - this file, that is documentation
Updates.txt - text file about all the updates in new versions of the program
config.ats - ATR3 configuration file - see program help for more information
*.at3 - source robot files
*.atc - compiled robot files (something like locked robots in ATR2)
trobots.ico - icon file 1, originally supplied with ATR2, slightly modified
trobots1.ico - icon file 2, used for the registered file types (see ATR3 help file)
160 192 224 \ | / \ | / 128----+----0 / | \ / | \ 96 64 32
Some other important notes:
The CPU is like the usual CPU of a regular PC, it does all the counting and processing. The CPU works only on signed 16-bit integers. It operates at a speed of 5 cycles per gcycle.
All the registers are 16-bit signed integers. The robot has 6 registers named AX, BX, CX, DX, EX, FX. It also has a special register called Flags, which holds the results of compare and test operations. Flags is also a 16-bit value, but only the lower 3 bits are used for now.
Bit | Flag |
---|---|
0 | equal |
1 | less |
2 | greater |
Main Memory is the memory you can use for your data.
Its size is 1024 signed 16-bit integers.
Variables defined via the #VAR directive are stored at addresses 128-255.
The rest of the space is the heap - you can use it as you wish.
You address this memory by addresses 0 to 1023.
Program Memory is the memory where the program is stored. Generally you
shouldn't mess around with the values stored here.
It can be adressed by addresses 1024 to 4095.
Stack Memory is a LIFO stack. You can't address this memory directly, you can only push values into and pop values off the stack top. The stack is also used by subroutines for storing return addresses. For more details, see 6.6.2.
For Interrupts and I/O Ports, see 6.6.3. and 6.6.4.
The compiler doesn't care about uppercase, you can write any way you want.
The number of spaces between any words or numbers is also optional. TABs can also be used instead of spaces.
You can also leave any number of empty lines between the lines of code.
Numbers can be written in decimal or hexadecimal. The syntax of hexadecimal numbers is $hex_number, where hex_number consists of 0 - 9 and A - F.
In the syntax description, "{param}" means that "param" is optional.
//comment
Anything that comes after "//" on the current line is ignored by the compiler.
#directive_name {param1 param2}
Here is a list of directives:
#NAME name
This defines the name of the robot. The name can be any string, it shouldn't be very long though,
in order to be able to display it in the game.
If you want to have spaces inside the name of your robot, use the "_" character instead. The compiler will turn them into spaces.
Do not write spaces inside the name!
#COLOR color
This defines the color of your robot - hull and turret. The color parameter can
be a decimal number or hexadecimal, written like $BBGGRR, where BB, GG, RR are the intensities (0-255) of blue, green and red respectively.
I recommend the hex notation, it is more comprehensive.
#TCOLOR color
The parameter of this directive is the same as in the #COLOR directive.
This directive allows to assign an individual color to the robot's turret.
Note that if you use the #COLOR directive after #TCOLOR, #TCOLOR will have no effect.
#VAR varname
This directive is used to create variables. The created variable is a 16-bit signed integer.
It can be referred to in the program like "<varname>". For more details, see 6.6.2.
If you define more variables with the same name, you can only access the first declared one via the name.
Variables are stored in Main Memory, at addresses 128 - 255.
Note that you cannot have more than 128 variables with names, but you can
use more memory.
#EQUIP
param_name param_val1 {param_val2}
#EQUIP
This is probably the most important directive of ATR3. This construction is used to
equip your robot with all the devices it will be able to use in combat.
In the directive section of a robot, this construction can appear only ONE TIME, if it appears more times,
the robot will not compile. Also note that the equip section must end with a #EQUIP directive as well.
Here are all the parameters you can define, for a more detailed description of the devices, see 7..
#BEGIN
Marks the end of the directive section and the beginning of the program section.
The program section end is not noted - the program ends at the end of the robot file.
{@label_name} instruction {op1} {op2}
or alternatively for inline code
{@label_name} *n1 n2 n3
Important! Lines with labels must contain some instruction, or else the robot will not compile.
Also note that after label_name, no ":" or any other delimiter is used, except for one or more spaces!
Do not forget the basic rule - NO COMMAS!
In the inline version, n1, n2 and n3 are 16-bit signed integer numbers.
Instr | op1 | op2 | Time | Description |
---|---|---|---|---|
NOP | - | - | 1 | Does nothing |
MOV | rm | rmn | 1 | Copies op2 into op1 |
XCHG | rm | rm | 2 | Exchanges op1 and op2 |
ADD | rm | rmn | 1 | Adds op2 to op1, result in op1 |
SUB | rm | rmn | 1 | Subtracts op2 from op1, result in op1 |
MUL | rm | rmn | 10 | Multiplies op1 by op2, result in op1 |
DIV | rm | rmn | 10 | Divides op1 by op2, result in op1, if op2=0 then op1=0 |
INC | rm | - | 1 | Increments op1 by 1 |
DEC | rm | - | 1 | Decrements op1 by 1 |
NEG | rm | - | 1 | Does op1:=-op1 |
SHL | rm | rmn | 1 | Bit shift op1 op2-times to the left, result in op1 |
SHR | rm | rmn | 1 | Bit shift op1 op2-times to the right, result in op1 |
ROL | rm | rmn | 1 | Bit rotate op1 op2-times to the left, result in op1 |
ROR | rm | rmn | 1 | Bit rotate op1 op2-times to the right, result in op1 |
SAL | rm | rmn | 1 | Same as SHL |
SAR | rm | rmn | 1 | Same as SHR, except preserves bit 15 |
NOT | rm | - | 1 | Bitwise NOT of op1 |
AND | rm | rmn | 1 | Bitwise AND of op1 and op2, result in op1 |
OR | rm | rmn | 1 | Bitwise OR of op1 and op2, result in op1 |
XOR | rm | rmn | 1 | Bitwise XOR of op1 and op2, result in op1 |
TEST | rm | rmn | 1 | Bitwise AND op1 and op2, don't store result, just set equal flag if result is 0, zero out other flags |
CMP | rm | rmn | 1 | Compare op1 and op2, set all flags |
JMP | l | - | 0 | Jump to label op1 |
JE | l | - | 0 | Jump to label op1 if equal flag is 1 |
JNE | l | - | 0 | Jump to label op1 if equal flag is 0 |
JL | l | - | 0 | Jump to label op1 if less flag is 1 |
JLE | l | - | 0 | Jump to label op1 if less or equal flag is 1 |
JG | l | - | 0 | Jump to label op1 if greater flag is 1 |
JGE | l | - | 0 | Jump to label op1 if greater or equal flag is 1 |
LOOP | l | - | 1 | If CX is non-0 then jump to label op1 else proceed to next line |
PUSH | rmn | - | 1 | Push op1 on top of the stack |
POP | rm | - | 1 | Pop out top of the stack and store it in op1 |
IN | rmn | rmn | 3 | Take value from port op1 and strore it in op2 |
OUT | rmn | rmn | 3 | Send value in op2 to port op1 |
CALL | l | - | 1 | Push next line number on top of stack and jump to label op1 |
RET | - | - | 1 | Pop top value off of the stack and jump to line with that number |
INT | rmn | - | 1 | Call interrupt number op1 |
CLE | - | - | 0 | Clear equal flag |
STE | - | - | 0 | Set equal flag |
CLG | - | - | 0 | Clear greater flag |
STG | - | - | 0 | Set greater flag |
CLL | - | - | 0 | Clear less flag |
STL | - | - | 0 | Set less flag |
DLY | rmn | - | op1 | Equal to op1 NOPs |
SAXF | - | - | 1 | Store flags register in AX |
LAXF | - | - | 1 | Set flags register to value in AX |
LEX | lv | - | 7 | Set EX to address of op1 |
MSG | rmn | - | 0 | Send op1 as a message to the outer world |
Operand descriptions:
The Time number is in robot CPU cycles, not gcycles. 1 gcycle has 5 robot CPU cycles.
Some instructions take 0 cycles to execute. They however don't produce an infinite cycle, because if 20 such instructions are executed, the robot moves on to the next gcycle. This is an ingenious idea by Ed T. Toton III, used also in ATR2.
Another important note: if you use CALL, and then mess with the stack, be sure to get it back into the state just after the CALL instruction before you use RET, or teeeeeeeeerrrrrrrible things can happen :-))
Also note that if a robot encounters an error while executing its program, it will not move away from the line the error was encountered in, and it will execute that line over and over again, trying to get it right.
Also note that the program must include some kind of infinite loop in order to function correctly. Otherwise the program will come to line 1024 and stop there.
The MSG instruction can be used for debugging. It outputs any kind of operand to the outer world, that means that number appears on the robot combat simulator during a match.
Int | Name | Description |
---|---|---|
0 | Self Destruct | The robot immediately explodes |
1 | Reset | The robot clears its stack and registers and starts executing program from start |
2 | Reset Memory | The robot clears and zeroes out its RAM |
10 | Engine Int1 | - |
11 | Engine Int2 | - |
20 | Hull Int1 | - |
21 | Hull Int2 | - |
30 | Turret Int1 | - |
31 | Turret Int2 | - |
40 | Weapon Int1 | - |
41 | Weapon Int2 | - |
50 | Scanner Int1 | - |
51 | Scanner Int2 | - |
90 | Extension Int1 | - |
91 | Extension Int2 | - |
Very few of the device specific interrupts are implemented yet.
Port | Type | Name | Description |
---|---|---|---|
0 | I | Random Generator | Generates random numbers in the range of 0-32767 |
1 | I/O | Transponder | Robot ID, used by some tracking devices |
8 | I | Throttle | Current throttle setting, from -100 to 100 |
9 | I | Compass | Current robot heading, from 0 to 255 |
10 | O | Set Throttle | Set throttle to "value", "value" must be from -100 to 100, negative number means moving backwards |
11 | O | Turn Robot | Turn "value" aunits to the right, "value" can be any number, negative number means turn left |
12 | I | Desired Throttle | Throttle robot is trying to achieve, from -100 to 100 |
13 | I | Desired Turn | Number of aunits robot has to turn to achieve desired heading, any number |
16 | I/O | Engine Prop1 | - |
17 | I/O | Engine Prop2 | - |
20 | I/O | Collision Counter | Incremented by one on each collision with other robot or wall, can be set to any number |
21 | I | Hull State | Number of Hit Points remaining to death (0 = robot is dead) |
24 | I/O | Hull Prop1 | - |
25 | I/O | Hull Prop2 | - |
30 | I/O | Aim Turret | Get/Set turret relative heading (0 = front, 128 = back etc.), from 0 to 255 |
31 | O | Turn Turret | Cumulative turret turn (like port 11), any number |
32 | I | Absolute Turret | Turret absolute heading, from 0 to 255 |
33 | I/O | Turret Shift | If non-0, turret turns with robot, otherwise turret retains its heading |
36 | I/O | Turret Prop1 | - |
37 | I/O | Turret Prop2 | - |
40 | O | Fire Weapon | Fire active weapon with argument "value" |
41 | I/O | Active Weapon | Get/Set active weapon |
42 | I/O | Weapon Argument | Get/Set weapon argument |
43 | I | Weapon Ready Flag | If non-0, weapon is ready to deal damage |
44 | I | Weapon Reload | Amount of reload time remaining, 0 = reloaded |
45 | I | Weapon Ammo | Amount of ammo (or sometimes fuel) remaining |
48 | I/O | Weapon Prop1 | - (used for heat most of the time) |
49 | I/O | Weapon Prop2 | - |
50 | I | Scan | Perform a scan with active scanner, result is scan value 1 |
51 | I/O | Active Scanner | Get/Set active scanner |
52 | I/O | Scan Value/Property 1 | Get SV1 / Set SP1 |
53 | I/O | Scan Value/Property 2 | Get SV2 / Set SP2 |
54 | I/O | Scan Value/Property 3 | Get SV3 / Set SP3 |
57 | I/O | Scanner Prop1 | - |
58 | I/O | Scanner Prop2 | - |
90 | I/O | Extension Prop1 | - |
91 | I/O | Extension Prop2 | - |
Weapon/scanner ports each operate on the active weapon/scanner, set by port 41/51.
The active weapon/scanner is NOT set via the slot number! The weapon/scanner which appeared inside the #EQUIP directive as the first is weapon/scanner number 0, the next one is number 1 etc., of course provided that they obey the restrictions in 6.5. about the TURRET/WEAPON/SCANNER parameter.
Besides weapon/scanner Prop1 and Prop2, some of the common weapon/scanner ports are also device specific, for details see 7.
SC | W |
---|---|
1 | 100 |
2 | 200 |
3 | 300 |
4 | 400 |
If you try to equip more than the given limit, the robot will not compile.
Hulls without materials weigh nothing.
No hull type has Prop1, Prop2, Int1 or Int2 implemented.
If you don't choose a hull, then only a small box will cruise the arena. Its SC is 1, and it also is impossible to assign a material to it.
ID | Name | DP | RP | W |
---|---|---|---|---|
0 | Magnesium | 1600 | 13 | 3 |
1 | Asbest | 1800 | 17 | 5 |
2 | Aluminium | 1200 | 19 | 7 |
3 | Tin | 4000 | 12 | 9 |
4 | Zinc | 3500 | 16 | 11 |
5 | Lead | 8000 | 10 | 14 |
6 | Brass | 4600 | 22 | 16 |
7 | Titanium | 2700 | 40 | 18 |
8 | Copper | 6000 | 20 | 20 |
9 | Silver | 7500 | 18 | 22 |
10 | Iron | 4300 | 33 | 24 |
11 | Bronze | 5500 | 27 | 26 |
12 | Nickel | 5700 | 25 | 28 |
13 | Steel | 4200 | 36 | 30 |
14 | Gold | 9000 | 15 | 33 |
15 | Chrome | 3200 | 60 | 35 |
16 | Ni-Steel | 5000 | 46 | 39 |
17 | W-Steel | 5200 | 53 | 43 |
18 | Platinum | 9500 | 30 | 45 |
19 | Iridium | 10000 | 43 | 50 |
DP means damage points, that is the amount of damage a robot consisting of the material can take.
RP means resilience points. In most cases, when damage is dealt to the robot, the amount is decremented by RP percent of the amount and only the remaining amount is received by the robot.
W is the weight of the material. To obtain the real weight, multiply it by SC (bigger robot = more material).
If you don't assign a material to your robot, it will have DP 1 and RP 0, so one little bump is enough to destroy it.
ID | Name | MSPD | ACC | TRN | W |
---|---|---|---|---|---|
0 | ES111 | 1 | 1 | 1 | 8 |
1 | ES244 | 2 | 4 | 4 | 17 |
2 | ES266 | 2 | 6 | 6 | 28 |
3 | ES335 | 3 | 3 | 5 | 22 |
4 | ES353 | 3 | 5 | 3 | 20 |
5 | ES355 | 3 | 5 | 5 | 26 |
6 | ES422 | 4 | 2 | 2 | 13 |
7 | ES444 | 4 | 4 | 4 | 24 |
8 | ES466 | 4 | 6 | 6 | 32 |
9 | ES533 | 5 | 3 | 3 | 34 |
10 | ES535 | 5 | 3 | 5 | 38 |
11 | ES553 | 5 | 5 | 3 | 36 |
12 | ES622 | 6 | 2 | 2 | 30 |
13 | ES644 | 6 | 4 | 4 | 40 |
14 | ES777 | 7 | 7 | 7 | 48 |
MSPD is the maximum speed a robot can achieve using the engine, in units/gcycle.
ACC is the acceleration, in percent/gcycle.
TRN is the turn rate, in aunits/gcycle.
W is the weight, for the real weight, multiply it by SC (bigger robot = heavier engine).
No engine of the E-Series has Prop1, Prop2, Int1 or Int2 implemented.
If you don't assign an engine to your robot, it won't be able to move (unless another robot collides with it :-)) ).
ID | Name | Slots | Radius | W |
---|---|---|---|---|
0 | TS1 | 0 | 3 | 3 |
1 | TS2 | 0, 128 | 3 | 6 |
2 | TS3 | 0, 64, 192 | 3 | 9 |
3 | TS4 | 0, 64, 128, 192 | 3 | 12 |
4 | TS5 | 0, 64, 96, 160, 192 | 3 | 15 |
Slots are the numbers of slots available on the turret.
Radius is the base radius, in order to calculate the real turret radius, you have to add 2*(SC-1) to Radius.
W is the weight of the turret, the real weight is calculated by adding SC of the robot to W (bigger robot = heavier turret).
In the program you refer to the weapons and scanners on the turret not via their slots but rather via their numbers, which start from 0. Weapons/scanners are numbered by these numbers in the order of appearence inside the #EQUIP directive, provided that they obey the restrictions. During execution of the program, only one weapon and one scanner is the so called active weapon/scanner. All the weapon/scanner ports affect only the active weapon/scanner.
No turret of the T-Series has Prop1, Prop2, Int1 or Int2 implemented.
If you don't equip a turret, your robot will have no turret and will not be able to carry weapons and scanners.
Weapons can be divided into four categories.
Impact weapons use some sort of impact to damage an opponent. These can be e.g. hammers, pikes, saws, etc.
Shooter weapons shoot some projectiles, and those projectiles deal the damage. These are e.g. guns, cannons, lasers etc.
Single weapons attack only once, when you access port 40. These are hammers, guns etc.
Permanent weapons attack until you don't switch them off. For example saws, chainguns etc.
Weapons have quite a few common properties:
The weight of the weapons is the same for all size classes.
The Size property featured below has the format x1/x2.
x1 is the base size, to get the real size multiply it by 1+(1/2)*(SC-1).
x2 is the attack bonus size, to get the attack size, add x1 (after the multiplication above) and x2.
Maybe you'll find it good to know the distance where the robot does the damage, although that still isn't the actual
distance, that one is a little larger (it is exactly Real_Turret_Radius+x1*(1+(1/2)*(SC-1))+x2, see 7.4. what Real_Turret_Radius is).
For shooting weapons, size is the point where the projectile exits the barrel and enters the arena.
Well, here's the complete list with all the functions:
0: Pike
Just a regular pike. Access port 40 to attack, retracts automatically.
Type | Impact/Single |
Weight | 10 |
Reload | 10 |
Damage | 150 |
Size | 10/+30 |
1: DPike
This works just as a regular pike, only it does twice the damage.
Type | Impact/Single |
Weight | 25 |
Reload | 10 |
Damage | 2x150 |
Size | 10/+30 |
2: TPike
This works just as a regular pike, only it does three times the damage.
Type | Impact/Single |
Weight | 35 |
Reload | 10 |
Damage | 3x150 |
Size | 10/+30 |
3: Hammer
This is a little hammer, access port 40 to hit (or not), retracts automatically.
Type | Impact/Single |
Weight | 15 |
Reload | 16 |
Damage | 200 |
Size | 30/+0 |
4: BBat
The one and only baseball bat couldn't be missing here. Use it just like the hammer.
Type | Impact/Single |
Weight | 30 |
Reload | 20 |
Damage | 400 |
Size | 26/+0 |
5: Scissors
Cut a big hole into your opponent. Access port 40 to cut, opens automatically.
Type | Impact/Single |
Weight | 20 |
Reload | 20 |
Damage | 250 |
Size | 25/+0 |
6: Gun
This is the good old gun from ATR2, although it's slightly different.
Type | Shooter/Single | ||||||||||||
Weight | 20 | ||||||||||||
Reload | 0 | ||||||||||||
Ammo |
| ||||||||||||
Arg |
| ||||||||||||
Prop1 |
| ||||||||||||
Size | 15/+0 |
7: Cannon
This is a big baby, does a lot of damage, but has limited ammo.
Type | Shooter/Single | ||||||||||||
Weight | 30 | ||||||||||||
Reload | 50 | ||||||||||||
Ammo |
| ||||||||||||
Size | 13/+0 |
8: Laser
This can be pretty destructive, but also to its owner...
Type | Shooter/Single | ||||||||||||
Weight | 40 | ||||||||||||
Reload | 5 | ||||||||||||
Ammo |
| ||||||||||||
Arg |
| ||||||||||||
Prop1 |
| ||||||||||||
Size | 20/+0 |
9: Magic Wand
A funny little wand, with big destructive power! The ammo serves as a charge gauge.
Via the arg property you define the intensity of the shot. Recharges itself.
By each shot starts recharging from the beginning.
Type | Shooter/Single | ||||||||||||||
Weight | 35 | ||||||||||||||
Reload | 10 for recharging 1 ammo | ||||||||||||||
Ammo |
| ||||||||||||||
Arg |
| ||||||||||||||
Size | 20/+0 |
10: DGun
A double gun with limited ammo and optional fire modes.
Type | Shooter/Single | ||||||||||||
Weight | 25 | ||||||||||||
Reload | 20 (double mode), 10 (single mode) | ||||||||||||
Ammo |
| ||||||||||||
Prop1 |
| ||||||||||||
Size | 15/+0 |
11: SGun
This gun shoots 4 shots at a time, with angle corrections -3, -1, 1, 3.
Type | Shooter/Single | ||||||||||||
Weight | 27 | ||||||||||||
Reload | 20 | ||||||||||||
Ammo |
| ||||||||||||
Size | 15/+0 |
12: Pneumatic Rammer
A permanent weapon, access port 40 to start ramming and again to stop. Works with pressurized air.
Ammo property is used as a pressure gauge. Stops automatically if pressure is 0, then it needs to repressurize.
Once it stops it can start ramming again only on maximum pressure.
Type | Impact/Permanent | ||||||||
Weight | 16 | ||||||||
Reload | 2 (ramming frequency) | ||||||||
Ammo |
| ||||||||
Damage / ram | 20 | ||||||||
Size | 13/+15 |
13: Drill
Drill holes into your opponents with this. When it operates, it warms up, and at a critical value
it automatically stops working and has to cool down.
Type | Impact/Permanent | ||||||||
Weight | 20 | ||||||||
Reload | 4 (turn rate) | ||||||||
Prop1 |
| ||||||||
Damage / turn | 40 | ||||||||
Size | 14/+20 |
14: Circular Saw
This is a rotating circular saw. It gets hot just like the drill,
and at a critical heat it stops working and has to cool down.
Type | Impact/Permanent | ||||||||
Weight | 24 | ||||||||
Reload | 2 (turn rate) | ||||||||
Prop1 |
| ||||||||
Damage / turn | 50 | ||||||||
Size | 20/+15 |
15: Chain Saw
This is a chainsaw, just like the ones lumberjacks use, but specialized on metal.
It operates on gas (ammo property). If the gas is gone, it stops working for the rest of the match.
Gas is enough for 2000 gcycles non-stop sawing.
Type | Impact/Permanent | ||||||||
Weight | 28 | ||||||||
Reload | 2 (turn rate) | ||||||||
Ammo |
| ||||||||
Damage / turn | 60 | ||||||||
Size | 10/+20 |
16: Lawn Cutter
A nice weapon again, but also runs on gas (ammo property). If it runs out of gas, it acts just like the chainsaw.
Gas is enough for 3000 gcycles non-stop cutting.
Type | Impact/Permanent | ||||||||
Weight | 32 | ||||||||
Reload | 3 (turn rate) | ||||||||
Ammo |
| ||||||||
Damage / turn | 70 | ||||||||
Size | 15/+12 |
17: Shock Rod
Why not take the shock rods from the bastards using them on animals and mount them onto your robot?
This thing has a rechargable battery, which is recharged by an alternator only when you are moving
at at least 10% throttle, either forwards or backwards.
Type | Impact/Permanent | ||||||||||
Weight | 36 | ||||||||||
Reload | 5 (recharging 1 ammo, shock frequency) | ||||||||||
Ammo |
| ||||||||||
Damage / shock | 40 | ||||||||||
Size | 30/+0 |
18: Chain Gun
This chain gun is pretty fast, doesn't need any ammo, but it can kill you easily by overheating, so watch it!
Note that you'll be able to shoot faster with the regular gun, but this baby can fire 50 shots without damaging you.
Type | Shooter/Permanent | ||||||||||||
Weight | 30 | ||||||||||||
Reload | 2 (shooting frequency) | ||||||||||||
Ammo |
| ||||||||||||
Arg |
| ||||||||||||
Prop1 |
| ||||||||||||
Size | 20/+0 |
19: Kalasnikov
The world's most famous automatic gun on your robot! Needs ammo though. Ammo is provided
in cases of 40 shots. Prop1 tracks the shots left in the current case. Takes a long time to
exchange cases. If an ammo case is exhausted, it stops shooting and automatically reloads if any more ammo cases are left.
Type | Shooter/Permanent | ||||||||||||
Weight | 35 | ||||||||||||
Reload | 100 (exchange ammo case) | ||||||||||||
Ammo |
| ||||||||||||
Prop1 | shots left in current ammo case | ||||||||||||
Size | 16/+0 |
20: Mine Layer
This allows you to lay mines on the battlefield. You can carry only a limited number of mines.
You can vary the intensity of the laid mines - intensity classes 0-20. You can also extract and retract the
mine layer arm to be able to lay the mine as you want.
Type | Special | ||||||||||||
Weight | 25 | ||||||||||||
Reload | 10 | ||||||||||||
Ammo |
| ||||||||||||
Prop1 | arm extension 0-20 | ||||||||||||
Prop2 | mine level 0-20 | ||||||||||||
Size | 20/+Prop2 |
In the program you refer to the scanners on the turret not via their slots but rather via their numbers, which start from 0. Scanners are numbered by these numbers in the order of appearence inside the #EQUIP directive, provided that they obey the restrictions. During execution of the program, only one scanner is the so called active scanner. All the scanner ports affect only the active scanner.
As in weapons, weight remains constant no matter what SC the robot has.
Radars:
Radars scan the whole arena and return information about the nearest or the furthest robot in the match.
ID | Name | SV1 | SV2 | SV3 | W |
---|---|---|---|---|---|
0 | D-Radar | distance[units] / -1 | - | - | 25 |
1 | A-Radar | angle[aunits] / -1 | - | - | 70 |
2 | DA-Radar | distance[units] / -1 | angle[aunits] / -1 | - | 100 |
3 | DSH-Radar | distance[units] / -1 | target speed[units/10 cycles] / 30000 | target heading[aunits] / -1 | 35 |
4 | ASH-Radar | angle[aunits] / -1 | target speed[units/10 cycles] / 30000 | target heading[aunits] / -1 | 120 |
5 | T-Radar | transponder / owner transponder | - | - | 10 |
D-Radar is an equivalent of the radar in ATR2, A-Radar is something like the sonar.
Locators:
Locators return information about the nearest or the furthest robot with a certain transponder setting.
Use them to track down a concrete enemy robot and keep on its trail.
ID | Name | SV1 | SV2 | SV3 | W |
---|---|---|---|---|---|
6 | D-Locator | distance[units] / -1 | - | - | 20 |
7 | A-Locator | angle[aunits] / -1 | - | - | 70 |
8 | DA-Locator | distance[units] / -1 | angle[aunits] / -1 | - | 100 |
9 | DSH-Locator | distance[units] / -1 | target speed[units/10 cycles] / 30000 | target heading[aunits] / -1 | 30 |
10 | ASH-Locator | angle[aunits] / -1 | target speed[units/10 cycles] / 30000 | target heading[aunits] / -1 | 120 |
Arc-Scanners:
Arc-scanners are the most commonly used ones. They provide the most efficient way of tracking other robots.
They can be divided into fixed-arc and variable-arc scanners.
Variable-arc scanners are heavier than fixed-arc scanners.
Arc-scanners scan only inside a certain arc with some width and to some distance and return information about the nearest robot
inside the arc.
They have the following common properties, which can be set inside the #EQUIP directive:
Distance class (DC) - determines how far the scanner can see.
DC | Visibility[units] |
---|---|
1 | 200 |
2 | 400 |
3 | 600 |
Precision class (PC) - some arc-scanners return a precision number, which is useful in finding the exact
position of the target. 0 means right in front of the scanner, negative numbers mean that the target lies to the left and positive to the right.
PC | Precision value range |
---|---|
1 | -1 - +1 |
2 | -2 - +2 |
3 | -4 - +4 |
Maximum arc width (MW) - use this to determine the arc width (fixed-arc) or the maximum available arc width (variable-arc). The arc width is actually -MW - +MW, so it's double the defined MW. Therefore MW can be in the range of 0 and 64.
ID | Name | Arc-Kind | SV1 | SV2 | SV3 | W |
---|---|---|---|---|---|---|
11 | D-F-Arc | Fixed | distance[units] / -1 | - | - | 2+MW/4+5*(DC-1) |
12 | P-F-Arc | Fixed | precision / 256 | - | - | 5+MW/4+2*(DC-1)+12*(PC-1) |
13 | DP-F-Arc | Fixed | distance[units] / -1 | precision / 256 | - | 10+MW/4+7*(DC-1)+10*(PC-1) |
14 | DSH-F-Arc | Fixed | distance[units] / -1 | target speed[units/10 cycles] / 30000 | target heading[aunits] / -1 | 5+MW/4+7*(DC-1) |
15 | PSH-F-Arc | Fixed | distance[units] / -1 | target speed[units/10 cycles] / 30000 | target heading[aunits] / -1 | 8+MW/4+3*(DC-1)+14*(PC-1) |
16 | D-V-Arc | Variable | distance[units] / -1 | - | - | 12+MW/4+5*(DC-1) |
17 | P-V-Arc | Variable | precision / 256 | - | - | 15+MW/4+2*(DC-1)+12*(PC-1) |
18 | DP-V-Arc | Variable | distance[units] / -1 | precision / 256 | - | 20+MW/4+7*(DC-1)+10*(PC-1) |
19 | DSH-V-Arc | Variable | distance[units] / -1 | target speed[units/10 cycles] / 30000 | target heading[aunits] / -1 | 15+MW/4+7*(DC-1) |
20 | PSH-V-Arc | Variable | distance[units] / -1 | target speed[units/10 cycles] / 30000 | target heading[aunits] / -1 | 18+MW/4+3*(DC-1)+14*(PC-1) |
21 | T-Arc | Fixed | transponder /owner transponder | - | - | 5+MW/4+2*DC |
0: Wall Detector
This is a simple device, which tells you the distance and angle to the nearest wall.
Weight | 15 |
Prop1 | IN = perform scan and return distance[units] to nearest wall |
Prop2 | IN = angle to nearest wall from the last scan, doesn't perform a scan itself |
1: GPS
This little device is capable of memorizing one exact location and at any time returning your
distance and angle to the memorized position.
In the beginning, the location is (0,0).
Weight | 15 |
Prop1 | IN = return distance to saved location |
Prop2 | IN = return angle to saved location |
Int1 | save current robot position as the saved location |
2: Communication System
This system allows robots to send each other 16-bit signed integers. If you used ATR2, it is similar to the Com System featured there.
The comm system has a message queue where it recieves messages. The queue is a regular FIFO queue, capable of keeping 255 values.
If the queue is full, no more values are received until there's room again. Receiving a value removes that value off the queue.
The comm system operates at a frequency, which is a signed integer. Robots tuned to some frequency
don't recieve messages sent on a frequency other than their own.
Weight | 10 |
Prop1 | IN = receive and remove message from the queue (if queue is empty, returns 0) OUT = broadcast message to other robots with Comm Systems tuned to frequency Prop2 |
Prop2 | IN = returns current frequency OUT = set frequency to another value |
Int1 | empty the entire queue |
3: Energy Bomb
This is the first offensive extension. It deals damage to all robots nearer than 150 units.
The damage amount is 6*(150-distance) points, decremented by the corresponding RP bonus.
After each use this device has to reload 2000 gcycles.
Weight | 40 |
Prop1 | IN = returns remaining reload time in gcycles |
Int1 | activate (see description), works only if Prop1 = 0 |
The best way of solving problems concerning the game is emailing me. But before you do that, here are some tips what to do if your robot will not compile:
If you don't find out what the problem is, email me at 9bartelt@nw.fmph.uniba.sk.
AT-Robots, version 3 Copyright (c) 2002, Richard Bartelt
This software is freeware, and may be freely redistributed provided that it retains all the original files.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Richard Bartelt (Mio)
9bartelt@nw.fmph.uniba.sk
AT-Robots 3 Homepage - http://www.nw.fmph.uniba.sk/~9bartelt