2,051
edits
Jestar jokin (talk | contribs) m (→Variants) |
m (behaviour -> behavior) |
||
(42 intermediate revisions by 2 users not shown) | |||
Line 8: | Line 8: | ||
|opcode||The instruction's opcode, with the appropriate bits set according to the parameters. | |opcode||The instruction's opcode, with the appropriate bits set according to the parameters. | ||
|- | |- | ||
|aux||An aux opcode that stores parameter bits and no other information. | |aux||An aux opcode that stores parameter bits and no other information. (the base aux opcode is usually $01, but can differ for each instruction) | ||
|- | |||
|sub-opcode||An aux opcode that indicates a specific function to perform (e.g. the "wait" instruction has sub-opcodes to "wait for message", "wait for actor" etc), as well as storing parameter bits if necessary. | |||
|- | |- | ||
|result||A result pointer. (A standard word pointer, always a LE word.) | |result||A result pointer. (A standard word pointer, always a LE word.) | ||
|- | |- | ||
|var||A variable pointer. Same as above, but is not written to. Because this is always a variable, the opcode is not affected like it would be with a normal parameter (described below). | |||
|var||A | |||
|- | |- | ||
|value[8]||An 8-bit constant (a byte). | |value[8]||An 8-bit constant (a byte). | ||
Line 24: | Line 24: | ||
|value[p16]||A 16-bit parameter. This is always encoded as a word LE, and may be a pointer or constant. | |value[p16]||A 16-bit parameter. This is always encoded as a word LE, and may be a pointer or constant. | ||
|- | |- | ||
|value[v16]||A variable number of word LE parameters. These are encoded as a sequence of aux[8] param[p16]; param; aux contains the parameter bit to describe param. A byte of $FF terminates the sequence. (actually always shown as "value[v16]...") | |value[v16]||A variable number of word LE parameters. These are encoded as a sequence of aux[8] param[p16]; param; aux contains the parameter bit to describe param (and is always $01, ignoring the parameter bits). A byte of $FF terminates the sequence. (actually always shown as "value[v16]...") | ||
|- | |- | ||
|value[o]||The offset word for parameter value. This is only encoded if needed, but always at the position indicated. If not specified, the offset word occurs immediately after the parameter. | |value[o]||The offset word for parameter value. This is only encoded if needed, but always at the position indicated. If not specified, the offset word occurs immediately after the parameter. | ||
Line 73: | Line 73: | ||
$0A | $0A | ||
$0B index[p8] value[p8] | $0B index[p8] value[p8] | ||
$0C | $0C color[p8] | ||
$0D name[c]... $00 | $0D name[c]... $00 | ||
$0E initframe[p8] | $0E initframe[p8] | ||
Line 81: | Line 81: | ||
$13 zplane[p8] | $13 zplane[p8] | ||
$14 | $14 | ||
$15 animspeed[p8] | $15 | ||
$ | $16 animspeed[p8] | ||
$17 shadow[p8] | |||
===Operation=== | ===Operation=== | ||
Line 113: | Line 114: | ||
|$0A||SO_ANIMATION_DEFAULT||Initializes the actor's animation frames.<br>Init frame = 1<br>Walk frame = 2<br>Stand frame = 3<br>Talk start frame = 4<br>Talk stop frame = 5 | |$0A||SO_ANIMATION_DEFAULT||Initializes the actor's animation frames.<br>Init frame = 1<br>Walk frame = 2<br>Stand frame = 3<br>Talk start frame = 4<br>Talk stop frame = 5 | ||
|- | |- | ||
|$0B||SO_PALETTE||Sets the | |$0B||SO_PALETTE||Sets the color at the given index to a new value (another entry in the color lookup table/CLUT). Index must be between 0 and 31 (the number of colors in a costume). | ||
|- | |- | ||
|$0C||SO_TALK_COLOR||Sets the actor's talk | |$0C||SO_TALK_COLOR||Sets the actor's talk color. | ||
|- | |- | ||
|$0D||SO_ACTOR_NAME||Sets the actor's name to the given null-terminated string. | |$0D||SO_ACTOR_NAME||Sets the actor's name to the given null-terminated string. | ||
Line 133: | Line 134: | ||
|$15||SO_FOLLOW_BOXES||Follows boxes, turns off Z-clipping, and puts actor somewhere if the actor is in the current room? | |$15||SO_FOLLOW_BOXES||Follows boxes, turns off Z-clipping, and puts actor somewhere if the actor is in the current room? | ||
|- | |- | ||
|$16||SO_ANIMATION_SPEED||Sets the | |$16||SO_ANIMATION_SPEED||Sets the animation speed. | ||
|- | |- | ||
|$17||SO_SHADOW||Sets the shadow mode. | |$17||SO_SHADOW||Sets the shadow mode. | ||
Line 139: | Line 140: | ||
===Variants=== | ===Variants=== | ||
In SCUMM V4, sub-opcode $ | In SCUMM V3 and V4, the opcode values are slightly different. | ||
{| border="1" cellpadding="2" width=50% | |||
|- style="background:whitesmoke" | |||
|Opcode||Meaning | |||
|- | |||
|$00||dummy | |||
|- | |||
|$01||SO_COSTUME | |||
|- | |||
|$04||SO_STEP_DIST | |||
|- | |||
|$05||SO_SOUND | |||
|- | |||
|$06||SO_WALK_ANIMATION | |||
|- | |||
|$07||SO_TALK_ANIMATION | |||
|- | |||
|$08||SO_STAND_ANIMATION | |||
|- | |||
|$09||SO_ANIMATION | |||
|- | |||
|$0A||SO_DEFAULT | |||
|- | |||
|$0B||SO_ELEVATION | |||
|- | |||
|$0C||SO_ANIMATION_DEFAULT | |||
|- | |||
|$0D||SO_PALETTE | |||
|- | |||
|$0E||SO_TALK_COLOR | |||
|- | |||
|$0F||SO_ACTOR_NAME | |||
|- | |||
|$10||SO_INIT_ANIMATION | |||
|- | |||
|$12||SO_ACTOR_WIDTH | |||
|- | |||
|$13||SO_ACTOR_SCALE | |||
|- | |||
|$14||SO_IGNORE_BOXES | |||
|} | |||
Also in V3 and V4, sub-opcode $13 (SO_ACTOR_SCALE) only takes one parameter, so X and Y scaling is done at a 1:1 ratio. | |||
Line 217: | Line 261: | ||
$0C cursor[p8] | $0C cursor[p8] | ||
$0D charset[p8] | $0D charset[p8] | ||
$0E | $0E colors[v16]... | ||
===Operation=== | ===Operation=== | ||
Line 250: | Line 294: | ||
|$0D||SO_CHARSET_SET||Initializes the given character set. | |$0D||SO_CHARSET_SET||Initializes the given character set. | ||
|- | |- | ||
|$0E||SO_CHARSET_COLORS||Initializes the character set data & | |$0E||SO_CHARSET_COLORS||Initializes the character set data & colors to the given arguments? Must have 16 arguments? | ||
|} | |} | ||
===Variants=== | ===Variants=== | ||
In SCUMM V3, sub-opcode $0E performs a different function, | In SCUMM V3, sub-opcode $0E performs a different function, to load/initialize a character set. | ||
opcode $0E arg1[p8] arg2[p8] | |||
Line 298: | Line 344: | ||
==delayVariable ($ | ==delayVariable ($2B)== | ||
one constant parameter | one constant parameter | ||
Line 333: | Line 379: | ||
===Encoding=== | ===Encoding=== | ||
opcode left[p16] top[p16] auxopcode[8] right[p16] bottom[p16] | opcode left[p16] top[p16] auxopcode[8] right[p16] bottom[p16] color[p8] | ||
===Operation=== | ===Operation=== | ||
Draws a solid box on the backbuffer from (left, top) | Draws a solid box on the backbuffer from (left, top) to (right, bottom) in the given color. | ||
The only part of auxopcode that is relevant are the parameter bits. The rest of the opcode is ignored. | The only part of auxopcode that is relevant are the parameter bits. The rest of the opcode is ignored. However, the aux opcode's initial value is $05. | ||
Line 349: | Line 395: | ||
$01 xpos[p16] ypos[p16] | $01 xpos[p16] ypos[p16] | ||
$02 state[p16] | $02 state[p16] | ||
$ | $FF | ||
===Operation=== | ===Operation=== | ||
Line 360: | Line 406: | ||
|$02||Set State||Sets the state of the object, adds it to the drawing queue. | |$02||Set State||Sets the state of the object, adds it to the drawing queue. | ||
|- | |- | ||
|$ | |$FF||Draw||Does not change the object's position (or state?), still adds it to the drawing queue. | ||
|} | |} | ||
===Variants=== | ===Variants=== | ||
Small header games only support the parameters used with sub-opcode $01, e.g: | Small header games (v3 and v4) only support the parameters used with sub-opcode $01, e.g: | ||
opcode object[p16] xpos[p16] ypos[p16] | opcode object[p16] xpos[p16] ypos[p16] | ||
Accordingly, they have three parameter bits, and hence more possible opcodes. | |||
Line 553: | Line 600: | ||
===Operation=== | ===Operation=== | ||
Returns the actor's current X co-ordinate. | Returns the actor's current X co-ordinate. | ||
===Variants=== | |||
In Indy3, actor is only one byte. | |||
opcode result actor[p8] | |||
Line 562: | Line 613: | ||
===Operation=== | ===Operation=== | ||
Returns the actor's current Y co-ordinate. | Returns the actor's current Y co-ordinate. | ||
===Variants=== | |||
In Indy3, actor is only one byte. | |||
opcode result actor[p8] | |||
==getAnimCounter ($22)== | ==getAnimCounter ($22)== | ||
===Encoding=== | ===Encoding=== | ||
Line 572: | Line 626: | ||
===Operation=== | ===Operation=== | ||
Returns the actor's animation counter. | Returns the actor's animation counter. | ||
===Variants=== | |||
This opcode is used for saveLoadGame in SCUMM V3. | |||
Line 619: | Line 676: | ||
===Variants=== | ===Variants=== | ||
In small header games, the | In small header games, this opcode is used for the "ifState" instruction. | ||
Line 665: | Line 719: | ||
===Encoding=== | ===Encoding=== | ||
opcode value[p16] args[ | opcode value[p16] args[v16]... target[16] | ||
===Operation=== | ===Operation=== | ||
Line 673: | Line 727: | ||
Target is a byte offset (measured from after this instruction), which will be added to the instruction pointer. | Target is a byte offset (measured from after this instruction), which will be added to the instruction pointer. | ||
==ifNotState ($2F) (V3-4)== | |||
This opcode is not present in SCUMM V5. | |||
===Encoding=== | |||
opcode object[p16] state[p8] target[16] | |||
===Operation=== | |||
unless (getState(object) != state) goto target | |||
==ifState ($0F) (V3-4)== | |||
This opcode is not present in SCUMM V5. | |||
===Encoding=== | |||
opcode object[p16] state[p8] target[16] | |||
===Operation=== | |||
unless (getState(object) == state) goto target | |||
Line 880: | Line 954: | ||
==oldRoomEffect ($5C)== | ==oldRoomEffect ($5C) (V3-4)== | ||
This opcode/instruction not present in SCUMM V5. | |||
===Encoding=== | ===Encoding=== | ||
Line 887: | Line 962: | ||
sub-opcodes: | sub-opcodes: | ||
$03 effect[p16] | $03 effect[p16] | ||
$?? effect[p16] | |||
===Operation=== | ===Operation=== | ||
Performs like sub-opcode SO_ROOM_FADE of the roomOps instruction (fade in if effect != 0, otherwise fade out). | Performs like sub-opcode SO_ROOM_FADE of the roomOps instruction (fade in if effect != 0, otherwise fade out). | ||
This information may not be correct; descumm says if the sub-opcode is 3, to "set" the effect, but if the sub-opcode is anything else to fade in with the given effect. | |||
===Variants=== | ===Variants=== | ||
Line 917: | Line 995: | ||
===Operation=== | ===Operation=== | ||
If the sub-opcode is 0, marks the end of an override section. | If the sub-opcode is 0, marks the end of an override section.<br> | ||
If the sub-opcode is not 0, marks the beginning of an override section. | If the sub-opcode is not 0, marks the beginning of an override section. The instruction is immediately followed by a "jumpRelative" instruction.<br> | ||
Overrides are used by cutscenes; if a cutscene is skipped (if the user presses the ESC key), the script will jump by the given target (offset from | Overrides are used by cutscenes; if a cutscene is skipped (if the user presses the ESC key), the script will jump by the given target (offset from the beginOverride instruction). | ||
Line 931: | Line 1,009: | ||
==pickupObject ($25)== | ==pickupObject ($25) (v5)== | ||
This instruction is only present in SCUMM V5. | |||
===Encoding=== | ===Encoding=== | ||
Line 943: | Line 1,022: | ||
== | ==pickupObject ($50) (V3-4)== | ||
This opcode/instruction is not present in SCUMM V5. | |||
===Encoding=== | ===Encoding=== | ||
Line 959: | Line 1,039: | ||
sub-opcodes | sub-opcodes | ||
$00 xpos[p16] ypos[p16] | $00 xpos[p16] ypos[p16] | ||
$01 | $01 color[p8] | ||
$02 right[p16] | $02 right[p16] | ||
$03 width[p16] height[p16] | $03 width[p16] height[p16] | ||
Line 966: | Line 1,046: | ||
$07 | $07 | ||
$08 offset[p16] delay[p16] | $08 offset[p16] delay[p16] | ||
$ | $0F string[c]... $FF | ||
===Operation=== | ===Operation=== | ||
Line 977: | Line 1,057: | ||
|$00||SO_AT||Sets the position of the text that follows. | |$00||SO_AT||Sets the position of the text that follows. | ||
|- | |- | ||
|$01||SO_COLOR||Sets the | |$01||SO_COLOR||Sets the color of the text. | ||
|- | |- | ||
|$02||SO_CLIPPED||Clips the text's right-hand side (for wrapping?). | |$02||SO_CLIPPED||Clips the text's right-hand side (for wrapping?). | ||
Line 989: | Line 1,069: | ||
|$07||SO_OVERHEAD||Overhead-aligns the text. | |$07||SO_OVERHEAD||Overhead-aligns the text. | ||
|- | |- | ||
|$ | |$0F||SO_TEXTSTRING||Prints the text string that follows. Terminated by $FF. | ||
|} | |} | ||
Line 1,003: | Line 1,083: | ||
===Encoding=== | ===Encoding=== | ||
opcode | opcode sub-opcode | ||
===Operation=== | ===Operation=== | ||
Exactly the same as print, except the actor is implicitly Ego. | Exactly the same as print, except the actor is implicitly Ego. See the entry for "print" for further explanation. | ||
Line 1,022: | Line 1,102: | ||
What does this actually do? We may never know. | What does this actually do? We may never know. | ||
It looks like res values always have the high bit set, e.g. 0x01 becomes 0x81. | |||
==putActor ($01)== | ==putActor ($01)== | ||
Line 1,057: | Line 1,140: | ||
sub-opcodes: | sub-opcodes: | ||
$01 resID[p8] | $01 resID[p8] | ||
... $01 through $ | ... $01 through $10 take the same arguments ... | ||
$10 resID[p8] | |||
$11 | |||
$12 resID[p8] | |||
$13 resID[p8] | $13 resID[p8] | ||
$14 room[p8] object[p16] | $14 room[p8] object[p16] | ||
Line 1,127: | Line 1,213: | ||
== | ==roomOps ($33)== | ||
===Encoding=== | ===Encoding=== | ||
Line 1,138: | Line 1,224: | ||
$05 | $05 | ||
$06 | $06 | ||
$07 scale1[p8] y1[p8] scale2[p8] y2[p8] slot[p8] | $07 scale1[p8] y1[p8] aux scale2[p8] y2[p8] aux slot[p8] | ||
$08 scale[p8] | $08 scale[p8] startcolor[p8] endcolor[p8] | ||
$09 loadflag[p8] loadslot[p8] | $09 loadflag[p8] loadslot[p8] | ||
$0A effect[p16] | $0A effect[p16] | ||
$0B redscale[p16] | $0B redscale[p16] greenscale[p16] bluescale[p16] aux startcolor[p8] endcolor[p8] | ||
$0C redscale[p16] | $0C redscale[p16] greenscale[p16] bluescale[p16] aux startcolor[p8] endcolor[p8] | ||
$0D resID[p8] filename[c]... $00 | $0D resID[p8] filename[c]... $00 | ||
$0E resID[p8] filename[c]... $00 | $0E resID[p8] filename[c]... $00 | ||
Line 1,158: | Line 1,244: | ||
|$03||SO_ROOM_SCREEN||Initialises a screen. | |$03||SO_ROOM_SCREEN||Initialises a screen. | ||
|- | |- | ||
|$04||SO_ROOM_PALETTE||Adjusts the room's palette. | |$04||SO_ROOM_PALETTE||Adjusts the room's palette. Aux opcode's initial value is $04. | ||
|- | |- | ||
|$05||SO_ROOM_SHAKE_ON||Starts the room shaking. | |$05||SO_ROOM_SHAKE_ON||Starts the room shaking. | ||
Line 1,170: | Line 1,256: | ||
|$09||SO_ROOM_SAVEGAME||Saves temporary state of the room/game? | |$09||SO_ROOM_SAVEGAME||Saves temporary state of the room/game? | ||
|- | |- | ||
|$0A||SO_ROOM_FADE||If effect is 0, fades in the room. Otherwise, fades out with the given effect (taken from the high byte of effect).<br>1 = iris effect<br>2 = box wipe ( | |$0A||SO_ROOM_FADE||If effect is 0, fades in the room. Otherwise, fades out with the given effect (taken from the high byte of effect).<br>1 = iris effect<br>2 = box wipe (upper-left to bottom-right)<br>3 = box wipe (upper-right to bottem-left)<br>4 = inverse box wipe. | ||
|- | |- | ||
|$0B||SO_RGB_ROOM_INTENSITY||Lightens/darkens the room's palette, with different scales for red, green and blue. | |$0B||SO_RGB_ROOM_INTENSITY||Lightens/darkens the room's palette, with different scales for red, green and blue. Aux opcode's initial value is $0B. | ||
|- | |- | ||
|$0C||SO_ROOM_SHADOW||Lightens/darkens the shadow palette, with different scales for red, green, and blue. | |$0C||SO_ROOM_SHADOW||Lightens/darkens the shadow palette, with different scales for red, green, and blue. | ||
Line 1,182: | Line 1,268: | ||
|$0F||SO_ROOM_TRANSFORM||Manipulates palettes, strings? | |$0F||SO_ROOM_TRANSFORM||Manipulates palettes, strings? | ||
|- | |- | ||
|$10||SO_CYCLE_SPEED||Starts | |$10||SO_CYCLE_SPEED||Starts color cycling with delay? colIndex is between 0 and 16 | ||
|} | |} | ||
Line 1,189: | Line 1,275: | ||
opcode arg1[p16] arg2[p16] sub-opcode | opcode arg1[p16] arg2[p16] sub-opcode | ||
Small header games include an extra sub-opcode, $02 (SO_ROOM_COLOR), which adjusts the room's palette: | Small header games (V3 and V4) include an extra sub-opcode, $02 (SO_ROOM_COLOR), which adjusts the room's palette: | ||
opcode $02 | opcode $02 color[p16] index[p16] | ||
... or for V3 games ... | ... or for V3 games ... | ||
opcode | opcode color[p16] index[p16] $02 | ||
In small header games, sub-opcode $04 (SO_ROOM_PALETTE) affects the shadow palette, and only accepts two arguments, a "room | In small header games, sub-opcode $04 (SO_ROOM_PALETTE) affects the shadow palette, and only accepts two arguments, a "room color slot" (palette entry? between 0 and 256) and an index: | ||
opcode $04 | opcode $04 color[p16] index[p16] | ||
... or for V3 games ... | ... or for V3 games ... | ||
opcode | opcode color[p16] index[p16] $04 | ||
In FM-Towns games, sub-opcode $0A performs a different function and has its own sub-opcodes (some unknown and all not yet implemented in ScummVM): | In FM-Towns games, sub-opcode $0A performs a different function and has its own sub-opcodes (some unknown and all not yet implemented in ScummVM): | ||
Line 1,235: | Line 1,321: | ||
|} | |} | ||
===Encoding=== | ==saveLoadGame ($22) (V3-4)== | ||
opcode | This instruction is not present in SCUMM V5; its opcode is used for "getAnimCounter". | ||
===Encoding=== | |||
opcode result arg1[p8] | |||
===Operation=== | ===Operation=== | ||
The slot is determined by taking the lower 5 bits of arg1. The upper 3 bits determine an aux opcode, that performs an action described in the table below. | |||
{| border="1" cellpadding="2" width=100% | {| border="1" cellpadding="2" width=100% | ||
|- style="background:whitesmoke" | |- style="background:whitesmoke" | ||
|Opcode||Meaning||Description | |Opcode||Meaning||Description | ||
|- | |- | ||
|$ | |$00||Num. Available Slots||Returns the number of save slots available. | ||
|- | |||
|$20||Drive||In V3, returns the type of drive (0 = ???, 1 = A or B [floppy], 2 = hard drive).<br>In V4, sets the current drive (returns 1). | |||
|- | |||
|$40||Load Game||Loads a game from the given slot (returns 3 if successful, 5 otherwise). | |||
|- | |- | ||
|$ | |$80||Save Game||Saves a game to the given slot (returns 0 if successful, 2 otherwise). | ||
|- | |- | ||
|$ | |$C0||Test For Game||Tests if a save exists in the given slot (returns 6 if so, 7 otherwise). | ||
|} | |} | ||
== | ==saveLoadVars ($A7) (V3-4)== | ||
This instruction is not present in SCUMM V5; its opcode is used as a dummy. | |||
===Encoding=== | ===Encoding=== | ||
opcode | opcode sub-opcode | ||
sub-opcodes: | |||
$01 sub-sub-opcode... $00 | |||
$02 sub-sub-opcode... $00 | |||
$01 (save) sub-sub-opcodes: | |||
$01 resultA resultB | |||
$02 arg1[p8] arg2[p8] | |||
$03 filename[c]... $00 | |||
$04 | |||
$1F | |||
==setObjectName ($54)== | $02 (load) sub-sub-opcodes: | ||
$01 resultA resultB | |||
===Encoding=== | $02 arg1[p8] arg2[p8] | ||
opcode object[p16] | $03 filename[c]... $00 | ||
$04 | |||
===Operation=== | $1F | ||
Sets the given object's name | |||
===Operation=== | |||
{| border="1" cellpadding="2" width=100% | |||
==setOwnerOf ($29)== | |- style="background:whitesmoke" | ||
|Opcode||Meaning||Description | |||
===Encoding=== | |- | ||
opcode object[p16] owner[p8] | |$01||SO_SAVE_VARS||Saves variables (for saving games?) | ||
|- | |||
===Operation=== | |$02?||SO_RESTORE_VERBS||Loads variables (for saving games?)<br>(I have not verified that restore vars is $02, as the ScummVM code only compares to $01.) | ||
Sets the owner of the object. | |} | ||
{| border="1" cellpadding="2" width=100% | |||
==setState ($07)== | |- style="background:whitesmoke" | ||
|Opcode||Meaning||Description | |||
|- | |||
opcode object[p16] state[p8] | |$01||Write Vars||Writes a range of variables. | ||
|- | |||
|$02||Write Strings||Writes a range of string variables. | |||
Sets the state of the object. | |- | ||
|$03||Open File||Opens a file for writing. | |||
|- | |||
==setVarRange ($26)== | |$04||Dummy||Does nothing. | ||
non-standard encoding | |- | ||
|$1F||Close File||Closes the last opened file. | |||
===Encoding=== | |} | ||
opcode result number[8] values[8]... | |||
or | {| border="1" cellpadding="2" width=100% | ||
opcode result number[8] values[16]... | |- style="background:whitesmoke" | ||
|Opcode||Meaning||Description | |||
===Operation=== | |- | ||
|$01||Read Vars||Reads a range of variables. | |||
|- | |||
|$02||Read Strings||Reads a range of string variables. | |||
|- | |||
|$03||Open File||Opens a file for reading. | |||
|- | |||
|$04||Dummy||Does nothing. | |||
|- | |||
|$1F||Close File||Closes the last opened file. | |||
|} | |||
==saveRestoreVerbs ($AB)== | |||
===Encoding=== | |||
opcode sub-opcode | |||
sub-opcodes: | |||
$01 start[p8] end[p8] mode[p8] | |||
$02 start[p8] end[p8] mode[p8] | |||
$03 start[p8] end[p8] mode[p8] | |||
===Operation=== | |||
{| border="1" cellpadding="2" width=100% | |||
|- style="background:whitesmoke" | |||
|Opcode||Meaning||Description | |||
|- | |||
|$01||SO_SAVE_VERBS||For all verbs between start and end, sets the "saveid" to mode. | |||
|- | |||
|$02||SO_RESTORE_VERBS||For all verbs between start and end and matching mode, kills any existing verb, sets the saveid to 0 and generally inits the verb. | |||
|- | |||
|$03||SO_DELETE_VERBS||For all verbs between start and end and matching mode, kills any existing verb. | |||
|} | |||
==setCameraAt ($32)== | |||
===Encoding=== | |||
opcode x[p16] | |||
===Operation=== | |||
Sets the camera's x position. | |||
==setObjectName ($54)== | |||
===Encoding=== | |||
opcode object[p16] name[c]... $00 | |||
===Operation=== | |||
Sets the given object's name. | |||
==setOwnerOf ($29)== | |||
===Encoding=== | |||
opcode object[p16] owner[p8] | |||
===Operation=== | |||
Sets the owner of the object. | |||
==setState ($07)== | |||
===Encoding=== | |||
opcode object[p16] state[p8] | |||
===Operation=== | |||
Sets the state of the object. | |||
==setVarRange ($26)== | |||
non-standard encoding | |||
===Encoding=== | |||
opcode result number[8] values[8]... | |||
or | |||
opcode result number[8] values[16]... | |||
===Operation=== | |||
for (i = 0; i < number; i++) { | for (i = 0; i < number; i++) { | ||
*result + i := values[i]; | *result + i := values[i]; | ||
Line 1,324: | Line 1,501: | ||
===Variants=== | ===Variants=== | ||
In SCUMM V3 (small header) games, this opcode is used for the WaitForSentence instruction. | In SCUMM V3 and V4 (small header) games, this opcode is used for the WaitForSentence instruction. | ||
==startMusic ($ | ==startMusic ($02)== | ||
===Encoding=== | ===Encoding=== | ||
Line 1,343: | Line 1,520: | ||
|Opcode||Meaning||Description | |Opcode||Meaning||Description | ||
|- | |- | ||
$00||Is Playing||Returns true if a CD audio track is currently playing. | |$00||Is Playing||Returns true if a CD audio track is currently playing. | ||
|- | |- | ||
|$FC||Unpause CD||Unpauses the CD audio track. | |$FC||Unpause CD||Unpauses the CD audio track. | ||
Line 1,407: | Line 1,584: | ||
==stopObjectCode ($00)== | ==stopObjectCode ($A0 or $00)== | ||
===Encoding=== | ===Encoding=== | ||
Line 1,413: | Line 1,590: | ||
===Operation=== | ===Operation=== | ||
Marks the calling script as dead, to be later pruned from the thread pool. Cleans up residual arrays. | Marks the calling script as dead, to be later pruned from the thread pool. Cleans up residual arrays. Should always be the last instruction in a script. | ||
$A0 is used in local and global scripts (LSCR and SCRP blocks in the V5 resource files), $00 is used in room entry, room exit, and verb/object scripts (ENCD, EXCD, VERB blocks). | |||
Line 1,467: | Line 1,646: | ||
|$02||Copy String||Creates a duplicate of the string at resource slot srcID into destID. The old string at destID is lost. | |$02||Copy String||Creates a duplicate of the string at resource slot srcID into destID. The old string at destID is lost. | ||
|- | |- | ||
|$03||Write Character||Writes char at the given index (offset) of the string resource located at slot stringID. Out of bounds accesses cause undefined | |$03||Write Character||Writes char at the given index (offset) of the string resource located at slot stringID. Out of bounds accesses cause undefined behavior. | ||
|- | |- | ||
|$04||Read Character||Reads a byte (character) at the given index (offset) of the string resource located at slot stringID, and writes it to result. Out of bounds accesses cause undefined | |$04||Read Character||Reads a byte (character) at the given index (offset) of the string resource located at slot stringID, and writes it to result. Out of bounds accesses cause undefined behavior. | ||
|- | |- | ||
|$05||New String||Allocates or frees a string (Array), located at resource slot stringID. The string is initialised to size; if size is zero, the string is freed. | |$05||New String||Allocates or frees a string (Array), located at resource slot stringID. The string is initialised to size; if size is zero, the string is freed. | ||
Line 1,517: | Line 1,696: | ||
$01 object[p16] | $01 object[p16] | ||
$02 name[c]... $00 | $02 name[c]... $00 | ||
$03 | $03 color[p8] | ||
$04 | $04 hicolor[p8] | ||
$05 left[p16] top[p16] | $05 left[p16] top[p16] | ||
$06 | $06 | ||
Line 1,524: | Line 1,703: | ||
$08 | $08 | ||
$09 | $09 | ||
$10 | $10 color[p8] | ||
$11 | $11 | ||
$12 key[p8] | $12 key[p8] | ||
Line 1,530: | Line 1,709: | ||
$14 stringID[p16] | $14 stringID[p16] | ||
$16 object[p16] room[p8] | $16 object[p16] room[p8] | ||
$17 | $17 color[p8] | ||
===Operation=== | ===Operation=== | ||
Line 1,541: | Line 1,720: | ||
|$02||SO_VERB_NAME||Assigns the in-line name to the verb slot. | |$02||SO_VERB_NAME||Assigns the in-line name to the verb slot. | ||
|- | |- | ||
|$03||SO_VERB_COLOR||Sets the | |$03||SO_VERB_COLOR||Sets the color of the verb. | ||
|- | |- | ||
|$04||SO_VERB_HICOLOR||Sets the | |$04||SO_VERB_HICOLOR||Sets the highlight color of the verb. | ||
|- | |- | ||
|$05||SO_VERB_AT||Sets the verb's top-left co-ordinates. | |$05||SO_VERB_AT||Sets the verb's top-left co-ordinates. | ||
Line 1,555: | Line 1,734: | ||
|$09||SO_VERB_NEW||Creates a verb in the slot for the given verbID. If the slot is 0 (verb doesn't already exist), will add it to the next unusued slot; if this exceeds the global maximum number of verbs an error will be raised. | |$09||SO_VERB_NEW||Creates a verb in the slot for the given verbID. If the slot is 0 (verb doesn't already exist), will add it to the next unusued slot; if this exceeds the global maximum number of verbs an error will be raised. | ||
|- | |- | ||
|$10||SO_VERB_DIMCOLOR||Sets the dim | |$10||SO_VERB_DIMCOLOR||Sets the dim color of the verb. | ||
|- | |- | ||
|$11||SO_VERB_DIM||Dims this verb. | |$11||SO_VERB_DIM||Dims this verb. | ||
Line 1,567: | Line 1,746: | ||
|$16||Assign Object||Assigns an object from the given room to the verb (if the object's image index is not already assigned to the given object). | |$16||Assign Object||Assigns an object from the given room to the verb (if the object's image index is not already assigned to the given object). | ||
|- | |- | ||
|$17||Set Back | |$17||Set Back Color||Sets the background color of the verb? | ||
|} | |} | ||
Line 1,626: | Line 1,805: | ||
===Operation=== | ===Operation=== | ||
Sets the actor to begin walking to the given object's position. | Sets the actor to begin walking to the given object's position. | ||
=Variables= | |||
A number of variables are reserved for use by the SPUTM/SCUMM engine. Here is a list of known variables and their corresponding numbers, taken from the ScummVM source code. | |||
VAR_RESULT = 0; // descumm claims var 0 is the result var (for expressions) | |||
VAR_KEYPRESS = 0; // script_v5_.cpp claims var 0 is for keypresses... | |||
VAR_EGO = 1; | |||
VAR_CAMERA_POS_X = 2; | |||
VAR_HAVE_MSG = 3; | |||
VAR_ROOM = 4; | |||
VAR_OVERRIDE = 5; | |||
VAR_MACHINE_SPEED = 6; | |||
VAR_ME = 7; | |||
VAR_NUM_ACTOR = 8; | |||
VAR_CURRENT_LIGHTS = 9; | |||
VAR_CURRENTDRIVE = 10; | |||
VAR_TMR_1 = 11; | |||
VAR_TMR_2 = 12; | |||
VAR_TMR_3 = 13; | |||
VAR_MUSIC_TIMER = 14; | |||
VAR_ACTOR_RANGE_MIN = 15; | |||
VAR_ACTOR_RANGE_MAX = 16; | |||
VAR_CAMERA_MIN_X = 17; | |||
VAR_CAMERA_MAX_X = 18; | |||
VAR_TIMER_NEXT = 19; | |||
VAR_VIRT_MOUSE_X = 20; | |||
VAR_VIRT_MOUSE_Y = 21; | |||
VAR_ROOM_RESOURCE = 22; | |||
VAR_LAST_SOUND = 23; | |||
VAR_CUTSCENEEXIT_KEY = 24; | |||
VAR_TALK_ACTOR = 25; | |||
VAR_CAMERA_FAST_X = 26; | |||
VAR_SCROLL_SCRIPT = 27; | |||
VAR_ENTRY_SCRIPT = 28; | |||
VAR_ENTRY_SCRIPT2 = 29; | |||
VAR_EXIT_SCRIPT = 30; | |||
VAR_EXIT_SCRIPT2 = 31; | |||
VAR_VERB_SCRIPT = 32; | |||
VAR_SENTENCE_SCRIPT = 33; | |||
VAR_INVENTORY_SCRIPT = 34; | |||
VAR_CUTSCENE_START_SCRIPT = 35; | |||
VAR_CUTSCENE_END_SCRIPT = 36; | |||
VAR_CHARINC = 37; | |||
VAR_WALKTO_OBJ = 38; | |||
VAR_DEBUGMODE = 39; | |||
VAR_HEAPSPACE = 40; | |||
VAR_RESTART_KEY = 42; | |||
VAR_PAUSE_KEY = 43; | |||
VAR_MOUSE_X = 44; | |||
VAR_MOUSE_Y = 45; | |||
VAR_TIMER = 46; | |||
VAR_TIMER_TOTAL = 47; | |||
VAR_SOUNDCARD = 48; | |||
VAR_VIDEOMODE = 49; | |||
VAR_MAINMENU_KEY = 50; | |||
VAR_FIXEDDISK = 51; | |||
VAR_CURSORSTATE = 52; | |||
VAR_USERPUT = 53; | |||
VAR_V5_TALK_STRING_Y = 54; | |||
VAR_SOUNDRESULT = 56; | |||
VAR_TALKSTOP_KEY = 57; | |||
VAR_FADE_DELAY = 59; | |||
VAR_NOSUBTITLES = 60; | |||
VAR_SOUNDPARAM = 64; | |||
VAR_SOUNDPARAM2 = 65; | |||
VAR_SOUNDPARAM3 = 66; | |||
VAR_INPUTMODE = 67; // 1 is keyboard, 2 is joystick, 3 is mouse | |||
VAR_MEMORY_PERFORMANCE = 68; | |||
VAR_VIDEO_PERFORMANCE = 69; | |||
VAR_ROOM_FLAG = 70; | |||
VAR_GAME_LOADED = 71; | |||
VAR_NEW_ROOM = 72; | |||
=Table of Parameters= | |||
Please see the wiki page [[SCUMM/V5_opcodes/Table]] for a concise rendition of the above information (with a few omissions dues to the complexity of the instructions). |
edits