Difference between revisions of "AGI/Specifications/Logic"

Jump to navigation Jump to search
Wikify and fill in differences from SGML. Work complete
(Wikify and fill in differences from SGML. Work in Progress)
(Wikify and fill in differences from SGML. Work complete)
Line 305: Line 305:
From the AGDS documentation translated by Vassili Bykov, with additions/modifications by Claudio Matsuoka and XoXus (Last update 22 May 1999).
From the AGDS documentation translated by Vassili Bykov, with additions/modifications by Claudio Matsuoka and XoXus (Last update 22 May 1999).


<!-- XXXX -->
===Arithmetic commands===
===Arithmetic commands===


Line 330: Line 329:
:The value of variable vn is incremented by m (vm), i.e. vn = vn + m (vm).
:The value of variable vn is incremented by m (vm), i.e. vn = vn + m (vm).


:If the value is greater than 255 the result wraps over 0 (so 250 + 10 == 4). (Information by XoXus)
:If the value is greater than 255 the result wraps over 0 (so 250 + 10 == 4). ''(Information by XoXus)''


subn(n,m), subv(n,m)
subn(n,m), subv(n,m)
Line 336: Line 335:
:The value of vn is decremented by m (vm), i.e. vn = vn - m (vm).
:The value of vn is decremented by m (vm), i.e. vn = vn - m (vm).


:If the value is lesser than 0 the result wraps (so 1 - 2 == 255). (Information by XoXus)
:If the value is lesser than 0 the result wraps (so 1 - 2 == 255). ''(Information by XoXus)''


lindirectn(n,m)
lindirectn(n,m)


:Variable vi where i is the value of vn is assigned a value m, i.e. Var(vn) = m.
:Variable vi where ''i'' is the value of vn is assigned a value m, i.e. Var(vn) = m.


lindirectv(n,m)
lindirectv(n,m)


:Variable vi where i is the value of vn is assigned the value of vm, i.e. Var(vn) = vm.
:Variable vi where ''i'' is the value of vn is assigned the value of vm, i.e. Var(vn) = vm.


rindirect(n,m)
rindirect(n,m)


:Variable vn is assigned the value of vi where i is the value of vm, i.e. vn = Var(vm).
:Variable vn is assigned the value of vi where ''i'' is the value of vm, i.e. vn = Var(vm).


muln(n,m)
muln(n,m)
Line 373: Line 372:


:Variable vk is assigned a random value in the range between n and m. Now let us consider the commands changing flag values. Remember that a flag can only have a value 0 or 1.
:Variable vk is assigned a random value in the range between n and m. Now let us consider the commands changing flag values. Remember that a flag can only have a value 0 or 1.
===Flag commands===


set(n)
set(n)
Line 404: Line 405:
When the internal memory is full, the program has to be broken into parts which are loaded and unloaded as the story unfolds in the given room, or PICTURE, VIEW, and SOUND resources have to be manipulated using the commands below.
When the internal memory is full, the program has to be broken into parts which are loaded and unloaded as the story unfolds in the given room, or PICTURE, VIEW, and SOUND resources have to be manipulated using the commands below.


Remember that when a resource is unloaded, all resources loaded after it are also automatically unloaded!
Remember that when a resource is unloaded, all resources loaded after it are also automatically unloaded (in the Sierra interpreter).


load.logic(n)
load.logic(n)
Line 458: Line 459:
new.room command is one of the most powerful commands of the interpreter.
new.room command is one of the most powerful commands of the interpreter.


It is used to change algorithms of the object behaviour, props, etc. Automatic change of Ego coordinates imitates moving into a room adjacent to the edge of the initial one. (Sounds awkward but that's what it says. --VB)
It is used to change algorithms of the object behaviour, props, etc. Automatic change of Ego coordinates imitates moving into a room adjacent to the edge of the initial one. ''(Sounds awkward but that's what it says. --VB)''


The format of the command:
The format of the command:
Line 489: Line 490:
return
return


:This command returns control to the interpreter if it is executed in Logic(0), or to the command following the call command which called the current logic.
:This command returns control to the interpreter if it is executed in Logic(0), or to the command following the '''call''' command which called the current logic.
jump <label>
 
jump &lt;label&gt;


:This command unconditionally transfers control to a command starting after label label within the same logic.
:This command unconditionally transfers control to a command starting after label '''label''' within the same logic.


set.scan.start(), reset.scan.start()
set.scan.start(), reset.scan.start()


:Normally, when a logic is called using call command, execution begins at the first instruction. set.scan.start command sets the entry point at the command following it, while reset.scan.start returns the entry point to the beginning.
:Normally, when a logic is called using call command, execution begins at the first instruction. '''set.scan.start''' command sets the entry point at the command following it, while '''reset.scan.start''' returns the entry point to the beginning.


===Object control commands===
===Object control commands===
Line 503: Line 505:


* If an object priority is 0 it cannot cross an unconditional barrier (pixels with priority 0).
* If an object priority is 0 it cannot cross an unconditional barrier (pixels with priority 0).
* If an object priority is 15 and a command ignore.block has not been given to it, it cannot cross a conditional barrier (pixels with priority 1) and leave the block set using the block command.
* If an object priority is 15 and a command '''ignore.block''' has not been given to it, it cannot cross a conditional barrier (pixels with priority 1) and leave the block set using the block command.
* If an object has not been given ignore.horizon command, it cannot move above the horizon set using the set.horizon command.
* If an object has not been given '''ignore.horizon''' command, it cannot move above the horizon set using the '''set.horizon''' command.
* An object should follow the conditions set using object.on.water and object.on.land commands (see below).
* An object should follow the conditions set using '''object.on.water''' and '''object.on.land''' commands (see below).


Object number 0 is called Ego. It is different from others in that the player may move it around using the keyboard.
Object number 0 is called Ego. It is different from others in that the player may move it around using the keyboard.
Object description commands


animate.obj(n)
animate.obj(n)
Line 556: Line 557:
                 Loop    x  3  0  0  0  2  1  1  1
                 Loop    x  3  0  0  0  2  1  1  1


:x means that the current loop number is retained.</pre>
:x means that the current loop number is retained.


set.cel(n,m), set.cel.v(n,m)
set.cel(n,m), set.cel.v(n,m)
Line 584: Line 585:
release.priority(n)
release.priority(n)


:Turns on the automatic priority choice for the object n. The priority is set depending on the vertical coordinate of the object. This way, as an object moves down it approaches the viewer. See section Priority bands and control lines for a table of y coordinates and the associated priorities.
:Turns on the automatic priority choice for the object n. The priority is set depending on the vertical coordinate of the object. This way, as an object moves down it approaches the viewer. See [[AGI/Specifications/Overview#Priority section | Priority bands and control lines]] for a table of y coordinates and the associated priorities.


get.priority(n,m)
get.priority(n,m)
Line 596: Line 597:
draw(n)
draw(n)


:Object n is shown on the screen. The image uses the values of the loop and the cel in the VIEW resource associated with the object n (see set.view), as well as the priority and coordinates of the object. If a command start.cycling is also issued, a looped animation for object n is shown until stopped (for example, with stop.cycling).
:Object n is shown on the screen. The image uses the values of the loop and the cel in the VIEW resource associated with the object n (see '''set.view'''), as well as the priority and coordinates of the object. If a command '''start.cycling''' is also issued, a looped animation for object n is shown until stopped (for example, with '''stop.cycling''').


erase(n)
erase(n)
Line 638: Line 639:
===Object motion control commands===
===Object motion control commands===


The following commands can be given to the object included in the interpreter control list with animate.obj:
The following commands can be given to the object included in the interpreter control list with '''animate.obj''':


set.horizon(n)
set.horizon(n)


:Set the horizon to y = n.
:Set the horizon y coordinate to n.


ignore.horizon(n)
ignore.horizon(n)
Line 694: Line 695:
stop.motion(n)
stop.motion(n)


:Motion of object n is stopped. If n == 0, program.control is automatically executed.
:Motion of object n is stopped. If n == 0, '''program.control''' is automatically executed.


start.motion(n)
start.motion(n)
Line 710: Line 711:
move.obj(n,x,y,s,m), move.obj.v(n,x,y,s,m)
move.obj(n,x,y,s,m), move.obj.v(n,x,y,s,m)


:Object n is told to move to the point (x,y) (or vx, vy) by s pixels every step. When the destination is reached, fm is set to 1. If n == 0 (Ego), program.control is executed automatically.
:Object n is told to move to the point (x,y) (or vx, vy) by s pixels every step. When the destination is reached, fm is set to 1. If n == 0 (Ego), '''program.control''' is executed automatically.


follow.ego(n,s,m)
follow.ego(n,s,m)
Line 752: Line 753:
object.on.anything(n)
object.on.anything(n)


:Motion restrictions previously set on the object n with commands object.on.water or object.on.land are cancelled.
:Motion restrictions previously set on the object n with commands '''object.on.water''' or '''object.on.land''' are cancelled.


reposition(n,dx,dy)
reposition(n,dx,dy)
Line 780: Line 781:
distance(n,m,d)
distance(n,m,d)


:If both objects n and m are on the screen, then
:If both objects n and m are on the screen, then <syntax type="C++">vd = abs(x(n) - x(m)) + abs(y(n) - y(m))</syntax>, otherwise vd = 255.
 
<syntax type="C++">
    vd = abs(x(n) - x(m)) + abs(y(n) - y(m)),
</syntax>
 
:otherwise vd = 255.


===Inventory item management commands===
===Inventory item management commands===


OBJECT resources, stored in a separate file object, are most often used to represent inventory items. An item is a structure which consists of a one-byte field called room and a string of text, the item name.
OBJECT resources, stored in a separate file object, are most often used to represent inventory items. An item is a structure which consists of a one-byte field called room and a string of text (the member name).


If the room field of an item is 255, the item belongs to the player. Otherwise the item is considered to be in the room with the corresponding ID number.
If the room field of an item is 255, the item belongs to the player. Otherwise the item is considered to be in the room with the corresponding ID number.
Line 818: Line 813:
===Picture resource management commands===
===Picture resource management commands===


The following commands operate on PICTURE resources, loaded in the interpreter memory using load.pic:
The following commands operate on PICTURE resources, prepared using PM editor and loaded in the interpreter memory using '''load.pic''':


draw.pic(n)
draw.pic(n)
Line 882: Line 877:
print(n), print.v(n)
print(n), print.v(n)


:Opens a text window in the centre of the screen, where a message number n (or vn) from the messages field of the current LOGIC resource is displayed. Output mode is determined by f15 (see flag description). The message is a NULL-terminated string of text. In addition to letters, digits, and other symbols, the string may contain:
:Opens a text window in the centre of the screen, where a message number n (or vn) from the messages field of the current LOGIC resource is displayed. Output mode is determined by f15 (see [[AGI/Specifications/Internals#Flag | Flag description]]). The message is a NULL-terminated string of text. In addition to letters, digits, and other symbols, the string may contain:


:* Newline character (0x0A);
:* Newline character (0x0A);
Line 925: Line 920:
set.text.attribute(fg,bg)
set.text.attribute(fg,bg)


:Sets foreground and background colours for display, get.num and get.string commands.
:Sets foreground and background colours for display, '''get.num''' and '''get.string''' commands.


clear.lines(n,m,c)
clear.lines(n,m,c)
Line 975: Line 970:
set.game.id(n)
set.game.id(n)


:Message n is scanned by the interpreter and compared with its internal identifier. On mismatch, the program exits. For the AGDS interpreter the identifier is "TQ". See also section Game IDs.
:Message n is scanned by the interpreter and compared with its internal identifier. On mismatch, the program exits. For the AGDS interpreter the identifier is "TQ". See also [[AGI/Specifications/Internals#Game_IDs_and_loaders | section Game IDs and loaders]].


script.size(n)
script.size(n)
Line 1,039: Line 1,034:
:If f14 is set, a menu system is shown on the screen, allowing the user to choose an item. Whether an item with the code c has been chosen can be tested using a command controller(c), where c is the code assigned to the menu item.
:If f14 is set, a menu system is shown on the screen, allowing the user to choose an item. Whether an item with the code c has been chosen can be tested using a command controller(c), where c is the code assigned to the menu item.


===Logical commands===
===Logical test commands===
====Test commands====


The result of test command can be either TRUE or FALSE.
The result of test command can be either TRUE or FALSE.
Line 1,141: Line 1,135:
:Prints a message for the object vn in the format
:Prints a message for the object vn in the format


         Obj <n> x: <pos> y: <pos> pri: <priority> stepsize: <step size>.
         Obj &lt;n&gt; x: &lt;pos&gt; y: <pos> pri: <priority> stepsize: &lt;step size&gt;.


show.mem()
show.mem()
Line 1,202: Line 1,196:


:Switch RGB monitor into the graphics mode.
:Switch RGB monitor into the graphics mode.
upper.left()
upper.left()


Line 1,249: Line 1,244:
(Last updated: 31 August 1997).
(Last updated: 31 August 1997).


Some of you may know that ''The Official Book of King's Quest'' included three small fragments of AGI code for room 7 in the AGI version of KQ4. These fragments are given below along with the same fragments taken from the game itself. There are a few differences which is to be expected but generally the code is very similar. These examples show how the coder wrote the code and what it now looks like in the final product. I've included a few comments where some interesting observations can be seen.
Some of you may know that "The Official Book of King's Quest" included three small fragments of AGI code for room 7 in the AGI version of KQ4. These fragments are given below along with the same fragments taken from the game itself. There are a few differences which is to be expected but generally the code is very similar. These examples show how the coder wrote the code and what it now looks like in the final product. I've included a few comments where some interesting observations can be seen.
Animating the smoke
Animating the smoke


Navigation menu