2,051
edits
Jestar jokin (talk | contribs) m (Fix some v3, v4 variant info) |
m (behaviour -> behavior) |
||
(4 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. (the base aux opcode | |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. | |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. | ||
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 114: | 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 140: | Line 140: | ||
===Variants=== | ===Variants=== | ||
In SCUMM V3 and 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 218: | Line 261: | ||
$0C cursor[p8] | $0C cursor[p8] | ||
$0D charset[p8] | $0D charset[p8] | ||
$0E | $0E colors[v16]... | ||
===Operation=== | ===Operation=== | ||
Line 251: | 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? | ||
|} | |} | ||
Line 336: | 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) to (right, bottom) in the given | 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 352: | Line 395: | ||
$01 xpos[p16] ypos[p16] | $01 xpos[p16] ypos[p16] | ||
$02 state[p16] | $02 state[p16] | ||
$ | $FF | ||
===Operation=== | ===Operation=== | ||
Line 363: | 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. | ||
|} | |} | ||
Line 996: | 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 1,014: | 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 1,182: | Line 1,225: | ||
$06 | $06 | ||
$07 scale1[p8] y1[p8] aux scale2[p8] y2[p8] aux 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] greenscale[p16] bluescale[p16] aux | $0B redscale[p16] greenscale[p16] bluescale[p16] aux startcolor[p8] endcolor[p8] | ||
$0C redscale[p16] greenscale[p16] bluescale[p16] aux | $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,201: | 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,215: | Line 1,258: | ||
|$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. | |$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,225: | 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,233: | Line 1,276: | ||
Small header games (V3 and V4) 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,549: | Line 1,592: | ||
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. | 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 | $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,603: | 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,653: | 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,660: | Line 1,703: | ||
$08 | $08 | ||
$09 | $09 | ||
$10 | $10 color[p8] | ||
$11 | $11 | ||
$12 key[p8] | $12 key[p8] | ||
Line 1,666: | 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,677: | 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 highlight | |$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,691: | 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,703: | 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,762: | 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= | =Variables= |
edits