Open main menu

Difference between revisions of "SCUMM/NES"

 
(13 intermediate revisions by 6 users not shown)
Line 1: Line 1:
== General ==
The NES version is supported (American, European, Swedish, French, German, Spanish, Italian). Please note the beta version is not supported.
The Famicom version (Japanese) is not supported as it does not use the SCUMM engine.
== Things To Do ==
== Things To Do ==
=== Inventory ===
* Make inventory work
=== Engine Verification ===
=== Engine Verification ===
* Verify functions:
* Verify functions:
Line 40: Line 43:
*** clearState01
*** clearState01
*** drawObject
*** drawObject
*** pickupObject * checking
*** pickupObject * partially checked
*** loadRoomWithEgo * unchecked
*** loadRoomWithEgo * unchecked
*** setBitVar * unchecked
*** setBitVar * unchecked
*** getBitVar * unchecked
*** getBitVar * unchecked
*** setOwnerOf * unchecked
*** setOwnerOf * unchecked
*** delay * unchecked
*** delay
*** walkActorToObject * unchecked
*** walkActorToObject * unchecked
*** putActorAtObject * unchecked
*** putActorAtObject * unchecked
*** walkActorTo * unchecked
*** walkActorTo * unchecked
*** setActorElevation * unchecked
*** setActorElevation * different - does not multiply elevation by 2, takes it as-is
*** putActor * unchecked
*** putActor * unchecked
*** setObjPreposition * unchecked
*** setObjPreposition * different - does nothing at all
*** getObjPreposition * unchecked
*** getObjPreposition
*** doSentence * unchecked
*** doSentence * partially checked
*** drawSentence * unchecked
*** drawSentence * unchecked
*** cutscene * unchecked
*** cutscene * difference - also saves _currentScript and clears some click-related vars
*** endCutscene * unchecked
*** endCutscene * difference - clears the _currentScript var saved in cutscene
*** setCameraAt * unchecked
*** setCameraAt * difference - sets camera to Panning mode, not Normal mode
*** panCameraTo * unchecked
*** panCameraTo * difference - no mention of camera._movingToActor
*** cursorCommand * unchecked
*** cursorCommand
*** getActorX * unchecked
*** getActorX
*** getActorY * unchecked
*** getActorY
*** getActorElevation * unchecked
*** getActorElevation * different - does not divide elevation by 2, returns it as-is
*** getActorWalkBox * unchecked
*** getActorWalkBox
*** animateActor * unchecked
*** animateActor * unchecked
*** lights * partially checked
*** setObjectName * unchecked
*** setObjectName * unchecked
*** saveLoadGame * unchecked
*** resourceRoutines * different - does nothing at all
*** resourceRoutines * unchecked
*** restart * unchecked
*** restart * unchecked
*** setBoxFlags * unchecked
*** setBoxFlags
*** verbOps * unchecked
*** verbOps * different - no case for 0xFF (verb on/off), sets fewer vars
*** roomOps * unchecked
*** roomOps * different - lacks case 2 (room color)
*** actorOps * unchecked
*** actorOps
*** actorFromPos * unchecked
*** actorFromPos * unchecked
*** findObject * unchecked
*** findObject * unchecked
Line 96: Line 99:
*** getDist * unchecked
*** getDist * unchecked
*** getClosestObjActor * unchecked
*** getClosestObjActor * unchecked
*** getRandomNr * unchecked
*** getRandomNr
*** getActorMoving * unchecked
*** getActorMoving
*** isSoundRunning * unchecked
*** isSoundRunning
*** isScriptRunning * unchecked
*** isScriptRunning
*** delayVariable * unchecked
*** delayVariable
*** stopSound * unchecked
*** stopSound
*** startMusic/startSound * unchecked
*** startMusic/startSound
*** walkActorToActor * unchecked
*** walkActorToActor * unchecked
*** putActorInRoom * unchecked
*** putActorInRoom * unchecked
*** actorFollowCamera * unchecked
*** actorFollowCamera * unchecked
*** getActorCostume * unchecked
*** getActorCostume
*** getActorRoom * unchecked
*** getActorRoom
*** getActorFacing * unchecked
*** getActorFacing
*** faceActor * unchecked
*** faceActor * unchecked
*** lights * unchecked
*** saveLoadGame
*** stopMusic * unchecked
*** stopMusic * different - only stops music track


=== Graphics ===
=== Graphics ===
Line 121: Line 124:
* Somehow add static MM logo and LucasArts logo (needs to be done before engine initializes)
* Somehow add static MM logo and LucasArts logo (needs to be done before engine initializes)


=== Sound ===
== Known Issues ==
* Sound
* Moving the cursor in the verb/inventory area will 'select' objects in the room if they touch the top of the room (example: stairs)
 
* Text wrapping doesn't work for the sentence bar (it moves down 1 pixel, right in the middle of the word; needs to wrap at name/word boundaries)
Sound Format:
* Walking and talking at the same time doesn't work - stop walking while talking and your mouth will not move, stop talking while walking and you start sliding across the room.
uint16 length (added by extract util)
* Clicking in the top 16 pixels of the screen (above the subtitle bar) crashes the program.
uint8 slot - specifies which slot the sound plays in - 2 for music, 0/1/4 for sound effects
* Walkboxes have some bugs - in some cases, you can walk through corners. This appears to be a bug with all V1-V2 games.
- slot 4 sound effects appear to play in slot 0, but only if no music is playing?
* After you select your characters and hit start, the first sound that gets played is 'chirping crickets' instead of 'pickup item'. This may be due to improper handling of o2_stopMusic()
uint8 type - 10 (0x0A) for sound effects, 100 (0x64) for music
* The 'maniac mansion' logo scroll during the intro gets stuck due to a camera issue (original engine expects screen to be 224 wide, but in ScummVM it's 256 wide so it can't scroll far enough).
uint8 data[]
 
Type 10 data:
[03/07/0B/0F] - next 4 bytes is data for sound channel 0/1/2/3 (square1, square2, triangle, noise)
[10] - next byte is a number of frames to wait before processing the next update
[FE] - loop back to beginning
[FF] - terminate sound
 
Type 100 data:
uint8 auxLen - specifies length of auxiliary data blocks
uint8 noteInstrs[auxLen] - Specifies the instrument of each predefined note
uint8 noteFreqs[auxLen] - Specifies the pitch of each predefined note
uint8 music[]:
00 thru (auxLen-1) - start playing a note using the specified instrument at the specified pitch
auxLen thru (auxLen+15) - update the note playing in the specified instrument (?)
(auxLen+16) thru 0xFF - delay N-auxLen-16 frames before parsing next byte
[FE] - loop back to beginning
[FF] - terminate sound
 
There are a total of 16 instruments, spread out over the 4 NES sound channels using the following mapping:
A total of 28 commands exist within the sound engine, each tied to one or more instruments.
Sound channels: (00 = square A, 01 = square B, 02 = triangle, 03 = noise)
* 00 00 00 00 00 00 00 01 01 01 02 02 01 03 03 03
Start commands:
* 05 03 06 08 0B 01 01 1A 16 06 04 17 02 10 0E 0D
Update (?) commands:
* 0F 00 00 09 00 14 15 00 00 00 1B 1B 0F 0F 0F 0F

Latest revision as of 16:18, 16 November 2021

General

The NES version is supported (American, European, Swedish, French, German, Spanish, Italian). Please note the beta version is not supported.

The Famicom version (Japanese) is not supported as it does not use the SCUMM engine.

Things To Do

Engine Verification

  • Verify functions:
    • ScummEngine::runInputScript()
    • V2 opcodes:
      • beginOverride
      • waitForMessage
      • waitForSentence
      • waitForActor
      • assignVarWordIndirect
      • assignVarByte
      • addIndirect
      • subIndirect
      • add
      • subtract
      • isLessEqual
      • isGreaterEqual
      • isLess
      • isGreater
      • ifClassOfIs
      • startScript
      • chainScript
      • ifNotState08
      • ifState08
      • ifNotState04
      • ifState04
      • ifState02
      • ifNotState02
      • ifNotState01
      • ifState01
      • setState08 * does not appear to request redraw (as clearState08 does)
      • clearState08
      • setState04
      • clearState04
      • setState02
      • clearState02
      • setState01
      • clearState01
      • drawObject
      • pickupObject * partially checked
      • loadRoomWithEgo * unchecked
      • setBitVar * unchecked
      • getBitVar * unchecked
      • setOwnerOf * unchecked
      • delay
      • walkActorToObject * unchecked
      • putActorAtObject * unchecked
      • walkActorTo * unchecked
      • setActorElevation * different - does not multiply elevation by 2, takes it as-is
      • putActor * unchecked
      • setObjPreposition * different - does nothing at all
      • getObjPreposition
      • doSentence * partially checked
      • drawSentence * unchecked
      • cutscene * difference - also saves _currentScript and clears some click-related vars
      • endCutscene * difference - clears the _currentScript var saved in cutscene
      • setCameraAt * difference - sets camera to Panning mode, not Normal mode
      • panCameraTo * difference - no mention of camera._movingToActor
      • cursorCommand
      • getActorX
      • getActorY
      • getActorElevation * different - does not divide elevation by 2, returns it as-is
      • getActorWalkBox
      • animateActor * unchecked
      • lights * partially checked
      • setObjectName * unchecked
      • resourceRoutines * different - does nothing at all
      • restart * unchecked
      • setBoxFlags
      • verbOps * different - no case for 0xFF (verb on/off), sets fewer vars
      • roomOps * different - lacks case 2 (room color)
      • actorOps
      • actorFromPos * unchecked
      • findObject * unchecked
      • switchCostumeSet
    • V5 opcodes:
      • jumpRelative * unchecked
      • stopObjectCode * unchecked
      • breakHere * unchecked
      • setVarRange * unchecked
      • move * unchecked
      • increment * unchecked
      • decrement * unchecked
      • equalZero * unchecked
      • notEqualZero * unchecked
      • isNotEqual
      • isEqual
      • stopScript * unchecked
      • pseudoRoom * unchecked
      • loadRoom * unchecked
      • getObjectOwner * unchecked
      • printEgo * unchecked
      • print * unchecked
      • getDist * unchecked
      • getClosestObjActor * unchecked
      • getRandomNr
      • getActorMoving
      • isSoundRunning
      • isScriptRunning
      • delayVariable
      • stopSound
      • startMusic/startSound
      • walkActorToActor * unchecked
      • putActorInRoom * unchecked
      • actorFollowCamera * unchecked
      • getActorCostume
      • getActorRoom
      • getActorFacing
      • faceActor * unchecked
      • saveLoadGame
      • stopMusic * different - only stops music track

Graphics

  • Flashlight shape
  • Gray room palette in flashlight mode

Scripts

  • Fix freeze after scrolling Maniac Manion logo
  • Somehow add static MM logo and LucasArts logo (needs to be done before engine initializes)

Known Issues

  • Moving the cursor in the verb/inventory area will 'select' objects in the room if they touch the top of the room (example: stairs)
  • Text wrapping doesn't work for the sentence bar (it moves down 1 pixel, right in the middle of the word; needs to wrap at name/word boundaries)
  • Walking and talking at the same time doesn't work - stop walking while talking and your mouth will not move, stop talking while walking and you start sliding across the room.
  • Clicking in the top 16 pixels of the screen (above the subtitle bar) crashes the program.
  • Walkboxes have some bugs - in some cases, you can walk through corners. This appears to be a bug with all V1-V2 games.
  • After you select your characters and hit start, the first sound that gets played is 'chirping crickets' instead of 'pickup item'. This may be due to improper handling of o2_stopMusic()
  • The 'maniac mansion' logo scroll during the intro gets stuck due to a camera issue (original engine expects screen to be 224 wide, but in ScummVM it's 256 wide so it can't scroll far enough).