[Scummvm-git-logs] scummvm master -> 2db8fbcb9de08a36fd1aa22d2c925ea47a4ddd36
criezy
criezy at scummvm.org
Tue Jan 23 23:08:14 CET 2018
This automated email contains information about 402 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
836da5746e SUPERNOVA: Create engine skeleton and game detection
64e6673d10 SUPERNOVA: Added basic game loop and play sound samples
ec0d557697 SUPERNOVA: (TEMP COMMIT) drawing to screen surface
9b4bade4f6 SUPERNOVA: fix palette corruption on decoding
332763e825 SUPERNOVA: add renderBox()
e7252018e8 SUPERNOVA: add characterWidth() function
c0b8b50ec6 SUPERNOVA: add text rendering
ca8c87ff2e SUPERNOVA: Fix image palette loading
0c72f52ad8 SUPERNOVA: Add palette fade in/out
8e55efa748 SUPERNOVA: Fix OOB write in paletteBrightness()
bd48a32c5a SUPERNOVA: Convert 18bit VGA to 24bit CLUT8
f25d6c7485 SUPERNOVA: Adds an empty ObjectType/ID and RoomID
d55ef4045e SUPERNOVA: Setup image and section viewer
e2122bddf1 SUPERNOVA: Updates renderImage() function
79ada90398 SUPERNOVA: Adds room data for Ship chapter
ad7184b379 SUPERNOVA: Moves Object Class from rooms.h to msn_def.h
87287de83b SUPERNOVA: Adds color palette constants
51df751e44 SUPERNOVA: Removes ORing ObjectTypes from msn_def.h
6538a6386b SUPERNOVA: Refactoring
f3656ecce9 SUPERNOVA: Adds methods for alterting Object state
42af582e4c SUPERNOVA: Substitutes magic numbers with symbols
18ac67f907 SUPERNOVA: Substitutes magic numbers in Object ctor
f4eb7cbfc5 SUPERNOVA: Adds Inventory Class
f2e51c3cfe SUPERNOVA: Adds hasProperty() for Objects and bit ops
8ec4773628 SUPERNOVA: Adds text for commands in GUI
b34fb59f96 SUPERNOVA: Reformatting
b15169cd43 SUPERNOVA: Adds getFileNumber() to Room Class
85aa1985ac SUPERNOVA: Reformatting
55c67005a6 SUPERNOVA: Returns if section is invalid
a1462cae1f SUPERNOVA: Adds static combine() to Object Class
6c5865c44c SUPERNOVA: Adds getObject() to Room Interface
54f8df764e SUPERNOVA: Adds GameState Class
0e859cd296 SUPERNOVA: Fixes getObject() to return pointer to Object
7a16dbdd50 SUPERNOVA: Adds isSectionVisible() to Object Class
ddcfda7d02 SUPERNOVA: Adds constant messages
4f3f231afd SUPERNOVA: Adds Container for temporarily storing screen sections
8a45d56630 SUPERNOVA: Adds getDOSTicks()
5c706dfb59 SUPERNOVA: Extends Inventory::get()
e534581e62 SUPERNOVA: Extends screen message system
e00e93ed4d SUPERNOVA: Implements GameManager Class and extension to engine
fbcb3d3203 SUPERNOVA: Renames game functions
495f12f815 SUPERNOVA: Lifts encapsulation of GameManager Class
7ee596efb2 SUPERNOVA: Provides rooms with engine pointers
f036ebe3d5 SUPERNOVA: Extends Rooms for setting section visibility
8f5e712df0 SUPERNOVA: Adds further game logic stubs
534bd38370 SUPERNOVA: Extends renderText()
f2e3a4d9c4 SUPERNOVA: Changes return type to int for getDOSTicks()
74b822c220 SUPERNOVA: Refactors and adds GameManager functions
e6802ed633 SUPERNOVA: Refactoring
932b3669d3 SUPERNOVA: Adds room specific game logic
38e9e2d3e7 SUPERNOVA: Adds missing copyright notes
a3b6352050 SUPERNOVA: Formatting
7da3ab2611 SUPERNOVA: Enables rendering of debug console
29021aa7dd SUPERNOVA: Refactoring
be5f3a6319 SUPERNOVA: Fixes file name creation
5ebe90a45e SUPERNOVA: Implements loading of newspaper images
018cff8c42 SUPERNOVA: Enables debug console and preload images
6c4768a051 SUPERNOVA: Reformatting
cd080b820a SUPERNOVA: Buffers audio samples on startup
9e21dc42ee SUPERNOVA: Implements rendering of newspaper articles
7c4a763710 SUPERNOVA: Replaces magic numbers
1ae1134706 SUPERNOVA: Converts mouse cursor data
ef1bbce68e SUPERNOVA: Buffers sections of image on init
1b220e75e5 SUPERNOVA: Implements playSoundMod()
11b6227517 SUPERNOVA: Buffer Music files
84eb970bb9 SUPERNOVA: Fixes endianess issue for drawing cursor
4a68aef1d6 SUPERNOVA: Fixes ScreenBufferStack
2c17586c76 SUPERNOVA: Fixes parameters passed to fillRect()
87a0dd970a SUPERNOVA: Fixes Message positioning
30308fbe8d SUPERNOVA: Implements GUI routines and refactors code
b6887b0740 SUPERNOVA: Converts strings back to cp437
69f6ef0efd SUPERNOVA: Cosmetic changes in console code
7c8f5bdd3d SUPERNOVA: Adds missing copyright header
30389746c8 SUPERNOVA: Fixes bathroom location on minimap
718cae659c SUPERNOVA: Adds info to NOTES
a8f62802cc SUPERNOVA: Extends Object Class
6d655b19fc SUPERNOVA: Adds GuiElement Class
a54c9084c1 SUPERNOVA: Removes 'inverse section' case
dc12a0fd23 SUPERNOVA: Enables renderImage() to render inverse sections
28b6430eaa SUPERNOVA: Fixes typo in definition of objects
b959453b39 SUPERNOVA: removeMessage() now restores the screen on destruction
c903ede023 SUPERNOVA: Fixes renderRoom() by limiting the section range
0f7266a6b4 SUPERNOVA: Removes warnings for Inventory code
e9375ea3ee SUPERNOVA: Adds tons of stuff
40c609c40b SUPERNOVA: Adds debugging code for rendering available sections
4d3e1eed8e SUPERNOVA: Corrects OPEN to more descriptive OPENABLE
5224c4d313 SUPERNOVA: Refactors room definitions
4c26b418cd SUPERNOVA: Makes Inventory::get() return nullObject
2a19f34bb5 SUPERNOVA: Adds table for octal cp437 umlauts
e0aa700dac SUPERNOVA: Renames charcterWidth() to textWidth()
36263aaa0b SUPERNOVA: Fixes font rendering
aa22029ffe SUPERNOVA: Removes isVisible flag from GuiElement
4fc7f73442 SUPERNOVA: Converts Inventory as GuiElements
d70ded12f6 SUPERNOVA: Fixes that objects are removed when taken
83523ebbdc SUPERNOVA: Corrects left mouse click behavior
aa447e81bc SUPERNOVA: Initializes clickField.next with 0
83a5c81468 SUPERNOVA: Fixes typo in room definition
30c5c85243 SUPERNOVA: Refactors event loop
0627ca35cb SUPERNOVA: Implements delay for animations
02995da224 SUPERNOVA: Adds definitions for remaining rooms
3f98c29ab1 SUPERNOVA: Corrects exit direction of sleeping cabin
ffcd447a08 SUPERNOVA: Fixes visibility of room constructors
daf55369a9 SUPERNOVA: Implements showing cockpit monitor
4227195a82 SUPERNOVA: Rewrites animation for Cockpit and SleepCabin
97ef7cbe87 SUERNOVA: Initializes missing rooms on startup
0462bd0184 SUPERNOVA: Implements animation
2ff15f37eb SUPERNOVA: Gets input before drawing calls;
cf98468c32 SUPERNOVA: Removes shadowing of variables
afb873c032 SUPERNOVA: Adjusts game loop delay
5dce4bc874 SUPERNOVA: Converts char game state variables to byte
bcd32509bb SUPERNOVA: Implements 'wait for input'
18c3647a63 SUPERNOVA: Updates NOTES
678c10ea55 SUPERNOVA: Corrects typo
160ff13934 SUPERNOVA: Fixes object indices in room definition
0fdb3d8d10 SUPERNOVA: Extends text rendering
30e138dcfa SUPERNOVA: Adds indicator for key presses
99d7e7c1f6 SUPERNOVA: Input handling
8ce533bb1b SUPERNOVA: Adds clear() to Inventory Class
37b4a77732 SUPERNOVA: Refactors init and destruction of GameManager
51c9357549 SUPERNOVA: Implements death screen
6f9374c737 SUPERNOVA: Fixes parameter name for getKeyInput()
2c9f7b4ba9 SUPERNOVA: Implements edit()
172377f093 SUPERNOVA: cleanup
48870921f0 SUPERNOVA: Implements shock() and removes longjmps to 'dead'
8e9141d516 SUPERNOVA: Fixes SleepCabin::animation()
d4c8fe528a SUPERNOVA: Substitues umlauts with their cp437 octal equivalent
aa0606beed SUPERNOVA: Replaces longjmp to 'dead'
7c13706d28 SUPERNOVA: Fixes code
3579bdef80 SUPERNOVA: Adds and corrects constants
f0b638d762 SUPERNOVA: Adds resetProperty() for Objects
830f983d83 SUPERNOVA: Adds text
8a766b5b48 SUPERNOVA: Adds code for remaining game logic
1797b174c7 SUPERNOVA: Implements the remaining room definitions
bfa96d6f50 SUPERNOVA: Adds Audio info for rocks
5845cd7bd2 SUPERNOVA: Fixes rerendering of the room
cac51759f7 SUPERNOVA: Corrects variables according to naming convention
eabcca3e89 SUPERNOVA: Adds Alt-X as exit shortcut
c8e0f94fd1 SUPERNOVA: Fixes terminal in sleeping chamber
29b7b91a59 SUPERNOVA: Removes TODOs
b0c108ff60 SUPERNOVA: Adds ticks to msec conversion constant
18894e8f13 SUPERNOVA: Implements turnOn()
89059ff50d SUPERNOVA: Fixes render error on death screen fadeout
a2f43c4eb6 SUPERNOVA: Adds ticks to msec conversion macro
a24af98b5e SUPERNOVA: Corrects GameState variable names
b0b682ad09 SUPERNOVA: Removes getDOSTicks()
1e36c74e6b SUPERNOVA: Updates TODOs
cd01ca0ad3 SUPERNOVA: Converts special characters
cec70a4cb4 SUPERNOVA: Renames ObjectID 'SLOT'
2c0518e0ba SUPERNOVA: Removes redundant loops around edit()
b64248981b SUPERNOVA: Fixes too large edit() field
53c086c341 SUPERNOVA: Fixes setting alarm time on watch
644a6835e5 SUPERNOVA: Adjusts init time values
604d421660 SUPERNOVA: Changes parameter name of timeToString()
026bd79a6d SUPERNOVA: Removes redundant code
316aeeabd5 SUPERNOVA: Converts Object name and description to Strings
2545ffd074 SUPERNOVA: Fixes overdraw of input
c95efb1e3e SUPERNOVA: Refactoring
8c18b4432a SUPERNOVA: Adds console command 'giveall'
ccbc1142e1 SUPERNOVA: Refactoring
3284fbc657 SUPERNOVA: Fixes cockpit display
714b38dde4 SUPERNOVA: Fixes dimming when ship energy low
b948a53f2f SUPERNOVA: Substitutes static variables with privates
63c62d25e1 SUPERNOVA: Adds explicitly invalid state for Objects
d6d485dbae SUPERNOVA: Fixes umlaut in object description
e15f281113 SUPERNOVA: Removes color macros
72791ddbee SUPERNOVA: Adds structs for loading original save files
18abc4702a SUPERNOVA: Implements Return To Launcher
bc43ff820e SUPERNOVA: Ignores mouse clicks while sound is playing
edef2792da SUPERNOVA: Adds RoomID to Rooms
2b03a1f52a SUPERNOVA: Formatting
1af00170b4 SUPERNOVA: Extends MetaEngine for load/save support
9b064e364f SUPERNOVA: Adds room id to objects
ef14dfb7c3 SUPERNOVA: Adds engine pause
3f68cda2d7 SUPERNOVA: Implements de-/serialization
82efa9dd65 SUPERNOVA: Simplifies timing code
0ffd005995 SUPERNOVA: Adds message prompt on exit
de539134f9 SUPERNOVA: Removes comments
7bd20ffbed SUPERNOVA: Adds constants
7b4e9a5424 SUPERNOVA: Adds text speed variable
b3e23fef13 SUPERNOVA: Fixes mouse events during intro
6e33819217 SUPERNOVA: Changes increment size for fade in/out
ea60d1513e SUPERNOVA: Raises save game limit to 99
a334a4730d SUPERNOVA: Fixes returned constant on load fail
7f513ac1db SUPERNOVA: Adds key input check function
98ab5ee142 SUPERNOVA: Alters wait function to stall at least _delay ms
7ed2dea5e0 SUPERNOVA: Adds Intro before starting room
5f19833803 SUPERNOVA: Remvomes manual assigning of current room
7cae6fde30 SUPERNOVA: Fixes number of rooms
735e2a8301 SUPERNOVA: Assigns room id of ShipOuterSpace
68c52362e5 SUPERNOVA: Adds Outro initialization
23f57ca83f SUPERNOVA: Fixes de-/serialization of game state
749fa6336e SUPERNOVA: Fixes save/load dialog
142e1743ce SUPERNOVA: Fixes playing vinyl in CabinL3
02290c32b6 SUPERNOVA: Allows saving by default
577ec1c56d SUPERNOVA: Fix missing return value for cmdGiveAll debug command
5bdfb6f13a SUPERNOVA: Removes saveload.h
9f3f9f47ad SUPERNOVA: Limits inventory scroll
3814f33826 SUPERNOVA: Scrolls inventory when taking an object
03414f789a SUPERNOVA: Implements inventory arrows
7da494427d SUPERNOVA: Adds current room to save file
945dc9f46f SUPERNOVA: Fixes rendering and logic for cable
ba7729a767 SUPERNOVA: Restores brightness if power on
e45d94b065 SUPERNOVA: Implements screen shake
aef0e122c7 SUPERNOVA: Restores brightness when leaving the cave
a4470edb29 SUPERNOVA: Fix exiting intro cutscene using Escape
ed7fa6f7d7 SUPERNOVA: Improve save state handling
1cdede12ac SUPERNOVA: Properly handle loading saved game from launcher
275daa81c3 SUPERNOVA: Disable loading during intro cutscene
696fcb6bb9 SUPERNOVA: Add saving/loading of playtime
86795f0fa2 SUPERNOVA: Fix clicks at start and end of audio samples
e6fea1bd86 SUPERNOVA: Fix GCC Unused Variable Warnings.
ea955675db SUPERNOVA: Fix GCC Warning for Malformed Narrowing Conversions in C++11.
2e79e24392 SUPERNOVA: Fix GCC Signed vs. Unsigned Comparison Warnings.
4c9fc3cdbc SUPERNOVA: Fix compilation using MSVC9, silent some CppCheck warnings
d1bdfd2bde SUPERNOVA: Clean indentations
65d30cf720 SUPERNOVA: Plug memory leak in MOD music streams
f9310e11d8 SUPERNOVA: Add tool skeleton to generate engine data file
5efa5a8a05 SUPERNOVA: Add bitmap files for the first newspaper English translation
b2384152ce SUPERNOVA: Add parsing of po file in create_supernova
4e374cc9be SUPERNOVA: Add some German strings to the create_supernova tool
a13086ad25 SUPERNOVA: Add partial English translation to the create_supernova tool
0f4d364e63 SUPERNOVA: Add getting translated images from the engine data file
d76b44ee57 SUPERNOVA: Add detection entry for English translation
184b3a1662 SUPERNOVA: Load strings from the supernova.dat file
6fc0659222 SUPERNOVA: Start using strings from the engine data file
be08dd3c57 SUPERNOVA: Add POTFILES to get translated text for the GUI
7722fe99cd SUPERNOVA: Move object name and description strings to engine data file
6cadee9d19 SUPERNOVA: Update English translation
095679c4f2 SUPERNOVA: Move intro cutscene strings to engine data file
69d7b91965 SUPERNOVA: Improve interactivity of title screen and intro cutscene
1229195b21 SUPERNOVA: Fix unicode characters in game strings
7c4d4e1647 SUPERNOVA: Update English translation
c3241c7c42 SUPERNOVA: Improve translated title display
f0d139d519 SUPERNOVA: Fix some warnings
9bf0a656a6 SUPERNOVA: Change _shown to an array of bytes in order to handle extra values used by dialogs, fix ArsanoMeetup2::onEntr
46bdb304dd SUPERNOVA: Remove useless defines
7485a45909 SUPERNOVA: Remove useless 2nd initialization of _shown to false
31a0496091 SUPERNOVA: Janitorial - Fix some spacing in rooms.cpp
f23baf902f SUPERNOVA: Extract strings for Ship Hall and Ship Sleep Cabin
572f205e67 SUPERNOVA: Extract the strings from ShipCockpit
ae65de93fa SUPERNOVA: Fix non-ASCII character in game strings
c290e144db SUPERNOVA: Simplify a bit the code
a141438e60 SUPERNOVA: Fix check of dialog status in ArsanoRoger onEntrance
cb12a88fc5 SUPERNOVA: Extract strings for ShibCabinL3 & R3 and for ShipAirlock
38fbda9189 SUPERNOVA: Extract strings used in ShipHold and operations related to the cable
ed9d92407e SUPERNOVA: Extract more dialog texts
609856d36a SUPERNOVA: Fix a remaining kStringDialogSeparator
56f9328e90 SUPERNOVA: Extract ArsanoRoger texts
7cfe38501c SUPERNOVA: Extract ArsanoGlider, ArsanoMeetup 2 & 3 and AxacussCell strings
49e3dd5864 SUPERNOVA: Update English translation
4d7d802333 SUPERNOVA: Change the signature of dialog(), fix calls, extract some more strings
52952c48a7 SUPERNOVA: Fix displaying image missing last row and last column
9db84783be SUPERNOVA: Merge two strings to help with translation
f213ea8e0a SUPERNOVA: extract strings for Axacuss Corridor 5
e0dde7865b SUPERNOVA: Remove AxacussCorridor5::interact in order to get rid of several GOTOs
c4ee3e72b7 SUPERNOVA: Extract some more stings from rooms.cpp
d4351a5ff2 SUPERNOVA: Extract some strings from state.cpp
21415efa40 SUPERNOVA: Use octal value for non-ASCII characters in game text
5b25fc282d SUPERNOVA: Update English translation
1cee221e7a SUPERNOVA: Finish the string extraction in state.cpp
73c9c7ad50 SUPERNOVA: Update English translation
201fd0ff56 SUPERNOVA: Change detection to use data files instead of executables
15b4e7a298 SUPERNOVA: Fix delay when loading a savedgame while a message is displayed
7f8806e929 SUPERNOVA: Update English translation
e06d7cc99b SUPERNOVA: Fix incorrect game text strings
8950934a47 SUPERNOVA: Fix incorrect string
29397932af SUPERNOVA: Fix incorrect translation
f98fcd139b SUPERNOVA: Fix screen shake
06c46bd281 SUPERNOVA: Fix incorrect German string
f4b10b7a83 SUPERNOVA: Add missing game string
21899d8716 SUPERNOVA: Implement most dialog related functions
7bf803f6e6 SUPERNOVA: Cleanup dialog code
bd6cdf4ba2 SUPERNOVA: Handle events during dialogs
7c40e38d7c SUPERNOVA: Fix recursive infinite loop in door closing animation in ArsanoEntrance
5362f3bc26 SUPERNOVA: Improve English translation
5dd3bea723 SUPERNOVA: Fix incorrect German string
5b76bbb016 SUPERNOVA: Fix graphics glitches
73278c3f9f SUPERNOVA: Replace a class variable used in a single function by a local variable
841e7182f2 SUPERNOVA: Reduce memory usage to store sections and simplify code
8f7dcbe4ac SUPERNOVA: Fix crash when displaying strings larger than the screen
a159a19324 SUPERNOVA: Split English translation on two lines
3f2c0673e4 SUPERNOVA: Do not run animations while a text box is displayed
c8c6eeb974 SUPERNOVA: Fix usage of uninitialized variables
54201327f7 SUPERNOVA: Fix image rendering when removing image
682dfa0e0c SUPERNOVA: Fix two incorrect German strings
eb43b029cc SUPERNOVA: Improve English translation
30a3ab640e SUPERNOVA: Improve English translation
3270b51372 SUPERNOVA: Add strings for supernova explosion cutscene
ba4e20b80a SUPERNOVA: Improve English translation
909818c730 SUPERNOVA: Fix combining ObjectType enum values
8a8a0b9d38 SUPERNOVA: Implement event callback mechanism and Supernova event
af226daf81 SUPERNOVA: Fix incorrect delay for message display
575aef711b SUPERNOVA: Fix updating the palette brightness when the current image has no palette
70e8f36a55 SUPERNOVA: Remove variables and stub functions related to overlay
f40a534737 SUPERNOVA: Fix room brightness
b527b54c6f SUPERNOVA: Disable loading and saving during execution of event callbacks
d3eb662fe2 SUPERNOVA: Fix warning
897a1e93a1 SUPERNOVA: Display stubs, remove useless function declaration
529a9c9811 SUPERNOVA: Properly handle timer stop/start
965b4ca3de SUPERNOVA: Check shouldQuit to break from input loop
1566b6cadc SUPERNOVA: Add string for text speed dialog
7eb5924f65 SUPERNOVA: Implement text speed dialog
eed616a4aa SUPERNOVA: Fix bug in GUARD room definition
d1d1d988b0 SUPERNOVA: Add interaction logic for AxacussIntersection
d189820ce3 SUPERNOVA: Implement AxacussExit interaction logic
d8e221e206 SUPERNOVA: Fix bug in AxacussExit
45595b9683 SUPERNOVA: enable general dialogs in AxacussIntersection and AxacussExit
b39beb43fd SUPERNOVA: Fix initialization of timer when starting or loading game
58cfbb532b SUPERNOVA: Fix room rendering
ee905b762a SUPERNOVA: Implement shipstart cutscene
b11772d904 SUPERNOVA: Fix logic in rendering code
624425077b SUPERNOVA: Add warning when trying to use out of bound file number
888930660a SUPERNOVA: Use setCurrentImage instead of passing the image to renderImage
ca1acaf5ea SUPERNOVA: Implement guardNoticed()
1759d1ffdd SUPERNOVA: Implement autosave used for dream sequence
7d72ae0d0d SUPERNOVA: Implement errorTempSave()
96afb54cc6 SUPERNOVA: Fix listing saves
34658bc7d4 SUPERNOVA: Fix a german string
87ab33a8aa SUPERNOVA: Fix several issues with savegames
cbfa0a0640 SUPERNOVA: Fix some TODOs
177539ba2e SUPERNOVA: Load images on demand
1ff953b815 SUPERNOVA: Move 2 strings to the DAT file
55fc09571f SUPERNOVA: Fix handling of room brightness
deb6168ed1 SUPERNOVA: Make sure to exit bathroom to the same room from which it was entered
312f33af3a SUPERNOVA: Fix missing message when waking up from dream
4014f4efae SUPERNOVA: Fix timing of search events
cccdcf9c26 SUPERNOVA: Implement guardWalkEvent
e2b85ab741 SUPERNOVA: Update savegame version
37706ade78 SUPERNOVA: Implement searchStartEvent, fix bug in corridor initialization
626e93e6f8 SUPERNOVA: Consume click event when hiding message
4810d514fe SUPERNOVA: Implement telomat, increase savegame version
13319458dc SUPERNOVA; Move some strings to game text file,
8efc3a15c1 SUPERNOVA: Replace non-ASCII characters with actal values
b4d7a83c75 SUPERNOVA: Small cleanups
2e95c690d0 SUPERNOVA: Add 2 missing translation strings, handle variable dialogs in AxacussCorridor5
967efacae1 SUPERNOVA: Remove leftover function declaration
b207fdf54d SUPERNOVA: Complete implementation of walking through the Jungle
5f0709d66f SUPERNOVA: Silence warning about unhandled switch cases
0c5f02959f SUPERNOVA: Remove outdated comment and warning
1b2e4f926c SUPERNOVA: Implement alarm
ef90759e92 SUPERNOVA: Some cleanup, simplify some code
75e3568f06 SUPERNOVA: Implement dialogs with variable text
e8d50c3c1b SUPERNOVA: Removes Discman from inventory
6a39148a30 SUPERNOVA: Sets sections in the correct room
c51f27f1d4 SUPERNOVA: Removes redundant comments
a996a31ab9 SUPERNOVA: Add engine data file
c09ecdb19c SUPERNOVA: Improve English translation
fa426e4dc3 SUPERNOVA: Fix clearing inventory when landing on Axacuss
f3e32d91a4 SUPERNOVA: Remove unused function variant
3b36afc80f SUPERNOVA: Implement onEntrance for all corridors
1d32c6ac25 SUPERNOVA: Only call onEntrace once after changing room
d8284756bb SUPERNOVA: Fix warning when not finding image file
bc78e613fd SUPERNOVA: Do not try to render INTRO room
ab6ae19ab3 SUPERNOVA: Fix calling onEntrance for new rooms
8ccb752c33 SUPERNOVA: Puts on suit when leaving the restaurant
b76ac8331f SUPERNOVA: Fixes turntable message
bb8dbdfc68 SUPERNOVA: Fixes game freeze in bcorrdior
4a042c8465 SUPERNOVA: Save/restore _playerHidden flag in savegames
dbb2632d1e SUPERNOVA: Rename kAudioUndef2 to kAudioSmash
639bc10906 SUPERNOVA: Disables OCCUPIED flag correctly
acfe2ab145 SUPERNOVA: Registers cmdButton clicks
d90fa9d745 SUPERNOVA: Fixes setting of properies
b6bb1f9709 SUPERNOVA: Corrects max value for int32
6e7da43889 SUPERNOVA: Introduces INT32_MAX for eventTime
8451f70c97 SUPERNOVA: Sets CARRIED flag when added to inventory
996d5c082e SUPERNOVA: Replaces TICKETS with MONEY
5861627602 SUPERNOVA: Implements money object for inventory
3ae3ee6978 SUPERNOVA: Fixes inventory scrolling
c1f6d41ce0 SUPERNOVA: Fixes outro cutscene
7ba9d94a89 SUPERNOVA: Renames audio constants
d69480b52e SUPERNOVA: Renames audio constants
063962a583 SUPERNOVA: Updates palette when changing room brightness
509edfd539 SUPERNOVA: Returns to launcher after outro
6df88c5c46 SUPERNOVA: Fixes fading in intro
f3f75da959 SUPERNOVA: Pushes a mousemove to update object state
1fd7ea7c39 SUPERNOVA: Fixes object state update
40b39b2b6d SUPERNOVA: Aborts intro if game should be closed
45b2c4ea28 SUPERNOVA: Hides cursor during snoring sequence
43709a59f3 SUPERNOVA: Reverts brightness change
f5c2271ffd SUPERNOVA: Prevents paletteFadeIn() to be triggered
8d79bbad9b SUPERNOVA: Removes comment
6fe9af93f3 SUPERONVA: Sets uninitialized values to 0
da3d145819 SUPERNOVA: Moves strings to GameManager class
fa1e93a15e SUPERNOVA: Removes global constructor call
c0f47712c2 SUPERNOVA: Changes message order
e40a017962 SUPERNOVA: Fixes segfault if dat file not found
d68ce6dc07 SUPERNOVA: Changes array to seperate variables
b8b0ae57cc SUPERNOVA: Fixes AudioStream leak
32e8d22c14 SUPERNOVA: Corrects header guard name
b937268e61 SUPERNOVA: Renames INT32_MAX to kMaxTimerValue
dd6df76b32 SUPERNOVA: Initializes RandomSource on stack
e195962763 SUPERNOVA: Update English translation
963ad97e2a SUPERNOVA: Fix missing reset of object CARRIED flag when clearing inventory
ba51c37a5c SUPERNOVA: Fix cursor not shown if escaping during the intro snoring sequence
2c42276052 SUPERNOVA: Update engine data file
d12b182450 SUPERNOVA: Remove declaration for unimplemented and unused function
2a8cf41b33 SUPERNOVA: Handle RTL and Quit while editing text
ac609c91db SUPERNOVA: Make _event a local variable
eafd739c66 SUPERNOVA: Improve waiting until a sound has finished playing
26b5522463 SUPERNOVA: Adds ModeList
ccd4e20e32 SUPERNOVA: Fixes destruction of SoundSample buffer
2db8fbcb9d Merge branch 'supernova'
Commit: 836da5746ecd9ff6caf381aa95a77a8ee3bf08eb
https://github.com/scummvm/scummvm/commit/836da5746ecd9ff6caf381aa95a77a8ee3bf08eb
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T19:26:09Z
Commit Message:
SUPERNOVA: Create engine skeleton and game detection
Changed paths:
A engines/supernova/configure.engine
A engines/supernova/console.cpp
A engines/supernova/console.h
A engines/supernova/detection.cpp
A engines/supernova/module.mk
A engines/supernova/supernova.cpp
A engines/supernova/supernova.h
diff --git a/engines/supernova/configure.engine b/engines/supernova/configure.engine
new file mode 100644
index 0000000..8f75fa4
--- /dev/null
+++ b/engines/supernova/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine supernova "Mission Supernova" no
diff --git a/engines/supernova/console.cpp b/engines/supernova/console.cpp
new file mode 100644
index 0000000..6a6edfb
--- /dev/null
+++ b/engines/supernova/console.cpp
@@ -0,0 +1,35 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "gui/debugger.h"
+
+#include "supernova/supernova.h"
+#include "supernova/console.h"
+
+namespace Supernova {
+
+Console::Console(SupernovaEngine *vm)
+{
+ //registerCmd();
+}
+
+}
diff --git a/engines/supernova/console.h b/engines/supernova/console.h
new file mode 100644
index 0000000..2b2ed2d
--- /dev/null
+++ b/engines/supernova/console.h
@@ -0,0 +1,44 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef SUPERNOVA_CONSOLE_H
+#define SUPERNOVA_CONSOLE_H
+
+#include "gui/debugger.h"
+
+namespace Supernova {
+
+class SupernovaEngine;
+
+enum {
+ kDebugGeneral = 1 << 0
+};
+
+class Console : public GUI::Debugger {
+public:
+ Console(SupernovaEngine *vm);
+ virtual ~Console() {}
+};
+
+}
+
+#endif
diff --git a/engines/supernova/detection.cpp b/engines/supernova/detection.cpp
new file mode 100644
index 0000000..c62adcf
--- /dev/null
+++ b/engines/supernova/detection.cpp
@@ -0,0 +1,95 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "base/plugins.h"
+#include "common/file.h"
+#include "engines/advancedDetector.h"
+
+#include "supernova/supernova.h"
+
+static const PlainGameDescriptor supernovaGames[] = {
+ {"msn1", "Mission Supernova 1"},
+ {"msn2", "Mission Supernova 2"},
+ {NULL, NULL}
+};
+
+namespace Supernova {
+static const ADGameDescription gameDescriptions[] = {
+ // Mission Supernova 1
+ {
+ "msn1",
+ NULL,
+ AD_ENTRY1s("msn.exe", "d11264516c529c7fc2ca81d8ba062d9e", 65536),
+ Common::DE_DEU,
+ Common::kPlatformDOS,
+ ADGF_UNSTABLE,
+ GUIO1(GUIO_NONE)
+ },
+
+ // Mission Supernova 2
+ {
+ "msn2",
+ NULL,
+ AD_ENTRY1s("ms2.exe", "e1b725393c3665f30efa96e2f46d589e", 82944),
+ Common::DE_DEU,
+ Common::kPlatformDOS,
+ ADGF_UNSTABLE,
+ GUIO1(GUIO_NONE)
+ },
+
+ AD_TABLE_END_MARKER
+};
+}
+
+class SupernovaMetaEngine: public AdvancedMetaEngine {
+public:
+ SupernovaMetaEngine() : AdvancedMetaEngine(Supernova::gameDescriptions, sizeof(ADGameDescription), supernovaGames) {
+ _singleId = "supernova";
+ }
+
+ virtual const char *getName() const {
+ return "Supernova Engine";
+ }
+
+ virtual const char *getOriginalCopyright() const {
+ return "Mission Supernova (c) 1994 Thomas and Steffen Dingel";
+ }
+
+ virtual bool hasFeature(MetaEngineFeature f) const;
+ virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const;
+};
+
+bool SupernovaMetaEngine::hasFeature(MetaEngineFeature f) const {
+ // STUB
+ return false;
+}
+
+bool SupernovaMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
+ // STUB
+ return false;
+}
+
+#if PLUGIN_ENABLED_DYNAMIC(SUPERNOVA)
+REGISTER_PLUGIN_DYNAMIC(SUPERNOVA, PLUGIN_TYPE_ENGINE, SupernovaMetaEngine);
+#else
+REGISTER_PLUGIN_STATIC(SUPERNOVA, PLUGIN_TYPE_ENGINE, SupernovaMetaEngine);
+#endif
diff --git a/engines/supernova/module.mk b/engines/supernova/module.mk
new file mode 100644
index 0000000..07317f6
--- /dev/null
+++ b/engines/supernova/module.mk
@@ -0,0 +1,17 @@
+MODULE := engines/supernova
+
+MODULE_OBJS := \
+ supernova.o \
+ console.o \
+ detection.o
+
+MODULE_DIRS += \
+ engines/supernova
+
+# This module can be built as a plugin
+ifeq ($(ENABLE_SUPERNOVA), DYNAMIC_PLUGIN)
+PLUGIN := 1
+endif
+
+# Include common rules
+include $(srcdir)/rules.mk
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
new file mode 100644
index 0000000..b8d8eb8
--- /dev/null
+++ b/engines/supernova/supernova.cpp
@@ -0,0 +1,67 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/config-manager.h"
+#include "common/debug.h"
+#include "common/debug-channels.h"
+#include "common/error.h"
+#include "common/file.h"
+#include "common/fs.h"
+
+#include "engines/util.h"
+
+#include "supernova/supernova.h"
+
+namespace Supernova {
+
+SupernovaEngine::SupernovaEngine(OSystem *syst)
+ : Engine(syst)
+ , _console(NULL)
+{
+ const Common::FSNode gameDataDir(ConfMan.get("path"));
+ SearchMan.addSubDirectoryMatching(gameDataDir, "sound");
+
+ // setup engine specific debug channels
+ DebugMan.addDebugChannel(kDebugGeneral, "general", "Supernova general debug channel");
+
+ _rnd = new Common::RandomSource("supernova");
+
+ debug("SupernovaEngine::SupernovaEngine");
+}
+
+SupernovaEngine::~SupernovaEngine() {
+ debug("SupernovaEngine::~SupernovaEngine");
+
+ delete _rnd;
+ DebugMan.clearAllDebugChannels();
+}
+
+Common::Error SupernovaEngine::run() {
+ initGraphics(320, 200);
+ _console = new Console(this);
+
+ debug("SupernovaEngine::init");
+
+ return Common::kNoError;
+}
+
+}
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
new file mode 100644
index 0000000..01c91c6
--- /dev/null
+++ b/engines/supernova/supernova.h
@@ -0,0 +1,48 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef SUPERNOVA_H
+#define SUPERNOVA_H
+
+#include "common/scummsys.h"
+#include "common/random.h"
+#include "engines/engine.h"
+
+#include "supernova/console.h"
+
+namespace Supernova {
+
+class SupernovaEngine : public Engine {
+public:
+ SupernovaEngine(OSystem *syst);
+ ~SupernovaEngine();
+
+ virtual Common::Error run();
+
+private:
+ Common::RandomSource *_rnd;
+ Console *_console;
+};
+
+}
+
+#endif
Commit: 64e6673d10a1f2695460c0188bafd9687a8277d2
https://github.com/scummvm/scummvm/commit/64e6673d10a1f2695460c0188bafd9687a8277d2
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T19:28:18Z
Commit Message:
SUPERNOVA: Added basic game loop and play sound samples
There has been many other changes like copy/pasting room definitions,
skeleton for image decoder, ..
Getting supernova mod format support seems to be a good next step.
Changed paths:
A engines/supernova/NOTES
A engines/supernova/graphics.cpp
A engines/supernova/graphics.h
A engines/supernova/msn_def.h
A engines/supernova/rooms.h
engines/supernova/console.cpp
engines/supernova/console.h
engines/supernova/detection.cpp
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/NOTES b/engines/supernova/NOTES
new file mode 100644
index 0000000..c207f53
--- /dev/null
+++ b/engines/supernova/NOTES
@@ -0,0 +1,35 @@
+Audio
+-----------
+
+There may be several sound effects in one file.
+This list shows them and their offsets.
+
+46:
+ 0 - Voice "Halt!"
+ 2510 -
+ 4020 -
+
+47:
+ 0 - Voice "Mission Supernova"
+ 24010 - Voice "Yeaahh.."
+
+48:
+ 0 -
+ 2510 -
+ 10520 - electric shock
+ 13530 - (playing turntable)
+
+50:
+ 0 -
+ 12786 -
+
+51:
+
+53: Death sound
+
+54:
+ 0 - Alarm
+ 8010 -
+ 24020 - Door sound
+ 30030 - Door open
+ 31040 - Door close
diff --git a/engines/supernova/console.cpp b/engines/supernova/console.cpp
index 6a6edfb..7ad9c0a 100644
--- a/engines/supernova/console.cpp
+++ b/engines/supernova/console.cpp
@@ -29,7 +29,18 @@ namespace Supernova {
Console::Console(SupernovaEngine *vm)
{
- //registerCmd();
+ registerCmd("test", WRAP_METHOD(Console, cmdTest));
+}
+
+bool Console::cmdTest(int argc, const char **argv)
+{
+ if (argc == 2) {
+ debugPrintf("Success!");
+ return true;
+ } else {
+ debugPrintf("Failure!");
+ return false;
+ }
}
}
diff --git a/engines/supernova/console.h b/engines/supernova/console.h
index 2b2ed2d..89e8a1c 100644
--- a/engines/supernova/console.h
+++ b/engines/supernova/console.h
@@ -35,8 +35,12 @@ enum {
class Console : public GUI::Debugger {
public:
- Console(SupernovaEngine *vm);
+ Console(Supernova::SupernovaEngine *vm);
virtual ~Console() {}
+
+ bool cmdTest(int argc, const char **argv);
+private:
+ SupernovaEngine *_vm;
};
}
diff --git a/engines/supernova/detection.cpp b/engines/supernova/detection.cpp
index c62adcf..e896ae6 100644
--- a/engines/supernova/detection.cpp
+++ b/engines/supernova/detection.cpp
@@ -63,7 +63,7 @@ static const ADGameDescription gameDescriptions[] = {
class SupernovaMetaEngine: public AdvancedMetaEngine {
public:
SupernovaMetaEngine() : AdvancedMetaEngine(Supernova::gameDescriptions, sizeof(ADGameDescription), supernovaGames) {
- _singleId = "supernova";
+// _singleId = "supernova";
}
virtual const char *getName() const {
@@ -84,8 +84,11 @@ bool SupernovaMetaEngine::hasFeature(MetaEngineFeature f) const {
}
bool SupernovaMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
- // STUB
- return false;
+ if (desc) {
+ *engine = new Supernova::SupernovaEngine(syst);
+ }
+
+ return desc != NULL;
}
#if PLUGIN_ENABLED_DYNAMIC(SUPERNOVA)
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
new file mode 100644
index 0000000..1daa94b
--- /dev/null
+++ b/engines/supernova/graphics.cpp
@@ -0,0 +1,11 @@
+#include "graphics.h"
+
+MSNImageDecoder::MSNImageDecoder()
+{
+
+}
+
+MSNImageDecoder::~MSNImageDecoder()
+{
+
+}
diff --git a/engines/supernova/graphics.h b/engines/supernova/graphics.h
new file mode 100644
index 0000000..2717350
--- /dev/null
+++ b/engines/supernova/graphics.h
@@ -0,0 +1,24 @@
+#ifndef GRAPHICS_H
+#define GRAPHICS_H
+
+#include "common/stream.h"
+#include "image/image_decoder.h"
+#include "graphics/surface.h"
+
+class MSNImageDecoder : public Image::ImageDecoder
+{
+public:
+ MSNImageDecoder();
+ virtual ~MSNImageDecoder();
+
+ virtual void destroy();
+ virtual bool loadStream(Common::SeekableReadStream &stream);
+ virtual const Graphics::Surface *getSurface() const { return _surface; }
+ virtual const byte *getPalette() const { return _palette; }
+
+private:
+ const Graphics::Surface *_surface;
+ byte *_palette;
+};
+
+#endif
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
new file mode 100644
index 0000000..b8e20b1
--- /dev/null
+++ b/engines/supernova/msn_def.h
@@ -0,0 +1,365 @@
+#ifndef MSN_DEF_H
+#define MSN_DEF_H
+
+namespace Supernova {
+
+struct obj_struct
+{
+ char *name,*description,id;
+ int type;
+ char click,click2,section;
+ char exitroom,direction;
+};
+
+/* msn.c */
+void overlay(int value);
+void overlay_init(char *text);
+void wait2(int time);
+void set_color63(char x);
+void fadeout2();
+void fadein2();
+void init_roomlist();
+void anim_on();
+void anim_off();
+char *ltoa(long l);
+void test_vga();
+void test_mouse();
+void setmode(char m);
+void calculate_palette();
+void palette();
+void palette_5();
+void palette_blend();
+void fadeout();
+void fadein();
+void title_fadein();
+void palette_off();
+void screen_shake();
+void crit_err();
+void init_buffer();
+void get_inf(int seg);
+void move(int ziel_seg, int quell_seg, int chunks_16bit);
+void disp_puffer(long adr, int ziel, int anz);
+void load(char *name);
+void getspace(int para);
+void load_disk(char *name);
+void error_loading(char *name);
+void load_sound(char *name);
+void load_sound_disk(char *name);
+void image(char nr);
+void image_remove(char nr);
+char invert(char nr);
+void show_current_section();
+void text(char *t);
+void textxy(int x, int y, char *t, char f);
+int width(char *t);
+void set_int();
+void restore_int();
+void wait1(int time);
+void box(int x, int y, int b, int h, char f);
+void hgr_save(int x, int y, int w, int h);
+void hgr_restore(int x, int y, int w, int h);
+void message(char *text);
+void message_p(int pos, char *text);
+void message_remove();
+void init_menu();
+void command_box(int bef, bool hell);
+void show_menu();
+void exits();
+void mouse_reset();
+void hourglass();
+void arrow();
+void mouse_on();
+void mouse_off();
+void install_event_handler();
+void mouse_input();
+void mouse_input2();
+void mouse_input3();
+void mouse_wait(int time);
+void sentence(int nr, bool hell);
+void sentence_remove(int sentence, int nr);
+void sentence_add(int sentence, int nr);
+int dialog(int num, char *rowlength[6], char **text[6], int nr);
+void mouse_pos_dialog(int x, int y);
+void say(char *t);
+void reply(char *t, int aus1, int aus2);
+int command_print();
+void mouse_pos(int x, int y);
+void maus_pos_weg();
+void mouse_right();
+void input();
+void inventory_object(int nr, bool brightness);
+void empty_object(int nr);
+void inventory_arrow(int nr, bool brightness);
+void show_inventory();
+void take(struct obj_struct *obj);
+void inventory_remove(struct obj_struct *obj);
+void inventory_remove2(struct obj_struct *obj);
+void scroll_up();
+void scroll_down();
+void inventory_seize();
+void insert(char *text, char *character);
+void edit(int x, int y, char *t, int length);
+bool filecopy(int ziel, int quelle);
+void error_temp();
+bool save_game(int nr);
+bool load_game(int nr);
+void load_overlay();
+void load_overlay_start();
+void load_save(bool speichern, bool abbruch);
+void text_up();
+void text_down();
+void list(char *name, bool bestell);
+void help();
+void settextspeed();
+void altx();
+bool room_execute();
+char bios_key();
+char number_read(char min, char max, char standard);
+void do_setup();
+void main(int argc, char *argv[]);
+/* msn_mod.c */
+void init_mod();
+void rechne_note();
+void set_pattern(int p);
+void play_sb();
+void play_pc();
+void start_pc_mod();
+void titel_schrift();
+void nur_text();
+/* msn_ovl1.c */
+/* msn_r0.c */
+long systime();
+char *time_tostring(long z);
+void save_time();
+void load_time();
+void load_door();
+void door_sound();
+int door_open();
+int door_close();
+void money_take(int amount);
+bool combine(struct obj_struct *obj1, struct obj_struct *obj2, int o1, int o2);
+void ok();
+bool airless();
+bool helmet_takeoff();
+bool generic_specialcmd(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+void shock();
+void alarm();
+void alarm_hearing();
+void outro();
+void dim(int color);
+void room_brightness();
+void turnon();
+void turnoff();
+void great(int nr);
+void init_rooms();
+void set_section(int room, int section, bool on);
+/* msn_r1.c */
+bool sb_corridor(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+bool sb_hall(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+bool sb_sleep(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+void anim_sleep();
+void once_sleep();
+bool sb_cockpit(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+void anim_cockpit();
+bool sb_airlock(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+bool sb_hold(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+bool sb_landingmod(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+bool sb_generator(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+void open_locker(struct obj_struct *obj, struct obj_struct *lock, int section);
+void close_locker(struct obj_struct *obj, struct obj_struct *lock, int section);
+bool sb_cabin_r3(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+bool sb_cabin_l3(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+bool sb_cabin_l2(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+bool sb_bathroom(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+void once_cockpit();
+void once_airlock();
+void once_hold();
+/* msn_r1_r.c */
+/* msn_r2.c */
+bool sb_rocks(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+void once_rocks();
+bool sb_meetup(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+void once_meetup();
+void anim_meetup();
+bool sb_entrance(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+void anim_entrance();
+void anim_remaining();
+void shipstart();
+void nova_scroll();
+void supernova();
+bool sb_roger(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+void anim_roger();
+void once_roger();
+bool sb_glider(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+void anim_glider();
+bool sb_meetup2(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+void once_meetup2();
+bool sb_meetup3(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+/* msn_r3.c */
+bool sb_cell(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+void anim_cell();
+void once_cell();
+bool sb_corridor4(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+void once_corridor();
+void once_corridor4();
+bool sb_corridor5(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+bool sb_corridor6(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+bool sb_corridor8(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+bool sb_corridor9(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+void shot(int a, int b);
+void guard_shot();
+bool sb_guard(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+void guard3_shot();
+bool sb_guard3(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+bool sb_bgang(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+void once_bgang();
+bool sb_office1(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+bool sb_office2(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+bool sb_office3(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+bool sb_office4(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+bool sb_office5(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+void once_office5();
+void walk(int a);
+void guard_walk();
+void telomat(int nr);
+void search_start();
+void search(int time);
+void guard_noticed();
+void busted(int i);
+void guard_back();
+bool sb_elevator(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+bool sb_station(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+void taxi();
+bool sb_sign(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
+/* msn_s.c */
+void talk(int a1, int a2, int time_remain, int pos, char *t);
+void talkf(int a1, int a2, int dauer);
+void talk2(int a1, int a2, int b1, int b2, int duration, int pos, char *t);
+void title_image();
+void sirene();
+void intro();
+/* msn_snd.c */
+void play_sb_sample(int address);
+void wait_soundblaster();
+void call_driver();
+void init_soundblaster();
+void deinit_soundblaster();
+void stop();
+bool keypressed();
+void pc_sound_on(int int8, int int9, char speed);
+void pc_sound_off();
+void play_pc_sample(int adr);
+void init_sound_tab(bool mod);
+void init_sound();
+void deinit_sound();
+void play_music(bool kurz);
+void play(int adr);
+void sound_on();
+void sound(int counter);
+void sound_off();
+
+
+#define MAX_SECTION 40
+#define MAX_SECTION_ZUS 50
+#define MAX_CLICKFIELD_ZUS 80
+#define MAX_OBJECT 25
+#define MAX_CARRY 30
+
+#define ROOMNUM0 1
+#define ROOMNUM1 16
+#define ROOMNUM2 9
+#define ROOMNUM3 21
+
+#define NIL 0
+
+struct room
+{
+ char *file;
+ bool shown[MAX_SECTION];
+ bool (*specialcmd)();
+ void (*animation)();
+ void (*onEntrance)();
+ struct obj_struct object[MAX_OBJECT];
+};
+
+/* object type */
+#define TAKE 1
+#define OPEN 2
+#define OPENED 4
+#define CLOSED 8
+#define EXIT 16
+#define PRESS 32
+#define COMBINABLE 64
+#define CARRIED 128
+#define UNNECESSARY 256
+#define WORN 512
+#define TALK 1024
+#define OCCUPIED 2048
+#define CAUGHT 4096
+
+enum {ACTION_WALK,
+ ACTION_LOOK,
+ ACTION_TAKE,
+ ACTION_OPEN,
+ ACTION_CLOSE,
+ ACTION_PRESS,
+ ACTION_PULL,
+ ACTION_USE,
+ ACTION_TALK,
+ ACTION_GIVE};
+
+enum {INTRO,CORRIDOR,HALL,SLEEP,COCKPIT,AIRLOCK,
+ HOLD,LANDINGMODULE,GENERATOR,OUTSIDE,
+ CABIN_R1,CABIN_R2,CABIN_R3,CABIN_L1,CABIN_L3,CABIN_L2,BATHROOM,
+
+ ROCKS,CAVE,MEETUP,ENTRANCE,REST,ROGER,GLIDER,MEETUP2,MEETUP3,
+
+ CELL,CORRIDOR1,CORRIDOR2,CORRIDOR3,CORRIDOR4,CORRIDOR5,CORRIDOR6,CORRIDOR7,CORRIDOR8,CORRIDOR9,
+ BCORRIDOR,GUARD,GUARD3,OFFICE_L1,OFFICE_L2,OFFICE_R1,OFFICE_R2,OFFICE_L,
+ ELEVATOR,STATION,SIGN};
+
+enum {X,
+ KEYCARD,KNIFE,WATCH,
+ SOCKET,
+ BUTTON,HATCH1,
+ BUTTON1,BUTTON2,MANOMETER,SUIT,HELMET,LIFESUPPORT,
+ SCRAP_LK,OUTERHATCH_TOP,GENERATOR_TOP,TERMINALSTRIP,LANDINGMOD_OUTERHATCH,
+ HOLD_WIRE,
+ LANDINGMOD_BUTTON,LANDINGMOD_SOCKET,LANDINGMOD_WIRE,LANDINGMOD_HATCH,LANDINGMOD_MONITOR,
+ KEYBOARD,
+ KEYCARD2,OUTERHATCH,GENERATOR_WIRE,TRAP,SHORT_WIRE,CLIP,
+ VOLTMETER,LADDER,GENERATOR_ROPE,
+ KITCHEN_HATCH,SLEEP_SLOT,
+ MONITOR,INSTRUMENTS,
+ COMPUTER,CABINS,CABIN,
+ SLOT_K1,SLOT_K2,SLOT_K3,SLOT_K4,
+ SHELF1,SHELF2,SHELF3,SHELF4,
+ ROPE,BOOK,DISCMAN,CHESS,
+ SLOT_KL1,SLOT_KL2,SLOT_KL3,SLOT_KL4,
+ SHELF_L1,SHELF_L2,SHELF_L3,SHELF_L4,
+ PISTOL,BOOK2,SPOOL,
+ RECORD,TURNTABLE,TURNTABLE_BUTTON,WIRE,WIRE2,PLUG,
+ PEN,
+ BATHROOM_DOOR,BATHROOM_EXIT,SHOWER,TOILET,
+
+ STONE,
+ SPACESHIPS,SPACESHIP,STAR,DOOR,MEETUP_SIGN,
+ PORTER,BATHROOM_BUTTON,BATHROOM_SIGN,KITCHEN_SIGN,CAR_SLOT,
+ ARS_BATHROOM,COINS,SCHNUCK,EGG,PILL,PILL_HULL,STAIRCASE,
+ MEETUP_EXIT,
+ ROGER_W,WALLET,KEYCARD_R,CUP,
+ GLIDER_BUTTON1,GLIDER_BUTTON2,GLIDER_BUTTON3,GLIDER_BUTTON4,GLIDER_SLOT,GLIDER_BUTTONS,
+ GLIDER_DISPLAY,GLIDER_INSTRUMENTS,GLIDER_KEYCARD,
+ UFO,
+
+ CELL_BUTTON,CELL_TABLE,CELL_WIRE,TRAY,CELL_DOOR,MAGNET,
+ NEWSPAPER,TABLE,
+ PILLAR1,PILLAR2,DOOR1,DOOR2,DOOR3,DOOR4,
+ GUARDIAN,LAMP,
+ MASTERKEYCARD,PAINTING,MONEY,LOCKER,LETTER,
+ JUNGLE,SLOT,STATION_SIGN,
+
+ TICKETS};
+
+}
+#endif // MSN_DEF_H
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
new file mode 100644
index 0000000..cbae30a
--- /dev/null
+++ b/engines/supernova/rooms.h
@@ -0,0 +1,784 @@
+#ifndef ROOMS_H
+#define ROOMS_H
+
+#include "msn_def.h"
+
+namespace Supernova {
+/* --- ROOM 0 ----------------------------------- */
+
+room roomlist0[ROOMNUM0] =
+{
+ {
+ "",{0},NIL,NIL,NIL,
+ {
+ {"Keycard","Die Keycard f�r deine Schr�nke.",KEYCARD,
+ TAKE+CARRIED+COMBINABLE,255,255,0},
+ {"Taschenmesser","Es ist nicht mehr das sch�rfste.",KNIFE,
+ TAKE+CARRIED+COMBINABLE,255,255,0},
+ {"Armbanduhr",&description,WATCH,TAKE+COMBINABLE+CARRIED,255,255,8},
+ {"Discman","Es ist eine \"Mad Monkeys\"-CD darin.",
+ DISCMAN,TAKE+COMBINABLE,255,255,0}
+ }
+ }
+};
+
+
+room roomlist1[ROOMNUM1] =
+{
+/* --- Spaceship --- */
+
+ {
+ "017",{1,0,0,0,1},&sb_corridor,NIL,NIL,
+ {
+ {"Luke",&description,HATCH1,OPEN+EXIT,0,6,1,CABIN_L1,15},
+ {"Luke",&description,0,OPEN+EXIT,1,7,2,CABIN_L2,10},
+ {"Luke",&description,0,OPEN+EXIT,2,8,3,CABIN_L3,5},
+ {"Luke",&description,0,OPEN+EXIT+OPENED,9,3,4,CABIN_R3,9},
+ {"Luke",&description,0,OPEN+EXIT,4,10,5,CABIN_R2,14},
+ {"Luke",&description,0,OPEN+EXIT,5,11,6,CABIN_R1,19},
+ {"Luke",&description,0,OPEN+CLOSED+EXIT,12,12,0,AIRLOCK,2},
+ {"Knopf","Er geh�rt zu der gro�en Luke.",BUTTON,PRESS,13,13,0},
+ {"Leiter",&description,0,0,14,14,0},
+ {"Ausgang",&description,0,EXIT,15,15,0,HALL,22}
+ }
+ },
+ {
+ "015",{1},&sb_hall,NIL,NIL,
+ {
+ {"Luke","Sie f�hrt ins Cockpit.",0,OPEN+EXIT,4,5,1,COCKPIT,10},
+ {"Luke","Sie f�hrt zur K�che.",KITCHEN_HATCH,
+ OPEN+EXIT,0,0,0,NIL,1},
+ {"Luke","Sie f�hrt zu den Tiefschlafkammern.",0,
+ OPEN+CLOSED+EXIT,1,1,2,SLEEP,8},
+ {"Schlitz","Es ist ein Keycard-Leser.",SLEEP_SLOT,COMBINABLE,2,2,0},
+ {"Leiter",&description,0,0,3,3,0},
+ {"Gang",&description,0,EXIT,6,6,0,CORRIDOR,19}
+ }
+ },
+ {
+ "033",{1},&sb_sleep,&anim_sleep,&once_sleep,
+ {
+ {"Luke","Dies ist eine der Tiefschlafkammern.",CABINS,0,0,0,0},
+ {"Luke","Dies ist eine der Tiefschlafkammern.",CABIN,0,1,1,0},
+ {"Computer",&description,COMPUTER,0,2,2,0},
+ {"Ausgang",&description,0,EXIT,255,255,0,HALL,22}
+ }
+ },
+ {
+ "009",{1},&sb_cockpit,&anim_cockpit,&once_cockpit,
+ {
+ {"Instrumente","Hmm, sieht ziemlich kompliziert aus.",
+ INSTRUMENTS,0,2,2,0},
+ {"Monitor",&description,MONITOR,0,0,0,0},
+ {"Monitor","Dieser Monitor sagt dir nichts.",0,1,1,0},
+ {"Ausgang",&description,0,EXIT,255,255,0,HALL,22}
+ }
+ },
+ {
+ "034",{1,0,0,0,0,0,1},&sb_airlock,NIL,&once_airlock,
+ {
+ {"Luke","Das ist eine Luke !!!",0,
+ EXIT+OPEN+OPENED+CLOSED,0,0,0,CORRIDOR,10},
+ {"Luke","Dies ist eine Luke !!!",0,
+ EXIT+OPEN+CLOSED,1,1,0,HOLD,14},
+ {"Knopf",&description,BUTTON1,PRESS,2,2,0},
+ {"Knopf",&description,BUTTON2,PRESS,3,3,0},
+ {"Helm","Es ist der Helm zum Raumanzug.",HELMET,TAKE,4,4,7},
+ {"Raumanzug","Der einzige Raumanzug, den die|anderen hiergelassen haben ...",
+ SUIT,TAKE,5,5,8},
+ {"Versorgung","Es ist der Versorgungsteil zum Raumanzug.",
+ LIFESUPPORT,TAKE,6,6,9},
+ {"Druckmesser",&description,MANOMETER,0,7,7,0}
+ }
+ },
+ {
+ "024",{1},&sb_hold,NIL,&once_hold,
+ {
+ {"",&description,HOLD_WIRE,COMBINABLE,255,255,0},
+ {"Schrott","Da ist eine L�sterklemme dran, die|noch ganz brauchbar aussieht.|Ich nehme sie mit.",
+ SCRAP_LK,0,4,4,0},
+ {"L�sterklemme",&description,TERMINALSTRIP,COMBINABLE,255,255,0},
+ {"Schrott","Junge, Junge! Die Explosion hat ein|ganz sch�nes Durcheinander angerichtet.",
+ 0,0,5,5,0},
+ {"Reaktor","Das war einmal der Reaktor.",0,0,6,6,0},
+ {"D�se",&description,0,0,7,7,0},
+ {"blauer K�rbis","Keine Ahnung, was das ist.",0,0,8,8,0},
+ {"Luke",&description,LANDINGMOD_OUTERHATCH,EXIT+OPEN,1,2,2,LANDINGMODULE,6},
+ {"Landef�hre","Sie war eigentlich f�r Bodenuntersuchungen|auf Arsano 3 gedacht.",
+ 0,0,0,0,0},
+ {"Ausgang",&description,0,EXIT,255,255,0,AIRLOCK,22},
+ {"Luke","Sie f�hrt nach drau�en.",
+ OUTERHATCH_TOP,EXIT+OPEN+OPENED,3,3,0,GENERATOR,8},
+ {"Generator","Er versorgt das Raumschiff mit Strom.",
+ GENERATOR_TOP,EXIT,12,12,0,GENERATOR,8}
+ }
+ },
+ {
+ "025",{1},&sb_landingmod,NIL,NIL,
+ {
+ {"Steckdose",&description,LANDINGMOD_SOCKET,COMBINABLE,1,1,0},
+ {"Knopf","Es ist ein Sicherheitsknopf.|Er kann nur mit einem spitzen|Gegenstand gedr�ckt werden.",
+ LANDINGMOD_BUTTON,PRESS+COMBINABLE,2,2,0},
+ {"Monitor",&description,LANDINGMOD_MONITOR,0,3,3,0},
+ {"Tastatur",&description,KEYBOARD,0,4,4,0},
+ {"",&description,LANDINGMOD_WIRE,COMBINABLE,255,255,0},
+ {"Luke",&description,LANDINGMOD_HATCH,EXIT+OPEN+OPENED+COMBINABLE,
+ 0,0,1+128,HOLD,10}
+ }
+ },
+ {
+ "018",{1,0,0,0,0,1},&sb_generator,NIL,NIL,
+ {
+ {"langes Kabel mit Stecker",&description,GENERATOR_WIRE,COMBINABLE,255,255,0},
+ {"leere Kabelrolle",&description,0,UNNECESSARY,255,255,0},
+ {"Keycard","Hey, das ist die Keycard des Commanders!|Er mu� sie bei dem �berst�rzten|Aufbruch verloren haben.",
+ KEYCARD2,COMBINABLE+TAKE,12,12,5+128},
+ {"Seil",&description,GENERATOR_ROPE,COMBINABLE,255,255,0},
+ {"Luke","Sie f�hrt nach drau�en.",
+ OUTERHATCH,EXIT+OPEN,1,2,1,OUTSIDE,22},
+ {"Luke",&description,0,OPEN+CLOSED,3,3,0},
+ {"Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,4,4,0},
+ {"Klappe",&description,TRAP,OPEN,5,6,2},
+ {"Leitung",&description,0,0,7,7,0},
+ {"Spannungmessger�t",&description,VOLTMETER,0,9,9,0},
+ {"Klemme",&description,CLIP,COMBINABLE,8,8,0},
+ {"Leitung","Sie f�hrt vom Generator zum Spannungmessger�t.",
+ SHORT_WIRE,COMBINABLE,10,10,0},
+ {"Leiter",&description,LADDER,EXIT,0,0,0,HOLD,1}
+ }
+ },
+ {
+ "004",{1},NIL,NIL,NIL,
+ {
+ {"Luke",&description,0,EXIT,0,0,0,GENERATOR,3},
+ {"Seil",&description,0,UNNECESSARY,255,255,0}
+ }
+ },
+ {
+ "022",{1,1,1},NIL,NIL,NIL,
+ {
+ {"Bild","Manche Leute haben schon|einen komischen Geschmack.",0,
+ UNNECESSARY,5,5,0},
+ {"Zeichenger�te",
+ "Auf dem Zettel sind lauter|unverst�ndliche Skizzen und Berechnungen.|(Jedenfalls f�r dich unverst�ndlich.)",
+ 0,UNNECESSARY,6,6,0},
+ {"Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",0,
+ UNNECESSARY,7,7,0},
+ {"Luke",&description,0,OPEN+OPENED+EXIT,3,3,15+128,CORRIDOR,5},
+ {"Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,0,0,0},
+ {"Schrank",&description,0,OPEN+CLOSED,1,1,0},
+ {"Fach",&description,0,OPEN+CLOSED,2,2,0},
+ {"Steckdose",&description,SOCKET,COMBINABLE,4,4,0},
+ {"Toilette",&description,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22}
+ }
+ },
+ {
+ "022",{1,0,0,1,1,1},NIL,NIL,NIL,
+ {
+ {"Schachspiel","Es macht wohl Spa�, an|der Decke Schach zu spielen.",
+ 0,UNNECESSARY,11,11,0},
+ {"Tennisschl�ger","Fliegt Boris Becker auch mit?",0,UNNECESSARY,8,8,0},
+ {"Tennisball","Toll!",0,UNNECESSARY,9,9,0},
+ {"Luke",&description,0,OPEN+OPENED+EXIT,3,3,15+128,CORRIDOR,5},
+ {"Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,0,0,0},
+ {"Schrank",&description,0,OPEN+CLOSED,1,1,0},
+ {"Fach",&description,0,OPEN+CLOSED,2,2,0},
+ {"Steckdose",&description,SOCKET,COMBINABLE,4,4,0},
+ {"Toilette",&description,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22}
+ }
+ },
+ {
+ "022",{1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1},&sb_cabin_r3,NIL,NIL,
+ {
+ {"Schachspiel","Dein Magnetschachspiel. Schach war|schon immer deine Leidenschaft.",
+ CHESS,TAKE+COMBINABLE,12,12,7+128},
+ {"Bett","Das ist dein Bett. Toll, nicht wahr?",0,0,13,13,0},
+ {"Schlitz","Es ist ein Keycard-Leser.",SLOT_K1,COMBINABLE,27,27,0},
+ {"Schlitz","Es ist ein Keycard-Leser.",SLOT_K2,COMBINABLE,28,28,0},
+ {"Schlitz","Es ist ein Keycard-Leser.",SLOT_K3,COMBINABLE,29,29,0},
+ {"Schlitz","Es ist ein Keycard-Leser.",SLOT_K4,COMBINABLE,30,30,0},
+ {"Fach","Das ist eins deiner drei F�cher.",SHELF1,
+ OPEN+CLOSED,14,18,9},
+ {"Alben","Deine Briefmarkensammlung.",0,UNNECESSARY,14,14,0},
+ {"Fach","Das ist eins deiner drei F�cher.",SHELF2,
+ OPEN+CLOSED,15,19,10},
+ {"Seil","Es ist ungef�hr 10 m lang und 4 cm dick.",ROPE,
+ TAKE+COMBINABLE,15,15,12},
+ {"Schrank","Das ist dein Schrank.",SHELF3,OPEN+CLOSED,16,17,11},
+ {"Krimskram","Es ist nichts brauchbares dabei.",0,UNNECESSARY,20,20,0},
+ {"Kleider","Es sind Standard-Weltraum-Klamotten.",0,UNNECESSARY,21,21,0},
+ {"Unterw�sche",&description,0,UNNECESSARY,22,22,0},
+ {"Str�mpfe",&description,0,UNNECESSARY,23,23,0},
+ {"Fach","Das ist eins deiner drei F�cher.",SHELF4,
+ OPEN+CLOSED,24,25,13},
+ {"Buch","Es ist|\"Per Anhalter durch die Galaxis\"|von Douglas Adams.",
+ BOOK,TAKE,26,26,14},
+ {"Discman","Es ist eine \"Mad Monkeys\"-CD darin.",
+ DISCMAN,TAKE+COMBINABLE,33,33,16},
+ {"Luke",&description,0,OPEN+EXIT,3,3,15+128,CORRIDOR,5},
+ {"Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,0,0,0},
+ {"Schrank",&description,0,OPEN+CLOSED,1,1,0},
+ {"Fach",&description,0,OPEN+CLOSED,2,2,0},
+ {"Steckdose",&description,SOCKET,COMBINABLE,4,4,0},
+ {"Toilette",&description,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22}
+ }
+ },
+ {
+ "021",{1,1,1,1,1,1},NIL,NIL,NIL,
+ {
+ {"Bild","Herb!",0,UNNECESSARY,5,5,0},
+ {"Bild","Toll!",0,UNNECESSARY,6,6,0},
+ {"Bild","Genial!",0,UNNECESSARY,7,7,0},
+ {"Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",0,
+ UNNECESSARY,8,8,0},
+ {"Bild","Es scheint noch nicht fertig zu sein.",0,UNNECESSARY,9,9,0},
+ {"Stift","Ein Kugelschreiber.",PEN,TAKE+COMBINABLE,10,10,5+128},
+ {"Luke",&description,0,OPEN+OPENED+EXIT,3,3,24+128,CORRIDOR,9},
+ {"Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,0,0,0},
+ {"Schrank",&description,0,OPEN+CLOSED,1,1,0},
+ {"Fach",&description,0,OPEN+CLOSED,2,2,0},
+ {"Steckdose",&description,SOCKET,COMBINABLE,4,4,0},
+ {"Toilette",&description,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22}
+ }
+ },
+ {
+ "021",{1,0,0,0,0,0,1,1,1,1,0,0,1},&sb_cabin_l3,NIL,NIL,
+ {
+ {"Poster","Ein Poster von \"Big Boss\".",0,UNNECESSARY,11,11,0},
+ {"Poster","Ein Poster von \"Rock Desaster\".",0,UNNECESSARY,12,12,0},
+ {"Box",&description,0,0,13,13,0},
+ {"Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",0,
+ UNNECESSARY,14,14,0},
+ {"Schallplatte","Die Platte ist von \"Big Boss\".",
+ RECORD,TAKE+COMBINABLE,15,15,8+128},
+ {"Schallplattenst�nder","Du hast jetzt keine Zeit, in|der Plattensammlung rumzust�bern.",
+ 0,UNNECESSARY,16,16,0},
+ {"Knopf",&description,TURNTABLE_BUTTON,PRESS,22,22,0},
+ {"Plattenspieler","Sieht aus, als k�me|er aus dem Museum.",
+ TURNTABLE,UNNECESSARY+COMBINABLE,17,17,0},
+ {"Leitung",&description,WIRE,COMBINABLE,18,18,0},
+ {"Leitung",&description,WIRE2,COMBINABLE,19,19,0},
+ {"Stecker",&description,PLUG,COMBINABLE,20,20,0},
+ {"Luke",&description,0,OPEN+OPENED+EXIT,3,3,24+128,CORRIDOR,9},
+ {"Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,0,0,0},
+ {"Schrank",&description,0,OPEN+CLOSED,1,1,0},
+ {"Fach",&description,0,OPEN+CLOSED,2,2,0},
+ {"Steckdose",&description,SOCKET,COMBINABLE,4,4,0},
+ {"Toilette",&description,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22}
+ }
+ },
+ {
+ "021",{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},&sb_cabin_l2,NIL,NIL,
+ {
+ {"Schlitz","Es ist ein Keycard-Leser.",SLOT_KL1,COMBINABLE,31,31,0},
+ {"Schlitz","Es ist ein Keycard-Leser.",SLOT_KL2,COMBINABLE,32,32,0},
+ {"Schlitz","Es ist ein Keycard-Leser.",SLOT_KL3,COMBINABLE,33,33,0},
+ {"Schlitz","Es ist ein Keycard-Leser.",SLOT_KL4,COMBINABLE,45,45,0},
+ {"Schrank",&description,SHELF_L1,OPEN+CLOSED,25,26,17},
+ {"Pistole","Es ist keine Munition drin.",PISTOL,TAKE,39,39,20},
+ {"Fach",&description,SHELF_L2,OPEN+CLOSED,27,28,18},
+ {"B�cher","Lauter wissenschaftliche B�cher.",0,UNNECESSARY,40,40,0},
+ {"Fach",&description,SHELF_L3,OPEN+CLOSED,29,30,19},
+ {"Kabelrolle","Da sind mindestens zwanzig Meter drauf.",
+ SPOOL,TAKE+COMBINABLE,41,41,21},
+ {"Fach",&description,SHELF_L4,OPEN+CLOSED,43,44,22},
+ {"Buch",&description,BOOK2,TAKE,46,46,23},
+ {"Unterw�sche","Ich habe keine Lust, in|der Unterw�sche des|Commanders rumzuw�hlen.",
+ 0,UNNECESSARY,34,34,0},
+ {"Unterw�sche","Ich habe keine Lust, in|der Unterw�sche des|Commanders rumzuw�hlen.",
+ 0,UNNECESSARY,35,35,0},
+ {"Kleider",&description,0,UNNECESSARY,36,36,0},
+ {"Krimskram","Es ist nichts brauchbares dabei.",0,UNNECESSARY,37,37,0},
+ {"Krimskram","Es ist nichts brauchbares dabei.",0,UNNECESSARY,38,38,0},
+ {"Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",0,
+ UNNECESSARY,23,23,0},
+ {"Toilette",&description,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22},
+ {"Luke",&description,0,OPEN+OPENED+EXIT,3,3,24+128,CORRIDOR,9},
+ {"Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,0,0,0},
+ {"Schrank",&description,0,OPEN+CLOSED,1,1,0},
+ {"Fach",&description,0,OPEN+CLOSED,2,2,0},
+ {"Steckdose",&description,SOCKET,COMBINABLE,4,4,0},
+ {"Ordner","Darauf steht \"Dienstanweisungen|zur Mission Supernova\".|Es steht nichts wichtiges drin.",
+ 0,UNNECESSARY,49,49,0}
+ }
+ },
+ {
+ "023",{1},&sb_bathroom,NIL,NIL,
+ {
+ {"Klo","Ein Klo mit Saugmechanismus.",TOILET,0,0,0,0},
+ {"Dusche",&description,SHOWER,0,1,1,0},
+ {"Ausgang",&description,BATHROOM_EXIT,EXIT,255,255,0,0,22}
+ }
+ }
+};
+
+
+/* --- Rooms ------------------------------------ */
+
+room roomlist2[ROOMNUM2] =
+{
+
+/* --- Arsano --- */
+
+ {
+ "012",{1},&sb_rocks,NIL,&once_rocks,
+ {
+ {"Seil",&description,0,UNNECESSARY+EXIT,0,0,0,GENERATOR,12},
+ {"Stein",&description,STONE,0,1,1,0},
+ {"Stein",&description,0,0,2,2,0},
+ {"Loch","Es scheint eine H�hle zu sein.",0,0,255,255,0,CAVE,1}
+ }
+ },
+ {
+ "012",{0},NIL,NIL,NIL,
+ {
+ {"Ausgang","Hier bist du gerade hergekommen.",
+ 0,EXIT,255,255,0,ROCKS,22},
+ {"Ausgang",&description,0,EXIT,255,255,0,MEETUP,2}
+ }
+ },
+ {
+ "037",{1},&sb_meetup,&anim_meetup,&once_meetup,
+ {
+ {"H�hle",&description,0,EXIT,255,255,0,CAVE,22},
+ {"Schild","Diese Schrift kannst du nicht lesen.",MEETUP_SIGN,0,0,0,0},
+ {"Eingang",&description,DOOR,EXIT,1,1,0,ENTRANCE,7},
+ {"Stern",&description,STAR,0,2,2,0},
+ {"Raumschiff",&description,SPACESHIPS,COMBINABLE,3,3,0},
+ {"Raumschiff",&description,SPACESHIP,COMBINABLE,4,4,0}
+ }
+ },
+ {
+ "010",{1},&sb_entrance,&anim_entrance,NIL,
+ {
+ {"Portier","Du siehst doch selbst, wie er aussieht.",
+ PORTER,TALK,0,0,0},
+ {"T�r",&description,0,EXIT+OPEN+CLOSED,1,1,0,0,5},
+ {"Schild","Diese Schrift kannst du nicht lesen.",
+ KITCHEN_SIGN,0,2,2,0},
+ {"Kaugummi",&description,SCHNUCK,TAKE,255,255,10+128},
+ {"Gummib�rchen",&description,SCHNUCK,TAKE,255,255,11+128},
+ {"Schokokugel",&description,SCHNUCK,TAKE,255,255,12+128},
+ {"�berraschungsei",&description,EGG,TAKE,255,255,13+128},
+ {"Lakritz",&description,SCHNUCK,TAKE,255,255,14+128},
+ {"Tablette","Die Plastikh�lle zeigt einen|Mund mit einer Sprechblase. Was|darin steht, kannst du nicht lesen.",
+ PILL,TAKE,255,255,0},
+ {"Schlitz",&description,CAR_SLOT,COMBINABLE,6,6,0},
+ {"Automat","Sieht aus wie ein Kaugummiautomat.",0,0,5,5,0},
+ {"Toilette","Die Toiletten sind denen|auf der Erde sehr �hnlich.",
+ ARS_BATHROOM,0,255,255,0},
+ {"Knopf",&description,BATHROOM_BUTTON,PRESS,3,3,0},
+ {"Schild","Diese Schrift kannst du nicht lesen.",BATHROOM_SIGN,0,4,4,0},
+ {"Treppe",&description,STAIRCASE,EXIT,8,8,0,REST,3},
+ {"Ausgang",&description,MEETUP_EXIT,EXIT,255,255,0,MEETUP,22},
+ {"M�nzen","Es sind seltsame|K�pfe darauf abgebildet.",
+ COINS,TAKE+COMBINABLE,255,255,0},
+ {"Tablettenh�lle","Darauf steht:\"Wenn Sie diese|Schrift jetzt lesen k�nnen,|hat die Tablette gewirkt.\"",
+ PILL_HULL,TAKE,255,255,0}
+ }
+ },
+ {
+ "028",{1},NIL,&anim_remaining,NIL,
+ {
+ {"Treppe",&description,0,EXIT,0,0,0,ENTRANCE,17},
+ {"Stuhl",&description,0,EXIT,1,1,0,ROGER,2},
+ {"Schuhe","Wie ist der denn mit|Schuhen hier reingekommen?",0,0,2,2,0}
+ }
+ },
+ {
+ "029",{1},&sb_roger,&anim_roger,&once_roger,
+ {
+ {"Ausgang",&description,0,EXIT,255,255,0,REST,19},
+ {"Froschgesicht",&description,ROGER_W,TALK,0,0,0},
+ {"Gekritzel","\"Mr Spock was here\"",0,0,3,3,0},
+ {"Brieftasche",&description,WALLET,TAKE,1,1,4},
+ {"Speisekarte","\"Heute empfehlen wir:|Fonua Opra mit Ulk.\"",0,UNNECESSARY,2,2,0},
+ {"Tasse","Sie enth�lt eine gr�nliche Fl�ssigkeit.",CUP,UNNECESSARY,4,4,0},
+ {"Schachspiel",&description,0,UNNECESSARY,255,255,0},
+ {"10-Buckazoid-Schein","Nicht gerade sehr viel Geld.",
+ 0,TAKE+COMBINABLE,255,255,0},
+ {"Keycard von Roger",&description,KEYCARD_R,TAKE+COMBINABLE,255,255,0}
+ }
+ },
+ {
+ "019",{1},&sb_glider,&anim_glider,NIL,
+ {
+ {"Ausgang",&description,0,EXIT,255,255,0,MEETUP,15},
+ {"Knopf",&description,GLIDER_BUTTON1,PRESS,0,0,0},
+ {"Knopf",&description,GLIDER_BUTTON2,PRESS,1,1,0},
+ {"Knopf",&description,GLIDER_BUTTON3,PRESS,2,2,0},
+ {"Knopf",&description,GLIDER_BUTTON4,PRESS,3,3,0},
+ {"Keycard von Roger",&description,GLIDER_KEYCARD,TAKE+COMBINABLE,255,255,0},
+ {"Schlitz",&description,GLIDER_SLOT,COMBINABLE,4,4,0},
+ {"Fach",&description,0,OPEN,5,6,6},
+ {"Tastatur",&description,GLIDER_BUTTONS,0,7,7,0},
+ {"Anzeige","Hmm, seltsame Anzeigen.",GLIDER_DISPLAY,0,8,8,0},
+ {"Instrumente","Hmm, seltsame Anzeigen.",GLIDER_INSTRUMENTS,0,9,9,0}
+ }
+ },
+ {
+ "038",{1},&sb_meetup2,NIL,&once_meetup2,
+ {
+ {"Roger W.",&description,ROGER_W,TALK,255,255,0},
+ {"Raumschiff",&description,SPACESHIP,COMBINABLE,255,255,0},
+ {"H�hle",&description,0,EXIT,255,255,0,CAVE,22}
+ }
+ },
+ {
+ "039",{1},&sb_meetup3,NIL,NIL,
+ {
+ {"Ufo","Der Eingang scheint offen zu sein.",UFO,EXIT,0,0,0,0,3},
+ {"Stern",&description,STAR,0,1,1,0},
+ {"H�hle",&description,0,EXIT,255,255,0,CAVE,22}
+ }
+ }
+};
+/* --- Rooms ------------------------------------ */
+
+room roomlist2[ROOMNUM2] =
+{
+
+/* --- Arsano --- */
+
+ {
+ "012",{1},&sb_rocks,NIL,&once_rocks,
+ {
+ {"Seil",&description,0,UNNECESSARY+EXIT,0,0,0,GENERATOR,12},
+ {"Stein",&description,STONE,0,1,1,0},
+ {"Stein",&description,0,0,2,2,0},
+ {"Loch","Es scheint eine Hhle zu sein.",0,0,255,255,0,CAVE,1}
+ }
+ },
+ {
+ "012",{0},NIL,NIL,NIL,
+ {
+ {"Ausgang","Hier bist du gerade hergekommen.",
+ 0,EXIT,255,255,0,ROCKS,22},
+ {"Ausgang",&description,0,EXIT,255,255,0,MEETUP,2}
+ }
+ },
+ {
+ "037",{1},&sb_meetup,&anim_meetup,&once_meetup,
+ {
+ {"Hhle",&description,0,EXIT,255,255,0,CAVE,22},
+ {"Schild","Diese Schrift kannst du nicht lesen.",MEETUP_SIGN,0,0,0,0},
+ {"Eingang",&description,DOOR,EXIT,1,1,0,ENTRANCE,7},
+ {"Stern",&description,STAR,0,2,2,0},
+ {"Raumschiff",&description,SPACESHIPS,COMBINABLE,3,3,0},
+ {"Raumschiff",&description,SPACESHIP,COMBINABLE,4,4,0}
+ }
+ },
+ {
+ "010",{1},&sb_entrance,&anim_entrance,NIL,
+ {
+ {"Portier","Du siehst doch selbst, wie er aussieht.",
+ PORTER,TALK,0,0,0},
+ {"Tr",&description,0,EXIT+OPEN+CLOSED,1,1,0,0,5},
+ {"Schild","Diese Schrift kannst du nicht lesen.",
+ KITCHEN_SIGN,0,2,2,0},
+ {"Kaugummi",&description,SCHNUCK,TAKE,255,255,10+128},
+ {"Gummibrchen",&description,SCHNUCK,TAKE,255,255,11+128},
+ {"Schokokugel",&description,SCHNUCK,TAKE,255,255,12+128},
+ {"berraschungsei",&description,EGG,TAKE,255,255,13+128},
+ {"Lakritz",&description,SCHNUCK,TAKE,255,255,14+128},
+ {"Tablette","Die Plastikhlle zeigt einen|Mund mit einer Sprechblase. Was|darin steht, kannst du nicht lesen.",
+ PILL,TAKE,255,255,0},
+ {"Schlitz",&description,CAR_SLOT,COMBINABLE,6,6,0},
+ {"Automat","Sieht aus wie ein Kaugummiautomat.",0,0,5,5,0},
+ {"Toilette","Die Toiletten sind denen|auf der Erde sehr hnlich.",
+ ARS_BATHROOM,0,255,255,0},
+ {"Knopf",&description,BATHROOM_BUTTON,PRESS,3,3,0},
+ {"Schild","Diese Schrift kannst du nicht lesen.",BATHROOM_SIGN,0,4,4,0},
+ {"Treppe",&description,STAIRCASE,EXIT,8,8,0,REST,3},
+ {"Ausgang",&description,MEETUP_EXIT,EXIT,255,255,0,MEETUP,22},
+ {"Mnzen","Es sind seltsame|Kpfe darauf abgebildet.",
+ COINS,TAKE+COMBINABLE,255,255,0},
+ {"Tablettenhlle","Darauf steht:\"Wenn Sie diese|Schrift jetzt lesen knnen,|hat die Tablette gewirkt.\"",
+ PILL_HULL,TAKE,255,255,0}
+ }
+ },
+ {
+ "028",{1},NIL,&anim_remaining,NIL,
+ {
+ {"Treppe",&description,0,EXIT,0,0,0,ENTRANCE,17},
+ {"Stuhl",&description,0,EXIT,1,1,0,ROGER,2},
+ {"Schuhe","Wie ist der denn mit|Schuhen hier reingekommen?",0,0,2,2,0}
+ }
+ },
+ {
+ "029",{1},&sb_roger,&anim_roger,&once_roger,
+ {
+ {"Ausgang",&description,0,EXIT,255,255,0,REST,19},
+ {"Froschgesicht",&description,ROGER_W,TALK,0,0,0},
+ {"Gekritzel","\"Mr Spock was here\"",0,0,3,3,0},
+ {"Brieftasche",&description,WALLET,TAKE,1,1,4},
+ {"Speisekarte","\"Heute empfehlen wir:|Fonua Opra mit Ulk.\"",0,UNNECESSARY,2,2,0},
+ {"Tasse","Sie enthlt eine grnliche Flssigkeit.",CUP,UNNECESSARY,4,4,0},
+ {"Schachspiel",&description,0,UNNECESSARY,255,255,0},
+ {"10-Buckazoid-Schein","Nicht gerade sehr viel Geld.",
+ 0,TAKE+COMBINABLE,255,255,0},
+ {"Keycard von Roger",&description,KEYCARD_R,TAKE+COMBINABLE,255,255,0}
+ }
+ },
+ {
+ "019",{1},&sb_glider,&anim_glider,NIL,
+ {
+ {"Ausgang",&description,0,EXIT,255,255,0,MEETUP,15},
+ {"Knopf",&description,GLIDER_BUTTON1,PRESS,0,0,0},
+ {"Knopf",&description,GLIDER_BUTTON2,PRESS,1,1,0},
+ {"Knopf",&description,GLIDER_BUTTON3,PRESS,2,2,0},
+ {"Knopf",&description,GLIDER_BUTTON4,PRESS,3,3,0},
+ {"Keycard von Roger",&description,GLIDER_KEYCARD,TAKE+COMBINABLE,255,255,0},
+ {"Schlitz",&description,GLIDER_SLOT,COMBINABLE,4,4,0},
+ {"Fach",&description,0,OPEN,5,6,6},
+ {"Tastatur",&description,GLIDER_BUTTONS,0,7,7,0},
+ {"Anzeige","Hmm, seltsame Anzeigen.",GLIDER_DISPLAY,0,8,8,0},
+ {"Instrumente","Hmm, seltsame Anzeigen.",GLIDER_INSTRUMENTS,0,9,9,0}
+ }
+ },
+ {
+ "038",{1},&sb_meetup2,NIL,&once_meetup2,
+ {
+ {"Roger W.",&description,ROGER_W,TALK,255,255,0},
+ {"Raumschiff",&description,SPACESHIP,COMBINABLE,255,255,0},
+ {"Hhle",&description,0,EXIT,255,255,0,CAVE,22}
+ }
+ },
+ {
+ "039",{1},&sb_meetup3,NIL,NIL,
+ {
+ {"Ufo","Der Eingang scheint offen zu sein.",UFO,EXIT,0,0,0,0,3},
+ {"Stern",&description,STAR,0,1,1,0},
+ {"Hhle",&description,0,EXIT,255,255,0,CAVE,22}
+ }
+ }
+};
+
+
+/* --- Rooms ------------------------------------ */
+
+room roomlist3[ROOMNUM3] =
+{
+
+/* --- Axacuss --- */
+
+ {
+ "043",{1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
+ &sb_cell,&anim_cell,&once_cell,
+ {
+ {"Knopf",&description,CELL_BUTTON,PRESS,1,1,0},
+ {"T�r",&description,CELL_DOOR,EXIT+OPEN+CLOSED,0,0,31+128,CORRIDOR4,1},
+ {"Tablett","Es ist irgendein Fra� und|etwas zu Trinken darauf.",
+ TRAY,UNNECESSARY,255,255,0},
+ {"Stange","Es scheint eine Lampe zu sein.",0,COMBINABLE,3,3,0},
+ {"Augen","Es ist nur ein Bild.",0,0,4,4,0},
+ {"Leitung",&description,CELL_WIRE,COMBINABLE+TAKE,6,6,0},
+ {"Steckdose","Sieht etwas anders aus als auf der Erde.",
+ SOCKET,COMBINABLE,5,5,0},
+ {"Metallblock","Er ist ziemlich schwer.",
+ MAGNET,TAKE+COMBINABLE,255,255,30},
+ {"Roboter","Den hast du erledigt.",0,0,255,255,0},
+ {"Tisch","Ein kleiner Metalltisch.",CELL_TABLE,COMBINABLE,2,2,0}
+ }
+ },
+ {
+ "016",{1,0,0,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,1},
+ NIL,NIL,&once_corridor,
+ {
+ {"Ausgang",&description,0,EXIT,2,2,0,GUARD3,2},
+ {"Ausgang",&description,0,EXIT,3,3,0,CORRIDOR2,22}
+ }
+ },
+ {
+ "016",{1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1},
+ NIL,NIL,&once_corridor,
+ {
+ {"Ausgang",&description,0,EXIT,2,2,0,CORRIDOR1,2},
+ {"Ausgang",&description,0,EXIT,3,3,0,CORRIDOR3,22},
+ {"Ausgang",&description,0,EXIT,1,1,0,CORRIDOR4,14}
+ }
+ },
+ {
+ "016",{1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1},
+ NIL,NIL,&once_corridor,
+ {
+ {"Ausgang",&description,0,EXIT,2,2,0,CORRIDOR2,2}
+ }
+ },
+ {
+ "016",{1,1,1,0,0,0,0,0,1,1,0,1,0,0,0,1,0,0,1,0,1,0,0,0,0,0,1},
+ &sb_corridor4,NIL,&once_corridor4,
+ {
+ {"Ausgang",&description,0,EXIT,0,0,0,CORRIDOR2,10},
+ {"Ausgang",&description,0,EXIT,1,1,0,GUARD,14},
+ {"Zellent�r","Hier warst du eingesperrt.",
+ DOOR,EXIT+OPEN+OPENED+CLOSED,7,7,0,CELL,16},
+ {"Laptop",&description,NEWSPAPER,TAKE,6,6,8},
+ {"Armbanduhr",&description,WATCH,TAKE+COMBINABLE,255,255,8},
+ {"Tisch",&description,TABLE,COMBINABLE,5,5,0}
+ }
+ },
+ {
+ "016",{1,0,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1},
+ &sb_corridor5,NIL,&once_corridor,
+ {
+ {"Ausgang",&description,DOOR,EXIT,2,2,0,0,2},
+ {"Ausgang",&description,0,EXIT,3,3,0,CORRIDOR6,22}
+ }
+ },
+ {
+ "016",{1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1},
+ &sb_corridor6,NIL,&once_corridor,
+ {
+ {"Ausgang",&description,0,EXIT,2,2,0,CORRIDOR5,2},
+ {"Ausgang",&description,0,EXIT,3,3,0,CORRIDOR7,22},
+ {"T�r",&description,DOOR,OPEN+CLOSED,255,255,0,CORRIDOR8,13}
+ }
+ },
+ {
+ "016",{1,0,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1},
+ NIL,NIL,&once_corridor,
+ {
+ {"Ausgang",&description,0,EXIT,2,2,0,CORRIDOR6,2},
+ {"Ausgang",&description,0,EXIT,3,3,0,GUARD,22}
+ }
+ },
+ {
+ "016",{1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,1},
+ &sb_corridor8,NIL,&once_corridor,
+ {
+ {"T�r",&description,DOOR,EXIT+OPEN,0,0,0,CORRIDOR6,10},
+ {"Ausgang",&description,0,EXIT,3,3,0,BCORRIDOR,22}
+ }
+ },
+ {
+ "016",{1,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1},
+ &sb_corridor9,NIL,&once_corridor,
+ {
+ {"Ausgang",&description,0,EXIT,2,2,0,BCORRIDOR,2},
+ {"T�r",&description,DOOR,EXIT+OPEN,0,0,0,GUARD,10}
+ }
+ },
+ {
+ "006",{1,0,0,1},&sb_bgang,NIL,&once_bgang,
+ {
+ {"S�ule",&description,PILLAR1,0,4,4,0},
+ {"S�ule",&description,PILLAR2,0,5,5,0},
+ {"Ausgang",&description,0,EXIT,6,6,0,CORRIDOR8,2},
+ {"Ausgang",&description,0,EXIT,7,7,0,CORRIDOR9,22},
+ {"T�r","Auf einem Schild an der T�r steht \"Dr. Alab Hansi\".",
+ DOOR1,EXIT+OPEN+CLOSED+OCCUPIED,0,0,1,OFFICE_L1,6},
+ {"T�r","Auf einem Schild an der T�r steht \"Saval Lun\".",
+ DOOR2,EXIT+OPEN+CLOSED+OCCUPIED,1,1,2,OFFICE_L2,16},
+ {"T�r","Auf einem Schild an der T�r steht \"Prof. Dr. Ugnul Tschabb\".",
+ DOOR3,EXIT+OPEN+OPENED,2,2,3,OFFICE_R1,8},
+ {"T�r","Auf einem Schild an der T�r steht \"Alga Hurz Li\".",
+ DOOR4,EXIT+OPEN+CLOSED+OCCUPIED,3,3,4,OFFICE_R2,18}
+ }
+ },
+ {
+ "040",{1},&sb_guard,NIL,NIL,
+ {
+ {"Ausgang",&description,0,EXIT,255,255,0,CORRIDOR4,21},
+ {"Gang",&description,0,EXIT,3,3,0,CORRIDOR7,5},
+ {"T�r",&description,DOOR,EXIT+OPEN,1,1,6,CORRIDOR9,3},
+ {"Axacussaner","Du m��test ihn irgendwie ablenken.",
+ GUARD,TALK,0,0,0},
+ {"Bild","Komisches Bild.",0,0,2,2,0},
+ {"Karte","Darauf steht: \"Generalkarte\".",
+ MASTERKEYCARD,TAKE+COMBINABLE,255,255,1}
+ }
+ },
+ {
+ "042",{1},&sb_guard3,NIL,NIL,
+ {
+ {"Ausgang",&description,0,EXIT,255,255,0,CORRIDOR1,22},
+ {"T�r",&description,0,EXIT+OPEN+CLOSED,0,0,0,0,20},
+ {"T�r",&description,0,EXIT+OPEN+CLOSED,1,1,0,0,15},
+ {"T�r",&description,DOOR,EXIT+OPEN,2,2,11,OFFICE_L,0},
+ {"Lampe",&description,LAMP,COMBINABLE,3,3,0},
+ {"Axacussaner",&description,GUARD,TALK,5,5,0},
+ {"Bild","Seltsam!",0,0,4,4,0}
+ }
+ },
+ {
+ "007",{1,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,1},
+ &sb_office1,NIL,NIL,
+ {
+ {"T�r",&description,DOOR,EXIT+OPEN+OPENED,6,6,9,BCORRIDOR,9},
+ {"Computer",&description,COMPUTER,COMBINABLE,4,4,0},
+ {"Geld","Es sind 500 Xa.",TICKETS,TAKE,255,255,0},
+ {"Schlie�fach","Es hat ein elektronisches Zahlenschlo�.",
+ LOCKER,OPEN+CLOSED,5,5,0},
+ {"Brief",&description,LETTER,UNNECESSARY,3,3,0}
+ }
+ },
+ {
+ "007",{1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1},
+ &sb_office2,NIL,NIL,
+ {
+ {"T�r",&description,DOOR,EXIT+OPEN+OPENED,6,6,9,BCORRIDOR,9},
+ {"Computer",&description,COMPUTER,COMBINABLE,4,4,0},
+ {"W�rfel","Sonderbar!",0,0,0,0,0},
+ {"Bild","Affenstark!",0,0,1,1,0},
+ {"Komisches Ding","Wundersam!",0,UNNECESSARY,2,2,0}
+ }
+ },
+ {
+ "008",{1,1,0,1},&sb_office3,NIL,NIL,
+ {
+ {"T�r",&description,DOOR,EXIT+OPEN+OPENED,0,0,3,BCORRIDOR,5},
+ {"Computer",&description,COMPUTER,COMBINABLE,4,4,0},
+ {"Bild","Es ist ein Axacussanerkopf auf dem Bild.",0,UNNECESSARY,1,1,0},
+ {"Bild","Es ist ein Axacussanerkopf auf dem Bild.",PAINTING,UNNECESSARY,2,2,0},
+ {"Pflanze",&description,0,UNNECESSARY,3,3,0},
+ {NIL,&description,MONEY,TAKE+COMBINABLE,255,255,0}
+ }
+ },
+ {
+ "008",{1,0,1,1},&sb_office4,NIL,NIL,
+ {
+ {"T�r",&description,DOOR,EXIT+OPEN+OPENED,0,0,3,BCORRIDOR,5},
+ {"Computer",&description,COMPUTER,COMBINABLE,4,4,0},
+ {"Figur","Stark!",0,UNNECESSARY,6,6,0},
+ {"Pflanze","Sie ist den Pflanzen auf der Erde sehr �hnlich.",
+ 0,UNNECESSARY,5,5,0}
+ }
+ },
+ {
+ "007",{1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1},
+ &sb_office5,NIL,&once_office5,
+ {
+ {"T�r",&description,DOOR,EXIT+OPEN+OPENED,6,6,17,GUARD3,9},
+ {"Computer","Er funktioniert nicht.",COMPUTER,COMBINABLE,4,4,0},
+ {"Graffiti","Seltsamer B�roschmuck!",0,0,7,7,0},
+ {"Geld","Es sind 350 Xa.",TICKETS,TAKE,8,8,0}
+ }
+ },
+ {
+ "003",{1},&sb_elevator,NIL,NIL,
+ {
+ {"Knopf",&description,BUTTON1,PRESS,0,0,0},
+ {"Knopf",&description,BUTTON2,PRESS,1,1,0},
+ {"Ausgang",&description,DOOR,EXIT,255,255,0,0,22},
+ {"Dschungel","Lauter B�ume.",JUNGLE,0,255,255,0,STATION,2}
+ }
+ },
+ {
+ "005",{1},&sb_station,NIL,NIL,
+ {
+ {"Schild",&description,STATION_SIGN,0,0,0,0},
+ {"T�r",&description,DOOR,EXIT+OPEN+CLOSED,1,1,0,0,7}
+ }
+ },
+ {
+ "032",{1,1},&sb_sign,NIL,NIL,
+ {
+ {"Ausgang",&description,0,EXIT,255,255,0,STATION,22},
+ {"Schlitz",&description,SLOT,COMBINABLE,0,0,0}
+ }
+ }
+};
+
+}
+#endif // ROOMS_H
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index b8d8eb8..3d83af1 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -24,44 +24,113 @@
#include "common/debug.h"
#include "common/debug-channels.h"
#include "common/error.h"
+#include "common/events.h"
#include "common/file.h"
#include "common/fs.h"
-
+#include "common/str.h"
+#include "common/system.h"
#include "engines/util.h"
+#include "graphics/cursorman.h"
+#include "graphics/surface.h"
+#include "graphics/screen.h"
+#include "graphics/palette.h"
+//#include "graphics/font.h"
+//#include "graphics/fontman.h"
#include "supernova/supernova.h"
+
namespace Supernova {
SupernovaEngine::SupernovaEngine(OSystem *syst)
: Engine(syst)
, _console(NULL)
{
- const Common::FSNode gameDataDir(ConfMan.get("path"));
- SearchMan.addSubDirectoryMatching(gameDataDir, "sound");
+// const Common::FSNode gameDataDir(ConfMan.get("path"));
+// SearchMan.addSubDirectoryMatching(gameDataDir, "sound");
// setup engine specific debug channels
DebugMan.addDebugChannel(kDebugGeneral, "general", "Supernova general debug channel");
_rnd = new Common::RandomSource("supernova");
-
- debug("SupernovaEngine::SupernovaEngine");
}
SupernovaEngine::~SupernovaEngine() {
- debug("SupernovaEngine::~SupernovaEngine");
-
- delete _rnd;
DebugMan.clearAllDebugChannels();
+
+ delete _rnd;
+ delete _console;
}
Common::Error SupernovaEngine::run() {
- initGraphics(320, 200);
+ initGraphics(kScreenWidth, kScreenHeight);
_console = new Console(this);
- debug("SupernovaEngine::init");
+ initData();
+
+ bool running = true;
+ while (running) {
+ Common::Event event;
+ while (g_system->getEventManager()->pollEvent(event)) {
+ switch (event.type) {
+ case Common::EVENT_QUIT:
+ case Common::EVENT_RTL:
+ running = false;
+ break;
+
+ case Common::EVENT_KEYDOWN:
+ if (event.kbd.keycode == Common::KEYCODE_d && event.kbd.hasFlags(Common::KBD_CTRL)) {
+ _console->attach();
+ }
+ if (event.kbd.keycode == Common::KEYCODE_q) {
+ playSound(48, 13530);
+ }
+
+ break;
+ default:
+ break;
+ }
+ }
+
+ _system->updateScreen();
+ _system->delayMillis(10);
+ }
+
+ //deinit timer/sound/..
+ stopSound();
return Common::kNoError;
}
+void SupernovaEngine::initData() {
+ Common::File f;
+ if (!f.open("msn_data.047")) {
+ error("File s could not be read!");
+ }
+
+ debug("%s\t%u", f.getName(), f.size());
+}
+
+void SupernovaEngine::playSound(int filenumber, int offset) {
+ Common::File *file = new Common::File();
+ Common::String filename(Common::String::format("msn_data.0%2d", filenumber));
+ if (!file->open(filename)) {
+ error("File %s could not be read!", filename.c_str());
+ }
+
+ file->seek(offset);
+ Audio::SeekableAudioStream *audioStream = Audio::makeRawStream(file, 11931, Audio::FLAG_UNSIGNED | Audio::FLAG_LITTLE_ENDIAN);
+ stopSound();
+ _mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, audioStream);
+}
+
+void SupernovaEngine::stopSound() {
+ if (_mixer->isSoundHandleActive(_soundHandle))
+ _mixer->stopHandle(_soundHandle);
+}
+
+void SupernovaEngine::renderImage(int file, int section) {
+ // STUB
+}
+
}
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 01c91c6..4eef366 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -23,14 +23,23 @@
#ifndef SUPERNOVA_H
#define SUPERNOVA_H
-#include "common/scummsys.h"
+#include "audio/audiostream.h"
+#include "audio/mixer.h"
+#include "audio/decoders/raw.h"
+#include "common/array.h"
#include "common/random.h"
+#include "common/scummsys.h"
#include "engines/engine.h"
#include "supernova/console.h"
+#include "supernova/graphics.h"
namespace Supernova {
+const int kScreenWidth = 320;
+const int kScreenHeight = 200;
+const int kTextSpeed[] = {19, 14, 10, 7, 4};
+
class SupernovaEngine : public Engine {
public:
SupernovaEngine(OSystem *syst);
@@ -41,6 +50,21 @@ public:
private:
Common::RandomSource *_rnd;
Console *_console;
+ Audio::SoundHandle _soundHandle;
+
+ // name is file ending of msn_data.xxx
+ // image decoded from file
+ // sections ??
+// struct imageFile {
+// Common::String name;
+// MSNImageDecoder image;
+// };
+// Common::Array<imageFile> _images;
+
+ void initData();
+ void playSound(int filenumber, int offset = 0);
+ void stopSound();
+ void renderImage(int file, int section);
};
}
Commit: ec0d5576978d777a62c7a30542d718c0cdd6a576
https://github.com/scummvm/scummvm/commit/ec0d5576978d777a62c7a30542d718c0cdd6a576
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T19:30:54Z
Commit Message:
SUPERNOVA: (TEMP COMMIT) drawing to screen surface
Changed paths:
engines/supernova/graphics.cpp
engines/supernova/graphics.h
engines/supernova/module.mk
engines/supernova/msn_def.h
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index 1daa94b..e2467d1 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -1,11 +1,162 @@
+#include "common/algorithm.h"
+#include "common/file.h"
+#include "common/stream.h"
+#include "common/system.h"
+#include "graphics/palette.h"
+#include "graphics/surface.h"
+
#include "graphics.h"
+namespace Supernova {
+
MSNImageDecoder::MSNImageDecoder()
-{
+ : _surface(NULL)
+ , _palette(NULL) {
+}
+MSNImageDecoder::~MSNImageDecoder() {
+ destroy();
}
-MSNImageDecoder::~MSNImageDecoder()
-{
+bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
+ destroy();
+
+ size_t size = 0;
+ size = (stream.readUint16LE() + 0xF) >> 4;
+ size |= (stream.readUint16LE() & 0xF) << 12;
+ size += 0x70; // zus_paragraph
+ size *= 16; // a paragraph is 16 bytes
+ _encodedImage = new byte[size];
+
+ _palette = new byte[768];
+ g_system->getPaletteManager()->grabPalette(_palette, 0, 256);
+
+ byte pal_diff;
+ byte flag = stream.readByte();
+ if (flag == 0) {
+ pal_diff = 0;
+ _palette[141] = 0x38;
+ _palette[142] = 0x38;
+ _palette[143] = 0x38;
+ } else {
+ pal_diff = 1;
+ for (int i = flag * 3; i != 0; --i) {
+ _palette[717 - i] = stream.readByte();
+ }
+ }
+ g_system->getPaletteManager()->setPalette(_palette, 0, 256);
+
+ byte numSections = stream.readByte();
+ for (size_t i = 0; i < kMaxSections; ++i) {
+ _section[i].addressHigh = 0xff;
+ _section[i].addressLow = 0xffff;
+ _section[i].x2 = 0;
+ }
+ for (int i = 0; i < numSections; ++i) {
+ _section[i].x1 = stream.readUint16LE();
+ _section[i].x2 = stream.readUint16LE();
+ _section[i].y1 = stream.readByte();
+ _section[i].y2 = stream.readByte();
+ _section[i].next = stream.readByte();
+ _section[i].addressLow = stream.readUint16LE();
+ _section[i].addressHigh = stream.readByte();
+ }
+
+ byte numClickFields = stream.readByte();
+ for (int i = 0; i < numClickFields; ++i) {
+ _clickField[i].x1 = stream.readUint16LE();
+ _clickField[i].x2 = stream.readUint16LE();
+ _clickField[i].y1 = stream.readByte();
+ _clickField[i].y2 = stream.readByte();
+ _clickField[i].next = stream.readByte();
+ }
+
+ byte zwCodes[256];
+ byte numRepeat = stream.readByte();
+ byte numZw = stream.readByte();
+ stream.read(zwCodes, numZw);
+ numZw += numRepeat;
+
+ byte input = 0;
+ size_t i = 0;
+ // wat
+ while (stream.read(&input, 1)) {
+ if (input < numRepeat) {
+ ++input;
+ byte value = stream.readByte();
+ for (--value; input > 0; --input) {
+ _encodedImage[i++] = value;
+ }
+ } else if (input < numZw) {
+ input = zwCodes[input];
+ --input;
+ _encodedImage[i++] = input;
+ _encodedImage[i++] = input;
+ } else {
+ input -= pal_diff;
+ _encodedImage[i++] = input;
+ }
+ }
+ return true;
+}
+
+bool MSNImageDecoder::loadSection(int section) {
+ _surface = new Graphics::Surface;
+ _surface->create(320, 200, g_system->getScreenFormat());
+ byte *surfacePixels = static_cast<byte *>(_surface->getPixels());
+
+ const uint32 kInvalidAddress = 0x00FFFFFF;
+
+ size_t image = section;
+ if (image < 128) {
+ do {
+ uint32 offset = (_section[image].addressHigh << 16) + _section[image].addressLow;
+ if (offset == kInvalidAddress) {
+ return false;
+ }
+ int width = _section[image].x2 - _section[image].x1 + 1;
+ int height = _section[image].y2 - _section[image].y1 + 1;
+ uint32 destAddress = 320 * _section[image].y1 + _section[image].x1;
+ while (height) {
+ Common::copy(_encodedImage + offset, _encodedImage + offset + width, surfacePixels + destAddress);
+ offset += width;
+ destAddress += 320;
+ --height;
+ }
+
+ image = _section[image].next;
+ } while (image != 0);
+ } else {
+ image -= 128;
+ do {
+ int width = _section[image].x2 - _section[image].x1 + 1;
+ int height = _section[image].y2 - _section[image].y1 + 1;
+ uint32 destAddress = 320 * _section[image].y1 + _section[image].x1;
+ uint32 offset = (_section[image].addressHigh << 16) + _section[image].addressLow + destAddress;
+ while (height) {
+ Common::copy(_encodedImage + offset, _encodedImage + offset + width, surfacePixels + destAddress);
+ offset += 320;
+ destAddress += 320;
+ --height;
+ }
+
+ image = _section[image].next;
+ } while (image != 0);
+ }
+
+ return true;
+}
+
+void MSNImageDecoder::destroy() {
+ if (_palette) {
+ delete[] _palette;
+ _palette = NULL;
+ }
+ if (_surface) {
+ _surface->free();
+ _surface = NULL;
+ }
+}
+
}
diff --git a/engines/supernova/graphics.h b/engines/supernova/graphics.h
index 2717350..94d6b5e 100644
--- a/engines/supernova/graphics.h
+++ b/engines/supernova/graphics.h
@@ -1,12 +1,35 @@
#ifndef GRAPHICS_H
#define GRAPHICS_H
-#include "common/stream.h"
+#include "common/scummsys.h"
#include "image/image_decoder.h"
-#include "graphics/surface.h"
-class MSNImageDecoder : public Image::ImageDecoder
-{
+namespace Common {
+class SeekableReadStream;
+}
+
+namespace Graphics {
+class Surface;
+}
+
+namespace Supernova {
+
+const byte initPalette[48] = {
+// r g b
+ 0, 0, 0, 16, 16, 16, 22, 22, 22,
+ 28, 28, 28, 63, 63, 63, 0, 52, 0,
+ 0, 63, 0, 54, 0, 0, 63, 0, 0,
+ 0, 0, 30, 0, 0, 45, 40, 40, 40,
+ 20, 50, 63, 10, 63, 10, 60, 60, 0,
+ 63, 10, 10
+};
+
+// TODO
+const byte defaultVGAPalette[] = {
+ 0, 0, 0
+};
+
+class MSNImageDecoder : public Image::ImageDecoder {
public:
MSNImageDecoder();
virtual ~MSNImageDecoder();
@@ -15,10 +38,35 @@ public:
virtual bool loadStream(Common::SeekableReadStream &stream);
virtual const Graphics::Surface *getSurface() const { return _surface; }
virtual const byte *getPalette() const { return _palette; }
+
+ bool loadSection(int _section);
private:
- const Graphics::Surface *_surface;
+ static const int kMaxSections = 50;
+ static const int kMaxClickFields = 80;
+
+ Graphics::Surface *_surface;
byte *_palette;
+ byte *_encodedImage;
+
+ struct Section {
+ int16 x1;
+ int16 x2;
+ byte y1;
+ byte y2;
+ byte next;
+ uint16 addressLow;
+ byte addressHigh;
+ } _section[kMaxSections];
+
+ struct ClickField {
+ int16 x1;
+ int16 x2;
+ byte y1;
+ byte y2;
+ byte next;
+ } _clickField[kMaxClickFields];
};
+}
#endif
diff --git a/engines/supernova/module.mk b/engines/supernova/module.mk
index 07317f6..b63bd2d 100644
--- a/engines/supernova/module.mk
+++ b/engines/supernova/module.mk
@@ -1,9 +1,10 @@
MODULE := engines/supernova
MODULE_OBJS := \
- supernova.o \
console.o \
- detection.o
+ detection.o \
+ graphics.o \
+ supernova.o \
MODULE_DIRS += \
engines/supernova
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index b8e20b1..c17b7bd 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -362,4 +362,151 @@ enum {X,
TICKETS};
}
+
+const byte mouseNormal[64] = {
+ 0xff,0x3f,0xff,0x1f,0xff,0x0f,0xff,0x07,
+ 0xff,0x03,0xff,0x01,0xff,0x00,0x7f,0x00,
+ 0x3f,0x00,0x1f,0x00,0x0f,0x00,0x0f,0x00,
+ 0xff,0x00,0x7f,0x18,0x7f,0x38,0x7f,0xfc,
+
+ 0x00,0x00,0x00,0x40,0x00,0x60,0x00,0x70,
+ 0x00,0x78,0x00,0x7c,0x00,0x7e,0x00,0x7f,
+ 0x80,0x7f,0xc0,0x7f,0xe0,0x7f,0x00,0x7e,
+ 0x00,0x66,0x00,0x43,0x00,0x03,0x00,0x00
+};
+
+const byte mouseWait[64] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,
+ 0x01,0x80,0x01,0x80,0x11,0x88,0x31,0x8c,
+ 0x31,0x8c,0x11,0x88,0x01,0x80,0x01,0x80,
+ 0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0xfe,0x7f,0xf4,0x2f,0xf4,0x2f,
+ 0x14,0x28,0x24,0x24,0x44,0x22,0x84,0x21,
+ 0x84,0x21,0xc4,0x23,0xe4,0x27,0x74,0x2e,
+ 0x34,0x2c,0x14,0x28,0xfe,0x7f,0x00,0x00
+};
+
+char font[][5] =
+{
+ {0x00,0x00,0x00,0xff},
+ {0x5f,0xff},
+ {0x03,0x00,0x03,0xff},
+ {0x14,0x7f,0x14,0x7f,0x14},
+ {0x24,0x2a,0x7f,0x2a,0x12},
+ {0x61,0x10,0x08,0x04,0x43},
+ {0x38,0x4e,0x59,0x26,0x50},
+ {0x03,0xff},
+ {0x3e,0x41,0xff},
+ {0x41,0x3e,0xff},
+ {0x10,0x54,0x38,0x54,0x10},
+ {0x10,0x10,0x7c,0x10,0x10},
+ {0x80,0x40,0xff},
+ {0x10,0x10,0x10,0x10,0x10},
+ {0x40,0xff},
+ {0x60,0x10,0x08,0x04,0x03},
+
+ {0x3e,0x41,0x41,0x41,0x3e}, /* digits */
+ {0x04,0x02,0x7f,0xff},
+ {0x42,0x61,0x51,0x49,0x46},
+ {0x22,0x41,0x49,0x49,0x36},
+ {0x18,0x14,0x12,0x7f,0x10},
+ {0x27,0x45,0x45,0x45,0x39},
+ {0x3e,0x49,0x49,0x49,0x32},
+ {0x01,0x61,0x19,0x07,0x01},
+ {0x36,0x49,0x49,0x49,0x36},
+ {0x26,0x49,0x49,0x49,0x3e},
+
+ {0x44,0xff},
+ {0x80,0x44,0xff},
+ {0x10,0x28,0x44,0xff},
+ {0x28,0x28,0x28,0x28,0x28},
+ {0x44,0x28,0x10,0xff},
+ {0x02,0x01,0x51,0x09,0x06},
+ {0x3e,0x41,0x5d,0x5d,0x1e},
+
+ {0x7c,0x12,0x11,0x12,0x7c}, /* uppercase letters*/
+ {0x7f,0x49,0x49,0x49,0x36},
+ {0x3e,0x41,0x41,0x41,0x22},
+ {0x7f,0x41,0x41,0x22,0x1c},
+ {0x7f,0x49,0x49,0x49,0xff},
+ {0x7f,0x09,0x09,0x09,0xff},
+ {0x3e,0x41,0x41,0x49,0x3a},
+ {0x7f,0x08,0x08,0x08,0x7f},
+ {0x41,0x7f,0x41,0xff},
+ {0x20,0x40,0x40,0x3f,0xff},
+ {0x7f,0x08,0x14,0x22,0x41},
+ {0x7f,0x40,0x40,0x40,0xff},
+ {0x7f,0x02,0x04,0x02,0x7f},
+ {0x7f,0x02,0x0c,0x10,0x7f},
+ {0x3e,0x41,0x41,0x41,0x3e},
+ {0x7f,0x09,0x09,0x09,0x06},
+ {0x3e,0x41,0x51,0x21,0x5e},
+ {0x7f,0x09,0x19,0x29,0x46},
+ {0x26,0x49,0x49,0x49,0x32},
+ {0x01,0x01,0x7f,0x01,0x01},
+ {0x3f,0x40,0x40,0x40,0x3f},
+ {0x07,0x18,0x60,0x18,0x07},
+ {0x1f,0x60,0x18,0x60,0x1f},
+ {0x63,0x14,0x08,0x14,0x63},
+ {0x03,0x04,0x78,0x04,0x03},
+ {0x61,0x51,0x49,0x45,0x43},
+
+ {0x7f,0x41,0x41,0xff},
+ {0x03,0x04,0x08,0x10,0x60},
+ {0x41,0x41,0x7f,0xff},
+ {0x02,0x01,0x02,0xff},
+ {0x80,0x80,0x80,0x80,0x80},
+ {0x01,0x02,0xff},
+
+ {0x38,0x44,0x44,0x44,0x7c}, /* lowercase letters */
+ {0x7f,0x44,0x44,0x44,0x38},
+ {0x38,0x44,0x44,0x44,0x44},
+ {0x38,0x44,0x44,0x44,0x7f},
+ {0x38,0x54,0x54,0x54,0x58},
+ {0x04,0x7e,0x05,0x01,0xff},
+ {0x98,0xa4,0xa4,0xa4,0x7c},
+ {0x7f,0x04,0x04,0x04,0x78},
+ {0x7d,0xff},
+ {0x80,0x80,0x7d,0xff},
+ {0x7f,0x10,0x28,0x44,0xff},
+ {0x7f,0xff},
+ {0x7c,0x04,0x7c,0x04,0x78},
+ {0x7c,0x04,0x04,0x04,0x78},
+ {0x38,0x44,0x44,0x44,0x38},
+ {0xfc,0x24,0x24,0x24,0x18},
+ {0x18,0x24,0x24,0x24,0xfc},
+ {0x7c,0x08,0x04,0x04,0xff},
+ {0x48,0x54,0x54,0x54,0x24},
+ {0x04,0x3e,0x44,0x40,0xff},
+ {0x7c,0x40,0x40,0x40,0x3c},
+ {0x0c,0x30,0x40,0x30,0x0c},
+ {0x3c,0x40,0x3c,0x40,0x3c},
+ {0x44,0x28,0x10,0x28,0x44},
+ {0x9c,0xa0,0xa0,0xa0,0x7c},
+ {0x44,0x64,0x54,0x4c,0x44},
+
+ {0x08,0x36,0x41,0xff},
+ {0x77,0xff},
+ {0x41,0x36,0x08,0xff},
+ {0x02,0x01,0x02,0x01,0xff},
+ {0xff},
+
+ {0xfe,0x49,0x49,0x4e,0x30}, /* á */
+
+ {0x7c,0x41,0x40,0x41,0x3c}, /* umlauts */
+
+ {0x04,0x06,0x7f,0x06,0x04}, /* arrows */
+ {0x20,0x60,0xfe,0x60,0x20},
+
+ {0x38,0x45,0x44,0x45,0x7c}, /* umlauts */
+ {0xff},{0xff},{0xff},{0xff},{0xff},{0xff},{0xff},{0xff},{0xff},
+ {0x79,0x14,0x12,0x14,0x79},
+ {0xff},{0xff},{0xff},{0xff},{0xff},
+ {0x38,0x45,0x44,0x45,0x38},
+ {0xff},{0xff},{0xff},{0xff},
+ {0x3d,0x42,0x42,0x42,0x3d},
+ {0x3d,0x40,0x40,0x40,0x3d},
+};
+
#endif // MSN_DEF_H
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 3d83af1..0a1eb45 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -45,6 +45,7 @@ namespace Supernova {
SupernovaEngine::SupernovaEngine(OSystem *syst)
: Engine(syst)
, _console(NULL)
+ , _colorIndex(0)
{
// const Common::FSNode gameDataDir(ConfMan.get("path"));
// SearchMan.addSubDirectoryMatching(gameDataDir, "sound");
@@ -63,35 +64,20 @@ SupernovaEngine::~SupernovaEngine() {
}
Common::Error SupernovaEngine::run() {
+// const Graphics::PixelFormat format(3, 8, 8, 8, 0, 16, 8, 0, 0);
+// initGraphics(kScreenWidth, kScreenHeight, &format);
initGraphics(kScreenWidth, kScreenHeight);
+ debug(_system->getScreenFormat().toString().c_str());
_console = new Console(this);
+ initPalette();
initData();
- bool running = true;
- while (running) {
- Common::Event event;
- while (g_system->getEventManager()->pollEvent(event)) {
- switch (event.type) {
- case Common::EVENT_QUIT:
- case Common::EVENT_RTL:
- running = false;
- break;
-
- case Common::EVENT_KEYDOWN:
- if (event.kbd.keycode == Common::KEYCODE_d && event.kbd.hasFlags(Common::KBD_CTRL)) {
- _console->attach();
- }
- if (event.kbd.keycode == Common::KEYCODE_q) {
- playSound(48, 13530);
- }
-
- break;
- default:
- break;
- }
- }
-
+ _gameRunning = true;
+ while (_gameRunning) {
+ updateEvents();
+ renderImage(31, 0);
+
_system->updateScreen();
_system->delayMillis(10);
}
@@ -102,20 +88,99 @@ Common::Error SupernovaEngine::run() {
return Common::kNoError;
}
-void SupernovaEngine::initData() {
- Common::File f;
- if (!f.open("msn_data.047")) {
- error("File s could not be read!");
+void SupernovaEngine::updateEvents() {
+ Common::Event event;
+
+ while (g_system->getEventManager()->pollEvent(event)) {
+ switch (event.type) {
+ case Common::EVENT_QUIT:
+ case Common::EVENT_RTL:
+ _gameRunning = false;
+ break;
+
+ case Common::EVENT_KEYDOWN:
+ if (event.kbd.keycode == Common::KEYCODE_d && event.kbd.hasFlags(Common::KBD_CTRL)) {
+ _console->attach();
+ }
+ if (event.kbd.keycode == Common::KEYCODE_q) {
+ playSound(48, 13530);
+ }
+ if (event.kbd.keycode == Common::KEYCODE_w) {
+ ++_colorIndex;
+ }
+ break;
+ default:
+ break;
+ }
}
+}
+
+void SupernovaEngine::initData() {
+}
+
+void SupernovaEngine::initPalette() {
+ // Default VGA palette
+ byte pal[768] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x00, 0xa8, 0x00, 0x00, 0xa8, 0xa8, 0xa8, 0x00, 0x00, 0xa8, 0x00, 0xa8,
+ 0xa8, 0x54, 0x00, 0xa8, 0xa8, 0xa8, 0x54, 0x54, 0x54, 0x54, 0x54, 0xfc, 0x54, 0xfc, 0x54, 0x54, 0xfc, 0xfc,
+ 0xfc, 0x54, 0x54, 0xfc, 0x54, 0xfc, 0xfc, 0xfc, 0x54, 0xfc, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14,
+ 0x20, 0x20, 0x20, 0x2c, 0x2c, 0x2c, 0x38, 0x38, 0x38, 0x44, 0x44, 0x44, 0x50, 0x50, 0x50, 0x60, 0x60, 0x60,
+ 0x70, 0x70, 0x70, 0x80, 0x80, 0x80, 0x90, 0x90, 0x90, 0xa0, 0xa0, 0xa0, 0xb4, 0xb4, 0xb4, 0xc8, 0xc8, 0xc8,
+ 0xe0, 0xe0, 0xe0, 0xfc, 0xfc, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00, 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc,
+ 0xfc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc, 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00,
+ 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc, 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x00,
+ 0x00, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00, 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc,
+ 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c, 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc,
+ 0xfc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc, 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c,
+ 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc, 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0x7c,
+ 0x7c, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c, 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc,
+ 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4, 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc,
+ 0xfc, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc, 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4,
+ 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc, 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0xb4,
+ 0xb4, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4, 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc,
+ 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70,
+ 0x70, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70, 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x00, 0x00, 0x70, 0x1c, 0x00,
+ 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70, 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x00,
+ 0x00, 0x70, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70,
+ 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38, 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70,
+ 0x70, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70, 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38,
+ 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70, 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x38,
+ 0x38, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38, 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70,
+ 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50, 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70,
+ 0x70, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70, 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50,
+ 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70, 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x50,
+ 0x50, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50, 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70,
+ 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x00, 0x00, 0x40, 0x10, 0x00, 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40,
+ 0x40, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40, 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00,
+ 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40, 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x00,
+ 0x00, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00, 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40,
+ 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20, 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40,
+ 0x40, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40, 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20,
+ 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40, 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x20,
+ 0x20, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20, 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40,
+ 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c, 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40,
+ 0x40, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40, 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c,
+ 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40, 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x2c,
+ 0x2c, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c, 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40,
+ 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+ byte init_pal[] = {
+ 0, 0, 0, 16,16,16, 22,22,22, 28,28,28,
+ 63,63,63, 0,52, 0, 0,63, 0, 54, 0, 0,
+ 63, 0, 0, 0, 0,30, 0, 0,45, 40,40,40,
+ 20,50,63, 10,63,10, 60,60, 0, 63,10,10
+ };
+ Common::copy(init_pal, init_pal + sizeof(init_pal), pal);
- debug("%s\t%u", f.getName(), f.size());
+ _system->getPaletteManager()->setPalette(pal, 0, 256);
}
void SupernovaEngine::playSound(int filenumber, int offset) {
- Common::File *file = new Common::File();
- Common::String filename(Common::String::format("msn_data.0%2d", filenumber));
- if (!file->open(filename)) {
- error("File %s could not be read!", filename.c_str());
+ Common::File *file = new Common::File;
+ if (!file->open(Common::String::format("msn_data.0%2d", filenumber))) {
+ error("File %s could not be read!", file->getName());
}
file->seek(offset);
@@ -129,8 +194,29 @@ void SupernovaEngine::stopSound() {
_mixer->stopHandle(_soundHandle);
}
-void SupernovaEngine::renderImage(int file, int section) {
- // STUB
+void playSoundMod(int filenumber)
+{
+ if (filenumber != 49 || filenumber != 52) {
+ error("File not supposed to be played!");
+ }
+
+ Common::File *file = new Common::File;
+ if (!file->open(Common::String::format("msn_data.0%2d", filenumber))) {
+ error("File %s could not be read!", file->getName());
+ }
+
+ // play Supernova MOD file
+}
+
+void SupernovaEngine::renderImage(int filenumber, int section) {
+ Common::File file;
+ if (!file.open(Common::String::format("msn_data.0%2d", filenumber))) {
+ error("File %s could not be read!", file.getName());
+ }
+
+ _image.loadStream(file);
+ _image.loadSection(section);
+ _system->copyRectToScreen(_image.getSurface()->getPixels(), 320, 0, 0, 320, 200);
}
}
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 4eef366..8319e9a 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -51,20 +51,17 @@ private:
Common::RandomSource *_rnd;
Console *_console;
Audio::SoundHandle _soundHandle;
-
- // name is file ending of msn_data.xxx
- // image decoded from file
- // sections ??
-// struct imageFile {
-// Common::String name;
-// MSNImageDecoder image;
-// };
-// Common::Array<imageFile> _images;
+ bool _gameRunning;
+ MSNImageDecoder _image;
+ byte _colorIndex;
void initData();
+ void initPalette();
+ void updateEvents();
void playSound(int filenumber, int offset = 0);
+ void playSoundMod(int filenumber);
void stopSound();
- void renderImage(int file, int section);
+ void renderImage(int filenumber, int section);
};
}
Commit: 9b4bade4f647441919e13a92f97926eec71663bd
https://github.com/scummvm/scummvm/commit/9b4bade4f647441919e13a92f97926eec71663bd
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T19:31:39Z
Commit Message:
SUPERNOVA: fix palette corruption on decoding
Changed paths:
engines/supernova/graphics.cpp
engines/supernova/graphics.h
engines/supernova/supernova.cpp
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index e2467d1..5913553 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -11,7 +11,8 @@ namespace Supernova {
MSNImageDecoder::MSNImageDecoder()
: _surface(NULL)
- , _palette(NULL) {
+ , _palette(NULL)
+ , _encodedImage(NULL) {
}
MSNImageDecoder::~MSNImageDecoder() {
@@ -72,6 +73,7 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
}
byte zwCodes[256];
+ Common::fill(zwCodes, zwCodes + 256, 0);
byte numRepeat = stream.readByte();
byte numZw = stream.readByte();
stream.read(zwCodes, numZw);
@@ -88,7 +90,7 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
_encodedImage[i++] = value;
}
} else if (input < numZw) {
- input = zwCodes[input];
+ input = zwCodes[input - numRepeat];
--input;
_encodedImage[i++] = input;
_encodedImage[i++] = input;
@@ -157,6 +159,10 @@ void MSNImageDecoder::destroy() {
_surface->free();
_surface = NULL;
}
+ if (_encodedImage) {
+ delete[] _encodedImage;
+ _encodedImage = NULL;
+ }
}
}
diff --git a/engines/supernova/graphics.h b/engines/supernova/graphics.h
index 94d6b5e..7cd0e3c 100644
--- a/engines/supernova/graphics.h
+++ b/engines/supernova/graphics.h
@@ -9,7 +9,7 @@ class SeekableReadStream;
}
namespace Graphics {
-class Surface;
+struct Surface;
}
namespace Supernova {
@@ -24,11 +24,6 @@ const byte initPalette[48] = {
63, 10, 10
};
-// TODO
-const byte defaultVGAPalette[] = {
- 0, 0, 0
-};
-
class MSNImageDecoder : public Image::ImageDecoder {
public:
MSNImageDecoder();
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 0a1eb45..a230223 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -64,8 +64,6 @@ SupernovaEngine::~SupernovaEngine() {
}
Common::Error SupernovaEngine::run() {
-// const Graphics::PixelFormat format(3, 8, 8, 8, 0, 16, 8, 0, 0);
-// initGraphics(kScreenWidth, kScreenHeight, &format);
initGraphics(kScreenWidth, kScreenHeight);
debug(_system->getScreenFormat().toString().c_str());
_console = new Console(this);
@@ -172,9 +170,9 @@ void SupernovaEngine::initPalette() {
63, 0, 0, 0, 0,30, 0, 0,45, 40,40,40,
20,50,63, 10,63,10, 60,60, 0, 63,10,10
};
- Common::copy(init_pal, init_pal + sizeof(init_pal), pal);
_system->getPaletteManager()->setPalette(pal, 0, 256);
+ _system->getPaletteManager()->setPalette(init_pal, 0, 16);
}
void SupernovaEngine::playSound(int filenumber, int offset) {
Commit: 332763e8253f11e769f44bbaf17b4ddb3e80c097
https://github.com/scummvm/scummvm/commit/332763e8253f11e769f44bbaf17b4ddb3e80c097
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T19:31:42Z
Commit Message:
SUPERNOVA: add renderBox()
Changed paths:
engines/supernova/graphics.cpp
engines/supernova/graphics.h
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index 5913553..dfec15f 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -72,8 +72,7 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
_clickField[i].next = stream.readByte();
}
- byte zwCodes[256];
- Common::fill(zwCodes, zwCodes + 256, 0);
+ byte zwCodes[256] = {0};
byte numRepeat = stream.readByte();
byte numZw = stream.readByte();
stream.read(zwCodes, numZw);
diff --git a/engines/supernova/graphics.h b/engines/supernova/graphics.h
index 7cd0e3c..585aabe 100644
--- a/engines/supernova/graphics.h
+++ b/engines/supernova/graphics.h
@@ -14,16 +14,6 @@ struct Surface;
namespace Supernova {
-const byte initPalette[48] = {
-// r g b
- 0, 0, 0, 16, 16, 16, 22, 22, 22,
- 28, 28, 28, 63, 63, 63, 0, 52, 0,
- 0, 63, 0, 54, 0, 0, 63, 0, 0,
- 0, 0, 30, 0, 0, 45, 40, 40, 40,
- 20, 50, 63, 10, 63, 10, 60, 60, 0,
- 63, 10, 10
-};
-
class MSNImageDecoder : public Image::ImageDecoder {
public:
MSNImageDecoder();
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index a230223..f05aa1b 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -74,7 +74,6 @@ Common::Error SupernovaEngine::run() {
_gameRunning = true;
while (_gameRunning) {
updateEvents();
- renderImage(31, 0);
_system->updateScreen();
_system->delayMillis(10);
@@ -217,4 +216,14 @@ void SupernovaEngine::renderImage(int filenumber, int section) {
_system->copyRectToScreen(_image.getSurface()->getPixels(), 320, 0, 0, 320, 200);
}
+
+void SupernovaEngine::renderBox(int x, int y, int width, int height, byte color) {
+ Graphics::Surface *screen = _system->lockScreen();
+ screen->drawLine(x, y, x + width, y, color);
+ screen->drawLine(x + width, y, x + width, y + height, color);
+ screen->drawLine(x + width, y + height, x, y + height, color);
+ screen->drawLine(x, y + height, x, y, color);
+ _system->unlockScreen();
+}
+
}
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 8319e9a..823184a 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -62,6 +62,7 @@ private:
void playSoundMod(int filenumber);
void stopSound();
void renderImage(int filenumber, int section);
+ void renderBox(int x, int y, int width, int height, byte color);
};
}
Commit: e7252018e8ea645af733b2201a69e6427e0ef091
https://github.com/scummvm/scummvm/commit/e7252018e8ea645af733b2201a69e6427e0ef091
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T19:31:42Z
Commit Message:
SUPERNOVA: add characterWidth() function
Also did some cleanup on the font definition
Changed paths:
engines/supernova/msn_def.h
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index c17b7bd..10b4e32 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -387,27 +387,27 @@ const byte mouseWait[64] = {
0x34,0x2c,0x14,0x28,0xfe,0x7f,0x00,0x00
};
-char font[][5] =
+const byte font[][5] =
{
- {0x00,0x00,0x00,0xff},
- {0x5f,0xff},
- {0x03,0x00,0x03,0xff},
+ {0x00,0x00,0x00,0xff,0x00},
+ {0x5f,0xff,0x00,0x00,0x00},
+ {0x03,0x00,0x03,0xff,0x00},
{0x14,0x7f,0x14,0x7f,0x14},
{0x24,0x2a,0x7f,0x2a,0x12},
{0x61,0x10,0x08,0x04,0x43},
{0x38,0x4e,0x59,0x26,0x50},
- {0x03,0xff},
- {0x3e,0x41,0xff},
- {0x41,0x3e,0xff},
+ {0x03,0xff,0x00,0x00,0x00},
+ {0x3e,0x41,0xff,0x00,0x00},
+ {0x41,0x3e,0xff,0x00,0x00},
{0x10,0x54,0x38,0x54,0x10},
{0x10,0x10,0x7c,0x10,0x10},
- {0x80,0x40,0xff},
+ {0x80,0x40,0xff,0x00,0x00},
{0x10,0x10,0x10,0x10,0x10},
- {0x40,0xff},
+ {0x40,0xff,0x00,0x00,0x00},
{0x60,0x10,0x08,0x04,0x03},
{0x3e,0x41,0x41,0x41,0x3e}, /* digits */
- {0x04,0x02,0x7f,0xff},
+ {0x04,0x02,0x7f,0xff,0x00},
{0x42,0x61,0x51,0x49,0x46},
{0x22,0x41,0x49,0x49,0x36},
{0x18,0x14,0x12,0x7f,0x10},
@@ -417,11 +417,11 @@ char font[][5] =
{0x36,0x49,0x49,0x49,0x36},
{0x26,0x49,0x49,0x49,0x3e},
- {0x44,0xff},
- {0x80,0x44,0xff},
- {0x10,0x28,0x44,0xff},
+ {0x44,0xff,0x00,0x00,0x00},
+ {0x80,0x44,0xff,0x00,0x00},
+ {0x10,0x28,0x44,0xff,0x00},
{0x28,0x28,0x28,0x28,0x28},
- {0x44,0x28,0x10,0xff},
+ {0x44,0x28,0x10,0xff,0x00},
{0x02,0x01,0x51,0x09,0x06},
{0x3e,0x41,0x5d,0x5d,0x1e},
@@ -433,7 +433,7 @@ char font[][5] =
{0x7f,0x09,0x09,0x09,0xff},
{0x3e,0x41,0x41,0x49,0x3a},
{0x7f,0x08,0x08,0x08,0x7f},
- {0x41,0x7f,0x41,0xff},
+ {0x41,0x7f,0x41,0xff,0x00},
{0x20,0x40,0x40,0x3f,0xff},
{0x7f,0x08,0x14,0x22,0x41},
{0x7f,0x40,0x40,0x40,0xff},
@@ -452,12 +452,12 @@ char font[][5] =
{0x03,0x04,0x78,0x04,0x03},
{0x61,0x51,0x49,0x45,0x43},
- {0x7f,0x41,0x41,0xff},
+ {0x7f,0x41,0x41,0xff,0x00},
{0x03,0x04,0x08,0x10,0x60},
- {0x41,0x41,0x7f,0xff},
- {0x02,0x01,0x02,0xff},
+ {0x41,0x41,0x7f,0xff,0x00},
+ {0x02,0x01,0x02,0xff,0x00},
{0x80,0x80,0x80,0x80,0x80},
- {0x01,0x02,0xff},
+ {0x01,0x02,0xff,0x00,0x00},
{0x38,0x44,0x44,0x44,0x7c}, /* lowercase letters */
{0x7f,0x44,0x44,0x44,0x38},
@@ -467,10 +467,10 @@ char font[][5] =
{0x04,0x7e,0x05,0x01,0xff},
{0x98,0xa4,0xa4,0xa4,0x7c},
{0x7f,0x04,0x04,0x04,0x78},
- {0x7d,0xff},
- {0x80,0x80,0x7d,0xff},
+ {0x7d,0xff,0x00,0x00,0x00},
+ {0x80,0x80,0x7d,0xff,0x00},
{0x7f,0x10,0x28,0x44,0xff},
- {0x7f,0xff},
+ {0x7f,0xff,0x00,0x00,0x00},
{0x7c,0x04,0x7c,0x04,0x78},
{0x7c,0x04,0x04,0x04,0x78},
{0x38,0x44,0x44,0x44,0x38},
@@ -486,13 +486,13 @@ char font[][5] =
{0x9c,0xa0,0xa0,0xa0,0x7c},
{0x44,0x64,0x54,0x4c,0x44},
- {0x08,0x36,0x41,0xff},
- {0x77,0xff},
- {0x41,0x36,0x08,0xff},
+ {0x08,0x36,0x41,0xff,0x00},
+ {0x77,0xff,0x00,0x00,0x00},
+ {0x41,0x36,0x08,0xff,0x00},
{0x02,0x01,0x02,0x01,0xff},
- {0xff},
+ {0xff,0x00,0x00,0x00,0x00},
- {0xfe,0x49,0x49,0x4e,0x30}, /* á */
+ {0xfe,0x49,0x49,0x4e,0x30}, /* sharp S */
{0x7c,0x41,0x40,0x41,0x3c}, /* umlauts */
@@ -500,11 +500,26 @@ char font[][5] =
{0x20,0x60,0xfe,0x60,0x20},
{0x38,0x45,0x44,0x45,0x7c}, /* umlauts */
- {0xff},{0xff},{0xff},{0xff},{0xff},{0xff},{0xff},{0xff},{0xff},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
{0x79,0x14,0x12,0x14,0x79},
- {0xff},{0xff},{0xff},{0xff},{0xff},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
{0x38,0x45,0x44,0x45,0x38},
- {0xff},{0xff},{0xff},{0xff},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
{0x3d,0x42,0x42,0x42,0x3d},
{0x3d,0x40,0x40,0x40,0x3d},
};
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index f05aa1b..db97ad7 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -38,6 +38,7 @@
//#include "graphics/fontman.h"
#include "supernova/supernova.h"
+#include "supernova/msn_def.h"
namespace Supernova {
@@ -74,6 +75,7 @@ Common::Error SupernovaEngine::run() {
_gameRunning = true;
while (_gameRunning) {
updateEvents();
+ renderImage(31, 0);
_system->updateScreen();
_system->delayMillis(10);
@@ -216,6 +218,26 @@ void SupernovaEngine::renderImage(int filenumber, int section) {
_system->copyRectToScreen(_image.getSurface()->getPixels(), 320, 0, 0, 320, 200);
}
+static int characterWidth(const char *text) {
+ int charWidth = 0;
+ while (*text != '\0') {
+ byte c = *text++;
+ if (c < 32) {
+ continue;
+ } else if (c == 225) {
+ c = 35;
+ }
+
+ for (size_t i = 0; i < 5; ++i) {
+ ++charWidth;
+ if (font[c - 32][i] == 0xff) {
+ break;
+ }
+ }
+ }
+
+ return charWidth;
+}
void SupernovaEngine::renderBox(int x, int y, int width, int height, byte color) {
Graphics::Surface *screen = _system->lockScreen();
@@ -227,3 +249,4 @@ void SupernovaEngine::renderBox(int x, int y, int width, int height, byte color)
}
}
+
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 823184a..2167df0 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -62,6 +62,7 @@ private:
void playSoundMod(int filenumber);
void stopSound();
void renderImage(int filenumber, int section);
+ void renderText(const char *text, int x, int y);
void renderBox(int x, int y, int width, int height, byte color);
};
Commit: c0b8b50ec662c477febadefa750aef3dd41e6d35
https://github.com/scummvm/scummvm/commit/c0b8b50ec662c477febadefa750aef3dd41e6d35
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T19:31:42Z
Commit Message:
SUPERNOVA: add text rendering
Currently renderText() has two performance drawbacks. First, it locks
the screen surface during the whole function for drawing the text
directly to it. Besides that, it accesses the pixels in a cache
unfriendly way because the font glyphs are stored tilted by 90 degrees.
Most likely it won't pose any problems but if it should those issues
need to be prioritized.
Changed paths:
engines/supernova/msn_def.h
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 10b4e32..e7ae963 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -363,6 +363,46 @@ enum {X,
}
+enum MessagePosition {
+ kMessageNormal,
+ kMessageLeft,
+ kMessageRight,
+ kMessageCenter,
+ kMessageTop
+};
+
+// Colors
+#define HGR_BEF 1
+#define COL_BEF 5
+#define HGR_BEF_HELL 3
+#define COL_BEF_HELL 6
+
+#define HGR_INV 1
+#define COL_INV 7
+#define HGR_INV_HELL 2
+#define COL_INV_HELL 8
+
+#define HGR_BEF_ANZ 1
+#define COL_BEF_ANZ 5
+
+#define HGR_AUSG 1
+#define COL_AUSG 7
+
+#define HGR_MELD 2
+#define COL_MELD 4
+
+#define COL_LWIN 7
+#define HGR_LADEN 10
+#define COL_LADEN 4
+#define HGR_LADEN2 9
+#define COL_LADEN2 11
+#define HGR_NAME 9
+#define COL_NAME 15
+
+#define HGR_EDIT 9
+#define COL_EDIT 4
+
+
const byte mouseNormal[64] = {
0xff,0x3f,0xff,0x1f,0xff,0x0f,0xff,0x07,
0xff,0x03,0xff,0x01,0xff,0x00,0x7f,0x00,
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index db97ad7..84b8550 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -76,6 +76,7 @@ Common::Error SupernovaEngine::run() {
while (_gameRunning) {
updateEvents();
renderImage(31, 0);
+ renderText("Das Schicksal", 44, 132, 4);
_system->updateScreen();
_system->delayMillis(10);
@@ -239,12 +240,109 @@ static int characterWidth(const char *text) {
return charWidth;
}
+void SupernovaEngine::renderMessage(char *text, MessagePosition position) {
+ char *row[20];
+ char *p = text;
+ size_t numRows = 0;
+ int rowWidthMax = 0;
+ int x = 0;
+ int y = 0;
+ byte textColor = 0;
+
+ while (*p != '\0') {
+ row[numRows] = p;
+ ++numRows;
+ while ((*p != '\0') && (*p != '|')) {
+ ++p;
+ }
+ if (*p == '|') {
+ *p = '\0';
+ ++p;
+ }
+ }
+ for (size_t i = 0; i < numRows; ++i) {
+ int rowWidth = characterWidth(row[i]);
+ if (rowWidth > rowWidthMax)
+ rowWidthMax = rowWidth;
+ }
+
+ switch (position) {
+ case kMessageNormal:
+ x = rowWidthMax / 2 - 160;
+ textColor = COL_MELD;
+ break;
+ case kMessageTop:
+ x = rowWidthMax / 2 - 160;
+ textColor = 14;
+ break;
+ case kMessageCenter:
+ x = rowWidthMax / 2 - 160;
+ textColor = 15;
+ break;
+ case kMessageLeft:
+ x = 3;
+ textColor = 14;
+ break;
+ case kMessageRight:
+ x = 317 - rowWidthMax;
+ textColor = 13;
+ break;
+ }
+
+ if (position == kMessageNormal) {
+ y = 70 - ((numRows * 9) / 2);
+ } else if (position == kMessageTop) {
+ y = 5;
+ } else {
+ y = 142;
+ }
+
+ int message_columns = x - 3;
+ int message_rows = y - 3;
+ int message_width = rowWidthMax + 6;
+ int message_height = numRows * 9 + 5;
+ renderBox(message_columns,message_rows,message_width,message_height,HGR_MELD);
+ for (size_t i = 0; i < numRows; ++i) {
+ renderText(row[i], x, y, textColor);
+ y += 9;
+ }
+
+// timer1 = (Common::strnlen(text, BUFSIZ) + 20) * textspeed / 10;
+}
+
+void SupernovaEngine::renderText(const char *text, int x, int y, byte color) {
+ Graphics::Surface *screen = _system->lockScreen();
+ byte *cursor = static_cast<byte *>(screen->getBasePtr(x, y));
+ byte c;
+ while ((c = *text++) != '\0') {
+ if (c < 32) {
+ continue;
+ } else if (c == 225) {
+ c = 128;
+ }
+
+ for (size_t i = 0; i < 5; ++i) {
+ if (font[c - 32][i] == 0xff) {
+ ++cursor;
+ break;
+ }
+
+ byte *ascentLine = cursor;
+ for (byte j = font[c - 32][i]; j != 0; j >>= 1) {
+ if (j & 1) {
+ *cursor = color;
+ }
+ cursor += kScreenWidth;
+ }
+ cursor = ++ascentLine;
+ }
+ }
+ _system->unlockScreen();
+}
+
void SupernovaEngine::renderBox(int x, int y, int width, int height, byte color) {
Graphics::Surface *screen = _system->lockScreen();
- screen->drawLine(x, y, x + width, y, color);
- screen->drawLine(x + width, y, x + width, y + height, color);
- screen->drawLine(x + width, y + height, x, y + height, color);
- screen->drawLine(x, y + height, x, y, color);
+ screen->fillRect(Common::Rect(x, y, width, height), color);
_system->unlockScreen();
}
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 2167df0..cac80e1 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -33,6 +33,7 @@
#include "supernova/console.h"
#include "supernova/graphics.h"
+#include "supernova/msn_def.h"
namespace Supernova {
@@ -62,7 +63,8 @@ private:
void playSoundMod(int filenumber);
void stopSound();
void renderImage(int filenumber, int section);
- void renderText(const char *text, int x, int y);
+ void renderMessage(char *text, MessagePosition position);
+ void renderText(const char *text, int x, int y, byte color);
void renderBox(int x, int y, int width, int height, byte color);
};
Commit: ca8c87ff2eb895d8b5a4538245e79b5240eb436d
https://github.com/scummvm/scummvm/commit/ca8c87ff2eb895d8b5a4538245e79b5240eb436d
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T19:31:42Z
Commit Message:
SUPERNOVA: Fix image palette loading
Mistakenly, during image loading the system palette was completely
substituted by the image palette although the first 16 colors are
supposed to be preserved.
Changed paths:
engines/supernova/graphics.cpp
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index dfec15f..7073de9 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -29,8 +29,8 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
size *= 16; // a paragraph is 16 bytes
_encodedImage = new byte[size];
- _palette = new byte[768];
- g_system->getPaletteManager()->grabPalette(_palette, 0, 256);
+ _palette = new byte[717];
+ g_system->getPaletteManager()->grabPalette(_palette, 16, 240);
byte pal_diff;
byte flag = stream.readByte();
@@ -45,7 +45,7 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
_palette[717 - i] = stream.readByte();
}
}
- g_system->getPaletteManager()->setPalette(_palette, 0, 256);
+ g_system->getPaletteManager()->setPalette(_palette, 16, 240);
byte numSections = stream.readByte();
for (size_t i = 0; i < kMaxSections; ++i) {
Commit: 0c72f52ad880279037004e78f36c302d5422b53f
https://github.com/scummvm/scummvm/commit/0c72f52ad880279037004e78f36c302d5422b53f
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T21:16:27Z
Commit Message:
SUPERNOVA: Add palette fade in/out
Changed paths:
engines/supernova/graphics.cpp
engines/supernova/msn_def.h
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index 7073de9..d0d26eb 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -45,7 +45,10 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
_palette[717 - i] = stream.readByte();
}
}
- g_system->getPaletteManager()->setPalette(_palette, 16, 240);
+ // 18bit VGA to 24bit CLUT8
+ for (size_t i = 0; i < 717; ++i) {
+ _palette[i] <<= 2;
+ }
byte numSections = stream.readByte();
for (size_t i = 0; i < kMaxSections; ++i) {
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index e7ae963..b2aef9d 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -361,8 +361,6 @@ enum {X,
TICKETS};
-}
-
enum MessagePosition {
kMessageNormal,
kMessageLeft,
@@ -404,164 +402,214 @@ enum MessagePosition {
const byte mouseNormal[64] = {
- 0xff,0x3f,0xff,0x1f,0xff,0x0f,0xff,0x07,
- 0xff,0x03,0xff,0x01,0xff,0x00,0x7f,0x00,
- 0x3f,0x00,0x1f,0x00,0x0f,0x00,0x0f,0x00,
- 0xff,0x00,0x7f,0x18,0x7f,0x38,0x7f,0xfc,
-
- 0x00,0x00,0x00,0x40,0x00,0x60,0x00,0x70,
- 0x00,0x78,0x00,0x7c,0x00,0x7e,0x00,0x7f,
- 0x80,0x7f,0xc0,0x7f,0xe0,0x7f,0x00,0x7e,
- 0x00,0x66,0x00,0x43,0x00,0x03,0x00,0x00
+ 0xff,0x3f,0xff,0x1f,0xff,0x0f,0xff,0x07,
+ 0xff,0x03,0xff,0x01,0xff,0x00,0x7f,0x00,
+ 0x3f,0x00,0x1f,0x00,0x0f,0x00,0x0f,0x00,
+ 0xff,0x00,0x7f,0x18,0x7f,0x38,0x7f,0xfc,
+
+ 0x00,0x00,0x00,0x40,0x00,0x60,0x00,0x70,
+ 0x00,0x78,0x00,0x7c,0x00,0x7e,0x00,0x7f,
+ 0x80,0x7f,0xc0,0x7f,0xe0,0x7f,0x00,0x7e,
+ 0x00,0x66,0x00,0x43,0x00,0x03,0x00,0x00
};
const byte mouseWait[64] = {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,
- 0x01,0x80,0x01,0x80,0x11,0x88,0x31,0x8c,
- 0x31,0x8c,0x11,0x88,0x01,0x80,0x01,0x80,
- 0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
-
- 0x00,0x00,0xfe,0x7f,0xf4,0x2f,0xf4,0x2f,
- 0x14,0x28,0x24,0x24,0x44,0x22,0x84,0x21,
- 0x84,0x21,0xc4,0x23,0xe4,0x27,0x74,0x2e,
- 0x34,0x2c,0x14,0x28,0xfe,0x7f,0x00,0x00
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,
+ 0x01,0x80,0x01,0x80,0x11,0x88,0x31,0x8c,
+ 0x31,0x8c,0x11,0x88,0x01,0x80,0x01,0x80,
+ 0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0xfe,0x7f,0xf4,0x2f,0xf4,0x2f,
+ 0x14,0x28,0x24,0x24,0x44,0x22,0x84,0x21,
+ 0x84,0x21,0xc4,0x23,0xe4,0x27,0x74,0x2e,
+ 0x34,0x2c,0x14,0x28,0xfe,0x7f,0x00,0x00
};
const byte font[][5] =
{
- {0x00,0x00,0x00,0xff,0x00},
- {0x5f,0xff,0x00,0x00,0x00},
- {0x03,0x00,0x03,0xff,0x00},
- {0x14,0x7f,0x14,0x7f,0x14},
- {0x24,0x2a,0x7f,0x2a,0x12},
- {0x61,0x10,0x08,0x04,0x43},
- {0x38,0x4e,0x59,0x26,0x50},
- {0x03,0xff,0x00,0x00,0x00},
- {0x3e,0x41,0xff,0x00,0x00},
- {0x41,0x3e,0xff,0x00,0x00},
- {0x10,0x54,0x38,0x54,0x10},
- {0x10,0x10,0x7c,0x10,0x10},
- {0x80,0x40,0xff,0x00,0x00},
- {0x10,0x10,0x10,0x10,0x10},
- {0x40,0xff,0x00,0x00,0x00},
- {0x60,0x10,0x08,0x04,0x03},
-
- {0x3e,0x41,0x41,0x41,0x3e}, /* digits */
- {0x04,0x02,0x7f,0xff,0x00},
- {0x42,0x61,0x51,0x49,0x46},
- {0x22,0x41,0x49,0x49,0x36},
- {0x18,0x14,0x12,0x7f,0x10},
- {0x27,0x45,0x45,0x45,0x39},
- {0x3e,0x49,0x49,0x49,0x32},
- {0x01,0x61,0x19,0x07,0x01},
- {0x36,0x49,0x49,0x49,0x36},
- {0x26,0x49,0x49,0x49,0x3e},
-
- {0x44,0xff,0x00,0x00,0x00},
- {0x80,0x44,0xff,0x00,0x00},
- {0x10,0x28,0x44,0xff,0x00},
- {0x28,0x28,0x28,0x28,0x28},
- {0x44,0x28,0x10,0xff,0x00},
- {0x02,0x01,0x51,0x09,0x06},
- {0x3e,0x41,0x5d,0x5d,0x1e},
-
- {0x7c,0x12,0x11,0x12,0x7c}, /* uppercase letters*/
- {0x7f,0x49,0x49,0x49,0x36},
- {0x3e,0x41,0x41,0x41,0x22},
- {0x7f,0x41,0x41,0x22,0x1c},
- {0x7f,0x49,0x49,0x49,0xff},
- {0x7f,0x09,0x09,0x09,0xff},
- {0x3e,0x41,0x41,0x49,0x3a},
- {0x7f,0x08,0x08,0x08,0x7f},
- {0x41,0x7f,0x41,0xff,0x00},
- {0x20,0x40,0x40,0x3f,0xff},
- {0x7f,0x08,0x14,0x22,0x41},
- {0x7f,0x40,0x40,0x40,0xff},
- {0x7f,0x02,0x04,0x02,0x7f},
- {0x7f,0x02,0x0c,0x10,0x7f},
- {0x3e,0x41,0x41,0x41,0x3e},
- {0x7f,0x09,0x09,0x09,0x06},
- {0x3e,0x41,0x51,0x21,0x5e},
- {0x7f,0x09,0x19,0x29,0x46},
- {0x26,0x49,0x49,0x49,0x32},
- {0x01,0x01,0x7f,0x01,0x01},
- {0x3f,0x40,0x40,0x40,0x3f},
- {0x07,0x18,0x60,0x18,0x07},
- {0x1f,0x60,0x18,0x60,0x1f},
- {0x63,0x14,0x08,0x14,0x63},
- {0x03,0x04,0x78,0x04,0x03},
- {0x61,0x51,0x49,0x45,0x43},
-
- {0x7f,0x41,0x41,0xff,0x00},
- {0x03,0x04,0x08,0x10,0x60},
- {0x41,0x41,0x7f,0xff,0x00},
- {0x02,0x01,0x02,0xff,0x00},
- {0x80,0x80,0x80,0x80,0x80},
- {0x01,0x02,0xff,0x00,0x00},
-
- {0x38,0x44,0x44,0x44,0x7c}, /* lowercase letters */
- {0x7f,0x44,0x44,0x44,0x38},
- {0x38,0x44,0x44,0x44,0x44},
- {0x38,0x44,0x44,0x44,0x7f},
- {0x38,0x54,0x54,0x54,0x58},
- {0x04,0x7e,0x05,0x01,0xff},
- {0x98,0xa4,0xa4,0xa4,0x7c},
- {0x7f,0x04,0x04,0x04,0x78},
- {0x7d,0xff,0x00,0x00,0x00},
- {0x80,0x80,0x7d,0xff,0x00},
- {0x7f,0x10,0x28,0x44,0xff},
- {0x7f,0xff,0x00,0x00,0x00},
- {0x7c,0x04,0x7c,0x04,0x78},
- {0x7c,0x04,0x04,0x04,0x78},
- {0x38,0x44,0x44,0x44,0x38},
- {0xfc,0x24,0x24,0x24,0x18},
- {0x18,0x24,0x24,0x24,0xfc},
- {0x7c,0x08,0x04,0x04,0xff},
- {0x48,0x54,0x54,0x54,0x24},
- {0x04,0x3e,0x44,0x40,0xff},
- {0x7c,0x40,0x40,0x40,0x3c},
- {0x0c,0x30,0x40,0x30,0x0c},
- {0x3c,0x40,0x3c,0x40,0x3c},
- {0x44,0x28,0x10,0x28,0x44},
- {0x9c,0xa0,0xa0,0xa0,0x7c},
- {0x44,0x64,0x54,0x4c,0x44},
-
- {0x08,0x36,0x41,0xff,0x00},
- {0x77,0xff,0x00,0x00,0x00},
- {0x41,0x36,0x08,0xff,0x00},
- {0x02,0x01,0x02,0x01,0xff},
- {0xff,0x00,0x00,0x00,0x00},
-
- {0xfe,0x49,0x49,0x4e,0x30}, /* sharp S */
-
- {0x7c,0x41,0x40,0x41,0x3c}, /* umlauts */
-
- {0x04,0x06,0x7f,0x06,0x04}, /* arrows */
- {0x20,0x60,0xfe,0x60,0x20},
-
- {0x38,0x45,0x44,0x45,0x7c}, /* umlauts */
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0x79,0x14,0x12,0x14,0x79},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0x38,0x45,0x44,0x45,0x38},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0x3d,0x42,0x42,0x42,0x3d},
- {0x3d,0x40,0x40,0x40,0x3d},
+ {0x00,0x00,0x00,0xff,0x00},
+ {0x5f,0xff,0x00,0x00,0x00},
+ {0x03,0x00,0x03,0xff,0x00},
+ {0x14,0x7f,0x14,0x7f,0x14},
+ {0x24,0x2a,0x7f,0x2a,0x12},
+ {0x61,0x10,0x08,0x04,0x43},
+ {0x38,0x4e,0x59,0x26,0x50},
+ {0x03,0xff,0x00,0x00,0x00},
+ {0x3e,0x41,0xff,0x00,0x00},
+ {0x41,0x3e,0xff,0x00,0x00},
+ {0x10,0x54,0x38,0x54,0x10},
+ {0x10,0x10,0x7c,0x10,0x10},
+ {0x80,0x40,0xff,0x00,0x00},
+ {0x10,0x10,0x10,0x10,0x10},
+ {0x40,0xff,0x00,0x00,0x00},
+ {0x60,0x10,0x08,0x04,0x03},
+
+ {0x3e,0x41,0x41,0x41,0x3e}, /* digits */
+ {0x04,0x02,0x7f,0xff,0x00},
+ {0x42,0x61,0x51,0x49,0x46},
+ {0x22,0x41,0x49,0x49,0x36},
+ {0x18,0x14,0x12,0x7f,0x10},
+ {0x27,0x45,0x45,0x45,0x39},
+ {0x3e,0x49,0x49,0x49,0x32},
+ {0x01,0x61,0x19,0x07,0x01},
+ {0x36,0x49,0x49,0x49,0x36},
+ {0x26,0x49,0x49,0x49,0x3e},
+
+ {0x44,0xff,0x00,0x00,0x00},
+ {0x80,0x44,0xff,0x00,0x00},
+ {0x10,0x28,0x44,0xff,0x00},
+ {0x28,0x28,0x28,0x28,0x28},
+ {0x44,0x28,0x10,0xff,0x00},
+ {0x02,0x01,0x51,0x09,0x06},
+ {0x3e,0x41,0x5d,0x5d,0x1e},
+
+ {0x7c,0x12,0x11,0x12,0x7c}, /* uppercase letters*/
+ {0x7f,0x49,0x49,0x49,0x36},
+ {0x3e,0x41,0x41,0x41,0x22},
+ {0x7f,0x41,0x41,0x22,0x1c},
+ {0x7f,0x49,0x49,0x49,0xff},
+ {0x7f,0x09,0x09,0x09,0xff},
+ {0x3e,0x41,0x41,0x49,0x3a},
+ {0x7f,0x08,0x08,0x08,0x7f},
+ {0x41,0x7f,0x41,0xff,0x00},
+ {0x20,0x40,0x40,0x3f,0xff},
+ {0x7f,0x08,0x14,0x22,0x41},
+ {0x7f,0x40,0x40,0x40,0xff},
+ {0x7f,0x02,0x04,0x02,0x7f},
+ {0x7f,0x02,0x0c,0x10,0x7f},
+ {0x3e,0x41,0x41,0x41,0x3e},
+ {0x7f,0x09,0x09,0x09,0x06},
+ {0x3e,0x41,0x51,0x21,0x5e},
+ {0x7f,0x09,0x19,0x29,0x46},
+ {0x26,0x49,0x49,0x49,0x32},
+ {0x01,0x01,0x7f,0x01,0x01},
+ {0x3f,0x40,0x40,0x40,0x3f},
+ {0x07,0x18,0x60,0x18,0x07},
+ {0x1f,0x60,0x18,0x60,0x1f},
+ {0x63,0x14,0x08,0x14,0x63},
+ {0x03,0x04,0x78,0x04,0x03},
+ {0x61,0x51,0x49,0x45,0x43},
+
+ {0x7f,0x41,0x41,0xff,0x00},
+ {0x03,0x04,0x08,0x10,0x60},
+ {0x41,0x41,0x7f,0xff,0x00},
+ {0x02,0x01,0x02,0xff,0x00},
+ {0x80,0x80,0x80,0x80,0x80},
+ {0x01,0x02,0xff,0x00,0x00},
+
+ {0x38,0x44,0x44,0x44,0x7c}, /* lowercase letters */
+ {0x7f,0x44,0x44,0x44,0x38},
+ {0x38,0x44,0x44,0x44,0x44},
+ {0x38,0x44,0x44,0x44,0x7f},
+ {0x38,0x54,0x54,0x54,0x58},
+ {0x04,0x7e,0x05,0x01,0xff},
+ {0x98,0xa4,0xa4,0xa4,0x7c},
+ {0x7f,0x04,0x04,0x04,0x78},
+ {0x7d,0xff,0x00,0x00,0x00},
+ {0x80,0x80,0x7d,0xff,0x00},
+ {0x7f,0x10,0x28,0x44,0xff},
+ {0x7f,0xff,0x00,0x00,0x00},
+ {0x7c,0x04,0x7c,0x04,0x78},
+ {0x7c,0x04,0x04,0x04,0x78},
+ {0x38,0x44,0x44,0x44,0x38},
+ {0xfc,0x24,0x24,0x24,0x18},
+ {0x18,0x24,0x24,0x24,0xfc},
+ {0x7c,0x08,0x04,0x04,0xff},
+ {0x48,0x54,0x54,0x54,0x24},
+ {0x04,0x3e,0x44,0x40,0xff},
+ {0x7c,0x40,0x40,0x40,0x3c},
+ {0x0c,0x30,0x40,0x30,0x0c},
+ {0x3c,0x40,0x3c,0x40,0x3c},
+ {0x44,0x28,0x10,0x28,0x44},
+ {0x9c,0xa0,0xa0,0xa0,0x7c},
+ {0x44,0x64,0x54,0x4c,0x44},
+
+ {0x08,0x36,0x41,0xff,0x00},
+ {0x77,0xff,0x00,0x00,0x00},
+ {0x41,0x36,0x08,0xff,0x00},
+ {0x02,0x01,0x02,0x01,0xff},
+ {0xff,0x00,0x00,0x00,0x00},
+
+ {0xfe,0x49,0x49,0x4e,0x30}, /* sharp S */
+
+ {0x7c,0x41,0x40,0x41,0x3c}, /* umlauts */
+
+ {0x04,0x06,0x7f,0x06,0x04}, /* arrows */
+ {0x20,0x60,0xfe,0x60,0x20},
+
+ {0x38,0x45,0x44,0x45,0x7c}, /* umlauts */
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0x79,0x14,0x12,0x14,0x79},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0x38,0x45,0x44,0x45,0x38},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0x3d,0x42,0x42,0x42,0x3d},
+ {0x3d,0x40,0x40,0x40,0x3d},
};
+ // Default palette
+ const byte initVGAPalette[768] = {
+ 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x58, 0x58, 0x58, 0x70, 0x70, 0x70, 0xfc, 0xfc, 0xfc, 0x00, 0xd0, 0x00,
+ 0x00, 0xfc, 0x00, 0xd8, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xb0, 0xa0, 0xa0, 0xa0,
+ 0x50, 0xc8, 0xfc, 0x28, 0xfc, 0x28, 0xf0, 0xf0, 0x00, 0xfc, 0x28, 0x28, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14,
+ 0x20, 0x20, 0x20, 0x2c, 0x2c, 0x2c, 0x38, 0x38, 0x38, 0x44, 0x44, 0x44, 0x50, 0x50, 0x50, 0x60, 0x60, 0x60,
+ 0x70, 0x70, 0x70, 0x80, 0x80, 0x80, 0x90, 0x90, 0x90, 0xa0, 0xa0, 0xa0, 0xb4, 0xb4, 0xb4, 0xc8, 0xc8, 0xc8,
+ 0xe0, 0xe0, 0xe0, 0xfc, 0xfc, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00, 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc,
+ 0xfc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc, 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00,
+ 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc, 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x00,
+ 0x00, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00, 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc,
+ 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c, 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc,
+ 0xfc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc, 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c,
+ 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc, 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0x7c,
+ 0x7c, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c, 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc,
+ 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4, 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc,
+ 0xfc, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc, 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4,
+ 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc, 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0xb4,
+ 0xb4, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4, 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc,
+ 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70,
+ 0x70, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70, 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x00, 0x00, 0x70, 0x1c, 0x00,
+ 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70, 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x00,
+ 0x00, 0x70, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70,
+ 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38, 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70,
+ 0x70, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70, 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38,
+ 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70, 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x38,
+ 0x38, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38, 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70,
+ 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50, 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70,
+ 0x70, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70, 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50,
+ 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70, 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x50,
+ 0x50, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50, 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70,
+ 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x00, 0x00, 0x40, 0x10, 0x00, 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40,
+ 0x40, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40, 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00,
+ 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40, 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x00,
+ 0x00, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00, 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40,
+ 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20, 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40,
+ 0x40, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40, 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20,
+ 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40, 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x20,
+ 0x20, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20, 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40,
+ 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c, 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40,
+ 0x40, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40, 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c,
+ 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40, 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x2c,
+ 0x2c, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c, 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40,
+ 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+
+}
+
#endif // MSN_DEF_H
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 84b8550..69fcea5 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -46,7 +46,9 @@ namespace Supernova {
SupernovaEngine::SupernovaEngine(OSystem *syst)
: Engine(syst)
, _console(NULL)
- , _colorIndex(0)
+ , _brightness(255)
+ , _menuBrightness(255)
+ , _incIndex(10)
{
// const Common::FSNode gameDataDir(ConfMan.get("path"));
// SearchMan.addSubDirectoryMatching(gameDataDir, "sound");
@@ -69,14 +71,13 @@ Common::Error SupernovaEngine::run() {
debug(_system->getScreenFormat().toString().c_str());
_console = new Console(this);
- initPalette();
initData();
+ initPalette();
+ paletteFadeIn();
_gameRunning = true;
while (_gameRunning) {
updateEvents();
- renderImage(31, 0);
- renderText("Das Schicksal", 44, 132, 4);
_system->updateScreen();
_system->delayMillis(10);
@@ -100,13 +101,22 @@ void SupernovaEngine::updateEvents() {
case Common::EVENT_KEYDOWN:
if (event.kbd.keycode == Common::KEYCODE_d && event.kbd.hasFlags(Common::KBD_CTRL)) {
- _console->attach();
+ paletteFadeOut();
+ }
+ if (event.kbd.keycode == Common::KEYCODE_d && !event.kbd.hasFlags(Common::KBD_CTRL)) {
+ paletteFadeIn();
}
if (event.kbd.keycode == Common::KEYCODE_q) {
playSound(48, 13530);
}
if (event.kbd.keycode == Common::KEYCODE_w) {
- ++_colorIndex;
+ renderImage(_incIndex, 0);
+ if (_incIndex == 31) {
+ renderText("Das Schicksal", 44, 132, 4);
+ renderText("des Horst Hummel", 35, 142, 4);
+ renderText("Teil 1:", 64, 120, 12);
+ }
+ ++_incIndex;
}
break;
default:
@@ -119,62 +129,7 @@ void SupernovaEngine::initData() {
}
void SupernovaEngine::initPalette() {
- // Default VGA palette
- byte pal[768] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x00, 0xa8, 0x00, 0x00, 0xa8, 0xa8, 0xa8, 0x00, 0x00, 0xa8, 0x00, 0xa8,
- 0xa8, 0x54, 0x00, 0xa8, 0xa8, 0xa8, 0x54, 0x54, 0x54, 0x54, 0x54, 0xfc, 0x54, 0xfc, 0x54, 0x54, 0xfc, 0xfc,
- 0xfc, 0x54, 0x54, 0xfc, 0x54, 0xfc, 0xfc, 0xfc, 0x54, 0xfc, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14,
- 0x20, 0x20, 0x20, 0x2c, 0x2c, 0x2c, 0x38, 0x38, 0x38, 0x44, 0x44, 0x44, 0x50, 0x50, 0x50, 0x60, 0x60, 0x60,
- 0x70, 0x70, 0x70, 0x80, 0x80, 0x80, 0x90, 0x90, 0x90, 0xa0, 0xa0, 0xa0, 0xb4, 0xb4, 0xb4, 0xc8, 0xc8, 0xc8,
- 0xe0, 0xe0, 0xe0, 0xfc, 0xfc, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00, 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc,
- 0xfc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc, 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00,
- 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc, 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x00,
- 0x00, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00, 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc,
- 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c, 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc,
- 0xfc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc, 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c,
- 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc, 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0x7c,
- 0x7c, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c, 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc,
- 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4, 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc,
- 0xfc, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc, 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4,
- 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc, 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0xb4,
- 0xb4, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4, 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc,
- 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70,
- 0x70, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70, 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x00, 0x00, 0x70, 0x1c, 0x00,
- 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70, 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x00,
- 0x00, 0x70, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70,
- 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38, 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70,
- 0x70, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70, 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38,
- 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70, 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x38,
- 0x38, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38, 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70,
- 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50, 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70,
- 0x70, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70, 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50,
- 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70, 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x50,
- 0x50, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50, 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70,
- 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x00, 0x00, 0x40, 0x10, 0x00, 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40,
- 0x40, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40, 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00,
- 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40, 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x00,
- 0x00, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00, 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40,
- 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20, 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40,
- 0x40, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40, 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20,
- 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40, 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x20,
- 0x20, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20, 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40,
- 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c, 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40,
- 0x40, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40, 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c,
- 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40, 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x2c,
- 0x2c, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c, 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40,
- 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
- };
-
- byte init_pal[] = {
- 0, 0, 0, 16,16,16, 22,22,22, 28,28,28,
- 63,63,63, 0,52, 0, 0,63, 0, 54, 0, 0,
- 63, 0, 0, 0, 0,30, 0, 0,45, 40,40,40,
- 20,50,63, 10,63,10, 60,60, 0, 63,10,10
- };
-
- _system->getPaletteManager()->setPalette(pal, 0, 256);
- _system->getPaletteManager()->setPalette(init_pal, 0, 16);
+ _system->getPaletteManager()->setPalette(initVGAPalette, 0, 256);
}
void SupernovaEngine::playSound(int filenumber, int offset) {
@@ -216,6 +171,8 @@ void SupernovaEngine::renderImage(int filenumber, int section) {
_image.loadStream(file);
_image.loadSection(section);
+ _system->getPaletteManager()->setPalette(_image.getPalette(), 16, 240);
+ paletteBrightness();
_system->copyRectToScreen(_image.getSurface()->getPixels(), 320, 0, 0, 320, 200);
}
@@ -346,5 +303,57 @@ void SupernovaEngine::renderBox(int x, int y, int width, int height, byte color)
_system->unlockScreen();
}
+void SupernovaEngine::paletteBrightness() {
+ byte palette[768];
+
+ _system->getPaletteManager()->grabPalette(palette, 0, 256);
+ for (size_t i = 0; i < 48; ++i) {
+ palette[i] = (initVGAPalette[i] * _menuBrightness) >> 8;
+ }
+ for (size_t i = 48; i < 768; ++i) {
+ const byte *imagePalette;
+ if (_image.getPalette()) {
+ imagePalette = _image.getPalette();
+ } else {
+ imagePalette = palette;
+ }
+ palette[i] = (imagePalette[i - 48] * _brightness) >> 8;
+ }
+ _system->getPaletteManager()->setPalette(palette, 0, 256);
}
+void SupernovaEngine::paletteFadeOut() {
+ // TODO: scene 0 (newspaper article in intro, mode 0x11)
+ // needs to be handled differently
+
+ while (_brightness > 20) {
+ _menuBrightness = _brightness;
+ paletteBrightness();
+ _brightness -= 20;
+ _system->updateScreen();
+ _system->delayMillis(10);
+ }
+ _menuBrightness = 0;
+ _brightness = 0;
+ paletteBrightness();
+ _system->updateScreen();
+}
+
+void SupernovaEngine::paletteFadeIn() {
+ // TODO: scene 0 (newspaper article in intro, mode 0x11)
+ // needs to be handled differently
+
+ while (_brightness < 235) {
+ _menuBrightness = _brightness;
+ paletteBrightness();
+ _brightness += 20;
+ _system->updateScreen();
+ _system->delayMillis(10);
+ }
+ _menuBrightness = 255;
+ _brightness = 255;
+ paletteBrightness();
+ _system->updateScreen();
+}
+
+}
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index cac80e1..13c3dab 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -54,10 +54,15 @@ private:
Audio::SoundHandle _soundHandle;
bool _gameRunning;
MSNImageDecoder _image;
- byte _colorIndex;
+ byte _incIndex;
+ byte _menuBrightness;
+ byte _brightness;
void initData();
void initPalette();
+ void paletteFadeIn();
+ void paletteFadeOut();
+ void paletteBrightness();
void updateEvents();
void playSound(int filenumber, int offset = 0);
void playSoundMod(int filenumber);
Commit: 8e55efa748c1d3d73b261b53b9feadcc5384801d
https://github.com/scummvm/scummvm/commit/8e55efa748c1d3d73b261b53b9feadcc5384801d
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T21:16:37Z
Commit Message:
SUPERNOVA: Fix OOB write in paletteBrightness()
Palette color 255 doesn't seem to be used
Changed paths:
engines/supernova/graphics.cpp
engines/supernova/supernova.cpp
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index d0d26eb..225e2e7 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -30,7 +30,7 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
_encodedImage = new byte[size];
_palette = new byte[717];
- g_system->getPaletteManager()->grabPalette(_palette, 16, 240);
+ g_system->getPaletteManager()->grabPalette(_palette, 16, 239);
byte pal_diff;
byte flag = stream.readByte();
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 69fcea5..c694fdf 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -306,20 +306,20 @@ void SupernovaEngine::renderBox(int x, int y, int width, int height, byte color)
void SupernovaEngine::paletteBrightness() {
byte palette[768];
- _system->getPaletteManager()->grabPalette(palette, 0, 256);
+ _system->getPaletteManager()->grabPalette(palette, 0, 255);
for (size_t i = 0; i < 48; ++i) {
palette[i] = (initVGAPalette[i] * _menuBrightness) >> 8;
}
- for (size_t i = 48; i < 768; ++i) {
+ for (size_t i = 0; i < 717; ++i) {
const byte *imagePalette;
if (_image.getPalette()) {
imagePalette = _image.getPalette();
} else {
imagePalette = palette;
}
- palette[i] = (imagePalette[i - 48] * _brightness) >> 8;
+ palette[i + 48] = (imagePalette[i] * _brightness) >> 8;
}
- _system->getPaletteManager()->setPalette(palette, 0, 256);
+ _system->getPaletteManager()->setPalette(palette, 0, 255);
}
void SupernovaEngine::paletteFadeOut() {
Commit: bd48a32c5a2d9af74f30e58f3defb9ca4e789c25
https://github.com/scummvm/scummvm/commit/bd48a32c5a2d9af74f30e58f3defb9ca4e789c25
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T21:16:37Z
Commit Message:
SUPERNOVA: Convert 18bit VGA to 24bit CLUT8
Colors on VGA are 6bit per color channel, that is why the colors
were so dark in earlier commits. Shifting the colors left by 2 gives us
an approximated value for CLUT8.
Changed paths:
engines/supernova/graphics.cpp
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index 225e2e7..3ab1c44 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -36,19 +36,15 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
byte flag = stream.readByte();
if (flag == 0) {
pal_diff = 0;
- _palette[141] = 0x38;
- _palette[142] = 0x38;
- _palette[143] = 0x38;
+ _palette[141] = 0xE0;
+ _palette[142] = 0xE0;
+ _palette[143] = 0xE0;
} else {
pal_diff = 1;
for (int i = flag * 3; i != 0; --i) {
- _palette[717 - i] = stream.readByte();
+ _palette[717 - i] = stream.readByte() << 2;
}
}
- // 18bit VGA to 24bit CLUT8
- for (size_t i = 0; i < 717; ++i) {
- _palette[i] <<= 2;
- }
byte numSections = stream.readByte();
for (size_t i = 0; i < kMaxSections; ++i) {
Commit: f25d6c7485eb1500182c29147debd2cd9fd1f677
https://github.com/scummvm/scummvm/commit/f25d6c7485eb1500182c29147debd2cd9fd1f677
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T22:53:24Z
Commit Message:
SUPERNOVA: Adds an empty ObjectType/ID and RoomID
Changed paths:
engines/supernova/msn_def.h
engines/supernova/supernova.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index b2aef9d..3bdbb18 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -3,363 +3,108 @@
namespace Supernova {
-struct obj_struct
-{
- char *name,*description,id;
- int type;
- char click,click2,section;
- char exitroom,direction;
-};
-
-/* msn.c */
-void overlay(int value);
-void overlay_init(char *text);
-void wait2(int time);
-void set_color63(char x);
-void fadeout2();
-void fadein2();
-void init_roomlist();
-void anim_on();
-void anim_off();
-char *ltoa(long l);
-void test_vga();
-void test_mouse();
-void setmode(char m);
-void calculate_palette();
-void palette();
-void palette_5();
-void palette_blend();
-void fadeout();
-void fadein();
-void title_fadein();
-void palette_off();
-void screen_shake();
-void crit_err();
-void init_buffer();
-void get_inf(int seg);
-void move(int ziel_seg, int quell_seg, int chunks_16bit);
-void disp_puffer(long adr, int ziel, int anz);
-void load(char *name);
-void getspace(int para);
-void load_disk(char *name);
-void error_loading(char *name);
-void load_sound(char *name);
-void load_sound_disk(char *name);
-void image(char nr);
-void image_remove(char nr);
-char invert(char nr);
-void show_current_section();
-void text(char *t);
-void textxy(int x, int y, char *t, char f);
-int width(char *t);
-void set_int();
-void restore_int();
-void wait1(int time);
-void box(int x, int y, int b, int h, char f);
-void hgr_save(int x, int y, int w, int h);
-void hgr_restore(int x, int y, int w, int h);
-void message(char *text);
-void message_p(int pos, char *text);
-void message_remove();
-void init_menu();
-void command_box(int bef, bool hell);
-void show_menu();
-void exits();
-void mouse_reset();
-void hourglass();
-void arrow();
-void mouse_on();
-void mouse_off();
-void install_event_handler();
-void mouse_input();
-void mouse_input2();
-void mouse_input3();
-void mouse_wait(int time);
-void sentence(int nr, bool hell);
-void sentence_remove(int sentence, int nr);
-void sentence_add(int sentence, int nr);
-int dialog(int num, char *rowlength[6], char **text[6], int nr);
-void mouse_pos_dialog(int x, int y);
-void say(char *t);
-void reply(char *t, int aus1, int aus2);
-int command_print();
-void mouse_pos(int x, int y);
-void maus_pos_weg();
-void mouse_right();
-void input();
-void inventory_object(int nr, bool brightness);
-void empty_object(int nr);
-void inventory_arrow(int nr, bool brightness);
-void show_inventory();
-void take(struct obj_struct *obj);
-void inventory_remove(struct obj_struct *obj);
-void inventory_remove2(struct obj_struct *obj);
-void scroll_up();
-void scroll_down();
-void inventory_seize();
-void insert(char *text, char *character);
-void edit(int x, int y, char *t, int length);
-bool filecopy(int ziel, int quelle);
-void error_temp();
-bool save_game(int nr);
-bool load_game(int nr);
-void load_overlay();
-void load_overlay_start();
-void load_save(bool speichern, bool abbruch);
-void text_up();
-void text_down();
-void list(char *name, bool bestell);
-void help();
-void settextspeed();
-void altx();
-bool room_execute();
-char bios_key();
-char number_read(char min, char max, char standard);
-void do_setup();
-void main(int argc, char *argv[]);
-/* msn_mod.c */
-void init_mod();
-void rechne_note();
-void set_pattern(int p);
-void play_sb();
-void play_pc();
-void start_pc_mod();
-void titel_schrift();
-void nur_text();
-/* msn_ovl1.c */
-/* msn_r0.c */
-long systime();
-char *time_tostring(long z);
-void save_time();
-void load_time();
-void load_door();
-void door_sound();
-int door_open();
-int door_close();
-void money_take(int amount);
-bool combine(struct obj_struct *obj1, struct obj_struct *obj2, int o1, int o2);
-void ok();
-bool airless();
-bool helmet_takeoff();
-bool generic_specialcmd(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-void shock();
-void alarm();
-void alarm_hearing();
-void outro();
-void dim(int color);
-void room_brightness();
-void turnon();
-void turnoff();
-void great(int nr);
-void init_rooms();
-void set_section(int room, int section, bool on);
-/* msn_r1.c */
-bool sb_corridor(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-bool sb_hall(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-bool sb_sleep(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-void anim_sleep();
-void once_sleep();
-bool sb_cockpit(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-void anim_cockpit();
-bool sb_airlock(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-bool sb_hold(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-bool sb_landingmod(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-bool sb_generator(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-void open_locker(struct obj_struct *obj, struct obj_struct *lock, int section);
-void close_locker(struct obj_struct *obj, struct obj_struct *lock, int section);
-bool sb_cabin_r3(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-bool sb_cabin_l3(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-bool sb_cabin_l2(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-bool sb_bathroom(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-void once_cockpit();
-void once_airlock();
-void once_hold();
-/* msn_r1_r.c */
-/* msn_r2.c */
-bool sb_rocks(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-void once_rocks();
-bool sb_meetup(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-void once_meetup();
-void anim_meetup();
-bool sb_entrance(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-void anim_entrance();
-void anim_remaining();
-void shipstart();
-void nova_scroll();
-void supernova();
-bool sb_roger(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-void anim_roger();
-void once_roger();
-bool sb_glider(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-void anim_glider();
-bool sb_meetup2(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-void once_meetup2();
-bool sb_meetup3(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-/* msn_r3.c */
-bool sb_cell(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-void anim_cell();
-void once_cell();
-bool sb_corridor4(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-void once_corridor();
-void once_corridor4();
-bool sb_corridor5(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-bool sb_corridor6(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-bool sb_corridor8(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-bool sb_corridor9(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-void shot(int a, int b);
-void guard_shot();
-bool sb_guard(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-void guard3_shot();
-bool sb_guard3(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-bool sb_bgang(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-void once_bgang();
-bool sb_office1(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-bool sb_office2(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-bool sb_office3(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-bool sb_office4(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-bool sb_office5(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-void once_office5();
-void walk(int a);
-void guard_walk();
-void telomat(int nr);
-void search_start();
-void search(int time);
-void guard_noticed();
-void busted(int i);
-void guard_back();
-bool sb_elevator(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-bool sb_station(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-void taxi();
-bool sb_sign(int verb, struct obj_struct *obj1, struct obj_struct *obj2);
-/* msn_s.c */
-void talk(int a1, int a2, int time_remain, int pos, char *t);
-void talkf(int a1, int a2, int dauer);
-void talk2(int a1, int a2, int b1, int b2, int duration, int pos, char *t);
-void title_image();
-void sirene();
-void intro();
-/* msn_snd.c */
-void play_sb_sample(int address);
-void wait_soundblaster();
-void call_driver();
-void init_soundblaster();
-void deinit_soundblaster();
-void stop();
-bool keypressed();
-void pc_sound_on(int int8, int int9, char speed);
-void pc_sound_off();
-void play_pc_sample(int adr);
-void init_sound_tab(bool mod);
-void init_sound();
-void deinit_sound();
-void play_music(bool kurz);
-void play(int adr);
-void sound_on();
-void sound(int counter);
-void sound_off();
-
+const int kScreenWidth = 320;
+const int kScreenHeight = 200;
+const int kTextSpeed[] = {19, 14, 10, 7, 4};
-#define MAX_SECTION 40
-#define MAX_SECTION_ZUS 50
-#define MAX_CLICKFIELD_ZUS 80
-#define MAX_OBJECT 25
-#define MAX_CARRY 30
+const int kMaxSection = 40;
+const int kMaxSectionZus = 50;
+const int kMaxClickfieldZus = 80;
+const int kMaxObject = 25;
+const int kMaxCarry = 30;
-#define ROOMNUM0 1
-#define ROOMNUM1 16
-#define ROOMNUM2 9
-#define ROOMNUM3 21
+const int kRoomsChap0 = 1;
+const int kRoomsChap1 = 16;
+const int kRoomsChap2 = 9;
+const int kRoomsChap3 = 21;
-#define NIL 0
-struct room
-{
- char *file;
- bool shown[MAX_SECTION];
- bool (*specialcmd)();
- void (*animation)();
- void (*onEntrance)();
- struct obj_struct object[MAX_OBJECT];
+enum ObjectType {
+ NULLTYPE = 0,
+ TAKE = 1,
+ OPEN = 2,
+ OPENED = 4,
+ CLOSED = 8,
+ EXIT = 16,
+ PRESS = 32,
+ COMBINABLE = 64,
+ CARRIED = 128,
+ UNNECESSARY = 256,
+ WORN = 512,
+ TALK = 1024,
+ OCCUPIED = 2048,
+ CAUGHT = 4096
};
-/* object type */
-#define TAKE 1
-#define OPEN 2
-#define OPENED 4
-#define CLOSED 8
-#define EXIT 16
-#define PRESS 32
-#define COMBINABLE 64
-#define CARRIED 128
-#define UNNECESSARY 256
-#define WORN 512
-#define TALK 1024
-#define OCCUPIED 2048
-#define CAUGHT 4096
-
-enum {ACTION_WALK,
- ACTION_LOOK,
- ACTION_TAKE,
- ACTION_OPEN,
- ACTION_CLOSE,
- ACTION_PRESS,
- ACTION_PULL,
- ACTION_USE,
- ACTION_TALK,
- ACTION_GIVE};
-
-enum {INTRO,CORRIDOR,HALL,SLEEP,COCKPIT,AIRLOCK,
- HOLD,LANDINGMODULE,GENERATOR,OUTSIDE,
- CABIN_R1,CABIN_R2,CABIN_R3,CABIN_L1,CABIN_L3,CABIN_L2,BATHROOM,
-
- ROCKS,CAVE,MEETUP,ENTRANCE,REST,ROGER,GLIDER,MEETUP2,MEETUP3,
-
- CELL,CORRIDOR1,CORRIDOR2,CORRIDOR3,CORRIDOR4,CORRIDOR5,CORRIDOR6,CORRIDOR7,CORRIDOR8,CORRIDOR9,
- BCORRIDOR,GUARD,GUARD3,OFFICE_L1,OFFICE_L2,OFFICE_R1,OFFICE_R2,OFFICE_L,
- ELEVATOR,STATION,SIGN};
-
-enum {X,
- KEYCARD,KNIFE,WATCH,
- SOCKET,
- BUTTON,HATCH1,
- BUTTON1,BUTTON2,MANOMETER,SUIT,HELMET,LIFESUPPORT,
- SCRAP_LK,OUTERHATCH_TOP,GENERATOR_TOP,TERMINALSTRIP,LANDINGMOD_OUTERHATCH,
- HOLD_WIRE,
- LANDINGMOD_BUTTON,LANDINGMOD_SOCKET,LANDINGMOD_WIRE,LANDINGMOD_HATCH,LANDINGMOD_MONITOR,
- KEYBOARD,
- KEYCARD2,OUTERHATCH,GENERATOR_WIRE,TRAP,SHORT_WIRE,CLIP,
- VOLTMETER,LADDER,GENERATOR_ROPE,
- KITCHEN_HATCH,SLEEP_SLOT,
- MONITOR,INSTRUMENTS,
- COMPUTER,CABINS,CABIN,
- SLOT_K1,SLOT_K2,SLOT_K3,SLOT_K4,
- SHELF1,SHELF2,SHELF3,SHELF4,
- ROPE,BOOK,DISCMAN,CHESS,
- SLOT_KL1,SLOT_KL2,SLOT_KL3,SLOT_KL4,
- SHELF_L1,SHELF_L2,SHELF_L3,SHELF_L4,
- PISTOL,BOOK2,SPOOL,
- RECORD,TURNTABLE,TURNTABLE_BUTTON,WIRE,WIRE2,PLUG,
- PEN,
- BATHROOM_DOOR,BATHROOM_EXIT,SHOWER,TOILET,
-
- STONE,
- SPACESHIPS,SPACESHIP,STAR,DOOR,MEETUP_SIGN,
- PORTER,BATHROOM_BUTTON,BATHROOM_SIGN,KITCHEN_SIGN,CAR_SLOT,
- ARS_BATHROOM,COINS,SCHNUCK,EGG,PILL,PILL_HULL,STAIRCASE,
- MEETUP_EXIT,
- ROGER_W,WALLET,KEYCARD_R,CUP,
- GLIDER_BUTTON1,GLIDER_BUTTON2,GLIDER_BUTTON3,GLIDER_BUTTON4,GLIDER_SLOT,GLIDER_BUTTONS,
- GLIDER_DISPLAY,GLIDER_INSTRUMENTS,GLIDER_KEYCARD,
- UFO,
+enum Action {
+ ACTION_WALK,
+ ACTION_LOOK,
+ ACTION_TAKE,
+ ACTION_OPEN,
+ ACTION_CLOSE,
+ ACTION_PRESS,
+ ACTION_PULL,
+ ACTION_USE,
+ ACTION_TALK,
+ ACTION_GIVE
+};
- CELL_BUTTON,CELL_TABLE,CELL_WIRE,TRAY,CELL_DOOR,MAGNET,
- NEWSPAPER,TABLE,
- PILLAR1,PILLAR2,DOOR1,DOOR2,DOOR3,DOOR4,
- GUARDIAN,LAMP,
- MASTERKEYCARD,PAINTING,MONEY,LOCKER,LETTER,
- JUNGLE,SLOT,STATION_SIGN,
+enum RoomID {
+ INTRO,CORRIDOR,HALL,SLEEP,COCKPIT,AIRLOCK,
+ HOLD,LANDINGMODULE,GENERATOR,OUTSIDE,
+ CABIN_R1,CABIN_R2,CABIN_R3,CABIN_L1,CABIN_L3,CABIN_L2,BATHROOM,
+
+ ROCKS,CAVE,MEETUP,ENTRANCE,REST,ROGER,GLIDER,MEETUP2,MEETUP3,
+
+ CELL,CORRIDOR1,CORRIDOR2,CORRIDOR3,CORRIDOR4,CORRIDOR5,CORRIDOR6,CORRIDOR7,CORRIDOR8,CORRIDOR9,
+ BCORRIDOR,GUARD,GUARD3,OFFICE_L1,OFFICE_L2,OFFICE_R1,OFFICE_R2,OFFICE_L,
+ ELEVATOR,STATION,SIGN,NULLROOM
+};
- TICKETS};
+enum ObjectID {
+ NULLOBJECT,
+ KEYCARD,KNIFE,WATCH,
+ SOCKET,
+ BUTTON,HATCH1,
+ BUTTON1,BUTTON2,MANOMETER,SUIT,HELMET,LIFESUPPORT,
+ SCRAP_LK,OUTERHATCH_TOP,GENERATOR_TOP,TERMINALSTRIP,LANDINGMOD_OUTERHATCH,
+ HOLD_WIRE,
+ LANDINGMOD_BUTTON,LANDINGMOD_SOCKET,LANDINGMOD_WIRE,LANDINGMOD_HATCH,LANDINGMOD_MONITOR,
+ KEYBOARD,
+ KEYCARD2,OUTERHATCH,GENERATOR_WIRE,TRAP,SHORT_WIRE,CLIP,
+ VOLTMETER,LADDER,GENERATOR_ROPE,
+ KITCHEN_HATCH,SLEEP_SLOT,
+ MONITOR,INSTRUMENTS,
+ COMPUTER,CABINS,CABIN,
+ SLOT_K1,SLOT_K2,SLOT_K3,SLOT_K4,
+ SHELF1,SHELF2,SHELF3,SHELF4,
+ ROPE,BOOK,DISCMAN,CHESS,
+ SLOT_KL1,SLOT_KL2,SLOT_KL3,SLOT_KL4,
+ SHELF_L1,SHELF_L2,SHELF_L3,SHELF_L4,
+ PISTOL,BOOK2,SPOOL,
+ RECORD,TURNTABLE,TURNTABLE_BUTTON,WIRE,WIRE2,PLUG,
+ PEN,
+ BATHROOM_DOOR,BATHROOM_EXIT,SHOWER,TOILET,
+
+ STONE,
+ SPACESHIPS,SPACESHIP,STAR,DOOR,MEETUP_SIGN,
+ PORTER,BATHROOM_BUTTON,BATHROOM_SIGN,KITCHEN_SIGN,CAR_SLOT,
+ ARS_BATHROOM,COINS,SCHNUCK,EGG,PILL,PILL_HULL,STAIRCASE,
+ MEETUP_EXIT,
+ ROGER_W,WALLET,KEYCARD_R,CUP,
+ GLIDER_BUTTON1,GLIDER_BUTTON2,GLIDER_BUTTON3,GLIDER_BUTTON4,GLIDER_SLOT,GLIDER_BUTTONS,
+ GLIDER_DISPLAY,GLIDER_INSTRUMENTS,GLIDER_KEYCARD,
+ UFO,
+
+ CELL_BUTTON,CELL_TABLE,CELL_WIRE,TRAY,CELL_DOOR,MAGNET,
+ NEWSPAPER,TABLE,
+ PILLAR1,PILLAR2,DOOR1,DOOR2,DOOR3,DOOR4,
+ GUARDIAN,LAMP,
+ MASTERKEYCARD,PAINTING,MONEY,LOCKER,LETTER,
+ JUNGLE,SLOT,STATION_SIGN,
+
+ TICKETS
+};
enum MessagePosition {
kMessageNormal,
@@ -425,8 +170,7 @@ const byte mouseWait[64] = {
0x34,0x2c,0x14,0x28,0xfe,0x7f,0x00,0x00
};
-const byte font[][5] =
-{
+const byte font[][5] = {
{0x00,0x00,0x00,0xff,0x00},
{0x5f,0xff,0x00,0x00,0x00},
{0x03,0x00,0x03,0xff,0x00},
@@ -608,8 +352,6 @@ const byte font[][5] =
0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
-
-
}
#endif // MSN_DEF_H
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 13c3dab..4c6787b 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -37,10 +37,6 @@
namespace Supernova {
-const int kScreenWidth = 320;
-const int kScreenHeight = 200;
-const int kTextSpeed[] = {19, 14, 10, 7, 4};
-
class SupernovaEngine : public Engine {
public:
SupernovaEngine(OSystem *syst);
Commit: d55ef4045ef287421af9aafa94fb8196cc7d7189
https://github.com/scummvm/scummvm/commit/d55ef4045ef287421af9aafa94fb8196cc7d7189
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T22:59:27Z
Commit Message:
SUPERNOVA: Setup image and section viewer
Pressing 'w' increases the image index and 'e' the section index.
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index c694fdf..3c57fcd 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -34,11 +34,10 @@
#include "graphics/surface.h"
#include "graphics/screen.h"
#include "graphics/palette.h"
-//#include "graphics/font.h"
-//#include "graphics/fontman.h"
#include "supernova/supernova.h"
#include "supernova/msn_def.h"
+//#include "supernova/rooms.h"
namespace Supernova {
@@ -48,7 +47,8 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)
, _console(NULL)
, _brightness(255)
, _menuBrightness(255)
- , _incIndex(10)
+ , _imageIndex(10)
+ , _sectionIndex(0)
{
// const Common::FSNode gameDataDir(ConfMan.get("path"));
// SearchMan.addSubDirectoryMatching(gameDataDir, "sound");
@@ -79,6 +79,8 @@ Common::Error SupernovaEngine::run() {
while (_gameRunning) {
updateEvents();
+ renderImage(_imageIndex, _sectionIndex);
+ renderText(Common::String::format("%u | %u", _imageIndex, _sectionIndex).c_str(), 0, 190, 15);
_system->updateScreen();
_system->delayMillis(10);
}
@@ -110,13 +112,16 @@ void SupernovaEngine::updateEvents() {
playSound(48, 13530);
}
if (event.kbd.keycode == Common::KEYCODE_w) {
- renderImage(_incIndex, 0);
- if (_incIndex == 31) {
+ _sectionIndex = 0;
+ ++_imageIndex;
+ if (_imageIndex == 31) {
renderText("Das Schicksal", 44, 132, 4);
renderText("des Horst Hummel", 35, 142, 4);
renderText("Teil 1:", 64, 120, 12);
}
- ++_incIndex;
+ }
+ if (event.kbd.keycode == Common::KEYCODE_e) {
+ ++_sectionIndex;
}
break;
default:
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 4c6787b..2e15850 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -50,7 +50,8 @@ private:
Audio::SoundHandle _soundHandle;
bool _gameRunning;
MSNImageDecoder _image;
- byte _incIndex;
+ byte _imageIndex;
+ byte _sectionIndex;
byte _menuBrightness;
byte _brightness;
Commit: e2122bddf15245e1c8e33e182370a43b91f2a0ad
https://github.com/scummvm/scummvm/commit/e2122bddf15245e1c8e33e182370a43b91f2a0ad
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T22:59:48Z
Commit Message:
SUPERNOVA: Updates renderImage() function
renderImage() now considers the size of image sections instead of
blitting them on 320x200 by default.
Changed paths:
engines/supernova/graphics.h
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/graphics.h b/engines/supernova/graphics.h
index 585aabe..462e9ea 100644
--- a/engines/supernova/graphics.h
+++ b/engines/supernova/graphics.h
@@ -26,7 +26,6 @@ public:
bool loadSection(int _section);
-private:
static const int kMaxSections = 50;
static const int kMaxClickFields = 80;
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 3c57fcd..602f69f 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -49,6 +49,7 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)
, _menuBrightness(255)
, _imageIndex(10)
, _sectionIndex(0)
+ , _delay(33)
{
// const Common::FSNode gameDataDir(ConfMan.get("path"));
// SearchMan.addSubDirectoryMatching(gameDataDir, "sound");
@@ -82,7 +83,7 @@ Common::Error SupernovaEngine::run() {
renderImage(_imageIndex, _sectionIndex);
renderText(Common::String::format("%u | %u", _imageIndex, _sectionIndex).c_str(), 0, 190, 15);
_system->updateScreen();
- _system->delayMillis(10);
+ _system->delayMillis(_delay);
}
//deinit timer/sound/..
@@ -121,7 +122,8 @@ void SupernovaEngine::updateEvents() {
}
}
if (event.kbd.keycode == Common::KEYCODE_e) {
- ++_sectionIndex;
+ renderImage(_imageIndex, 0);
+ renderImage(_imageIndex, ++_sectionIndex);
}
break;
default:
@@ -168,7 +170,7 @@ void playSoundMod(int filenumber)
// play Supernova MOD file
}
-void SupernovaEngine::renderImage(int filenumber, int section) {
+void SupernovaEngine::renderImage(int filenumber, int section, bool fullscreen) {
Common::File file;
if (!file.open(Common::String::format("msn_data.0%2d", filenumber))) {
error("File %s could not be read!", file.getName());
@@ -176,9 +178,19 @@ void SupernovaEngine::renderImage(int filenumber, int section) {
_image.loadStream(file);
_image.loadSection(section);
- _system->getPaletteManager()->setPalette(_image.getPalette(), 16, 240);
+ _system->getPaletteManager()->setPalette(_image.getPalette(), 16, 239);
paletteBrightness();
- _system->copyRectToScreen(_image.getSurface()->getPixels(), 320, 0, 0, 320, 200);
+ if (fullscreen) {
+ _system->copyRectToScreen(_image.getSurface()->getPixels(), 320, 0, 0, 320, 200);
+ } else {
+ size_t offset = _image._section[section].y1 * 320 + _image._section[section].x1;
+ _system->copyRectToScreen(static_cast<const byte *>(_image.getSurface()->getPixels()) + offset,
+ 320,
+ _image._section[section].x1,
+ _image._section[section].y1,
+ _image._section[section].x2 - _image._section[section].x1,
+ _image._section[section].y2 - _image._section[section].y1);
+ }
}
static int characterWidth(const char *text) {
@@ -336,7 +348,7 @@ void SupernovaEngine::paletteFadeOut() {
paletteBrightness();
_brightness -= 20;
_system->updateScreen();
- _system->delayMillis(10);
+ _system->delayMillis(_delay);
}
_menuBrightness = 0;
_brightness = 0;
@@ -353,7 +365,7 @@ void SupernovaEngine::paletteFadeIn() {
paletteBrightness();
_brightness += 20;
_system->updateScreen();
- _system->delayMillis(10);
+ _system->delayMillis(_delay);
}
_menuBrightness = 255;
_brightness = 255;
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 2e15850..017c912 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -54,6 +54,7 @@ private:
byte _sectionIndex;
byte _menuBrightness;
byte _brightness;
+ uint _delay;
void initData();
void initPalette();
@@ -64,7 +65,7 @@ private:
void playSound(int filenumber, int offset = 0);
void playSoundMod(int filenumber);
void stopSound();
- void renderImage(int filenumber, int section);
+ void renderImage(int filenumber, int section, bool fullscreen = false);
void renderMessage(char *text, MessagePosition position);
void renderText(const char *text, int x, int y, byte color);
void renderBox(int x, int y, int width, int height, byte color);
Commit: 79ada90398bd551b8b9a8b508be763606563d7d2
https://github.com/scummvm/scummvm/commit/79ada90398bd551b8b9a8b508be763606563d7d2
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T22:59:48Z
Commit Message:
SUPERNOVA: Adds room data for Ship chapter
Changed paths:
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index cbae30a..f52412a 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -1,784 +1,521 @@
#ifndef ROOMS_H
#define ROOMS_H
+#include "common/scummsys.h"
+
#include "msn_def.h"
namespace Supernova {
-/* --- ROOM 0 ----------------------------------- */
-
-room roomlist0[ROOMNUM0] =
-{
- {
- "",{0},NIL,NIL,NIL,
- {
- {"Keycard","Die Keycard f�r deine Schr�nke.",KEYCARD,
- TAKE+CARRIED+COMBINABLE,255,255,0},
- {"Taschenmesser","Es ist nicht mehr das sch�rfste.",KNIFE,
- TAKE+CARRIED+COMBINABLE,255,255,0},
- {"Armbanduhr",&description,WATCH,TAKE+COMBINABLE+CARRIED,255,255,8},
- {"Discman","Es ist eine \"Mad Monkeys\"-CD darin.",
- DISCMAN,TAKE+COMBINABLE,255,255,0}
- }
+
+ObjectType operator|(ObjectType a, ObjectType b) {
+ return ObjectType(+a | +b);
+}
+
+struct Object {
+ static const char *const defaultDescription;
+
+ Object();
+ Object(const char *name, const char *description, ObjectID id, ObjectType type, byte click,
+ byte click2, byte section = 0, RoomID exitRoom = NULLROOM, byte direction = 0);
+
+ const char *_name;
+ const char *_description;
+ ObjectID _id;
+ ObjectType _type;
+ byte _click;
+ byte _click2;
+ byte _section;
+ RoomID _exitRoom;
+ byte _direction;
+};
+
+Object::Object()
+ : _name("")
+ , _description(Object::defaultDescription)
+ , _id(NULLOBJECT)
+ , _type(NULLTYPE)
+ , _click(0)
+ , _click2(0)
+ , _section(0)
+ , _exitRoom(NULLROOM)
+ , _direction(0)
+{}
+
+Object::Object(const char *name, const char *description, ObjectID id, ObjectType type,
+ byte click, byte click2, byte section, RoomID exitRoom, byte direction)
+ : _name(name)
+ , _description(description)
+ , _id(id)
+ , _type(type)
+ , _click(click)
+ , _click2(click2)
+ , _section(section)
+ , _exitRoom(exitRoom)
+ , _direction(direction)
+{}
+
+class Room {
+public:
+ Room() {
+ _seen = false;
+ }
+
+ bool hasSeen() {
+ return _seen;
+ }
+ void setRoomSeen(bool seen) {
+ _seen = seen;
+ }
+
+ virtual ~Room() {}
+ virtual void animation() {}
+ virtual void onEntrance() {}
+ virtual bool interact(Action verb, Object &obj1, Object &obj2) {
+ return false;
+ }
+
+protected:
+ int _filenumber;
+ bool _shown[kMaxSection];
+ Object _objectState[kMaxObject];
+
+private:
+ bool _seen;
+};
+
+// Room 0
+class StartingItems : public Room {
+public:
+ StartingItems() {
+ _filenumber = -1;
+
+ _shown[0] = false;
+
+ _objectState[0] =
+ Object("Keycard", "Die Keycard fuer deine Schraenke.", KEYCARD,
+ TAKE | CARRIED | COMBINABLE, 255, 255, 0, NULLROOM, 0);
+ _objectState[1] =
+ Object("Taschenmesser", "Es ist nicht mehr das sch�rfste.", KNIFE,
+ TAKE | CARRIED | COMBINABLE, 255, 255, 0, NULLROOM, 0);
+ _objectState[2] =
+ Object("Armbanduhr", Object::defaultDescription, WATCH,
+ TAKE | COMBINABLE | CARRIED, 255, 255, 8, NULLROOM, 0);
+ _objectState[3] =
+ Object("Discman", "Es ist eine \"Mad Monkeys\"-CD darin.", DISCMAN,
+ TAKE | COMBINABLE, 255, 255, 0, NULLROOM, 0);
}
};
+// Spaceship
+class ShipCorridor : public Room {
+public:
+ ShipCorridor() {
+ _filenumber = 17;
+ _shown[0] = true;
+ _shown[1] = false;
+ _shown[2] = false;
+ _shown[3] = false;
+ _shown[4] = true;
+
+ _objectState[0] = Object("Luke", Object::defaultDescription, HATCH1, OPEN | EXIT, 0, 6, 1, CABIN_L1, 15);
+ _objectState[1] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPEN | EXIT, 1, 7, 2, CABIN_L2, 10);
+ _objectState[2] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPEN | EXIT, 2, 8, 3, CABIN_L3, 5);
+ _objectState[3] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPEN | EXIT, 5, 11, 6, CABIN_R1, 19);
+ _objectState[4] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPEN | EXIT, 4, 10, 5, CABIN_R2, 14);
+ _objectState[5] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPEN | EXIT | OPENED, 9, 3, 4, CABIN_R3, 9);
+ _objectState[6] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPEN | CLOSED | EXIT, 12, 12, 0, AIRLOCK, 2);
+ _objectState[7] = Object("Knopf", "Er geh�rt zu der gro�en Luke.", BUTTON, PRESS, 13, 13, 0, NULLROOM, 0);
+ _objectState[8] = Object("Leiter", Object::defaultDescription, NULLOBJECT, NULLTYPE, 14, 14, 0, NULLROOM, 0);
+ _objectState[9] = Object("Ausgang", Object::defaultDescription, NULLOBJECT, EXIT, 15, 15, 0, HALL, 2);
+ }
+
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
+
+class ShipHall: public Room {
+public:
+ ShipHall() {
+ _filenumber = 15;
+ _shown[0] = true;
+
+ _objectState[0] = Object("Luke", "Sie f�hrt ins Cockpit.", NULLOBJECT, OPEN | EXIT, 4, 5, 1, COCKPIT, 10);
+ _objectState[1] = Object("Luke", "Sie f�hrt zur K�che.", KITCHEN_HATCH, OPEN | EXIT, 0, 0, 0, NULLROOM, 1);
+ _objectState[2] = Object("Luke", "Sie f�hrt zu den Tiefschlafkammern.", NULLOBJECT, OPEN | CLOSED | EXIT, 1, 1, 2, SLEEP, 8);
+ _objectState[3] = Object("Schlitz", "Es ist ein Keycard-Leser.", SLEEP_SLOT, COMBINABLE, 2, 2, 0, NULLROOM, 0);
+ _objectState[4] = Object("Leiter", Object::defaultDescription, NULLOBJECT, NULLTYPE, 3, SLEEP, 0, NULLROOM, 0);
+ _objectState[5] = Object("Gang", Object::defaultDescription, NULLOBJECT, EXIT, 6, 6, 0, CORRIDOR, 1);
+ }
+
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
-room roomlist1[ROOMNUM1] =
-{
-/* --- Spaceship --- */
-
- {
- "017",{1,0,0,0,1},&sb_corridor,NIL,NIL,
- {
- {"Luke",&description,HATCH1,OPEN+EXIT,0,6,1,CABIN_L1,15},
- {"Luke",&description,0,OPEN+EXIT,1,7,2,CABIN_L2,10},
- {"Luke",&description,0,OPEN+EXIT,2,8,3,CABIN_L3,5},
- {"Luke",&description,0,OPEN+EXIT+OPENED,9,3,4,CABIN_R3,9},
- {"Luke",&description,0,OPEN+EXIT,4,10,5,CABIN_R2,14},
- {"Luke",&description,0,OPEN+EXIT,5,11,6,CABIN_R1,19},
- {"Luke",&description,0,OPEN+CLOSED+EXIT,12,12,0,AIRLOCK,2},
- {"Knopf","Er geh�rt zu der gro�en Luke.",BUTTON,PRESS,13,13,0},
- {"Leiter",&description,0,0,14,14,0},
- {"Ausgang",&description,0,EXIT,15,15,0,HALL,22}
- }
- },
- {
- "015",{1},&sb_hall,NIL,NIL,
- {
- {"Luke","Sie f�hrt ins Cockpit.",0,OPEN+EXIT,4,5,1,COCKPIT,10},
- {"Luke","Sie f�hrt zur K�che.",KITCHEN_HATCH,
- OPEN+EXIT,0,0,0,NIL,1},
- {"Luke","Sie f�hrt zu den Tiefschlafkammern.",0,
- OPEN+CLOSED+EXIT,1,1,2,SLEEP,8},
- {"Schlitz","Es ist ein Keycard-Leser.",SLEEP_SLOT,COMBINABLE,2,2,0},
- {"Leiter",&description,0,0,3,3,0},
- {"Gang",&description,0,EXIT,6,6,0,CORRIDOR,19}
- }
- },
- {
- "033",{1},&sb_sleep,&anim_sleep,&once_sleep,
- {
- {"Luke","Dies ist eine der Tiefschlafkammern.",CABINS,0,0,0,0},
- {"Luke","Dies ist eine der Tiefschlafkammern.",CABIN,0,1,1,0},
- {"Computer",&description,COMPUTER,0,2,2,0},
- {"Ausgang",&description,0,EXIT,255,255,0,HALL,22}
- }
- },
- {
- "009",{1},&sb_cockpit,&anim_cockpit,&once_cockpit,
- {
- {"Instrumente","Hmm, sieht ziemlich kompliziert aus.",
- INSTRUMENTS,0,2,2,0},
- {"Monitor",&description,MONITOR,0,0,0,0},
- {"Monitor","Dieser Monitor sagt dir nichts.",0,1,1,0},
- {"Ausgang",&description,0,EXIT,255,255,0,HALL,22}
- }
- },
- {
- "034",{1,0,0,0,0,0,1},&sb_airlock,NIL,&once_airlock,
- {
- {"Luke","Das ist eine Luke !!!",0,
- EXIT+OPEN+OPENED+CLOSED,0,0,0,CORRIDOR,10},
- {"Luke","Dies ist eine Luke !!!",0,
- EXIT+OPEN+CLOSED,1,1,0,HOLD,14},
- {"Knopf",&description,BUTTON1,PRESS,2,2,0},
- {"Knopf",&description,BUTTON2,PRESS,3,3,0},
- {"Helm","Es ist der Helm zum Raumanzug.",HELMET,TAKE,4,4,7},
- {"Raumanzug","Der einzige Raumanzug, den die|anderen hiergelassen haben ...",
- SUIT,TAKE,5,5,8},
- {"Versorgung","Es ist der Versorgungsteil zum Raumanzug.",
- LIFESUPPORT,TAKE,6,6,9},
- {"Druckmesser",&description,MANOMETER,0,7,7,0}
- }
- },
- {
- "024",{1},&sb_hold,NIL,&once_hold,
- {
- {"",&description,HOLD_WIRE,COMBINABLE,255,255,0},
- {"Schrott","Da ist eine L�sterklemme dran, die|noch ganz brauchbar aussieht.|Ich nehme sie mit.",
- SCRAP_LK,0,4,4,0},
- {"L�sterklemme",&description,TERMINALSTRIP,COMBINABLE,255,255,0},
- {"Schrott","Junge, Junge! Die Explosion hat ein|ganz sch�nes Durcheinander angerichtet.",
- 0,0,5,5,0},
- {"Reaktor","Das war einmal der Reaktor.",0,0,6,6,0},
- {"D�se",&description,0,0,7,7,0},
- {"blauer K�rbis","Keine Ahnung, was das ist.",0,0,8,8,0},
- {"Luke",&description,LANDINGMOD_OUTERHATCH,EXIT+OPEN,1,2,2,LANDINGMODULE,6},
- {"Landef�hre","Sie war eigentlich f�r Bodenuntersuchungen|auf Arsano 3 gedacht.",
- 0,0,0,0,0},
- {"Ausgang",&description,0,EXIT,255,255,0,AIRLOCK,22},
- {"Luke","Sie f�hrt nach drau�en.",
- OUTERHATCH_TOP,EXIT+OPEN+OPENED,3,3,0,GENERATOR,8},
- {"Generator","Er versorgt das Raumschiff mit Strom.",
- GENERATOR_TOP,EXIT,12,12,0,GENERATOR,8}
- }
- },
- {
- "025",{1},&sb_landingmod,NIL,NIL,
- {
- {"Steckdose",&description,LANDINGMOD_SOCKET,COMBINABLE,1,1,0},
- {"Knopf","Es ist ein Sicherheitsknopf.|Er kann nur mit einem spitzen|Gegenstand gedr�ckt werden.",
- LANDINGMOD_BUTTON,PRESS+COMBINABLE,2,2,0},
- {"Monitor",&description,LANDINGMOD_MONITOR,0,3,3,0},
- {"Tastatur",&description,KEYBOARD,0,4,4,0},
- {"",&description,LANDINGMOD_WIRE,COMBINABLE,255,255,0},
- {"Luke",&description,LANDINGMOD_HATCH,EXIT+OPEN+OPENED+COMBINABLE,
- 0,0,1+128,HOLD,10}
- }
- },
- {
- "018",{1,0,0,0,0,1},&sb_generator,NIL,NIL,
- {
- {"langes Kabel mit Stecker",&description,GENERATOR_WIRE,COMBINABLE,255,255,0},
- {"leere Kabelrolle",&description,0,UNNECESSARY,255,255,0},
- {"Keycard","Hey, das ist die Keycard des Commanders!|Er mu� sie bei dem �berst�rzten|Aufbruch verloren haben.",
- KEYCARD2,COMBINABLE+TAKE,12,12,5+128},
- {"Seil",&description,GENERATOR_ROPE,COMBINABLE,255,255,0},
- {"Luke","Sie f�hrt nach drau�en.",
- OUTERHATCH,EXIT+OPEN,1,2,1,OUTSIDE,22},
- {"Luke",&description,0,OPEN+CLOSED,3,3,0},
- {"Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,4,4,0},
- {"Klappe",&description,TRAP,OPEN,5,6,2},
- {"Leitung",&description,0,0,7,7,0},
- {"Spannungmessger�t",&description,VOLTMETER,0,9,9,0},
- {"Klemme",&description,CLIP,COMBINABLE,8,8,0},
- {"Leitung","Sie f�hrt vom Generator zum Spannungmessger�t.",
- SHORT_WIRE,COMBINABLE,10,10,0},
- {"Leiter",&description,LADDER,EXIT,0,0,0,HOLD,1}
- }
- },
- {
- "004",{1},NIL,NIL,NIL,
- {
- {"Luke",&description,0,EXIT,0,0,0,GENERATOR,3},
- {"Seil",&description,0,UNNECESSARY,255,255,0}
- }
- },
- {
- "022",{1,1,1},NIL,NIL,NIL,
- {
- {"Bild","Manche Leute haben schon|einen komischen Geschmack.",0,
- UNNECESSARY,5,5,0},
- {"Zeichenger�te",
- "Auf dem Zettel sind lauter|unverst�ndliche Skizzen und Berechnungen.|(Jedenfalls f�r dich unverst�ndlich.)",
- 0,UNNECESSARY,6,6,0},
- {"Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",0,
- UNNECESSARY,7,7,0},
- {"Luke",&description,0,OPEN+OPENED+EXIT,3,3,15+128,CORRIDOR,5},
- {"Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,0,0,0},
- {"Schrank",&description,0,OPEN+CLOSED,1,1,0},
- {"Fach",&description,0,OPEN+CLOSED,2,2,0},
- {"Steckdose",&description,SOCKET,COMBINABLE,4,4,0},
- {"Toilette",&description,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22}
- }
- },
- {
- "022",{1,0,0,1,1,1},NIL,NIL,NIL,
- {
- {"Schachspiel","Es macht wohl Spa�, an|der Decke Schach zu spielen.",
- 0,UNNECESSARY,11,11,0},
- {"Tennisschl�ger","Fliegt Boris Becker auch mit?",0,UNNECESSARY,8,8,0},
- {"Tennisball","Toll!",0,UNNECESSARY,9,9,0},
- {"Luke",&description,0,OPEN+OPENED+EXIT,3,3,15+128,CORRIDOR,5},
- {"Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,0,0,0},
- {"Schrank",&description,0,OPEN+CLOSED,1,1,0},
- {"Fach",&description,0,OPEN+CLOSED,2,2,0},
- {"Steckdose",&description,SOCKET,COMBINABLE,4,4,0},
- {"Toilette",&description,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22}
- }
- },
- {
- "022",{1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1},&sb_cabin_r3,NIL,NIL,
- {
- {"Schachspiel","Dein Magnetschachspiel. Schach war|schon immer deine Leidenschaft.",
- CHESS,TAKE+COMBINABLE,12,12,7+128},
- {"Bett","Das ist dein Bett. Toll, nicht wahr?",0,0,13,13,0},
- {"Schlitz","Es ist ein Keycard-Leser.",SLOT_K1,COMBINABLE,27,27,0},
- {"Schlitz","Es ist ein Keycard-Leser.",SLOT_K2,COMBINABLE,28,28,0},
- {"Schlitz","Es ist ein Keycard-Leser.",SLOT_K3,COMBINABLE,29,29,0},
- {"Schlitz","Es ist ein Keycard-Leser.",SLOT_K4,COMBINABLE,30,30,0},
- {"Fach","Das ist eins deiner drei F�cher.",SHELF1,
- OPEN+CLOSED,14,18,9},
- {"Alben","Deine Briefmarkensammlung.",0,UNNECESSARY,14,14,0},
- {"Fach","Das ist eins deiner drei F�cher.",SHELF2,
- OPEN+CLOSED,15,19,10},
- {"Seil","Es ist ungef�hr 10 m lang und 4 cm dick.",ROPE,
- TAKE+COMBINABLE,15,15,12},
- {"Schrank","Das ist dein Schrank.",SHELF3,OPEN+CLOSED,16,17,11},
- {"Krimskram","Es ist nichts brauchbares dabei.",0,UNNECESSARY,20,20,0},
- {"Kleider","Es sind Standard-Weltraum-Klamotten.",0,UNNECESSARY,21,21,0},
- {"Unterw�sche",&description,0,UNNECESSARY,22,22,0},
- {"Str�mpfe",&description,0,UNNECESSARY,23,23,0},
- {"Fach","Das ist eins deiner drei F�cher.",SHELF4,
- OPEN+CLOSED,24,25,13},
- {"Buch","Es ist|\"Per Anhalter durch die Galaxis\"|von Douglas Adams.",
- BOOK,TAKE,26,26,14},
- {"Discman","Es ist eine \"Mad Monkeys\"-CD darin.",
- DISCMAN,TAKE+COMBINABLE,33,33,16},
- {"Luke",&description,0,OPEN+EXIT,3,3,15+128,CORRIDOR,5},
- {"Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,0,0,0},
- {"Schrank",&description,0,OPEN+CLOSED,1,1,0},
- {"Fach",&description,0,OPEN+CLOSED,2,2,0},
- {"Steckdose",&description,SOCKET,COMBINABLE,4,4,0},
- {"Toilette",&description,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22}
- }
- },
- {
- "021",{1,1,1,1,1,1},NIL,NIL,NIL,
- {
- {"Bild","Herb!",0,UNNECESSARY,5,5,0},
- {"Bild","Toll!",0,UNNECESSARY,6,6,0},
- {"Bild","Genial!",0,UNNECESSARY,7,7,0},
- {"Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",0,
- UNNECESSARY,8,8,0},
- {"Bild","Es scheint noch nicht fertig zu sein.",0,UNNECESSARY,9,9,0},
- {"Stift","Ein Kugelschreiber.",PEN,TAKE+COMBINABLE,10,10,5+128},
- {"Luke",&description,0,OPEN+OPENED+EXIT,3,3,24+128,CORRIDOR,9},
- {"Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,0,0,0},
- {"Schrank",&description,0,OPEN+CLOSED,1,1,0},
- {"Fach",&description,0,OPEN+CLOSED,2,2,0},
- {"Steckdose",&description,SOCKET,COMBINABLE,4,4,0},
- {"Toilette",&description,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22}
- }
- },
- {
- "021",{1,0,0,0,0,0,1,1,1,1,0,0,1},&sb_cabin_l3,NIL,NIL,
- {
- {"Poster","Ein Poster von \"Big Boss\".",0,UNNECESSARY,11,11,0},
- {"Poster","Ein Poster von \"Rock Desaster\".",0,UNNECESSARY,12,12,0},
- {"Box",&description,0,0,13,13,0},
- {"Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",0,
- UNNECESSARY,14,14,0},
- {"Schallplatte","Die Platte ist von \"Big Boss\".",
- RECORD,TAKE+COMBINABLE,15,15,8+128},
- {"Schallplattenst�nder","Du hast jetzt keine Zeit, in|der Plattensammlung rumzust�bern.",
- 0,UNNECESSARY,16,16,0},
- {"Knopf",&description,TURNTABLE_BUTTON,PRESS,22,22,0},
- {"Plattenspieler","Sieht aus, als k�me|er aus dem Museum.",
- TURNTABLE,UNNECESSARY+COMBINABLE,17,17,0},
- {"Leitung",&description,WIRE,COMBINABLE,18,18,0},
- {"Leitung",&description,WIRE2,COMBINABLE,19,19,0},
- {"Stecker",&description,PLUG,COMBINABLE,20,20,0},
- {"Luke",&description,0,OPEN+OPENED+EXIT,3,3,24+128,CORRIDOR,9},
- {"Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,0,0,0},
- {"Schrank",&description,0,OPEN+CLOSED,1,1,0},
- {"Fach",&description,0,OPEN+CLOSED,2,2,0},
- {"Steckdose",&description,SOCKET,COMBINABLE,4,4,0},
- {"Toilette",&description,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22}
- }
- },
- {
- "021",{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},&sb_cabin_l2,NIL,NIL,
- {
- {"Schlitz","Es ist ein Keycard-Leser.",SLOT_KL1,COMBINABLE,31,31,0},
- {"Schlitz","Es ist ein Keycard-Leser.",SLOT_KL2,COMBINABLE,32,32,0},
- {"Schlitz","Es ist ein Keycard-Leser.",SLOT_KL3,COMBINABLE,33,33,0},
- {"Schlitz","Es ist ein Keycard-Leser.",SLOT_KL4,COMBINABLE,45,45,0},
- {"Schrank",&description,SHELF_L1,OPEN+CLOSED,25,26,17},
- {"Pistole","Es ist keine Munition drin.",PISTOL,TAKE,39,39,20},
- {"Fach",&description,SHELF_L2,OPEN+CLOSED,27,28,18},
- {"B�cher","Lauter wissenschaftliche B�cher.",0,UNNECESSARY,40,40,0},
- {"Fach",&description,SHELF_L3,OPEN+CLOSED,29,30,19},
- {"Kabelrolle","Da sind mindestens zwanzig Meter drauf.",
- SPOOL,TAKE+COMBINABLE,41,41,21},
- {"Fach",&description,SHELF_L4,OPEN+CLOSED,43,44,22},
- {"Buch",&description,BOOK2,TAKE,46,46,23},
- {"Unterw�sche","Ich habe keine Lust, in|der Unterw�sche des|Commanders rumzuw�hlen.",
- 0,UNNECESSARY,34,34,0},
- {"Unterw�sche","Ich habe keine Lust, in|der Unterw�sche des|Commanders rumzuw�hlen.",
- 0,UNNECESSARY,35,35,0},
- {"Kleider",&description,0,UNNECESSARY,36,36,0},
- {"Krimskram","Es ist nichts brauchbares dabei.",0,UNNECESSARY,37,37,0},
- {"Krimskram","Es ist nichts brauchbares dabei.",0,UNNECESSARY,38,38,0},
- {"Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",0,
- UNNECESSARY,23,23,0},
- {"Toilette",&description,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22},
- {"Luke",&description,0,OPEN+OPENED+EXIT,3,3,24+128,CORRIDOR,9},
- {"Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,0,0,0},
- {"Schrank",&description,0,OPEN+CLOSED,1,1,0},
- {"Fach",&description,0,OPEN+CLOSED,2,2,0},
- {"Steckdose",&description,SOCKET,COMBINABLE,4,4,0},
- {"Ordner","Darauf steht \"Dienstanweisungen|zur Mission Supernova\".|Es steht nichts wichtiges drin.",
- 0,UNNECESSARY,49,49,0}
- }
- },
- {
- "023",{1},&sb_bathroom,NIL,NIL,
- {
- {"Klo","Ein Klo mit Saugmechanismus.",TOILET,0,0,0,0},
- {"Dusche",&description,SHOWER,0,1,1,0},
- {"Ausgang",&description,BATHROOM_EXIT,EXIT,255,255,0,0,22}
- }
+class ShipSleepCabin: public Room {
+public:
+ ShipSleepCabin() {
+ _filenumber = 33;
+ _shown[0] = true;
+
+ _objectState[0] = Object("Luke", "Dies ist eine der Tiefschlafkammern.", CABINS, NULLTYPE, 0, 0, 0, NULLROOM, 0);
+ _objectState[1] = Object("Luke", "Dies ist eine der Tiefschlafkammern.", CABIN, NULLTYPE, 1, 1, 0, NULLROOM, 0);
+ _objectState[2] = Object("Computer", Object::defaultDescription, COMPUTER, NULLTYPE, 2, 2, 0, NULLROOM, 0);
+ _objectState[3] = Object("Ausgang", Object::defaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL, 2);
}
+
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+ virtual void animation();
+ virtual void onEntrance();
};
+class ShipCockpit : public Room {
+public:
+ ShipCockpit() {
+ _filenumber = 9;
+ _shown[0] = true;
+
+ _objectState[0] = Object("Instrumente", "Hmm, sieht ziemlich kompliziert aus.", INSTRUMENTS, NULLTYPE, 2, 2, 0, NULLROOM, 0);
+ _objectState[1] = Object("Monitor", Object::defaultDescription, MONITOR, NULLTYPE, 0, 0, 0, NULLROOM, 0);
+ _objectState[2] = Object("Monitor", "Dieser Monitor sagt dir nichts.", NULLOBJECT, TAKE, 1, 0, 0, NULLROOM, 0);
+ _objectState[3] = Object("Ausgang", Object::defaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL, 2);
+ }
+
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+ virtual void animation();
+ virtual void onEntrance();
+};
-/* --- Rooms ------------------------------------ */
-
-room roomlist2[ROOMNUM2] =
-{
-
-/* --- Arsano --- */
-
- {
- "012",{1},&sb_rocks,NIL,&once_rocks,
- {
- {"Seil",&description,0,UNNECESSARY+EXIT,0,0,0,GENERATOR,12},
- {"Stein",&description,STONE,0,1,1,0},
- {"Stein",&description,0,0,2,2,0},
- {"Loch","Es scheint eine H�hle zu sein.",0,0,255,255,0,CAVE,1}
- }
- },
- {
- "012",{0},NIL,NIL,NIL,
- {
- {"Ausgang","Hier bist du gerade hergekommen.",
- 0,EXIT,255,255,0,ROCKS,22},
- {"Ausgang",&description,0,EXIT,255,255,0,MEETUP,2}
- }
- },
- {
- "037",{1},&sb_meetup,&anim_meetup,&once_meetup,
- {
- {"H�hle",&description,0,EXIT,255,255,0,CAVE,22},
- {"Schild","Diese Schrift kannst du nicht lesen.",MEETUP_SIGN,0,0,0,0},
- {"Eingang",&description,DOOR,EXIT,1,1,0,ENTRANCE,7},
- {"Stern",&description,STAR,0,2,2,0},
- {"Raumschiff",&description,SPACESHIPS,COMBINABLE,3,3,0},
- {"Raumschiff",&description,SPACESHIP,COMBINABLE,4,4,0}
- }
- },
- {
- "010",{1},&sb_entrance,&anim_entrance,NIL,
- {
- {"Portier","Du siehst doch selbst, wie er aussieht.",
- PORTER,TALK,0,0,0},
- {"T�r",&description,0,EXIT+OPEN+CLOSED,1,1,0,0,5},
- {"Schild","Diese Schrift kannst du nicht lesen.",
- KITCHEN_SIGN,0,2,2,0},
- {"Kaugummi",&description,SCHNUCK,TAKE,255,255,10+128},
- {"Gummib�rchen",&description,SCHNUCK,TAKE,255,255,11+128},
- {"Schokokugel",&description,SCHNUCK,TAKE,255,255,12+128},
- {"�berraschungsei",&description,EGG,TAKE,255,255,13+128},
- {"Lakritz",&description,SCHNUCK,TAKE,255,255,14+128},
- {"Tablette","Die Plastikh�lle zeigt einen|Mund mit einer Sprechblase. Was|darin steht, kannst du nicht lesen.",
- PILL,TAKE,255,255,0},
- {"Schlitz",&description,CAR_SLOT,COMBINABLE,6,6,0},
- {"Automat","Sieht aus wie ein Kaugummiautomat.",0,0,5,5,0},
- {"Toilette","Die Toiletten sind denen|auf der Erde sehr �hnlich.",
- ARS_BATHROOM,0,255,255,0},
- {"Knopf",&description,BATHROOM_BUTTON,PRESS,3,3,0},
- {"Schild","Diese Schrift kannst du nicht lesen.",BATHROOM_SIGN,0,4,4,0},
- {"Treppe",&description,STAIRCASE,EXIT,8,8,0,REST,3},
- {"Ausgang",&description,MEETUP_EXIT,EXIT,255,255,0,MEETUP,22},
- {"M�nzen","Es sind seltsame|K�pfe darauf abgebildet.",
- COINS,TAKE+COMBINABLE,255,255,0},
- {"Tablettenh�lle","Darauf steht:\"Wenn Sie diese|Schrift jetzt lesen k�nnen,|hat die Tablette gewirkt.\"",
- PILL_HULL,TAKE,255,255,0}
- }
- },
- {
- "028",{1},NIL,&anim_remaining,NIL,
- {
- {"Treppe",&description,0,EXIT,0,0,0,ENTRANCE,17},
- {"Stuhl",&description,0,EXIT,1,1,0,ROGER,2},
- {"Schuhe","Wie ist der denn mit|Schuhen hier reingekommen?",0,0,2,2,0}
- }
- },
- {
- "029",{1},&sb_roger,&anim_roger,&once_roger,
- {
- {"Ausgang",&description,0,EXIT,255,255,0,REST,19},
- {"Froschgesicht",&description,ROGER_W,TALK,0,0,0},
- {"Gekritzel","\"Mr Spock was here\"",0,0,3,3,0},
- {"Brieftasche",&description,WALLET,TAKE,1,1,4},
- {"Speisekarte","\"Heute empfehlen wir:|Fonua Opra mit Ulk.\"",0,UNNECESSARY,2,2,0},
- {"Tasse","Sie enth�lt eine gr�nliche Fl�ssigkeit.",CUP,UNNECESSARY,4,4,0},
- {"Schachspiel",&description,0,UNNECESSARY,255,255,0},
- {"10-Buckazoid-Schein","Nicht gerade sehr viel Geld.",
- 0,TAKE+COMBINABLE,255,255,0},
- {"Keycard von Roger",&description,KEYCARD_R,TAKE+COMBINABLE,255,255,0}
- }
- },
- {
- "019",{1},&sb_glider,&anim_glider,NIL,
- {
- {"Ausgang",&description,0,EXIT,255,255,0,MEETUP,15},
- {"Knopf",&description,GLIDER_BUTTON1,PRESS,0,0,0},
- {"Knopf",&description,GLIDER_BUTTON2,PRESS,1,1,0},
- {"Knopf",&description,GLIDER_BUTTON3,PRESS,2,2,0},
- {"Knopf",&description,GLIDER_BUTTON4,PRESS,3,3,0},
- {"Keycard von Roger",&description,GLIDER_KEYCARD,TAKE+COMBINABLE,255,255,0},
- {"Schlitz",&description,GLIDER_SLOT,COMBINABLE,4,4,0},
- {"Fach",&description,0,OPEN,5,6,6},
- {"Tastatur",&description,GLIDER_BUTTONS,0,7,7,0},
- {"Anzeige","Hmm, seltsame Anzeigen.",GLIDER_DISPLAY,0,8,8,0},
- {"Instrumente","Hmm, seltsame Anzeigen.",GLIDER_INSTRUMENTS,0,9,9,0}
- }
- },
- {
- "038",{1},&sb_meetup2,NIL,&once_meetup2,
- {
- {"Roger W.",&description,ROGER_W,TALK,255,255,0},
- {"Raumschiff",&description,SPACESHIP,COMBINABLE,255,255,0},
- {"H�hle",&description,0,EXIT,255,255,0,CAVE,22}
- }
- },
- {
- "039",{1},&sb_meetup3,NIL,NIL,
- {
- {"Ufo","Der Eingang scheint offen zu sein.",UFO,EXIT,0,0,0,0,3},
- {"Stern",&description,STAR,0,1,1,0},
- {"H�hle",&description,0,EXIT,255,255,0,CAVE,22}
- }
+class ShipCabinL1: public Room {
+public:
+ ShipCabinL1() {
+ _filenumber = 21;
+ _shown[0] = true;
+ _shown[1] = true;
+ _shown[2] = true;
+ _shown[3] = true;
+ _shown[4] = true;
+ _shown[5] = true;
+
+ _objectState[0] = Object("Bild", "Herb!", NULLOBJECT, UNNECESSARY, 5, 5, 0, NULLROOM, 0);
+ _objectState[1] = Object("Bild", "Toll!", NULLOBJECT, UNNECESSARY, 6, 6, 0, NULLROOM, 0);
+ _objectState[2] = Object("Bild", "Genial!", NULLOBJECT, UNNECESSARY, 7, 7, 0, NULLROOM, 0);
+ _objectState[3] = Object("Magnete", "Damit werden Sachen auf|dem Tisch festgehalten.", NULLOBJECT, UNNECESSARY, 8, 8, 0, NULLROOM, 0);
+ _objectState[4] = Object("Bild", "Es scheint noch nicht fertig zu sein.", 0, UNNECESSARY, 9, 9, 0);
+ _objectState[5] = Object("Stift", "Ein Kugelschreiber.", PEN, TAKE | COMBINABLE, 10, 10, 5 | 128);
+ _objectState[6] = Object("Luke", &description, 0, OPEN | OPENED | EXIT, 3, 3, 24 | 128, CORRIDOR, 9);
+ _objectState[7] = Object("Schlitz", "Es ist ein Keycard-Leser.", 0, COMBINABLE, 0, 0, 0);
+ _objectState[8] = Object("Schrank", &description, 0, OPEN | CLOSED, 1, 1, 0);
+ _objectState[9] = Object("Fach", &description, 0, OPEN | CLOSED, 2, 2, 0);
+ _objectState[10] = Object("Steckdose", &description, SOCKET, COMBINABLE, 4, 4, 0);
+ _objectState[11] = Object("Toilette", &description, BATHROOM_DOOR, EXIT, 255, 255, 0, BATHROOM, 2);
}
};
-/* --- Rooms ------------------------------------ */
-
-room roomlist2[ROOMNUM2] =
-{
-
-/* --- Arsano --- */
-
- {
- "012",{1},&sb_rocks,NIL,&once_rocks,
- {
- {"Seil",&description,0,UNNECESSARY+EXIT,0,0,0,GENERATOR,12},
- {"Stein",&description,STONE,0,1,1,0},
- {"Stein",&description,0,0,2,2,0},
- {"Loch","Es scheint eine Hhle zu sein.",0,0,255,255,0,CAVE,1}
- }
- },
- {
- "012",{0},NIL,NIL,NIL,
- {
- {"Ausgang","Hier bist du gerade hergekommen.",
- 0,EXIT,255,255,0,ROCKS,22},
- {"Ausgang",&description,0,EXIT,255,255,0,MEETUP,2}
- }
- },
- {
- "037",{1},&sb_meetup,&anim_meetup,&once_meetup,
- {
- {"Hhle",&description,0,EXIT,255,255,0,CAVE,22},
- {"Schild","Diese Schrift kannst du nicht lesen.",MEETUP_SIGN,0,0,0,0},
- {"Eingang",&description,DOOR,EXIT,1,1,0,ENTRANCE,7},
- {"Stern",&description,STAR,0,2,2,0},
- {"Raumschiff",&description,SPACESHIPS,COMBINABLE,3,3,0},
- {"Raumschiff",&description,SPACESHIP,COMBINABLE,4,4,0}
- }
- },
- {
- "010",{1},&sb_entrance,&anim_entrance,NIL,
- {
- {"Portier","Du siehst doch selbst, wie er aussieht.",
- PORTER,TALK,0,0,0},
- {"Tr",&description,0,EXIT+OPEN+CLOSED,1,1,0,0,5},
- {"Schild","Diese Schrift kannst du nicht lesen.",
- KITCHEN_SIGN,0,2,2,0},
- {"Kaugummi",&description,SCHNUCK,TAKE,255,255,10+128},
- {"Gummibrchen",&description,SCHNUCK,TAKE,255,255,11+128},
- {"Schokokugel",&description,SCHNUCK,TAKE,255,255,12+128},
- {"berraschungsei",&description,EGG,TAKE,255,255,13+128},
- {"Lakritz",&description,SCHNUCK,TAKE,255,255,14+128},
- {"Tablette","Die Plastikhlle zeigt einen|Mund mit einer Sprechblase. Was|darin steht, kannst du nicht lesen.",
- PILL,TAKE,255,255,0},
- {"Schlitz",&description,CAR_SLOT,COMBINABLE,6,6,0},
- {"Automat","Sieht aus wie ein Kaugummiautomat.",0,0,5,5,0},
- {"Toilette","Die Toiletten sind denen|auf der Erde sehr hnlich.",
- ARS_BATHROOM,0,255,255,0},
- {"Knopf",&description,BATHROOM_BUTTON,PRESS,3,3,0},
- {"Schild","Diese Schrift kannst du nicht lesen.",BATHROOM_SIGN,0,4,4,0},
- {"Treppe",&description,STAIRCASE,EXIT,8,8,0,REST,3},
- {"Ausgang",&description,MEETUP_EXIT,EXIT,255,255,0,MEETUP,22},
- {"Mnzen","Es sind seltsame|Kpfe darauf abgebildet.",
- COINS,TAKE+COMBINABLE,255,255,0},
- {"Tablettenhlle","Darauf steht:\"Wenn Sie diese|Schrift jetzt lesen knnen,|hat die Tablette gewirkt.\"",
- PILL_HULL,TAKE,255,255,0}
- }
- },
- {
- "028",{1},NIL,&anim_remaining,NIL,
- {
- {"Treppe",&description,0,EXIT,0,0,0,ENTRANCE,17},
- {"Stuhl",&description,0,EXIT,1,1,0,ROGER,2},
- {"Schuhe","Wie ist der denn mit|Schuhen hier reingekommen?",0,0,2,2,0}
- }
- },
- {
- "029",{1},&sb_roger,&anim_roger,&once_roger,
- {
- {"Ausgang",&description,0,EXIT,255,255,0,REST,19},
- {"Froschgesicht",&description,ROGER_W,TALK,0,0,0},
- {"Gekritzel","\"Mr Spock was here\"",0,0,3,3,0},
- {"Brieftasche",&description,WALLET,TAKE,1,1,4},
- {"Speisekarte","\"Heute empfehlen wir:|Fonua Opra mit Ulk.\"",0,UNNECESSARY,2,2,0},
- {"Tasse","Sie enthlt eine grnliche Flssigkeit.",CUP,UNNECESSARY,4,4,0},
- {"Schachspiel",&description,0,UNNECESSARY,255,255,0},
- {"10-Buckazoid-Schein","Nicht gerade sehr viel Geld.",
- 0,TAKE+COMBINABLE,255,255,0},
- {"Keycard von Roger",&description,KEYCARD_R,TAKE+COMBINABLE,255,255,0}
- }
- },
- {
- "019",{1},&sb_glider,&anim_glider,NIL,
- {
- {"Ausgang",&description,0,EXIT,255,255,0,MEETUP,15},
- {"Knopf",&description,GLIDER_BUTTON1,PRESS,0,0,0},
- {"Knopf",&description,GLIDER_BUTTON2,PRESS,1,1,0},
- {"Knopf",&description,GLIDER_BUTTON3,PRESS,2,2,0},
- {"Knopf",&description,GLIDER_BUTTON4,PRESS,3,3,0},
- {"Keycard von Roger",&description,GLIDER_KEYCARD,TAKE+COMBINABLE,255,255,0},
- {"Schlitz",&description,GLIDER_SLOT,COMBINABLE,4,4,0},
- {"Fach",&description,0,OPEN,5,6,6},
- {"Tastatur",&description,GLIDER_BUTTONS,0,7,7,0},
- {"Anzeige","Hmm, seltsame Anzeigen.",GLIDER_DISPLAY,0,8,8,0},
- {"Instrumente","Hmm, seltsame Anzeigen.",GLIDER_INSTRUMENTS,0,9,9,0}
- }
- },
- {
- "038",{1},&sb_meetup2,NIL,&once_meetup2,
- {
- {"Roger W.",&description,ROGER_W,TALK,255,255,0},
- {"Raumschiff",&description,SPACESHIP,COMBINABLE,255,255,0},
- {"Hhle",&description,0,EXIT,255,255,0,CAVE,22}
- }
- },
- {
- "039",{1},&sb_meetup3,NIL,NIL,
- {
- {"Ufo","Der Eingang scheint offen zu sein.",UFO,EXIT,0,0,0,0,3},
- {"Stern",&description,STAR,0,1,1,0},
- {"Hhle",&description,0,EXIT,255,255,0,CAVE,22}
- }
+
+class ShipCabinL2 : public Room {
+public:
+ ShipCabinL2() {
+ _filenumber = 21;
+ _shown[0] = true;
+ _shown[1] = false;
+ _shown[2] = false;
+ _shown[3] = false;
+ _shown[4] = false;
+ _shown[5] = false;
+ _shown[6] = false;
+ _shown[7] = false;
+ _shown[8] = false;
+ _shown[9] = false;
+ _shown[10] = false;
+ _shown[11] = false;
+ _shown[12] = false;
+ _shown[13] = false;
+ _shown[14] = false;
+ _shown[15] = false;
+ _shown[16] = true;
+
+ _objectState[0] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_KL1,COMBINABLE,31,31,0);
+ _objectState[1] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_KL2,COMBINABLE,32,32,0);
+ _objectState[2] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_KL3,COMBINABLE,33,33,0);
+ _objectState[3] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_KL4,COMBINABLE,45,45,0);
+ _objectState[4] = Object("Schrank",&description,SHELF_L1,OPEN | CLOSED,25,26,17);
+ _objectState[5] = Object("Pistole","Es ist keine Munition drin.",PISTOL,TAKE,39,39,20);
+ _objectState[6] = Object("Fach",&description,SHELF_L2,OPEN | CLOSED,27,28,18);
+ _objectState[7] = Object("B�cher","Lauter wissenschaftliche B�cher.",0,UNNECESSARY,40,40,0);
+ _objectState[8] = Object("Fach",&description,SHELF_L3,OPEN | CLOSED,29,30,19);
+ _objectState[9] = Object("Kabelrolle","Da sind mindestens zwanzig Meter drauf.", SPOOL,TAKE | COMBINABLE,41,41,21);
+ _objectState[10] = Object("Fach",&description,SHELF_L4,OPEN | CLOSED,43,44,22);
+ _objectState[11] = Object("Buch",&description,BOOK2,TAKE,46,46,23);
+ _objectState[12] = Object("Unterw�sche","Ich habe keine Lust, in|der Unterw�sche des|Commanders rumzuw�hlen.", 0,UNNECESSARY,34,34,0);
+ _objectState[13] = Object("Unterw�sche","Ich habe keine Lust, in|der Unterw�sche des|Commanders rumzuw�hlen.", 0,UNNECESSARY,35,35,0);
+ _objectState[14] = Object("Kleider",&description,0,UNNECESSARY,36,36,0);
+ _objectState[15] = Object("Krimskram","Es ist nichts brauchbares dabei.",0,UNNECESSARY,37,37,0);
+ _objectState[16] = Object("Krimskram","Es ist nichts brauchbares dabei.",0,UNNECESSARY,38,38,0);
+ _objectState[17] = Object("Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",0, UNNECESSARY,23,23,0);
+ _objectState[18] = Object("Toilette",&description,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
+ _objectState[19] = Object("Luke",&description,0,OPEN | OPENED | EXIT,3,3,24 | 128,CORRIDOR,9);
+ _objectState[20] = Object("Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,0,0,0);
+ _objectState[21] = Object("Schrank",&description,0,OPEN | CLOSED,1,1,0);
+ _objectState[22] = Object("Fach",&description,0,OPEN | CLOSED,2,2,0);
+ _objectState[23] = Object("Steckdose",&description,SOCKET,COMBINABLE,4,4,0);
+ _objectState[24] = Object("Ordner","Darauf steht \"Dienstanweisungen|zur Mission Supernova\".|Es steht nichts wichtiges drin.", 0,UNNECESSARY,49,49,);
}
+
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
};
+class ShipCabinL3 : public Room {
+public:
+ ShipCabinL3() {
+ _filenumber = 21;
+ _shown[0] = true;
+ _shown[1] = false;
+ _shown[2] = false;
+ _shown[3] = false;
+ _shown[4] = false;
+ _shown[5] = false;
+ _shown[6] = true;
+ _shown[7] = true;
+ _shown[8] = true;
+ _shown[9] = true;
+ _shown[10] = false;
+ _shown[11] = false;
+ _shown[12] = true;
+
+ _objectState[0] = Object("Poster","Ein Poster von \"Big Boss\".",0,UNNECESSARY,11,11,0);
+ _objectState[1] = Object("Poster","Ein Poster von \"Rock Desaster\".",0,UNNECESSARY,12,12,0);
+ _objectState[2] = Object("Box",&description,0,0,13,13,0);
+ _objectState[3] = Object("Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",0,UNNECESSARY,14,14,0);
+ _objectState[4] = Object("Schallplatte","Die Platte ist von \"Big Boss\".",RECORD,TAKE | COMBINABLE,15,15,8 | 128);
+ _objectState[5] = Object("Schallplattenst�nder","Du hast jetzt keine Zeit, in|der Plattensammlung rumzust�bern.",0,UNNECESSARY,16,16,0);
+ _objectState[6] = Object("Knopf",&description,TURNTABLE_BUTTON,PRESS,22,22,0);
+ _objectState[7] = Object("Plattenspieler","Sieht aus, als k�me|er aus dem Museum.",TURNTABLE,UNNECESSARY | COMBINABLE,17,17,0);
+ _objectState[8] = Object("Leitung",&description,WIRE,COMBINABLE,18,18,0);
+ _objectState[9] = Object("Leitung",&description,WIRE2,COMBINABLE,19,19,0);
+ _objectState[10] = Object("Stecker",&description,PLUG,COMBINABLE,20,20,0);
+ _objectState[11] = Object("Luke",&description,0,OPEN | OPENED | EXIT,3,3,24 | 128,CORRIDOR,9);
+ _objectState[12] = Object("Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,0,0,0);
+ _objectState[13] = Object("Schrank",&description,0,OPEN | CLOSED,1,1,0);
+ _objectState[14] = Object("Fach",&description,0,OPEN | CLOSED,2,2,0);
+ _objectState[15] = Object("Steckdose",&description,SOCKET,COMBINABLE,4,4,0);
+ _objectState[16] = Object("Toilette",&description,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,2);
+ }
+
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
-/* --- Rooms ------------------------------------ */
-
-room roomlist3[ROOMNUM3] =
-{
-
-/* --- Axacuss --- */
-
- {
- "043",{1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
- &sb_cell,&anim_cell,&once_cell,
- {
- {"Knopf",&description,CELL_BUTTON,PRESS,1,1,0},
- {"T�r",&description,CELL_DOOR,EXIT+OPEN+CLOSED,0,0,31+128,CORRIDOR4,1},
- {"Tablett","Es ist irgendein Fra� und|etwas zu Trinken darauf.",
- TRAY,UNNECESSARY,255,255,0},
- {"Stange","Es scheint eine Lampe zu sein.",0,COMBINABLE,3,3,0},
- {"Augen","Es ist nur ein Bild.",0,0,4,4,0},
- {"Leitung",&description,CELL_WIRE,COMBINABLE+TAKE,6,6,0},
- {"Steckdose","Sieht etwas anders aus als auf der Erde.",
- SOCKET,COMBINABLE,5,5,0},
- {"Metallblock","Er ist ziemlich schwer.",
- MAGNET,TAKE+COMBINABLE,255,255,30},
- {"Roboter","Den hast du erledigt.",0,0,255,255,0},
- {"Tisch","Ein kleiner Metalltisch.",CELL_TABLE,COMBINABLE,2,2,0}
- }
- },
- {
- "016",{1,0,0,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,1},
- NIL,NIL,&once_corridor,
- {
- {"Ausgang",&description,0,EXIT,2,2,0,GUARD3,2},
- {"Ausgang",&description,0,EXIT,3,3,0,CORRIDOR2,22}
- }
- },
- {
- "016",{1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1},
- NIL,NIL,&once_corridor,
- {
- {"Ausgang",&description,0,EXIT,2,2,0,CORRIDOR1,2},
- {"Ausgang",&description,0,EXIT,3,3,0,CORRIDOR3,22},
- {"Ausgang",&description,0,EXIT,1,1,0,CORRIDOR4,14}
- }
- },
- {
- "016",{1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1},
- NIL,NIL,&once_corridor,
- {
- {"Ausgang",&description,0,EXIT,2,2,0,CORRIDOR2,2}
- }
- },
- {
- "016",{1,1,1,0,0,0,0,0,1,1,0,1,0,0,0,1,0,0,1,0,1,0,0,0,0,0,1},
- &sb_corridor4,NIL,&once_corridor4,
- {
- {"Ausgang",&description,0,EXIT,0,0,0,CORRIDOR2,10},
- {"Ausgang",&description,0,EXIT,1,1,0,GUARD,14},
- {"Zellent�r","Hier warst du eingesperrt.",
- DOOR,EXIT+OPEN+OPENED+CLOSED,7,7,0,CELL,16},
- {"Laptop",&description,NEWSPAPER,TAKE,6,6,8},
- {"Armbanduhr",&description,WATCH,TAKE+COMBINABLE,255,255,8},
- {"Tisch",&description,TABLE,COMBINABLE,5,5,0}
- }
- },
- {
- "016",{1,0,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1},
- &sb_corridor5,NIL,&once_corridor,
- {
- {"Ausgang",&description,DOOR,EXIT,2,2,0,0,2},
- {"Ausgang",&description,0,EXIT,3,3,0,CORRIDOR6,22}
- }
- },
- {
- "016",{1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1},
- &sb_corridor6,NIL,&once_corridor,
- {
- {"Ausgang",&description,0,EXIT,2,2,0,CORRIDOR5,2},
- {"Ausgang",&description,0,EXIT,3,3,0,CORRIDOR7,22},
- {"T�r",&description,DOOR,OPEN+CLOSED,255,255,0,CORRIDOR8,13}
- }
- },
- {
- "016",{1,0,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1},
- NIL,NIL,&once_corridor,
- {
- {"Ausgang",&description,0,EXIT,2,2,0,CORRIDOR6,2},
- {"Ausgang",&description,0,EXIT,3,3,0,GUARD,22}
- }
- },
- {
- "016",{1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,1},
- &sb_corridor8,NIL,&once_corridor,
- {
- {"T�r",&description,DOOR,EXIT+OPEN,0,0,0,CORRIDOR6,10},
- {"Ausgang",&description,0,EXIT,3,3,0,BCORRIDOR,22}
- }
- },
- {
- "016",{1,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1},
- &sb_corridor9,NIL,&once_corridor,
- {
- {"Ausgang",&description,0,EXIT,2,2,0,BCORRIDOR,2},
- {"T�r",&description,DOOR,EXIT+OPEN,0,0,0,GUARD,10}
- }
- },
- {
- "006",{1,0,0,1},&sb_bgang,NIL,&once_bgang,
- {
- {"S�ule",&description,PILLAR1,0,4,4,0},
- {"S�ule",&description,PILLAR2,0,5,5,0},
- {"Ausgang",&description,0,EXIT,6,6,0,CORRIDOR8,2},
- {"Ausgang",&description,0,EXIT,7,7,0,CORRIDOR9,22},
- {"T�r","Auf einem Schild an der T�r steht \"Dr. Alab Hansi\".",
- DOOR1,EXIT+OPEN+CLOSED+OCCUPIED,0,0,1,OFFICE_L1,6},
- {"T�r","Auf einem Schild an der T�r steht \"Saval Lun\".",
- DOOR2,EXIT+OPEN+CLOSED+OCCUPIED,1,1,2,OFFICE_L2,16},
- {"T�r","Auf einem Schild an der T�r steht \"Prof. Dr. Ugnul Tschabb\".",
- DOOR3,EXIT+OPEN+OPENED,2,2,3,OFFICE_R1,8},
- {"T�r","Auf einem Schild an der T�r steht \"Alga Hurz Li\".",
- DOOR4,EXIT+OPEN+CLOSED+OCCUPIED,3,3,4,OFFICE_R2,18}
- }
- },
- {
- "040",{1},&sb_guard,NIL,NIL,
- {
- {"Ausgang",&description,0,EXIT,255,255,0,CORRIDOR4,21},
- {"Gang",&description,0,EXIT,3,3,0,CORRIDOR7,5},
- {"T�r",&description,DOOR,EXIT+OPEN,1,1,6,CORRIDOR9,3},
- {"Axacussaner","Du m��test ihn irgendwie ablenken.",
- GUARD,TALK,0,0,0},
- {"Bild","Komisches Bild.",0,0,2,2,0},
- {"Karte","Darauf steht: \"Generalkarte\".",
- MASTERKEYCARD,TAKE+COMBINABLE,255,255,1}
- }
- },
- {
- "042",{1},&sb_guard3,NIL,NIL,
- {
- {"Ausgang",&description,0,EXIT,255,255,0,CORRIDOR1,22},
- {"T�r",&description,0,EXIT+OPEN+CLOSED,0,0,0,0,20},
- {"T�r",&description,0,EXIT+OPEN+CLOSED,1,1,0,0,15},
- {"T�r",&description,DOOR,EXIT+OPEN,2,2,11,OFFICE_L,0},
- {"Lampe",&description,LAMP,COMBINABLE,3,3,0},
- {"Axacussaner",&description,GUARD,TALK,5,5,0},
- {"Bild","Seltsam!",0,0,4,4,0}
- }
- },
- {
- "007",{1,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,1},
- &sb_office1,NIL,NIL,
- {
- {"T�r",&description,DOOR,EXIT+OPEN+OPENED,6,6,9,BCORRIDOR,9},
- {"Computer",&description,COMPUTER,COMBINABLE,4,4,0},
- {"Geld","Es sind 500 Xa.",TICKETS,TAKE,255,255,0},
- {"Schlie�fach","Es hat ein elektronisches Zahlenschlo�.",
- LOCKER,OPEN+CLOSED,5,5,0},
- {"Brief",&description,LETTER,UNNECESSARY,3,3,0}
- }
- },
- {
- "007",{1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1},
- &sb_office2,NIL,NIL,
- {
- {"T�r",&description,DOOR,EXIT+OPEN+OPENED,6,6,9,BCORRIDOR,9},
- {"Computer",&description,COMPUTER,COMBINABLE,4,4,0},
- {"W�rfel","Sonderbar!",0,0,0,0,0},
- {"Bild","Affenstark!",0,0,1,1,0},
- {"Komisches Ding","Wundersam!",0,UNNECESSARY,2,2,0}
- }
- },
- {
- "008",{1,1,0,1},&sb_office3,NIL,NIL,
- {
- {"T�r",&description,DOOR,EXIT+OPEN+OPENED,0,0,3,BCORRIDOR,5},
- {"Computer",&description,COMPUTER,COMBINABLE,4,4,0},
- {"Bild","Es ist ein Axacussanerkopf auf dem Bild.",0,UNNECESSARY,1,1,0},
- {"Bild","Es ist ein Axacussanerkopf auf dem Bild.",PAINTING,UNNECESSARY,2,2,0},
- {"Pflanze",&description,0,UNNECESSARY,3,3,0},
- {NIL,&description,MONEY,TAKE+COMBINABLE,255,255,0}
- }
- },
- {
- "008",{1,0,1,1},&sb_office4,NIL,NIL,
- {
- {"T�r",&description,DOOR,EXIT+OPEN+OPENED,0,0,3,BCORRIDOR,5},
- {"Computer",&description,COMPUTER,COMBINABLE,4,4,0},
- {"Figur","Stark!",0,UNNECESSARY,6,6,0},
- {"Pflanze","Sie ist den Pflanzen auf der Erde sehr �hnlich.",
- 0,UNNECESSARY,5,5,0}
- }
- },
- {
- "007",{1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1},
- &sb_office5,NIL,&once_office5,
- {
- {"T�r",&description,DOOR,EXIT+OPEN+OPENED,6,6,17,GUARD3,9},
- {"Computer","Er funktioniert nicht.",COMPUTER,COMBINABLE,4,4,0},
- {"Graffiti","Seltsamer B�roschmuck!",0,0,7,7,0},
- {"Geld","Es sind 350 Xa.",TICKETS,TAKE,8,8,0}
- }
- },
- {
- "003",{1},&sb_elevator,NIL,NIL,
- {
- {"Knopf",&description,BUTTON1,PRESS,0,0,0},
- {"Knopf",&description,BUTTON2,PRESS,1,1,0},
- {"Ausgang",&description,DOOR,EXIT,255,255,0,0,22},
- {"Dschungel","Lauter B�ume.",JUNGLE,0,255,255,0,STATION,2}
- }
- },
- {
- "005",{1},&sb_station,NIL,NIL,
- {
- {"Schild",&description,STATION_SIGN,0,0,0,0},
- {"T�r",&description,DOOR,EXIT+OPEN+CLOSED,1,1,0,0,7}
- }
- },
- {
- "032",{1,1},&sb_sign,NIL,NIL,
- {
- {"Ausgang",&description,0,EXIT,255,255,0,STATION,22},
- {"Schlitz",&description,SLOT,COMBINABLE,0,0,0}
- }
+class ShipCabinR1 : public Room {
+public:
+ ShipCabinR1() {
+ _filenumber = 22;
+ _shown[0] = true;
+ _shown[1] = true;
+ _shown[2] = true;
+
+ _objectState[0] = Object("Bild","Manche Leute haben schon|einen komischen Geschmack.",0,UNNECESSARY,5,5,0);
+ _objectState[1] = Object("Zeichenger�te","Auf dem Zettel sind lauter|unverst�ndliche Skizzen und Berechnungen.|(Jedenfalls f�r dich unverst�ndlich.)",0,UNNECESSARY,6,6,0);
+ _objectState[2] = Object("Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",0,UNNECESSARY,7,7,0);
+ _objectState[3] = Object("Luke",&description,0,OPEN | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
+ _objectState[4] = Object("Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,0,0,0);
+ _objectState[5] = Object("Schrank",&description,0,OPEN | CLOSED,1,1,0);
+ _objectState[6] = Object("Fach",&description,0,OPEN | CLOSED,2,2,0);
+ _objectState[7] = Object("Steckdose",&description,SOCKET,COMBINABLE,4,4,0);
+ _objectState[8] = Object("Toilette",&description,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,2);
}
};
+class ShipCabinR2 : public Room {
+public:
+ ShipCabinR2() {
+ _filenumber = 22;
+ _shown[0] = true;
+ _shown[1] = false;
+ _shown[2] = false;
+ _shown[3] = true;
+ _shown[4] = true;
+ _shown[5] = true;
+
+ _objectState[0] = Object("Schachspiel","Es macht wohl Spa�, an|der Decke Schach zu spielen.",0,UNNECESSARY,11,11,0);
+ _objectState[1] = Object("Tennisschl�ger","Fliegt Boris Becker auch mit?",0,UNNECESSARY,8,8,0);
+ _objectState[2] = Object("Tennisball","Toll!",0,UNNECESSARY,9,9,0);
+ _objectState[3] = Object("Luke",&description,0,OPEN | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
+ _objectState[4] = Object("Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,0,0,0);
+ _objectState[5] = Object("Schrank",&description,0,OPEN | CLOSED,1,1,0);
+ _objectState[6] = Object("Fach",&description,0,OPEN | CLOSED,2,2,0);
+ _objectState[7] = Object("Steckdose",&description,SOCKET,COMBINABLE,4,4,0);
+ _objectState[8] = Object("Toilette",&description,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,2);
+ }
+};
+
+class ShipCabinR3 : public Room {
+public:
+ ShipCabinR3() {
+ _filenumber = 22;
+ _shown[0] = true;
+ _shown[1] = false;
+ _shown[2] = false;
+ _shown[3] = false;
+ _shown[4] = false;
+ _shown[5] = false;
+ _shown[6] = false;
+ _shown[7] = true;
+ _shown[8] = true;
+ _shown[9] = false;
+ _shown[10] = false;
+ _shown[11] = false;
+ _shown[12] = false;
+ _shown[13] = false;
+ _shown[14] = false;
+ _shown[15] = true;
+
+ _objectState[0] = Object("Schachspiel","Dein Magnetschachspiel. Schach war|schon immer deine Leidenschaft.",CHESS,TAKE | COMBINABLE,12,12,7 | 128);
+ _objectState[1] = Object("Bett","Das ist dein Bett. Toll, nicht wahr?",0,0,13,13,0);
+ _objectState[2] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_K1,COMBINABLE,27,27,0);
+ _objectState[3] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_K2,COMBINABLE,28,28,0);
+ _objectState[4] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_K3,COMBINABLE,29,29,0);
+ _objectState[5] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_K4,COMBINABLE,30,30,0);
+ _objectState[6] = Object("Fach","Das ist eins deiner drei F�cher.",SHELF1,OPEN | CLOSED,14,18,9);
+ _objectState[7] = Object("Alben","Deine Briefmarkensammlung.",0,UNNECESSARY,14,14,0);
+ _objectState[8] = Object("Fach","Das ist eins deiner drei F�cher.",SHELF2,OPEN | CLOSED,15,19,10);
+ _objectState[9] = Object("Seil","Es ist ungef�hr 10 m lang und 4 cm dick.",ROPE,TAKE | COMBINABLE,15,15,12);
+ _objectState[10] = Object("Schrank","Das ist dein Schrank.",SHELF3,OPEN | CLOSED,16,17,11);
+ _objectState[11] = Object("Krimskram","Es ist nichts brauchbares dabei.",0,UNNECESSARY,20,20,0);
+ _objectState[12] = Object("Kleider","Es sind Standard-Weltraum-Klamotten.",0,UNNECESSARY,21,21,0);
+ _objectState[13] = Object("Unterw�sche",&description,0,UNNECESSARY,22,22,0);
+ _objectState[14] = Object("Str�mpfe",&description,0,UNNECESSARY,23,23,0);
+ _objectState[15] = Object("Fach","Das ist eins deiner drei F�cher.",SHELF4,OPEN | CLOSED,24,25,13);
+ _objectState[16] = Object("Buch","Es ist|\"Per Anhalter durch die Galaxis\"|von Douglas Adams.",BOOK,TAKE,26,26,14);
+ _objectState[17] = Object("Discman","Es ist eine \"Mad Monkeys\"-CD darin.",DISCMAN,TAKE | COMBINABLE,33,33,16);
+ _objectState[18] = Object("Luke",&description,0,OPEN | EXIT,3,3,15 | 128,CORRIDOR,5);
+ _objectState[19] = Object("Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,0,0,0);
+ _objectState[20] = Object("Schrank",&description,0,OPEN | CLOSED,1,1,0);
+ _objectState[21] = Object("Fach",&description,0,OPEN | CLOSED,2,2,0);
+ _objectState[22] = Object("Steckdose",&description,SOCKET,COMBINABLE,4,4,0);
+ _objectState[23] = Object("Toilette",&description,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,2);
+ }
+
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
+
+class ShipCabinBathroom : public Room {
+public:
+ ShipCabinBathroom() {
+ _filenumber = 23;
+ _shown[0] = true;
+
+ _objectState[0] = Object("Klo","Ein Klo mit Saugmechanismus.",TOILET,0,0,0,0);
+ _objectState[1] = Object("Dusche",&description,SHOWER,0,1,1,0);
+ _objectState[2] = Object("Ausgang",&description,BATHROOM_EXIT,EXIT,255,255,0,0,2);
+ }
+};
+
+class ShipAirlock : public Room {
+public:
+ ShipAirlock() {
+ _filenumber = 34;
+ _shown[0] = true;
+ _shown[1] = false;
+ _shown[2] = false;
+ _shown[3] = false;
+ _shown[4] = false;
+ _shown[5] = false;
+ _shown[6] = true;
+
+ _objectState[0] = Object("Luke","Das ist eine Luke !!!",0,EXIT | OPEN | OPENED | CLOSED,0,0,0,CORRIDOR,10);
+ _objectState[1] = Object("Luke","Dies ist eine Luke !!!",0,EXIT | OPEN | CLOSED,1,1,0,HOLD,14);
+ _objectState[2] = Object("Knopf",&description,BUTTON1,PRESS,2,2,0);
+ _objectState[3] = Object("Knopf",&description,BUTTON2,PRESS,3,3,0);
+ _objectState[4] = Object("Helm","Es ist der Helm zum Raumanzug.",HELMET,TAKE,4,4,7);
+ _objectState[5] = Object("Raumanzug","Der einzige Raumanzug, den die|anderen hiergelassen haben ...",SUIT,TAKE,5,5,8);
+ _objectState[6] = Object("Versorgung","Es ist der Versorgungsteil zum Raumanzug.",LIFESUPPORT,TAKE,6,6,9);
+ }
+
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+ virtual void onEntrance();
+};
+
+class ShipHold : public Room {
+public:
+ ShipHold() {
+ _filenumber = 24;
+ _shown[0] = true;
+
+ _objectState[0] = Object("",&description,HOLD_WIRE,COMBINABLE,255,255,0);
+ _objectState[1] = Object("Schrott","Da ist eine L�sterklemme dran, die|noch ganz brauchbar aussieht.|Ich nehme sie mit.",SCRAP_LK,0,4,4,0);
+ _objectState[2] = Object("L�sterklemme",&description,TERMINALSTRIP,COMBINABLE,255,255,0);
+ _objectState[3] = Object("Schrott","Junge, Junge! Die Explosion hat ein|ganz sch�nes Durcheinander angerichtet.",0,0,5,5,0);
+ _objectState[4] = Object("Reaktor","Das war einmal der Reaktor.",0,0,6,6,0);
+ _objectState[5] = Object("D�se",&description,0,0,7,7,0);
+ _objectState[6] = Object("blauer K�rbis","Keine Ahnung, was das ist.",0,0,8,8,0);
+ _objectState[7] = Object("Luke",&description,LANDINGMOD_OUTERHATCH,EXIT | OPEN,1,2,2,LANDINGMODULE,6);
+ _objectState[8] = Object("Landef�hre","Sie war eigentlich f�r Bodenuntersuchungen|auf Arsano 3 gedacht.",0,0,0,0,0);
+ _objectState[9] = Object("Ausgang",&description,0,EXIT,255,255,0,AIRLOCK,22);
+ _objectState[10] = Object("Luke","Sie f�hrt nach drau�en.",OUTERHATCH_TOP,EXIT | OPEN | OPENED,3,3,0,GENERATOR,8);
+ _objectState[11] = Object("Generator","Er versorgt das Raumschiff mit Strom.",GENERATOR_TOP,EXIT,12,12,0,GENERATOR,8);
+ }
+
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+ virtual void onEntrance();
+};
+
+class ShipLandingModule : public Room {
+public:
+ ShipLandingModule() {
+ _filenumber = 25;
+ _shown[0] = true;
+
+ _objectState[0] = Object("Steckdose",&description,LANDINGMOD_SOCKET,COMBINABLE,1,1,0);
+ _objectState[1] = Object("Knopf","Es ist ein Sicherheitsknopf.|Er kann nur mit einem spitzen|Gegenstand gedr�ckt werden.",LANDINGMOD_BUTTON,PRESS | COMBINABLE,2,2,0);
+ _objectState[2] = Object("Monitor",&description,LANDINGMOD_MONITOR,0,3,3,0);
+ _objectState[3] = Object("Tastatur",&description,KEYBOARD,0,4,4,0);
+ _objectState[4] = Object("",&description,LANDINGMOD_WIRE,COMBINABLE,255,255,0);
+ _objectState[5] = Object("Luke",&description,LANDINGMOD_HATCH,EXIT | OPEN | OPENED | COMBINABLE, 0,0,1 | 128,HOLD,10);
+ }
+
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
+
+class ShipGenerator : public Room {
+public:
+ ShipGenerator() {
+ _filenumber = 18;
+ _shown[0] = true;
+ _shown[1] = false;
+ _shown[2] = false;
+ _shown[3] = false;
+ _shown[4] = false;
+ _shown[5] = true;
+
+ _objectState[0] = Object("langes Kabel mit Stecker",&description,GENERATOR_WIRE,COMBINABLE,255,255,0);
+ _objectState[1] = Object("leere Kabelrolle",&description,0,UNNECESSARY,255,255,0);
+ _objectState[2] = Object("Keycard","Hey, das ist die Keycard des Commanders!|Er mu� sie bei dem �berst�rzten|Aufbruch verloren haben.",KEYCARD2,COMBINABLE | TAKE,12,12,5 | 128);
+ _objectState[3] = Object("Seil",&description,GENERATOR_ROPE,COMBINABLE,255,255,0);
+ _objectState[4] = Object("Luke","Sie f�hrt nach drau�en.",OUTERHATCH,EXIT | OPEN,1,2,1,OUTSIDE,22);
+ _objectState[5] = Object("Luke",&description,0,OPEN | CLOSED,3,3,0);
+ _objectState[6] = Object("Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,4,4,0);
+ _objectState[7] = Object("Klappe",&description,TRAP,OPEN,5,6,2);
+ _objectState[8] = Object("Leitung",&description,0,0,7,7,0);
+ _objectState[9] = Object("Spannungmessger�t",&description,VOLTMETER,0,9,9,0);
+ _objectState[10] = Object("Klemme",&description,CLIP,COMBINABLE,8,8,0);
+ _objectState[11] = Object("Leitung","Sie f�hrt vom Generator zum Spannungmessger�t.",SHORT_WIRE,COMBINABLE,10,10,0);
+ _objectState[12] = Object("Leiter",&description,LADDER,EXIT,0,0,0,HOLD,1);
+ }
+
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
+
+class ShipOuterSpace : public Room {
+public:
+ ShipOuterSpace() {
+ _filenumber = 4;
+ _shown[0] = true;
+
+ _objectState[0] = Object("Luke",&description,0,EXIT,0,0,0,GENERATOR,3);
+ _objectState[1] = Object("Seil",&description,0,UNNECESSARY,255,255,0);
+ }
+};
+
+// Arsano
+
+// Axacuss
+
+
}
#endif // ROOMS_H
Commit: ad7184b379ea1856ce926ded175c99d2e6112779
https://github.com/scummvm/scummvm/commit/ad7184b379ea1856ce926ded175c99d2e6112779
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T22:59:48Z
Commit Message:
SUPERNOVA: Moves Object Class from rooms.h to msn_def.h
Changed paths:
engines/supernova/msn_def.h
engines/supernova/rooms.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 3bdbb18..b9253b1 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -352,6 +352,52 @@ const byte font[][5] = {
0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
+
+
+
+static ObjectType operator|(ObjectType a, ObjectType b) {
+ return ObjectType(+a | +b);
+}
+
+struct Object {
+ static const char *const defaultDescription;
+
+ Object()
+ : _name("")
+ , _description(Object::defaultDescription)
+ , _id(NULLOBJECT)
+ , _type(NULLTYPE)
+ , _click(0)
+ , _click2(0)
+ , _section(0)
+ , _exitRoom(NULLROOM)
+ , _direction(0)
+ {}
+ Object(const char *name, const char *description, ObjectID id, ObjectType type,
+ byte click, byte click2, byte section = 0, RoomID exitRoom = NULLROOM, byte direction = 0)
+ : _name(name)
+ , _description(description)
+ , _id(id)
+ , _type(type)
+ , _click(click)
+ , _click2(click2)
+ , _section(section)
+ , _exitRoom(exitRoom)
+ , _direction(direction)
+ {}
+
+ const char *_name;
+ const char *_description;
+ ObjectID _id;
+ ObjectType _type;
+ byte _click;
+ byte _click2;
+ byte _section;
+ RoomID _exitRoom;
+ byte _direction;
+};
+
+
}
#endif // MSN_DEF_H
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index f52412a..8ef8cd3 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -7,53 +7,6 @@
namespace Supernova {
-ObjectType operator|(ObjectType a, ObjectType b) {
- return ObjectType(+a | +b);
-}
-
-struct Object {
- static const char *const defaultDescription;
-
- Object();
- Object(const char *name, const char *description, ObjectID id, ObjectType type, byte click,
- byte click2, byte section = 0, RoomID exitRoom = NULLROOM, byte direction = 0);
-
- const char *_name;
- const char *_description;
- ObjectID _id;
- ObjectType _type;
- byte _click;
- byte _click2;
- byte _section;
- RoomID _exitRoom;
- byte _direction;
-};
-
-Object::Object()
- : _name("")
- , _description(Object::defaultDescription)
- , _id(NULLOBJECT)
- , _type(NULLTYPE)
- , _click(0)
- , _click2(0)
- , _section(0)
- , _exitRoom(NULLROOM)
- , _direction(0)
-{}
-
-Object::Object(const char *name, const char *description, ObjectID id, ObjectType type,
- byte click, byte click2, byte section, RoomID exitRoom, byte direction)
- : _name(name)
- , _description(description)
- , _id(id)
- , _type(type)
- , _click(click)
- , _click2(click2)
- , _section(section)
- , _exitRoom(exitRoom)
- , _direction(direction)
-{}
-
class Room {
public:
Room() {
Commit: 87287de83bbf26b2fc63269f96f578bd44992540
https://github.com/scummvm/scummvm/commit/87287de83bbf26b2fc63269f96f578bd44992540
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T22:59:48Z
Commit Message:
SUPERNOVA: Adds color palette constants
Changed paths:
engines/supernova/msn_def.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index b9253b1..cbac52e 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -17,7 +17,7 @@ const int kRoomsChap0 = 1;
const int kRoomsChap1 = 16;
const int kRoomsChap2 = 9;
const int kRoomsChap3 = 21;
-
+const int kRoomsNum = kRoomsChap0 + kRoomsChap1 + kRoomsChap2 + kRoomsChap3;
enum ObjectType {
NULLTYPE = 0,
@@ -115,35 +115,52 @@ enum MessagePosition {
};
// Colors
-#define HGR_BEF 1
-#define COL_BEF 5
-#define HGR_BEF_HELL 3
-#define COL_BEF_HELL 6
+const int kColorBlack = 0;
+const int kColorWhite25 = 1;
+const int kColorWhite35 = 2;
+const int kColorWhite44 = 3;
+const int kColorWhite99 = 4;
+const int kColorDarkGreen = 5;
+const int kColorGreen = 6;
+const int kColorDarkRed = 7;
+const int kColorRed = 8;
+const int kColorDarkBlue = 9;
+const int kColorBlue = 10;
+const int kColorWhite63 = 11;
+const int kColorLightBlue = 12;
+const int kColorLightGreen = 13;
+const int kColorLightYellow = 14;
+const int kColorLightRed = 15;
+
+#define HGR_BEF kColorWhite25
+#define COL_BEF kColorDarkGreen
+#define HGR_BEF_HELL kColorWhite44
+#define COL_BEF_HELL kColorGreen
-#define HGR_INV 1
-#define COL_INV 7
-#define HGR_INV_HELL 2
-#define COL_INV_HELL 8
+#define HGR_INV kColorWhite25
+#define COL_INV kColorDarkRed
+#define HGR_INV_HELL kColorWhite35
+#define COL_INV_HELL kColorRed
-#define HGR_BEF_ANZ 1
-#define COL_BEF_ANZ 5
+#define HGR_BEF_ANZ kColorWhite25
+#define COL_BEF_ANZ kColorDarkGreen
-#define HGR_AUSG 1
-#define COL_AUSG 7
+#define HGR_AUSG kColorWhite25
+#define COL_AUSG kColorDarkRed
-#define HGR_MELD 2
-#define COL_MELD 4
+#define HGR_MELD kColorWhite35
+#define COL_MELD kColorWhite99
-#define COL_LWIN 7
-#define HGR_LADEN 10
-#define COL_LADEN 4
-#define HGR_LADEN2 9
-#define COL_LADEN2 11
-#define HGR_NAME 9
-#define COL_NAME 15
+#define COL_LWIN kColorDarkRed
+#define HGR_LADEN kColorBlue
+#define COL_LADEN kColorWhite99
+#define HGR_LADEN2 kColorDarkBlue
+#define COL_LADEN2 kColorWhite63
+#define HGR_NAME kColorDarkBlue
+#define COL_NAME kColorLightRed
-#define HGR_EDIT 9
-#define COL_EDIT 4
+#define HGR_EDIT kcolorDarkBlue
+#define COL_EDIT kColorWhite99
const byte mouseNormal[64] = {
Commit: 51df751e449a38f2dc16ba5b39d487dead35e39f
https://github.com/scummvm/scummvm/commit/51df751e449a38f2dc16ba5b39d487dead35e39f
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T22:59:48Z
Commit Message:
SUPERNOVA: Removes ORing ObjectTypes from msn_def.h
The reason for the removal is because of gcc warnings when the operator
is not used in a translation unit that includes msn_def.h.
Currently I also see it used in the game logic anyway so there's no need
for it to be defined in a ubiquitiously used header file like msn_def.h
Changed paths:
engines/supernova/msn_def.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index cbac52e..83755e7 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -371,11 +371,6 @@ const byte font[][5] = {
};
-
-static ObjectType operator|(ObjectType a, ObjectType b) {
- return ObjectType(+a | +b);
-}
-
struct Object {
static const char *const defaultDescription;
Commit: 6538a6386bf77a95ccabb5f25c664e21d985b11c
https://github.com/scummvm/scummvm/commit/6538a6386bf77a95ccabb5f25c664e21d985b11c
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T22:59:48Z
Commit Message:
SUPERNOVA: Refactoring
Changed paths:
engines/supernova/msn_def.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 83755e7..1b854f0 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -53,9 +53,9 @@ enum RoomID {
INTRO,CORRIDOR,HALL,SLEEP,COCKPIT,AIRLOCK,
HOLD,LANDINGMODULE,GENERATOR,OUTSIDE,
CABIN_R1,CABIN_R2,CABIN_R3,CABIN_L1,CABIN_L3,CABIN_L2,BATHROOM,
-
+
ROCKS,CAVE,MEETUP,ENTRANCE,REST,ROGER,GLIDER,MEETUP2,MEETUP3,
-
+
CELL,CORRIDOR1,CORRIDOR2,CORRIDOR3,CORRIDOR4,CORRIDOR5,CORRIDOR6,CORRIDOR7,CORRIDOR8,CORRIDOR9,
BCORRIDOR,GUARD,GUARD3,OFFICE_L1,OFFICE_L2,OFFICE_R1,OFFICE_R2,OFFICE_L,
ELEVATOR,STATION,SIGN,NULLROOM
@@ -85,7 +85,7 @@ enum ObjectID {
RECORD,TURNTABLE,TURNTABLE_BUTTON,WIRE,WIRE2,PLUG,
PEN,
BATHROOM_DOOR,BATHROOM_EXIT,SHOWER,TOILET,
-
+
STONE,
SPACESHIPS,SPACESHIP,STAR,DOOR,MEETUP_SIGN,
PORTER,BATHROOM_BUTTON,BATHROOM_SIGN,KITCHEN_SIGN,CAR_SLOT,
@@ -95,14 +95,14 @@ enum ObjectID {
GLIDER_BUTTON1,GLIDER_BUTTON2,GLIDER_BUTTON3,GLIDER_BUTTON4,GLIDER_SLOT,GLIDER_BUTTONS,
GLIDER_DISPLAY,GLIDER_INSTRUMENTS,GLIDER_KEYCARD,
UFO,
-
+
CELL_BUTTON,CELL_TABLE,CELL_WIRE,TRAY,CELL_DOOR,MAGNET,
NEWSPAPER,TABLE,
PILLAR1,PILLAR2,DOOR1,DOOR2,DOOR3,DOOR4,
GUARDIAN,LAMP,
MASTERKEYCARD,PAINTING,MONEY,LOCKER,LETTER,
JUNGLE,SLOT,STATION_SIGN,
-
+
TICKETS
};
@@ -164,211 +164,211 @@ const int kColorLightRed = 15;
const byte mouseNormal[64] = {
- 0xff,0x3f,0xff,0x1f,0xff,0x0f,0xff,0x07,
- 0xff,0x03,0xff,0x01,0xff,0x00,0x7f,0x00,
- 0x3f,0x00,0x1f,0x00,0x0f,0x00,0x0f,0x00,
- 0xff,0x00,0x7f,0x18,0x7f,0x38,0x7f,0xfc,
-
- 0x00,0x00,0x00,0x40,0x00,0x60,0x00,0x70,
- 0x00,0x78,0x00,0x7c,0x00,0x7e,0x00,0x7f,
- 0x80,0x7f,0xc0,0x7f,0xe0,0x7f,0x00,0x7e,
- 0x00,0x66,0x00,0x43,0x00,0x03,0x00,0x00
+ 0xff,0x3f,0xff,0x1f,0xff,0x0f,0xff,0x07,
+ 0xff,0x03,0xff,0x01,0xff,0x00,0x7f,0x00,
+ 0x3f,0x00,0x1f,0x00,0x0f,0x00,0x0f,0x00,
+ 0xff,0x00,0x7f,0x18,0x7f,0x38,0x7f,0xfc,
+
+ 0x00,0x00,0x00,0x40,0x00,0x60,0x00,0x70,
+ 0x00,0x78,0x00,0x7c,0x00,0x7e,0x00,0x7f,
+ 0x80,0x7f,0xc0,0x7f,0xe0,0x7f,0x00,0x7e,
+ 0x00,0x66,0x00,0x43,0x00,0x03,0x00,0x00
};
const byte mouseWait[64] = {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,
- 0x01,0x80,0x01,0x80,0x11,0x88,0x31,0x8c,
- 0x31,0x8c,0x11,0x88,0x01,0x80,0x01,0x80,
- 0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
-
- 0x00,0x00,0xfe,0x7f,0xf4,0x2f,0xf4,0x2f,
- 0x14,0x28,0x24,0x24,0x44,0x22,0x84,0x21,
- 0x84,0x21,0xc4,0x23,0xe4,0x27,0x74,0x2e,
- 0x34,0x2c,0x14,0x28,0xfe,0x7f,0x00,0x00
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,
+ 0x01,0x80,0x01,0x80,0x11,0x88,0x31,0x8c,
+ 0x31,0x8c,0x11,0x88,0x01,0x80,0x01,0x80,
+ 0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0xfe,0x7f,0xf4,0x2f,0xf4,0x2f,
+ 0x14,0x28,0x24,0x24,0x44,0x22,0x84,0x21,
+ 0x84,0x21,0xc4,0x23,0xe4,0x27,0x74,0x2e,
+ 0x34,0x2c,0x14,0x28,0xfe,0x7f,0x00,0x00
};
const byte font[][5] = {
- {0x00,0x00,0x00,0xff,0x00},
- {0x5f,0xff,0x00,0x00,0x00},
- {0x03,0x00,0x03,0xff,0x00},
- {0x14,0x7f,0x14,0x7f,0x14},
- {0x24,0x2a,0x7f,0x2a,0x12},
- {0x61,0x10,0x08,0x04,0x43},
- {0x38,0x4e,0x59,0x26,0x50},
- {0x03,0xff,0x00,0x00,0x00},
- {0x3e,0x41,0xff,0x00,0x00},
- {0x41,0x3e,0xff,0x00,0x00},
- {0x10,0x54,0x38,0x54,0x10},
- {0x10,0x10,0x7c,0x10,0x10},
- {0x80,0x40,0xff,0x00,0x00},
- {0x10,0x10,0x10,0x10,0x10},
- {0x40,0xff,0x00,0x00,0x00},
- {0x60,0x10,0x08,0x04,0x03},
-
- {0x3e,0x41,0x41,0x41,0x3e}, /* digits */
- {0x04,0x02,0x7f,0xff,0x00},
- {0x42,0x61,0x51,0x49,0x46},
- {0x22,0x41,0x49,0x49,0x36},
- {0x18,0x14,0x12,0x7f,0x10},
- {0x27,0x45,0x45,0x45,0x39},
- {0x3e,0x49,0x49,0x49,0x32},
- {0x01,0x61,0x19,0x07,0x01},
- {0x36,0x49,0x49,0x49,0x36},
- {0x26,0x49,0x49,0x49,0x3e},
-
- {0x44,0xff,0x00,0x00,0x00},
- {0x80,0x44,0xff,0x00,0x00},
- {0x10,0x28,0x44,0xff,0x00},
- {0x28,0x28,0x28,0x28,0x28},
- {0x44,0x28,0x10,0xff,0x00},
- {0x02,0x01,0x51,0x09,0x06},
- {0x3e,0x41,0x5d,0x5d,0x1e},
-
- {0x7c,0x12,0x11,0x12,0x7c}, /* uppercase letters*/
- {0x7f,0x49,0x49,0x49,0x36},
- {0x3e,0x41,0x41,0x41,0x22},
- {0x7f,0x41,0x41,0x22,0x1c},
- {0x7f,0x49,0x49,0x49,0xff},
- {0x7f,0x09,0x09,0x09,0xff},
- {0x3e,0x41,0x41,0x49,0x3a},
- {0x7f,0x08,0x08,0x08,0x7f},
- {0x41,0x7f,0x41,0xff,0x00},
- {0x20,0x40,0x40,0x3f,0xff},
- {0x7f,0x08,0x14,0x22,0x41},
- {0x7f,0x40,0x40,0x40,0xff},
- {0x7f,0x02,0x04,0x02,0x7f},
- {0x7f,0x02,0x0c,0x10,0x7f},
- {0x3e,0x41,0x41,0x41,0x3e},
- {0x7f,0x09,0x09,0x09,0x06},
- {0x3e,0x41,0x51,0x21,0x5e},
- {0x7f,0x09,0x19,0x29,0x46},
- {0x26,0x49,0x49,0x49,0x32},
- {0x01,0x01,0x7f,0x01,0x01},
- {0x3f,0x40,0x40,0x40,0x3f},
- {0x07,0x18,0x60,0x18,0x07},
- {0x1f,0x60,0x18,0x60,0x1f},
- {0x63,0x14,0x08,0x14,0x63},
- {0x03,0x04,0x78,0x04,0x03},
- {0x61,0x51,0x49,0x45,0x43},
-
- {0x7f,0x41,0x41,0xff,0x00},
- {0x03,0x04,0x08,0x10,0x60},
- {0x41,0x41,0x7f,0xff,0x00},
- {0x02,0x01,0x02,0xff,0x00},
- {0x80,0x80,0x80,0x80,0x80},
- {0x01,0x02,0xff,0x00,0x00},
-
- {0x38,0x44,0x44,0x44,0x7c}, /* lowercase letters */
- {0x7f,0x44,0x44,0x44,0x38},
- {0x38,0x44,0x44,0x44,0x44},
- {0x38,0x44,0x44,0x44,0x7f},
- {0x38,0x54,0x54,0x54,0x58},
- {0x04,0x7e,0x05,0x01,0xff},
- {0x98,0xa4,0xa4,0xa4,0x7c},
- {0x7f,0x04,0x04,0x04,0x78},
- {0x7d,0xff,0x00,0x00,0x00},
- {0x80,0x80,0x7d,0xff,0x00},
- {0x7f,0x10,0x28,0x44,0xff},
- {0x7f,0xff,0x00,0x00,0x00},
- {0x7c,0x04,0x7c,0x04,0x78},
- {0x7c,0x04,0x04,0x04,0x78},
- {0x38,0x44,0x44,0x44,0x38},
- {0xfc,0x24,0x24,0x24,0x18},
- {0x18,0x24,0x24,0x24,0xfc},
- {0x7c,0x08,0x04,0x04,0xff},
- {0x48,0x54,0x54,0x54,0x24},
- {0x04,0x3e,0x44,0x40,0xff},
- {0x7c,0x40,0x40,0x40,0x3c},
- {0x0c,0x30,0x40,0x30,0x0c},
- {0x3c,0x40,0x3c,0x40,0x3c},
- {0x44,0x28,0x10,0x28,0x44},
- {0x9c,0xa0,0xa0,0xa0,0x7c},
- {0x44,0x64,0x54,0x4c,0x44},
-
- {0x08,0x36,0x41,0xff,0x00},
- {0x77,0xff,0x00,0x00,0x00},
- {0x41,0x36,0x08,0xff,0x00},
- {0x02,0x01,0x02,0x01,0xff},
- {0xff,0x00,0x00,0x00,0x00},
-
- {0xfe,0x49,0x49,0x4e,0x30}, /* sharp S */
-
- {0x7c,0x41,0x40,0x41,0x3c}, /* umlauts */
-
- {0x04,0x06,0x7f,0x06,0x04}, /* arrows */
- {0x20,0x60,0xfe,0x60,0x20},
-
- {0x38,0x45,0x44,0x45,0x7c}, /* umlauts */
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0x79,0x14,0x12,0x14,0x79},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0x38,0x45,0x44,0x45,0x38},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0x3d,0x42,0x42,0x42,0x3d},
- {0x3d,0x40,0x40,0x40,0x3d},
+ {0x00,0x00,0x00,0xff,0x00},
+ {0x5f,0xff,0x00,0x00,0x00},
+ {0x03,0x00,0x03,0xff,0x00},
+ {0x14,0x7f,0x14,0x7f,0x14},
+ {0x24,0x2a,0x7f,0x2a,0x12},
+ {0x61,0x10,0x08,0x04,0x43},
+ {0x38,0x4e,0x59,0x26,0x50},
+ {0x03,0xff,0x00,0x00,0x00},
+ {0x3e,0x41,0xff,0x00,0x00},
+ {0x41,0x3e,0xff,0x00,0x00},
+ {0x10,0x54,0x38,0x54,0x10},
+ {0x10,0x10,0x7c,0x10,0x10},
+ {0x80,0x40,0xff,0x00,0x00},
+ {0x10,0x10,0x10,0x10,0x10},
+ {0x40,0xff,0x00,0x00,0x00},
+ {0x60,0x10,0x08,0x04,0x03},
+
+ {0x3e,0x41,0x41,0x41,0x3e}, /* digits */
+ {0x04,0x02,0x7f,0xff,0x00},
+ {0x42,0x61,0x51,0x49,0x46},
+ {0x22,0x41,0x49,0x49,0x36},
+ {0x18,0x14,0x12,0x7f,0x10},
+ {0x27,0x45,0x45,0x45,0x39},
+ {0x3e,0x49,0x49,0x49,0x32},
+ {0x01,0x61,0x19,0x07,0x01},
+ {0x36,0x49,0x49,0x49,0x36},
+ {0x26,0x49,0x49,0x49,0x3e},
+
+ {0x44,0xff,0x00,0x00,0x00},
+ {0x80,0x44,0xff,0x00,0x00},
+ {0x10,0x28,0x44,0xff,0x00},
+ {0x28,0x28,0x28,0x28,0x28},
+ {0x44,0x28,0x10,0xff,0x00},
+ {0x02,0x01,0x51,0x09,0x06},
+ {0x3e,0x41,0x5d,0x5d,0x1e},
+
+ {0x7c,0x12,0x11,0x12,0x7c}, /* uppercase letters*/
+ {0x7f,0x49,0x49,0x49,0x36},
+ {0x3e,0x41,0x41,0x41,0x22},
+ {0x7f,0x41,0x41,0x22,0x1c},
+ {0x7f,0x49,0x49,0x49,0xff},
+ {0x7f,0x09,0x09,0x09,0xff},
+ {0x3e,0x41,0x41,0x49,0x3a},
+ {0x7f,0x08,0x08,0x08,0x7f},
+ {0x41,0x7f,0x41,0xff,0x00},
+ {0x20,0x40,0x40,0x3f,0xff},
+ {0x7f,0x08,0x14,0x22,0x41},
+ {0x7f,0x40,0x40,0x40,0xff},
+ {0x7f,0x02,0x04,0x02,0x7f},
+ {0x7f,0x02,0x0c,0x10,0x7f},
+ {0x3e,0x41,0x41,0x41,0x3e},
+ {0x7f,0x09,0x09,0x09,0x06},
+ {0x3e,0x41,0x51,0x21,0x5e},
+ {0x7f,0x09,0x19,0x29,0x46},
+ {0x26,0x49,0x49,0x49,0x32},
+ {0x01,0x01,0x7f,0x01,0x01},
+ {0x3f,0x40,0x40,0x40,0x3f},
+ {0x07,0x18,0x60,0x18,0x07},
+ {0x1f,0x60,0x18,0x60,0x1f},
+ {0x63,0x14,0x08,0x14,0x63},
+ {0x03,0x04,0x78,0x04,0x03},
+ {0x61,0x51,0x49,0x45,0x43},
+
+ {0x7f,0x41,0x41,0xff,0x00},
+ {0x03,0x04,0x08,0x10,0x60},
+ {0x41,0x41,0x7f,0xff,0x00},
+ {0x02,0x01,0x02,0xff,0x00},
+ {0x80,0x80,0x80,0x80,0x80},
+ {0x01,0x02,0xff,0x00,0x00},
+
+ {0x38,0x44,0x44,0x44,0x7c}, /* lowercase letters */
+ {0x7f,0x44,0x44,0x44,0x38},
+ {0x38,0x44,0x44,0x44,0x44},
+ {0x38,0x44,0x44,0x44,0x7f},
+ {0x38,0x54,0x54,0x54,0x58},
+ {0x04,0x7e,0x05,0x01,0xff},
+ {0x98,0xa4,0xa4,0xa4,0x7c},
+ {0x7f,0x04,0x04,0x04,0x78},
+ {0x7d,0xff,0x00,0x00,0x00},
+ {0x80,0x80,0x7d,0xff,0x00},
+ {0x7f,0x10,0x28,0x44,0xff},
+ {0x7f,0xff,0x00,0x00,0x00},
+ {0x7c,0x04,0x7c,0x04,0x78},
+ {0x7c,0x04,0x04,0x04,0x78},
+ {0x38,0x44,0x44,0x44,0x38},
+ {0xfc,0x24,0x24,0x24,0x18},
+ {0x18,0x24,0x24,0x24,0xfc},
+ {0x7c,0x08,0x04,0x04,0xff},
+ {0x48,0x54,0x54,0x54,0x24},
+ {0x04,0x3e,0x44,0x40,0xff},
+ {0x7c,0x40,0x40,0x40,0x3c},
+ {0x0c,0x30,0x40,0x30,0x0c},
+ {0x3c,0x40,0x3c,0x40,0x3c},
+ {0x44,0x28,0x10,0x28,0x44},
+ {0x9c,0xa0,0xa0,0xa0,0x7c},
+ {0x44,0x64,0x54,0x4c,0x44},
+
+ {0x08,0x36,0x41,0xff,0x00},
+ {0x77,0xff,0x00,0x00,0x00},
+ {0x41,0x36,0x08,0xff,0x00},
+ {0x02,0x01,0x02,0x01,0xff},
+ {0xff,0x00,0x00,0x00,0x00},
+
+ {0xfe,0x49,0x49,0x4e,0x30}, /* sharp S */
+
+ {0x7c,0x41,0x40,0x41,0x3c}, /* umlauts */
+
+ {0x04,0x06,0x7f,0x06,0x04}, /* arrows */
+ {0x20,0x60,0xfe,0x60,0x20},
+
+ {0x38,0x45,0x44,0x45,0x7c}, /* umlauts */
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0x79,0x14,0x12,0x14,0x79},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0x38,0x45,0x44,0x45,0x38},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0x3d,0x42,0x42,0x42,0x3d},
+ {0x3d,0x40,0x40,0x40,0x3d},
};
- // Default palette
- const byte initVGAPalette[768] = {
- 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x58, 0x58, 0x58, 0x70, 0x70, 0x70, 0xfc, 0xfc, 0xfc, 0x00, 0xd0, 0x00,
- 0x00, 0xfc, 0x00, 0xd8, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xb0, 0xa0, 0xa0, 0xa0,
- 0x50, 0xc8, 0xfc, 0x28, 0xfc, 0x28, 0xf0, 0xf0, 0x00, 0xfc, 0x28, 0x28, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14,
- 0x20, 0x20, 0x20, 0x2c, 0x2c, 0x2c, 0x38, 0x38, 0x38, 0x44, 0x44, 0x44, 0x50, 0x50, 0x50, 0x60, 0x60, 0x60,
- 0x70, 0x70, 0x70, 0x80, 0x80, 0x80, 0x90, 0x90, 0x90, 0xa0, 0xa0, 0xa0, 0xb4, 0xb4, 0xb4, 0xc8, 0xc8, 0xc8,
- 0xe0, 0xe0, 0xe0, 0xfc, 0xfc, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00, 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc,
- 0xfc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc, 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00,
- 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc, 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x00,
- 0x00, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00, 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc,
- 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c, 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc,
- 0xfc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc, 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c,
- 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc, 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0x7c,
- 0x7c, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c, 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc,
- 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4, 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc,
- 0xfc, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc, 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4,
- 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc, 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0xb4,
- 0xb4, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4, 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc,
- 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70,
- 0x70, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70, 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x00, 0x00, 0x70, 0x1c, 0x00,
- 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70, 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x00,
- 0x00, 0x70, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70,
- 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38, 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70,
- 0x70, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70, 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38,
- 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70, 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x38,
- 0x38, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38, 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70,
- 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50, 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70,
- 0x70, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70, 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50,
- 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70, 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x50,
- 0x50, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50, 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70,
- 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x00, 0x00, 0x40, 0x10, 0x00, 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40,
- 0x40, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40, 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00,
- 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40, 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x00,
- 0x00, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00, 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40,
- 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20, 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40,
- 0x40, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40, 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20,
- 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40, 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x20,
- 0x20, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20, 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40,
- 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c, 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40,
- 0x40, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40, 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c,
- 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40, 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x2c,
- 0x2c, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c, 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40,
- 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
- };
+// Default palette
+const byte initVGAPalette[768] = {
+ 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x58, 0x58, 0x58, 0x70, 0x70, 0x70, 0xfc, 0xfc, 0xfc, 0x00, 0xd0, 0x00,
+ 0x00, 0xfc, 0x00, 0xd8, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xb0, 0xa0, 0xa0, 0xa0,
+ 0x50, 0xc8, 0xfc, 0x28, 0xfc, 0x28, 0xf0, 0xf0, 0x00, 0xfc, 0x28, 0x28, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14,
+ 0x20, 0x20, 0x20, 0x2c, 0x2c, 0x2c, 0x38, 0x38, 0x38, 0x44, 0x44, 0x44, 0x50, 0x50, 0x50, 0x60, 0x60, 0x60,
+ 0x70, 0x70, 0x70, 0x80, 0x80, 0x80, 0x90, 0x90, 0x90, 0xa0, 0xa0, 0xa0, 0xb4, 0xb4, 0xb4, 0xc8, 0xc8, 0xc8,
+ 0xe0, 0xe0, 0xe0, 0xfc, 0xfc, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00, 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc,
+ 0xfc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc, 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00,
+ 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc, 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x00,
+ 0x00, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00, 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc,
+ 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c, 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc,
+ 0xfc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc, 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c,
+ 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc, 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0x7c,
+ 0x7c, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c, 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc,
+ 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4, 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc,
+ 0xfc, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc, 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4,
+ 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc, 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0xb4,
+ 0xb4, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4, 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc,
+ 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70,
+ 0x70, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70, 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x00, 0x00, 0x70, 0x1c, 0x00,
+ 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70, 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x00,
+ 0x00, 0x70, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70,
+ 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38, 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70,
+ 0x70, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70, 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38,
+ 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70, 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x38,
+ 0x38, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38, 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70,
+ 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50, 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70,
+ 0x70, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70, 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50,
+ 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70, 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x50,
+ 0x50, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50, 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70,
+ 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x00, 0x00, 0x40, 0x10, 0x00, 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40,
+ 0x40, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40, 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00,
+ 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40, 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x00,
+ 0x00, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00, 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40,
+ 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20, 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40,
+ 0x40, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40, 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20,
+ 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40, 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x20,
+ 0x20, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20, 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40,
+ 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c, 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40,
+ 0x40, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40, 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c,
+ 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40, 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x2c,
+ 0x2c, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c, 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40,
+ 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
struct Object {
Commit: f3656ecce98e8fa2bf48eaa9366f53326feec5c1
https://github.com/scummvm/scummvm/commit/f3656ecce98e8fa2bf48eaa9366f53326feec5c1
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:08:31Z
Commit Message:
SUPERNOVA: Adds methods for alterting Object state
Changed paths:
engines/supernova/msn_def.h
engines/supernova/supernova.cpp
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 1b854f0..1bd81dd 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -19,93 +19,6 @@ const int kRoomsChap2 = 9;
const int kRoomsChap3 = 21;
const int kRoomsNum = kRoomsChap0 + kRoomsChap1 + kRoomsChap2 + kRoomsChap3;
-enum ObjectType {
- NULLTYPE = 0,
- TAKE = 1,
- OPEN = 2,
- OPENED = 4,
- CLOSED = 8,
- EXIT = 16,
- PRESS = 32,
- COMBINABLE = 64,
- CARRIED = 128,
- UNNECESSARY = 256,
- WORN = 512,
- TALK = 1024,
- OCCUPIED = 2048,
- CAUGHT = 4096
-};
-
-enum Action {
- ACTION_WALK,
- ACTION_LOOK,
- ACTION_TAKE,
- ACTION_OPEN,
- ACTION_CLOSE,
- ACTION_PRESS,
- ACTION_PULL,
- ACTION_USE,
- ACTION_TALK,
- ACTION_GIVE
-};
-
-enum RoomID {
- INTRO,CORRIDOR,HALL,SLEEP,COCKPIT,AIRLOCK,
- HOLD,LANDINGMODULE,GENERATOR,OUTSIDE,
- CABIN_R1,CABIN_R2,CABIN_R3,CABIN_L1,CABIN_L3,CABIN_L2,BATHROOM,
-
- ROCKS,CAVE,MEETUP,ENTRANCE,REST,ROGER,GLIDER,MEETUP2,MEETUP3,
-
- CELL,CORRIDOR1,CORRIDOR2,CORRIDOR3,CORRIDOR4,CORRIDOR5,CORRIDOR6,CORRIDOR7,CORRIDOR8,CORRIDOR9,
- BCORRIDOR,GUARD,GUARD3,OFFICE_L1,OFFICE_L2,OFFICE_R1,OFFICE_R2,OFFICE_L,
- ELEVATOR,STATION,SIGN,NULLROOM
-};
-
-enum ObjectID {
- NULLOBJECT,
- KEYCARD,KNIFE,WATCH,
- SOCKET,
- BUTTON,HATCH1,
- BUTTON1,BUTTON2,MANOMETER,SUIT,HELMET,LIFESUPPORT,
- SCRAP_LK,OUTERHATCH_TOP,GENERATOR_TOP,TERMINALSTRIP,LANDINGMOD_OUTERHATCH,
- HOLD_WIRE,
- LANDINGMOD_BUTTON,LANDINGMOD_SOCKET,LANDINGMOD_WIRE,LANDINGMOD_HATCH,LANDINGMOD_MONITOR,
- KEYBOARD,
- KEYCARD2,OUTERHATCH,GENERATOR_WIRE,TRAP,SHORT_WIRE,CLIP,
- VOLTMETER,LADDER,GENERATOR_ROPE,
- KITCHEN_HATCH,SLEEP_SLOT,
- MONITOR,INSTRUMENTS,
- COMPUTER,CABINS,CABIN,
- SLOT_K1,SLOT_K2,SLOT_K3,SLOT_K4,
- SHELF1,SHELF2,SHELF3,SHELF4,
- ROPE,BOOK,DISCMAN,CHESS,
- SLOT_KL1,SLOT_KL2,SLOT_KL3,SLOT_KL4,
- SHELF_L1,SHELF_L2,SHELF_L3,SHELF_L4,
- PISTOL,BOOK2,SPOOL,
- RECORD,TURNTABLE,TURNTABLE_BUTTON,WIRE,WIRE2,PLUG,
- PEN,
- BATHROOM_DOOR,BATHROOM_EXIT,SHOWER,TOILET,
-
- STONE,
- SPACESHIPS,SPACESHIP,STAR,DOOR,MEETUP_SIGN,
- PORTER,BATHROOM_BUTTON,BATHROOM_SIGN,KITCHEN_SIGN,CAR_SLOT,
- ARS_BATHROOM,COINS,SCHNUCK,EGG,PILL,PILL_HULL,STAIRCASE,
- MEETUP_EXIT,
- ROGER_W,WALLET,KEYCARD_R,CUP,
- GLIDER_BUTTON1,GLIDER_BUTTON2,GLIDER_BUTTON3,GLIDER_BUTTON4,GLIDER_SLOT,GLIDER_BUTTONS,
- GLIDER_DISPLAY,GLIDER_INSTRUMENTS,GLIDER_KEYCARD,
- UFO,
-
- CELL_BUTTON,CELL_TABLE,CELL_WIRE,TRAY,CELL_DOOR,MAGNET,
- NEWSPAPER,TABLE,
- PILLAR1,PILLAR2,DOOR1,DOOR2,DOOR3,DOOR4,
- GUARDIAN,LAMP,
- MASTERKEYCARD,PAINTING,MONEY,LOCKER,LETTER,
- JUNGLE,SLOT,STATION_SIGN,
-
- TICKETS
-};
-
enum MessagePosition {
kMessageNormal,
kMessageLeft,
@@ -370,6 +283,97 @@ const byte initVGAPalette[768] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
+enum ObjectType {
+ NULLTYPE = 0,
+ TAKE = 1,
+ OPEN = 2,
+ OPENED = 4,
+ CLOSED = 8,
+ EXIT = 16,
+ PRESS = 32,
+ COMBINABLE = 64,
+ CARRIED = 128,
+ UNNECESSARY = 256,
+ WORN = 512,
+ TALK = 1024,
+ OCCUPIED = 2048,
+ CAUGHT = 4096
+};
+
+enum Action {
+ ACTION_WALK,
+ ACTION_LOOK,
+ ACTION_TAKE,
+ ACTION_OPEN,
+ ACTION_CLOSE,
+ ACTION_PRESS,
+ ACTION_PULL,
+ ACTION_USE,
+ ACTION_TALK,
+ ACTION_GIVE
+};
+
+enum RoomID {
+ INTRO,CORRIDOR,HALL,SLEEP,COCKPIT,AIRLOCK,
+ HOLD,LANDINGMODULE,GENERATOR,OUTSIDE,
+ CABIN_R1,CABIN_R2,CABIN_R3,CABIN_L1,CABIN_L3,CABIN_L2,BATHROOM,
+
+ ROCKS,CAVE,MEETUP,ENTRANCE,REST,ROGER,GLIDER,MEETUP2,MEETUP3,
+
+ CELL,CORRIDOR1,CORRIDOR2,CORRIDOR3,CORRIDOR4,CORRIDOR5,CORRIDOR6,CORRIDOR7,CORRIDOR8,CORRIDOR9,
+ BCORRIDOR,GUARD,GUARD3,OFFICE_L1,OFFICE_L2,OFFICE_R1,OFFICE_R2,OFFICE_L,
+ ELEVATOR,STATION,SIGN,NULLROOM
+};
+
+enum ObjectID {
+ NULLOBJECT,
+ KEYCARD,KNIFE,WATCH,
+ SOCKET,
+ BUTTON,HATCH1,
+ BUTTON1,BUTTON2,MANOMETER,SUIT,HELMET,LIFESUPPORT,
+ SCRAP_LK,OUTERHATCH_TOP,GENERATOR_TOP,TERMINALSTRIP,LANDINGMOD_OUTERHATCH,
+ HOLD_WIRE,
+ LANDINGMOD_BUTTON,LANDINGMOD_SOCKET,LANDINGMOD_WIRE,LANDINGMOD_HATCH,LANDINGMOD_MONITOR,
+ KEYBOARD,
+ KEYCARD2,OUTERHATCH,GENERATOR_WIRE,TRAP,SHORT_WIRE,CLIP,
+ VOLTMETER,LADDER,GENERATOR_ROPE,
+ KITCHEN_HATCH,SLEEP_SLOT,
+ MONITOR,INSTRUMENTS,
+ COMPUTER,CABINS,CABIN,
+ SLOT_K1,SLOT_K2,SLOT_K3,SLOT_K4,
+ SHELF1,SHELF2,SHELF3,SHELF4,
+ ROPE,BOOK,DISCMAN,CHESS,
+ SLOT_KL1,SLOT_KL2,SLOT_KL3,SLOT_KL4,
+ SHELF_L1,SHELF_L2,SHELF_L3,SHELF_L4,
+ PISTOL,BOOK2,SPOOL,
+ RECORD,TURNTABLE,TURNTABLE_BUTTON,WIRE,WIRE2,PLUG,
+ PEN,
+ BATHROOM_DOOR,BATHROOM_EXIT,SHOWER,TOILET,
+
+ STONE,
+ SPACESHIPS,SPACESHIP,STAR,DOOR,MEETUP_SIGN,
+ PORTER,BATHROOM_BUTTON,BATHROOM_SIGN,KITCHEN_SIGN,CAR_SLOT,
+ ARS_BATHROOM,COINS,SCHNUCK,EGG,PILL,PILL_HULL,STAIRCASE,
+ MEETUP_EXIT,
+ ROGER_W,WALLET,KEYCARD_R,CUP,
+ GLIDER_BUTTON1,GLIDER_BUTTON2,GLIDER_BUTTON3,GLIDER_BUTTON4,GLIDER_SLOT,GLIDER_BUTTONS,
+ GLIDER_DISPLAY,GLIDER_INSTRUMENTS,GLIDER_KEYCARD,
+ UFO,
+
+ CELL_BUTTON,CELL_TABLE,CELL_WIRE,TRAY,CELL_DOOR,MAGNET,
+ NEWSPAPER,TABLE,
+ PILLAR1,PILLAR2,DOOR1,DOOR2,DOOR3,DOOR4,
+ GUARDIAN,LAMP,
+ MASTERKEYCARD,PAINTING,MONEY,LOCKER,LETTER,
+ JUNGLE,SLOT,STATION_SIGN,
+
+ TICKETS
+};
+
+ObjectType operator|(ObjectType a, ObjectType b);
+ObjectType operator^(ObjectType a, ObjectType b);
+ObjectType &operator|=(ObjectType &a, ObjectType b);
+ObjectType &operator^=(ObjectType &a, ObjectType b);
struct Object {
static const char *const defaultDescription;
@@ -398,6 +402,14 @@ struct Object {
, _direction(direction)
{}
+ void setProperty(ObjectType type) {
+ _type |= type;
+ }
+
+ void disableProperty(ObjectType type) {
+ _type ^= type;
+ }
+
const char *_name;
const char *_description;
ObjectID _id;
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 602f69f..47c782d 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -42,6 +42,24 @@
namespace Supernova {
+const char *const Object::defaultDescription = "Es ist nichts Besonderes daran.";
+
+ObjectType operator|(ObjectType a, ObjectType b) {
+ return static_cast<ObjectType>(+a | +b);
+}
+
+ObjectType operator^(ObjectType a, ObjectType b) {
+ return static_cast<ObjectType>(+a ^ +b);
+}
+
+ObjectType &operator|=(ObjectType &a, ObjectType b) {
+ return a = a | b;
+}
+
+ObjectType &operator^=(ObjectType &a, ObjectType b) {
+ return a = a ^ b;
+}
+
SupernovaEngine::SupernovaEngine(OSystem *syst)
: Engine(syst)
, _console(NULL)
Commit: 42af582e4cf2e34cced7551b8f216d8fbc5e2acb
https://github.com/scummvm/scummvm/commit/42af582e4cf2e34cced7551b8f216d8fbc5e2acb
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:08:39Z
Commit Message:
SUPERNOVA: Substitutes magic numbers with symbols
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 47c782d..f5967fb 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -36,7 +36,6 @@
#include "graphics/palette.h"
#include "supernova/supernova.h"
-#include "supernova/msn_def.h"
//#include "supernova/rooms.h"
@@ -61,13 +60,14 @@ ObjectType &operator^=(ObjectType &a, ObjectType b) {
}
SupernovaEngine::SupernovaEngine(OSystem *syst)
- : Engine(syst)
- , _console(NULL)
+ : Engine(syst)
+ , _console(NULL)
, _brightness(255)
, _menuBrightness(255)
, _imageIndex(10)
, _sectionIndex(0)
, _delay(33)
+ , _gameRunning(true)
{
// const Common::FSNode gameDataDir(ConfMan.get("path"));
// SearchMan.addSubDirectoryMatching(gameDataDir, "sound");
@@ -80,7 +80,7 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)
SupernovaEngine::~SupernovaEngine() {
DebugMan.clearAllDebugChannels();
-
+
delete _rnd;
delete _console;
}
@@ -94,16 +94,17 @@ Common::Error SupernovaEngine::run() {
initPalette();
paletteFadeIn();
- _gameRunning = true;
+ CursorMan.showMouse(true);
+
while (_gameRunning) {
updateEvents();
-
+
renderImage(_imageIndex, _sectionIndex);
- renderText(Common::String::format("%u | %u", _imageIndex, _sectionIndex).c_str(), 0, 190, 15);
+ renderText(Common::String::format("%u | %u", _imageIndex, _sectionIndex).c_str(), 0, 190, kColorLightRed);
_system->updateScreen();
_system->delayMillis(_delay);
}
-
+
//deinit timer/sound/..
stopSound();
@@ -112,14 +113,14 @@ Common::Error SupernovaEngine::run() {
void SupernovaEngine::updateEvents() {
Common::Event event;
-
+
while (g_system->getEventManager()->pollEvent(event)) {
switch (event.type) {
case Common::EVENT_QUIT:
case Common::EVENT_RTL:
_gameRunning = false;
break;
-
+
case Common::EVENT_KEYDOWN:
if (event.kbd.keycode == Common::KEYCODE_d && event.kbd.hasFlags(Common::KBD_CTRL)) {
paletteFadeOut();
@@ -134,9 +135,9 @@ void SupernovaEngine::updateEvents() {
_sectionIndex = 0;
++_imageIndex;
if (_imageIndex == 31) {
- renderText("Das Schicksal", 44, 132, 4);
- renderText("des Horst Hummel", 35, 142, 4);
- renderText("Teil 1:", 64, 120, 12);
+ renderText("Das Schicksal", 44, 132, kColorWhite99);
+ renderText("des Horst Hummel", 35, 142, kColorWhite99);
+ renderText("Teil 1:", 64, 120, kColorLightBlue);
}
}
if (event.kbd.keycode == Common::KEYCODE_e) {
@@ -162,7 +163,7 @@ void SupernovaEngine::playSound(int filenumber, int offset) {
if (!file->open(Common::String::format("msn_data.0%2d", filenumber))) {
error("File %s could not be read!", file->getName());
}
-
+
file->seek(offset);
Audio::SeekableAudioStream *audioStream = Audio::makeRawStream(file, 11931, Audio::FLAG_UNSIGNED | Audio::FLAG_LITTLE_ENDIAN);
stopSound();
@@ -179,12 +180,12 @@ void playSoundMod(int filenumber)
if (filenumber != 49 || filenumber != 52) {
error("File not supposed to be played!");
}
-
+
Common::File *file = new Common::File;
if (!file->open(Common::String::format("msn_data.0%2d", filenumber))) {
error("File %s could not be read!", file->getName());
}
-
+
// play Supernova MOD file
}
@@ -193,7 +194,7 @@ void SupernovaEngine::renderImage(int filenumber, int section, bool fullscreen)
if (!file.open(Common::String::format("msn_data.0%2d", filenumber))) {
error("File %s could not be read!", file.getName());
}
-
+
_image.loadStream(file);
_image.loadSection(section);
_system->getPaletteManager()->setPalette(_image.getPalette(), 16, 239);
@@ -203,11 +204,11 @@ void SupernovaEngine::renderImage(int filenumber, int section, bool fullscreen)
} else {
size_t offset = _image._section[section].y1 * 320 + _image._section[section].x1;
_system->copyRectToScreen(static_cast<const byte *>(_image.getSurface()->getPixels()) + offset,
- 320,
- _image._section[section].x1,
- _image._section[section].y1,
- _image._section[section].x2 - _image._section[section].x1,
- _image._section[section].y2 - _image._section[section].y1);
+ 320,
+ _image._section[section].x1,
+ _image._section[section].y1,
+ _image._section[section].x2 - _image._section[section].x1,
+ _image._section[section].y2 - _image._section[section].y1);
}
}
@@ -240,7 +241,7 @@ void SupernovaEngine::renderMessage(char *text, MessagePosition position) {
int x = 0;
int y = 0;
byte textColor = 0;
-
+
while (*p != '\0') {
row[numRows] = p;
++numRows;
@@ -257,7 +258,7 @@ void SupernovaEngine::renderMessage(char *text, MessagePosition position) {
if (rowWidth > rowWidthMax)
rowWidthMax = rowWidth;
}
-
+
switch (position) {
case kMessageNormal:
x = rowWidthMax / 2 - 160;
@@ -265,22 +266,22 @@ void SupernovaEngine::renderMessage(char *text, MessagePosition position) {
break;
case kMessageTop:
x = rowWidthMax / 2 - 160;
- textColor = 14;
+ textColor = kColorLightYellow;
break;
case kMessageCenter:
x = rowWidthMax / 2 - 160;
- textColor = 15;
+ textColor = kColorLightRed;
break;
case kMessageLeft:
x = 3;
- textColor = 14;
+ textColor = kColorLightYellow;
break;
case kMessageRight:
x = 317 - rowWidthMax;
- textColor = 13;
+ textColor = kColorLightGreen;
break;
}
-
+
if (position == kMessageNormal) {
y = 70 - ((numRows * 9) / 2);
} else if (position == kMessageTop) {
@@ -288,17 +289,17 @@ void SupernovaEngine::renderMessage(char *text, MessagePosition position) {
} else {
y = 142;
}
-
+
int message_columns = x - 3;
int message_rows = y - 3;
int message_width = rowWidthMax + 6;
int message_height = numRows * 9 + 5;
- renderBox(message_columns,message_rows,message_width,message_height,HGR_MELD);
+ renderBox(message_columns, message_rows, message_width, message_height, HGR_MELD);
for (size_t i = 0; i < numRows; ++i) {
renderText(row[i], x, y, textColor);
y += 9;
}
-
+
// timer1 = (Common::strnlen(text, BUFSIZ) + 20) * textspeed / 10;
}
@@ -312,7 +313,7 @@ void SupernovaEngine::renderText(const char *text, int x, int y, byte color) {
} else if (c == 225) {
c = 128;
}
-
+
for (size_t i = 0; i < 5; ++i) {
if (font[c - 32][i] == 0xff) {
++cursor;
@@ -340,7 +341,7 @@ void SupernovaEngine::renderBox(int x, int y, int width, int height, byte color)
void SupernovaEngine::paletteBrightness() {
byte palette[768];
-
+
_system->getPaletteManager()->grabPalette(palette, 0, 255);
for (size_t i = 0; i < 48; ++i) {
palette[i] = (initVGAPalette[i] * _menuBrightness) >> 8;
@@ -360,7 +361,7 @@ void SupernovaEngine::paletteBrightness() {
void SupernovaEngine::paletteFadeOut() {
// TODO: scene 0 (newspaper article in intro, mode 0x11)
// needs to be handled differently
-
+
while (_brightness > 20) {
_menuBrightness = _brightness;
paletteBrightness();
@@ -377,7 +378,7 @@ void SupernovaEngine::paletteFadeOut() {
void SupernovaEngine::paletteFadeIn() {
// TODO: scene 0 (newspaper article in intro, mode 0x11)
// needs to be handled differently
-
+
while (_brightness < 235) {
_menuBrightness = _brightness;
paletteBrightness();
Commit: 18ac67f907c82a74ef4a48f310e2d5a2001ebd61
https://github.com/scummvm/scummvm/commit/18ac67f907c82a74ef4a48f310e2d5a2001ebd61
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:08:39Z
Commit Message:
SUPERNOVA: Substitutes magic numbers in Object ctor
Changed paths:
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 8ef8cd3..efbe5b1 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -26,12 +26,12 @@ public:
virtual bool interact(Action verb, Object &obj1, Object &obj2) {
return false;
}
-
+
protected:
int _filenumber;
bool _shown[kMaxSection];
Object _objectState[kMaxObject];
-
+
private:
bool _seen;
};
@@ -41,21 +41,21 @@ class StartingItems : public Room {
public:
StartingItems() {
_filenumber = -1;
-
+
_shown[0] = false;
-
- _objectState[0] =
- Object("Keycard", "Die Keycard fuer deine Schraenke.", KEYCARD,
- TAKE | CARRIED | COMBINABLE, 255, 255, 0, NULLROOM, 0);
- _objectState[1] =
- Object("Taschenmesser", "Es ist nicht mehr das sch�rfste.", KNIFE,
- TAKE | CARRIED | COMBINABLE, 255, 255, 0, NULLROOM, 0);
- _objectState[2] =
- Object("Armbanduhr", Object::defaultDescription, WATCH,
- TAKE | COMBINABLE | CARRIED, 255, 255, 8, NULLROOM, 0);
- _objectState[3] =
- Object("Discman", "Es ist eine \"Mad Monkeys\"-CD darin.", DISCMAN,
- TAKE | COMBINABLE, 255, 255, 0, NULLROOM, 0);
+
+ _objectState[0] =
+ Object("Keycard", "Die Keycard fuer deine Schraenke.", KEYCARD,
+ TAKE | CARRIED | COMBINABLE, 255, 255, 0, NULLROOM, 0);
+ _objectState[1] =
+ Object("Taschenmesser", "Es ist nicht mehr das sch�rfste.", KNIFE,
+ TAKE | CARRIED | COMBINABLE, 255, 255, 0, NULLROOM, 0);
+ _objectState[2] =
+ Object("Armbanduhr", Object::defaultDescription, WATCH,
+ TAKE | COMBINABLE | CARRIED, 255, 255, 8, NULLROOM, 0);
+ _objectState[3] =
+ Object("Discman", "Es ist eine \"Mad Monkeys\"-CD darin.", DISCMAN,
+ TAKE | COMBINABLE, 255, 255, 0, NULLROOM, 0);
}
};
@@ -69,7 +69,7 @@ public:
_shown[2] = false;
_shown[3] = false;
_shown[4] = true;
-
+
_objectState[0] = Object("Luke", Object::defaultDescription, HATCH1, OPEN | EXIT, 0, 6, 1, CABIN_L1, 15);
_objectState[1] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPEN | EXIT, 1, 7, 2, CABIN_L2, 10);
_objectState[2] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPEN | EXIT, 2, 8, 3, CABIN_L3, 5);
@@ -90,7 +90,7 @@ public:
ShipHall() {
_filenumber = 15;
_shown[0] = true;
-
+
_objectState[0] = Object("Luke", "Sie f�hrt ins Cockpit.", NULLOBJECT, OPEN | EXIT, 4, 5, 1, COCKPIT, 10);
_objectState[1] = Object("Luke", "Sie f�hrt zur K�che.", KITCHEN_HATCH, OPEN | EXIT, 0, 0, 0, NULLROOM, 1);
_objectState[2] = Object("Luke", "Sie f�hrt zu den Tiefschlafkammern.", NULLOBJECT, OPEN | CLOSED | EXIT, 1, 1, 2, SLEEP, 8);
@@ -98,7 +98,7 @@ public:
_objectState[4] = Object("Leiter", Object::defaultDescription, NULLOBJECT, NULLTYPE, 3, SLEEP, 0, NULLROOM, 0);
_objectState[5] = Object("Gang", Object::defaultDescription, NULLOBJECT, EXIT, 6, 6, 0, CORRIDOR, 1);
}
-
+
virtual bool interact(Action verb, Object &obj1, Object &obj2);
};
@@ -107,13 +107,13 @@ public:
ShipSleepCabin() {
_filenumber = 33;
_shown[0] = true;
-
+
_objectState[0] = Object("Luke", "Dies ist eine der Tiefschlafkammern.", CABINS, NULLTYPE, 0, 0, 0, NULLROOM, 0);
_objectState[1] = Object("Luke", "Dies ist eine der Tiefschlafkammern.", CABIN, NULLTYPE, 1, 1, 0, NULLROOM, 0);
_objectState[2] = Object("Computer", Object::defaultDescription, COMPUTER, NULLTYPE, 2, 2, 0, NULLROOM, 0);
_objectState[3] = Object("Ausgang", Object::defaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL, 2);
}
-
+
virtual bool interact(Action verb, Object &obj1, Object &obj2);
virtual void animation();
virtual void onEntrance();
@@ -124,7 +124,7 @@ public:
ShipCockpit() {
_filenumber = 9;
_shown[0] = true;
-
+
_objectState[0] = Object("Instrumente", "Hmm, sieht ziemlich kompliziert aus.", INSTRUMENTS, NULLTYPE, 2, 2, 0, NULLROOM, 0);
_objectState[1] = Object("Monitor", Object::defaultDescription, MONITOR, NULLTYPE, 0, 0, 0, NULLROOM, 0);
_objectState[2] = Object("Monitor", "Dieser Monitor sagt dir nichts.", NULLOBJECT, TAKE, 1, 0, 0, NULLROOM, 0);
@@ -146,19 +146,19 @@ public:
_shown[3] = true;
_shown[4] = true;
_shown[5] = true;
-
+
_objectState[0] = Object("Bild", "Herb!", NULLOBJECT, UNNECESSARY, 5, 5, 0, NULLROOM, 0);
_objectState[1] = Object("Bild", "Toll!", NULLOBJECT, UNNECESSARY, 6, 6, 0, NULLROOM, 0);
_objectState[2] = Object("Bild", "Genial!", NULLOBJECT, UNNECESSARY, 7, 7, 0, NULLROOM, 0);
_objectState[3] = Object("Magnete", "Damit werden Sachen auf|dem Tisch festgehalten.", NULLOBJECT, UNNECESSARY, 8, 8, 0, NULLROOM, 0);
- _objectState[4] = Object("Bild", "Es scheint noch nicht fertig zu sein.", 0, UNNECESSARY, 9, 9, 0);
+ _objectState[4] = Object("Bild", "Es scheint noch nicht fertig zu sein.", NULLOBJECT, UNNECESSARY, 9, 9, 0);
_objectState[5] = Object("Stift", "Ein Kugelschreiber.", PEN, TAKE | COMBINABLE, 10, 10, 5 | 128);
- _objectState[6] = Object("Luke", &description, 0, OPEN | OPENED | EXIT, 3, 3, 24 | 128, CORRIDOR, 9);
- _objectState[7] = Object("Schlitz", "Es ist ein Keycard-Leser.", 0, COMBINABLE, 0, 0, 0);
- _objectState[8] = Object("Schrank", &description, 0, OPEN | CLOSED, 1, 1, 0);
- _objectState[9] = Object("Fach", &description, 0, OPEN | CLOSED, 2, 2, 0);
- _objectState[10] = Object("Steckdose", &description, SOCKET, COMBINABLE, 4, 4, 0);
- _objectState[11] = Object("Toilette", &description, BATHROOM_DOOR, EXIT, 255, 255, 0, BATHROOM, 2);
+ _objectState[6] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPEN | OPENED | EXIT, 3, 3, 24 | 128, CORRIDOR, 9);
+ _objectState[7] = Object("Schlitz", "Es ist ein Keycard-Leser.", NULLOBJECT, COMBINABLE, 0, 0, 0);
+ _objectState[8] = Object("Schrank", Object::defaultDescription, NULLOBJECT, OPEN | CLOSED, 1, 1, 0);
+ _objectState[9] = Object("Fach", Object::defaultDescription, NULLOBJECT, OPEN | CLOSED, 2, 2, 0);
+ _objectState[10] = Object("Steckdose", Object::defaultDescription, SOCKET, COMBINABLE, 4, 4, 0);
+ _objectState[11] = Object("Toilette", Object::defaultDescription, BATHROOM_DOOR, EXIT, 255, 255, 0, BATHROOM, 2);
}
};
@@ -183,34 +183,34 @@ public:
_shown[14] = false;
_shown[15] = false;
_shown[16] = true;
-
+
_objectState[0] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_KL1,COMBINABLE,31,31,0);
_objectState[1] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_KL2,COMBINABLE,32,32,0);
_objectState[2] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_KL3,COMBINABLE,33,33,0);
_objectState[3] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_KL4,COMBINABLE,45,45,0);
- _objectState[4] = Object("Schrank",&description,SHELF_L1,OPEN | CLOSED,25,26,17);
+ _objectState[4] = Object("Schrank",Object::defaultDescription,SHELF_L1,OPEN | CLOSED,25,26,17);
_objectState[5] = Object("Pistole","Es ist keine Munition drin.",PISTOL,TAKE,39,39,20);
- _objectState[6] = Object("Fach",&description,SHELF_L2,OPEN | CLOSED,27,28,18);
- _objectState[7] = Object("B�cher","Lauter wissenschaftliche B�cher.",0,UNNECESSARY,40,40,0);
- _objectState[8] = Object("Fach",&description,SHELF_L3,OPEN | CLOSED,29,30,19);
+ _objectState[6] = Object("Fach",Object::defaultDescription,SHELF_L2,OPEN | CLOSED,27,28,18);
+ _objectState[7] = Object("B�cher","Lauter wissenschaftliche B�cher.",NULLOBJECT,UNNECESSARY,40,40,0);
+ _objectState[8] = Object("Fach",Object::defaultDescription,SHELF_L3,OPEN | CLOSED,29,30,19);
_objectState[9] = Object("Kabelrolle","Da sind mindestens zwanzig Meter drauf.", SPOOL,TAKE | COMBINABLE,41,41,21);
- _objectState[10] = Object("Fach",&description,SHELF_L4,OPEN | CLOSED,43,44,22);
- _objectState[11] = Object("Buch",&description,BOOK2,TAKE,46,46,23);
- _objectState[12] = Object("Unterw�sche","Ich habe keine Lust, in|der Unterw�sche des|Commanders rumzuw�hlen.", 0,UNNECESSARY,34,34,0);
- _objectState[13] = Object("Unterw�sche","Ich habe keine Lust, in|der Unterw�sche des|Commanders rumzuw�hlen.", 0,UNNECESSARY,35,35,0);
- _objectState[14] = Object("Kleider",&description,0,UNNECESSARY,36,36,0);
- _objectState[15] = Object("Krimskram","Es ist nichts brauchbares dabei.",0,UNNECESSARY,37,37,0);
- _objectState[16] = Object("Krimskram","Es ist nichts brauchbares dabei.",0,UNNECESSARY,38,38,0);
- _objectState[17] = Object("Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",0, UNNECESSARY,23,23,0);
- _objectState[18] = Object("Toilette",&description,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
- _objectState[19] = Object("Luke",&description,0,OPEN | OPENED | EXIT,3,3,24 | 128,CORRIDOR,9);
- _objectState[20] = Object("Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,0,0,0);
- _objectState[21] = Object("Schrank",&description,0,OPEN | CLOSED,1,1,0);
- _objectState[22] = Object("Fach",&description,0,OPEN | CLOSED,2,2,0);
- _objectState[23] = Object("Steckdose",&description,SOCKET,COMBINABLE,4,4,0);
- _objectState[24] = Object("Ordner","Darauf steht \"Dienstanweisungen|zur Mission Supernova\".|Es steht nichts wichtiges drin.", 0,UNNECESSARY,49,49,);
+ _objectState[10] = Object("Fach",Object::defaultDescription,SHELF_L4,OPEN | CLOSED,43,44,22);
+ _objectState[11] = Object("Buch",Object::defaultDescription,BOOK2,TAKE,46,46,23);
+ _objectState[12] = Object("Unterw�sche","Ich habe keine Lust, in|der Unterw�sche des|Commanders rumzuw�hlen.",NULLOBJECT,UNNECESSARY,34,34,0);
+ _objectState[13] = Object("Unterw�sche","Ich habe keine Lust, in|der Unterw�sche des|Commanders rumzuw�hlen.",NULLOBJECT,UNNECESSARY,35,35,0);
+ _objectState[14] = Object("Kleider",Object::defaultDescription,NULLOBJECT,UNNECESSARY,36,36,0);
+ _objectState[15] = Object("Krimskram","Es ist nichts brauchbares dabei.",NULLOBJECT,UNNECESSARY,37,37,0);
+ _objectState[16] = Object("Krimskram","Es ist nichts brauchbares dabei.",NULLOBJECT,UNNECESSARY,38,38,0);
+ _objectState[17] = Object("Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",NULLOBJECT,UNNECESSARY,23,23,0);
+ _objectState[18] = Object("Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
+ _objectState[19] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPEN | OPENED | EXIT,3,3,24 | 128,CORRIDOR,9);
+ _objectState[20] = Object("Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
+ _objectState[21] = Object("Schrank",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,1,1,0);
+ _objectState[22] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,2,2,0);
+ _objectState[23] = Object("Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
+ _objectState[24] = Object("Ordner","Darauf steht \"Dienstanweisungen|zur Mission Supernova\".|Es steht nichts wichtiges drin.",NULLOBJECT,UNNECESSARY,49,49,0);
}
-
+
virtual bool interact(Action verb, Object &obj1, Object &obj2);
};
@@ -231,26 +231,26 @@ public:
_shown[10] = false;
_shown[11] = false;
_shown[12] = true;
-
- _objectState[0] = Object("Poster","Ein Poster von \"Big Boss\".",0,UNNECESSARY,11,11,0);
- _objectState[1] = Object("Poster","Ein Poster von \"Rock Desaster\".",0,UNNECESSARY,12,12,0);
- _objectState[2] = Object("Box",&description,0,0,13,13,0);
- _objectState[3] = Object("Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",0,UNNECESSARY,14,14,0);
+
+ _objectState[0] = Object("Poster","Ein Poster von \"Big Boss\".",NULLOBJECT,UNNECESSARY,11,11,0);
+ _objectState[1] = Object("Poster","Ein Poster von \"Rock Desaster\".",NULLOBJECT,UNNECESSARY,12,12,0);
+ _objectState[2] = Object("Box",Object::defaultDescription,NULLOBJECT,NULLTYPE,13,13,0);
+ _objectState[3] = Object("Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",NULLOBJECT,UNNECESSARY,14,14,0);
_objectState[4] = Object("Schallplatte","Die Platte ist von \"Big Boss\".",RECORD,TAKE | COMBINABLE,15,15,8 | 128);
- _objectState[5] = Object("Schallplattenst�nder","Du hast jetzt keine Zeit, in|der Plattensammlung rumzust�bern.",0,UNNECESSARY,16,16,0);
- _objectState[6] = Object("Knopf",&description,TURNTABLE_BUTTON,PRESS,22,22,0);
+ _objectState[5] = Object("Schallplattenst�nder","Du hast jetzt keine Zeit, in|der Plattensammlung rumzust�bern.",NULLOBJECT,UNNECESSARY,16,16,0);
+ _objectState[6] = Object("Knopf",Object::defaultDescription,TURNTABLE_BUTTON,PRESS,22,22,0);
_objectState[7] = Object("Plattenspieler","Sieht aus, als k�me|er aus dem Museum.",TURNTABLE,UNNECESSARY | COMBINABLE,17,17,0);
- _objectState[8] = Object("Leitung",&description,WIRE,COMBINABLE,18,18,0);
- _objectState[9] = Object("Leitung",&description,WIRE2,COMBINABLE,19,19,0);
- _objectState[10] = Object("Stecker",&description,PLUG,COMBINABLE,20,20,0);
- _objectState[11] = Object("Luke",&description,0,OPEN | OPENED | EXIT,3,3,24 | 128,CORRIDOR,9);
- _objectState[12] = Object("Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,0,0,0);
- _objectState[13] = Object("Schrank",&description,0,OPEN | CLOSED,1,1,0);
- _objectState[14] = Object("Fach",&description,0,OPEN | CLOSED,2,2,0);
- _objectState[15] = Object("Steckdose",&description,SOCKET,COMBINABLE,4,4,0);
- _objectState[16] = Object("Toilette",&description,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,2);
+ _objectState[8] = Object("Leitung",Object::defaultDescription,WIRE,COMBINABLE,18,18,0);
+ _objectState[9] = Object("Leitung",Object::defaultDescription,WIRE2,COMBINABLE,19,19,0);
+ _objectState[10] = Object("Stecker",Object::defaultDescription,PLUG,COMBINABLE,20,20,0);
+ _objectState[11] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPEN | OPENED | EXIT,3,3,24 | 128,CORRIDOR,9);
+ _objectState[12] = Object("Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
+ _objectState[13] = Object("Schrank",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,1,1,0);
+ _objectState[14] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,2,2,0);
+ _objectState[15] = Object("Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
+ _objectState[16] = Object("Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,2);
}
-
+
virtual bool interact(Action verb, Object &obj1, Object &obj2);
};
@@ -261,16 +261,16 @@ public:
_shown[0] = true;
_shown[1] = true;
_shown[2] = true;
-
- _objectState[0] = Object("Bild","Manche Leute haben schon|einen komischen Geschmack.",0,UNNECESSARY,5,5,0);
- _objectState[1] = Object("Zeichenger�te","Auf dem Zettel sind lauter|unverst�ndliche Skizzen und Berechnungen.|(Jedenfalls f�r dich unverst�ndlich.)",0,UNNECESSARY,6,6,0);
- _objectState[2] = Object("Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",0,UNNECESSARY,7,7,0);
- _objectState[3] = Object("Luke",&description,0,OPEN | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
- _objectState[4] = Object("Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,0,0,0);
- _objectState[5] = Object("Schrank",&description,0,OPEN | CLOSED,1,1,0);
- _objectState[6] = Object("Fach",&description,0,OPEN | CLOSED,2,2,0);
- _objectState[7] = Object("Steckdose",&description,SOCKET,COMBINABLE,4,4,0);
- _objectState[8] = Object("Toilette",&description,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,2);
+
+ _objectState[0] = Object("Bild","Manche Leute haben schon|einen komischen Geschmack.",NULLOBJECT,UNNECESSARY,5,5,0);
+ _objectState[1] = Object("Zeichenger�te","Auf dem Zettel sind lauter|unverst�ndliche Skizzen und Berechnungen.|(Jedenfalls f�r dich unverst�ndlich.)",NULLOBJECT,UNNECESSARY,6,6,0);
+ _objectState[2] = Object("Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",NULLOBJECT,UNNECESSARY,7,7,0);
+ _objectState[3] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPEN | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
+ _objectState[4] = Object("Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
+ _objectState[5] = Object("Schrank",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,1,1,0);
+ _objectState[6] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,2,2,0);
+ _objectState[7] = Object("Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
+ _objectState[8] = Object("Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,2);
}
};
@@ -284,16 +284,16 @@ public:
_shown[3] = true;
_shown[4] = true;
_shown[5] = true;
-
- _objectState[0] = Object("Schachspiel","Es macht wohl Spa�, an|der Decke Schach zu spielen.",0,UNNECESSARY,11,11,0);
- _objectState[1] = Object("Tennisschl�ger","Fliegt Boris Becker auch mit?",0,UNNECESSARY,8,8,0);
- _objectState[2] = Object("Tennisball","Toll!",0,UNNECESSARY,9,9,0);
- _objectState[3] = Object("Luke",&description,0,OPEN | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
- _objectState[4] = Object("Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,0,0,0);
- _objectState[5] = Object("Schrank",&description,0,OPEN | CLOSED,1,1,0);
- _objectState[6] = Object("Fach",&description,0,OPEN | CLOSED,2,2,0);
- _objectState[7] = Object("Steckdose",&description,SOCKET,COMBINABLE,4,4,0);
- _objectState[8] = Object("Toilette",&description,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,2);
+
+ _objectState[0] = Object("Schachspiel","Es macht wohl Spa�, an|der Decke Schach zu spielen.",NULLOBJECT,UNNECESSARY,11,11,0);
+ _objectState[1] = Object("Tennisschl�ger","Fliegt Boris Becker auch mit?",NULLOBJECT,UNNECESSARY,8,8,0);
+ _objectState[2] = Object("Tennisball","Toll!",NULLOBJECT,UNNECESSARY,9,9,0);
+ _objectState[3] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPEN | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
+ _objectState[4] = Object("Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
+ _objectState[5] = Object("Schrank",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,1,1,0);
+ _objectState[6] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,2,2,0);
+ _objectState[7] = Object("Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
+ _objectState[8] = Object("Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,2);
}
};
@@ -317,33 +317,33 @@ public:
_shown[13] = false;
_shown[14] = false;
_shown[15] = true;
-
+
_objectState[0] = Object("Schachspiel","Dein Magnetschachspiel. Schach war|schon immer deine Leidenschaft.",CHESS,TAKE | COMBINABLE,12,12,7 | 128);
- _objectState[1] = Object("Bett","Das ist dein Bett. Toll, nicht wahr?",0,0,13,13,0);
+ _objectState[1] = Object("Bett","Das ist dein Bett. Toll, nicht wahr?",NULLOBJECT,NULLTYPE,13,13,0);
_objectState[2] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_K1,COMBINABLE,27,27,0);
_objectState[3] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_K2,COMBINABLE,28,28,0);
_objectState[4] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_K3,COMBINABLE,29,29,0);
_objectState[5] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_K4,COMBINABLE,30,30,0);
_objectState[6] = Object("Fach","Das ist eins deiner drei F�cher.",SHELF1,OPEN | CLOSED,14,18,9);
- _objectState[7] = Object("Alben","Deine Briefmarkensammlung.",0,UNNECESSARY,14,14,0);
+ _objectState[7] = Object("Alben","Deine Briefmarkensammlung.",NULLOBJECT,UNNECESSARY,14,14,0);
_objectState[8] = Object("Fach","Das ist eins deiner drei F�cher.",SHELF2,OPEN | CLOSED,15,19,10);
_objectState[9] = Object("Seil","Es ist ungef�hr 10 m lang und 4 cm dick.",ROPE,TAKE | COMBINABLE,15,15,12);
_objectState[10] = Object("Schrank","Das ist dein Schrank.",SHELF3,OPEN | CLOSED,16,17,11);
- _objectState[11] = Object("Krimskram","Es ist nichts brauchbares dabei.",0,UNNECESSARY,20,20,0);
- _objectState[12] = Object("Kleider","Es sind Standard-Weltraum-Klamotten.",0,UNNECESSARY,21,21,0);
- _objectState[13] = Object("Unterw�sche",&description,0,UNNECESSARY,22,22,0);
- _objectState[14] = Object("Str�mpfe",&description,0,UNNECESSARY,23,23,0);
+ _objectState[11] = Object("Krimskram","Es ist nichts brauchbares dabei.",NULLOBJECT,UNNECESSARY,20,20,0);
+ _objectState[12] = Object("Kleider","Es sind Standard-Weltraum-Klamotten.",NULLOBJECT,UNNECESSARY,21,21,0);
+ _objectState[13] = Object("Unterw�sche",Object::defaultDescription,NULLOBJECT,UNNECESSARY,22,22,0);
+ _objectState[14] = Object("Str�mpfe",Object::defaultDescription,NULLOBJECT,UNNECESSARY,23,23,0);
_objectState[15] = Object("Fach","Das ist eins deiner drei F�cher.",SHELF4,OPEN | CLOSED,24,25,13);
_objectState[16] = Object("Buch","Es ist|\"Per Anhalter durch die Galaxis\"|von Douglas Adams.",BOOK,TAKE,26,26,14);
_objectState[17] = Object("Discman","Es ist eine \"Mad Monkeys\"-CD darin.",DISCMAN,TAKE | COMBINABLE,33,33,16);
- _objectState[18] = Object("Luke",&description,0,OPEN | EXIT,3,3,15 | 128,CORRIDOR,5);
- _objectState[19] = Object("Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,0,0,0);
- _objectState[20] = Object("Schrank",&description,0,OPEN | CLOSED,1,1,0);
- _objectState[21] = Object("Fach",&description,0,OPEN | CLOSED,2,2,0);
- _objectState[22] = Object("Steckdose",&description,SOCKET,COMBINABLE,4,4,0);
- _objectState[23] = Object("Toilette",&description,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,2);
+ _objectState[18] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPEN | EXIT,3,3,15 | 128,CORRIDOR,5);
+ _objectState[19] = Object("Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
+ _objectState[20] = Object("Schrank",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,1,1,0);
+ _objectState[21] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,2,2,0);
+ _objectState[22] = Object("Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
+ _objectState[23] = Object("Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,2);
}
-
+
virtual bool interact(Action verb, Object &obj1, Object &obj2);
};
@@ -352,10 +352,10 @@ public:
ShipCabinBathroom() {
_filenumber = 23;
_shown[0] = true;
-
- _objectState[0] = Object("Klo","Ein Klo mit Saugmechanismus.",TOILET,0,0,0,0);
- _objectState[1] = Object("Dusche",&description,SHOWER,0,1,1,0);
- _objectState[2] = Object("Ausgang",&description,BATHROOM_EXIT,EXIT,255,255,0,0,2);
+
+ _objectState[0] = Object("Klo","Ein Klo mit Saugmechanismus.",TOILET,NULLTYPE,0,0,0);
+ _objectState[1] = Object("Dusche",Object::defaultDescription,SHOWER,NULLTYPE,1,1,0);
+ _objectState[2] = Object("Ausgang",Object::defaultDescription,BATHROOM_EXIT,EXIT,255,255,0,NULLROOM,2);
}
};
@@ -370,16 +370,16 @@ public:
_shown[4] = false;
_shown[5] = false;
_shown[6] = true;
-
- _objectState[0] = Object("Luke","Das ist eine Luke !!!",0,EXIT | OPEN | OPENED | CLOSED,0,0,0,CORRIDOR,10);
- _objectState[1] = Object("Luke","Dies ist eine Luke !!!",0,EXIT | OPEN | CLOSED,1,1,0,HOLD,14);
- _objectState[2] = Object("Knopf",&description,BUTTON1,PRESS,2,2,0);
- _objectState[3] = Object("Knopf",&description,BUTTON2,PRESS,3,3,0);
+
+ _objectState[0] = Object("Luke","Das ist eine Luke !!!",NULLOBJECT,EXIT | OPEN | OPENED | CLOSED,0,0,0,CORRIDOR,10);
+ _objectState[1] = Object("Luke","Dies ist eine Luke !!!",NULLOBJECT,EXIT | OPEN | CLOSED,1,1,0,HOLD,14);
+ _objectState[2] = Object("Knopf",Object::defaultDescription,BUTTON1,PRESS,2,2,0);
+ _objectState[3] = Object("Knopf",Object::defaultDescription,BUTTON2,PRESS,3,3,0);
_objectState[4] = Object("Helm","Es ist der Helm zum Raumanzug.",HELMET,TAKE,4,4,7);
_objectState[5] = Object("Raumanzug","Der einzige Raumanzug, den die|anderen hiergelassen haben ...",SUIT,TAKE,5,5,8);
_objectState[6] = Object("Versorgung","Es ist der Versorgungsteil zum Raumanzug.",LIFESUPPORT,TAKE,6,6,9);
}
-
+
virtual bool interact(Action verb, Object &obj1, Object &obj2);
virtual void onEntrance();
};
@@ -389,21 +389,21 @@ public:
ShipHold() {
_filenumber = 24;
_shown[0] = true;
-
- _objectState[0] = Object("",&description,HOLD_WIRE,COMBINABLE,255,255,0);
- _objectState[1] = Object("Schrott","Da ist eine L�sterklemme dran, die|noch ganz brauchbar aussieht.|Ich nehme sie mit.",SCRAP_LK,0,4,4,0);
- _objectState[2] = Object("L�sterklemme",&description,TERMINALSTRIP,COMBINABLE,255,255,0);
- _objectState[3] = Object("Schrott","Junge, Junge! Die Explosion hat ein|ganz sch�nes Durcheinander angerichtet.",0,0,5,5,0);
- _objectState[4] = Object("Reaktor","Das war einmal der Reaktor.",0,0,6,6,0);
- _objectState[5] = Object("D�se",&description,0,0,7,7,0);
- _objectState[6] = Object("blauer K�rbis","Keine Ahnung, was das ist.",0,0,8,8,0);
- _objectState[7] = Object("Luke",&description,LANDINGMOD_OUTERHATCH,EXIT | OPEN,1,2,2,LANDINGMODULE,6);
- _objectState[8] = Object("Landef�hre","Sie war eigentlich f�r Bodenuntersuchungen|auf Arsano 3 gedacht.",0,0,0,0,0);
- _objectState[9] = Object("Ausgang",&description,0,EXIT,255,255,0,AIRLOCK,22);
+
+ _objectState[0] = Object("",Object::defaultDescription,HOLD_WIRE,COMBINABLE,255,255,0);
+ _objectState[1] = Object("Schrott","Da ist eine L�sterklemme dran, die|noch ganz brauchbar aussieht.|Ich nehme sie mit.",SCRAP_LK,NULLTYPE,4,4,0);
+ _objectState[2] = Object("L�sterklemme",Object::defaultDescription,TERMINALSTRIP,COMBINABLE,255,255,0);
+ _objectState[3] = Object("Schrott","Junge, Junge! Die Explosion hat ein|ganz sch�nes Durcheinander angerichtet.",NULLOBJECT,NULLTYPE,5,5,0);
+ _objectState[4] = Object("Reaktor","Das war einmal der Reaktor.",NULLOBJECT,NULLTYPE,6,6,0);
+ _objectState[5] = Object("D�se",Object::defaultDescription,NULLOBJECT,NULLTYPE,7,7,0);
+ _objectState[6] = Object("blauer K�rbis","Keine Ahnung, was das ist.",NULLOBJECT,NULLTYPE,8,8,0);
+ _objectState[7] = Object("Luke",Object::defaultDescription,LANDINGMOD_OUTERHATCH,EXIT | OPEN,1,2,2,LANDINGMODULE,6);
+ _objectState[8] = Object("Landef�hre","Sie war eigentlich f�r Bodenuntersuchungen|auf Arsano 3 gedacht.",NULLOBJECT,NULLTYPE,0,0,0);
+ _objectState[9] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,AIRLOCK,22);
_objectState[10] = Object("Luke","Sie f�hrt nach drau�en.",OUTERHATCH_TOP,EXIT | OPEN | OPENED,3,3,0,GENERATOR,8);
_objectState[11] = Object("Generator","Er versorgt das Raumschiff mit Strom.",GENERATOR_TOP,EXIT,12,12,0,GENERATOR,8);
}
-
+
virtual bool interact(Action verb, Object &obj1, Object &obj2);
virtual void onEntrance();
};
@@ -413,15 +413,15 @@ public:
ShipLandingModule() {
_filenumber = 25;
_shown[0] = true;
-
- _objectState[0] = Object("Steckdose",&description,LANDINGMOD_SOCKET,COMBINABLE,1,1,0);
+
+ _objectState[0] = Object("Steckdose",Object::defaultDescription,LANDINGMOD_SOCKET,COMBINABLE,1,1,0);
_objectState[1] = Object("Knopf","Es ist ein Sicherheitsknopf.|Er kann nur mit einem spitzen|Gegenstand gedr�ckt werden.",LANDINGMOD_BUTTON,PRESS | COMBINABLE,2,2,0);
- _objectState[2] = Object("Monitor",&description,LANDINGMOD_MONITOR,0,3,3,0);
- _objectState[3] = Object("Tastatur",&description,KEYBOARD,0,4,4,0);
- _objectState[4] = Object("",&description,LANDINGMOD_WIRE,COMBINABLE,255,255,0);
- _objectState[5] = Object("Luke",&description,LANDINGMOD_HATCH,EXIT | OPEN | OPENED | COMBINABLE, 0,0,1 | 128,HOLD,10);
+ _objectState[2] = Object("Monitor",Object::defaultDescription,LANDINGMOD_MONITOR,NULLTYPE,3,3,0);
+ _objectState[3] = Object("Tastatur",Object::defaultDescription,KEYBOARD,NULLTYPE,4,4,0);
+ _objectState[4] = Object("",Object::defaultDescription,LANDINGMOD_WIRE,COMBINABLE,255,255,0);
+ _objectState[5] = Object("Luke",Object::defaultDescription,LANDINGMOD_HATCH,EXIT | OPEN | OPENED | COMBINABLE, 0,0,1 | 128,HOLD,10);
}
-
+
virtual bool interact(Action verb, Object &obj1, Object &obj2);
};
@@ -435,22 +435,22 @@ public:
_shown[3] = false;
_shown[4] = false;
_shown[5] = true;
-
- _objectState[0] = Object("langes Kabel mit Stecker",&description,GENERATOR_WIRE,COMBINABLE,255,255,0);
- _objectState[1] = Object("leere Kabelrolle",&description,0,UNNECESSARY,255,255,0);
+
+ _objectState[0] = Object("langes Kabel mit Stecker",Object::defaultDescription,GENERATOR_WIRE,COMBINABLE,255,255,0);
+ _objectState[1] = Object("leere Kabelrolle",Object::defaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
_objectState[2] = Object("Keycard","Hey, das ist die Keycard des Commanders!|Er mu� sie bei dem �berst�rzten|Aufbruch verloren haben.",KEYCARD2,COMBINABLE | TAKE,12,12,5 | 128);
- _objectState[3] = Object("Seil",&description,GENERATOR_ROPE,COMBINABLE,255,255,0);
+ _objectState[3] = Object("Seil",Object::defaultDescription,GENERATOR_ROPE,COMBINABLE,255,255,0);
_objectState[4] = Object("Luke","Sie f�hrt nach drau�en.",OUTERHATCH,EXIT | OPEN,1,2,1,OUTSIDE,22);
- _objectState[5] = Object("Luke",&description,0,OPEN | CLOSED,3,3,0);
- _objectState[6] = Object("Schlitz","Es ist ein Keycard-Leser.",0,COMBINABLE,4,4,0);
- _objectState[7] = Object("Klappe",&description,TRAP,OPEN,5,6,2);
- _objectState[8] = Object("Leitung",&description,0,0,7,7,0);
- _objectState[9] = Object("Spannungmessger�t",&description,VOLTMETER,0,9,9,0);
- _objectState[10] = Object("Klemme",&description,CLIP,COMBINABLE,8,8,0);
+ _objectState[5] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,3,3,0);
+ _objectState[6] = Object("Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,4,4,0);
+ _objectState[7] = Object("Klappe",Object::defaultDescription,TRAP,OPEN,5,6,2);
+ _objectState[8] = Object("Leitung",Object::defaultDescription,NULLOBJECT,NULLTYPE,7,7,0);
+ _objectState[9] = Object("Spannungmessger�t",Object::defaultDescription,VOLTMETER,NULLTYPE,9,9,0,NULLROOM,0);
+ _objectState[10] = Object("Klemme",Object::defaultDescription,CLIP,COMBINABLE,8,8,0);
_objectState[11] = Object("Leitung","Sie f�hrt vom Generator zum Spannungmessger�t.",SHORT_WIRE,COMBINABLE,10,10,0);
- _objectState[12] = Object("Leiter",&description,LADDER,EXIT,0,0,0,HOLD,1);
+ _objectState[12] = Object("Leiter",Object::defaultDescription,LADDER,EXIT,0,0,0,HOLD,1);
}
-
+
virtual bool interact(Action verb, Object &obj1, Object &obj2);
};
@@ -459,9 +459,9 @@ public:
ShipOuterSpace() {
_filenumber = 4;
_shown[0] = true;
-
- _objectState[0] = Object("Luke",&description,0,EXIT,0,0,0,GENERATOR,3);
- _objectState[1] = Object("Seil",&description,0,UNNECESSARY,255,255,0);
+
+ _objectState[0] = Object("Luke",Object::defaultDescription,NULLOBJECT,EXIT,0,0,0,GENERATOR,3);
+ _objectState[1] = Object("Seil",Object::defaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
}
};
Commit: f4eb7cbfc5ad4d3c266406b2f93748365df9be95
https://github.com/scummvm/scummvm/commit/f4eb7cbfc5ad4d3c266406b2f93748365df9be95
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:08:39Z
Commit Message:
SUPERNOVA: Adds Inventory Class
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index f5967fb..a24af84 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -392,4 +392,35 @@ void SupernovaEngine::paletteFadeIn() {
_system->updateScreen();
}
+Inventory::Inventory()
+ : _numObjects(0)
+{}
+
+// TODO: Update Inventory surface for scrolling
+void Inventory::add(Object &obj) {
+ if (_numObjects < kMaxCarry)
+ _inventory[_numObjects] = &obj;
+}
+
+// TODO: Update Inventory surface for scrolling
+void Inventory::remove(Object &obj) {
+ for (size_t i = 0; i < _numObjects; ++i) {
+ if (_inventory[i] == &obj) {
+ --_numObjects;
+ while (i < _numObjects) {
+ _inventory[i] = _inventory[i + 1];
+ ++i;
+ }
+ obj.disableProperty(CARRIED);
+ }
+ }
+}
+
+Object *Inventory::get(size_t index) {
+ if (index < _numObjects)
+ return _inventory[index];
+
+ return NULL;
+}
+
}
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 017c912..2844c2a 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -55,7 +55,7 @@ private:
byte _menuBrightness;
byte _brightness;
uint _delay;
-
+
void initData();
void initPalette();
void paletteFadeIn();
@@ -71,6 +71,19 @@ private:
void renderBox(int x, int y, int width, int height, byte color);
};
+class Inventory {
+public:
+ Inventory();
+
+ void add(Object &obj);
+ void remove(Object &obj);
+ Object *get(size_t index);
+
+private:
+ Object *_inventory[kMaxCarry];
+ size_t _numObjects;
+};
+
}
#endif
Commit: f2e51c3cfe0a6c1ae2794d5eee54dba4da0ba201
https://github.com/scummvm/scummvm/commit/f2e51c3cfe0a6c1ae2794d5eee54dba4da0ba201
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:08:39Z
Commit Message:
SUPERNOVA: Adds hasProperty() for Objects and bit ops
Changed paths:
engines/supernova/msn_def.h
engines/supernova/supernova.cpp
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 1bd81dd..d19dd1e 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -371,8 +371,10 @@ enum ObjectID {
};
ObjectType operator|(ObjectType a, ObjectType b);
+ObjectType operator&(ObjectType a, ObjectType b);
ObjectType operator^(ObjectType a, ObjectType b);
ObjectType &operator|=(ObjectType &a, ObjectType b);
+ObjectType &operator&=(ObjectType &a, ObjectType b);
ObjectType &operator^=(ObjectType &a, ObjectType b);
struct Object {
@@ -410,6 +412,10 @@ struct Object {
_type ^= type;
}
+ bool hasProperty(ObjectType type) const {
+ return _type & type;
+ }
+
const char *_name;
const char *_description;
ObjectID _id;
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index a24af84..6bd50f9 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -47,6 +47,10 @@ ObjectType operator|(ObjectType a, ObjectType b) {
return static_cast<ObjectType>(+a | +b);
}
+ObjectType operator&(ObjectType a, ObjectType b) {
+ return static_cast<ObjectType>(+a & +b);
+}
+
ObjectType operator^(ObjectType a, ObjectType b) {
return static_cast<ObjectType>(+a ^ +b);
}
@@ -55,6 +59,10 @@ ObjectType &operator|=(ObjectType &a, ObjectType b) {
return a = a | b;
}
+ObjectType &operator&=(ObjectType &a, ObjectType b) {
+ return a = a & b;
+}
+
ObjectType &operator^=(ObjectType &a, ObjectType b) {
return a = a ^ b;
}
Commit: 8ec47736287cd69046f259466c456818b1ec77d9
https://github.com/scummvm/scummvm/commit/8ec47736287cd69046f259466c456818b1ec77d9
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:17:37Z
Commit Message:
SUPERNOVA: Adds text for commands in GUI
Changed paths:
engines/supernova/msn_def.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index d19dd1e..6fc55a5 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -370,6 +370,19 @@ enum ObjectID {
TICKETS
};
+static const char *const guiCommands[] = {
+ "Gehe",
+ "Schau",
+ "Nimm",
+ "Öffne",
+ "Schließe",
+ "Drücke",
+ "Ziehe",
+ "Benutze",
+ "Rede",
+ "Gib"
+};
+
ObjectType operator|(ObjectType a, ObjectType b);
ObjectType operator&(ObjectType a, ObjectType b);
ObjectType operator^(ObjectType a, ObjectType b);
Commit: b34fb59f9672e375f5d51731fd6b410985c320d8
https://github.com/scummvm/scummvm/commit/b34fb59f9672e375f5d51731fd6b410985c320d8
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:17:48Z
Commit Message:
SUPERNOVA: Reformatting
Changed paths:
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index efbe5b1..91a792a 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -28,7 +28,7 @@ public:
}
protected:
- int _filenumber;
+ int _fileNumber;
bool _shown[kMaxSection];
Object _objectState[kMaxObject];
@@ -40,7 +40,7 @@ private:
class StartingItems : public Room {
public:
StartingItems() {
- _filenumber = -1;
+ _fileNumber = -1;
_shown[0] = false;
@@ -63,7 +63,7 @@ public:
class ShipCorridor : public Room {
public:
ShipCorridor() {
- _filenumber = 17;
+ _fileNumber = 17;
_shown[0] = true;
_shown[1] = false;
_shown[2] = false;
@@ -88,7 +88,7 @@ public:
class ShipHall: public Room {
public:
ShipHall() {
- _filenumber = 15;
+ _fileNumber = 15;
_shown[0] = true;
_objectState[0] = Object("Luke", "Sie f�hrt ins Cockpit.", NULLOBJECT, OPEN | EXIT, 4, 5, 1, COCKPIT, 10);
@@ -105,7 +105,7 @@ public:
class ShipSleepCabin: public Room {
public:
ShipSleepCabin() {
- _filenumber = 33;
+ _fileNumber = 33;
_shown[0] = true;
_objectState[0] = Object("Luke", "Dies ist eine der Tiefschlafkammern.", CABINS, NULLTYPE, 0, 0, 0, NULLROOM, 0);
@@ -122,7 +122,7 @@ public:
class ShipCockpit : public Room {
public:
ShipCockpit() {
- _filenumber = 9;
+ _fileNumber = 9;
_shown[0] = true;
_objectState[0] = Object("Instrumente", "Hmm, sieht ziemlich kompliziert aus.", INSTRUMENTS, NULLTYPE, 2, 2, 0, NULLROOM, 0);
@@ -139,7 +139,7 @@ public:
class ShipCabinL1: public Room {
public:
ShipCabinL1() {
- _filenumber = 21;
+ _fileNumber = 21;
_shown[0] = true;
_shown[1] = true;
_shown[2] = true;
@@ -165,7 +165,7 @@ public:
class ShipCabinL2 : public Room {
public:
ShipCabinL2() {
- _filenumber = 21;
+ _fileNumber = 21;
_shown[0] = true;
_shown[1] = false;
_shown[2] = false;
@@ -217,7 +217,7 @@ public:
class ShipCabinL3 : public Room {
public:
ShipCabinL3() {
- _filenumber = 21;
+ _fileNumber = 21;
_shown[0] = true;
_shown[1] = false;
_shown[2] = false;
@@ -257,7 +257,7 @@ public:
class ShipCabinR1 : public Room {
public:
ShipCabinR1() {
- _filenumber = 22;
+ _fileNumber = 22;
_shown[0] = true;
_shown[1] = true;
_shown[2] = true;
@@ -277,7 +277,7 @@ public:
class ShipCabinR2 : public Room {
public:
ShipCabinR2() {
- _filenumber = 22;
+ _fileNumber = 22;
_shown[0] = true;
_shown[1] = false;
_shown[2] = false;
@@ -300,7 +300,7 @@ public:
class ShipCabinR3 : public Room {
public:
ShipCabinR3() {
- _filenumber = 22;
+ _fileNumber = 22;
_shown[0] = true;
_shown[1] = false;
_shown[2] = false;
@@ -350,7 +350,7 @@ public:
class ShipCabinBathroom : public Room {
public:
ShipCabinBathroom() {
- _filenumber = 23;
+ _fileNumber = 23;
_shown[0] = true;
_objectState[0] = Object("Klo","Ein Klo mit Saugmechanismus.",TOILET,NULLTYPE,0,0,0);
@@ -362,7 +362,7 @@ public:
class ShipAirlock : public Room {
public:
ShipAirlock() {
- _filenumber = 34;
+ _fileNumber = 34;
_shown[0] = true;
_shown[1] = false;
_shown[2] = false;
@@ -387,7 +387,7 @@ public:
class ShipHold : public Room {
public:
ShipHold() {
- _filenumber = 24;
+ _fileNumber = 24;
_shown[0] = true;
_objectState[0] = Object("",Object::defaultDescription,HOLD_WIRE,COMBINABLE,255,255,0);
@@ -411,7 +411,7 @@ public:
class ShipLandingModule : public Room {
public:
ShipLandingModule() {
- _filenumber = 25;
+ _fileNumber = 25;
_shown[0] = true;
_objectState[0] = Object("Steckdose",Object::defaultDescription,LANDINGMOD_SOCKET,COMBINABLE,1,1,0);
@@ -428,7 +428,7 @@ public:
class ShipGenerator : public Room {
public:
ShipGenerator() {
- _filenumber = 18;
+ _fileNumber = 18;
_shown[0] = true;
_shown[1] = false;
_shown[2] = false;
@@ -457,7 +457,7 @@ public:
class ShipOuterSpace : public Room {
public:
ShipOuterSpace() {
- _filenumber = 4;
+ _fileNumber = 4;
_shown[0] = true;
_objectState[0] = Object("Luke",Object::defaultDescription,NULLOBJECT,EXIT,0,0,0,GENERATOR,3);
Commit: b15169cd43ad691acec1d6389a96ce0257eab0c4
https://github.com/scummvm/scummvm/commit/b15169cd43ad691acec1d6389a96ce0257eab0c4
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:17:48Z
Commit Message:
SUPERNOVA: Adds getFileNumber() to Room Class
Changed paths:
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 91a792a..701f473 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -20,6 +20,10 @@ public:
_seen = seen;
}
+ int getFileNumber() const {
+ return _fileNumber;
+ }
+
virtual ~Room() {}
virtual void animation() {}
virtual void onEntrance() {}
Commit: 85aa1985ace84d5d3ed939990ea7f22dfdc4b9fb
https://github.com/scummvm/scummvm/commit/85aa1985ace84d5d3ed939990ea7f22dfdc4b9fb
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:17:48Z
Commit Message:
SUPERNOVA: Reformatting
Changed paths:
engines/supernova/graphics.cpp
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index 3ab1c44..b986427 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -10,9 +10,9 @@
namespace Supernova {
MSNImageDecoder::MSNImageDecoder()
- : _surface(NULL)
- , _palette(NULL)
- , _encodedImage(NULL) {
+ : _surface(NULL)
+ , _palette(NULL)
+ , _encodedImage(NULL) {
}
MSNImageDecoder::~MSNImageDecoder() {
@@ -21,7 +21,7 @@ MSNImageDecoder::~MSNImageDecoder() {
bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
destroy();
-
+
size_t size = 0;
size = (stream.readUint16LE() + 0xF) >> 4;
size |= (stream.readUint16LE() & 0xF) << 12;
@@ -61,7 +61,7 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
_section[i].addressLow = stream.readUint16LE();
_section[i].addressHigh = stream.readByte();
}
-
+
byte numClickFields = stream.readByte();
for (int i = 0; i < numClickFields; ++i) {
_clickField[i].x1 = stream.readUint16LE();
@@ -70,13 +70,13 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
_clickField[i].y2 = stream.readByte();
_clickField[i].next = stream.readByte();
}
-
+
byte zwCodes[256] = {0};
byte numRepeat = stream.readByte();
byte numZw = stream.readByte();
stream.read(zwCodes, numZw);
numZw += numRepeat;
-
+
byte input = 0;
size_t i = 0;
// wat
@@ -97,7 +97,7 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
_encodedImage[i++] = input;
}
}
-
+
return true;
}
@@ -105,9 +105,9 @@ bool MSNImageDecoder::loadSection(int section) {
_surface = new Graphics::Surface;
_surface->create(320, 200, g_system->getScreenFormat());
byte *surfacePixels = static_cast<byte *>(_surface->getPixels());
-
+
const uint32 kInvalidAddress = 0x00FFFFFF;
-
+
size_t image = section;
if (image < 128) {
do {
@@ -124,7 +124,7 @@ bool MSNImageDecoder::loadSection(int section) {
destAddress += 320;
--height;
}
-
+
image = _section[image].next;
} while (image != 0);
} else {
@@ -140,11 +140,11 @@ bool MSNImageDecoder::loadSection(int section) {
destAddress += 320;
--height;
}
-
+
image = _section[image].next;
} while (image != 0);
}
-
+
return true;
}
Commit: 55c67005a638989fdc3e9cbe03d84ed0ff975051
https://github.com/scummvm/scummvm/commit/55c67005a638989fdc3e9cbe03d84ed0ff975051
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:17:48Z
Commit Message:
SUPERNOVA: Returns if section is invalid
Sections with an x2 value of 0 cannot span any area and are thus invalid
Changed paths:
engines/supernova/graphics.cpp
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index b986427..2abbdb1 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -112,7 +112,7 @@ bool MSNImageDecoder::loadSection(int section) {
if (image < 128) {
do {
uint32 offset = (_section[image].addressHigh << 16) + _section[image].addressLow;
- if (offset == kInvalidAddress) {
+ if (offset == kInvalidAddress || _section[image].x2 == 0) {
return false;
}
int width = _section[image].x2 - _section[image].x1 + 1;
Commit: a1462cae1f2dce52dd3e9c164cdab3ba8178aaa5
https://github.com/scummvm/scummvm/commit/a1462cae1f2dce52dd3e9c164cdab3ba8178aaa5
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:17:48Z
Commit Message:
SUPERNOVA: Adds static combine() to Object Class
Changed paths:
engines/supernova/msn_def.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 6fc55a5..cc236b1 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -429,6 +429,14 @@ struct Object {
return _type & type;
}
+ static bool combine(Object &obj1, Object &obj2, ObjectID id1, ObjectID id2) {
+ if (obj1.hasProperty(COMBINABLE))
+ return (((obj1._id == id1) && (obj2._id == id2)) ||
+ ((obj1._id == id2) && (obj2._id == id1)));
+ else
+ return false;
+ }
+
const char *_name;
const char *_description;
ObjectID _id;
Commit: 6c5865c44cc154ee9aedc8ac539552c81c9ed479
https://github.com/scummvm/scummvm/commit/6c5865c44cc154ee9aedc8ac539552c81c9ed479
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:17:48Z
Commit Message:
SUPERNOVA: Adds getObject() to Room Interface
Changed paths:
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 701f473..bd82683 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -23,6 +23,9 @@ public:
int getFileNumber() const {
return _fileNumber;
}
+ Object *getObject(size_t index) {
+ return _objectState[index];
+ }
virtual ~Room() {}
virtual void animation() {}
Commit: 54f8df764e42d797975930358492a1a6a0f00593
https://github.com/scummvm/scummvm/commit/54f8df764e42d797975930358492a1a6a0f00593
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:17:48Z
Commit Message:
SUPERNOVA: Adds GameState Class
Changed paths:
engines/supernova/msn_def.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index cc236b1..1f097d5 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -448,6 +448,35 @@ struct Object {
byte _direction;
};
+struct GameState {
+ int32 time;
+ int32 timeSleep;
+ int32 timeStarting;
+ int32 timeAlarm;
+ int32 timeAlarmSystem;
+ int32 eventTime;
+ int32 shipEnergy;
+ int32 landingModuleEnergy;
+ uint16 greatF;
+ int16 timeRobot;
+ int16 money;
+ char coins;
+ char shoes;
+ char nameSeen;
+ char destination;
+ char benOverlay;
+ bool language;
+ bool corridorSearch;
+ bool alarmOn;
+ bool terminalStripConnected;
+ bool terminalStripWire;
+ bool cableConnected;
+ bool powerOff;
+ bool cockpitSeen;
+ bool airlockSeen;
+ bool holdSeen;
+ bool dream;
+};
}
Commit: 0e859cd296873974536467d4d282929550575ee3
https://github.com/scummvm/scummvm/commit/0e859cd296873974536467d4d282929550575ee3
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:17:48Z
Commit Message:
SUPERNOVA: Fixes getObject() to return pointer to Object
Changed paths:
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index bd82683..4e53d69 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -24,7 +24,7 @@ public:
return _fileNumber;
}
Object *getObject(size_t index) {
- return _objectState[index];
+ return &_objectState[index];
}
virtual ~Room() {}
Commit: 7a16dbdd505036f717c28ccfc0d1a290882b029b
https://github.com/scummvm/scummvm/commit/7a16dbdd505036f717c28ccfc0d1a290882b029b
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:17:48Z
Commit Message:
SUPERNOVA: Adds isSectionVisible() to Object Class
Changed paths:
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 4e53d69..a659c4c 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -23,6 +23,9 @@ public:
int getFileNumber() const {
return _fileNumber;
}
+ bool isSectionVisible(size_t index) const {
+ return _shown[index];
+ }
Object *getObject(size_t index) {
return &_objectState[index];
}
Commit: ddcfda7d020fd22c97ea271c48ae105d9285fba5
https://github.com/scummvm/scummvm/commit/ddcfda7d020fd22c97ea271c48ae105d9285fba5
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:17:49Z
Commit Message:
SUPERNOVA: Adds constant messages
Changed paths:
engines/supernova/msn_def.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 1f097d5..2eba8ec 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -392,6 +392,7 @@ ObjectType &operator^=(ObjectType &a, ObjectType b);
struct Object {
static const char *const defaultDescription;
+ static const char *const takeMessage;
Object()
: _name("")
@@ -465,7 +466,7 @@ struct GameState {
char nameSeen;
char destination;
char benOverlay;
- bool language;
+ char language;
bool corridorSearch;
bool alarmOn;
bool terminalStripConnected;
Commit: 4f3f231afd98d63a2ebdbec94671549d0d68f46f
https://github.com/scummvm/scummvm/commit/4f3f231afd98d63a2ebdbec94671549d0d68f46f
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:29:35Z
Commit Message:
SUPERNOVA: Adds Container for temporarily storing screen sections
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 6bd50f9..bcc2347 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -431,4 +431,41 @@ Object *Inventory::get(size_t index) {
return NULL;
}
+ScreenBufferStack::ScreenBufferStack()
+ : _last(_buffer) {
+}
+
+void ScreenBufferStack::push(int x, int y, int width, int height, int pitch) {
+ if (_last == ARRAYEND(_buffer))
+ return;
+
+ byte *pixels = new byte[width * height];
+ const byte *screen = static_cast<byte *>(g_system->lockScreen()->getBasePtr(x, y));
+ for (int i = 0; i < height; ++i) {
+ Common::copy(screen, screen + width, pixels);
+ screen += pitch * i;
+ }
+ g_system->unlockScreen();
+
+ _last->_x = x;
+ _last->_y = y;
+ _last->_width = width;
+ _last->_height = height;
+ _last->_pitch = pitch;
+ _last->_pixels = pixels;
+
+ ++_last;
+}
+
+void ScreenBufferStack::restore() {
+ if (_last == _buffer)
+ return;
+
+ g_system->lockScreen()->copyRectToSurface(
+ _last->_pixels, _last->_width, _last->_x, _last->_y,
+ _last->_width, _last->_height);
+ g_system->unlockScreen();
+ --_last;
+}
+
}
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 2844c2a..f97cd40 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -37,6 +37,35 @@
namespace Supernova {
+struct ScreenBuffer {
+ ScreenBuffer()
+ : _x(0)
+ , _y(0)
+ , _width(0)
+ , _height(0)
+ , _pitch(0)
+ , _pixels(0)
+ {}
+
+ byte *_pixels;
+ int _x;
+ int _y;
+ int _width;
+ int _height;
+ int _pitch;
+};
+class ScreenBufferStack {
+public:
+ ScreenBufferStack();
+
+ void push(int x, int y, int width, int height, int pitch = 320);
+ void restore();
+
+private:
+ ScreenBuffer _buffer[8];
+ ScreenBuffer *_last;
+};
+
class SupernovaEngine : public Engine {
public:
SupernovaEngine(OSystem *syst);
Commit: 8a45d56630cf6dc2199f6d9621e715ea67b33635
https://github.com/scummvm/scummvm/commit/8a45d56630cf6dc2199f6d9621e715ea67b33635
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:29:44Z
Commit Message:
SUPERNOVA: Adds getDOSTicks()
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index bcc2347..b3c0adb 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -119,6 +119,16 @@ Common::Error SupernovaEngine::run() {
return Common::kNoError;
}
+// Emulates DOS int 1A/00
+uint SupernovaEngine::getDOSTicks() {
+ TimeDate systemTime;
+ _system->getTimeAndDate(systemTime);
+
+ return static_cast<uint>((systemTime.tm_hour * 24 +
+ systemTime.tm_min * 60 +
+ systemTime.tm_sec) * 18.2065);
+}
+
void SupernovaEngine::updateEvents() {
Common::Event event;
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index f97cd40..9370e90 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -85,6 +85,7 @@ private:
byte _brightness;
uint _delay;
+ uint getDOSTicks();
void initData();
void initPalette();
void paletteFadeIn();
Commit: 5c706dfb596cae682dcc759c3f18e8d97ff1cd14
https://github.com/scummvm/scummvm/commit/5c706dfb596cae682dcc759c3f18e8d97ff1cd14
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:32:32Z
Commit Message:
SUPERNOVA: Extends Inventory::get()
The code added as comments to Inventory::add() is the original code to
check if scrolling in inventory is needed and redraw it.
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index b3c0adb..6c2bd68 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -418,6 +418,9 @@ Inventory::Inventory()
void Inventory::add(Object &obj) {
if (_numObjects < kMaxCarry)
_inventory[_numObjects] = &obj;
+
+// if (inventory_amount>8) inventory_scroll = ((inventory_amount+1)/2)*2-8;
+// show_inventory();
}
// TODO: Update Inventory surface for scrolling
@@ -434,13 +437,22 @@ void Inventory::remove(Object &obj) {
}
}
-Object *Inventory::get(size_t index) {
+Object *Inventory::get(size_t index) const {
if (index < _numObjects)
return _inventory[index];
return NULL;
}
+Object *Inventory::get(ObjectID id) const {
+ for (size_t i = 0; i < _numObjects; ++i) {
+ if (_inventory[i]->_id == id)
+ return _inventory[i];
+ }
+
+ return NULL;
+}
+
ScreenBufferStack::ScreenBufferStack()
: _last(_buffer) {
}
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 9370e90..f1f5b4a 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -107,7 +107,8 @@ public:
void add(Object &obj);
void remove(Object &obj);
- Object *get(size_t index);
+ Object *get(size_t index) const;
+ Object *get(ObjectID id) const;
private:
Object *_inventory[kMaxCarry];
Commit: e534581e627429206672cba0a6f41644bc442007
https://github.com/scummvm/scummvm/commit/e534581e627429206672cba0a6f41644bc442007
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:32:46Z
Commit Message:
SUPERNOVA: Extends screen message system
Messages will be 'removable' by over-rendering the message by invoking
removeMessage() with what was previously overdrawn.
_messageDisplayed might need to be reworked to an int, depending if
there are multiple messages rendered simultaneously.
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 6c2bd68..eef19d2 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -251,9 +251,10 @@ static int characterWidth(const char *text) {
return charWidth;
}
-void SupernovaEngine::renderMessage(char *text, MessagePosition position) {
+void SupernovaEngine::renderMessage(const char *text, MessagePosition position) {
+ Common::String t(text);
char *row[20];
- char *p = text;
+ Common::String::iterator p = t.begin();
size_t numRows = 0;
int rowWidthMax = 0;
int x = 0;
@@ -318,7 +319,13 @@ void SupernovaEngine::renderMessage(char *text, MessagePosition position) {
y += 9;
}
-// timer1 = (Common::strnlen(text, BUFSIZ) + 20) * textspeed / 10;
+ _messageDisplayed = true;
+// _timer1 = (Common::strnlen(text, BUFSIZ) + 20) * textspeed / 10;
+}
+
+void SupernovaEngine::removeMessage() {
+ // TODO: restore surface
+ _messageDisplayed = false;
}
void SupernovaEngine::renderText(const char *text, int x, int y, byte color) {
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index f1f5b4a..f3ccdf5 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -84,6 +84,7 @@ private:
byte _menuBrightness;
byte _brightness;
uint _delay;
+ bool _messageDisplayed;
uint getDOSTicks();
void initData();
@@ -96,11 +97,13 @@ private:
void playSoundMod(int filenumber);
void stopSound();
void renderImage(int filenumber, int section, bool fullscreen = false);
- void renderMessage(char *text, MessagePosition position);
+ void renderMessage(const char *text, MessagePosition position = kMessageNormal);
+ void removeMessage();
void renderText(const char *text, int x, int y, byte color);
void renderBox(int x, int y, int width, int height, byte color);
};
+
class Inventory {
public:
Inventory();
Commit: e00e93ed4d252bd180b311f2585d43d719bf662a
https://github.com/scummvm/scummvm/commit/e00e93ed4d252bd180b311f2585d43d719bf662a
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:34:39Z
Commit Message:
SUPERNOVA: Implements GameManager Class and extension to engine
An instance of GameManager acts as an interface between the game logic
and engine. It provides game specific functions like isHelmetOff() to
check if the player wears his helmet.
This commit also adds engine extensions like saveScreen() and
restoreScreen() that makes use of the ScreenBufferStack class for
temporarily saving and restoring sections of the screen.
Most of the structure and code is bound to change but gives something to
improve on.
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index eef19d2..c19583d 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -36,12 +36,12 @@
#include "graphics/palette.h"
#include "supernova/supernova.h"
-//#include "supernova/rooms.h"
namespace Supernova {
const char *const Object::defaultDescription = "Es ist nichts Besonderes daran.";
+const char *const Object::takeMessage = "Das mußt du erst nehmen.";
ObjectType operator|(ObjectType a, ObjectType b) {
return static_cast<ObjectType>(+a | +b);
@@ -95,20 +95,65 @@ SupernovaEngine::~SupernovaEngine() {
Common::Error SupernovaEngine::run() {
initGraphics(kScreenWidth, kScreenHeight);
- debug(_system->getScreenFormat().toString().c_str());
_console = new Console(this);
initData();
initPalette();
paletteFadeIn();
+ GameManager gm(this, &_event);
CursorMan.showMouse(true);
while (_gameRunning) {
- updateEvents();
- renderImage(_imageIndex, _sectionIndex);
- renderText(Common::String::format("%u | %u", _imageIndex, _sectionIndex).c_str(), 0, 190, kColorLightRed);
+ while (g_system->getEventManager()->pollEvent(_event)) {
+ switch (_event.type) {
+ case Common::EVENT_QUIT:
+ case Common::EVENT_RTL:
+ _gameRunning = false;
+ break;
+
+ case Common::EVENT_KEYDOWN:
+ if (_event.kbd.keycode == Common::KEYCODE_d && _event.kbd.hasFlags(Common::KBD_CTRL)) {
+ _console->attach();
+ }
+ if (_event.kbd.keycode == Common::KEYCODE_q) {
+ playSound(48, 13530);
+ }
+ if (_event.kbd.keycode == Common::KEYCODE_RIGHT) {
+ ++_imageIndex;
+ _sectionIndex = 0;
+ }
+ if (_event.kbd.keycode == Common::KEYCODE_LEFT) {
+ --_imageIndex;
+ _sectionIndex = 0;
+ }
+ if (_event.kbd.keycode == Common::KEYCODE_UP) {
+ ++_sectionIndex;
+ }
+ if (_event.kbd.keycode == Common::KEYCODE_DOWN) {
+ --_sectionIndex;
+ }
+ break;
+
+ case Common::EVENT_LBUTTONUP:
+ break;
+ case Common::EVENT_RBUTTONUP:
+ // TODO: Determines verb depending on object properties
+ break;
+ case Common::EVENT_MOUSEMOVE:
+ // TODO: Update status if mouse enters/leaves object
+ break;
+ default:
+ break;
+ }
+
+// gm.processInput();
+ }
+
+ renderImage(_imageIndex, _sectionIndex, true);
+ renderText(Common::String::format("%3d | %3d", _imageIndex, _sectionIndex).c_str(),
+ 10, 190, kColorLightGreen);
_system->updateScreen();
_system->delayMillis(_delay);
}
@@ -130,43 +175,6 @@ uint SupernovaEngine::getDOSTicks() {
}
void SupernovaEngine::updateEvents() {
- Common::Event event;
-
- while (g_system->getEventManager()->pollEvent(event)) {
- switch (event.type) {
- case Common::EVENT_QUIT:
- case Common::EVENT_RTL:
- _gameRunning = false;
- break;
-
- case Common::EVENT_KEYDOWN:
- if (event.kbd.keycode == Common::KEYCODE_d && event.kbd.hasFlags(Common::KBD_CTRL)) {
- paletteFadeOut();
- }
- if (event.kbd.keycode == Common::KEYCODE_d && !event.kbd.hasFlags(Common::KBD_CTRL)) {
- paletteFadeIn();
- }
- if (event.kbd.keycode == Common::KEYCODE_q) {
- playSound(48, 13530);
- }
- if (event.kbd.keycode == Common::KEYCODE_w) {
- _sectionIndex = 0;
- ++_imageIndex;
- if (_imageIndex == 31) {
- renderText("Das Schicksal", 44, 132, kColorWhite99);
- renderText("des Horst Hummel", 35, 142, kColorWhite99);
- renderText("Teil 1:", 64, 120, kColorLightBlue);
- }
- }
- if (event.kbd.keycode == Common::KEYCODE_e) {
- renderImage(_imageIndex, 0);
- renderImage(_imageIndex, ++_sectionIndex);
- }
- break;
- default:
- break;
- }
- }
}
void SupernovaEngine::initData() {
@@ -213,20 +221,36 @@ void SupernovaEngine::renderImage(int filenumber, int section, bool fullscreen)
error("File %s could not be read!", file.getName());
}
- _image.loadStream(file);
- _image.loadSection(section);
- _system->getPaletteManager()->setPalette(_image.getPalette(), 16, 239);
- paletteBrightness();
- if (fullscreen) {
- _system->copyRectToScreen(_image.getSurface()->getPixels(), 320, 0, 0, 320, 200);
- } else {
- size_t offset = _image._section[section].y1 * 320 + _image._section[section].x1;
- _system->copyRectToScreen(static_cast<const byte *>(_image.getSurface()->getPixels()) + offset,
- 320,
- _image._section[section].x1,
- _image._section[section].y1,
- _image._section[section].x2 - _image._section[section].x1,
- _image._section[section].y2 - _image._section[section].y1);
+ _currentImageFilenumber = filenumber;
+ if (_currentImage.loadStream(file) && _currentImage.loadSection(section)) {
+ _system->getPaletteManager()->setPalette(_currentImage.getPalette(), 16, 239);
+ paletteBrightness();
+ if (fullscreen) {
+ _system->copyRectToScreen(_currentImage.getSurface()->getPixels(), 320, 0, 0, 320, 200);
+ } else {
+ size_t offset = _currentImage._section[section].y1 * 320 + _currentImage._section[section].x1;
+ _system->copyRectToScreen(static_cast<const byte *>(_currentImage.getSurface()->getPixels()) + offset,
+ 320,
+ _currentImage._section[section].x1,
+ _currentImage._section[section].y1,
+ _currentImage._section[section].x2 - _currentImage._section[section].x1,
+ _currentImage._section[section].y2 - _currentImage._section[section].y1);
+ }
+ }
+}
+
+void SupernovaEngine::saveScreen(int x, int y, int width, int height) {
+ _screenBuffer.push(x, y, width, height);
+}
+
+void SupernovaEngine::restoreScreen() {
+ _screenBuffer.restore();
+}
+
+void SupernovaEngine::renderRoom(Room &room) {
+ for (int i = 0; i < kMaxSection; ++i) {
+ if (room.isSectionVisible(i))
+ renderImage(room.getFileNumber(), i);
}
}
@@ -373,8 +397,8 @@ void SupernovaEngine::paletteBrightness() {
}
for (size_t i = 0; i < 717; ++i) {
const byte *imagePalette;
- if (_image.getPalette()) {
- imagePalette = _image.getPalette();
+ if (_currentImage.getPalette()) {
+ imagePalette = _currentImage.getPalette();
} else {
imagePalette = palette;
}
@@ -417,6 +441,12 @@ void SupernovaEngine::paletteFadeIn() {
_system->updateScreen();
}
+void SupernovaEngine::setColor63(byte value) {
+ byte color[3] = {value, value, value};
+ _system->getPaletteManager()->setPalette(color, 63, 1);
+}
+
+
Inventory::Inventory()
: _numObjects(0)
{}
@@ -497,4 +527,552 @@ void ScreenBufferStack::restore() {
--_last;
}
+
+static const char *timeToString(int t) {
+ // TODO: Does ScummVM emulate PIT timings for DOS?
+
+ static char s[9];
+ strcpy(s," 0:00:00");
+ s[7] = t % 10 + '0';
+ t /= 10;
+ s[6] = t % 6 + '0';
+ t /= 6;
+ s[4] = t % 10 + '0';
+ t /= 10;
+ s[3] = t % 6 + '0';
+ t /= 6;
+ s[1] = t % 10 + '0';
+ t /= 10;
+ if (t)
+ s[0] = t+48;
+
+ return(s);
+}
+
+GameManager::GameManager(SupernovaEngine *vm, Common::Event *event) {
+// _rooms[INTRO] = StartingItems();
+// _rooms[CORRIDOR] = ShipCorridor();
+// _rooms[HALL] = ShipHall();
+// _rooms[SLEEP] = ShipSleepCabin();
+// _rooms[COCKPIT] = ShipCockpit();
+// _rooms[AIRLOCK] = ShipAirlock();
+// _rooms[HOLD] = ShipHold();
+// _rooms[LANDINGMODULE] = ShipLandingModule();
+// _rooms[GENERATOR] = ShipGenerator();
+// _rooms[OUTSIDE] = ShipOuterSpace();
+// _rooms[CABIN_R1] = ShipCabinR1();
+// _rooms[CABIN_R2] = ShipCabinR2();
+// _rooms[CABIN_R3] = ShipCabinR3();
+// _rooms[CABIN_L1] = ShipCabinL1();
+// _rooms[CABIN_L2] = ShipCabinL2();
+// _rooms[CABIN_L3] = ShipCabinL3();
+// _rooms[BATHROOM] = ShipCabinBathroom();
+
+// _rooms[ROCKS]
+// _rooms[CAVE]
+// _rooms[MEETUP]
+// _rooms[ENTRANCE]
+// _rooms[REST]
+// _rooms[ROGER]
+// _rooms[GLIDER]
+// _rooms[MEETUP2]
+// _rooms[MEETUP3]
+
+// _rooms[CELL]
+// _rooms[CORRIDOR1]
+// _rooms[CORRIDOR2]
+// _rooms[CORRIDOR3]
+// _rooms[CORRIDOR4]
+// _rooms[CORRIDOR5]
+// _rooms[CORRIDOR6]
+// _rooms[CORRIDOR7]
+// _rooms[CORRIDOR8]
+// _rooms[CORRIDOR9]
+// _rooms[BCORRIDOR]
+// _rooms[GUARD]
+// _rooms[GUARD3]
+// _rooms[OFFICE_L1]
+// _rooms[OFFICE_L2]
+// _rooms[OFFICE_R1]
+// _rooms[OFFICE_R2]
+// _rooms[OFFICE_L]
+// _rooms[ELEVATOR]
+// _rooms[STATION]
+// _rooms[SIGN]
+
+ _currentRoom = &_rooms[0];
+ _vm = vm;
+ _event = event;
+}
+
+bool GameManager::isHelmetOff() {
+ Object *helmet = _inventory.get(HELMET);
+ if (helmet && helmet->hasProperty(WORN)) {
+ _vm->renderMessage("Irgendwie ist ein Raumhelm|beim Essen unpraktisch.");
+ return false;
+ }
+
+ return true;
+}
+
+void GameManager::great(uint number) {
+ if (number && (_state.greatF & (1 << number)))
+ return;
+
+ _vm->playSound(54, 8010);
+ _state.greatF |= 1 << number;
+}
+
+bool GameManager::airless() {
+ return (
+ ((_currentRoom > &_rooms[AIRLOCK]) && (_currentRoom < &_rooms[CABIN_R1])) ||
+ ((_currentRoom > &_rooms[BATHROOM])&& (_currentRoom < &_rooms[ENTRANCE])) ||
+ ((_currentRoom == &_rooms[AIRLOCK]) && (_currentRoom->getObject(1)->hasProperty(OPENED))) ||
+ (_currentRoom >= &_rooms[MEETUP2])
+ );
+}
+
+void GameManager::processInput() {
+ //
+}
+
+void GameManager::takeObject(Object &obj) {
+ if (obj.hasProperty(CARRIED))
+ return;
+
+ if (obj._section != 0)
+ _vm->renderImage(_currentRoom->getFileNumber(), obj._section);
+ obj.setProperty(CARRIED);
+ obj._click = obj._click2 = 255;
+ _inventory.add(obj);
+}
+
+void GameManager::mouse_input() {
+ // STUB
+}
+
+void GameManager::mouse_input2() {
+ // STUB
+}
+
+void GameManager::mouse_input3() {
+ // STUB
+}
+
+void GameManager::mouse_wait(int) {
+ // STUB
+}
+
+void GameManager::room_brightness() {
+ // STUB
+}
+
+void GameManager::palette() {
+ // STUB
+}
+
+void GameManager::show_menu() {
+ // STUB
+}
+
+void GameManager::exits() {
+ // STUB
+}
+
+void GameManager::anim_off() {
+ // STUB
+}
+
+void GameManager::anim_on() {
+ // STUB
+}
+
+void GameManager::edit(int, int, char *, int) {
+ // STUB
+}
+
+void GameManager::load_overlay_start() {
+ // STUB
+}
+
+int GameManager::invertSection(int section) {
+ if (section < 128)
+ section += 128;
+ else
+ section -= 128;
+
+ return section;
+}
+
+
+bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
+ Room *r;
+ char t[150];
+
+ if ((verb == ACTION_USE) && (obj1._id == SCHNUCK)) {
+ if (isHelmetOff()) {
+ takeObject(obj1);
+ _vm->renderMessage("Schmeckt ganz gut.");
+ _inventory.remove(obj1);
+ }
+ } else if ((verb == ACTION_USE) && (obj1._id == EGG)) {
+ if (isHelmetOff()) {
+ takeObject(obj1);
+ if (obj1.hasProperty(OPENED))
+ _vm->renderMessage("Schmeckt ganz gut.");
+ else
+ _vm->renderMessage("Da war irgendetwas drin,|aber jetzt hast du es|mit runtergeschluckt.");
+
+ _inventory.remove(obj1);
+ }
+ } else if ((verb == ACTION_OPEN) && (obj1._id == EGG)) {
+ takeObject(obj1);
+ if (obj1.hasProperty(OPENED)) {
+ _vm->renderMessage("Du hast es doch schon geffnet.");
+ } else {
+ takeObject(*_rooms[ENTRANCE].getObject(8));
+ _vm->renderMessage("In dem Ei ist eine Tablette|in einer Plastikhlle.");
+ obj1.setProperty(OPENED);
+ }
+ } else if ((verb == ACTION_USE) && (obj1._id == PILL)) {
+ if (isHelmetOff()) {
+ _vm->renderMessage("Du iát die Tablette und merkst,|daá sich irgendetwas verndert hat.");
+ great(0);
+ _inventory.remove(obj1);
+ _state.language = 2;
+ takeObject(*_rooms[ENTRANCE].getObject(17));
+ }
+ } else if ((verb == ACTION_LOOK) && (obj1._id == PILL_HULL) &&
+ (_state.language == 2)) {
+ _vm->renderMessage("Komisch! Auf einmal kannst du die Schrift lesen!|Darauf steht:\"Wenn Sie diese Schrift jetzt|lesen knnen, hat die Tablette gewirkt.\"");
+ _state.language = 1;
+ } else if ((verb == ACTION_OPEN) && (obj1._id == WALLET)) {
+ if (!_rooms[ROGER].getObject(3)->hasProperty(CARRIED)) {
+ _vm->renderMessage("Das muát du erst nehmen.");
+ } else if (_rooms[ROGER].getObject(7)->hasProperty(CARRIED)) {
+ _vm->renderMessage("Sie ist leer.");
+ } else {
+ _vm->renderMessage("Du findest 10 Buckazoids und eine Keycard.");
+ takeObject(*_rooms[ROGER].getObject(7));
+ takeObject(*_rooms[ROGER].getObject(8));
+ }
+ } else if ((verb == ACTION_LOOK) && (obj1._id == NEWSPAPER)) {
+ _vm->renderMessage("Es ist eine Art elektronische Zeitung.");
+ mouse_wait(_timer1);
+ _vm->removeMessage();
+ _vm->renderMessage("Halt, hier ist ein interessanter Artikel.");
+ mouse_wait(_timer1);
+ _vm->removeMessage();
+ _vm->renderImage(2,0);
+ _vm->setColor63(40);
+ mouse_input2();
+ _vm->renderRoom(*_currentRoom);
+ room_brightness();
+ palette();
+ show_menu();
+ exits();
+ _vm->renderMessage("Hmm, irgendwie komme|ich mir verarscht vor.");
+ } else if ((verb == ACTION_LOOK) && (obj1._id == KEYCARD2)) {
+ _vm->renderMessage(obj1._description);
+ obj1._description = "Es ist die Keycard des Commanders.";
+ } else if ((verb == ACTION_LOOK) && (obj1._id == WATCH)) {
+ _vm->renderMessage(Common::String::format(
+ "Es ist eine Uhr mit extra|lautem Wecker. "
+ "Sie hat einen|Knopf zum Verstellen der Alarmzeit.|"
+ "Uhrzeit: %s Alarmzeit: %s",
+ timeToString(_vm->getDOSTicks() - _state.timeStarting),
+ timeToString(_state.timeAlarm)).c_str());
+ } else if ((verb == ACTION_PRESS) && (obj1._id == WATCH)) {
+ char *min;
+ int stunden, minuten, i;
+ bool f;
+ anim_off();
+ _vm->saveScreen(88, 87, 144, 24);
+ _vm->renderBox(88, 87, 144, 24, kColorWhite35);
+ _vm->renderText("Neue Alarmzeit (hh:mm) :", 91, 90, kColorWhite99);
+ do {
+ t[0] = 0;
+ _vm->renderBox(91, 99, 138, 9, kColorDarkBlue);
+ do {
+ edit(91, 100, t, 5);
+ } while ((_key != Common::ASCII_RETURN) && (_key != Common::ASCII_ESCAPE));
+ f = false;
+ if (t[0] == ':') {
+ t[0] = 0;
+ min = &(t[1]);
+ } else if (t[1] == ':') {
+ t[1] = 0;
+ min = &(t[2]);
+ } else if (t[2] == ':') {
+ t[2] = 0;
+ min = &(t[3]);
+ } else {
+ f = true;
+ }
+
+ for (i = 0; i < strlen(t); i++)
+ if ((t[i] < '0') || (t[i] > '9')) f = true;
+ for (i = 0; i < strlen(min); i++)
+ if ((min[i] < '0') || (min[i] > '9')) f = true;
+ stunden = atoi(t);
+ minuten = atoi(min);
+ if ((stunden > 23) || (minuten > 59)) f = true;
+ anim_on();
+ } while (f && (_key != Common::ASCII_ESCAPE));
+ _vm->restoreScreen();
+ if (_key != Common::ASCII_ESCAPE) {
+ _state.timeAlarm = (stunden * 60 + minuten) * 1092.3888 + 8;
+ _state.timeAlarmSystem = _state.timeAlarm + _state.timeStarting;
+ _state.alarmOn = (_state.timeAlarmSystem > _vm->getDOSTicks());
+ }
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, WIRE)) {
+ r = &_rooms[CABIN_L3];
+ if (!r->getObject(8)->hasProperty(CARRIED)) {
+ if (r->isSectionVisible(26))
+ _vm->renderMessage(Object::takeMessage);
+ else
+ return false;
+ } else {
+ r->getObject(8)->_name = "Leitung mit Lsterklemme";
+ r = &_rooms[HOLD];
+ _inventory.remove(*r->getObject(2));
+ _state.terminalStripConnected = true;
+ _state.terminalStripWire = true;
+ _vm->renderMessage("Ok.");
+ }
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, SPOOL)) {
+ r = &_rooms[CABIN_L2];
+ takeObject(*r->getObject(9));
+ r->getObject(9)->_name = "Kabelrolle mit Lsterklemme";
+ r = &_rooms[HOLD];
+ _inventory.remove(*r->getObject(2));
+ _state.terminalStripConnected = true;
+ _vm->renderMessage("Ok.");
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, WIRE, SPOOL)) {
+ r = &_rooms[CABIN_L3];
+ if (!_state.terminalStripConnected) {
+ if (r->isSectionVisible(26))
+ _vm->renderMessage("Womit denn?");
+ else
+ return false;
+ } else {
+ if (!r->getObject(8)->hasProperty(CARRIED)) {
+ _vm->renderMessage(Object::takeMessage);
+ } else {
+ r = &_rooms[CABIN_L2];
+ takeObject(*r->getObject(9));
+ r = &_rooms[CABIN_L3];
+ r->getObject(8)->_name = "langes Kabel mit Stecker";
+ r = &_rooms[CABIN_L2];
+ _inventory.remove(*r->getObject(9));
+ _state.cableConnected = true;
+ _vm->renderMessage("Ok.");
+ }
+ }
+ } else if ((verb == ACTION_USE) && (obj1._id == SUIT)) {
+ takeObject(obj1);
+ if ((_currentRoom >= &_rooms[ENTRANCE]) && (_currentRoom <= &_rooms[ROGER])) {
+ if (obj1.hasProperty(WORN)) {
+ _vm->renderMessage("Die Luft hier ist atembar,|du ziehst den Anzug aus.");
+ _rooms[AIRLOCK].getObject(4)->disableProperty(WORN);
+ _rooms[AIRLOCK].getObject(5)->disableProperty(WORN);
+ _rooms[AIRLOCK].getObject(6)->disableProperty(WORN);
+ } else
+ _vm->renderMessage("Hier drinnen brauchtst du deinen Anzug nicht.");
+ } else {
+ if (obj1.hasProperty(WORN)) {
+ r = &_rooms[AIRLOCK];
+ if (r->getObject(4)->hasProperty(WORN)) {
+ _vm->renderMessage("Du muát erst den Helm abnehmen.");
+ } else if (r->getObject(6)->hasProperty(WORN)) {
+ _vm->renderMessage("Du muát erst den Versorgungsteil abnehmen.");
+ } else {
+ obj1.disableProperty(WORN);
+ _vm->renderMessage("Du ziehst den Raumanzug aus.");
+ }
+ } else {
+ obj1.setProperty(WORN);
+ _vm->renderMessage("Du ziehst den Raumanzug an.");
+ }
+ }
+ } else if ((verb == ACTION_USE) && (obj1._id == HELMET)) {
+ takeObject(obj1);
+ if ((_currentRoom >= &_rooms[ENTRANCE]) && (_currentRoom <= &_rooms[ROGER])) {
+ if (obj1.hasProperty(WORN)) {
+ _vm->renderMessage("Die Luft hier ist atembar,|du ziehst den Anzug aus.");
+ _rooms[AIRLOCK].getObject(4)->disableProperty(WORN);
+ _rooms[AIRLOCK].getObject(5)->disableProperty(WORN);
+ _rooms[AIRLOCK].getObject(6)->disableProperty(WORN);
+ } else {
+ _vm->renderMessage("Hier drinnen brauchtst du deinen Anzug nicht.");
+ }
+ } else {
+ if (obj1.hasProperty(WORN)) {
+ if (airless()) {
+ //TODO: Death screen
+// longjmp(dead, "Den Helm httest du|besser angelassen!");
+ }
+ obj1.disableProperty(WORN);
+ _vm->renderMessage("Du ziehst den Helm ab.");
+ } else {
+ r = &_rooms[AIRLOCK];
+ if (r->getObject(5)->hasProperty(WORN)) {
+ obj1.setProperty(WORN);
+ _vm->renderMessage("Du ziehst den Helm auf.");
+ } else {
+ _vm->renderMessage("Du muát erst den Anzug anziehen.");
+ }
+ }
+ }
+ } else if ((verb == ACTION_USE) && (obj1._id == LIFESUPPORT)) {
+ takeObject(obj1);
+ if ((_currentRoom >= &_rooms[ENTRANCE]) && (_currentRoom <= &_rooms[ROGER])) {
+ if (obj1.hasProperty(WORN)) {
+ _vm->renderMessage("Die Luft hier ist atembar,|du ziehst den Anzug aus.");
+ _rooms[AIRLOCK].getObject(4)->disableProperty(WORN);
+ _rooms[AIRLOCK].getObject(5)->disableProperty(WORN);
+ _rooms[AIRLOCK].getObject(6)->disableProperty(WORN);
+ } else
+ _vm->renderMessage("Hier drinnen brauchtst du deinen Anzug nicht.");
+ } else {
+ if (obj1.hasProperty(WORN)) {
+ if (airless()) {
+ //TODO: Death screen
+// longjmp(dead, "Den Versorungsteil httest du|besser nicht abgenommen!");
+ }
+ obj1.disableProperty(WORN);
+ _vm->renderMessage("Du nimmst den Versorgungsteil ab.");
+ } else {
+ r = &_rooms[AIRLOCK];
+ if (r->getObject(5)->hasProperty(WORN)) {
+ obj1.setProperty(WORN);
+ _vm->renderMessage("Du ziehst den Versorgungsteil an.");
+ } else {
+ _vm->renderMessage("Du muát erst den Anzug anziehen.");
+ }
+ }
+ }
+ } else if ((verb == ACTION_WALK) && (obj1._id == BATHROOM_DOOR)) {
+// *bathroom = current_room;
+ return false;
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, WIRE, SOCKET))
+ _vm->renderMessage("Die Leitung ist hier unntz.");
+ else if ((verb == ACTION_LOOK) && (obj1._id == BOOK2)) {
+ _vm->renderMessage("Stark, das ist ja die Fortsetzung zum \"Anhalter\":|\"Das Restaurant am Ende des Universums\".");
+ mouse_wait(_timer1);
+ _vm->removeMessage();
+ _vm->renderMessage("Moment mal, es ist ein Lesezeichen drin,|auf dem \"Zweiundvierzig\" steht.");
+ } else {
+ return false;
+ }
+
+ return true;
+}
+
+void GameManager::executeRoom() {
+ bool validCommand = genericInteract(_inputVerb, _inputObject[0], _inputObject[1]);
+
+ if (!validCommand) {
+ validCommand = _currentRoom->interact(_inputVerb, _inputObject[0], _inputObject[1]);
+ if (!validCommand) {
+ switch (_inputVerb) {
+ case ACTION_LOOK :
+ _vm->renderMessage(_inputObject[0]._description);
+ break;
+
+ case ACTION_WALK :
+ if (_inputObject[0].hasProperty(CARRIED)) {
+ // You already carry this.
+ _vm->renderMessage("Das trgst du doch bei dir.");
+ } else if (!_inputObject[0].hasProperty(EXIT)) {
+ // You're already there.
+ _vm->renderMessage("Du bist doch schon da.");
+ } else if (_inputObject[0].hasProperty(OPEN) && !_inputObject[0].hasProperty(OPENED)) {
+ // This is closed
+ _vm->renderMessage("Das ist geschlossen.");
+ } else {
+ _currentRoom = &_rooms[_inputObject[0]._exitRoom];
+ return;
+ }
+ break;
+
+ case ACTION_TAKE :
+ if (_inputObject[0].hasProperty(OPENED)) {
+ // You already have that
+ _vm->renderMessage("Das hast du doch schon.");
+ } else if (_inputObject[0].hasProperty(UNNECESSARY)) {
+ // You do not need that.
+ _vm->renderMessage("Das brauchst du nicht.");
+ } else if (!_inputObject[0].hasProperty(TAKE)) {
+ // You can't take that.
+ _vm->renderMessage("Das kannst du nicht nehmen.");
+ } else {
+ takeObject(_inputObject[0]);
+ }
+ break;
+
+ case ACTION_OPEN :
+ if (!_inputObject[0].hasProperty(OPEN)) {
+ // This can't be opened
+ _vm->renderMessage("Das lát sich nicht ffnen.");
+ } else if (_inputObject[0].hasProperty(OPENED)) {
+ // This is already opened.
+ _vm->renderMessage("Das ist schon offen.");
+ } else if (_inputObject[0].hasProperty(CLOSED)) {
+ // This is locked.
+ _vm->renderMessage("Das ist verschlossen.");
+ } else {
+ _vm->renderImage(_vm->_currentImageFilenumber, _inputObject[0]._section);
+ _inputObject[0].setProperty(OPENED);
+ byte i = _inputObject[0]._click;
+ _inputObject[0]._click = _inputObject[0]._click2;
+ _inputObject[0]._click2 = i;
+ _vm->playSound(54, 30030);
+ }
+ break;
+
+ case ACTION_CLOSE:
+ if (!_inputObject[0].hasProperty(OPEN) ||
+ (_inputObject[0].hasProperty(CLOSED) &&
+ _inputObject[0].hasProperty(OPENED))) {
+ // This can't be closed.
+ _vm->renderMessage("Das lát sich nicht schlieáen.");
+ } else if (!_inputObject[0].hasProperty(OPENED)) {
+ // This is already closed.
+ _vm->renderMessage("Das ist schon geschlossen.");
+ } else {
+ _vm->renderImage(_vm->_currentImageFilenumber, invertSection(_inputObject[0]._section));
+ _inputObject[0].disableProperty(OPENED);
+ byte i = _inputObject[0]._click;
+ _inputObject[0]._click = _inputObject[0]._click2;
+ _inputObject[0]._click2 = i;
+ _vm->playSound(54, 31040);
+ }
+ break;
+
+ case ACTION_GIVE :
+ if (_inputObject[0].hasProperty(CARRIED)) {
+ // Better keep it!
+ _vm->renderMessage("Behalt es lieber!");
+ break;
+ }
+
+ default:
+ // This is not possible.
+ _vm->renderMessage("Das geht nicht.");
+ }
+
+ if (_newOverlay) {
+ load_overlay_start();
+ _newOverlay = false;
+ }
+ if (_newRoom) {
+ _newRoom = false;
+ return;
+ }
+ }
+ }
+}
+
+
}
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index f3ccdf5..8b6c25c 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -29,12 +29,15 @@
#include "common/array.h"
#include "common/random.h"
#include "common/scummsys.h"
+#include "common/events.h"
#include "engines/engine.h"
#include "supernova/console.h"
#include "supernova/graphics.h"
+#include "supernova/rooms.h"
#include "supernova/msn_def.h"
+
namespace Supernova {
struct ScreenBuffer {
@@ -73,12 +76,15 @@ public:
virtual Common::Error run();
-private:
Common::RandomSource *_rnd;
Console *_console;
Audio::SoundHandle _soundHandle;
+ ScreenBufferStack _screenBuffer;
+ MSNImageDecoder _currentImage;
+ int _currentImageFilenumber;
+ Common::Event _event;
bool _gameRunning;
- MSNImageDecoder _image;
+
byte _imageIndex;
byte _sectionIndex;
byte _menuBrightness;
@@ -97,10 +103,14 @@ private:
void playSoundMod(int filenumber);
void stopSound();
void renderImage(int filenumber, int section, bool fullscreen = false);
+ void saveScreen(int x, int y, int width, int height);
+ void restoreScreen();
+ void renderRoom(Room &room);
void renderMessage(const char *text, MessagePosition position = kMessageNormal);
void removeMessage();
void renderText(const char *text, int x, int y, byte color);
void renderBox(int x, int y, int width, int height, byte color);
+ void setColor63(byte value);
};
@@ -118,6 +128,50 @@ private:
size_t _numObjects;
};
+class GameManager {
+public:
+ GameManager(SupernovaEngine *vm, Common::Event *event);
+
+ void processInput();
+ void executeRoom();
+
+private:
+ SupernovaEngine *_vm;
+ Common::Event *_event;
+ uint16 _key;
+ Room *_currentRoom;
+ Room _rooms[kRoomsNum];
+ Inventory _inventory;
+ GameState _state;
+ Action _inputVerb;
+ Object _inputObject[2];
+ bool _waitEvent;
+ bool _newRoom;
+ bool _newOverlay;
+ int _timer1;
+ int _timer2;
+
+ void takeObject(Object &obj);
+
+ bool genericInteract(Action verb, Object &obj1, Object &obj2);
+ bool isHelmetOff();
+ void great(uint number);
+ bool airless();
+ void mouse_input();
+ void mouse_input2();
+ void mouse_input3();
+ void mouse_wait(int);
+ void room_brightness();
+ void palette();
+ void show_menu();
+ void exits();
+ void anim_off();
+ void anim_on();
+ void load_overlay_start();
+ void edit(int, int, char *, int);
+ int invertSection(int section);
+};
+
}
#endif
Commit: fbcb3d32037759cb2a8e7893f73cfcafb6812902
https://github.com/scummvm/scummvm/commit/fbcb3d32037759cb2a8e7893f73cfcafb6812902
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:34:49Z
Commit Message:
SUPERNOVA: Renames game functions
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index c19583d..d644be2 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -647,23 +647,23 @@ void GameManager::takeObject(Object &obj) {
_inventory.add(obj);
}
-void GameManager::mouse_input() {
+void GameManager::mouseInput() {
// STUB
}
-void GameManager::mouse_input2() {
+void GameManager::mouseInput2() {
// STUB
}
-void GameManager::mouse_input3() {
+void GameManager::mouseInput3() {
// STUB
}
-void GameManager::mouse_wait(int) {
+void GameManager::mouseWait(int) {
// STUB
}
-void GameManager::room_brightness() {
+void GameManager::roomBrightness() {
// STUB
}
@@ -671,19 +671,19 @@ void GameManager::palette() {
// STUB
}
-void GameManager::show_menu() {
+void GameManager::showMenu() {
// STUB
}
-void GameManager::exits() {
+void GameManager::drawMapExits() {
// STUB
}
-void GameManager::anim_off() {
+void GameManager::animationOff() {
// STUB
}
-void GameManager::anim_on() {
+void GameManager::animationOn() {
// STUB
}
@@ -691,7 +691,7 @@ void GameManager::edit(int, int, char *, int) {
// STUB
}
-void GameManager::load_overlay_start() {
+void GameManager::loadOverlayStart() {
// STUB
}
@@ -758,19 +758,19 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
}
} else if ((verb == ACTION_LOOK) && (obj1._id == NEWSPAPER)) {
_vm->renderMessage("Es ist eine Art elektronische Zeitung.");
- mouse_wait(_timer1);
+ mouseWait(_timer1);
_vm->removeMessage();
_vm->renderMessage("Halt, hier ist ein interessanter Artikel.");
- mouse_wait(_timer1);
+ mouseWait(_timer1);
_vm->removeMessage();
_vm->renderImage(2,0);
_vm->setColor63(40);
- mouse_input2();
+ mouseInput2();
_vm->renderRoom(*_currentRoom);
- room_brightness();
+ roomBrightness();
palette();
- show_menu();
- exits();
+ showMenu();
+ drawMapExits();
_vm->renderMessage("Hmm, irgendwie komme|ich mir verarscht vor.");
} else if ((verb == ACTION_LOOK) && (obj1._id == KEYCARD2)) {
_vm->renderMessage(obj1._description);
@@ -786,7 +786,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
char *min;
int stunden, minuten, i;
bool f;
- anim_off();
+ animationOff();
_vm->saveScreen(88, 87, 144, 24);
_vm->renderBox(88, 87, 144, 24, kColorWhite35);
_vm->renderText("Neue Alarmzeit (hh:mm) :", 91, 90, kColorWhite99);
@@ -817,7 +817,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
stunden = atoi(t);
minuten = atoi(min);
if ((stunden > 23) || (minuten > 59)) f = true;
- anim_on();
+ animationOn();
} while (f && (_key != Common::ASCII_ESCAPE));
_vm->restoreScreen();
if (_key != Common::ASCII_ESCAPE) {
@@ -959,7 +959,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage("Die Leitung ist hier unntz.");
else if ((verb == ACTION_LOOK) && (obj1._id == BOOK2)) {
_vm->renderMessage("Stark, das ist ja die Fortsetzung zum \"Anhalter\":|\"Das Restaurant am Ende des Universums\".");
- mouse_wait(_timer1);
+ mouseWait(_timer1);
_vm->removeMessage();
_vm->renderMessage("Moment mal, es ist ein Lesezeichen drin,|auf dem \"Zweiundvierzig\" steht.");
} else {
@@ -1063,7 +1063,7 @@ void GameManager::executeRoom() {
}
if (_newOverlay) {
- load_overlay_start();
+ loadOverlayStart();
_newOverlay = false;
}
if (_newRoom) {
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 8b6c25c..e6ccaa2 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -157,17 +157,17 @@ private:
bool isHelmetOff();
void great(uint number);
bool airless();
- void mouse_input();
- void mouse_input2();
- void mouse_input3();
- void mouse_wait(int);
- void room_brightness();
+ void mouseInput();
+ void mouseInput2();
+ void mouseInput3();
+ void mouseWait(int);
+ void roomBrightness();
void palette();
- void show_menu();
- void exits();
- void anim_off();
- void anim_on();
- void load_overlay_start();
+ void showMenu();
+ void drawMapExits();
+ void animationOff();
+ void animationOn();
+ void loadOverlayStart();
void edit(int, int, char *, int);
int invertSection(int section);
};
Commit: 495f12f815251db2d56ed2ae92d254112659716a
https://github.com/scummvm/scummvm/commit/495f12f815251db2d56ed2ae92d254112659716a
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:34:49Z
Commit Message:
SUPERNOVA: Lifts encapsulation of GameManager Class
Room specific logic needs access to functions that currently are
unavailable to them. Once no further extension or rearchitecture is
rather unlikely, thoughts on encapsulation can be given but for now all
members will be made public.
Changed paths:
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index e6ccaa2..2667d53 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -135,7 +135,6 @@ public:
void processInput();
void executeRoom();
-private:
SupernovaEngine *_vm;
Common::Event *_event;
uint16 _key;
Commit: 7ee596efb210273462478d11ebbc5b73259fe65c
https://github.com/scummvm/scummvm/commit/7ee596efb210273462478d11ebbc5b73259fe65c
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:34:49Z
Commit Message:
SUPERNOVA: Provides rooms with engine pointers
Changed paths:
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index a659c4c..590e905 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -7,6 +7,9 @@
namespace Supernova {
+class GameManager;
+class SupernovaEngine;
+
class Room {
public:
Room() {
@@ -41,6 +44,8 @@ protected:
int _fileNumber;
bool _shown[kMaxSection];
Object _objectState[kMaxObject];
+ SupernovaEngine *_vm;
+ GameManager *_gm;
private:
bool _seen;
@@ -49,7 +54,10 @@ private:
// Room 0
class StartingItems : public Room {
public:
- StartingItems() {
+ StartingItems(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
_fileNumber = -1;
_shown[0] = false;
@@ -72,7 +80,10 @@ public:
// Spaceship
class ShipCorridor : public Room {
public:
- ShipCorridor() {
+ ShipCorridor(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
_fileNumber = 17;
_shown[0] = true;
_shown[1] = false;
@@ -97,7 +108,10 @@ public:
class ShipHall: public Room {
public:
- ShipHall() {
+ ShipHall(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
_fileNumber = 15;
_shown[0] = true;
@@ -114,7 +128,10 @@ public:
class ShipSleepCabin: public Room {
public:
- ShipSleepCabin() {
+ ShipSleepCabin(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
_fileNumber = 33;
_shown[0] = true;
@@ -131,7 +148,10 @@ public:
class ShipCockpit : public Room {
public:
- ShipCockpit() {
+ ShipCockpit(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
_fileNumber = 9;
_shown[0] = true;
@@ -148,7 +168,10 @@ public:
class ShipCabinL1: public Room {
public:
- ShipCabinL1() {
+ ShipCabinL1(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
_fileNumber = 21;
_shown[0] = true;
_shown[1] = true;
@@ -174,7 +197,10 @@ public:
class ShipCabinL2 : public Room {
public:
- ShipCabinL2() {
+ ShipCabinL2(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
_fileNumber = 21;
_shown[0] = true;
_shown[1] = false;
@@ -226,7 +252,10 @@ public:
class ShipCabinL3 : public Room {
public:
- ShipCabinL3() {
+ ShipCabinL3(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
_fileNumber = 21;
_shown[0] = true;
_shown[1] = false;
@@ -266,7 +295,10 @@ public:
class ShipCabinR1 : public Room {
public:
- ShipCabinR1() {
+ ShipCabinR1(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
_fileNumber = 22;
_shown[0] = true;
_shown[1] = true;
@@ -286,7 +318,10 @@ public:
class ShipCabinR2 : public Room {
public:
- ShipCabinR2() {
+ ShipCabinR2(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
_fileNumber = 22;
_shown[0] = true;
_shown[1] = false;
@@ -309,7 +344,10 @@ public:
class ShipCabinR3 : public Room {
public:
- ShipCabinR3() {
+ ShipCabinR3(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
_fileNumber = 22;
_shown[0] = true;
_shown[1] = false;
@@ -359,7 +397,10 @@ public:
class ShipCabinBathroom : public Room {
public:
- ShipCabinBathroom() {
+ ShipCabinBathroom(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
_fileNumber = 23;
_shown[0] = true;
@@ -371,7 +412,10 @@ public:
class ShipAirlock : public Room {
public:
- ShipAirlock() {
+ ShipAirlock(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
_fileNumber = 34;
_shown[0] = true;
_shown[1] = false;
@@ -396,7 +440,10 @@ public:
class ShipHold : public Room {
public:
- ShipHold() {
+ ShipHold(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
_fileNumber = 24;
_shown[0] = true;
@@ -420,7 +467,10 @@ public:
class ShipLandingModule : public Room {
public:
- ShipLandingModule() {
+ ShipLandingModule(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
_fileNumber = 25;
_shown[0] = true;
@@ -437,7 +487,10 @@ public:
class ShipGenerator : public Room {
public:
- ShipGenerator() {
+ ShipGenerator(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
_fileNumber = 18;
_shown[0] = true;
_shown[1] = false;
@@ -466,7 +519,10 @@ public:
class ShipOuterSpace : public Room {
public:
- ShipOuterSpace() {
+ ShipOuterSpace(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
_fileNumber = 4;
_shown[0] = true;
Commit: f036ebe3d551c1241166fce3ff8a57751a33ec1e
https://github.com/scummvm/scummvm/commit/f036ebe3d551c1241166fce3ff8a57751a33ec1e
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:34:49Z
Commit Message:
SUPERNOVA: Extends Rooms for setting section visibility
Changed paths:
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 590e905..aacec82 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -26,6 +26,10 @@ public:
int getFileNumber() const {
return _fileNumber;
}
+
+ void setSectionVisible(size_t section, bool visible) {
+ _shown[section] = visible;
+ }
bool isSectionVisible(size_t index) const {
return _shown[index];
}
Commit: 8f5e712df0bbfe54fd43179a3e9af60ae2d1da78
https://github.com/scummvm/scummvm/commit/8f5e712df0bbfe54fd43179a3e9af60ae2d1da78
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:34:49Z
Commit Message:
SUPERNOVA: Adds further game logic stubs
Signed-off-by: Joseph-Eugene Winzer <m999 at openmailbox.org>
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index d644be2..52bc379 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -633,7 +633,16 @@ bool GameManager::airless() {
}
void GameManager::processInput() {
- //
+ // STUB
+}
+
+void GameManager::turnoff() {
+ if (_state.powerOff)
+ return;
+
+ _state.powerOff = true;
+ roomBrightness();
+
}
void GameManager::takeObject(Object &obj) {
@@ -667,8 +676,33 @@ void GameManager::roomBrightness() {
// STUB
}
+void GameManager::load_time() {
+ // STUB
+}
+
+void GameManager::saveTime() {
+ // STUB
+}
+
+void GameManager::saveGame(int) {
+ // STUB
+}
+
+void GameManager::errorTemp() {
+ // STUB
+}
+
+void GameManager::wait2(int) {
+ // STUB
+}
+
+void GameManager::screenShake() {
+ // STUB
+}
+
void GameManager::palette() {
// STUB
+ // Adjust palette to brightness parameters and make it current
}
void GameManager::showMenu() {
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 2667d53..d46da28 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -160,6 +160,13 @@ public:
void mouseInput2();
void mouseInput3();
void mouseWait(int);
+ void wait2(int);
+ void turnoff();
+ void screenShake();
+ void load_time();
+ void saveTime();
+ void saveGame(int);
+ void errorTemp();
void roomBrightness();
void palette();
void showMenu();
Commit: 534bd3837069f45c94e07a6ef593550b29abe51e
https://github.com/scummvm/scummvm/commit/534bd3837069f45c94e07a6ef593550b29abe51e
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:34:49Z
Commit Message:
SUPERNOVA: Extends renderText()
Restructures the renderText() function for providing a renderText(text)
overload that starts rendering the string where the last call stopped.
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 52bc379..2e2957f 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -355,6 +355,8 @@ void SupernovaEngine::removeMessage() {
void SupernovaEngine::renderText(const char *text, int x, int y, byte color) {
Graphics::Surface *screen = _system->lockScreen();
byte *cursor = static_cast<byte *>(screen->getBasePtr(x, y));
+ const byte *basePtr = cursor;
+
byte c;
while ((c = *text++) != '\0') {
if (c < 32) {
@@ -380,6 +382,16 @@ void SupernovaEngine::renderText(const char *text, int x, int y, byte color) {
}
}
_system->unlockScreen();
+
+ size_t numChars = cursor - basePtr;
+ size_t absPosition = y * kScreenWidth + x + numChars;
+ _textCursorX = absPosition % kScreenWidth;
+ _textCursorY = absPosition / kScreenWidth;
+ _textColor = color;
+}
+
+void SupernovaEngine::renderText(const char *text) {
+ renderText(text, _textCursorX, _textCursorY, _textColor);
}
void SupernovaEngine::renderBox(int x, int y, int width, int height, byte color) {
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index d46da28..c1dc301 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -91,6 +91,9 @@ public:
byte _brightness;
uint _delay;
bool _messageDisplayed;
+ int _textCursorX;
+ int _textCursorY;
+ int _textColor;
uint getDOSTicks();
void initData();
@@ -109,6 +112,7 @@ public:
void renderMessage(const char *text, MessagePosition position = kMessageNormal);
void removeMessage();
void renderText(const char *text, int x, int y, byte color);
+ void renderText(const char *text);
void renderBox(int x, int y, int width, int height, byte color);
void setColor63(byte value);
};
Commit: f2e3a4d9c458499108d73f1e616517c8b8e841d6
https://github.com/scummvm/scummvm/commit/f2e3a4d9c458499108d73f1e616517c8b8e841d6
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:34:49Z
Commit Message:
SUPERNOVA: Changes return type to int for getDOSTicks()
The maximum return value is 0x1800B0, so easily covered by int
(assuming 32bit+ architecture)
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 2e2957f..5389039 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -165,13 +165,13 @@ Common::Error SupernovaEngine::run() {
}
// Emulates DOS int 1A/00
-uint SupernovaEngine::getDOSTicks() {
+int SupernovaEngine::getDOSTicks() {
TimeDate systemTime;
_system->getTimeAndDate(systemTime);
- return static_cast<uint>((systemTime.tm_hour * 24 +
- systemTime.tm_min * 60 +
- systemTime.tm_sec) * 18.2065);
+ return static_cast<int>((systemTime.tm_hour * 24 +
+ systemTime.tm_min * 60 +
+ systemTime.tm_sec) * 18.2065);
}
void SupernovaEngine::updateEvents() {
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index c1dc301..0068d70 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -95,7 +95,7 @@ public:
int _textCursorY;
int _textColor;
- uint getDOSTicks();
+ int getDOSTicks();
void initData();
void initPalette();
void paletteFadeIn();
Commit: 74b822c220049df185db35f03714c64db6cf360a
https://github.com/scummvm/scummvm/commit/74b822c220049df185db35f03714c64db6cf360a
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:34:49Z
Commit Message:
SUPERNOVA: Refactors and adds GameManager functions
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 5389039..c57e1e9 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -648,7 +648,7 @@ void GameManager::processInput() {
// STUB
}
-void GameManager::turnoff() {
+void GameManager::turnOff() {
if (_state.powerOff)
return;
@@ -656,6 +656,9 @@ void GameManager::turnoff() {
roomBrightness();
}
+void GameManager::turnOn() {
+ // STUB
+}
void GameManager::takeObject(Object &obj) {
if (obj.hasProperty(CARRIED))
@@ -680,7 +683,7 @@ void GameManager::mouseInput3() {
// STUB
}
-void GameManager::mouseWait(int) {
+void GameManager::mouseWait(int delay) {
// STUB
}
@@ -688,7 +691,7 @@ void GameManager::roomBrightness() {
// STUB
}
-void GameManager::load_time() {
+void GameManager::loadTime() {
// STUB
}
@@ -696,15 +699,16 @@ void GameManager::saveTime() {
// STUB
}
-void GameManager::saveGame(int) {
+bool GameManager::saveGame(int number) {
// STUB
+ return false;
}
void GameManager::errorTemp() {
// STUB
}
-void GameManager::wait2(int) {
+void GameManager::wait2(int delay) {
// STUB
}
@@ -717,6 +721,12 @@ void GameManager::palette() {
// Adjust palette to brightness parameters and make it current
}
+void GameManager::shock() {
+ // STUB
+ _vm->playSound(48, 10520);
+ // die
+}
+
void GameManager::showMenu() {
// STUB
}
@@ -733,7 +743,7 @@ void GameManager::animationOn() {
// STUB
}
-void GameManager::edit(int, int, char *, int) {
+void GameManager::edit(char *text, int x, int y, int length) {
// STUB
}
@@ -741,6 +751,19 @@ void GameManager::loadOverlayStart() {
// STUB
}
+void GameManager::openLocker(const Room *room, Object *obj, Object *lock, int section) {
+ _vm->renderImage(room->getFileNumber(), section);
+ obj->setProperty(OPENED);
+ lock->_click = 255;
+ int i = obj->_click;
+ obj->_click = obj->_click2;
+ obj->_click2 = i;
+}
+
+void GameManager::closeLocker(const Room *room, Object *obj, Object *lock, int section) {
+ // STUB
+}
+
int GameManager::invertSection(int section) {
if (section < 128)
section += 128;
@@ -840,7 +863,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
t[0] = 0;
_vm->renderBox(91, 99, 138, 9, kColorDarkBlue);
do {
- edit(91, 100, t, 5);
+ edit(t, 91, 100, 5);
} while ((_key != Common::ASCII_RETURN) && (_key != Common::ASCII_ESCAPE));
f = false;
if (t[0] == ':') {
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 0068d70..5044a1d 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -160,16 +160,18 @@ public:
bool isHelmetOff();
void great(uint number);
bool airless();
+ void shock();
void mouseInput();
void mouseInput2();
void mouseInput3();
- void mouseWait(int);
- void wait2(int);
- void turnoff();
+ void mouseWait(int delay);
+ void wait2(int delay);
+ void turnOff();
+ void turnOn();
void screenShake();
- void load_time();
+ void loadTime();
void saveTime();
- void saveGame(int);
+ bool saveGame(int number);
void errorTemp();
void roomBrightness();
void palette();
@@ -178,7 +180,9 @@ public:
void animationOff();
void animationOn();
void loadOverlayStart();
- void edit(int, int, char *, int);
+ void openLocker(const Room *room, Object *obj, Object *lock, int section);
+ void closeLocker(const Room *room, Object *obj, Object *lock, int section);
+ void edit(char *text, int x, int y, int length);
int invertSection(int section);
};
Commit: e6802ed6334ca510e3add862d4647a648f1f4c98
https://github.com/scummvm/scummvm/commit/e6802ed6334ca510e3add862d4647a648f1f4c98
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:34:49Z
Commit Message:
SUPERNOVA: Refactoring
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index c57e1e9..2549ccc 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -853,7 +853,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
timeToString(_state.timeAlarm)).c_str());
} else if ((verb == ACTION_PRESS) && (obj1._id == WATCH)) {
char *min;
- int stunden, minuten, i;
+ int hours, minutes;
bool f;
animationOff();
_vm->saveScreen(88, 87, 144, 24);
@@ -879,18 +879,18 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
f = true;
}
- for (i = 0; i < strlen(t); i++)
+ for (size_t i = 0; i < strlen(t); i++)
if ((t[i] < '0') || (t[i] > '9')) f = true;
- for (i = 0; i < strlen(min); i++)
+ for (size_t i = 0; i < strlen(min); i++)
if ((min[i] < '0') || (min[i] > '9')) f = true;
- stunden = atoi(t);
- minuten = atoi(min);
- if ((stunden > 23) || (minuten > 59)) f = true;
+ hours = atoi(t);
+ minutes = atoi(min);
+ if ((hours > 23) || (minutes > 59)) f = true;
animationOn();
} while (f && (_key != Common::ASCII_ESCAPE));
_vm->restoreScreen();
if (_key != Common::ASCII_ESCAPE) {
- _state.timeAlarm = (stunden * 60 + minuten) * 1092.3888 + 8;
+ _state.timeAlarm = (hours * 60 + minutes) * 1092.3888 + 8;
_state.timeAlarmSystem = _state.timeAlarm + _state.timeStarting;
_state.alarmOn = (_state.timeAlarmSystem > _vm->getDOSTicks());
}
@@ -1045,11 +1045,11 @@ void GameManager::executeRoom() {
validCommand = _currentRoom->interact(_inputVerb, _inputObject[0], _inputObject[1]);
if (!validCommand) {
switch (_inputVerb) {
- case ACTION_LOOK :
+ case ACTION_LOOK:
_vm->renderMessage(_inputObject[0]._description);
break;
- case ACTION_WALK :
+ case ACTION_WALK:
if (_inputObject[0].hasProperty(CARRIED)) {
// You already carry this.
_vm->renderMessage("Das trgst du doch bei dir.");
@@ -1065,7 +1065,7 @@ void GameManager::executeRoom() {
}
break;
- case ACTION_TAKE :
+ case ACTION_TAKE:
if (_inputObject[0].hasProperty(OPENED)) {
// You already have that
_vm->renderMessage("Das hast du doch schon.");
@@ -1080,7 +1080,7 @@ void GameManager::executeRoom() {
}
break;
- case ACTION_OPEN :
+ case ACTION_OPEN:
if (!_inputObject[0].hasProperty(OPEN)) {
// This can't be opened
_vm->renderMessage("Das lát sich nicht ffnen.");
@@ -1119,12 +1119,12 @@ void GameManager::executeRoom() {
}
break;
- case ACTION_GIVE :
+ case ACTION_GIVE:
if (_inputObject[0].hasProperty(CARRIED)) {
// Better keep it!
_vm->renderMessage("Behalt es lieber!");
- break;
}
+ break;
default:
// This is not possible.
Commit: 932b3669d3f02a102c1df28bbdadafff6fe2fb5f
https://github.com/scummvm/scummvm/commit/932b3669d3f02a102c1df28bbdadafff6fe2fb5f
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:34:49Z
Commit Message:
SUPERNOVA: Adds room specific game logic
This is the game logic for the first act of the game.
It will see restructuring to remove gotos/jumps and hardcoded
differences in game behavior depending on settings (e.g. sound on/off).
Changed paths:
A engines/supernova/rooms.cpp
engines/supernova/module.mk
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/module.mk b/engines/supernova/module.mk
index b63bd2d..7519a3d 100644
--- a/engines/supernova/module.mk
+++ b/engines/supernova/module.mk
@@ -5,6 +5,7 @@ MODULE_OBJS := \
detection.o \
graphics.o \
supernova.o \
+ rooms.o
MODULE_DIRS += \
engines/supernova
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
new file mode 100644
index 0000000..47615ba
--- /dev/null
+++ b/engines/supernova/rooms.cpp
@@ -0,0 +1,986 @@
+#include "common/system.h"
+
+#include "supernova/supernova.h"
+
+namespace Supernova {
+
+bool ShipCorridor::interact(Action verb, Object &obj1, Object &obj2) {
+ if ((verb == ACTION_PRESS) && (obj1._id == BUTTON)) {
+ if (_objectState[6].hasProperty(OPENED)) {
+ _vm->playSound(54, 24020);
+ _objectState[6].disableProperty(OPENED);
+ _vm->renderImage(_gm->_currentRoom->getFileNumber(), 8);
+ _shown[9] = false;
+ _gm->wait2(2);
+ _vm->renderImage(_gm->_currentRoom->getFileNumber(), 7);
+ _shown[8] = false;
+ _gm->wait2(2);
+ _vm->renderImage(_gm->_currentRoom->getFileNumber(), _gm->invertSection(7));
+ } else {
+ _vm->playSound(54, 24020);
+ _objectState[6].setProperty(OPENED);
+ _vm->renderImage(_gm->_currentRoom->getFileNumber(), 7);
+ _gm->wait2(2);
+ _vm->renderImage(_gm->_currentRoom->getFileNumber(), 8);
+ _shown[7] = false;
+ _gm->wait2(2);
+ _vm->renderImage(_gm->_currentRoom->getFileNumber(), 9);
+ _shown[8] = false;
+ }
+ return true;
+ }
+ return false;
+}
+
+bool ShipHall::interact(Action verb, Object &obj1, Object &obj2) {
+ if ((verb == ACTION_OPEN) && (obj1._id == KITCHEN_HATCH)) {
+ _vm->renderMessage("In der Küche warst du schon|oft genug, im Moment hast|du keinen Appetit.");
+ } else if ((verb == ACTION_USE) && Object::combine(obj1,obj2,KEYCARD2,SLEEP_SLOT)) {
+ if (_objectState[2].hasProperty(OPENED)) {
+ _objectState[2].disableProperty(OPENED);
+ _vm->renderImage(_gm->_currentRoom->getFileNumber(), 3);
+ _shown[4] = false;
+ _gm->wait2(2);
+ _vm->renderImage(_gm->_currentRoom->getFileNumber(), 2);
+ _shown[3] = false;
+ _gm->wait2(2);
+ _vm->renderImage(_gm->_currentRoom->getFileNumber(), _gm->invertSection(2));
+ } else {
+ _objectState[2].setProperty(OPENED);
+ _vm->renderImage(_gm->_currentRoom->getFileNumber(), 2);
+ _gm->wait2(2);
+ _vm->renderImage(_gm->_currentRoom->getFileNumber(), 3);
+ _shown[2] = false;
+ _gm->wait2(2);
+ _vm->renderImage(_gm->_currentRoom->getFileNumber(), 4);
+ _shown[3] = false;
+ _gm->great(1);
+ }
+ } else {
+ return false;
+ }
+
+ return true;
+}
+
+bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
+ char input[31];
+ static char codeword_DE[] = "ZWEIUNDVIERZIG";
+ static char codeword_EN[] = "FORTYTWO";
+ int32 l,*energy;
+ Room *r;
+
+ if (((verb == ACTION_LOOK) || (verb == ACTION_USE)) && (obj1._id == COMPUTER)) {
+ _shown[kMaxSection - 1] = true;
+ _shown[4] = false;
+ _vm->renderBox(0,0,320,200,kColorDarkBlue);
+ if (_gm->_state.time == 0) {
+ // Destination reached
+ _vm->renderText("Flugziel erreicht", 60, 95, kColorWhite99);
+ _gm->mouseInput2();
+ } else if (_gm->_state.powerOff) {
+ // Energy depleted
+ _vm->renderText("Energie erschöpft",60,95,kColorWhite99);
+ // Artificial coma interrupted
+ _vm->renderText("Tiefschlafprozess abgebrochen",60,115,kColorWhite99);
+ _gm->mouseInput2();
+ } else if (_shown[5]) {
+ // Sleep duration in days
+ _vm->renderText("Schlafdauer in Tagen:",30,85,kColorWhite99);
+ _vm->renderText(Common::String::format("%d",_gm->_state.timeSleep).c_str(),
+ 150,85,kColorWhite99);
+ _vm->renderText("Bitte legen Sie sich in die angezeigte Schlafkammer.",
+ 30,105,kColorWhite99);
+ _gm->mouseInput2();
+ } else {
+ _vm->renderText("Bitte Passwort eingeben:",100,85,kColorWhite99);
+ input[0] = 0;
+ do {
+ _gm->edit(input,100,105,30);
+ } while ((_gm->_key != Common::ASCII_RETURN) && (_gm->_key != Common::ASCII_ESCAPE));
+ if (_gm->_key == Common::ASCII_ESCAPE) {
+ goto escape;
+ }
+ for (int i = 0; i < 30; ++i) {
+ if ((input[i] >= 'a') && (input[i] <= 'z')) {
+ input[i] -= 'a' - 'A';
+ }
+ }
+ if (strcmp(input,codeword_DE) != 0) {
+ _vm->renderText("Falsches Passwort",100,125,kColorLightRed);
+ _gm->wait2(18);
+ goto escape;
+ }
+ _gm->great(6);
+ _vm->renderBox(0,0,320,200,kColorDarkBlue);
+ _vm->renderText("Schlafdauer in Tagen:",30,85,kColorWhite99);
+ do {
+ _vm->renderBox(150,85,150,8,kColorDarkBlue);
+ input[0] = 0;
+ do {
+ _gm->edit(input,150,85,10);
+ } while ((_gm->_key != Common::ASCII_RETURN) && (_gm->_key != Common::ASCII_ESCAPE));
+ if (_gm->_key == Common::ASCII_ESCAPE) {
+ goto escape;
+ }
+ l = atol(input);
+ for (size_t i = 0; i < strlen(input); i++) {
+ if ((input[i] < '0') || (input[i] > '9')) {
+ l = 0;
+ }
+ }
+ } while (l == 0);
+ _gm->_state.timeSleep = l;
+ _vm->renderText("Bitte legen Sie sich in die angezeigte Schlafkammer.",30,105,kColorWhite99);
+ _gm->wait2(18);
+ _shown[5] = true;
+ }
+ escape:
+ _vm->renderRoom(*this);
+ _gm->showMenu();
+ _gm->drawMapExits();
+ _gm->palette();
+ _shown[kMaxSection - 1] = false;
+ } else if (((verb == ACTION_WALK) || (verb == ACTION_USE)) &&
+ ((obj1._id == CABINS) || (obj1._id == CABIN))) {
+ r = &_gm->_rooms[AIRLOCK];
+ if (!(obj1._id == CABIN) || !(_shown[5])) {
+ _vm->renderMessage("Es würde wenig bringen,|sich in eine Schlafkammer zu legen,|die nicht eingeschaltet ist.");
+ } else if (r->getObject(5)->hasProperty(WORN)) {
+ _vm->renderMessage("Dazu mußt du erst den Raumanzug ausziehen.");
+ } else {
+ _vm->paletteFadeOut();
+ _vm->renderImage(_gm->_currentRoom->getFileNumber(), _gm->invertSection(5));
+ _vm->renderImage(_gm->_currentRoom->getFileNumber(), _gm->invertSection(4));
+ r = &_gm->_rooms[GENERATOR];
+ if (r->isSectionVisible(9)) {
+ energy = &_gm->_state.landingModuleEnergy;
+ } else {
+ energy = &_gm->_state.shipEnergy;
+ }
+ if (_gm->_state.timeSleep > _gm->_state.time) {
+ _gm->_state.timeSleep = _gm->_state.time;
+ }
+ if (_gm->_state.timeSleep >= *energy) {
+ _gm->_state.timeSleep = *energy;
+ if (r->isSectionVisible(9)) {
+ r = &_gm->_rooms[LANDINGMODULE]; // Monitors off
+ r->setSectionVisible(2, false);
+ r->setSectionVisible(7, false);
+ r->setSectionVisible(8, false);
+ r->setSectionVisible(9, false);
+ r->setSectionVisible(10, false);
+ }
+ }
+ if (_gm->_state.timeSleep == _gm->_state.time) {
+ _vm->renderImage(_gm->_currentRoom->getFileNumber(), 3); // landed
+ r = &_gm->_rooms[COCKPIT];
+ r->setSectionVisible(23, true);
+ r = &_gm->_rooms[CABIN_R2];
+ r->setSectionVisible(5, false);
+ r->setSectionVisible(6, true);
+ r->getObject(2)->_click = 10;
+ r = &_gm->_rooms[HOLD];
+ r->setSectionVisible(0, false);
+ r->setSectionVisible(1, true);
+ r->getObject(1)->_click = 255;
+ r->getObject(3)->_click = 255;
+ r = &_gm->_rooms[GENERATOR];
+ r->setSectionVisible(6, false);
+ r->setSectionVisible(7, true);
+ r->getObject(1)->_click = 14;
+ if (r->isSectionVisible(1)) {
+ r->setSectionVisible(10, true);
+ }
+ if (r->isSectionVisible(12)) {
+ r->setSectionVisible(12, false);
+ r->setSectionVisible(11, true);
+ }
+ }
+ _gm->_state.time -= _gm->_state.timeSleep;
+ *energy -= _gm->_state.timeSleep;
+ _gm->_state.timeStarting = _vm->getDOSTicks() - 786520; // 12pm
+ _gm->_state.timeAlarmSystem = _gm->_state.timeAlarm + _gm->_state.timeStarting;
+ _gm->_state.alarmOn = (_gm->_state.timeAlarmSystem > _vm->getDOSTicks());
+ if (!*energy) {
+ _gm->turnOff();
+ r = &_gm->_rooms[GENERATOR];
+ r->setSectionVisible(4, r->isSectionVisible(2));
+ }
+ if (_gm->_state.time == 0) {
+ _gm->saveTime();
+ if (!_gm->saveGame(-2))
+ _gm->errorTemp();
+ _gm->_state.dream = true;
+ _gm->loadTime();
+ }
+ _gm->wait2(18);
+ _vm->paletteFadeIn();
+ if (_gm->_state.time == 0) {
+ _vm->playSound(45);
+ _gm->screenShake();
+ _gm->wait2(18);
+ _vm->renderMessage("Was war das?");
+ }
+ }
+ } else {
+ return false;
+ }
+
+ return true;
+}
+
+void ShipSleepCabin::animation() {
+ static char color;
+
+ if (this->isSectionVisible(kMaxSection - 1)) {
+ if (color) {
+ color = kColorBlack;
+ _gm->_timer2 = 5;
+ } else {
+ color = kColorLightYellow;
+ _gm->_timer2 = 10;
+ }
+ _vm->renderText("Achtung: Triebwerke funktionsunfähig",50,145,color);
+ } else {
+ if (this->isSectionVisible(21)) {
+ _vm->renderImage(this->getFileNumber(), _gm->invertSection(21));
+ _gm->_timer2 = 5;
+ } else {
+ _vm->renderImage(this->getFileNumber(), 21);
+ _gm->_timer2 = 10;
+ }
+ }
+ if (_gm->_state.powerOff) {
+ if (this->isSectionVisible(kMaxSection - 1)) {
+ _vm->renderText("Energievorrat erschöpft",97,165,color);
+ _vm->renderText("Notstromversorgung aktiv",97,175,color);
+ } else {
+ if (this->isSectionVisible(21)) {
+ _vm->renderImage(this->getFileNumber(), 22);
+ } else {
+ _vm->renderImage(this->getFileNumber(), _gm->invertSection(22));
+ }
+ }
+ }
+}
+void ShipSleepCabin::onEntrance() {
+ if (_gm->_state.dream && (_gm->_rooms[CAVE].getObject(1)->_exitRoom == MEETUP3)) {
+ _vm->renderMessage("Du wachst mit brummendem Schädel auf|und merkst, daß du nur geträumt hast.");
+ _gm->mouseWait(_gm->_timer1);
+ _vm->removeMessage();
+ _vm->renderMessage("Beim Aufprall des Raumschiffs|mußt du mit dem Kopf aufgeschlagen|und bewußtlos geworden sein.");
+ _gm->mouseWait(_gm->_timer1);
+ _vm->removeMessage();
+ _vm->renderMessage("Was steht dir jetzt wohl wirklich bevor?");
+ _gm->_state.dream = false;
+ }
+}
+
+bool ShipCockpit::interact(Action verb, Object &obj1, Object &obj2) {
+ char c[2] = {0};
+
+ if ((verb == ACTION_LOOK) && (obj1._id == MONITOR)) {
+ this->setSectionVisible(kMaxSection - 1, true);
+ _vm->renderBox(0, 0, 320, 200, kColorBlack);
+ _vm->renderText("Geschwindigkeit: ", 50, 50, kColorLightYellow);
+ if (_gm->_state.time)
+ _vm->renderText("8000 hpm");
+ else
+ _vm->renderText("0 hpm");
+ _vm->renderText("Ziel: Arsano 3", 50, 70, kColorLightYellow);
+ _vm->renderText("Entfernung: ", 50, 90, kColorLightYellow);
+ _vm->renderText(Common::String::format("%d", _gm->_state.time / 400).c_str());
+ _vm->renderText(",");
+ c[0] = (_gm->_state.time / 40) % 10 + '0';
+ _vm->renderText(c);
+ c[0] = (_gm->_state.time / 4) % 10 + '0';
+ _vm->renderText(c);
+ _vm->renderText(" Lichtjahre");
+ _vm->renderText("Dauer der Reise bei momentaner Geschwindigkeit:", 50, 110, 14);
+ _vm->renderText(Common::String::format("%d", _gm->_state.time).c_str(), 50, 120, kColorLightYellow);
+ _vm->renderText(" Tage");
+ _gm->mouseInput2();
+ this->setSectionVisible(kMaxSection - 1, false);
+ _vm->renderRoom(*this);
+ _gm->showMenu();
+ _gm->drawMapExits();
+ _vm->paletteBrightness();
+ } else if ((verb == ACTION_USE) && (obj1._id == INSTRUMENTS))
+ _vm->renderMessage("Vergiá nicht, du bist nur der|Schiffskoch und hast keine Ahnung,|wie man ein Raumschiff fliegt.");
+ else
+ return false;
+
+ return true;
+}
+void ShipCockpit::animation() {
+ static char color;
+
+ if (this->isSectionVisible(kMaxSection - 1)) {
+ if (color) {
+ color = 0;
+ _gm->_timer2 = 5;
+ } else {
+ color = 14;
+ _gm->_timer2 = 10;
+ }
+ _vm->renderText("Achtung: Triebwerke funktionsunfhig", 50, 145, color);
+ } else {
+ if (this->isSectionVisible(21)) {
+ _vm->renderImage(this->getFileNumber(), _gm->invertSection(21));
+ _gm->_timer2 = 5;
+ } else {
+ _vm->renderImage(this->getFileNumber(), 21);
+ _gm->_timer2 = 10;
+ }
+ }
+ if (_gm->_state.powerOff) {
+ if (this->isSectionVisible(kMaxSection - 1)) {
+ _vm->renderText("Energievorrat erschpft", 97, 165, color);
+ _vm->renderText("Notstromversorgung aktiv", 97, 175, color);
+ } else {
+ if (this->isSectionVisible(21))
+ _vm->renderImage(this->getFileNumber(), 22);
+ else
+ _vm->renderImage(this->getFileNumber(), _gm->invertSection(22));
+ }
+ }
+}
+
+void ShipCockpit::onEntrance() {
+ if (!hasSeen())
+ _vm->renderMessage("Was?! Keiner im Cockpit!|Die sind wohl verrckt!");
+ setRoomSeen(true);
+}
+
+bool ShipCabinL2::interact(Action verb, Object &obj1, Object &obj2) {
+ if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL1, KEYCARD2)) {
+ _gm->openLocker(this, this->getObject(4), this->getObject(0), 17);
+ if (this->getObject(5)->_click == 255)
+ _vm->renderImage(this->getFileNumber(), 20); // Remove Pistol
+ _gm->great(2);
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL2, KEYCARD2)) {
+ _gm->openLocker(this, this->getObject(6), this->getObject(1), 18);
+ _gm->great(2);
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL3, KEYCARD2)) {
+ _gm->openLocker(this, this->getObject(8), this->getObject(2), 19);
+ if (this->getObject(9)->_click == 255)
+ _vm->renderImage(this->getFileNumber(), 21); // Remove cable spool
+ _gm->great(2);
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL4, KEYCARD2)) {
+ _gm->openLocker(this, this->getObject(10), this->getObject(3), 22);
+ if (this->getObject(11)->_click == 255)
+ _vm->renderImage(this->getFileNumber(), 23); // Remove book
+ _gm->great(2);
+ }
+
+ else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L1)) {
+ _gm->closeLocker(this, this->getObject(4), this->getObject(0), 17);
+ this->setSectionVisible(20, false);
+ } else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L2))
+ _gm->closeLocker(this, this->getObject(6), this->getObject(1), 18);
+ else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L3)) {
+ _gm->closeLocker(this, this->getObject(8), this->getObject(2), 19);
+ this->setSectionVisible(21, false);
+ } else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L4)) {
+ _gm->closeLocker(this, this->getObject(10), this->getObject(3), 22);
+ this->setSectionVisible(23, false);
+ }
+
+ else if ((verb == ACTION_TAKE) && (obj1._id == SPOOL) &&
+ !(obj1.hasProperty(CARRIED))) {
+ this->getObject(8)->_click = 42; // empty shelf
+ return false;
+ } else if ((verb == ACTION_TAKE) && (obj1._id == BOOK2) &&
+ !(obj1.hasProperty(CARRIED))) {
+ this->getObject(10)->_click = 47; // empty shelf
+ return false;
+ } else
+ return false;
+
+ return true;
+}
+
+bool ShipCabinL3::interact(Action verb, Object &obj1, Object &obj2) {
+ Room *r;
+
+ if ((verb == ACTION_USE) && Object::combine(obj1, obj2, RECORD, TURNTABLE)) {
+ if (this->isSectionVisible(kMaxSection - 1) || this->isSectionVisible(15))
+ _vm->renderMessage("Du hast die Platte schon aufgelegt.");
+ else {
+ if (!this->getObject(4)->hasProperty(CARRIED))
+ _vm->renderImage(this->getFileNumber(), _gm->invertSection(8));
+ else
+ _gm->_inventory.remove(*this->getObject(4));
+ _vm->renderImage(this->getFileNumber(), 15);
+ this->getObject(4)->_click = 48;
+ }
+ } else if ((verb == ACTION_PRESS) && (obj1._id == TURNTABLE_BUTTON)) {
+ if (!this->isSectionVisible(15)) {
+ _vm->renderMessage("Es ist doch gar keine Platte aufgelegt.");
+ } else if (!this->isSectionVisible(10) &&
+ !this->isSectionVisible(11) &&
+ this->isSectionVisible(12)) {
+ if (_gm->_soundDevice != 2) {
+ _vm->renderImage(this->getFileNumber(), 14);
+ this->setSectionVisible(15, false);
+ for (int i = 3; i; i--) {
+ _vm->playSound(48, 13530);
+ if (_gm->_soundDevice) {
+ do {
+ if (this->isSectionVisible(13)) {
+ _vm->renderImage(this->getFileNumber(), 14);
+ this->setSectionVisible(13, false);
+ } else {
+ _vm->renderImage(this->getFileNumber(), 13);
+ this->setSectionVisible(14, false);
+ }
+ _gm->wait2(3);
+ } while (_gm->_status);
+ } else {
+ _gm->wait2(1);
+ }
+ }
+ } else {
+ for (int i = 10; i; i--) {
+ _vm->renderImage(this->getFileNumber(), 14);
+ _gm->wait2(3);
+ _vm->renderImage(this->getFileNumber(), 13);
+ _gm->wait2(3);
+ }
+ }
+ _vm->renderImage(this->getFileNumber(), 15);
+ this->setSectionVisible(14, false);
+ this->setSectionVisible(13, false);
+ _vm->renderMessage("Die Platte scheint einen Sprung zu haben.");
+ }
+ } else if ((verb == ACTION_TAKE) && (obj1._id == RECORD) &&
+ (obj1._click != 15)) {
+ _vm->renderImage(this->getFileNumber(), 9);
+ this->setSectionVisible(13, false);
+ this->setSectionVisible(14, false);
+ this->setSectionVisible(15, false);
+ obj1._section = 0;
+ _gm->takeObject(obj1);
+ } else if ((verb == ACTION_PULL) && (obj1._id == PLUG)) {
+ _vm->renderImage(this->getFileNumber(), 10);
+ this->setSectionVisible(7, false);
+ obj1._click = 21;
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, PLUG, SOCKET)) {
+ _vm->renderImage(this->getFileNumber(), 7);
+ this->setSectionVisible(10, false);
+ this->getObject(10)->_click = 20;
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, WIRE2))
+ _vm->renderMessage("Schneid doch besser ein|lngeres Stck Kabel ab!");
+ else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, WIRE)) {
+ r = &_gm->_rooms[AIRLOCK];
+ if (!this->isSectionVisible(10) && !r->getObject(5)->hasProperty(WORN)) {
+ _vm->renderImage(this->getFileNumber(), 25);
+ _gm->shock();
+ }
+ _vm->renderImage(this->getFileNumber(), 11);
+ _vm->renderImage(this->getFileNumber(), 26);
+ this->setSectionVisible(12, false);
+ } else if ((verb == ACTION_TAKE) &&
+ ((obj1._id == WIRE) || (obj1._id == WIRE2) || (obj1._id == PLUG))) {
+ if (this->isSectionVisible(10) && this->isSectionVisible(11)) {
+ _vm->renderImage(this->getFileNumber(), _gm->invertSection(10));
+ _vm->renderImage(this->getFileNumber(), _gm->invertSection(11));
+ this->getObject(8)->_name = "Leitung mit Stecker";
+ _gm->takeObject(*this->getObject(8));
+ this->getObject(9)->_click = 255;
+ this->getObject(10)->_click = 255;
+ } else {
+ _vm->renderMessage("Das ist befestigt.");
+ }
+ } else {
+ return false;
+ }
+
+ return true;
+}
+
+bool ShipCabinR3::interact(Action verb, Object &obj1, Object &obj2) {
+ if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K1, KEYCARD)) {
+ _gm->openLocker(this, this->getObject(6), this->getObject(2), 9);
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K2, KEYCARD)) {
+ _gm->openLocker(this, this->getObject(8), this->getObject(3), 10);
+ if (this->getObject(9)->_click == 255)
+ _vm->renderImage(this->getFileNumber(), 12); // Remove rope
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K3, KEYCARD)) {
+ _gm->openLocker(this, this->getObject(10), this->getObject(4), 11);
+ if (this->getObject(17)->_click == 255)
+ _vm->renderImage(this->getFileNumber(), 16); // Remove Discman
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K4, KEYCARD)) {
+ _gm->openLocker(this, this->getObject(15), this->getObject(5), 13);
+ if (this->getObject(16)->_click == 255)
+ _vm->renderImage(this->getFileNumber(), 14); // Remove book
+ }
+
+ else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF1))
+ _gm->closeLocker(this, this->getObject(6), this->getObject(2), 9);
+ else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF2)) {
+ this->setSectionVisible(12, false);
+ _gm->closeLocker(this, this->getObject(8), this->getObject(3), 10);
+ } else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF3)) {
+ this->setSectionVisible(16, false);
+ _gm->closeLocker(this, this->getObject(10), this->getObject(4), 11);
+ } else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF4)) {
+ this->setSectionVisible(14, false);
+ this->setSectionVisible(14, false);
+ _gm->closeLocker(this, this->getObject(15), this->getObject(5), 13);
+ }
+
+ else if ((verb == ACTION_TAKE) && (obj1._id == DISCMAN) &&
+ !_gm->_rooms[0].getObject(3)->hasProperty(CARRIED)) {
+ this->getObject(10)->_click = 34; // Locker empty
+ obj1._click = 255;
+ _gm->takeObject(*_gm->_rooms[0].getObject(3));
+ _vm->renderImage(this->getFileNumber(), 16);
+ } else if ((verb == ACTION_TAKE) && (obj1._id == ROPE) &&
+ obj1.hasProperty(CARRIED)) {
+ this->getObject(8)->_click = 31; // Shelf empty
+ return false;
+ } else if ((verb == ACTION_TAKE) && (obj1._id == BOOK) &&
+ !obj1.hasProperty(CARRIED)) {
+ this->getObject(15)->_click = 32; // Shelf empty
+ return false;
+ } else
+ return false;
+
+ return true;
+}
+
+
+bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) {
+ Room *r;
+
+ if ((verb == ACTION_PRESS) && (obj1._id == BUTTON1)) {
+ if (!this->getObject(1)->hasProperty(OPENED)) {
+ _vm->renderImage(this->getFileNumber(), 10);
+ _vm->playSound(54, 24020);
+ if (this->getObject(0)->hasProperty(OPENED)) {
+ this->getObject(0)->disableProperty(OPENED);
+ _vm->renderImage(this->getFileNumber(), 1);
+ _gm->wait2(2);
+ _vm->renderImage(this->getFileNumber(), 2);
+ this->setSectionVisible(1, false);
+ _gm->wait2(2);
+ _vm->renderImage(this->getFileNumber(), 3);
+ this->setSectionVisible(2, false);
+ } else {
+ this->getObject(0)->setProperty(OPENED);
+ _vm->renderImage(this->getFileNumber(), 2);
+ this->setSectionVisible(3, false);
+ _gm->wait2(2);
+ _vm->renderImage(this->getFileNumber(), 1);
+ this->setSectionVisible(2, false);
+ _gm->wait2(2);
+ _vm->renderImage(this->getFileNumber(), 1 + 128);
+ }
+ _vm->renderImage(this->getFileNumber(), _gm->invertSection(10));
+ }
+ } else if ((verb == ACTION_PRESS) && (obj1._id == BUTTON2)) {
+ if (!this->getObject(0)->hasProperty(OPENED)) {
+ _vm->renderImage(this->getFileNumber(), 11);
+ if (this->getObject(1)->hasProperty(OPENED)) {
+ _vm->playSound(54, 24020);
+ this->getObject(1)->disableProperty(OPENED);
+ _vm->renderImage(this->getFileNumber(), 4);
+ _gm->wait2(2);
+ _vm->renderImage(this->getFileNumber(), 5);
+ this->setSectionVisible(4, false);
+ _gm->wait2(2);
+ _vm->renderImage(this->getFileNumber(), 6);
+ this->setSectionVisible(5, false);
+ _vm->renderImage(this->getFileNumber(), 16);
+ this->setSectionVisible(17, false);
+ _gm->wait2(3);
+ _vm->renderImage(this->getFileNumber(), 15);
+ this->setSectionVisible(16, false);
+ _gm->wait2(3);
+ _vm->renderImage(this->getFileNumber(), 14);
+ this->setSectionVisible(15, false);
+ _gm->wait2(3);
+ _vm->renderImage(this->getFileNumber(), 13);
+ this->setSectionVisible(14, false);
+ _gm->wait2(3);
+ _vm->renderImage(this->getFileNumber(), 12);
+ this->setSectionVisible(13, false);
+ _gm->wait2(3);
+ _vm->renderImage(this->getFileNumber(), _gm->invertSection(12));
+ } else {
+ this->getObject(1)->setProperty(OPENED);
+ _vm->renderImage(this->getFileNumber(), 12);
+ _gm->wait2(3);
+ _vm->renderImage(this->getFileNumber(), 13);
+ this->setSectionVisible(12, false);
+ _gm->wait2(3);
+ _vm->renderImage(this->getFileNumber(), 14);
+ this->setSectionVisible(13, false);
+ _gm->wait2(3);
+ _vm->renderImage(this->getFileNumber(), 15);
+ this->setSectionVisible(14, false);
+ _gm->wait2(3);
+ _vm->renderImage(this->getFileNumber(), 16);
+ this->setSectionVisible(15, false);
+ _gm->wait2(3);
+ _vm->renderImage(this->getFileNumber(), 17);
+ this->setSectionVisible(16, false);
+ _vm->playSound(54, 24020);
+ _vm->renderImage(this->getFileNumber(), 5);
+ this->setSectionVisible(6, false);
+ _gm->wait2(2);
+ _vm->renderImage(this->getFileNumber(), 4);
+ this->setSectionVisible(5, false);
+ _gm->wait2(2);
+ _vm->renderImage(this->getFileNumber(), _gm->invertSection(4));
+ r = &_gm->_rooms[AIRLOCK];
+ if (!r->getObject(4)->hasProperty(WORN) ||
+ !r->getObject(5)->hasProperty(WORN) ||
+ !r->getObject(6)->hasProperty(WORN)) {
+// longjmp(dead, "Zu niedriger Luftdruck soll ungesund sein.");
+ }
+ }
+ _vm->renderImage(this->getFileNumber(), 11 + 128);
+ }
+ } else if ((verb == ACTION_LOOK) && (obj1._id == MANOMETER)) {
+ if (this->getObject(1)->hasProperty(OPENED))
+ _vm->renderMessage("Er zeigt Null an.");
+ else
+ _vm->renderMessage("Er zeigt Normaldruck an.");
+ } else
+ return false;
+
+ return true;
+}
+
+void ShipAirlock::onEntrance() {
+ if (!this->hasSeen())
+ _vm->renderMessage("Komisch, es ist nur|noch ein Raumanzug da.");
+
+ this->setRoomSeen(true);
+}
+
+bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
+ static char beschr2[] = "Ein Stck Schrott.";
+ Room *r;
+
+ if ((verb == ACTION_LOOK) && (obj1._id == SCRAP_LK) &&
+ (obj1._description != beschr2)) {
+ _vm->renderMessage(obj1._description);
+ obj1._description = beschr2;
+ _gm->takeObject(*this->getObject(2));
+ } else if (((verb == ACTION_OPEN) || (verb == ACTION_CLOSE)) &&
+ (obj1._id == OUTERHATCH_TOP)) {
+ _vm->renderMessage("Du muát erst hingehen.");
+ } else if ((verb == ACTION_CLOSE) && (obj1._id == LANDINGMOD_HATCH) &&
+ (this->isSectionVisible(4) || this->isSectionVisible(6)))
+ _vm->renderMessage("Das Kabel ist im Weg.");
+ else if (((verb == ACTION_TAKE) && (obj1._id == HOLD_WIRE)) ||
+ ((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, LANDINGMOD_HATCH)))
+ _vm->renderMessage("Das Kabel ist schon ganz|richtig an dieser Stelle.");
+ else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, HOLD_WIRE)) {
+ this->getObject(0)->_name = "Leitung mit Lsterklemme";
+ _gm->_inventory.remove(*this->getObject(2));
+ _gm->_state.terminalStripConnected = true;
+ _gm->_state.terminalStripWire = true;
+ _vm->renderMessage("Ok.");
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, SPOOL)) {
+ if (!_gm->_state.terminalStripConnected)
+ _vm->renderMessage("Womit denn?");
+ else {
+ _vm->renderImage(this->getFileNumber(), 5);
+ this->getObject(0)->_name = "langes Kabel mit Stecker";
+ this->getObject(0)->_click = 10;
+ r = &_gm->_rooms[CABIN_L2];
+ _gm->_inventory.remove(*this->getObject(9));
+ }
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, GENERATOR_TOP)) {
+ if (this->isSectionVisible(5)) {
+ r = &_gm->_rooms[GENERATOR];
+ r->getObject(0)->_click = 15;
+ r->getObject(1)->_click = 13;
+ r->setSectionVisible(6, false);
+ r->setSectionVisible(8, false);
+ _vm->renderImage(this->getFileNumber(), _gm->invertSection(5));
+ _vm->renderImage(this->getFileNumber(), 6);
+ this->setSectionVisible(4, false);
+ this->getObject(0)->_click = 11;
+ } else {
+ _vm->renderMessage("Die Leitung ist zu kurz.");
+ }
+ } else {
+ return false;
+ }
+
+ return true;
+}
+
+void ShipHold::onEntrance() {
+ if (!this->hasSeen())
+ _vm->renderMessage("Was ist denn das fr ein Chaos?|Und auáerdem fehlt das Notraumschiff!|Jetzt wird mir einiges klar.|Die anderen sind geflchtet,|und ich habe es verpennt.");
+ this->setRoomSeen(true);
+ _gm->_rooms[COCKPIT].setRoomSeen(true);
+}
+
+bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
+ Room *r;
+ if ((verb == ACTION_PRESS) && (obj1._id == LANDINGMOD_BUTTON))
+ _vm->renderMessage(obj1._description);
+ else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, PEN, LANDINGMOD_BUTTON)) {
+ if (_gm->_state.landingModuleEnergy) {
+ r = &_gm->_rooms[GENERATOR];
+ if (this->isSectionVisible(7)) {
+ _vm->renderImage(this->getFileNumber(), _gm->invertSection(9));
+ _vm->renderImage(this->getFileNumber(), _gm->invertSection(2));
+ _vm->renderImage(this->getFileNumber(), _gm->invertSection(8));
+ _vm->renderImage(this->getFileNumber(), _gm->invertSection(7));
+ _vm->renderImage(this->getFileNumber(), _gm->invertSection(10));
+ if (r->isSectionVisible(9))
+ _gm->_state.powerOff = true;
+ _gm->roomBrightness();
+ _vm->paletteBrightness();
+ } else {
+ _vm->renderImage(this->getFileNumber(), 7);
+ if (r->isSectionVisible(9))
+ _gm->_state.powerOff = false;
+// load("MSN_DATA.025");
+ _gm->roomBrightness();
+ _vm->paletteBrightness();
+ r = &_gm->_rooms[SLEEP];
+ r->setSectionVisible(1, false);
+ r->setSectionVisible(2, false);
+ _gm->wait2(2);
+ _vm->renderImage(this->getFileNumber(), 2);
+ _gm->wait2(3);
+ _vm->renderImage(this->getFileNumber(), 8);
+ _gm->wait2(2);
+ _vm->renderImage(this->getFileNumber(), 9);
+ _gm->wait2(1);
+ _vm->renderImage(this->getFileNumber(), 10);
+ }
+ }
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, LANDINGMOD_BUTTON))
+ _vm->renderMessage("Es ist nicht spitz genug.");
+ else if ((verb == ACTION_LOOK) && (obj1._id == LANDINGMOD_MONITOR) &&
+ this->isSectionVisible(7))
+ _vm->renderMessage("Du wirst aus den Anzeigen nicht schlau.");
+ else if ((verb == ACTION_USE) && (obj1._id == KEYBOARD))
+ _vm->renderMessage("Laá lieber die Finger davon!");
+ else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, WIRE, LANDINGMOD_SOCKET)) {
+ r = &_gm->_rooms[CABIN_L3];
+ _gm->_inventory.remove(*r->getObject(8));
+ this->getObject(4)->_name = r->getObject(8)->_name;
+ _vm->renderImage(this->getFileNumber(), 4);
+ if (_gm->_state.cableConnected) {
+ _vm->renderImage(this->getFileNumber(), 5);
+ this->getObject(4)->_click = 6;
+ } else {
+ this->getObject(4)->_click = 5;
+ if (_gm->_state.terminalStripWire)
+ _vm->renderImage(this->getFileNumber(), 11);
+ }
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SPOOL, LANDINGMOD_SOCKET))
+ _vm->renderMessage("An dem Kabel ist doch gar kein Stecker.");
+ else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, TERMINALSTRIP)) {
+ _vm->renderImage(this->getFileNumber(), 11);
+ this->getObject(4)->_name = "Leitung mit Lsterklemme";
+ r = &_gm->_rooms[HOLD];
+ _gm->_inventory.remove(*r->getObject(2));
+ _gm->_state.terminalStripConnected = true;
+ _gm->_state.terminalStripWire = true;
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, SPOOL)) {
+ if (!_gm->_state.terminalStripConnected)
+ _vm->renderMessage("Womit denn?");
+ else {
+ _vm->renderImage(this->getFileNumber(), 5);
+ this->getObject(4)->_name = "langes Kabel mit Stecker";
+ this->getObject(4)->_click = 6;
+ r = &_gm->_rooms[CABIN_L2];
+ _gm->_inventory.remove(*r->getObject(9));
+ }
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, LANDINGMOD_HATCH)) {
+ if (this->getObject(5)->hasProperty(OPENED)) {
+ r = &_gm->_rooms[HOLD];
+ if (this->isSectionVisible(5)) {
+ _gm->_rooms[HOLD].setSectionVisible(5, false);
+ r->getObject(0)->_click = 10;
+
+ } else
+ r->getObject(0)->_click = 9;
+ _gm->_rooms[HOLD].setSectionVisible(4, false);
+ r->getObject(0)->_name = this->getObject(4)->_name;
+ _vm->renderImage(this->getFileNumber(), _gm->invertSection(5));
+ _vm->renderImage(this->getFileNumber(), _gm->invertSection(4));
+ this->setSectionVisible(11, false);
+ _vm->renderImage(this->getFileNumber(), 6);
+ this->getObject(4)->_click = 7;
+ } else {
+ _vm->renderMessage("Du solltest die Luke vielleicht erst ffnen.");
+ }
+ } else if ((verb == ACTION_CLOSE) && (obj1._id == LANDINGMOD_HATCH) &&
+ this->isSectionVisible(6)) {
+ _vm->renderMessage("Das Kabel ist im Weg.");
+ } else if (((verb == ACTION_TAKE) || (verb == ACTION_PULL)) &&
+ (obj1._id == LANDINGMOD_WIRE)) {
+ _vm->renderMessage("Das Kabel ist schon ganz|richtig an dieser Stelle.");
+ } else {
+ return false;
+ }
+
+ return true;
+}
+
+bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
+ Room *r;
+
+ if ((verb == ACTION_OPEN) && (obj1._id == OUTERHATCH)) {
+ if (obj1.hasProperty(OPENED))
+ return false;
+ _vm->playSound(54, 24020);
+ _vm->renderImage(this->getFileNumber(), 1);
+ if (this->isSectionVisible(7))
+ _vm->renderImage(this->getFileNumber(), 10);
+ if (this->isSectionVisible(13))
+ _vm->renderImage(this->getFileNumber(), 13);
+ _gm->_rooms[HOLD].setSectionVisible(3, true);
+ obj1.setProperty(OPENED);
+ obj1._click = 2;
+ _vm->playSound(54, 30030);
+ } else if ((verb == ACTION_CLOSE) && (obj1._id == OUTERHATCH)) {
+ if (!obj1.hasProperty(OPENED))
+ return false;
+ if (this->isSectionVisible(11) || this->isSectionVisible(12)) {
+ _vm->renderMessage("Das Seil ist im Weg.");
+ } else {
+ _vm->playSound(54, 24020);
+ _vm->renderImage(this->getFileNumber(), _gm->invertSection(1));
+ this->setSectionVisible(10, false);
+ if (this->isSectionVisible(13))
+ _vm->renderImage(this->getFileNumber(), 13);
+ _gm->_rooms[HOLD].setSectionVisible(3, false);
+ obj1.disableProperty(OPENED);
+ obj1._click = 1;
+ _vm->playSound(54, 31040);
+ }
+ } else if ((verb == ACTION_WALK) && (obj1._id == OUTERHATCH) &&
+ this->isSectionVisible(7)) {
+ if (!obj1.hasProperty(OPENED))
+ _vm->renderMessage("Das ist geschlossen.");
+ else if (!this->isSectionVisible(11))
+ _vm->renderMessage("Das geht nicht.|Die Luke ist mindestens|5 Meter ber dem Boden.");
+ else {
+ obj1._exitRoom = ROCKS;
+ return false;
+ }
+ } else if ((verb == ACTION_TAKE) && (obj1._id == KEYCARD2)) {
+ obj1._name = "Keycard des Commanders";
+ return false;
+ } else if ((verb == ACTION_TAKE) && (obj1._id == GENERATOR_WIRE))
+ _vm->renderMessage("Das Kabel ist schon ganz|richtig an dieser Stelle.");
+ else if ((verb == ACTION_PULL) && (obj1._id == SHORT_WIRE) &&
+ (obj1._click != 11)) {
+ _vm->renderImage(this->getFileNumber(), 3);
+ _vm->renderImage(this->getFileNumber(), 4);
+ obj1._click = 11;
+ _gm->turnOff();
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SHORT_WIRE, CLIP) &&
+ (this->getObject(11)->_click == 11) && !this->isSectionVisible(9)) {
+ _vm->renderImage(this->getFileNumber(), 2);
+ this->setSectionVisible(3, false);
+ this->setSectionVisible(4, false);
+ this->getObject(11)->_click = 10;
+ if (_gm->_state.shipEnergy)
+ _gm->turnOn();
+ else
+ _vm->renderImage(this->getFileNumber(), 4);
+ } else if ((verb == ACTION_OPEN) && (obj1._id == TRAP)) {
+ _vm->playSound(54, 24020);
+ _vm->renderImage(this->getFileNumber(), 2);
+ if (this->getObject(11)->_click == 11)
+ _vm->renderImage(this->getFileNumber(), 3);
+ if (_gm->_state.powerOff)
+ _vm->renderImage(this->getFileNumber(), 4);
+ obj1.setProperty(OPENED);
+ obj1._click = 6;
+
+ obj1._click2 = 5;
+ _vm->playSound(54, 30030);
+ } else if ((verb == ACTION_CLOSE) && (obj1._id == TRAP)) {
+ if (this->isSectionVisible(9))
+ _vm->renderMessage("Das Kabel ist im Weg.");
+ else {
+ this->setSectionVisible(3, false);
+ return false;
+ }
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, GENERATOR_WIRE, CLIP) &&
+ this->isSectionVisible(3) && (this->getObject(0)->_click != 16)) {
+ _vm->renderImage(this->getFileNumber(), _gm->invertSection(8));
+ _vm->renderImage(this->getFileNumber(), 2);
+ this->setSectionVisible(4, false);
+ _vm->renderImage(this->getFileNumber(), 3);
+ _vm->renderImage(this->getFileNumber(), 9);
+ this->getObject(0)->_click = 16;
+ r = &_gm->_rooms[LANDINGMODULE];
+ if (_gm->_state.landingModuleEnergy && r->isSectionVisible(7))
+ _gm->turnOn();
+ else
+ _vm->renderImage(this->getFileNumber(), 4);
+ _gm->_rooms[HOLD].setSectionVisible(7, true);
+ _gm->great(3);
+ } else if ((verb == ACTION_PULL) && (obj1._id == GENERATOR_WIRE) &&
+ (obj1._click == 16)) {
+ _vm->renderImage(this->getFileNumber(), _gm->invertSection(9));
+ _vm->renderImage(this->getFileNumber(), 2);
+ _vm->renderImage(this->getFileNumber(), 3);
+ _vm->renderImage(this->getFileNumber(), 4);
+ _vm->renderImage(this->getFileNumber(), 8);
+ obj1._click = 15;
+ _gm->turnOff();
+ _gm->_rooms[HOLD].setSectionVisible(7, false);
+ } else if ((verb == ACTION_USE) &&
+ (Object::combine(obj1, obj2, WIRE, CLIP) ||
+ Object::combine(obj1, obj2, SPOOL, CLIP)) &&
+ this->isSectionVisible(3)) {
+ _vm->renderMessage("Was ntzt dir der Anschluá|ohne eine Stromquelle?!");
+ } else if ((verb == ACTION_LOOK) && (obj1._id == VOLTMETER)) {
+ if (_gm->_state.powerOff)
+ _vm->renderMessage("Die Spannung ist auf Null abgesunken.");
+ else
+ _vm->renderMessage("Es zeigt volle Spannung an.");
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LADDER, ROPE)) {
+ _vm->renderImage(this->getFileNumber(), 13);
+ r = &_gm->_rooms[CABIN_R3];
+ _gm->_inventory.remove(*r->getObject(9));
+ this->getObject(3)->_click = 18;
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, OUTERHATCH, GENERATOR_ROPE)) {
+ if (!this->isSectionVisible(1))
+ _vm->renderMessage("Du muát die Luke erst ffnen.");
+ else {
+ _vm->renderImage(this->getFileNumber(), _gm->invertSection(13));
+ _vm->renderImage(this->getFileNumber(), 1);
+ if (this->isSectionVisible(7)) {
+ _vm->renderImage(this->getFileNumber(), 10);
+ _vm->renderImage(this->getFileNumber(), 11);
+ } else {
+ _vm->renderImage(this->getFileNumber(), 12);
+ }
+ r = &_gm->_rooms[OUTSIDE];
+ r->setSectionVisible(1, true);
+ r->getObject(1)->_click = 1;
+ this->getObject(3)->_click = 17;
+ }
+ } else if ((verb == ACTION_TAKE) && (obj1._id == GENERATOR_ROPE)) {
+ _vm->renderMessage("Das Seil ist hier schon ganz richtig.");
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, OUTERHATCH, GENERATOR_WIRE) &&
+ this->isSectionVisible(1)) {
+ _vm->renderMessage("Das Kabel ist zu kurz.");
+ } else {
+ return false;
+ }
+
+ return true;
+}
+
+}
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 2549ccc..d76f584 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -562,23 +562,23 @@ static const char *timeToString(int t) {
}
GameManager::GameManager(SupernovaEngine *vm, Common::Event *event) {
-// _rooms[INTRO] = StartingItems();
-// _rooms[CORRIDOR] = ShipCorridor();
-// _rooms[HALL] = ShipHall();
-// _rooms[SLEEP] = ShipSleepCabin();
-// _rooms[COCKPIT] = ShipCockpit();
-// _rooms[AIRLOCK] = ShipAirlock();
-// _rooms[HOLD] = ShipHold();
-// _rooms[LANDINGMODULE] = ShipLandingModule();
-// _rooms[GENERATOR] = ShipGenerator();
-// _rooms[OUTSIDE] = ShipOuterSpace();
-// _rooms[CABIN_R1] = ShipCabinR1();
-// _rooms[CABIN_R2] = ShipCabinR2();
-// _rooms[CABIN_R3] = ShipCabinR3();
-// _rooms[CABIN_L1] = ShipCabinL1();
-// _rooms[CABIN_L2] = ShipCabinL2();
-// _rooms[CABIN_L3] = ShipCabinL3();
-// _rooms[BATHROOM] = ShipCabinBathroom();
+ _rooms[INTRO] = StartingItems(vm, this);
+ _rooms[CORRIDOR] = ShipCorridor(vm, this);
+ _rooms[HALL] = ShipHall(vm, this);
+ _rooms[SLEEP] = ShipSleepCabin(vm, this);
+ _rooms[COCKPIT] = ShipCockpit(vm, this);
+ _rooms[AIRLOCK] = ShipAirlock(vm, this);
+ _rooms[HOLD] = ShipHold(vm, this);
+ _rooms[LANDINGMODULE] = ShipLandingModule(vm, this);
+ _rooms[GENERATOR] = ShipGenerator(vm, this);
+ _rooms[OUTSIDE] = ShipOuterSpace(vm, this);
+ _rooms[CABIN_R1] = ShipCabinR1(vm, this);
+ _rooms[CABIN_R2] = ShipCabinR2(vm, this);
+ _rooms[CABIN_R3] = ShipCabinR3(vm, this);
+ _rooms[CABIN_L1] = ShipCabinL1(vm, this);
+ _rooms[CABIN_L2] = ShipCabinL2(vm, this);
+ _rooms[CABIN_L3] = ShipCabinL3(vm, this);
+ _rooms[BATHROOM] = ShipCabinBathroom(vm, this);
// _rooms[ROCKS]
// _rooms[CAVE]
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 5044a1d..a63beb1 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -146,6 +146,7 @@ public:
Room _rooms[kRoomsNum];
Inventory _inventory;
GameState _state;
+ int _status;
Action _inputVerb;
Object _inputObject[2];
bool _waitEvent;
@@ -153,6 +154,8 @@ public:
bool _newOverlay;
int _timer1;
int _timer2;
+ // 0 PC Speaker | 1 SoundBlaster | 2 No Sound
+ int _soundDevice;
void takeObject(Object &obj);
Commit: 38e9e2d3e7c686559e6b6d856449627a9386deeb
https://github.com/scummvm/scummvm/commit/38e9e2d3e7c686559e6b6d856449627a9386deeb
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:34:49Z
Commit Message:
SUPERNOVA: Adds missing copyright notes
Changed paths:
engines/supernova/graphics.cpp
engines/supernova/graphics.h
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
engines/supernova/rooms.h
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index 2abbdb1..79087bf 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -1,3 +1,25 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
#include "common/algorithm.h"
#include "common/file.h"
#include "common/stream.h"
diff --git a/engines/supernova/graphics.h b/engines/supernova/graphics.h
index 462e9ea..72218ed 100644
--- a/engines/supernova/graphics.h
+++ b/engines/supernova/graphics.h
@@ -1,3 +1,25 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
#ifndef GRAPHICS_H
#define GRAPHICS_H
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 2eba8ec..81138f1 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -1,3 +1,25 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
#ifndef MSN_DEF_H
#define MSN_DEF_H
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 47615ba..ce43e96 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -1,3 +1,25 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
#include "common/system.h"
#include "supernova/supernova.h"
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index aacec82..611f4c2 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -1,3 +1,25 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
#ifndef ROOMS_H
#define ROOMS_H
Commit: a3b6352050df7f04f8700d6696965b6855eee4c8
https://github.com/scummvm/scummvm/commit/a3b6352050df7f04f8700d6696965b6855eee4c8
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:34:49Z
Commit Message:
SUPERNOVA: Formatting
Changed paths:
engines/supernova/graphics.h
diff --git a/engines/supernova/graphics.h b/engines/supernova/graphics.h
index 72218ed..1190510 100644
--- a/engines/supernova/graphics.h
+++ b/engines/supernova/graphics.h
@@ -45,16 +45,16 @@ public:
virtual bool loadStream(Common::SeekableReadStream &stream);
virtual const Graphics::Surface *getSurface() const { return _surface; }
virtual const byte *getPalette() const { return _palette; }
-
+
bool loadSection(int _section);
static const int kMaxSections = 50;
static const int kMaxClickFields = 80;
-
+
Graphics::Surface *_surface;
byte *_palette;
byte *_encodedImage;
-
+
struct Section {
int16 x1;
int16 x2;
Commit: 7da3ab2611f28aa5a05582c1fec799a371c35c59
https://github.com/scummvm/scummvm/commit/7da3ab2611f28aa5a05582c1fec799a371c35c59
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:34:50Z
Commit Message:
SUPERNOVA: Enables rendering of debug console
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index d76f584..b83e901 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -154,6 +154,7 @@ Common::Error SupernovaEngine::run() {
renderImage(_imageIndex, _sectionIndex, true);
renderText(Common::String::format("%3d | %3d", _imageIndex, _sectionIndex).c_str(),
10, 190, kColorLightGreen);
+ _console->onFrame();
_system->updateScreen();
_system->delayMillis(_delay);
}
Commit: 29021aa7dd2461e85de82799349de00d0c6e3994
https://github.com/scummvm/scummvm/commit/29021aa7dd2461e85de82799349de00d0c6e3994
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:40:27Z
Commit Message:
SUPERNOVA: Refactoring
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index b83e901..6c29e57 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -222,7 +222,6 @@ void SupernovaEngine::renderImage(int filenumber, int section, bool fullscreen)
error("File %s could not be read!", file.getName());
}
- _currentImageFilenumber = filenumber;
if (_currentImage.loadStream(file) && _currentImage.loadSection(section)) {
_system->getPaletteManager()->setPalette(_currentImage.getPalette(), 16, 239);
paletteBrightness();
@@ -1092,7 +1091,7 @@ void GameManager::executeRoom() {
// This is locked.
_vm->renderMessage("Das ist verschlossen.");
} else {
- _vm->renderImage(_vm->_currentImageFilenumber, _inputObject[0]._section);
+ _vm->renderImage(_currentRoom->getFileNumber(), _inputObject[0]._section);
_inputObject[0].setProperty(OPENED);
byte i = _inputObject[0]._click;
_inputObject[0]._click = _inputObject[0]._click2;
@@ -1111,7 +1110,7 @@ void GameManager::executeRoom() {
// This is already closed.
_vm->renderMessage("Das ist schon geschlossen.");
} else {
- _vm->renderImage(_vm->_currentImageFilenumber, invertSection(_inputObject[0]._section));
+ _vm->renderImage(_currentRoom->getFileNumber(), invertSection(_inputObject[0]._section));
_inputObject[0].disableProperty(OPENED);
byte i = _inputObject[0]._click;
_inputObject[0]._click = _inputObject[0]._click2;
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index a63beb1..801637a 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -81,7 +81,6 @@ public:
Audio::SoundHandle _soundHandle;
ScreenBufferStack _screenBuffer;
MSNImageDecoder _currentImage;
- int _currentImageFilenumber;
Common::Event _event;
bool _gameRunning;
Commit: be5f3a631931a3ec7f07c5e2168064d98d48698f
https://github.com/scummvm/scummvm/commit/be5f3a631931a3ec7f07c5e2168064d98d48698f
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:40:38Z
Commit Message:
SUPERNOVA: Fixes file name creation
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 6c29e57..c491154 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -72,7 +72,7 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)
, _console(NULL)
, _brightness(255)
, _menuBrightness(255)
- , _imageIndex(10)
+ , _imageIndex(0)
, _sectionIndex(0)
, _delay(33)
, _gameRunning(true)
@@ -218,7 +218,7 @@ void playSoundMod(int filenumber)
void SupernovaEngine::renderImage(int filenumber, int section, bool fullscreen) {
Common::File file;
- if (!file.open(Common::String::format("msn_data.0%2d", filenumber))) {
+ if (!file.open(Common::String::format("msn_data.%03d", filenumber))) {
error("File %s could not be read!", file.getName());
}
Commit: 5ebe90a45e86b0d9ad88a068cb3d80b2f5f52c86
https://github.com/scummvm/scummvm/commit/5ebe90a45e86b0d9ad88a068cb3d80b2f5f52c86
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:42:02Z
Commit Message:
SUPERNOVA: Implements loading of newspaper images
While the 640x480 images are loaded correctly, they are displayed
cropped to 320x240, the default resolution.
Changed paths:
engines/supernova/graphics.cpp
engines/supernova/graphics.h
engines/supernova/supernova.cpp
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index 79087bf..ae71db6 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -123,48 +123,72 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
return true;
}
-bool MSNImageDecoder::loadSection(int section) {
+bool MSNImageDecoder::loadSection(int filenumber, int section) {
+ int imageWidth = 320;
+ int imageHeight = 200;
_surface = new Graphics::Surface;
- _surface->create(320, 200, g_system->getScreenFormat());
- byte *surfacePixels = static_cast<byte *>(_surface->getPixels());
-
- const uint32 kInvalidAddress = 0x00FFFFFF;
-
- size_t image = section;
- if (image < 128) {
- do {
- uint32 offset = (_section[image].addressHigh << 16) + _section[image].addressLow;
- if (offset == kInvalidAddress || _section[image].x2 == 0) {
- return false;
- }
- int width = _section[image].x2 - _section[image].x1 + 1;
- int height = _section[image].y2 - _section[image].y1 + 1;
- uint32 destAddress = 320 * _section[image].y1 + _section[image].x1;
- while (height) {
- Common::copy(_encodedImage + offset, _encodedImage + offset + width, surfacePixels + destAddress);
- offset += width;
- destAddress += 320;
- --height;
- }
-
- image = _section[image].next;
- } while (image != 0);
+ _filenumber = filenumber;
+
+ if (filenumber == 1 || filenumber == 2) {
+ imageWidth = 640;
+ imageHeight = 480;
+ _pitch = 640;
+
+ _surface->create(imageWidth, imageHeight, g_system->getScreenFormat());
+ byte *surfacePixels = static_cast<byte *>(_surface->getPixels());
+ for (int i = 0; i < imageWidth * imageHeight / 8; ++i) {
+ *surfacePixels++ = (_encodedImage[i] & 0x80) ? 11 : 0;
+ *surfacePixels++ = (_encodedImage[i] & 0x40) ? 11 : 0;
+ *surfacePixels++ = (_encodedImage[i] & 0x20) ? 11 : 0;
+ *surfacePixels++ = (_encodedImage[i] & 0x10) ? 11 : 0;
+ *surfacePixels++ = (_encodedImage[i] & 0x08) ? 11 : 0;
+ *surfacePixels++ = (_encodedImage[i] & 0x04) ? 11 : 0;
+ *surfacePixels++ = (_encodedImage[i] & 0x02) ? 11 : 0;
+ *surfacePixels++ = (_encodedImage[i] & 0x01) ? 11 : 0;
+ }
} else {
- image -= 128;
- do {
- int width = _section[image].x2 - _section[image].x1 + 1;
- int height = _section[image].y2 - _section[image].y1 + 1;
- uint32 destAddress = 320 * _section[image].y1 + _section[image].x1;
- uint32 offset = (_section[image].addressHigh << 16) + _section[image].addressLow + destAddress;
- while (height) {
- Common::copy(_encodedImage + offset, _encodedImage + offset + width, surfacePixels + destAddress);
- offset += 320;
- destAddress += 320;
- --height;
- }
-
- image = _section[image].next;
- } while (image != 0);
+ _pitch = 320;
+ _surface->create(imageWidth, imageHeight, g_system->getScreenFormat());
+ byte *surfacePixels = static_cast<byte *>(_surface->getPixels());
+
+ const uint32 kInvalidAddress = 0x00FFFFFF;
+
+ size_t image = section;
+ if (image < 128) {
+ do {
+ uint32 offset = (_section[image].addressHigh << 16) + _section[image].addressLow;
+ if (offset == kInvalidAddress || _section[image].x2 == 0) {
+ return false;
+ }
+ int width = _section[image].x2 - _section[image].x1 + 1;
+ int height = _section[image].y2 - _section[image].y1 + 1;
+ uint32 destAddress = imageWidth * _section[image].y1 + _section[image].x1;
+ while (height) {
+ Common::copy(_encodedImage + offset, _encodedImage + offset + width, surfacePixels + destAddress);
+ offset += width;
+ destAddress += imageWidth;
+ --height;
+ }
+
+ image = _section[image].next;
+ } while (image != 0);
+ } else {
+ image -= 128;
+ do {
+ int width = _section[image].x2 - _section[image].x1 + 1;
+ int height = _section[image].y2 - _section[image].y1 + 1;
+ uint32 destAddress = imageWidth * _section[image].y1 + _section[image].x1;
+ uint32 offset = (_section[image].addressHigh << 16) + _section[image].addressLow + destAddress;
+ while (height) {
+ Common::copy(_encodedImage + offset, _encodedImage + offset + width, surfacePixels + destAddress);
+ offset += imageWidth;
+ destAddress += imageWidth;
+ --height;
+ }
+
+ image = _section[image].next;
+ } while (image != 0);
+ }
}
return true;
diff --git a/engines/supernova/graphics.h b/engines/supernova/graphics.h
index 1190510..d41b707 100644
--- a/engines/supernova/graphics.h
+++ b/engines/supernova/graphics.h
@@ -46,11 +46,13 @@ public:
virtual const Graphics::Surface *getSurface() const { return _surface; }
virtual const byte *getPalette() const { return _palette; }
- bool loadSection(int _section);
+ bool loadSection(int filenumber, int section);
static const int kMaxSections = 50;
static const int kMaxClickFields = 80;
+ int _filenumber;
+ int _pitch;
Graphics::Surface *_surface;
byte *_palette;
byte *_encodedImage;
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index c491154..e00875f 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -222,11 +222,12 @@ void SupernovaEngine::renderImage(int filenumber, int section, bool fullscreen)
error("File %s could not be read!", file.getName());
}
- if (_currentImage.loadStream(file) && _currentImage.loadSection(section)) {
+ if (_currentImage.loadStream(file) && _currentImage.loadSection(filenumber, section)) {
_system->getPaletteManager()->setPalette(_currentImage.getPalette(), 16, 239);
paletteBrightness();
if (fullscreen) {
- _system->copyRectToScreen(_currentImage.getSurface()->getPixels(), 320, 0, 0, 320, 200);
+ _system->copyRectToScreen(_currentImage.getSurface()->getPixels(),
+ _currentImage._pitch, 0, 0, kScreenWidth, kScreenHeight);
} else {
size_t offset = _currentImage._section[section].y1 * 320 + _currentImage._section[section].x1;
_system->copyRectToScreen(static_cast<const byte *>(_currentImage.getSurface()->getPixels()) + offset,
Commit: 018cff8c4252aa41989974ef639af955dee516c2
https://github.com/scummvm/scummvm/commit/018cff8c4252aa41989974ef639af955dee516c2
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:42:07Z
Commit Message:
SUPERNOVA: Enables debug console and preload images
Changed paths:
engines/supernova/console.cpp
engines/supernova/console.h
engines/supernova/graphics.cpp
engines/supernova/graphics.h
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/console.cpp b/engines/supernova/console.cpp
index 7ad9c0a..98875ec 100644
--- a/engines/supernova/console.cpp
+++ b/engines/supernova/console.cpp
@@ -27,20 +27,60 @@
namespace Supernova {
-Console::Console(SupernovaEngine *vm)
+Console::Console(SupernovaEngine *vm, GameManager *gm)
{
- registerCmd("test", WRAP_METHOD(Console, cmdTest));
+ registerCmd("render", WRAP_METHOD(Console, cmdRenderImage));
+ registerCmd("play", WRAP_METHOD(Console, cmdPlaySound));
+ registerCmd("list", WRAP_METHOD(Console, cmdList));
+ registerCmd("inventory", WRAP_METHOD(Console, cmdInventory));
+
+ _vm = vm;
+ _gm = gm;
}
-bool Console::cmdTest(int argc, const char **argv)
-{
- if (argc == 2) {
- debugPrintf("Success!");
+bool Console::cmdRenderImage(int argc, const char **argv) {
+ if (argc != 3) {
+ debugPrintf("Usage: render [filenumber] [section]\n");
return true;
- } else {
- debugPrintf("Failure!");
- return false;
}
+
+ int filenumber = atoi(argv[1]);
+ int section = atoi(argv[2]);
+
+ _vm->renderImage(atoi(argv[1]), atoi(argv[2]));
+
+ return true;
+}
+
+bool Console::cmdPlaySound(int argc, const char **argv) {
+ if (argc != 3) {
+ debugPrintf("Usage: play [filenumber] [offset]\n");
+ return true;
+ }
+
+ int filenumber = atoi(argv[1]);
+ int offset = atoi(argv[2]);
+
+ _vm->playSound(filenumber, offset);
+
+ return true;
+}
+
+bool Console::cmdList(int argc, const char **argv) {
+ // Objects in room and sections
+
+ return true;
+}
+
+bool Console::cmdInventory(int argc, const char **argv) {
+ if (argc != 2 || argc != 3) {
+ debugPrintf("Usage: inventory [list][add/remove [object]]");
+ return true;
+ }
+
+ // TODO
+
+ return true;
}
}
diff --git a/engines/supernova/console.h b/engines/supernova/console.h
index 89e8a1c..19efe47 100644
--- a/engines/supernova/console.h
+++ b/engines/supernova/console.h
@@ -28,6 +28,7 @@
namespace Supernova {
class SupernovaEngine;
+class GameManager;
enum {
kDebugGeneral = 1 << 0
@@ -35,12 +36,16 @@ enum {
class Console : public GUI::Debugger {
public:
- Console(Supernova::SupernovaEngine *vm);
+ Console(Supernova::SupernovaEngine *vm, Supernova::GameManager *gm);
virtual ~Console() {}
-
- bool cmdTest(int argc, const char **argv);
+
+ bool cmdRenderImage(int argc, const char **argv);
+ bool cmdPlaySound(int argc, const char **argv);
+ bool cmdList(int argc, const char **argv);
+ bool cmdInventory(int argc, const char **argv);
private:
SupernovaEngine *_vm;
+ GameManager *_gm;
};
}
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index ae71db6..d594389 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -41,6 +41,18 @@ MSNImageDecoder::~MSNImageDecoder() {
destroy();
}
+bool MSNImageDecoder::init(int filenumber) {
+ Common::File file;
+ if (!file.open(Common::String::format("msn_data.%03d", filenumber))) {
+ error("File %s could not be read!", file.getName());
+ }
+
+ _filenumber = filenumber;
+ loadStream(file);
+
+ return true;
+}
+
bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
destroy();
@@ -68,13 +80,13 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
}
}
- byte numSections = stream.readByte();
+ _numSections = stream.readByte();
for (size_t i = 0; i < kMaxSections; ++i) {
_section[i].addressHigh = 0xff;
_section[i].addressLow = 0xffff;
_section[i].x2 = 0;
}
- for (int i = 0; i < numSections; ++i) {
+ for (int i = 0; i < _numSections; ++i) {
_section[i].x1 = stream.readUint16LE();
_section[i].x2 = stream.readUint16LE();
_section[i].y1 = stream.readByte();
@@ -84,8 +96,8 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
_section[i].addressHigh = stream.readByte();
}
- byte numClickFields = stream.readByte();
- for (int i = 0; i < numClickFields; ++i) {
+ _numClickFields = stream.readByte();
+ for (int i = 0; i < _numClickFields; ++i) {
_clickField[i].x1 = stream.readUint16LE();
_clickField[i].x2 = stream.readUint16LE();
_clickField[i].y1 = stream.readByte();
@@ -101,7 +113,7 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
byte input = 0;
size_t i = 0;
- // wat
+
while (stream.read(&input, 1)) {
if (input < numRepeat) {
++input;
@@ -123,13 +135,16 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
return true;
}
-bool MSNImageDecoder::loadSection(int filenumber, int section) {
+bool MSNImageDecoder::loadSection(int section) {
int imageWidth = 320;
int imageHeight = 200;
+
+ if (_surface)
+ _surface->free();
+
_surface = new Graphics::Surface;
- _filenumber = filenumber;
- if (filenumber == 1 || filenumber == 2) {
+ if (_filenumber == 1 || _filenumber == 2) {
imageWidth = 640;
imageHeight = 480;
_pitch = 640;
diff --git a/engines/supernova/graphics.h b/engines/supernova/graphics.h
index d41b707..3bd2bfd 100644
--- a/engines/supernova/graphics.h
+++ b/engines/supernova/graphics.h
@@ -46,13 +46,16 @@ public:
virtual const Graphics::Surface *getSurface() const { return _surface; }
virtual const byte *getPalette() const { return _palette; }
- bool loadSection(int filenumber, int section);
+ bool loadSection(int section);
+ bool init(int filenumber);
static const int kMaxSections = 50;
static const int kMaxClickFields = 80;
int _filenumber;
int _pitch;
+ int _numSections;
+ int _numClickFields;
Graphics::Surface *_surface;
byte *_palette;
byte *_encodedImage;
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index e00875f..ede216d 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -70,6 +70,7 @@ ObjectType &operator^=(ObjectType &a, ObjectType b) {
SupernovaEngine::SupernovaEngine(OSystem *syst)
: Engine(syst)
, _console(NULL)
+ , _currentImage(_images)
, _brightness(255)
, _menuBrightness(255)
, _imageIndex(0)
@@ -95,12 +96,12 @@ SupernovaEngine::~SupernovaEngine() {
Common::Error SupernovaEngine::run() {
initGraphics(kScreenWidth, kScreenHeight);
- _console = new Console(this);
+ GameManager gm(this, &_event);
+ _console = new Console(this, &gm);
initData();
initPalette();
paletteFadeIn();
- GameManager gm(this, &_event);
CursorMan.showMouse(true);
@@ -117,23 +118,6 @@ Common::Error SupernovaEngine::run() {
if (_event.kbd.keycode == Common::KEYCODE_d && _event.kbd.hasFlags(Common::KBD_CTRL)) {
_console->attach();
}
- if (_event.kbd.keycode == Common::KEYCODE_q) {
- playSound(48, 13530);
- }
- if (_event.kbd.keycode == Common::KEYCODE_RIGHT) {
- ++_imageIndex;
- _sectionIndex = 0;
- }
- if (_event.kbd.keycode == Common::KEYCODE_LEFT) {
- --_imageIndex;
- _sectionIndex = 0;
- }
- if (_event.kbd.keycode == Common::KEYCODE_UP) {
- ++_sectionIndex;
- }
- if (_event.kbd.keycode == Common::KEYCODE_DOWN) {
- --_sectionIndex;
- }
break;
case Common::EVENT_LBUTTONUP:
@@ -151,10 +135,9 @@ Common::Error SupernovaEngine::run() {
// gm.processInput();
}
- renderImage(_imageIndex, _sectionIndex, true);
+ _console->onFrame();
renderText(Common::String::format("%3d | %3d", _imageIndex, _sectionIndex).c_str(),
10, 190, kColorLightGreen);
- _console->onFrame();
_system->updateScreen();
_system->delayMillis(_delay);
}
@@ -179,6 +162,11 @@ void SupernovaEngine::updateEvents() {
}
void SupernovaEngine::initData() {
+ // Images
+ for (int i = 0; i < 44; ++i)
+ _images[i].init(i);
+
+ // Sound
}
void SupernovaEngine::initPalette() {
@@ -202,44 +190,46 @@ void SupernovaEngine::stopSound() {
_mixer->stopHandle(_soundHandle);
}
-void playSoundMod(int filenumber)
+void SupernovaEngine::playSoundMod(int filenumber)
{
if (filenumber != 49 || filenumber != 52) {
error("File not supposed to be played!");
}
Common::File *file = new Common::File;
- if (!file->open(Common::String::format("msn_data.0%2d", filenumber))) {
+ if (!file->open(Common::String::format("msn_data.%03d", filenumber))) {
error("File %s could not be read!", file->getName());
}
// play Supernova MOD file
}
-void SupernovaEngine::renderImage(int filenumber, int section, bool fullscreen) {
- Common::File file;
- if (!file.open(Common::String::format("msn_data.%03d", filenumber))) {
- error("File %s could not be read!", file.getName());
- }
+void SupernovaEngine::renderImage(MSNImageDecoder &image, int section, bool fullscreen) {
+ _currentImage = ℑ
+ _imageIndex = image._filenumber;
+ _sectionIndex = section;
- if (_currentImage.loadStream(file) && _currentImage.loadSection(filenumber, section)) {
- _system->getPaletteManager()->setPalette(_currentImage.getPalette(), 16, 239);
- paletteBrightness();
- if (fullscreen) {
- _system->copyRectToScreen(_currentImage.getSurface()->getPixels(),
- _currentImage._pitch, 0, 0, kScreenWidth, kScreenHeight);
- } else {
- size_t offset = _currentImage._section[section].y1 * 320 + _currentImage._section[section].x1;
- _system->copyRectToScreen(static_cast<const byte *>(_currentImage.getSurface()->getPixels()) + offset,
- 320,
- _currentImage._section[section].x1,
- _currentImage._section[section].y1,
- _currentImage._section[section].x2 - _currentImage._section[section].x1,
- _currentImage._section[section].y2 - _currentImage._section[section].y1);
- }
+ image.loadSection(section);
+ _system->getPaletteManager()->setPalette(image.getPalette(), 16, 239);
+ paletteBrightness();
+ if (fullscreen) {
+ _system->copyRectToScreen(image.getSurface()->getPixels(),
+ image._pitch, 0, 0, kScreenWidth, kScreenHeight);
+ } else {
+ size_t offset = image._section[section].y1 * 320 + image._section[section].x1;
+ _system->copyRectToScreen(static_cast<const byte *>(image.getSurface()->getPixels()) + offset,
+ 320,
+ image._section[section].x1,
+ image._section[section].y1,
+ image._section[section].x2 - image._section[section].x1,
+ image._section[section].y2 - image._section[section].y1);
}
}
+void SupernovaEngine::renderImage(int filenumber, int section, bool fullscreen) {
+ renderImage(_images[filenumber], section, fullscreen);
+}
+
void SupernovaEngine::saveScreen(int x, int y, int width, int height) {
_screenBuffer.push(x, y, width, height);
}
@@ -410,8 +400,8 @@ void SupernovaEngine::paletteBrightness() {
}
for (size_t i = 0; i < 717; ++i) {
const byte *imagePalette;
- if (_currentImage.getPalette()) {
- imagePalette = _currentImage.getPalette();
+ if (_currentImage->getPalette()) {
+ imagePalette = _currentImage->getPalette();
} else {
imagePalette = palette;
}
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 801637a..01049a2 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -80,7 +80,8 @@ public:
Console *_console;
Audio::SoundHandle _soundHandle;
ScreenBufferStack _screenBuffer;
- MSNImageDecoder _currentImage;
+ MSNImageDecoder _images[44];
+ MSNImageDecoder *_currentImage;
Common::Event _event;
bool _gameRunning;
@@ -104,6 +105,7 @@ public:
void playSound(int filenumber, int offset = 0);
void playSoundMod(int filenumber);
void stopSound();
+ void renderImage(MSNImageDecoder &image, int section, bool fullscreen = false);
void renderImage(int filenumber, int section, bool fullscreen = false);
void saveScreen(int x, int y, int width, int height);
void restoreScreen();
Commit: 6c4768a051b64f14af47c343f589b3bee34aba0a
https://github.com/scummvm/scummvm/commit/6c4768a051b64f14af47c343f589b3bee34aba0a
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:42:07Z
Commit Message:
SUPERNOVA: Reformatting
Substitute size_t with ScummVM defined uint type
Changed paths:
engines/supernova/graphics.cpp
engines/supernova/rooms.cpp
engines/supernova/rooms.h
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index d594389..90d149b 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -56,7 +56,7 @@ bool MSNImageDecoder::init(int filenumber) {
bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
destroy();
- size_t size = 0;
+ uint size = 0;
size = (stream.readUint16LE() + 0xF) >> 4;
size |= (stream.readUint16LE() & 0xF) << 12;
size += 0x70; // zus_paragraph
@@ -81,7 +81,7 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
}
_numSections = stream.readByte();
- for (size_t i = 0; i < kMaxSections; ++i) {
+ for (uint i = 0; i < kMaxSections; ++i) {
_section[i].addressHigh = 0xff;
_section[i].addressLow = 0xffff;
_section[i].x2 = 0;
@@ -112,7 +112,7 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
numZw += numRepeat;
byte input = 0;
- size_t i = 0;
+ uint i = 0;
while (stream.read(&input, 1)) {
if (input < numRepeat) {
@@ -168,7 +168,7 @@ bool MSNImageDecoder::loadSection(int section) {
const uint32 kInvalidAddress = 0x00FFFFFF;
- size_t image = section;
+ uint image = section;
if (image < 128) {
do {
uint32 offset = (_section[image].addressHigh << 16) + _section[image].addressLow;
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index ce43e96..66013a1 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -146,7 +146,7 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
goto escape;
}
l = atol(input);
- for (size_t i = 0; i < strlen(input); i++) {
+ for (uint i = 0; i < strlen(input); i++) {
if ((input[i] < '0') || (input[i] > '9')) {
l = 0;
}
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 611f4c2..e78f446 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -49,13 +49,13 @@ public:
return _fileNumber;
}
- void setSectionVisible(size_t section, bool visible) {
+ void setSectionVisible(uint section, bool visible) {
_shown[section] = visible;
}
- bool isSectionVisible(size_t index) const {
+ bool isSectionVisible(uint index) const {
return _shown[index];
}
- Object *getObject(size_t index) {
+ Object *getObject(uint index) {
return &_objectState[index];
}
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index ede216d..f8fce4c 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -216,7 +216,7 @@ void SupernovaEngine::renderImage(MSNImageDecoder &image, int section, bool full
_system->copyRectToScreen(image.getSurface()->getPixels(),
image._pitch, 0, 0, kScreenWidth, kScreenHeight);
} else {
- size_t offset = image._section[section].y1 * 320 + image._section[section].x1;
+ uint offset = image._section[section].y1 * 320 + image._section[section].x1;
_system->copyRectToScreen(static_cast<const byte *>(image.getSurface()->getPixels()) + offset,
320,
image._section[section].x1,
@@ -255,7 +255,7 @@ static int characterWidth(const char *text) {
c = 35;
}
- for (size_t i = 0; i < 5; ++i) {
+ for (uint i = 0; i < 5; ++i) {
++charWidth;
if (font[c - 32][i] == 0xff) {
break;
@@ -270,7 +270,7 @@ void SupernovaEngine::renderMessage(const char *text, MessagePosition position)
Common::String t(text);
char *row[20];
Common::String::iterator p = t.begin();
- size_t numRows = 0;
+ uint numRows = 0;
int rowWidthMax = 0;
int x = 0;
int y = 0;
@@ -287,7 +287,7 @@ void SupernovaEngine::renderMessage(const char *text, MessagePosition position)
++p;
}
}
- for (size_t i = 0; i < numRows; ++i) {
+ for (uint i = 0; i < numRows; ++i) {
int rowWidth = characterWidth(row[i]);
if (rowWidth > rowWidthMax)
rowWidthMax = rowWidth;
@@ -329,7 +329,7 @@ void SupernovaEngine::renderMessage(const char *text, MessagePosition position)
int message_width = rowWidthMax + 6;
int message_height = numRows * 9 + 5;
renderBox(message_columns, message_rows, message_width, message_height, HGR_MELD);
- for (size_t i = 0; i < numRows; ++i) {
+ for (uint i = 0; i < numRows; ++i) {
renderText(row[i], x, y, textColor);
y += 9;
}
@@ -356,7 +356,7 @@ void SupernovaEngine::renderText(const char *text, int x, int y, byte color) {
c = 128;
}
- for (size_t i = 0; i < 5; ++i) {
+ for (uint i = 0; i < 5; ++i) {
if (font[c - 32][i] == 0xff) {
++cursor;
break;
@@ -374,8 +374,8 @@ void SupernovaEngine::renderText(const char *text, int x, int y, byte color) {
}
_system->unlockScreen();
- size_t numChars = cursor - basePtr;
- size_t absPosition = y * kScreenWidth + x + numChars;
+ uint numChars = cursor - basePtr;
+ uint absPosition = y * kScreenWidth + x + numChars;
_textCursorX = absPosition % kScreenWidth;
_textCursorY = absPosition / kScreenWidth;
_textColor = color;
@@ -395,10 +395,10 @@ void SupernovaEngine::paletteBrightness() {
byte palette[768];
_system->getPaletteManager()->grabPalette(palette, 0, 255);
- for (size_t i = 0; i < 48; ++i) {
+ for (uint i = 0; i < 48; ++i) {
palette[i] = (initVGAPalette[i] * _menuBrightness) >> 8;
}
- for (size_t i = 0; i < 717; ++i) {
+ for (uint i = 0; i < 717; ++i) {
const byte *imagePalette;
if (_currentImage->getPalette()) {
imagePalette = _currentImage->getPalette();
@@ -465,7 +465,7 @@ void Inventory::add(Object &obj) {
// TODO: Update Inventory surface for scrolling
void Inventory::remove(Object &obj) {
- for (size_t i = 0; i < _numObjects; ++i) {
+ for (uint i = 0; i < _numObjects; ++i) {
if (_inventory[i] == &obj) {
--_numObjects;
while (i < _numObjects) {
@@ -477,7 +477,7 @@ void Inventory::remove(Object &obj) {
}
}
-Object *Inventory::get(size_t index) const {
+Object *Inventory::get(uint index) const {
if (index < _numObjects)
return _inventory[index];
@@ -485,7 +485,7 @@ Object *Inventory::get(size_t index) const {
}
Object *Inventory::get(ObjectID id) const {
- for (size_t i = 0; i < _numObjects; ++i) {
+ for (uint i = 0; i < _numObjects; ++i) {
if (_inventory[i]->_id == id)
return _inventory[i];
}
@@ -870,9 +870,9 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
f = true;
}
- for (size_t i = 0; i < strlen(t); i++)
+ for (uint i = 0; i < strlen(t); i++)
if ((t[i] < '0') || (t[i] > '9')) f = true;
- for (size_t i = 0; i < strlen(min); i++)
+ for (uint i = 0; i < strlen(min); i++)
if ((min[i] < '0') || (min[i] > '9')) f = true;
hours = atoi(t);
minutes = atoi(min);
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 01049a2..7f181b5 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -125,12 +125,12 @@ public:
void add(Object &obj);
void remove(Object &obj);
- Object *get(size_t index) const;
+ Object *get(uint index) const;
Object *get(ObjectID id) const;
private:
Object *_inventory[kMaxCarry];
- size_t _numObjects;
+ uint _numObjects;
};
class GameManager {
Commit: cd080b820a5b402c060dd901e8f76bd5e0d3a143
https://github.com/scummvm/scummvm/commit/cd080b820a5b402c060dd901e8f76bd5e0d3a143
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:42:08Z
Commit Message:
SUPERNOVA: Buffers audio samples on startup
Changed paths:
engines/supernova/console.cpp
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/console.cpp b/engines/supernova/console.cpp
index 98875ec..96f97b7 100644
--- a/engines/supernova/console.cpp
+++ b/engines/supernova/console.cpp
@@ -53,15 +53,13 @@ bool Console::cmdRenderImage(int argc, const char **argv) {
}
bool Console::cmdPlaySound(int argc, const char **argv) {
- if (argc != 3) {
- debugPrintf("Usage: play [filenumber] [offset]\n");
+ if (argc != 2) {
+ debugPrintf("Usage: play [0-%d]\n", kAudioNumSamples - 1);
return true;
}
- int filenumber = atoi(argv[1]);
- int offset = atoi(argv[2]);
-
- _vm->playSound(filenumber, offset);
+ int sample = Common::String(argv[1]).asUint64();
+ _vm->playSound(static_cast<AudioIndex>(sample));
return true;
}
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 81138f1..23516a7 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -49,6 +49,35 @@ enum MessagePosition {
kMessageTop
};
+enum AudioIndex {
+ kAudioGreat, // 44|0
+ kAudioCrash, // 45|0
+ kAudioVoiceHalt, // 46|0
+ kAudioUndef1, // 46|2510
+ kAudioUndef2, // 46|4020
+ kAudioVoiceSupernova, // 47|0
+ kAudioVoiceYeah, // 47|24010
+ kAudioUndef3, // 48|0
+ kAudioUndef4, // 48|2510
+ kAudioShock, // 48|10520
+ kAudioTurntable, // 48|13530
+ kAudioUndef5, // 50|0
+ kAudioUndef6, // 50|12786
+ kAudioDeath, // 53|0
+ kAudioAlarm, // 54|0
+ kAudioUndef7, // 54|8010
+ kAudioDoorSound, // 54|24020
+ kAudioDoorOpen, // 54|30030
+ kAudioDoorClose, // 54|31040
+ kAudioNumSamples
+};
+
+struct AudioInfo {
+ int _filenumber;
+ int _offsetStart;
+ int _offsetEnd;
+};
+
// Colors
const int kColorBlack = 0;
const int kColorWhite25 = 1;
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 66013a1..cd7a88b 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -29,7 +29,7 @@ namespace Supernova {
bool ShipCorridor::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_PRESS) && (obj1._id == BUTTON)) {
if (_objectState[6].hasProperty(OPENED)) {
- _vm->playSound(54, 24020);
+ _vm->playSound(kAudioDoorSound);
_objectState[6].disableProperty(OPENED);
_vm->renderImage(_gm->_currentRoom->getFileNumber(), 8);
_shown[9] = false;
@@ -39,7 +39,7 @@ bool ShipCorridor::interact(Action verb, Object &obj1, Object &obj2) {
_gm->wait2(2);
_vm->renderImage(_gm->_currentRoom->getFileNumber(), _gm->invertSection(7));
} else {
- _vm->playSound(54, 24020);
+ _vm->playSound(kAudioDoorSound);
_objectState[6].setProperty(OPENED);
_vm->renderImage(_gm->_currentRoom->getFileNumber(), 7);
_gm->wait2(2);
@@ -239,7 +239,7 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
_gm->wait2(18);
_vm->paletteFadeIn();
if (_gm->_state.time == 0) {
- _vm->playSound(45);
+ _vm->playSound(kAudioCrash);
_gm->screenShake();
_gm->wait2(18);
_vm->renderMessage("Was war das?");
@@ -447,7 +447,7 @@ bool ShipCabinL3::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderImage(this->getFileNumber(), 14);
this->setSectionVisible(15, false);
for (int i = 3; i; i--) {
- _vm->playSound(48, 13530);
+ _vm->playSound(kAudioTurntable);
if (_gm->_soundDevice) {
do {
if (this->isSectionVisible(13)) {
@@ -580,7 +580,7 @@ bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_PRESS) && (obj1._id == BUTTON1)) {
if (!this->getObject(1)->hasProperty(OPENED)) {
_vm->renderImage(this->getFileNumber(), 10);
- _vm->playSound(54, 24020);
+ _vm->playSound(kAudioDoorSound);
if (this->getObject(0)->hasProperty(OPENED)) {
this->getObject(0)->disableProperty(OPENED);
_vm->renderImage(this->getFileNumber(), 1);
@@ -606,7 +606,7 @@ bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) {
if (!this->getObject(0)->hasProperty(OPENED)) {
_vm->renderImage(this->getFileNumber(), 11);
if (this->getObject(1)->hasProperty(OPENED)) {
- _vm->playSound(54, 24020);
+ _vm->playSound(kAudioDoorSound);
this->getObject(1)->disableProperty(OPENED);
_vm->renderImage(this->getFileNumber(), 4);
_gm->wait2(2);
@@ -649,7 +649,7 @@ bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) {
_gm->wait2(3);
_vm->renderImage(this->getFileNumber(), 17);
this->setSectionVisible(16, false);
- _vm->playSound(54, 24020);
+ _vm->playSound(kAudioDoorSound);
_vm->renderImage(this->getFileNumber(), 5);
this->setSectionVisible(6, false);
_gm->wait2(2);
@@ -860,7 +860,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_OPEN) && (obj1._id == OUTERHATCH)) {
if (obj1.hasProperty(OPENED))
return false;
- _vm->playSound(54, 24020);
+ _vm->playSound(kAudioDoorSound);
_vm->renderImage(this->getFileNumber(), 1);
if (this->isSectionVisible(7))
_vm->renderImage(this->getFileNumber(), 10);
@@ -869,14 +869,14 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_rooms[HOLD].setSectionVisible(3, true);
obj1.setProperty(OPENED);
obj1._click = 2;
- _vm->playSound(54, 30030);
+ _vm->playSound(kAudioDoorOpen);
} else if ((verb == ACTION_CLOSE) && (obj1._id == OUTERHATCH)) {
if (!obj1.hasProperty(OPENED))
return false;
if (this->isSectionVisible(11) || this->isSectionVisible(12)) {
_vm->renderMessage("Das Seil ist im Weg.");
} else {
- _vm->playSound(54, 24020);
+ _vm->playSound(kAudioDoorSound);
_vm->renderImage(this->getFileNumber(), _gm->invertSection(1));
this->setSectionVisible(10, false);
if (this->isSectionVisible(13))
@@ -884,7 +884,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_rooms[HOLD].setSectionVisible(3, false);
obj1.disableProperty(OPENED);
obj1._click = 1;
- _vm->playSound(54, 31040);
+ _vm->playSound(kAudioDoorClose);
}
} else if ((verb == ACTION_WALK) && (obj1._id == OUTERHATCH) &&
this->isSectionVisible(7)) {
@@ -918,7 +918,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
else
_vm->renderImage(this->getFileNumber(), 4);
} else if ((verb == ACTION_OPEN) && (obj1._id == TRAP)) {
- _vm->playSound(54, 24020);
+ _vm->playSound(kAudioDoorSound);
_vm->renderImage(this->getFileNumber(), 2);
if (this->getObject(11)->_click == 11)
_vm->renderImage(this->getFileNumber(), 3);
@@ -928,7 +928,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
obj1._click = 6;
obj1._click2 = 5;
- _vm->playSound(54, 30030);
+ _vm->playSound(kAudioDoorOpen);
} else if ((verb == ACTION_CLOSE) && (obj1._id == TRAP)) {
if (this->isSectionVisible(9))
_vm->renderMessage("Das Kabel ist im Weg.");
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index f8fce4c..99cc867 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -37,9 +37,30 @@
#include "supernova/supernova.h"
-
namespace Supernova {
+const AudioInfo audioInfo[kAudioNumSamples] = {
+ {44, 0, -1},
+ {45, 0, -1},
+ {46, 0, 2510},
+ {46, 2510, 4020},
+ {46, 4020, -1},
+ {47, 0, 24010},
+ {47, 24010, -1},
+ {48, 0, 2510},
+ {48, 2510, 10520},
+ {48, 10520, 13530},
+ {48, 13530, -1},
+ {50, 0, 12786},
+ {50, 12786, -1},
+ {53, 0, -1},
+ {54, 0, 8010},
+ {54, 8010, 24020},
+ {54, 24020, 30030},
+ {54, 30030, 31040},
+ {54, 31040, -1}
+};
+
const char *const Object::defaultDescription = "Es ist nichts Besonderes daran.";
const char *const Object::takeMessage = "Das mußt du erst nehmen.";
@@ -92,6 +113,9 @@ SupernovaEngine::~SupernovaEngine() {
delete _rnd;
delete _console;
+ for (int i = 0; i < kAudioNumSamples; ++i) {
+ delete[] _soundSamples[i]._buffer;
+ }
}
Common::Error SupernovaEngine::run() {
@@ -167,20 +191,37 @@ void SupernovaEngine::initData() {
_images[i].init(i);
// Sound
+ Common::File file;
+
+ for (int i = 0; i < kAudioNumSamples; ++i) {
+ if (!file.open(Common::String::format("msn_data.%03d", audioInfo[i]._filenumber))) {
+ error("File %s could not be read!", file.getName());
+ }
+
+ if (audioInfo[i]._offsetEnd == -1) {
+ file.seek(0, SEEK_END);
+ _soundSamples[i]._length = file.pos() - audioInfo[i]._offsetStart;
+ } else {
+ _soundSamples[i]._length = audioInfo[i]._offsetEnd - audioInfo[i]._offsetStart;
+ }
+ _soundSamples[i]._buffer = new byte[_soundSamples[i]._length];
+ file.seek(audioInfo[i]._offsetStart);
+ file.read(_soundSamples[i]._buffer, _soundSamples[i]._length);
+ file.close();
+ }
}
void SupernovaEngine::initPalette() {
_system->getPaletteManager()->setPalette(initVGAPalette, 0, 256);
}
-void SupernovaEngine::playSound(int filenumber, int offset) {
- Common::File *file = new Common::File;
- if (!file->open(Common::String::format("msn_data.0%2d", filenumber))) {
- error("File %s could not be read!", file->getName());
- }
+void SupernovaEngine::playSound(AudioIndex sample) {
+ if (sample > kAudioNumSamples - 1)
+ return;
- file->seek(offset);
- Audio::SeekableAudioStream *audioStream = Audio::makeRawStream(file, 11931, Audio::FLAG_UNSIGNED | Audio::FLAG_LITTLE_ENDIAN);
+ Audio::SeekableAudioStream *audioStream = Audio::makeRawStream(
+ _soundSamples[sample]._buffer, _soundSamples[sample]._length,
+ 11931, Audio::FLAG_UNSIGNED | Audio::FLAG_LITTLE_ENDIAN, DisposeAfterUse::NO);
stopSound();
_mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, audioStream);
}
@@ -622,7 +663,7 @@ void GameManager::great(uint number) {
if (number && (_state.greatF & (1 << number)))
return;
- _vm->playSound(54, 8010);
+ _vm->playSound(kAudioUndef7);
_state.greatF |= 1 << number;
}
@@ -714,7 +755,7 @@ void GameManager::palette() {
void GameManager::shock() {
// STUB
- _vm->playSound(48, 10520);
+ _vm->playSound(kAudioShock);
// die
}
@@ -1087,7 +1128,7 @@ void GameManager::executeRoom() {
byte i = _inputObject[0]._click;
_inputObject[0]._click = _inputObject[0]._click2;
_inputObject[0]._click2 = i;
- _vm->playSound(54, 30030);
+ _vm->playSound(kAudioDoorOpen);
}
break;
@@ -1106,7 +1147,7 @@ void GameManager::executeRoom() {
byte i = _inputObject[0]._click;
_inputObject[0]._click = _inputObject[0]._click2;
_inputObject[0]._click2 = i;
- _vm->playSound(54, 31040);
+ _vm->playSound(kAudioDoorClose);
}
break;
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 7f181b5..16b9b4e 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -82,6 +82,10 @@ public:
ScreenBufferStack _screenBuffer;
MSNImageDecoder _images[44];
MSNImageDecoder *_currentImage;
+ struct SoundSample {
+ byte *_buffer;
+ int _length;
+ } _soundSamples[kAudioNumSamples];
Common::Event _event;
bool _gameRunning;
@@ -102,7 +106,7 @@ public:
void paletteFadeOut();
void paletteBrightness();
void updateEvents();
- void playSound(int filenumber, int offset = 0);
+ void playSound(AudioIndex sample);
void playSoundMod(int filenumber);
void stopSound();
void renderImage(MSNImageDecoder &image, int section, bool fullscreen = false);
Commit: 9e21dc42eecf14c69af7c0e39428f24616c8cf23
https://github.com/scummvm/scummvm/commit/9e21dc42eecf14c69af7c0e39428f24616c8cf23
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:42:08Z
Commit Message:
SUPERNOVA: Implements rendering of newspaper articles
The resolution will change dynamically depending what image is about to
be rendered. As there are no other GUI elements shown that depend on the
screen resolution when the artciles are rendered, there shouldn't be any
problems.
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 99cc867..2973655 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -98,6 +98,8 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)
, _sectionIndex(0)
, _delay(33)
, _gameRunning(true)
+ , _screenWidth(320)
+ , _screenHeight(200)
{
// const Common::FSNode gameDataDir(ConfMan.get("path"));
// SearchMan.addSubDirectoryMatching(gameDataDir, "sound");
@@ -119,8 +121,8 @@ SupernovaEngine::~SupernovaEngine() {
}
Common::Error SupernovaEngine::run() {
- initGraphics(kScreenWidth, kScreenHeight);
GameManager gm(this, &_event);
+ initGraphics(_screenWidth, _screenHeight);
_console = new Console(this, &gm);
initData();
@@ -253,17 +255,37 @@ void SupernovaEngine::renderImage(MSNImageDecoder &image, int section, bool full
image.loadSection(section);
_system->getPaletteManager()->setPalette(image.getPalette(), 16, 239);
paletteBrightness();
+
+ Common::Rect sectionRect(image._section[section].x1,
+ image._section[section].y1,
+ image._section[section].x2 - image._section[section].x1,
+ image._section[section].y2 - image._section[section].y1);
+ if (image._filenumber == 1 || image._filenumber == 2) {
+ sectionRect.setWidth(640);
+ sectionRect.setHeight(480);
+
+ if (_screenWidth != 640) {
+ _screenWidth = 640;
+ _screenHeight = 480;
+ initGraphics(_screenWidth, _screenHeight);
+ }
+ } else {
+ if (_screenWidth != 320) {
+ _screenWidth = 320;
+ _screenHeight = 200;
+ initGraphics(_screenWidth, _screenHeight);
+ }
+ }
+
if (fullscreen) {
_system->copyRectToScreen(image.getSurface()->getPixels(),
- image._pitch, 0, 0, kScreenWidth, kScreenHeight);
+ image._pitch, 0, 0, _screenWidth, _screenHeight);
} else {
- uint offset = image._section[section].y1 * 320 + image._section[section].x1;
+ uint offset = image._section[section].y1 * image._pitch + image._section[section].x1;
_system->copyRectToScreen(static_cast<const byte *>(image.getSurface()->getPixels()) + offset,
- 320,
- image._section[section].x1,
- image._section[section].y1,
- image._section[section].x2 - image._section[section].x1,
- image._section[section].y2 - image._section[section].y1);
+ image._pitch,
+ sectionRect.top, sectionRect.left,
+ sectionRect.width(), sectionRect.height());
}
}
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 16b9b4e..db9919e 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -88,6 +88,8 @@ public:
} _soundSamples[kAudioNumSamples];
Common::Event _event;
bool _gameRunning;
+ int _screenWidth;
+ int _screenHeight;
byte _imageIndex;
byte _sectionIndex;
Commit: 7c4a763710e152e0abc1c6bca3dd8cd22ffd9584
https://github.com/scummvm/scummvm/commit/7c4a763710e152e0abc1c6bca3dd8cd22ffd9584
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:42:08Z
Commit Message:
SUPERNOVA: Replaces magic numbers
Changed paths:
engines/supernova/graphics.cpp
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index 90d149b..5acc2ad 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -28,6 +28,7 @@
#include "graphics/surface.h"
#include "graphics.h"
+#include "msn_def.h"
namespace Supernova {
@@ -152,14 +153,14 @@ bool MSNImageDecoder::loadSection(int section) {
_surface->create(imageWidth, imageHeight, g_system->getScreenFormat());
byte *surfacePixels = static_cast<byte *>(_surface->getPixels());
for (int i = 0; i < imageWidth * imageHeight / 8; ++i) {
- *surfacePixels++ = (_encodedImage[i] & 0x80) ? 11 : 0;
- *surfacePixels++ = (_encodedImage[i] & 0x40) ? 11 : 0;
- *surfacePixels++ = (_encodedImage[i] & 0x20) ? 11 : 0;
- *surfacePixels++ = (_encodedImage[i] & 0x10) ? 11 : 0;
- *surfacePixels++ = (_encodedImage[i] & 0x08) ? 11 : 0;
- *surfacePixels++ = (_encodedImage[i] & 0x04) ? 11 : 0;
- *surfacePixels++ = (_encodedImage[i] & 0x02) ? 11 : 0;
- *surfacePixels++ = (_encodedImage[i] & 0x01) ? 11 : 0;
+ *surfacePixels++ = (_encodedImage[i] & 0x80) ? kColorWhite63 : kColorBlack;
+ *surfacePixels++ = (_encodedImage[i] & 0x40) ? kColorWhite63 : kColorBlack;
+ *surfacePixels++ = (_encodedImage[i] & 0x20) ? kColorWhite63 : kColorBlack;
+ *surfacePixels++ = (_encodedImage[i] & 0x10) ? kColorWhite63 : kColorBlack;
+ *surfacePixels++ = (_encodedImage[i] & 0x08) ? kColorWhite63 : kColorBlack;
+ *surfacePixels++ = (_encodedImage[i] & 0x04) ? kColorWhite63 : kColorBlack;
+ *surfacePixels++ = (_encodedImage[i] & 0x02) ? kColorWhite63 : kColorBlack;
+ *surfacePixels++ = (_encodedImage[i] & 0x01) ? kColorWhite63 : kColorBlack;
}
} else {
_pitch = 320;
Commit: 1ae113470645dc356ec05662f1144f2ab658a516
https://github.com/scummvm/scummvm/commit/1ae113470645dc356ec05662f1144f2ab658a516
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:42:08Z
Commit Message:
SUPERNOVA: Converts mouse cursor data
Changed paths:
engines/supernova/msn_def.h
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 23516a7..8e52404 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -95,6 +95,7 @@ const int kColorLightBlue = 12;
const int kColorLightGreen = 13;
const int kColorLightYellow = 14;
const int kColorLightRed = 15;
+const int kColorCursorTransparent = kColorWhite25;
#define HGR_BEF kColorWhite25
#define COL_BEF kColorDarkGreen
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 2973655..4d5da92 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -129,6 +129,8 @@ Common::Error SupernovaEngine::run() {
initPalette();
paletteFadeIn();
+ CursorMan.replaceCursor(_mouseWait, 16, 16, 0, 0, kColorCursorTransparent);
+ CursorMan.replaceCursorPalette(initVGAPalette, 0, 16);
CursorMan.showMouse(true);
while (_gameRunning) {
@@ -211,6 +213,23 @@ void SupernovaEngine::initData() {
file.read(_soundSamples[i]._buffer, _soundSamples[i]._length);
file.close();
}
+
+ // Cursor
+ const uint16 *bufferNormal = reinterpret_cast<const uint16 *>(mouseNormal);
+ const uint16 *bufferWait = reinterpret_cast<const uint16 *>(mouseWait);
+ for (uint i = 0; i < sizeof(mouseNormal) / 4; ++i) {
+ for (uint bit = 0; bit < 16; ++bit) {
+ uint mask = 0x8000 >> bit;
+ uint bitIndex = i * 16 + bit;
+
+ _mouseNormal[bitIndex] = (bufferNormal[i] & mask) ? kColorCursorTransparent : kColorBlack;
+ if (bufferNormal[i + 16] & mask)
+ _mouseNormal[bitIndex] = kColorLightRed;
+ _mouseWait[bitIndex] = (bufferWait[i] & mask) ? kColorCursorTransparent : kColorBlack;
+ if (bufferWait[i + 16] & mask)
+ _mouseWait[bitIndex] = kColorLightRed;
+ }
+ }
}
void SupernovaEngine::initPalette() {
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index db9919e..8ff849f 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -80,6 +80,8 @@ public:
Console *_console;
Audio::SoundHandle _soundHandle;
ScreenBufferStack _screenBuffer;
+ byte _mouseNormal[256];
+ byte _mouseWait[256];
MSNImageDecoder _images[44];
MSNImageDecoder *_currentImage;
struct SoundSample {
Commit: ef1bbce68eb2c45d36de0147df14c27dd8b622b6
https://github.com/scummvm/scummvm/commit/ef1bbce68eb2c45d36de0147df14c27dd8b622b6
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:42:08Z
Commit Message:
SUPERNOVA: Buffers sections of image on init
Changed paths:
engines/supernova/graphics.cpp
engines/supernova/graphics.h
engines/supernova/supernova.cpp
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index 5acc2ad..ba2f06e 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -33,8 +33,7 @@
namespace Supernova {
MSNImageDecoder::MSNImageDecoder()
- : _surface(NULL)
- , _palette(NULL)
+ : _palette(NULL)
, _encodedImage(NULL) {
}
@@ -133,77 +132,73 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
}
}
+ loadSections();
+
return true;
}
-bool MSNImageDecoder::loadSection(int section) {
- int imageWidth = 320;
- int imageHeight = 200;
-
- if (_surface)
- _surface->free();
-
- _surface = new Graphics::Surface;
-
- if (_filenumber == 1 || _filenumber == 2) {
- imageWidth = 640;
- imageHeight = 480;
- _pitch = 640;
-
- _surface->create(imageWidth, imageHeight, g_system->getScreenFormat());
- byte *surfacePixels = static_cast<byte *>(_surface->getPixels());
- for (int i = 0; i < imageWidth * imageHeight / 8; ++i) {
- *surfacePixels++ = (_encodedImage[i] & 0x80) ? kColorWhite63 : kColorBlack;
- *surfacePixels++ = (_encodedImage[i] & 0x40) ? kColorWhite63 : kColorBlack;
- *surfacePixels++ = (_encodedImage[i] & 0x20) ? kColorWhite63 : kColorBlack;
- *surfacePixels++ = (_encodedImage[i] & 0x10) ? kColorWhite63 : kColorBlack;
- *surfacePixels++ = (_encodedImage[i] & 0x08) ? kColorWhite63 : kColorBlack;
- *surfacePixels++ = (_encodedImage[i] & 0x04) ? kColorWhite63 : kColorBlack;
- *surfacePixels++ = (_encodedImage[i] & 0x02) ? kColorWhite63 : kColorBlack;
- *surfacePixels++ = (_encodedImage[i] & 0x01) ? kColorWhite63 : kColorBlack;
- }
- } else {
- _pitch = 320;
- _surface->create(imageWidth, imageHeight, g_system->getScreenFormat());
- byte *surfacePixels = static_cast<byte *>(_surface->getPixels());
-
- const uint32 kInvalidAddress = 0x00FFFFFF;
-
- uint image = section;
- if (image < 128) {
- do {
- uint32 offset = (_section[image].addressHigh << 16) + _section[image].addressLow;
- if (offset == kInvalidAddress || _section[image].x2 == 0) {
- return false;
- }
- int width = _section[image].x2 - _section[image].x1 + 1;
- int height = _section[image].y2 - _section[image].y1 + 1;
- uint32 destAddress = imageWidth * _section[image].y1 + _section[image].x1;
- while (height) {
- Common::copy(_encodedImage + offset, _encodedImage + offset + width, surfacePixels + destAddress);
- offset += width;
- destAddress += imageWidth;
- --height;
- }
-
- image = _section[image].next;
- } while (image != 0);
+bool MSNImageDecoder::loadSections() {
+ bool isNewspaper = _filenumber == 1 || _filenumber == 2;
+ int imageWidth = isNewspaper ? 640 : 320;
+ int imageHeight = isNewspaper ? 480 : 200;
+ _pitch = imageWidth;
+
+ for (int section = 0; section < _numSections; ++section) {
+ Graphics::Surface *surface = new Graphics::Surface;
+ _sectionSurfaces.push_back(surface);
+ surface->create(imageWidth,
+ imageHeight,
+ g_system->getScreenFormat());
+ byte *surfacePixels = static_cast<byte *>(surface->getPixels());
+
+ if (isNewspaper) {
+ for (int i = 0; i < imageWidth * imageHeight / 8; ++i) {
+ *surfacePixels++ = (_encodedImage[i] & 0x80) ? kColorWhite63 : kColorBlack;
+ *surfacePixels++ = (_encodedImage[i] & 0x40) ? kColorWhite63 : kColorBlack;
+ *surfacePixels++ = (_encodedImage[i] & 0x20) ? kColorWhite63 : kColorBlack;
+ *surfacePixels++ = (_encodedImage[i] & 0x10) ? kColorWhite63 : kColorBlack;
+ *surfacePixels++ = (_encodedImage[i] & 0x08) ? kColorWhite63 : kColorBlack;
+ *surfacePixels++ = (_encodedImage[i] & 0x04) ? kColorWhite63 : kColorBlack;
+ *surfacePixels++ = (_encodedImage[i] & 0x02) ? kColorWhite63 : kColorBlack;
+ *surfacePixels++ = (_encodedImage[i] & 0x01) ? kColorWhite63 : kColorBlack;
+ }
} else {
- image -= 128;
- do {
- int width = _section[image].x2 - _section[image].x1 + 1;
- int height = _section[image].y2 - _section[image].y1 + 1;
- uint32 destAddress = imageWidth * _section[image].y1 + _section[image].x1;
- uint32 offset = (_section[image].addressHigh << 16) + _section[image].addressLow + destAddress;
- while (height) {
- Common::copy(_encodedImage + offset, _encodedImage + offset + width, surfacePixels + destAddress);
- offset += imageWidth;
- destAddress += imageWidth;
- --height;
- }
-
- image = _section[image].next;
- } while (image != 0);
+ uint image = section;
+ if (image < 128) {
+ do {
+ uint32 offset = (_section[image].addressHigh << 16) + _section[image].addressLow;
+ if (offset == kInvalidAddress || _section[image].x2 == 0) {
+ return false;
+ }
+ int width = _section[image].x2 - _section[image].x1 + 1;
+ int height = _section[image].y2 - _section[image].y1 + 1;
+ uint32 destAddress = imageWidth * _section[image].y1 + _section[image].x1;
+ while (height) {
+ Common::copy(_encodedImage + offset, _encodedImage + offset + width, surfacePixels + destAddress);
+ offset += width;
+ destAddress += imageWidth;
+ --height;
+ }
+
+ image = _section[image].next;
+ } while (image != 0);
+ } else {
+ image -= 128;
+ do {
+ int width = _section[image].x2 - _section[image].x1 + 1;
+ int height = _section[image].y2 - _section[image].y1 + 1;
+ uint32 destAddress = imageWidth * _section[image].y1 + _section[image].x1;
+ uint32 offset = (_section[image].addressHigh << 16) + _section[image].addressLow + destAddress;
+ while (height) {
+ Common::copy(_encodedImage + offset, _encodedImage + offset + width, surfacePixels + destAddress);
+ offset += imageWidth;
+ destAddress += imageWidth;
+ --height;
+ }
+
+ image = _section[image].next;
+ } while (image != 0);
+ }
}
}
@@ -215,14 +210,14 @@ void MSNImageDecoder::destroy() {
delete[] _palette;
_palette = NULL;
}
- if (_surface) {
- _surface->free();
- _surface = NULL;
- }
if (_encodedImage) {
delete[] _encodedImage;
_encodedImage = NULL;
}
+ for (Common::Array<Graphics::Surface *>::iterator it = _sectionSurfaces.begin();
+ it != _sectionSurfaces.end(); ++it) {
+ (*it)->free();
+ }
}
}
diff --git a/engines/supernova/graphics.h b/engines/supernova/graphics.h
index 3bd2bfd..c04afba 100644
--- a/engines/supernova/graphics.h
+++ b/engines/supernova/graphics.h
@@ -43,20 +43,20 @@ public:
virtual void destroy();
virtual bool loadStream(Common::SeekableReadStream &stream);
- virtual const Graphics::Surface *getSurface() const { return _surface; }
+ virtual const Graphics::Surface *getSurface() const { return _sectionSurfaces[0]; }
virtual const byte *getPalette() const { return _palette; }
- bool loadSection(int section);
bool init(int filenumber);
static const int kMaxSections = 50;
static const int kMaxClickFields = 80;
+ static const uint32 kInvalidAddress = 0x00FFFFFF;
int _filenumber;
int _pitch;
int _numSections;
int _numClickFields;
- Graphics::Surface *_surface;
+ Common::Array<Graphics::Surface *> _sectionSurfaces;
byte *_palette;
byte *_encodedImage;
@@ -77,6 +77,9 @@ public:
byte y2;
byte next;
} _clickField[kMaxClickFields];
+
+private:
+ bool loadSections();
};
}
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 4d5da92..5fc88f6 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -267,18 +267,20 @@ void SupernovaEngine::playSoundMod(int filenumber)
}
void SupernovaEngine::renderImage(MSNImageDecoder &image, int section, bool fullscreen) {
+ if (section > image._numSections - 1)
+ return;
+
_currentImage = ℑ
_imageIndex = image._filenumber;
_sectionIndex = section;
- image.loadSection(section);
_system->getPaletteManager()->setPalette(image.getPalette(), 16, 239);
paletteBrightness();
Common::Rect sectionRect(image._section[section].x1,
image._section[section].y1,
- image._section[section].x2 - image._section[section].x1,
- image._section[section].y2 - image._section[section].y1);
+ image._section[section].x2,
+ image._section[section].y2);
if (image._filenumber == 1 || image._filenumber == 2) {
sectionRect.setWidth(640);
sectionRect.setHeight(480);
@@ -297,11 +299,11 @@ void SupernovaEngine::renderImage(MSNImageDecoder &image, int section, bool full
}
if (fullscreen) {
- _system->copyRectToScreen(image.getSurface()->getPixels(),
+ _system->copyRectToScreen(image._sectionSurfaces[section]->getPixels(),
image._pitch, 0, 0, _screenWidth, _screenHeight);
} else {
uint offset = image._section[section].y1 * image._pitch + image._section[section].x1;
- _system->copyRectToScreen(static_cast<const byte *>(image.getSurface()->getPixels()) + offset,
+ _system->copyRectToScreen(static_cast<const byte *>(image._sectionSurfaces[section]->getPixels()) + offset,
image._pitch,
sectionRect.top, sectionRect.left,
sectionRect.width(), sectionRect.height());
@@ -309,6 +311,9 @@ void SupernovaEngine::renderImage(MSNImageDecoder &image, int section, bool full
}
void SupernovaEngine::renderImage(int filenumber, int section, bool fullscreen) {
+ if (filenumber > ARRAYSIZE(_images) - 1)
+ return;
+
renderImage(_images[filenumber], section, fullscreen);
}
Commit: 1b220e75e53c5dbd09842ba918b8cb05b542604f
https://github.com/scummvm/scummvm/commit/1b220e75e53c5dbd09842ba918b8cb05b542604f
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:42:08Z
Commit Message:
SUPERNOVA: Implements playSoundMod()
Changed paths:
engines/supernova/console.cpp
engines/supernova/console.h
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/console.cpp b/engines/supernova/console.cpp
index 96f97b7..560520c 100644
--- a/engines/supernova/console.cpp
+++ b/engines/supernova/console.cpp
@@ -31,6 +31,7 @@ Console::Console(SupernovaEngine *vm, GameManager *gm)
{
registerCmd("render", WRAP_METHOD(Console, cmdRenderImage));
registerCmd("play", WRAP_METHOD(Console, cmdPlaySound));
+ registerCmd("music", WRAP_METHOD(Console, cmdMusic));
registerCmd("list", WRAP_METHOD(Console, cmdList));
registerCmd("inventory", WRAP_METHOD(Console, cmdInventory));
@@ -64,6 +65,15 @@ bool Console::cmdPlaySound(int argc, const char **argv) {
return true;
}
+bool Console::cmdMusic(int argc, const char **argv) {
+ if (argc != 2) {
+ debugPrintf("Usage: music [49/52]\n");
+ return true;
+ }
+
+ _vm->playSoundMod(atoi(argv[1]));
+}
+
bool Console::cmdList(int argc, const char **argv) {
// Objects in room and sections
diff --git a/engines/supernova/console.h b/engines/supernova/console.h
index 19efe47..e78c3b5 100644
--- a/engines/supernova/console.h
+++ b/engines/supernova/console.h
@@ -41,6 +41,7 @@ public:
bool cmdRenderImage(int argc, const char **argv);
bool cmdPlaySound(int argc, const char **argv);
+ bool cmdMusic(int argc, const char **argv);
bool cmdList(int argc, const char **argv);
bool cmdInventory(int argc, const char **argv);
private:
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 5fc88f6..0929f6c 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -34,6 +34,9 @@
#include "graphics/surface.h"
#include "graphics/screen.h"
#include "graphics/palette.h"
+#include "audio/mods/protracker.h"
+#include "common/memstream.h"
+#include "common/endian.h"
#include "supernova/supernova.h"
@@ -254,16 +257,18 @@ void SupernovaEngine::stopSound() {
void SupernovaEngine::playSoundMod(int filenumber)
{
- if (filenumber != 49 || filenumber != 52) {
- error("File not supposed to be played!");
+ if (filenumber != 49 && filenumber != 52) {
+ return;
}
- Common::File *file = new Common::File;
- if (!file->open(Common::String::format("msn_data.%03d", filenumber))) {
- error("File %s could not be read!", file->getName());
- }
+ Common::MemoryReadStream *modBuffer;
+ modBuffer = convertToMod(Common::String::format("msn_data.%03d", filenumber).c_str());
- // play Supernova MOD file
+ if (modBuffer) {
+ Audio::AudioStream *audioStream = Audio::makeProtrackerStream(modBuffer);
+ stopSound();
+ _mixer->playStream(Audio::Mixer::kMusicSoundType, &_soundHandle, audioStream);
+ }
}
void SupernovaEngine::renderImage(MSNImageDecoder &image, int section, bool fullscreen) {
@@ -1221,5 +1226,190 @@ void GameManager::executeRoom() {
}
}
+Common::MemoryReadStream *SupernovaEngine::convertToMod(const char *filename, int version) {
+ // MSN format
+ struct {
+ uint16 seg;
+ uint16 start;
+ uint16 end;
+ uint16 loopStart;
+ uint16 loopEnd;
+ char volume;
+ char dummy[5];
+ } instr2[22];
+ int nbInstr2; // 22 for version1, 15 for version 2
+ int16 songLength;
+ char arrangement[128];
+ int16 patternNumber;
+ int32 note2[28][64][4];
+
+ nbInstr2 = ((version == 1) ? 22 : 15);
+
+ Common::File msnFile;
+ msnFile.open(filename);
+ if (!msnFile.isOpen()) {
+ warning("Data file '%s' not found", msnFile.getName());
+ return NULL;
+ }
+
+ for (int i = 0 ; i < nbInstr2 ; ++i) {
+ instr2[i].seg = msnFile.readUint16LE();
+ instr2[i].start = msnFile.readUint16LE();
+ instr2[i].end = msnFile.readUint16LE();
+ instr2[i].loopStart = msnFile.readUint16LE();
+ instr2[i].loopEnd = msnFile.readUint16LE();
+ instr2[i].volume = msnFile.readByte();
+ msnFile.read(instr2[i].dummy, 5);
+ }
+ songLength = msnFile.readSint16LE();
+ msnFile.read(arrangement, 128);
+ patternNumber = msnFile.readSint16LE();
+ for (int p = 0 ; p < patternNumber ; ++p) {
+ for (int n = 0 ; n < 64 ; ++n) {
+ for (int k = 0 ; k < 4 ; ++k) {
+ note2[p][n][k] = msnFile.readSint32LE();
+ }
+ }
+ }
+
+ /* MOD format */
+ struct {
+ char iname[22];
+ uint16 length;
+ char finetune;
+ char volume;
+ uint16 loopStart;
+ uint16 loopLength;
+ } instr[31];
+ int32 note[28][64][4];
+
+ // We can't recover some MOD effects since several of them are mapped to 0.
+ // Assume the MSN effect of value 0 is Arpeggio (MOD effect of value 0).
+ const char invConvEff[8] = {0, 1, 2, 3, 10, 12, 13 ,15};
+
+ // Reminder from convertToMsn
+ // 31 30 29 28 27 26 25 24 - 23 22 21 20 19 18 17 16 - 15 14 13 12 11 10 09 08 - 07 06 05 04 03 02 01 00
+ // h h h h g g g g f f f f e e e e d d d d c c c c b b b b a a a a
+ //
+ // MSN:
+ // hhhh (4 bits) Cleared to 0
+ // dddd c (5 bits) Sample index | after mapping through convInstr
+ // ccc (3 bits) Effect type | after mapping through convEff
+ // bbbb aaaa (8 bits) Effect value | unmodified
+ // gggg ffff eeee (12 bits) Sample period | unmodified
+ //
+ // MS2:
+ // hhhh (4 bits) Cleared to 0
+ // dddd (4 bits) Sample index | after mapping through convInstr
+ // cccc (4 bits) Effect type | unmodified
+ // bbbb aaaa (8 bits) Effect value | unmodified
+ // gggg ffff eeee (12 bits) Sample period | transformed (0xE000 / p) - 256
+ //
+ // MOD:
+ // hhhh dddd (8 bits) Sample index
+ // cccc (4 bits) Effect type for this channel/division
+ // bbbb aaaa (8 bits) Effect value
+ // gggg ffff eeee (12 bits) Sample period
+
+ // Can we recover the instruments mapping? I don't think so as part of the original instrument index is cleared.
+ // And it doesn't really matter as long as we are consistent.
+ // However we need to make sure 31 (or 15 in MS2) is mapped to 0 in MOD.
+ // We just add 1 to all other values, and this means a 1 <-> 1 mapping for the instruments
+ for (int p = 0; p < patternNumber; ++p) {
+ for (int n = 0; n < 64; ++n) {
+ for (int k = 0; k < 4; ++k) {
+ int32* l = &(note[p][n][k]);
+ *l = note2[p][n][k];
+ int32 i = 0;
+ if (nbInstr2 == 22) { // version 1
+ i = ((*l & 0xF800) >> 11);
+ int32 e = ((*l & 0x0700) >> 8);
+ int32 e1 = invConvEff[e];
+ *l &= 0x0FFF00FF;
+ *l |= (e1 << 8);
+ } else { // version 2
+ int32 h = (*l >> 16);
+ i = ((*l & 0xF000) >> 12);
+ *l &= 0x00000FFF;
+ if (h)
+ h = 0xE000 / (h + 256);
+ *l |= (h << 16);
+ if (i == 15)
+ i = 31;
+ }
+
+ // Add back index in note
+ if (i != 31) {
+ ++i;
+ *l |= ((i & 0x0F) << 12);
+ *l |= ((i & 0xF0) << 24);
+ }
+ }
+ }
+ }
+
+ for (int i = 0; i < 31; ++i) {
+ // iname is not stored in the mod file. Just set it to 'instrument#'
+ // finetune is not stored either. Assume 0.
+ memset(instr[i].iname, 0, 22);
+ sprintf(instr[i].iname, "instrument%d", i+1);
+ instr[i].length = 0;
+ instr[i].finetune = 0;
+ instr[i].volume = 0;
+ instr[i].loopStart = 0;
+ instr[i].loopLength = 0;
+
+ if (i < nbInstr2) {
+ instr[i].length = ((instr2[i].end - instr2[i].start) >> 1);
+ instr[i].loopStart = ((instr2[i].loopStart - instr2[i].start) >> 1);
+ instr[i].loopLength = (( instr2[i].loopEnd - instr2[i].loopStart) >> 1);
+ instr[i].volume = instr2[i].volume;
+ }
+ }
+
+ // The ciaaSpeed is kind of useless and not present in the MSN file.
+ // Traditionally 0x78 in SoundTracker. Was used in NoiseTracker as a restart point.
+ // ProTracker uses 0x7F. FastTracker uses it as a restart point, whereas ScreamTracker 3 uses 0x7F like ProTracker.
+ // You can use this to roughly detect which tracker made a MOD, and detection gets more accurate for more obscure MOD types.
+ char ciaaSpeed = 0x7F;
+
+ // The mark cannot be recovered either. Since we have 4 channels and 31 instrument it can be either ID='M.K.' or ID='4CHN'.
+ // Assume 'M.K.'
+ const char mark[4] = { 'M', '.', 'K', '.' };
+
+ Common::MemoryWriteStreamDynamic buffer(DisposeAfterUse::NO);
+
+ buffer.write(msnFile.getName(), 19);
+ buffer.writeByte(0);
+
+ for (int i = 0 ; i < 31 ; ++i) {
+ buffer.write(instr[i].iname, 22);
+ buffer.writeUint16BE(instr[i].length);
+ buffer.writeByte(instr[i].finetune);
+ buffer.writeByte(instr[i].volume);
+ buffer.writeUint16BE(instr[i].loopStart);
+ buffer.writeUint16BE(instr[i].loopLength);
+ }
+ buffer.writeByte((char)songLength);
+ buffer.writeByte(ciaaSpeed);
+ buffer.write(arrangement, 128);
+ buffer.write(mark, 4);
+
+ for (int p = 0 ; p < patternNumber ; ++p) {
+ for (int n = 0 ; n < 64 ; ++n) {
+ for (int k = 0 ; k < 4 ; ++k) {
+// buffer.writeUint32BE(*((uint32*)(note[p][n]+k)));
+ buffer.writeSint32BE(note[p][n][k]);
+ }
+ }
+ }
+
+ uint nb;
+ char buf[4096];
+ while ((nb = msnFile.read(buf, 4096)) > 0)
+ buffer.write(buf, nb);
+
+ return new Common::MemoryReadStream(buffer.getData(), buffer.size());
+}
}
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 8ff849f..53fd796 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -27,15 +27,17 @@
#include "audio/mixer.h"
#include "audio/decoders/raw.h"
#include "common/array.h"
+#include "common/events.h"
#include "common/random.h"
#include "common/scummsys.h"
-#include "common/events.h"
#include "engines/engine.h"
+#include "common/file.h"
+#include "common/memstream.h"
#include "supernova/console.h"
#include "supernova/graphics.h"
-#include "supernova/rooms.h"
#include "supernova/msn_def.h"
+#include "supernova/rooms.h"
namespace Supernova {
@@ -124,6 +126,8 @@ public:
void renderText(const char *text);
void renderBox(int x, int y, int width, int height, byte color);
void setColor63(byte value);
+
+ Common::MemoryReadStream *convertToMod(const char *filename, int version = 1);
};
@@ -196,8 +200,10 @@ public:
void closeLocker(const Room *room, Object *obj, Object *lock, int section);
void edit(char *text, int x, int y, int length);
int invertSection(int section);
+ void command_print();
};
+
}
#endif
Commit: 11b62275179e6a7df5cece9581c62fb60ac81719
https://github.com/scummvm/scummvm/commit/11b62275179e6a7df5cece9581c62fb60ac81719
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:42:08Z
Commit Message:
SUPERNOVA: Buffer Music files
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 0929f6c..8086753 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -121,6 +121,8 @@ SupernovaEngine::~SupernovaEngine() {
for (int i = 0; i < kAudioNumSamples; ++i) {
delete[] _soundSamples[i]._buffer;
}
+ delete _soundMusic[0];
+ delete _soundMusic[1];
}
Common::Error SupernovaEngine::run() {
@@ -217,6 +219,9 @@ void SupernovaEngine::initData() {
file.close();
}
+ _soundMusic[0] = convertToMod("msn_data.049");
+ _soundMusic[1] = convertToMod("msn_data.052");
+
// Cursor
const uint16 *bufferNormal = reinterpret_cast<const uint16 *>(mouseNormal);
const uint16 *bufferWait = reinterpret_cast<const uint16 *>(mouseWait);
@@ -261,14 +266,11 @@ void SupernovaEngine::playSoundMod(int filenumber)
return;
}
- Common::MemoryReadStream *modBuffer;
- modBuffer = convertToMod(Common::String::format("msn_data.%03d", filenumber).c_str());
-
- if (modBuffer) {
- Audio::AudioStream *audioStream = Audio::makeProtrackerStream(modBuffer);
- stopSound();
- _mixer->playStream(Audio::Mixer::kMusicSoundType, &_soundHandle, audioStream);
- }
+ int index = filenumber == 49 ? 0 : 1;
+ Audio::AudioStream *audioStream = Audio::makeProtrackerStream(_soundMusic[index]);
+ stopSound();
+ _mixer->playStream(Audio::Mixer::kMusicSoundType, &_soundHandle, audioStream,
+ -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO);
}
void SupernovaEngine::renderImage(MSNImageDecoder &image, int section, bool fullscreen) {
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 53fd796..7362438 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -90,6 +90,7 @@ public:
byte *_buffer;
int _length;
} _soundSamples[kAudioNumSamples];
+ Common::MemoryReadStream *_soundMusic[2];
Common::Event _event;
bool _gameRunning;
int _screenWidth;
Commit: 84eb970bb9af322ce3f054206a92603cd23f29cc
https://github.com/scummvm/scummvm/commit/84eb970bb9af322ce3f054206a92603cd23f29cc
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:42:08Z
Commit Message:
SUPERNOVA: Fixes endianess issue for drawing cursor
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 8086753..e0adc7f 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -230,11 +230,11 @@ void SupernovaEngine::initData() {
uint mask = 0x8000 >> bit;
uint bitIndex = i * 16 + bit;
- _mouseNormal[bitIndex] = (bufferNormal[i] & mask) ? kColorCursorTransparent : kColorBlack;
- if (bufferNormal[i + 16] & mask)
+ _mouseNormal[bitIndex] = (READ_LE_UINT16(bufferNormal + i) & mask) ? kColorCursorTransparent : kColorBlack;
+ if (READ_LE_UINT16(bufferNormal + i + 16) & mask)
_mouseNormal[bitIndex] = kColorLightRed;
- _mouseWait[bitIndex] = (bufferWait[i] & mask) ? kColorCursorTransparent : kColorBlack;
- if (bufferWait[i + 16] & mask)
+ _mouseWait[bitIndex] = (READ_LE_UINT16(bufferWait + i) & mask) ? kColorCursorTransparent : kColorBlack;
+ if (READ_LE_UINT16(bufferWait + i + 16) & mask)
_mouseWait[bitIndex] = kColorLightRed;
}
}
Commit: 4a68aef1d6d1a25f4084b1cd3dcdfb36ea36114c
https://github.com/scummvm/scummvm/commit/4a68aef1d6d1a25f4084b1cd3dcdfb36ea36114c
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:42:08Z
Commit Message:
SUPERNOVA: Fixes ScreenBufferStack
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index e0adc7f..4a4ede6 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -595,11 +595,13 @@ void ScreenBufferStack::push(int x, int y, int width, int height, int pitch) {
if (_last == ARRAYEND(_buffer))
return;
- byte *pixels = new byte[width * height];
- const byte *screen = static_cast<byte *>(g_system->lockScreen()->getBasePtr(x, y));
+ _last->_pixels = new byte[width * height];
+ byte *pixels = _last->_pixels;
+ const byte *screen = static_cast<const byte *>(g_system->lockScreen()->getBasePtr(x, y));
for (int i = 0; i < height; ++i) {
Common::copy(screen, screen + width, pixels);
- screen += pitch * i;
+ screen += pitch;
+ pixels += width;
}
g_system->unlockScreen();
@@ -608,7 +610,6 @@ void ScreenBufferStack::push(int x, int y, int width, int height, int pitch) {
_last->_width = width;
_last->_height = height;
_last->_pitch = pitch;
- _last->_pixels = pixels;
++_last;
}
@@ -617,11 +618,13 @@ void ScreenBufferStack::restore() {
if (_last == _buffer)
return;
+ --_last;
g_system->lockScreen()->copyRectToSurface(
_last->_pixels, _last->_width, _last->_x, _last->_y,
_last->_width, _last->_height);
g_system->unlockScreen();
- --_last;
+
+ delete[] _last->_pixels;
}
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 7362438..78e9f72 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -49,7 +49,7 @@ struct ScreenBuffer {
, _width(0)
, _height(0)
, _pitch(0)
- , _pixels(0)
+ , _pixels(NULL)
{}
byte *_pixels;
Commit: 2c17586c76b8f73e6e6fcc883eb0520b8f68a730
https://github.com/scummvm/scummvm/commit/2c17586c76b8f73e6e6fcc883eb0520b8f68a730
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:42:08Z
Commit Message:
SUPERNOVA: Fixes parameters passed to fillRect()
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 4a4ede6..e5a943f 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -481,7 +481,7 @@ void SupernovaEngine::renderText(const char *text) {
void SupernovaEngine::renderBox(int x, int y, int width, int height, byte color) {
Graphics::Surface *screen = _system->lockScreen();
- screen->fillRect(Common::Rect(x, y, width, height), color);
+ screen->fillRect(Common::Rect(x, y, x + width, y + height), color);
_system->unlockScreen();
}
Commit: 87a0dd970af238e6ec7033288c0a67640a717d6e
https://github.com/scummvm/scummvm/commit/87a0dd970af238e6ec7033288c0a67640a717d6e
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:42:08Z
Commit Message:
SUPERNOVA: Fixes Message positioning
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index e5a943f..6774ac7 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -389,15 +389,15 @@ void SupernovaEngine::renderMessage(const char *text, MessagePosition position)
switch (position) {
case kMessageNormal:
- x = rowWidthMax / 2 - 160;
+ x = 160 - rowWidthMax / 2;
textColor = COL_MELD;
break;
case kMessageTop:
- x = rowWidthMax / 2 - 160;
+ x = 160 - rowWidthMax / 2;
textColor = kColorLightYellow;
break;
case kMessageCenter:
- x = rowWidthMax / 2 - 160;
+ x = 160 - rowWidthMax / 2;
textColor = kColorLightRed;
break;
case kMessageLeft:
Commit: 30308fbe8d45de40331b10bd7ed6e62c6bff0a4c
https://github.com/scummvm/scummvm/commit/30308fbe8d45de40331b10bd7ed6e62c6bff0a4c
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:54:26Z
Commit Message:
SUPERNOVA: Implements GUI routines and refactors code
Of course the short description does not adequately describe the changes
made with this commit and I assume this won't be the last big
restructuring unfortunately.
Focus of this commit was to implement/fix the code so the main user
interface can be rendered. Bugs in the core routines for rendering
Messages and Images were fixed as well.
Changed paths:
A engines/supernova/state.cpp
A engines/supernova/state.h
engines/supernova/module.mk
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
engines/supernova/rooms.h
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/module.mk b/engines/supernova/module.mk
index 7519a3d..9baf196 100644
--- a/engines/supernova/module.mk
+++ b/engines/supernova/module.mk
@@ -5,7 +5,8 @@ MODULE_OBJS := \
detection.o \
graphics.o \
supernova.o \
- rooms.o
+ rooms.o \
+ state.o
MODULE_DIRS += \
engines/supernova
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 8e52404..e7a76c8 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -422,7 +422,7 @@ enum ObjectID {
TICKETS
};
-static const char *const guiCommands[] = {
+static const char *const guiCommand_DE[] = {
"Gehe",
"Schau",
"Nimm",
@@ -435,6 +435,11 @@ static const char *const guiCommands[] = {
"Gib"
};
+static const char *guiStatusCommand_DE[10] =
+{"Gehe zu ","Schau ","Nimm ","\231ffne ","Schlie\341e ","Dr\201cke ","Ziehe ","Benutze ","Rede mit ","Gib "};
+static const char *guiStatusCommand_EN[10] =
+{"Go to ", "Look at ", "Take ", "Open ", "Close ", "Press ", "Pull ", "Use ", "Talk to ", "Give "};
+
ObjectType operator|(ObjectType a, ObjectType b);
ObjectType operator&(ObjectType a, ObjectType b);
ObjectType operator^(ObjectType a, ObjectType b);
@@ -501,36 +506,6 @@ struct Object {
byte _direction;
};
-struct GameState {
- int32 time;
- int32 timeSleep;
- int32 timeStarting;
- int32 timeAlarm;
- int32 timeAlarmSystem;
- int32 eventTime;
- int32 shipEnergy;
- int32 landingModuleEnergy;
- uint16 greatF;
- int16 timeRobot;
- int16 money;
- char coins;
- char shoes;
- char nameSeen;
- char destination;
- char benOverlay;
- char language;
- bool corridorSearch;
- bool alarmOn;
- bool terminalStripConnected;
- bool terminalStripWire;
- bool cableConnected;
- bool powerOff;
- bool cockpitSeen;
- bool airlockSeen;
- bool holdSeen;
- bool dream;
-};
-
}
#endif // MSN_DEF_H
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index cd7a88b..757fe6c 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -23,9 +23,18 @@
#include "common/system.h"
#include "supernova/supernova.h"
+#include "supernova/state.h"
namespace Supernova {
+void StartingItems::onEntrance() {
+ for (int i = 0; i < 3; ++i)
+ _gm->_inventory.add(*getObject(i));
+
+ this->setRoomSeen(true);
+ _gm->changeRoom(CABIN_R3);
+}
+
bool ShipCorridor::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_PRESS) && (obj1._id == BUTTON)) {
if (_objectState[6].hasProperty(OPENED)) {
@@ -165,7 +174,7 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
_shown[kMaxSection - 1] = false;
} else if (((verb == ACTION_WALK) || (verb == ACTION_USE)) &&
((obj1._id == CABINS) || (obj1._id == CABIN))) {
- r = &_gm->_rooms[AIRLOCK];
+ r = _gm->_rooms[AIRLOCK];
if (!(obj1._id == CABIN) || !(_shown[5])) {
_vm->renderMessage("Es würde wenig bringen,|sich in eine Schlafkammer zu legen,|die nicht eingeschaltet ist.");
} else if (r->getObject(5)->hasProperty(WORN)) {
@@ -174,7 +183,7 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
_vm->paletteFadeOut();
_vm->renderImage(_gm->_currentRoom->getFileNumber(), _gm->invertSection(5));
_vm->renderImage(_gm->_currentRoom->getFileNumber(), _gm->invertSection(4));
- r = &_gm->_rooms[GENERATOR];
+ r = _gm->_rooms[GENERATOR];
if (r->isSectionVisible(9)) {
energy = &_gm->_state.landingModuleEnergy;
} else {
@@ -186,7 +195,7 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
if (_gm->_state.timeSleep >= *energy) {
_gm->_state.timeSleep = *energy;
if (r->isSectionVisible(9)) {
- r = &_gm->_rooms[LANDINGMODULE]; // Monitors off
+ r = _gm->_rooms[LANDINGMODULE]; // Monitors off
r->setSectionVisible(2, false);
r->setSectionVisible(7, false);
r->setSectionVisible(8, false);
@@ -196,18 +205,18 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
}
if (_gm->_state.timeSleep == _gm->_state.time) {
_vm->renderImage(_gm->_currentRoom->getFileNumber(), 3); // landed
- r = &_gm->_rooms[COCKPIT];
+ r = _gm->_rooms[COCKPIT];
r->setSectionVisible(23, true);
- r = &_gm->_rooms[CABIN_R2];
+ r = _gm->_rooms[CABIN_R2];
r->setSectionVisible(5, false);
r->setSectionVisible(6, true);
r->getObject(2)->_click = 10;
- r = &_gm->_rooms[HOLD];
+ r = _gm->_rooms[HOLD];
r->setSectionVisible(0, false);
r->setSectionVisible(1, true);
r->getObject(1)->_click = 255;
r->getObject(3)->_click = 255;
- r = &_gm->_rooms[GENERATOR];
+ r = _gm->_rooms[GENERATOR];
r->setSectionVisible(6, false);
r->setSectionVisible(7, true);
r->getObject(1)->_click = 14;
@@ -226,7 +235,7 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_state.alarmOn = (_gm->_state.timeAlarmSystem > _vm->getDOSTicks());
if (!*energy) {
_gm->turnOff();
- r = &_gm->_rooms[GENERATOR];
+ r = _gm->_rooms[GENERATOR];
r->setSectionVisible(4, r->isSectionVisible(2));
}
if (_gm->_state.time == 0) {
@@ -287,7 +296,7 @@ void ShipSleepCabin::animation() {
}
}
void ShipSleepCabin::onEntrance() {
- if (_gm->_state.dream && (_gm->_rooms[CAVE].getObject(1)->_exitRoom == MEETUP3)) {
+ if (_gm->_state.dream && (_gm->_rooms[CAVE]->getObject(1)->_exitRoom == MEETUP3)) {
_vm->renderMessage("Du wachst mit brummendem Schädel auf|und merkst, daß du nur geträumt hast.");
_gm->mouseWait(_gm->_timer1);
_vm->removeMessage();
@@ -495,7 +504,7 @@ bool ShipCabinL3::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, WIRE2))
_vm->renderMessage("Schneid doch besser ein|lngeres Stck Kabel ab!");
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, WIRE)) {
- r = &_gm->_rooms[AIRLOCK];
+ r = _gm->_rooms[AIRLOCK];
if (!this->isSectionVisible(10) && !r->getObject(5)->hasProperty(WORN)) {
_vm->renderImage(this->getFileNumber(), 25);
_gm->shock();
@@ -554,10 +563,10 @@ bool ShipCabinR3::interact(Action verb, Object &obj1, Object &obj2) {
}
else if ((verb == ACTION_TAKE) && (obj1._id == DISCMAN) &&
- !_gm->_rooms[0].getObject(3)->hasProperty(CARRIED)) {
+ !_gm->_rooms[0]->getObject(3)->hasProperty(CARRIED)) {
this->getObject(10)->_click = 34; // Locker empty
obj1._click = 255;
- _gm->takeObject(*_gm->_rooms[0].getObject(3));
+ _gm->takeObject(*_gm->_rooms[0]->getObject(3));
_vm->renderImage(this->getFileNumber(), 16);
} else if ((verb == ACTION_TAKE) && (obj1._id == ROPE) &&
obj1.hasProperty(CARRIED)) {
@@ -657,7 +666,7 @@ bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) {
this->setSectionVisible(5, false);
_gm->wait2(2);
_vm->renderImage(this->getFileNumber(), _gm->invertSection(4));
- r = &_gm->_rooms[AIRLOCK];
+ r = _gm->_rooms[AIRLOCK];
if (!r->getObject(4)->hasProperty(WORN) ||
!r->getObject(5)->hasProperty(WORN) ||
!r->getObject(6)->hasProperty(WORN)) {
@@ -715,12 +724,12 @@ bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderImage(this->getFileNumber(), 5);
this->getObject(0)->_name = "langes Kabel mit Stecker";
this->getObject(0)->_click = 10;
- r = &_gm->_rooms[CABIN_L2];
+ r = _gm->_rooms[CABIN_L2];
_gm->_inventory.remove(*this->getObject(9));
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, GENERATOR_TOP)) {
if (this->isSectionVisible(5)) {
- r = &_gm->_rooms[GENERATOR];
+ r = _gm->_rooms[GENERATOR];
r->getObject(0)->_click = 15;
r->getObject(1)->_click = 13;
r->setSectionVisible(6, false);
@@ -743,7 +752,7 @@ void ShipHold::onEntrance() {
if (!this->hasSeen())
_vm->renderMessage("Was ist denn das fr ein Chaos?|Und auáerdem fehlt das Notraumschiff!|Jetzt wird mir einiges klar.|Die anderen sind geflchtet,|und ich habe es verpennt.");
this->setRoomSeen(true);
- _gm->_rooms[COCKPIT].setRoomSeen(true);
+ _gm->_rooms[COCKPIT]->setRoomSeen(true);
}
bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
@@ -752,7 +761,7 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage(obj1._description);
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, PEN, LANDINGMOD_BUTTON)) {
if (_gm->_state.landingModuleEnergy) {
- r = &_gm->_rooms[GENERATOR];
+ r = _gm->_rooms[GENERATOR];
if (this->isSectionVisible(7)) {
_vm->renderImage(this->getFileNumber(), _gm->invertSection(9));
_vm->renderImage(this->getFileNumber(), _gm->invertSection(2));
@@ -770,7 +779,7 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
// load("MSN_DATA.025");
_gm->roomBrightness();
_vm->paletteBrightness();
- r = &_gm->_rooms[SLEEP];
+ r = _gm->_rooms[SLEEP];
r->setSectionVisible(1, false);
r->setSectionVisible(2, false);
_gm->wait2(2);
@@ -791,7 +800,7 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
else if ((verb == ACTION_USE) && (obj1._id == KEYBOARD))
_vm->renderMessage("Laá lieber die Finger davon!");
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, WIRE, LANDINGMOD_SOCKET)) {
- r = &_gm->_rooms[CABIN_L3];
+ r = _gm->_rooms[CABIN_L3];
_gm->_inventory.remove(*r->getObject(8));
this->getObject(4)->_name = r->getObject(8)->_name;
_vm->renderImage(this->getFileNumber(), 4);
@@ -808,7 +817,7 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, TERMINALSTRIP)) {
_vm->renderImage(this->getFileNumber(), 11);
this->getObject(4)->_name = "Leitung mit Lsterklemme";
- r = &_gm->_rooms[HOLD];
+ r = _gm->_rooms[HOLD];
_gm->_inventory.remove(*r->getObject(2));
_gm->_state.terminalStripConnected = true;
_gm->_state.terminalStripWire = true;
@@ -819,19 +828,19 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderImage(this->getFileNumber(), 5);
this->getObject(4)->_name = "langes Kabel mit Stecker";
this->getObject(4)->_click = 6;
- r = &_gm->_rooms[CABIN_L2];
+ r = _gm->_rooms[CABIN_L2];
_gm->_inventory.remove(*r->getObject(9));
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, LANDINGMOD_HATCH)) {
if (this->getObject(5)->hasProperty(OPENED)) {
- r = &_gm->_rooms[HOLD];
+ r = _gm->_rooms[HOLD];
if (this->isSectionVisible(5)) {
- _gm->_rooms[HOLD].setSectionVisible(5, false);
+ _gm->_rooms[HOLD]->setSectionVisible(5, false);
r->getObject(0)->_click = 10;
} else
r->getObject(0)->_click = 9;
- _gm->_rooms[HOLD].setSectionVisible(4, false);
+ _gm->_rooms[HOLD]->setSectionVisible(4, false);
r->getObject(0)->_name = this->getObject(4)->_name;
_vm->renderImage(this->getFileNumber(), _gm->invertSection(5));
_vm->renderImage(this->getFileNumber(), _gm->invertSection(4));
@@ -866,7 +875,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderImage(this->getFileNumber(), 10);
if (this->isSectionVisible(13))
_vm->renderImage(this->getFileNumber(), 13);
- _gm->_rooms[HOLD].setSectionVisible(3, true);
+ _gm->_rooms[HOLD]->setSectionVisible(3, true);
obj1.setProperty(OPENED);
obj1._click = 2;
_vm->playSound(kAudioDoorOpen);
@@ -881,7 +890,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
this->setSectionVisible(10, false);
if (this->isSectionVisible(13))
_vm->renderImage(this->getFileNumber(), 13);
- _gm->_rooms[HOLD].setSectionVisible(3, false);
+ _gm->_rooms[HOLD]->setSectionVisible(3, false);
obj1.disableProperty(OPENED);
obj1._click = 1;
_vm->playSound(kAudioDoorClose);
@@ -944,12 +953,12 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderImage(this->getFileNumber(), 3);
_vm->renderImage(this->getFileNumber(), 9);
this->getObject(0)->_click = 16;
- r = &_gm->_rooms[LANDINGMODULE];
+ r = _gm->_rooms[LANDINGMODULE];
if (_gm->_state.landingModuleEnergy && r->isSectionVisible(7))
_gm->turnOn();
else
_vm->renderImage(this->getFileNumber(), 4);
- _gm->_rooms[HOLD].setSectionVisible(7, true);
+ _gm->_rooms[HOLD]->setSectionVisible(7, true);
_gm->great(3);
} else if ((verb == ACTION_PULL) && (obj1._id == GENERATOR_WIRE) &&
(obj1._click == 16)) {
@@ -960,7 +969,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderImage(this->getFileNumber(), 8);
obj1._click = 15;
_gm->turnOff();
- _gm->_rooms[HOLD].setSectionVisible(7, false);
+ _gm->_rooms[HOLD]->setSectionVisible(7, false);
} else if ((verb == ACTION_USE) &&
(Object::combine(obj1, obj2, WIRE, CLIP) ||
Object::combine(obj1, obj2, SPOOL, CLIP)) &&
@@ -973,7 +982,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage("Es zeigt volle Spannung an.");
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LADDER, ROPE)) {
_vm->renderImage(this->getFileNumber(), 13);
- r = &_gm->_rooms[CABIN_R3];
+ r = _gm->_rooms[CABIN_R3];
_gm->_inventory.remove(*r->getObject(9));
this->getObject(3)->_click = 18;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, OUTERHATCH, GENERATOR_ROPE)) {
@@ -988,7 +997,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
} else {
_vm->renderImage(this->getFileNumber(), 12);
}
- r = &_gm->_rooms[OUTSIDE];
+ r = _gm->_rooms[OUTSIDE];
r->setSectionVisible(1, true);
r->getObject(1)->_click = 1;
this->getObject(3)->_click = 17;
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index e78f446..d3d850a 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -36,6 +36,8 @@ class Room {
public:
Room() {
_seen = false;
+ for (int i = 0; i < kMaxSection; ++i)
+ _shown[i] = false;
}
bool hasSeen() {
@@ -101,6 +103,8 @@ public:
Object("Discman", "Es ist eine \"Mad Monkeys\"-CD darin.", DISCMAN,
TAKE | COMBINABLE, 255, 255, 0, NULLROOM, 0);
}
+
+ virtual void onEntrance();
};
// Spaceship
@@ -415,7 +419,7 @@ public:
_objectState[20] = Object("Schrank",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,1,1,0);
_objectState[21] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,2,2,0);
_objectState[22] = Object("Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
- _objectState[23] = Object("Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,2);
+ _objectState[23] = Object("Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -432,7 +436,7 @@ public:
_objectState[0] = Object("Klo","Ein Klo mit Saugmechanismus.",TOILET,NULLTYPE,0,0,0);
_objectState[1] = Object("Dusche",Object::defaultDescription,SHOWER,NULLTYPE,1,1,0);
- _objectState[2] = Object("Ausgang",Object::defaultDescription,BATHROOM_EXIT,EXIT,255,255,0,NULLROOM,2);
+ _objectState[2] = Object("Ausgang",Object::defaultDescription,BATHROOM_EXIT,EXIT,255,255,0,CABIN_R3,2);
}
};
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
new file mode 100644
index 0000000..1899daf
--- /dev/null
+++ b/engines/supernova/state.cpp
@@ -0,0 +1,921 @@
+
+#include "supernova/supernova.h"
+#include "supernova/state.h"
+
+namespace Supernova {
+
+Inventory::Inventory()
+ : _numObjects(0)
+{}
+
+// TODO: Update Inventory surface for scrolling
+void Inventory::add(Object &obj) {
+ if (_numObjects < kMaxCarry)
+ _inventory[_numObjects++] = &obj;
+
+// if (inventory_amount>8) inventory_scroll = ((inventory_amount+1)/2)*2-8;
+// show_inventory();
+}
+
+// TODO: Update Inventory surface for scrolling
+void Inventory::remove(Object &obj) {
+ for (uint i = 0; i < _numObjects; ++i) {
+ if (_inventory[i] == &obj) {
+ --_numObjects;
+ while (i < _numObjects) {
+ _inventory[i] = _inventory[i + 1];
+ ++i;
+ }
+ obj.disableProperty(CARRIED);
+ }
+ }
+}
+
+Object *Inventory::get(uint index) const {
+ if (index < _numObjects)
+ return _inventory[index];
+
+ return NULL;
+}
+
+Object *Inventory::get(ObjectID id) const {
+ for (uint i = 0; i < _numObjects; ++i) {
+ if (_inventory[i]->_id == id)
+ return _inventory[i];
+ }
+
+ return NULL;
+}
+
+
+static const char *timeToString(int t) {
+ // TODO: Does ScummVM emulate PIT timings for DOS?
+
+ static char s[9];
+ strcpy(s," 0:00:00");
+ s[7] = t % 10 + '0';
+ t /= 10;
+ s[6] = t % 6 + '0';
+ t /= 6;
+ s[4] = t % 10 + '0';
+ t /= 10;
+ s[3] = t % 6 + '0';
+ t /= 6;
+ s[1] = t % 10 + '0';
+ t /= 10;
+ if (t)
+ s[0] = t+48;
+
+ return(s);
+}
+
+GameManager::GameManager(SupernovaEngine *vm) {
+ _rooms[INTRO] = new StartingItems(vm, this);
+ _rooms[CORRIDOR] = new ShipCorridor(vm, this);
+ _rooms[HALL] = new ShipHall(vm, this);
+ _rooms[SLEEP] = new ShipSleepCabin(vm, this);
+ _rooms[COCKPIT] = new ShipCockpit(vm, this);
+ _rooms[AIRLOCK] = new ShipAirlock(vm, this);
+ _rooms[HOLD] = new ShipHold(vm, this);
+ _rooms[LANDINGMODULE] = new ShipLandingModule(vm, this);
+ _rooms[GENERATOR] = new ShipGenerator(vm, this);
+ _rooms[OUTSIDE] = new ShipOuterSpace(vm, this);
+ _rooms[CABIN_R1] = new ShipCabinR1(vm, this);
+ _rooms[CABIN_R2] = new ShipCabinR2(vm, this);
+ _rooms[CABIN_R3] = new ShipCabinR3(vm, this);
+ _rooms[CABIN_L1] = new ShipCabinL1(vm, this);
+ _rooms[CABIN_L2] = new ShipCabinL2(vm, this);
+ _rooms[CABIN_L3] = new ShipCabinL3(vm, this);
+ _rooms[BATHROOM] = new ShipCabinBathroom(vm, this);
+
+// _rooms[ROCKS]
+// _rooms[CAVE]
+// _rooms[MEETUP]
+// _rooms[ENTRANCE]
+// _rooms[REST]
+// _rooms[ROGER]
+// _rooms[GLIDER]
+// _rooms[MEETUP2]
+// _rooms[MEETUP3]
+
+// _rooms[CELL]
+// _rooms[CORRIDOR1]
+// _rooms[CORRIDOR2]
+// _rooms[CORRIDOR3]
+// _rooms[CORRIDOR4]
+// _rooms[CORRIDOR5]
+// _rooms[CORRIDOR6]
+// _rooms[CORRIDOR7]
+// _rooms[CORRIDOR8]
+// _rooms[CORRIDOR9]
+// _rooms[BCORRIDOR]
+// _rooms[GUARD]
+// _rooms[GUARD3]
+// _rooms[OFFICE_L1]
+// _rooms[OFFICE_L2]
+// _rooms[OFFICE_R1]
+// _rooms[OFFICE_R2]
+// _rooms[OFFICE_L]
+// _rooms[ELEVATOR]
+// _rooms[STATION]
+// _rooms[SIGN]
+
+ _currentRoom = _rooms[INTRO];
+ _vm = vm;
+ _inputObject[0] = &_nullObjectInstance;
+ _inputObject[1] = &_nullObjectInstance;
+ _inputVerb = ACTION_WALK;
+ _inputVerb2 = false;
+ _inventoryScroll = 0;
+
+ initGui();
+}
+
+void GameManager::initGui() {
+ // TODO: Initialize GUI dimensions to eliminate the use of magic numbers
+ // especially in the input handling.
+ // Wrapping it in state machine would probably make a lot of it easier
+ // as the current state i.e. when selecting/combining objects would need
+ // to be queried when deciding what to do (flush inputs / render / ... )
+
+ int x = 0;
+ for (int i = 0; i < ARRAYSIZE(_guiCommandDimensions); ++i) {
+ int width;
+ if (i < 9)
+ width = _vm->characterWidth(guiCommand_DE[i]) + 2;
+ else
+ width = 320 - x;
+
+ _guiCommandDimensions[i] = Common::Rect(x, 150, x + width, 159);
+ x += width + 2;
+ }
+}
+
+void GameManager::processInput(Common::KeyState &state) {
+ switch (state.keycode) {
+ case Common::KEYCODE_F1:
+ // help
+ break;
+ case Common::KEYCODE_F2:
+ // show game doc
+ break;
+ case Common::KEYCODE_F3:
+ // show game info
+ break;
+ case Common::KEYCODE_F4:
+ // set text speed
+ break;
+ case Common::KEYCODE_F5:
+ // load/save
+ break;
+ case Common::KEYCODE_x:
+ if (state.flags & Common::KBD_ALT) {
+ // quit game
+ _vm->_gameRunning = false;
+ } else {
+ _key = state.ascii;
+ }
+ break;
+ default:
+ _key = state.ascii;
+ }
+}
+
+void GameManager::processInput(Common::EventType eventType, int x, int y) {
+ _mouseClickType = eventType;
+ _mouseX = x;
+ _mouseY = y;
+ _inputObject[0] = &_nullObjectInstance;
+ _inputObject[1] = &_nullObjectInstance;
+ _inputVerb = ACTION_WALK;
+ _inputVerb2 = false;
+ _mouseField = -1;
+ _objectNumber = 0;
+
+ if (_mouseClickType == Common::EVENT_LBUTTONUP) {
+ // STUB
+
+ } else if (_mouseClickType == Common::EVENT_RBUTTONUP) {
+ ObjectType type;
+ if (((_mouseField >= 0) && (_mouseField < 256)) ||
+ ((_mouseField >= 512) && (_mouseField < 768))) {
+ _inputObject[0] = _inputObject[_objectNumber];
+ _objectNumber = 0;
+ _inputVerb2 = false;
+ type = _inputObject[0]->_type;
+ if (type & OPEN) {
+ if (type & OPENED)
+ _inputVerb = ACTION_CLOSE;
+ else
+ _inputVerb = ACTION_OPEN;
+ } else if (type & PRESS) {
+ _inputVerb = ACTION_PRESS;
+ } else if (type & TALK) {
+ _inputVerb = ACTION_TALK;
+ } else {
+ _inputVerb = ACTION_LOOK;
+ }
+ }
+ } else if (_mouseClickType == Common::EVENT_MOUSEMOVE) {
+ int field;
+ int click;
+ field = -1;
+ /* command row? */
+ if ((y >= _guiCommandDimensions[0].top) && (y <= _guiCommandDimensions[0].bottom)) {
+ field = 9;
+ while (x < _guiCommandDimensions[field].left - 1)
+ field--;
+ field += 256;
+ }
+ /* exit box? */
+ else if ((x >= 283) && (x <= 317) && (y >= 163) && (y <= 197))
+ field = _exitList[(x - 283) / 7 + 5 * ((y - 163) / 7)];
+ /* inventory box */
+ else if ((y >= 161) && (x <= 270)) {
+ field = (x + 1) / 136 + ((y - 161) / 10) * 2;
+ if (field + _inventoryScroll < _inventory.getSize())
+ field += 512;
+ else
+ field = -1;
+ }
+ /* inventory arrows */
+ else if ((y >= 161) && (x >= 271) && (x < 279)) {
+ if (y > 180) field = 769;
+ else field = 768;
+ }
+ /* message window */
+// else if (_vm->_messageDisplayed && (x >= message_columns) && (x < message_columns + message_width) && (y >= message_rows) && (y < message_rows + message_height))
+ else if (_vm->_messageDisplayed)
+ field = -1;
+ /* normal item */
+ else {
+ for (int i = 0; (_currentRoom->getObject(i)->_name != NULL) && (field == -1); i++) {
+ click = _currentRoom->getObject(i)->_click;
+ if (click != 255) {
+ MSNImageDecoder::ClickField *clickField = _vm->_currentImage->_clickField;
+ do {
+ if ((x >= clickField[click].x1) && (x <= clickField[click].x2) &&
+ (y >= clickField[click].y1) && (y <= clickField[click].y2))
+ field = i;
+
+ click = clickField[click].next;
+ } while ((click != 0) && (field == -1));
+ }
+ }
+
+ if ((_objectNumber == 1) && (_currentRoom->getObject(field) == _inputObject[0]))
+ field = -1;
+ }
+ if (_mouseField != field) {
+ if (_mouseField >= 768) {
+ inventory_arrow(_mouseField - 768, 0);
+ } else if (_mouseField >= 512) {
+ inventory_object(_mouseField - 512, 0);
+ _inputObject[_objectNumber] = &_nullObjectInstance;
+ drawStatus();
+ } else if (_mouseField >= 256) {
+ drawCommandBox(_mouseField - 256, 0);
+ } else if (_mouseField != -1) {
+ _inputObject[_objectNumber] = &_nullObjectInstance;
+ drawStatus();
+ }
+ _mouseField = field;
+ if (_mouseField >= 768) {
+ inventory_arrow(_mouseField - 768, 1);
+ } else if (_mouseField >= 512) {
+ inventory_object(_mouseField - 512, 1);
+ _inputObject[_objectNumber] = _inventory.get(_mouseField - 512 + _inventoryScroll);
+ drawStatus();
+ } else if (_mouseField >= 256) {
+ drawCommandBox(_mouseField - 256, 1);
+ } else if (_mouseField != -1) {
+ _inputObject[_objectNumber] = _currentRoom->getObject(_mouseField);
+ drawStatus();
+ }
+ }
+ }
+}
+
+bool GameManager::isHelmetOff() {
+ Object *helmet = _inventory.get(HELMET);
+ if (helmet && helmet->hasProperty(WORN)) {
+ _vm->renderMessage("Irgendwie ist ein Raumhelm|beim Essen unpraktisch.");
+ return false;
+ }
+
+ return true;
+}
+
+void GameManager::great(uint number) {
+ if (number && (_state.greatF & (1 << number)))
+ return;
+
+ _vm->playSound(kAudioUndef7);
+ _state.greatF |= 1 << number;
+}
+
+bool GameManager::airless() {
+ return (
+ ((_currentRoom > _rooms[AIRLOCK]) && (_currentRoom < _rooms[CABIN_R1])) ||
+ ((_currentRoom > _rooms[BATHROOM])&& (_currentRoom < _rooms[ENTRANCE])) ||
+ ((_currentRoom == _rooms[AIRLOCK]) && (_currentRoom->getObject(1)->hasProperty(OPENED))) ||
+ (_currentRoom >= _rooms[MEETUP2])
+ );
+}
+
+void GameManager::turnOff() {
+ if (_state.powerOff)
+ return;
+
+ _state.powerOff = true;
+ roomBrightness();
+
+}
+void GameManager::turnOn() {
+ // STUB
+}
+
+void GameManager::takeObject(Object &obj) {
+ if (obj.hasProperty(CARRIED))
+ return;
+
+ if (obj._section != 0)
+ _vm->renderImage(_currentRoom->getFileNumber(), obj._section);
+ obj.setProperty(CARRIED);
+ obj._click = obj._click2 = 255;
+ _inventory.add(obj);
+}
+
+void GameManager::inventory_object(int num, bool brightness) {
+}
+
+void GameManager::drawCommandBox() {
+ for (int i = 0; i < 10; ++i)
+ drawCommandBox(i, 0);
+}
+
+void GameManager::drawCommandBox(int cmd, bool brightness) {
+ _vm->renderBox(_guiCommandDimensions[cmd].left,
+ _guiCommandDimensions[cmd].top,
+ _guiCommandDimensions[cmd].width(),
+ _guiCommandDimensions[cmd].height(),
+ (brightness) ? HGR_BEF_HELL:HGR_BEF);
+ _vm->renderText(guiCommand_DE[cmd],
+ _guiCommandDimensions[cmd].left + 1,
+ _guiCommandDimensions[cmd].top + 1,
+ (brightness) ? COL_BEF_HELL:COL_BEF);
+}
+
+void GameManager::inventory_arrow(int num, bool brightness) {
+ // STUB
+}
+
+void GameManager::drawInventory() {
+ // TODO: implement scrolling and moveover effects
+ int brightness = 0;
+ for (int i = 0; i < 8; ++i) {
+ int x = 136 * (i % 2);
+ int y = 161 + 10 * (i / 2);
+ _vm->renderBox(x, y, 135, 9, (brightness) ? HGR_INV_HELL : HGR_INV);
+ if (i < _inventory.getSize())
+ _vm->renderText(_inventory.get(i + _inventoryScroll)->_name, x + 1, y + 1, (brightness) ? COL_INV_HELL : COL_INV);
+ }
+ _vm->renderBox(272, 161, 7, 19, HGR_INV);
+ _vm->renderBox(272, 181, 7, 19, HGR_INV);
+}
+
+void GameManager::mouseInput() {
+ // STUB
+}
+
+void GameManager::mouseInput2() {
+ // STUB
+}
+
+void GameManager::mouseInput3() {
+ // STUB
+}
+
+void GameManager::mouseWait(int delay) {
+ // STUB
+}
+
+void GameManager::roomBrightness() {
+ // STUB
+}
+
+void GameManager::loadTime() {
+ // STUB
+}
+
+void GameManager::saveTime() {
+ // STUB
+}
+
+bool GameManager::saveGame(int number) {
+ // STUB
+ return false;
+}
+
+void GameManager::changeRoom(RoomID id) {
+ _currentRoom = _rooms[id];
+}
+
+void GameManager::errorTemp() {
+ // STUB
+}
+
+void GameManager::wait2(int delay) {
+ // STUB
+}
+
+void GameManager::screenShake() {
+ // STUB
+}
+
+void GameManager::palette() {
+ // STUB
+ // Adjust palette to brightness parameters and make it current
+}
+
+void GameManager::shock() {
+ // STUB
+ _vm->playSound(kAudioShock);
+ // die
+}
+
+void GameManager::showMenu() {
+ _vm->renderBox(0, 138, 320, 62, 0);
+ _vm->renderBox(0, 140, 320, 9, HGR_BEF_ANZ);
+ for (int i = 0; i < 10; i++)
+ drawCommandBox(i, 0);
+ _vm->renderBox(281, 161, 39, 39, HGR_AUSG);
+ drawInventory();
+}
+
+void GameManager::drawMapExits() {
+ // TODO: Preload _exitList on room entry instead on every call
+ _vm->renderBox(281, 161, 39, 39, HGR_AUSG);
+
+ for (int i = 0; i < 25; i++)
+ _exitList[i] = -1;
+ for (int i = 0; i < kMaxObject; i++) {
+ if (_currentRoom->getObject(i)->hasProperty(EXIT)) {
+ byte r = _currentRoom->getObject(i)->_direction;
+ _exitList[r] = i;
+ int x = 284 + 7 * (r % 5);
+ int y = 164 + 7 * (r / 5);
+ _vm->renderBox(x, y, 5, 5, COL_AUSG);
+ }
+ }
+}
+
+void GameManager::animationOff() {
+ // STUB
+}
+
+void GameManager::animationOn() {
+ // STUB
+}
+
+void GameManager::edit(char *text, int x, int y, int length) {
+ // STUB
+}
+
+void GameManager::loadOverlayStart() {
+ // STUB
+}
+
+void GameManager::drawStatus() {
+ _vm->renderBox(0, 140, 320, 9, HGR_BEF_ANZ);
+ int index = static_cast<int>(_inputVerb);
+ _vm->renderText(guiStatusCommand_DE[index], 1, 141, COL_BEF_ANZ);
+
+ if (_inputObject[0]->_id != NULLOBJECT) {
+ _vm->renderText(_inputObject[0]->_name);
+ if (_inputVerb2) {
+ if (_inputVerb == ACTION_GIVE) {
+ // to
+ _vm->renderText(" an ");
+ } else {
+ // with
+ _vm->renderText(" mit ");
+ }
+ if (_inputObject[1] != &_nullObjectInstance)
+ _vm->renderText(_inputObject[1]->_name);
+ }
+ }
+}
+
+void GameManager::openLocker(const Room *room, Object *obj, Object *lock, int section) {
+ _vm->renderImage(room->getFileNumber(), section);
+ obj->setProperty(OPENED);
+ lock->_click = 255;
+ int i = obj->_click;
+ obj->_click = obj->_click2;
+ obj->_click2 = i;
+}
+
+void GameManager::closeLocker(const Room *room, Object *obj, Object *lock, int section) {
+ // STUB
+}
+
+int GameManager::invertSection(int section) {
+ if (section < 128)
+ section += 128;
+ else
+ section -= 128;
+
+ return section;
+}
+
+
+bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
+ Room *r;
+ char t[150];
+
+ if ((verb == ACTION_USE) && (obj1._id == SCHNUCK)) {
+ if (isHelmetOff()) {
+ takeObject(obj1);
+ _vm->renderMessage("Schmeckt ganz gut.");
+ _inventory.remove(obj1);
+ }
+ } else if ((verb == ACTION_USE) && (obj1._id == EGG)) {
+ if (isHelmetOff()) {
+ takeObject(obj1);
+ if (obj1.hasProperty(OPENED))
+ _vm->renderMessage("Schmeckt ganz gut.");
+ else
+ _vm->renderMessage("Da war irgendetwas drin,|aber jetzt hast du es|mit runtergeschluckt.");
+
+ _inventory.remove(obj1);
+ }
+ } else if ((verb == ACTION_OPEN) && (obj1._id == EGG)) {
+ takeObject(obj1);
+ if (obj1.hasProperty(OPENED)) {
+ _vm->renderMessage("Du hast es doch schon geffnet.");
+ } else {
+ takeObject(*_rooms[ENTRANCE]->getObject(8));
+ _vm->renderMessage("In dem Ei ist eine Tablette|in einer Plastikhlle.");
+ obj1.setProperty(OPENED);
+ }
+ } else if ((verb == ACTION_USE) && (obj1._id == PILL)) {
+ if (isHelmetOff()) {
+ _vm->renderMessage("Du iát die Tablette und merkst,|daá sich irgendetwas verndert hat.");
+ great(0);
+ _inventory.remove(obj1);
+ _state.language = 2;
+ takeObject(*_rooms[ENTRANCE]->getObject(17));
+ }
+ } else if ((verb == ACTION_LOOK) && (obj1._id == PILL_HULL) &&
+ (_state.language == 2)) {
+ _vm->renderMessage("Komisch! Auf einmal kannst du die Schrift lesen!|Darauf steht:\"Wenn Sie diese Schrift jetzt|lesen knnen, hat die Tablette gewirkt.\"");
+ _state.language = 1;
+ } else if ((verb == ACTION_OPEN) && (obj1._id == WALLET)) {
+ if (!_rooms[ROGER]->getObject(3)->hasProperty(CARRIED)) {
+ _vm->renderMessage("Das muát du erst nehmen.");
+ } else if (_rooms[ROGER]->getObject(7)->hasProperty(CARRIED)) {
+ _vm->renderMessage("Sie ist leer.");
+ } else {
+ _vm->renderMessage("Du findest 10 Buckazoids und eine Keycard.");
+ takeObject(*_rooms[ROGER]->getObject(7));
+ takeObject(*_rooms[ROGER]->getObject(8));
+ }
+ } else if ((verb == ACTION_LOOK) && (obj1._id == NEWSPAPER)) {
+ _vm->renderMessage("Es ist eine Art elektronische Zeitung.");
+ mouseWait(_timer1);
+ _vm->removeMessage();
+ _vm->renderMessage("Halt, hier ist ein interessanter Artikel.");
+ mouseWait(_timer1);
+ _vm->removeMessage();
+ _vm->renderImage(2,0);
+ _vm->setColor63(40);
+ mouseInput2();
+ _vm->renderRoom(*_currentRoom);
+ roomBrightness();
+ palette();
+ showMenu();
+ drawMapExits();
+ _vm->renderMessage("Hmm, irgendwie komme|ich mir verarscht vor.");
+ } else if ((verb == ACTION_LOOK) && (obj1._id == KEYCARD2)) {
+ _vm->renderMessage(obj1._description);
+ obj1._description = "Es ist die Keycard des Commanders.";
+ } else if ((verb == ACTION_LOOK) && (obj1._id == WATCH)) {
+ _vm->renderMessage(Common::String::format(
+ "Es ist eine Uhr mit extra|lautem Wecker. "
+ "Sie hat einen|Knopf zum Verstellen der Alarmzeit.|"
+ "Uhrzeit: %s Alarmzeit: %s",
+ timeToString(_vm->getDOSTicks() - _state.timeStarting),
+ timeToString(_state.timeAlarm)).c_str());
+ } else if ((verb == ACTION_PRESS) && (obj1._id == WATCH)) {
+ char *min;
+ int hours, minutes;
+ bool f;
+ animationOff();
+ _vm->saveScreen(88, 87, 144, 24);
+ _vm->renderBox(88, 87, 144, 24, kColorWhite35);
+ _vm->renderText("Neue Alarmzeit (hh:mm) :", 91, 90, kColorWhite99);
+ do {
+ t[0] = 0;
+ _vm->renderBox(91, 99, 138, 9, kColorDarkBlue);
+ do {
+ edit(t, 91, 100, 5);
+ } while ((_key != Common::ASCII_RETURN) && (_key != Common::ASCII_ESCAPE));
+ f = false;
+ if (t[0] == ':') {
+ t[0] = 0;
+ min = &(t[1]);
+ } else if (t[1] == ':') {
+ t[1] = 0;
+ min = &(t[2]);
+ } else if (t[2] == ':') {
+ t[2] = 0;
+ min = &(t[3]);
+ } else {
+ f = true;
+ }
+
+ for (uint i = 0; i < strlen(t); i++)
+ if ((t[i] < '0') || (t[i] > '9')) f = true;
+ for (uint i = 0; i < strlen(min); i++)
+ if ((min[i] < '0') || (min[i] > '9')) f = true;
+ hours = atoi(t);
+ minutes = atoi(min);
+ if ((hours > 23) || (minutes > 59)) f = true;
+ animationOn();
+ } while (f && (_key != Common::ASCII_ESCAPE));
+ _vm->restoreScreen();
+ if (_key != Common::ASCII_ESCAPE) {
+ _state.timeAlarm = (hours * 60 + minutes) * 1092.3888 + 8;
+ _state.timeAlarmSystem = _state.timeAlarm + _state.timeStarting;
+ _state.alarmOn = (_state.timeAlarmSystem > _vm->getDOSTicks());
+ }
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, WIRE)) {
+ r = _rooms[CABIN_L3];
+ if (!r->getObject(8)->hasProperty(CARRIED)) {
+ if (r->isSectionVisible(26))
+ _vm->renderMessage(Object::takeMessage);
+ else
+ return false;
+ } else {
+ r->getObject(8)->_name = "Leitung mit Lsterklemme";
+ r = _rooms[HOLD];
+ _inventory.remove(*r->getObject(2));
+ _state.terminalStripConnected = true;
+ _state.terminalStripWire = true;
+ _vm->renderMessage("Ok.");
+ }
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, SPOOL)) {
+ r = _rooms[CABIN_L2];
+ takeObject(*r->getObject(9));
+ r->getObject(9)->_name = "Kabelrolle mit Lsterklemme";
+ r = _rooms[HOLD];
+ _inventory.remove(*r->getObject(2));
+ _state.terminalStripConnected = true;
+ _vm->renderMessage("Ok.");
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, WIRE, SPOOL)) {
+ r = _rooms[CABIN_L3];
+ if (!_state.terminalStripConnected) {
+ if (r->isSectionVisible(26))
+ _vm->renderMessage("Womit denn?");
+ else
+ return false;
+ } else {
+ if (!r->getObject(8)->hasProperty(CARRIED)) {
+ _vm->renderMessage(Object::takeMessage);
+ } else {
+ r = _rooms[CABIN_L2];
+ takeObject(*r->getObject(9));
+ r = _rooms[CABIN_L3];
+ r->getObject(8)->_name = "langes Kabel mit Stecker";
+ r = _rooms[CABIN_L2];
+ _inventory.remove(*r->getObject(9));
+ _state.cableConnected = true;
+ _vm->renderMessage("Ok.");
+ }
+ }
+ } else if ((verb == ACTION_USE) && (obj1._id == SUIT)) {
+ takeObject(obj1);
+ if ((_currentRoom >= _rooms[ENTRANCE]) && (_currentRoom <= _rooms[ROGER])) {
+ if (obj1.hasProperty(WORN)) {
+ _vm->renderMessage("Die Luft hier ist atembar,|du ziehst den Anzug aus.");
+ _rooms[AIRLOCK]->getObject(4)->disableProperty(WORN);
+ _rooms[AIRLOCK]->getObject(5)->disableProperty(WORN);
+ _rooms[AIRLOCK]->getObject(6)->disableProperty(WORN);
+ } else
+ _vm->renderMessage("Hier drinnen brauchtst du deinen Anzug nicht.");
+ } else {
+ if (obj1.hasProperty(WORN)) {
+ r = _rooms[AIRLOCK];
+ if (r->getObject(4)->hasProperty(WORN)) {
+ _vm->renderMessage("Du muát erst den Helm abnehmen.");
+ } else if (r->getObject(6)->hasProperty(WORN)) {
+ _vm->renderMessage("Du muát erst den Versorgungsteil abnehmen.");
+ } else {
+ obj1.disableProperty(WORN);
+ _vm->renderMessage("Du ziehst den Raumanzug aus.");
+ }
+ } else {
+ obj1.setProperty(WORN);
+ _vm->renderMessage("Du ziehst den Raumanzug an.");
+ }
+ }
+ } else if ((verb == ACTION_USE) && (obj1._id == HELMET)) {
+ takeObject(obj1);
+ if ((_currentRoom >= _rooms[ENTRANCE]) && (_currentRoom <= _rooms[ROGER])) {
+ if (obj1.hasProperty(WORN)) {
+ _vm->renderMessage("Die Luft hier ist atembar,|du ziehst den Anzug aus.");
+ _rooms[AIRLOCK]->getObject(4)->disableProperty(WORN);
+ _rooms[AIRLOCK]->getObject(5)->disableProperty(WORN);
+ _rooms[AIRLOCK]->getObject(6)->disableProperty(WORN);
+ } else {
+ _vm->renderMessage("Hier drinnen brauchtst du deinen Anzug nicht.");
+ }
+ } else {
+ if (obj1.hasProperty(WORN)) {
+ if (airless()) {
+ //TODO: Death screen
+// longjmp(dead, "Den Helm httest du|besser angelassen!");
+ }
+ obj1.disableProperty(WORN);
+ _vm->renderMessage("Du ziehst den Helm ab.");
+ } else {
+ r = _rooms[AIRLOCK];
+ if (r->getObject(5)->hasProperty(WORN)) {
+ obj1.setProperty(WORN);
+ _vm->renderMessage("Du ziehst den Helm auf.");
+ } else {
+ _vm->renderMessage("Du muát erst den Anzug anziehen.");
+ }
+ }
+ }
+ } else if ((verb == ACTION_USE) && (obj1._id == LIFESUPPORT)) {
+ takeObject(obj1);
+ if ((_currentRoom >= _rooms[ENTRANCE]) && (_currentRoom <= _rooms[ROGER])) {
+ if (obj1.hasProperty(WORN)) {
+ _vm->renderMessage("Die Luft hier ist atembar,|du ziehst den Anzug aus.");
+ _rooms[AIRLOCK]->getObject(4)->disableProperty(WORN);
+ _rooms[AIRLOCK]->getObject(5)->disableProperty(WORN);
+ _rooms[AIRLOCK]->getObject(6)->disableProperty(WORN);
+ } else
+ _vm->renderMessage("Hier drinnen brauchtst du deinen Anzug nicht.");
+ } else {
+ if (obj1.hasProperty(WORN)) {
+ if (airless()) {
+ //TODO: Death screen
+// longjmp(dead, "Den Versorungsteil httest du|besser nicht abgenommen!");
+ }
+ obj1.disableProperty(WORN);
+ _vm->renderMessage("Du nimmst den Versorgungsteil ab.");
+ } else {
+ r = _rooms[AIRLOCK];
+ if (r->getObject(5)->hasProperty(WORN)) {
+ obj1.setProperty(WORN);
+ _vm->renderMessage("Du ziehst den Versorgungsteil an.");
+ } else {
+ _vm->renderMessage("Du muát erst den Anzug anziehen.");
+ }
+ }
+ }
+ } else if ((verb == ACTION_WALK) && (obj1._id == BATHROOM_DOOR)) {
+// *bathroom = current_room;
+ return false;
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, WIRE, SOCKET))
+ _vm->renderMessage("Die Leitung ist hier unntz.");
+ else if ((verb == ACTION_LOOK) && (obj1._id == BOOK2)) {
+ _vm->renderMessage("Stark, das ist ja die Fortsetzung zum \"Anhalter\":|\"Das Restaurant am Ende des Universums\".");
+ mouseWait(_timer1);
+ _vm->removeMessage();
+ _vm->renderMessage("Moment mal, es ist ein Lesezeichen drin,|auf dem \"Zweiundvierzig\" steht.");
+ } else {
+ return false;
+ }
+
+ return true;
+}
+
+void GameManager::executeRoom() {
+ // TODO: clean up. minimize.
+ _vm->renderRoom(*_currentRoom);
+ drawMapExits();
+ drawInventory();
+ drawStatus();
+ drawCommandBox();
+ animationOn();
+ roomBrightness();
+ if (_vm->_brightness == 0)
+ _vm->paletteFadeIn();
+ else
+ _vm->paletteBrightness();
+
+ if (!_currentRoom->hasSeen())
+ _currentRoom->onEntrance();
+
+ bool validCommand = genericInteract(_inputVerb, *_inputObject[0], *_inputObject[1]);
+
+
+#if 0
+ if (!validCommand) {
+ validCommand = _currentRoom->interact(_inputVerb, *_inputObject[0], *_inputObject[1]);
+ if (!validCommand) {
+ switch (_inputVerb) {
+ case ACTION_LOOK:
+ _vm->renderMessage(_inputObject[0]->_description);
+ break;
+
+ case ACTION_WALK:
+ if (_inputObject[0]->hasProperty(CARRIED)) {
+ // You already carry this.
+ _vm->renderMessage("Das trgst du doch bei dir.");
+ } else if (!_inputObject[0]->hasProperty(EXIT)) {
+ // You're already there.
+ _vm->renderMessage("Du bist doch schon da.");
+ } else if (_inputObject[0]->hasProperty(OPEN) && !_inputObject[0]->hasProperty(OPENED)) {
+ // This is closed
+ _vm->renderMessage("Das ist geschlossen.");
+ } else {
+ _currentRoom = _rooms[_inputObject[0]->_exitRoom];
+ return;
+ }
+ break;
+
+ case ACTION_TAKE:
+ if (_inputObject[0]->hasProperty(OPENED)) {
+ // You already have that
+ _vm->renderMessage("Das hast du doch schon.");
+ } else if (_inputObject[0]->hasProperty(UNNECESSARY)) {
+ // You do not need that.
+ _vm->renderMessage("Das brauchst du nicht.");
+ } else if (!_inputObject[0]->hasProperty(TAKE)) {
+ // You can't take that.
+ _vm->renderMessage("Das kannst du nicht nehmen.");
+ } else {
+ takeObject(*_inputObject[0]);
+ }
+ break;
+
+ case ACTION_OPEN:
+ if (!_inputObject[0]->hasProperty(OPEN)) {
+ // This can't be opened
+ _vm->renderMessage("Das lát sich nicht ffnen.");
+ } else if (_inputObject[0]->hasProperty(OPENED)) {
+ // This is already opened.
+ _vm->renderMessage("Das ist schon offen.");
+ } else if (_inputObject[0]->hasProperty(CLOSED)) {
+ // This is locked.
+ _vm->renderMessage("Das ist verschlossen.");
+ } else {
+ _vm->renderImage(_currentRoom->getFileNumber(), _inputObject[0]->_section);
+ _inputObject[0]->setProperty(OPENED);
+ byte i = _inputObject[0]->_click;
+ _inputObject[0]->_click = _inputObject[0]->_click2;
+ _inputObject[0]->_click2 = i;
+ _vm->playSound(kAudioDoorOpen);
+ }
+ break;
+
+ case ACTION_CLOSE:
+ if (!_inputObject[0]->hasProperty(OPEN) ||
+ (_inputObject[0]->hasProperty(CLOSED) &&
+ _inputObject[0]->hasProperty(OPENED))) {
+ // This can't be closed.
+ _vm->renderMessage("Das lát sich nicht schlieáen.");
+ } else if (!_inputObject[0]->hasProperty(OPENED)) {
+ // This is already closed.
+ _vm->renderMessage("Das ist schon geschlossen.");
+ } else {
+ _vm->renderImage(_currentRoom->getFileNumber(), invertSection(_inputObject[0]->_section));
+ _inputObject[0]->disableProperty(OPENED);
+ byte i = _inputObject[0]->_click;
+ _inputObject[0]->_click = _inputObject[0]->_click2;
+ _inputObject[0]->_click2 = i;
+ _vm->playSound(kAudioDoorClose);
+ }
+ break;
+
+ case ACTION_GIVE:
+ if (_inputObject[0]->hasProperty(CARRIED)) {
+ // Better keep it!
+ _vm->renderMessage("Behalt es lieber!");
+ }
+ break;
+
+ default:
+ // This is not possible.
+ _vm->renderMessage("Das geht nicht.");
+ }
+
+ if (_newOverlay) {
+ loadOverlayStart();
+ _newOverlay = false;
+ }
+ if (_newRoom) {
+ _newRoom = false;
+ return;
+ }
+ }
+ }
+#endif
+}
+
+}
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
new file mode 100644
index 0000000..08e5591
--- /dev/null
+++ b/engines/supernova/state.h
@@ -0,0 +1,153 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef STATE_H
+#define STATE_H
+
+#include "common/rect.h"
+#include "supernova/rooms.h"
+
+namespace Supernova {
+
+struct GameState {
+ int32 time;
+ int32 timeSleep;
+ int32 timeStarting;
+ int32 timeAlarm;
+ int32 timeAlarmSystem;
+ int32 eventTime;
+ int32 shipEnergy;
+ int32 landingModuleEnergy;
+ uint16 greatF;
+ int16 timeRobot;
+ int16 money;
+ char coins;
+ char shoes;
+ char nameSeen;
+ char destination;
+ char benOverlay;
+ char language;
+ bool corridorSearch;
+ bool alarmOn;
+ bool terminalStripConnected;
+ bool terminalStripWire;
+ bool cableConnected;
+ bool powerOff;
+ bool cockpitSeen;
+ bool airlockSeen;
+ bool holdSeen;
+ bool dream;
+};
+
+class Inventory {
+public:
+ Inventory();
+
+ void add(Object &obj);
+ void remove(Object &obj);
+ Object *get(uint index) const;
+ Object *get(ObjectID id) const;
+ uint getSize() const { return _numObjects; }
+
+private:
+ Object *_inventory[kMaxCarry];
+ uint _numObjects;
+};
+
+class GameManager {
+public:
+ GameManager(SupernovaEngine *vm);
+
+ void processInput(Common::KeyState &state);
+ void processInput(Common::EventType eventType, int x, int y);
+ void executeRoom();
+
+ SupernovaEngine *_vm;
+ uint16 _key;
+ Common::EventType _mouseClickType;
+ int _mouseX;
+ int _mouseY;
+ int _mouseField;
+ Room *_currentRoom;
+ Room *_rooms[kRoomsNum];
+ Inventory _inventory;
+ GameState _state;
+ int _status;
+ Action _inputVerb;
+ bool _inputVerb2;
+ Object _nullObjectInstance;
+ Object *_inputObject[2];
+ int _objectNumber;
+ bool _waitEvent;
+ bool _newRoom;
+ bool _newOverlay;
+ int _timer1;
+ int _timer2;
+ int _inventoryScroll;
+ int _exitList[25];
+ Common::Rect _guiCommandDimensions[10];
+ // 0 PC Speaker | 1 SoundBlaster | 2 No Sound
+ int _soundDevice;
+
+ void takeObject(Object &obj);
+
+ void initGui();
+ bool genericInteract(Action verb, Object &obj1, Object &obj2);
+ bool isHelmetOff();
+ void great(uint number);
+ bool airless();
+ void shock();
+ void mouseInput();
+ void mouseInput2();
+ void mouseInput3();
+ void mouseWait(int delay);
+ void wait2(int delay);
+ void turnOff();
+ void turnOn();
+ void screenShake();
+ void loadTime();
+ void saveTime();
+ bool saveGame(int number);
+ void errorTemp();
+ void roomBrightness();
+ void palette();
+ void showMenu();
+ void animationOff();
+ void animationOn();
+ void loadOverlayStart();
+ void openLocker(const Room *room, Object *obj, Object *lock, int section);
+ void closeLocker(const Room *room, Object *obj, Object *lock, int section);
+ void edit(char *text, int x, int y, int length);
+ int invertSection(int section);
+ void drawMapExits();
+ void drawStatus();
+ void drawCommandBox(int cmd, bool brightness);
+ void drawCommandBox();
+ void inventory_arrow(int num, bool brightness);
+ void inventory_object(int num, bool brightness);
+ void drawInventory();
+ void changeRoom(RoomID id);
+};
+
+}
+
+#endif // STATE_H
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 6774ac7..b11c66a 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -39,6 +39,7 @@
#include "common/endian.h"
#include "supernova/supernova.h"
+#include "supernova/state.h"
namespace Supernova {
@@ -126,20 +127,18 @@ SupernovaEngine::~SupernovaEngine() {
}
Common::Error SupernovaEngine::run() {
- GameManager gm(this, &_event);
initGraphics(_screenWidth, _screenHeight);
+ GameManager gm(this);
_console = new Console(this, &gm);
initData();
initPalette();
- paletteFadeIn();
- CursorMan.replaceCursor(_mouseWait, 16, 16, 0, 0, kColorCursorTransparent);
+ CursorMan.replaceCursor(_mouseNormal, 16, 16, 0, 0, kColorCursorTransparent);
CursorMan.replaceCursorPalette(initVGAPalette, 0, 16);
CursorMan.showMouse(true);
while (_gameRunning) {
-
while (g_system->getEventManager()->pollEvent(_event)) {
switch (_event.type) {
case Common::EVENT_QUIT:
@@ -148,29 +147,29 @@ Common::Error SupernovaEngine::run() {
break;
case Common::EVENT_KEYDOWN:
- if (_event.kbd.keycode == Common::KEYCODE_d && _event.kbd.hasFlags(Common::KBD_CTRL)) {
+ if (_event.kbd.keycode == Common::KEYCODE_d &&
+ (_event.kbd.flags & Common::KBD_CTRL)) {
_console->attach();
}
+
+ gm.processInput(_event.kbd);
break;
case Common::EVENT_LBUTTONUP:
- break;
+ // fallthrough
case Common::EVENT_RBUTTONUP:
- // TODO: Determines verb depending on object properties
- break;
+ // fallthrough
case Common::EVENT_MOUSEMOVE:
- // TODO: Update status if mouse enters/leaves object
+ gm.processInput(_event.type, _event.mouse.x, _event.mouse.y);
break;
default:
break;
}
-// gm.processInput();
}
+ gm.executeRoom();
_console->onFrame();
- renderText(Common::String::format("%3d | %3d", _imageIndex, _sectionIndex).c_str(),
- 10, 190, kColorLightGreen);
_system->updateScreen();
_system->delayMillis(_delay);
}
@@ -312,7 +311,7 @@ void SupernovaEngine::renderImage(MSNImageDecoder &image, int section, bool full
uint offset = image._section[section].y1 * image._pitch + image._section[section].x1;
_system->copyRectToScreen(static_cast<const byte *>(image._sectionSurfaces[section]->getPixels()) + offset,
image._pitch,
- sectionRect.top, sectionRect.left,
+ sectionRect.left, sectionRect.top,
sectionRect.width(), sectionRect.height());
}
}
@@ -333,13 +332,17 @@ void SupernovaEngine::restoreScreen() {
}
void SupernovaEngine::renderRoom(Room &room) {
- for (int i = 0; i < kMaxSection; ++i) {
- if (room.isSectionVisible(i))
- renderImage(room.getFileNumber(), i);
+ if (room.getFileNumber() == -1) {
+ _system->fillScreen(kColorBlack);
+ } else {
+ for (int i = 0; i < kMaxSection; ++i) {
+ if (room.isSectionVisible(i))
+ renderImage(room.getFileNumber(), i);
+ }
}
}
-static int characterWidth(const char *text) {
+int SupernovaEngine::characterWidth(const char *text) {
int charWidth = 0;
while (*text != '\0') {
byte c = *text++;
@@ -422,6 +425,7 @@ void SupernovaEngine::renderMessage(const char *text, MessagePosition position)
int message_rows = y - 3;
int message_width = rowWidthMax + 6;
int message_height = numRows * 9 + 5;
+ saveScreen(message_columns, message_rows, message_width, message_height);
renderBox(message_columns, message_rows, message_width, message_height, HGR_MELD);
for (uint i = 0; i < numRows; ++i) {
renderText(row[i], x, y, textColor);
@@ -543,694 +547,6 @@ void SupernovaEngine::setColor63(byte value) {
_system->getPaletteManager()->setPalette(color, 63, 1);
}
-
-Inventory::Inventory()
- : _numObjects(0)
-{}
-
-// TODO: Update Inventory surface for scrolling
-void Inventory::add(Object &obj) {
- if (_numObjects < kMaxCarry)
- _inventory[_numObjects] = &obj;
-
-// if (inventory_amount>8) inventory_scroll = ((inventory_amount+1)/2)*2-8;
-// show_inventory();
-}
-
-// TODO: Update Inventory surface for scrolling
-void Inventory::remove(Object &obj) {
- for (uint i = 0; i < _numObjects; ++i) {
- if (_inventory[i] == &obj) {
- --_numObjects;
- while (i < _numObjects) {
- _inventory[i] = _inventory[i + 1];
- ++i;
- }
- obj.disableProperty(CARRIED);
- }
- }
-}
-
-Object *Inventory::get(uint index) const {
- if (index < _numObjects)
- return _inventory[index];
-
- return NULL;
-}
-
-Object *Inventory::get(ObjectID id) const {
- for (uint i = 0; i < _numObjects; ++i) {
- if (_inventory[i]->_id == id)
- return _inventory[i];
- }
-
- return NULL;
-}
-
-ScreenBufferStack::ScreenBufferStack()
- : _last(_buffer) {
-}
-
-void ScreenBufferStack::push(int x, int y, int width, int height, int pitch) {
- if (_last == ARRAYEND(_buffer))
- return;
-
- _last->_pixels = new byte[width * height];
- byte *pixels = _last->_pixels;
- const byte *screen = static_cast<const byte *>(g_system->lockScreen()->getBasePtr(x, y));
- for (int i = 0; i < height; ++i) {
- Common::copy(screen, screen + width, pixels);
- screen += pitch;
- pixels += width;
- }
- g_system->unlockScreen();
-
- _last->_x = x;
- _last->_y = y;
- _last->_width = width;
- _last->_height = height;
- _last->_pitch = pitch;
-
- ++_last;
-}
-
-void ScreenBufferStack::restore() {
- if (_last == _buffer)
- return;
-
- --_last;
- g_system->lockScreen()->copyRectToSurface(
- _last->_pixels, _last->_width, _last->_x, _last->_y,
- _last->_width, _last->_height);
- g_system->unlockScreen();
-
- delete[] _last->_pixels;
-}
-
-
-static const char *timeToString(int t) {
- // TODO: Does ScummVM emulate PIT timings for DOS?
-
- static char s[9];
- strcpy(s," 0:00:00");
- s[7] = t % 10 + '0';
- t /= 10;
- s[6] = t % 6 + '0';
- t /= 6;
- s[4] = t % 10 + '0';
- t /= 10;
- s[3] = t % 6 + '0';
- t /= 6;
- s[1] = t % 10 + '0';
- t /= 10;
- if (t)
- s[0] = t+48;
-
- return(s);
-}
-
-GameManager::GameManager(SupernovaEngine *vm, Common::Event *event) {
- _rooms[INTRO] = StartingItems(vm, this);
- _rooms[CORRIDOR] = ShipCorridor(vm, this);
- _rooms[HALL] = ShipHall(vm, this);
- _rooms[SLEEP] = ShipSleepCabin(vm, this);
- _rooms[COCKPIT] = ShipCockpit(vm, this);
- _rooms[AIRLOCK] = ShipAirlock(vm, this);
- _rooms[HOLD] = ShipHold(vm, this);
- _rooms[LANDINGMODULE] = ShipLandingModule(vm, this);
- _rooms[GENERATOR] = ShipGenerator(vm, this);
- _rooms[OUTSIDE] = ShipOuterSpace(vm, this);
- _rooms[CABIN_R1] = ShipCabinR1(vm, this);
- _rooms[CABIN_R2] = ShipCabinR2(vm, this);
- _rooms[CABIN_R3] = ShipCabinR3(vm, this);
- _rooms[CABIN_L1] = ShipCabinL1(vm, this);
- _rooms[CABIN_L2] = ShipCabinL2(vm, this);
- _rooms[CABIN_L3] = ShipCabinL3(vm, this);
- _rooms[BATHROOM] = ShipCabinBathroom(vm, this);
-
-// _rooms[ROCKS]
-// _rooms[CAVE]
-// _rooms[MEETUP]
-// _rooms[ENTRANCE]
-// _rooms[REST]
-// _rooms[ROGER]
-// _rooms[GLIDER]
-// _rooms[MEETUP2]
-// _rooms[MEETUP3]
-
-// _rooms[CELL]
-// _rooms[CORRIDOR1]
-// _rooms[CORRIDOR2]
-// _rooms[CORRIDOR3]
-// _rooms[CORRIDOR4]
-// _rooms[CORRIDOR5]
-// _rooms[CORRIDOR6]
-// _rooms[CORRIDOR7]
-// _rooms[CORRIDOR8]
-// _rooms[CORRIDOR9]
-// _rooms[BCORRIDOR]
-// _rooms[GUARD]
-// _rooms[GUARD3]
-// _rooms[OFFICE_L1]
-// _rooms[OFFICE_L2]
-// _rooms[OFFICE_R1]
-// _rooms[OFFICE_R2]
-// _rooms[OFFICE_L]
-// _rooms[ELEVATOR]
-// _rooms[STATION]
-// _rooms[SIGN]
-
- _currentRoom = &_rooms[0];
- _vm = vm;
- _event = event;
-}
-
-bool GameManager::isHelmetOff() {
- Object *helmet = _inventory.get(HELMET);
- if (helmet && helmet->hasProperty(WORN)) {
- _vm->renderMessage("Irgendwie ist ein Raumhelm|beim Essen unpraktisch.");
- return false;
- }
-
- return true;
-}
-
-void GameManager::great(uint number) {
- if (number && (_state.greatF & (1 << number)))
- return;
-
- _vm->playSound(kAudioUndef7);
- _state.greatF |= 1 << number;
-}
-
-bool GameManager::airless() {
- return (
- ((_currentRoom > &_rooms[AIRLOCK]) && (_currentRoom < &_rooms[CABIN_R1])) ||
- ((_currentRoom > &_rooms[BATHROOM])&& (_currentRoom < &_rooms[ENTRANCE])) ||
- ((_currentRoom == &_rooms[AIRLOCK]) && (_currentRoom->getObject(1)->hasProperty(OPENED))) ||
- (_currentRoom >= &_rooms[MEETUP2])
- );
-}
-
-void GameManager::processInput() {
- // STUB
-}
-
-void GameManager::turnOff() {
- if (_state.powerOff)
- return;
-
- _state.powerOff = true;
- roomBrightness();
-
-}
-void GameManager::turnOn() {
- // STUB
-}
-
-void GameManager::takeObject(Object &obj) {
- if (obj.hasProperty(CARRIED))
- return;
-
- if (obj._section != 0)
- _vm->renderImage(_currentRoom->getFileNumber(), obj._section);
- obj.setProperty(CARRIED);
- obj._click = obj._click2 = 255;
- _inventory.add(obj);
-}
-
-void GameManager::mouseInput() {
- // STUB
-}
-
-void GameManager::mouseInput2() {
- // STUB
-}
-
-void GameManager::mouseInput3() {
- // STUB
-}
-
-void GameManager::mouseWait(int delay) {
- // STUB
-}
-
-void GameManager::roomBrightness() {
- // STUB
-}
-
-void GameManager::loadTime() {
- // STUB
-}
-
-void GameManager::saveTime() {
- // STUB
-}
-
-bool GameManager::saveGame(int number) {
- // STUB
- return false;
-}
-
-void GameManager::errorTemp() {
- // STUB
-}
-
-void GameManager::wait2(int delay) {
- // STUB
-}
-
-void GameManager::screenShake() {
- // STUB
-}
-
-void GameManager::palette() {
- // STUB
- // Adjust palette to brightness parameters and make it current
-}
-
-void GameManager::shock() {
- // STUB
- _vm->playSound(kAudioShock);
- // die
-}
-
-void GameManager::showMenu() {
- // STUB
-}
-
-void GameManager::drawMapExits() {
- // STUB
-}
-
-void GameManager::animationOff() {
- // STUB
-}
-
-void GameManager::animationOn() {
- // STUB
-}
-
-void GameManager::edit(char *text, int x, int y, int length) {
- // STUB
-}
-
-void GameManager::loadOverlayStart() {
- // STUB
-}
-
-void GameManager::openLocker(const Room *room, Object *obj, Object *lock, int section) {
- _vm->renderImage(room->getFileNumber(), section);
- obj->setProperty(OPENED);
- lock->_click = 255;
- int i = obj->_click;
- obj->_click = obj->_click2;
- obj->_click2 = i;
-}
-
-void GameManager::closeLocker(const Room *room, Object *obj, Object *lock, int section) {
- // STUB
-}
-
-int GameManager::invertSection(int section) {
- if (section < 128)
- section += 128;
- else
- section -= 128;
-
- return section;
-}
-
-
-bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
- Room *r;
- char t[150];
-
- if ((verb == ACTION_USE) && (obj1._id == SCHNUCK)) {
- if (isHelmetOff()) {
- takeObject(obj1);
- _vm->renderMessage("Schmeckt ganz gut.");
- _inventory.remove(obj1);
- }
- } else if ((verb == ACTION_USE) && (obj1._id == EGG)) {
- if (isHelmetOff()) {
- takeObject(obj1);
- if (obj1.hasProperty(OPENED))
- _vm->renderMessage("Schmeckt ganz gut.");
- else
- _vm->renderMessage("Da war irgendetwas drin,|aber jetzt hast du es|mit runtergeschluckt.");
-
- _inventory.remove(obj1);
- }
- } else if ((verb == ACTION_OPEN) && (obj1._id == EGG)) {
- takeObject(obj1);
- if (obj1.hasProperty(OPENED)) {
- _vm->renderMessage("Du hast es doch schon geffnet.");
- } else {
- takeObject(*_rooms[ENTRANCE].getObject(8));
- _vm->renderMessage("In dem Ei ist eine Tablette|in einer Plastikhlle.");
- obj1.setProperty(OPENED);
- }
- } else if ((verb == ACTION_USE) && (obj1._id == PILL)) {
- if (isHelmetOff()) {
- _vm->renderMessage("Du iát die Tablette und merkst,|daá sich irgendetwas verndert hat.");
- great(0);
- _inventory.remove(obj1);
- _state.language = 2;
- takeObject(*_rooms[ENTRANCE].getObject(17));
- }
- } else if ((verb == ACTION_LOOK) && (obj1._id == PILL_HULL) &&
- (_state.language == 2)) {
- _vm->renderMessage("Komisch! Auf einmal kannst du die Schrift lesen!|Darauf steht:\"Wenn Sie diese Schrift jetzt|lesen knnen, hat die Tablette gewirkt.\"");
- _state.language = 1;
- } else if ((verb == ACTION_OPEN) && (obj1._id == WALLET)) {
- if (!_rooms[ROGER].getObject(3)->hasProperty(CARRIED)) {
- _vm->renderMessage("Das muát du erst nehmen.");
- } else if (_rooms[ROGER].getObject(7)->hasProperty(CARRIED)) {
- _vm->renderMessage("Sie ist leer.");
- } else {
- _vm->renderMessage("Du findest 10 Buckazoids und eine Keycard.");
- takeObject(*_rooms[ROGER].getObject(7));
- takeObject(*_rooms[ROGER].getObject(8));
- }
- } else if ((verb == ACTION_LOOK) && (obj1._id == NEWSPAPER)) {
- _vm->renderMessage("Es ist eine Art elektronische Zeitung.");
- mouseWait(_timer1);
- _vm->removeMessage();
- _vm->renderMessage("Halt, hier ist ein interessanter Artikel.");
- mouseWait(_timer1);
- _vm->removeMessage();
- _vm->renderImage(2,0);
- _vm->setColor63(40);
- mouseInput2();
- _vm->renderRoom(*_currentRoom);
- roomBrightness();
- palette();
- showMenu();
- drawMapExits();
- _vm->renderMessage("Hmm, irgendwie komme|ich mir verarscht vor.");
- } else if ((verb == ACTION_LOOK) && (obj1._id == KEYCARD2)) {
- _vm->renderMessage(obj1._description);
- obj1._description = "Es ist die Keycard des Commanders.";
- } else if ((verb == ACTION_LOOK) && (obj1._id == WATCH)) {
- _vm->renderMessage(Common::String::format(
- "Es ist eine Uhr mit extra|lautem Wecker. "
- "Sie hat einen|Knopf zum Verstellen der Alarmzeit.|"
- "Uhrzeit: %s Alarmzeit: %s",
- timeToString(_vm->getDOSTicks() - _state.timeStarting),
- timeToString(_state.timeAlarm)).c_str());
- } else if ((verb == ACTION_PRESS) && (obj1._id == WATCH)) {
- char *min;
- int hours, minutes;
- bool f;
- animationOff();
- _vm->saveScreen(88, 87, 144, 24);
- _vm->renderBox(88, 87, 144, 24, kColorWhite35);
- _vm->renderText("Neue Alarmzeit (hh:mm) :", 91, 90, kColorWhite99);
- do {
- t[0] = 0;
- _vm->renderBox(91, 99, 138, 9, kColorDarkBlue);
- do {
- edit(t, 91, 100, 5);
- } while ((_key != Common::ASCII_RETURN) && (_key != Common::ASCII_ESCAPE));
- f = false;
- if (t[0] == ':') {
- t[0] = 0;
- min = &(t[1]);
- } else if (t[1] == ':') {
- t[1] = 0;
- min = &(t[2]);
- } else if (t[2] == ':') {
- t[2] = 0;
- min = &(t[3]);
- } else {
- f = true;
- }
-
- for (uint i = 0; i < strlen(t); i++)
- if ((t[i] < '0') || (t[i] > '9')) f = true;
- for (uint i = 0; i < strlen(min); i++)
- if ((min[i] < '0') || (min[i] > '9')) f = true;
- hours = atoi(t);
- minutes = atoi(min);
- if ((hours > 23) || (minutes > 59)) f = true;
- animationOn();
- } while (f && (_key != Common::ASCII_ESCAPE));
- _vm->restoreScreen();
- if (_key != Common::ASCII_ESCAPE) {
- _state.timeAlarm = (hours * 60 + minutes) * 1092.3888 + 8;
- _state.timeAlarmSystem = _state.timeAlarm + _state.timeStarting;
- _state.alarmOn = (_state.timeAlarmSystem > _vm->getDOSTicks());
- }
- } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, WIRE)) {
- r = &_rooms[CABIN_L3];
- if (!r->getObject(8)->hasProperty(CARRIED)) {
- if (r->isSectionVisible(26))
- _vm->renderMessage(Object::takeMessage);
- else
- return false;
- } else {
- r->getObject(8)->_name = "Leitung mit Lsterklemme";
- r = &_rooms[HOLD];
- _inventory.remove(*r->getObject(2));
- _state.terminalStripConnected = true;
- _state.terminalStripWire = true;
- _vm->renderMessage("Ok.");
- }
- } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, SPOOL)) {
- r = &_rooms[CABIN_L2];
- takeObject(*r->getObject(9));
- r->getObject(9)->_name = "Kabelrolle mit Lsterklemme";
- r = &_rooms[HOLD];
- _inventory.remove(*r->getObject(2));
- _state.terminalStripConnected = true;
- _vm->renderMessage("Ok.");
- } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, WIRE, SPOOL)) {
- r = &_rooms[CABIN_L3];
- if (!_state.terminalStripConnected) {
- if (r->isSectionVisible(26))
- _vm->renderMessage("Womit denn?");
- else
- return false;
- } else {
- if (!r->getObject(8)->hasProperty(CARRIED)) {
- _vm->renderMessage(Object::takeMessage);
- } else {
- r = &_rooms[CABIN_L2];
- takeObject(*r->getObject(9));
- r = &_rooms[CABIN_L3];
- r->getObject(8)->_name = "langes Kabel mit Stecker";
- r = &_rooms[CABIN_L2];
- _inventory.remove(*r->getObject(9));
- _state.cableConnected = true;
- _vm->renderMessage("Ok.");
- }
- }
- } else if ((verb == ACTION_USE) && (obj1._id == SUIT)) {
- takeObject(obj1);
- if ((_currentRoom >= &_rooms[ENTRANCE]) && (_currentRoom <= &_rooms[ROGER])) {
- if (obj1.hasProperty(WORN)) {
- _vm->renderMessage("Die Luft hier ist atembar,|du ziehst den Anzug aus.");
- _rooms[AIRLOCK].getObject(4)->disableProperty(WORN);
- _rooms[AIRLOCK].getObject(5)->disableProperty(WORN);
- _rooms[AIRLOCK].getObject(6)->disableProperty(WORN);
- } else
- _vm->renderMessage("Hier drinnen brauchtst du deinen Anzug nicht.");
- } else {
- if (obj1.hasProperty(WORN)) {
- r = &_rooms[AIRLOCK];
- if (r->getObject(4)->hasProperty(WORN)) {
- _vm->renderMessage("Du muát erst den Helm abnehmen.");
- } else if (r->getObject(6)->hasProperty(WORN)) {
- _vm->renderMessage("Du muát erst den Versorgungsteil abnehmen.");
- } else {
- obj1.disableProperty(WORN);
- _vm->renderMessage("Du ziehst den Raumanzug aus.");
- }
- } else {
- obj1.setProperty(WORN);
- _vm->renderMessage("Du ziehst den Raumanzug an.");
- }
- }
- } else if ((verb == ACTION_USE) && (obj1._id == HELMET)) {
- takeObject(obj1);
- if ((_currentRoom >= &_rooms[ENTRANCE]) && (_currentRoom <= &_rooms[ROGER])) {
- if (obj1.hasProperty(WORN)) {
- _vm->renderMessage("Die Luft hier ist atembar,|du ziehst den Anzug aus.");
- _rooms[AIRLOCK].getObject(4)->disableProperty(WORN);
- _rooms[AIRLOCK].getObject(5)->disableProperty(WORN);
- _rooms[AIRLOCK].getObject(6)->disableProperty(WORN);
- } else {
- _vm->renderMessage("Hier drinnen brauchtst du deinen Anzug nicht.");
- }
- } else {
- if (obj1.hasProperty(WORN)) {
- if (airless()) {
- //TODO: Death screen
-// longjmp(dead, "Den Helm httest du|besser angelassen!");
- }
- obj1.disableProperty(WORN);
- _vm->renderMessage("Du ziehst den Helm ab.");
- } else {
- r = &_rooms[AIRLOCK];
- if (r->getObject(5)->hasProperty(WORN)) {
- obj1.setProperty(WORN);
- _vm->renderMessage("Du ziehst den Helm auf.");
- } else {
- _vm->renderMessage("Du muát erst den Anzug anziehen.");
- }
- }
- }
- } else if ((verb == ACTION_USE) && (obj1._id == LIFESUPPORT)) {
- takeObject(obj1);
- if ((_currentRoom >= &_rooms[ENTRANCE]) && (_currentRoom <= &_rooms[ROGER])) {
- if (obj1.hasProperty(WORN)) {
- _vm->renderMessage("Die Luft hier ist atembar,|du ziehst den Anzug aus.");
- _rooms[AIRLOCK].getObject(4)->disableProperty(WORN);
- _rooms[AIRLOCK].getObject(5)->disableProperty(WORN);
- _rooms[AIRLOCK].getObject(6)->disableProperty(WORN);
- } else
- _vm->renderMessage("Hier drinnen brauchtst du deinen Anzug nicht.");
- } else {
- if (obj1.hasProperty(WORN)) {
- if (airless()) {
- //TODO: Death screen
-// longjmp(dead, "Den Versorungsteil httest du|besser nicht abgenommen!");
- }
- obj1.disableProperty(WORN);
- _vm->renderMessage("Du nimmst den Versorgungsteil ab.");
- } else {
- r = &_rooms[AIRLOCK];
- if (r->getObject(5)->hasProperty(WORN)) {
- obj1.setProperty(WORN);
- _vm->renderMessage("Du ziehst den Versorgungsteil an.");
- } else {
- _vm->renderMessage("Du muát erst den Anzug anziehen.");
- }
- }
- }
- } else if ((verb == ACTION_WALK) && (obj1._id == BATHROOM_DOOR)) {
-// *bathroom = current_room;
- return false;
- } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, WIRE, SOCKET))
- _vm->renderMessage("Die Leitung ist hier unntz.");
- else if ((verb == ACTION_LOOK) && (obj1._id == BOOK2)) {
- _vm->renderMessage("Stark, das ist ja die Fortsetzung zum \"Anhalter\":|\"Das Restaurant am Ende des Universums\".");
- mouseWait(_timer1);
- _vm->removeMessage();
- _vm->renderMessage("Moment mal, es ist ein Lesezeichen drin,|auf dem \"Zweiundvierzig\" steht.");
- } else {
- return false;
- }
-
- return true;
-}
-
-void GameManager::executeRoom() {
- bool validCommand = genericInteract(_inputVerb, _inputObject[0], _inputObject[1]);
-
- if (!validCommand) {
- validCommand = _currentRoom->interact(_inputVerb, _inputObject[0], _inputObject[1]);
- if (!validCommand) {
- switch (_inputVerb) {
- case ACTION_LOOK:
- _vm->renderMessage(_inputObject[0]._description);
- break;
-
- case ACTION_WALK:
- if (_inputObject[0].hasProperty(CARRIED)) {
- // You already carry this.
- _vm->renderMessage("Das trgst du doch bei dir.");
- } else if (!_inputObject[0].hasProperty(EXIT)) {
- // You're already there.
- _vm->renderMessage("Du bist doch schon da.");
- } else if (_inputObject[0].hasProperty(OPEN) && !_inputObject[0].hasProperty(OPENED)) {
- // This is closed
- _vm->renderMessage("Das ist geschlossen.");
- } else {
- _currentRoom = &_rooms[_inputObject[0]._exitRoom];
- return;
- }
- break;
-
- case ACTION_TAKE:
- if (_inputObject[0].hasProperty(OPENED)) {
- // You already have that
- _vm->renderMessage("Das hast du doch schon.");
- } else if (_inputObject[0].hasProperty(UNNECESSARY)) {
- // You do not need that.
- _vm->renderMessage("Das brauchst du nicht.");
- } else if (!_inputObject[0].hasProperty(TAKE)) {
- // You can't take that.
- _vm->renderMessage("Das kannst du nicht nehmen.");
- } else {
- takeObject(_inputObject[0]);
- }
- break;
-
- case ACTION_OPEN:
- if (!_inputObject[0].hasProperty(OPEN)) {
- // This can't be opened
- _vm->renderMessage("Das lát sich nicht ffnen.");
- } else if (_inputObject[0].hasProperty(OPENED)) {
- // This is already opened.
- _vm->renderMessage("Das ist schon offen.");
- } else if (_inputObject[0].hasProperty(CLOSED)) {
- // This is locked.
- _vm->renderMessage("Das ist verschlossen.");
- } else {
- _vm->renderImage(_currentRoom->getFileNumber(), _inputObject[0]._section);
- _inputObject[0].setProperty(OPENED);
- byte i = _inputObject[0]._click;
- _inputObject[0]._click = _inputObject[0]._click2;
- _inputObject[0]._click2 = i;
- _vm->playSound(kAudioDoorOpen);
- }
- break;
-
- case ACTION_CLOSE:
- if (!_inputObject[0].hasProperty(OPEN) ||
- (_inputObject[0].hasProperty(CLOSED) &&
- _inputObject[0].hasProperty(OPENED))) {
- // This can't be closed.
- _vm->renderMessage("Das lát sich nicht schlieáen.");
- } else if (!_inputObject[0].hasProperty(OPENED)) {
- // This is already closed.
- _vm->renderMessage("Das ist schon geschlossen.");
- } else {
- _vm->renderImage(_currentRoom->getFileNumber(), invertSection(_inputObject[0]._section));
- _inputObject[0].disableProperty(OPENED);
- byte i = _inputObject[0]._click;
- _inputObject[0]._click = _inputObject[0]._click2;
- _inputObject[0]._click2 = i;
- _vm->playSound(kAudioDoorClose);
- }
- break;
-
- case ACTION_GIVE:
- if (_inputObject[0].hasProperty(CARRIED)) {
- // Better keep it!
- _vm->renderMessage("Behalt es lieber!");
- }
- break;
-
- default:
- // This is not possible.
- _vm->renderMessage("Das geht nicht.");
- }
-
- if (_newOverlay) {
- loadOverlayStart();
- _newOverlay = false;
- }
- if (_newRoom) {
- _newRoom = false;
- return;
- }
- }
- }
-}
-
Common::MemoryReadStream *SupernovaEngine::convertToMod(const char *filename, int version) {
// MSN format
struct {
@@ -1417,4 +733,45 @@ Common::MemoryReadStream *SupernovaEngine::convertToMod(const char *filename, in
return new Common::MemoryReadStream(buffer.getData(), buffer.size());
}
+
+ScreenBufferStack::ScreenBufferStack()
+ : _last(_buffer) {
+}
+
+void ScreenBufferStack::push(int x, int y, int width, int height, int pitch) {
+ if (_last == ARRAYEND(_buffer))
+ return;
+
+ _last->_pixels = new byte[width * height];
+ byte *pixels = _last->_pixels;
+ const byte *screen = static_cast<const byte *>(g_system->lockScreen()->getBasePtr(x, y));
+ for (int i = 0; i < height; ++i) {
+ Common::copy(screen, screen + width, pixels);
+ screen += pitch;
+ pixels += width;
+ }
+ g_system->unlockScreen();
+
+ _last->_x = x;
+ _last->_y = y;
+ _last->_width = width;
+ _last->_height = height;
+ _last->_pitch = pitch;
+
+ ++_last;
+}
+
+void ScreenBufferStack::restore() {
+ if (_last == _buffer)
+ return;
+
+ --_last;
+ g_system->lockScreen()->copyRectToSurface(
+ _last->_pixels, _last->_width, _last->_x, _last->_y,
+ _last->_width, _last->_height);
+ g_system->unlockScreen();
+
+ delete[] _last->_pixels;
+}
+
}
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 78e9f72..1d3b17c 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -107,6 +107,7 @@ public:
int _textColor;
int getDOSTicks();
+ int characterWidth(const char *text);
void initData();
void initPalette();
void paletteFadeIn();
@@ -127,84 +128,11 @@ public:
void renderText(const char *text);
void renderBox(int x, int y, int width, int height, byte color);
void setColor63(byte value);
+ void command_print();
Common::MemoryReadStream *convertToMod(const char *filename, int version = 1);
};
-
-class Inventory {
-public:
- Inventory();
-
- void add(Object &obj);
- void remove(Object &obj);
- Object *get(uint index) const;
- Object *get(ObjectID id) const;
-
-private:
- Object *_inventory[kMaxCarry];
- uint _numObjects;
-};
-
-class GameManager {
-public:
- GameManager(SupernovaEngine *vm, Common::Event *event);
-
- void processInput();
- void executeRoom();
-
- SupernovaEngine *_vm;
- Common::Event *_event;
- uint16 _key;
- Room *_currentRoom;
- Room _rooms[kRoomsNum];
- Inventory _inventory;
- GameState _state;
- int _status;
- Action _inputVerb;
- Object _inputObject[2];
- bool _waitEvent;
- bool _newRoom;
- bool _newOverlay;
- int _timer1;
- int _timer2;
- // 0 PC Speaker | 1 SoundBlaster | 2 No Sound
- int _soundDevice;
-
- void takeObject(Object &obj);
-
- bool genericInteract(Action verb, Object &obj1, Object &obj2);
- bool isHelmetOff();
- void great(uint number);
- bool airless();
- void shock();
- void mouseInput();
- void mouseInput2();
- void mouseInput3();
- void mouseWait(int delay);
- void wait2(int delay);
- void turnOff();
- void turnOn();
- void screenShake();
- void loadTime();
- void saveTime();
- bool saveGame(int number);
- void errorTemp();
- void roomBrightness();
- void palette();
- void showMenu();
- void drawMapExits();
- void animationOff();
- void animationOn();
- void loadOverlayStart();
- void openLocker(const Room *room, Object *obj, Object *lock, int section);
- void closeLocker(const Room *room, Object *obj, Object *lock, int section);
- void edit(char *text, int x, int y, int length);
- int invertSection(int section);
- void command_print();
-};
-
-
}
#endif
Commit: b6887b0740116c1c75a59f5d5ce3b8fc79bda34d
https://github.com/scummvm/scummvm/commit/b6887b0740116c1c75a59f5d5ce3b8fc79bda34d
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:54:41Z
Commit Message:
SUPERNOVA: Converts strings back to cp437
Changed paths:
engines/supernova/msn_def.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index e7a76c8..a0231ac 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -426,9 +426,9 @@ static const char *const guiCommand_DE[] = {
"Gehe",
"Schau",
"Nimm",
- "Öffne",
- "Schließe",
- "Drücke",
+ "\231ffne",
+ "Schlie\341e",
+ "Dr\201cke",
"Ziehe",
"Benutze",
"Rede",
Commit: 69f6ef0efd8e4b0430706cb2a831a5059ae36d4b
https://github.com/scummvm/scummvm/commit/69f6ef0efd8e4b0430706cb2a831a5059ae36d4b
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:54:41Z
Commit Message:
SUPERNOVA: Cosmetic changes in console code
Changed paths:
engines/supernova/console.cpp
diff --git a/engines/supernova/console.cpp b/engines/supernova/console.cpp
index 560520c..838189f 100644
--- a/engines/supernova/console.cpp
+++ b/engines/supernova/console.cpp
@@ -45,9 +45,6 @@ bool Console::cmdRenderImage(int argc, const char **argv) {
return true;
}
- int filenumber = atoi(argv[1]);
- int section = atoi(argv[2]);
-
_vm->renderImage(atoi(argv[1]), atoi(argv[2]));
return true;
@@ -72,6 +69,8 @@ bool Console::cmdMusic(int argc, const char **argv) {
}
_vm->playSoundMod(atoi(argv[1]));
+
+ return true;
}
bool Console::cmdList(int argc, const char **argv) {
Commit: 7c8f5bdd3dbe64d7858561983c21a44915077e55
https://github.com/scummvm/scummvm/commit/7c8f5bdd3dbe64d7858561983c21a44915077e55
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:54:41Z
Commit Message:
SUPERNOVA: Adds missing copyright header
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 1899daf..d6fe286 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1,3 +1,24 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
#include "supernova/supernova.h"
#include "supernova/state.h"
Commit: 30389746c8788c627963532b34d70447a6d4cb96
https://github.com/scummvm/scummvm/commit/30389746c8788c627963532b34d70447a6d4cb96
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:54:41Z
Commit Message:
SUPERNOVA: Fixes bathroom location on minimap
Changed paths:
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index d3d850a..475bb64 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -221,7 +221,7 @@ public:
_objectState[8] = Object("Schrank", Object::defaultDescription, NULLOBJECT, OPEN | CLOSED, 1, 1, 0);
_objectState[9] = Object("Fach", Object::defaultDescription, NULLOBJECT, OPEN | CLOSED, 2, 2, 0);
_objectState[10] = Object("Steckdose", Object::defaultDescription, SOCKET, COMBINABLE, 4, 4, 0);
- _objectState[11] = Object("Toilette", Object::defaultDescription, BATHROOM_DOOR, EXIT, 255, 255, 0, BATHROOM, 2);
+ _objectState[11] = Object("Toilette", Object::defaultDescription, BATHROOM_DOOR, EXIT, 255, 255, 0, BATHROOM, 22);
}
};
@@ -317,7 +317,7 @@ public:
_objectState[13] = Object("Schrank",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,1,1,0);
_objectState[14] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,2,2,0);
_objectState[15] = Object("Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
- _objectState[16] = Object("Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,2);
+ _objectState[16] = Object("Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -342,7 +342,7 @@ public:
_objectState[5] = Object("Schrank",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,1,1,0);
_objectState[6] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,2,2,0);
_objectState[7] = Object("Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
- _objectState[8] = Object("Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,2);
+ _objectState[8] = Object("Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
}
};
@@ -368,7 +368,7 @@ public:
_objectState[5] = Object("Schrank",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,1,1,0);
_objectState[6] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,2,2,0);
_objectState[7] = Object("Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
- _objectState[8] = Object("Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,2);
+ _objectState[8] = Object("Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
}
};
Commit: 718cae659ca3acf3e9b2f795f88888d993752de3
https://github.com/scummvm/scummvm/commit/718cae659ca3acf3e9b2f795f88888d993752de3
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:54:41Z
Commit Message:
SUPERNOVA: Adds info to NOTES
Changed paths:
engines/supernova/NOTES
diff --git a/engines/supernova/NOTES b/engines/supernova/NOTES
index c207f53..e8138ec 100644
--- a/engines/supernova/NOTES
+++ b/engines/supernova/NOTES
@@ -33,3 +33,29 @@ This list shows them and their offsets.
24020 - Door sound
30030 - Door open
31040 - Door close
+
+Engine
+----------
+MouseFields
+ [0;256[ - Viewport
+ [256;512[ - Command Row
+ [512;768[ - Inventory
+ [768;769] - Inventory Arrows
+
+Dimensions
+ Viewport: (0,0) (320, 150)
+ Command Row: (0, 150) (320, 159)
+ Inventory: (0, 161) (270, 200)
+ Inventory Arrows: (271, 161) (279, 200)
+ Exit Maps: (283, 163) (317, 197)
+
+
+Ingame Bugs
+------------
+In Cabin_R3 (starting room) you can take the discman from your locker without
+opening it first.
+
+
+Improvements
+-------------
+Incidate in inventory (?) what parts of your space suit you are wearing
Commit: a8f62802cc189d656fcedacb8236d01f76753b59
https://github.com/scummvm/scummvm/commit/a8f62802cc189d656fcedacb8236d01f76753b59
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:54:41Z
Commit Message:
SUPERNOVA: Extends Object Class
Changed paths:
engines/supernova/msn_def.h
engines/supernova/supernova.cpp
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index a0231ac..50c91aa 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -450,6 +450,7 @@ ObjectType &operator^=(ObjectType &a, ObjectType b);
struct Object {
static const char *const defaultDescription;
static const char *const takeMessage;
+ static const Object nullObject;
Object()
: _name("")
@@ -475,6 +476,12 @@ struct Object {
, _direction(direction)
{}
+ static void setObjectNull(Object *&obj) {
+ obj = const_cast<Object *>(&nullObject);
+ }
+ static bool isNullObject(Object *obj) {
+ return obj == &nullObject;
+ }
void setProperty(ObjectType type) {
_type |= type;
}
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index b11c66a..26a6aa5 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -67,6 +67,7 @@ const AudioInfo audioInfo[kAudioNumSamples] = {
const char *const Object::defaultDescription = "Es ist nichts Besonderes daran.";
const char *const Object::takeMessage = "Das mußt du erst nehmen.";
+const Object Object::nullObject = Object();
ObjectType operator|(ObjectType a, ObjectType b) {
return static_cast<ObjectType>(+a | +b);
Commit: 6d655b19fcf00ab93a39221fe5abdcad4b83c5a0
https://github.com/scummvm/scummvm/commit/6d655b19fcf00ab93a39221fe5abdcad4b83c5a0
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:54:41Z
Commit Message:
SUPERNOVA: Adds GuiElement Class
Changed paths:
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index d6fe286..b8bb9da 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -68,6 +68,55 @@ Object *Inventory::get(ObjectID id) const {
return NULL;
}
+GuiElement::GuiElement()
+ : _text("")
+ , _isHighlighted(false)
+ , _isVisible(true)
+ , _bgColorNormal(kColorWhite25)
+ , _bgColorHighlighted(kColorWhite44)
+ , _bgColor(kColorWhite25)
+ , _textColorNormal(kColorGreen)
+ , _textColorHighlighted(kColorLightGreen)
+ , _textColor(kColorGreen)
+{}
+
+void GuiElement::setText(const char *text) {
+ strncpy(_text, text, sizeof(_text));
+}
+
+void GuiElement::setTextPosition(int x, int y) {
+ _textPosition.x = x;
+ _textPosition.y = y;
+}
+void GuiElement::setSize(int x1, int y1, int x2, int y2) {
+ this->left = x1;
+ this->top = y1;
+ this->right = x2;
+ this->bottom = y2;
+
+ _textPosition.x = x1 + 1;
+ _textPosition.y = y1 + 1;
+}
+
+void GuiElement::setColor(int bgColor, int textColor, int bgColorHighlighted, int textColorHightlighted) {
+ _bgColor = bgColor;
+ _textColor = textColor;
+ _bgColorNormal = bgColor;
+ _textColorNormal = textColor;
+ _bgColorHighlighted = bgColorHighlighted;
+ _textColorHighlighted = textColorHightlighted;
+}
+
+void GuiElement::setHighlight(bool isHighlighted) {
+ if (isHighlighted) {
+ _bgColor = _bgColorHighlighted;
+ _textColor = _textColorHighlighted;
+ } else {
+ _bgColor = _bgColorNormal;
+ _textColor = _textColorNormal;
+ }
+}
+
static const char *timeToString(int t) {
// TODO: Does ScummVM emulate PIT timings for DOS?
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 08e5591..e2d066f 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -73,6 +73,32 @@ private:
uint _numObjects;
};
+class GuiElement : public Common::Rect {
+public:
+ GuiElement();
+
+ void setSize(int x1, int y1, int x2, int y2);
+ void setText(const char *text);
+ void setTextPosition(int x, int y);
+ void setColor(int bgColor, int textColor, int bgColorHighlighted, int textColorHightlighted);
+ void setHighlight(bool isHighlighted);
+
+// virtual void onMouseOver() {}
+// virtual void onMouseOut() {}
+// virtual void onMouseClick() {}
+
+ Common::Point _textPosition;
+ char _text[128];
+ int _bgColor;
+ int _textColor;
+ int _bgColorNormal;
+ int _bgColorHighlighted;
+ int _textColorNormal;
+ int _textColorHighlighted;
+ bool _isHighlighted;
+ bool _isVisible;
+};
+
class GameManager {
public:
GameManager(SupernovaEngine *vm);
Commit: a54c9084c1b4e9a18556066e255bb71e33793547
https://github.com/scummvm/scummvm/commit/a54c9084c1b4e9a18556066e255bb71e33793547
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:54:41Z
Commit Message:
SUPERNOVA: Removes 'inverse section' case
This code section was converted from the original source, where the
sections are directly drawn to the screen instead of buffered.
If a section > 128 is set as parameter, the function takes the
dimensions of section - 128 and draws this region of section 0 to the
screen, thus restoring it.
It would not make sense loading part of section 0 in seperate Surfaces
especially since kMaxSection is smaller than 128 the else branch is
never entered so removing it doesn't change the programs behavior.
Changed paths:
engines/supernova/graphics.cpp
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index ba2f06e..1940dd7 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -164,41 +164,23 @@ bool MSNImageDecoder::loadSections() {
}
} else {
uint image = section;
- if (image < 128) {
- do {
- uint32 offset = (_section[image].addressHigh << 16) + _section[image].addressLow;
- if (offset == kInvalidAddress || _section[image].x2 == 0) {
- return false;
- }
- int width = _section[image].x2 - _section[image].x1 + 1;
- int height = _section[image].y2 - _section[image].y1 + 1;
- uint32 destAddress = imageWidth * _section[image].y1 + _section[image].x1;
- while (height) {
- Common::copy(_encodedImage + offset, _encodedImage + offset + width, surfacePixels + destAddress);
- offset += width;
- destAddress += imageWidth;
- --height;
- }
-
- image = _section[image].next;
- } while (image != 0);
- } else {
- image -= 128;
- do {
- int width = _section[image].x2 - _section[image].x1 + 1;
- int height = _section[image].y2 - _section[image].y1 + 1;
- uint32 destAddress = imageWidth * _section[image].y1 + _section[image].x1;
- uint32 offset = (_section[image].addressHigh << 16) + _section[image].addressLow + destAddress;
- while (height) {
- Common::copy(_encodedImage + offset, _encodedImage + offset + width, surfacePixels + destAddress);
- offset += imageWidth;
- destAddress += imageWidth;
- --height;
- }
-
- image = _section[image].next;
- } while (image != 0);
- }
+ do {
+ uint32 offset = (_section[image].addressHigh << 16) + _section[image].addressLow;
+ if (offset == kInvalidAddress || _section[image].x2 == 0) {
+ return false;
+ }
+ int width = _section[image].x2 - _section[image].x1 + 1;
+ int height = _section[image].y2 - _section[image].y1 + 1;
+ uint32 destAddress = imageWidth * _section[image].y1 + _section[image].x1;
+ while (height) {
+ Common::copy(_encodedImage + offset, _encodedImage + offset + width, surfacePixels + destAddress);
+ offset += width;
+ destAddress += imageWidth;
+ --height;
+ }
+
+ image = _section[image].next;
+ } while (image != 0);
}
}
Commit: dc12a0fd2392c09c7c5c75bd851da834c48ab4fa
https://github.com/scummvm/scummvm/commit/dc12a0fd2392c09c7c5c75bd851da834c48ab4fa
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:54:41Z
Commit Message:
SUPERNOVA: Enables renderImage() to render inverse sections
Besides the addition of inverse sections, the 'fullscreen' parameter was
removed as it was used only for testing purposes in the beginning.
Changed paths:
engines/supernova/graphics.cpp
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index 1940dd7..d28c601 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -85,6 +85,7 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
_section[i].addressHigh = 0xff;
_section[i].addressLow = 0xffff;
_section[i].x2 = 0;
+ _section[i].next = 0;
}
for (int i = 0; i < _numSections; ++i) {
_section[i].x1 = stream.readUint16LE();
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 26a6aa5..e8e4253 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -273,14 +273,16 @@ void SupernovaEngine::playSoundMod(int filenumber)
-1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO);
}
-void SupernovaEngine::renderImage(MSNImageDecoder &image, int section, bool fullscreen) {
+void SupernovaEngine::renderImage(MSNImageDecoder &image, int section) {
+ _sectionIndex = section;
+
+ if (section > 128)
+ section -= 128;
if (section > image._numSections - 1)
return;
_currentImage = ℑ
_imageIndex = image._filenumber;
- _sectionIndex = section;
-
_system->getPaletteManager()->setPalette(image.getPalette(), 16, 239);
paletteBrightness();
@@ -291,7 +293,6 @@ void SupernovaEngine::renderImage(MSNImageDecoder &image, int section, bool full
if (image._filenumber == 1 || image._filenumber == 2) {
sectionRect.setWidth(640);
sectionRect.setHeight(480);
-
if (_screenWidth != 640) {
_screenWidth = 640;
_screenHeight = 480;
@@ -305,23 +306,21 @@ void SupernovaEngine::renderImage(MSNImageDecoder &image, int section, bool full
}
}
- if (fullscreen) {
- _system->copyRectToScreen(image._sectionSurfaces[section]->getPixels(),
- image._pitch, 0, 0, _screenWidth, _screenHeight);
- } else {
- uint offset = image._section[section].y1 * image._pitch + image._section[section].x1;
- _system->copyRectToScreen(static_cast<const byte *>(image._sectionSurfaces[section]->getPixels()) + offset,
- image._pitch,
- sectionRect.left, sectionRect.top,
- sectionRect.width(), sectionRect.height());
- }
+ uint offset = image._section[section].y1 * image._pitch + image._section[section].x1;
+ if (_sectionIndex > 128)
+ section = 0;
+
+ _system->copyRectToScreen(static_cast<const byte *>(image._sectionSurfaces[section]->getPixels()) + offset,
+ image._pitch,
+ sectionRect.left, sectionRect.top,
+ sectionRect.width(), sectionRect.height());
}
-void SupernovaEngine::renderImage(int filenumber, int section, bool fullscreen) {
+void SupernovaEngine::renderImage(int filenumber, int section) {
if (filenumber > ARRAYSIZE(_images) - 1)
return;
- renderImage(_images[filenumber], section, fullscreen);
+ renderImage(_images[filenumber], section);
}
void SupernovaEngine::saveScreen(int x, int y, int width, int height) {
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 1d3b17c..67c7067 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -117,8 +117,8 @@ public:
void playSound(AudioIndex sample);
void playSoundMod(int filenumber);
void stopSound();
- void renderImage(MSNImageDecoder &image, int section, bool fullscreen = false);
- void renderImage(int filenumber, int section, bool fullscreen = false);
+ void renderImage(MSNImageDecoder &image, int section);
+ void renderImage(int filenumber, int section);
void saveScreen(int x, int y, int width, int height);
void restoreScreen();
void renderRoom(Room &room);
Commit: 28b6430eaa51a53ac2d1f80595679a617f02fd19
https://github.com/scummvm/scummvm/commit/28b6430eaa51a53ac2d1f80595679a617f02fd19
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:54:42Z
Commit Message:
SUPERNOVA: Fixes typo in definition of objects
Changed paths:
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 475bb64..c3824f8 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -130,7 +130,7 @@ public:
_objectState[6] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPEN | CLOSED | EXIT, 12, 12, 0, AIRLOCK, 2);
_objectState[7] = Object("Knopf", "Er geh�rt zu der gro�en Luke.", BUTTON, PRESS, 13, 13, 0, NULLROOM, 0);
_objectState[8] = Object("Leiter", Object::defaultDescription, NULLOBJECT, NULLTYPE, 14, 14, 0, NULLROOM, 0);
- _objectState[9] = Object("Ausgang", Object::defaultDescription, NULLOBJECT, EXIT, 15, 15, 0, HALL, 2);
+ _objectState[9] = Object("Ausgang", Object::defaultDescription, NULLOBJECT, EXIT, 15, 15, 0, HALL, 22);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -150,7 +150,7 @@ public:
_objectState[2] = Object("Luke", "Sie f�hrt zu den Tiefschlafkammern.", NULLOBJECT, OPEN | CLOSED | EXIT, 1, 1, 2, SLEEP, 8);
_objectState[3] = Object("Schlitz", "Es ist ein Keycard-Leser.", SLEEP_SLOT, COMBINABLE, 2, 2, 0, NULLROOM, 0);
_objectState[4] = Object("Leiter", Object::defaultDescription, NULLOBJECT, NULLTYPE, 3, SLEEP, 0, NULLROOM, 0);
- _objectState[5] = Object("Gang", Object::defaultDescription, NULLOBJECT, EXIT, 6, 6, 0, CORRIDOR, 1);
+ _objectState[5] = Object("Gang", Object::defaultDescription, NULLOBJECT, EXIT, 6, 6, 0, CORRIDOR, 19);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
Commit: b959453b39c76abfc459ecaef982593ff60bf300
https://github.com/scummvm/scummvm/commit/b959453b39c76abfc459ecaef982593ff60bf300
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:54:42Z
Commit Message:
SUPERNOVA: removeMessage() now restores the screen on destruction
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index e8e4253..ed145f1 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -105,6 +105,7 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)
, _gameRunning(true)
, _screenWidth(320)
, _screenHeight(200)
+ , _messageDisplayed(false)
{
// const Common::FSNode gameDataDir(ConfMan.get("path"));
// SearchMan.addSubDirectoryMatching(gameDataDir, "sound");
@@ -437,8 +438,10 @@ void SupernovaEngine::renderMessage(const char *text, MessagePosition position)
}
void SupernovaEngine::removeMessage() {
- // TODO: restore surface
- _messageDisplayed = false;
+ if (_messageDisplayed) {
+ restoreScreen();
+ _messageDisplayed = false;
+ }
}
void SupernovaEngine::renderText(const char *text, int x, int y, byte color) {
Commit: c903ede02383618489e4b1c74f5a63be2416256b
https://github.com/scummvm/scummvm/commit/c903ede02383618489e4b1c74f5a63be2416256b
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-22T23:54:42Z
Commit Message:
SUPERNOVA: Fixes renderRoom() by limiting the section range
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index ed145f1..9abea6b 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -333,10 +333,8 @@ void SupernovaEngine::restoreScreen() {
}
void SupernovaEngine::renderRoom(Room &room) {
- if (room.getFileNumber() == -1) {
- _system->fillScreen(kColorBlack);
- } else {
- for (int i = 0; i < kMaxSection; ++i) {
+ if (room.getFileNumber() != -1) {
+ for (int i = 0; i < _currentImage->_numSections; ++i) {
if (room.isSectionVisible(i))
renderImage(room.getFileNumber(), i);
}
Commit: 0f7266a6b4324ad43549be708b8fafd76ce8884f
https://github.com/scummvm/scummvm/commit/0f7266a6b4324ad43549be708b8fafd76ce8884f
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:00:11Z
Commit Message:
SUPERNOVA: Removes warnings for Inventory code
Changed paths:
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index b8bb9da..655a43d 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -40,7 +40,7 @@ void Inventory::add(Object &obj) {
// TODO: Update Inventory surface for scrolling
void Inventory::remove(Object &obj) {
- for (uint i = 0; i < _numObjects; ++i) {
+ for (int i = 0; i < _numObjects; ++i) {
if (_inventory[i] == &obj) {
--_numObjects;
while (i < _numObjects) {
@@ -52,7 +52,7 @@ void Inventory::remove(Object &obj) {
}
}
-Object *Inventory::get(uint index) const {
+Object *Inventory::get(int index) const {
if (index < _numObjects)
return _inventory[index];
@@ -60,7 +60,7 @@ Object *Inventory::get(uint index) const {
}
Object *Inventory::get(ObjectID id) const {
- for (uint i = 0; i < _numObjects; ++i) {
+ for (int i = 0; i < _numObjects; ++i) {
if (_inventory[i]->_id == id)
return _inventory[i];
}
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index e2d066f..e016417 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -64,13 +64,13 @@ public:
void add(Object &obj);
void remove(Object &obj);
- Object *get(uint index) const;
+ Object *get(int index) const;
Object *get(ObjectID id) const;
- uint getSize() const { return _numObjects; }
+ int getSize() const { return _numObjects; }
private:
Object *_inventory[kMaxCarry];
- uint _numObjects;
+ int _numObjects;
};
class GuiElement : public Common::Rect {
Commit: e9375ea3eeda3597f8269464b1aea06e6ee7c81c
https://github.com/scummvm/scummvm/commit/e9375ea3eeda3597f8269464b1aea06e6ee7c81c
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:00:11Z
Commit Message:
SUPERNOVA: Adds tons of stuff
Most notably changes are,
Handling of object state when calling drawImage() for
inverse section rendering
Beginning to convert GUI to GuiElements (_guiCommandButton)
Mouse Input handling
This is still WIP but better than the glitchfest before.
Changed paths:
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 655a43d..bcbb744 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -20,6 +20,7 @@
*
*/
+#include "common/system.h"
#include "supernova/supernova.h"
#include "supernova/state.h"
@@ -192,33 +193,37 @@ GameManager::GameManager(SupernovaEngine *vm) {
_currentRoom = _rooms[INTRO];
_vm = vm;
- _inputObject[0] = &_nullObjectInstance;
- _inputObject[1] = &_nullObjectInstance;
+ Object::setObjectNull(_currentInputObject);
+ Object::setObjectNull(_inputObject[0]);
+ Object::setObjectNull(_inputObject[1]);
_inputVerb = ACTION_WALK;
- _inputVerb2 = false;
+ _processInput = false;
+ _mouseField = -1;
_inventoryScroll = 0;
initGui();
}
void GameManager::initGui() {
- // TODO: Initialize GUI dimensions to eliminate the use of magic numbers
- // especially in the input handling.
- // Wrapping it in state machine would probably make a lot of it easier
- // as the current state i.e. when selecting/combining objects would need
- // to be queried when deciding what to do (flush inputs / render / ... )
-
int x = 0;
- for (int i = 0; i < ARRAYSIZE(_guiCommandDimensions); ++i) {
+ for (int i = 0; i < ARRAYSIZE(_guiCommandButton); ++i) {
int width;
if (i < 9)
width = _vm->characterWidth(guiCommand_DE[i]) + 2;
else
width = 320 - x;
- _guiCommandDimensions[i] = Common::Rect(x, 150, x + width, 159);
+ _guiCommandButton[i].setSize(x, 150, x + width, 159);
+ _guiCommandButton[i].setText(guiCommand_DE[i]);
+ _guiCommandButton[i].setColor(kColorWhite25, kColorDarkGreen, kColorWhite44, kColorGreen);
x += width + 2;
}
+
+ // Inventory + Inventory Arrows
+
+ // Minimap
+
+ // Status (?)
}
void GameManager::processInput(Common::KeyState &state) {
@@ -251,27 +256,49 @@ void GameManager::processInput(Common::KeyState &state) {
}
}
+void GameManager::resetInputState() {
+ Object::setObjectNull(_inputObject[0]);
+ Object::setObjectNull(_inputObject[1]);
+ _inputVerb = ACTION_WALK;
+ _processInput = false;
+
+ processInput(Common::EVENT_MOUSEMOVE, _mouseX, _mouseY);
+}
+
void GameManager::processInput(Common::EventType eventType, int x, int y) {
_mouseClickType = eventType;
_mouseX = x;
_mouseY = y;
- _inputObject[0] = &_nullObjectInstance;
- _inputObject[1] = &_nullObjectInstance;
- _inputVerb = ACTION_WALK;
- _inputVerb2 = false;
- _mouseField = -1;
- _objectNumber = 0;
if (_mouseClickType == Common::EVENT_LBUTTONUP) {
- // STUB
+ _vm->removeMessage();
+ if (Object::isNullObject(_currentInputObject))
+ return;
+
+ if (_mouseField >= 256 && _mouseField < 512) {
+ resetInputState();
+ _inputVerb = static_cast<Action>(_mouseField - 256);
+ drawStatus();
+ }
+ if (_inputVerb == ACTION_GIVE || _inputVerb == ACTION_USE) {
+ if (Object::isNullObject(_inputObject[0]))
+ _inputObject[0] = _currentInputObject;
+ else
+ _inputObject[1] = _currentInputObject;
+ } else {
+ _inputObject[0] = _currentInputObject;
+ _processInput = true;
+ }
} else if (_mouseClickType == Common::EVENT_RBUTTONUP) {
+ _vm->removeMessage();
+ if (Object::isNullObject(_currentInputObject))
+ return;
+
ObjectType type;
if (((_mouseField >= 0) && (_mouseField < 256)) ||
- ((_mouseField >= 512) && (_mouseField < 768))) {
- _inputObject[0] = _inputObject[_objectNumber];
- _objectNumber = 0;
- _inputVerb2 = false;
+ ((_mouseField >= 512) && (_mouseField < 768))) {
+ _inputObject[0] = _currentInputObject;
type = _inputObject[0]->_type;
if (type & OPEN) {
if (type & OPENED)
@@ -285,21 +312,25 @@ void GameManager::processInput(Common::EventType eventType, int x, int y) {
} else {
_inputVerb = ACTION_LOOK;
}
+
+ _processInput = true;
}
+
} else if (_mouseClickType == Common::EVENT_MOUSEMOVE) {
- int field;
- int click;
- field = -1;
+ int field = -1;
+ int click = -1;
+
/* command row? */
- if ((y >= _guiCommandDimensions[0].top) && (y <= _guiCommandDimensions[0].bottom)) {
+ if ((y >= _guiCommandButton[0].top) && (y <= _guiCommandButton[0].bottom)) {
field = 9;
- while (x < _guiCommandDimensions[field].left - 1)
+ while (x < _guiCommandButton[field].left - 1)
field--;
field += 256;
}
/* exit box? */
- else if ((x >= 283) && (x <= 317) && (y >= 163) && (y <= 197))
+ else if ((x >= 283) && (x <= 317) && (y >= 163) && (y <= 197)) {
field = _exitList[(x - 283) / 7 + 5 * ((y - 163) / 7)];
+ }
/* inventory box */
else if ((y >= 161) && (x <= 270)) {
field = (x + 1) / 136 + ((y - 161) / 10) * 2;
@@ -310,16 +341,14 @@ void GameManager::processInput(Common::EventType eventType, int x, int y) {
}
/* inventory arrows */
else if ((y >= 161) && (x >= 271) && (x < 279)) {
- if (y > 180) field = 769;
- else field = 768;
+ if (y > 180)
+ field = 769;
+ else
+ field = 768;
}
- /* message window */
-// else if (_vm->_messageDisplayed && (x >= message_columns) && (x < message_columns + message_width) && (y >= message_rows) && (y < message_rows + message_height))
- else if (_vm->_messageDisplayed)
- field = -1;
/* normal item */
else {
- for (int i = 0; (_currentRoom->getObject(i)->_name != NULL) && (field == -1); i++) {
+ for (int i = 0; (_currentRoom->getObject(i)->_name[0] != '\0') && (field == -1); i++) {
click = _currentRoom->getObject(i)->_click;
if (click != 255) {
MSNImageDecoder::ClickField *clickField = _vm->_currentImage->_clickField;
@@ -332,38 +361,55 @@ void GameManager::processInput(Common::EventType eventType, int x, int y) {
} while ((click != 0) && (field == -1));
}
}
-
- if ((_objectNumber == 1) && (_currentRoom->getObject(field) == _inputObject[0]))
- field = -1;
+// if ((_objectNumber == 1) && (_currentRoom->getObject(field) == _currentInputObject))
+// field = -1;
}
+
if (_mouseField != field) {
if (_mouseField >= 768) {
- inventory_arrow(_mouseField - 768, 0);
+ inventory_arrow(_mouseField - 768, false);
} else if (_mouseField >= 512) {
- inventory_object(_mouseField - 512, 0);
- _inputObject[_objectNumber] = &_nullObjectInstance;
- drawStatus();
+ inventory_object(_mouseField - 512, false);
+ Object::setObjectNull(_currentInputObject);
} else if (_mouseField >= 256) {
- drawCommandBox(_mouseField - 256, 0);
+ _guiCommandButton[_mouseField - 256].setHighlight(false);
} else if (_mouseField != -1) {
- _inputObject[_objectNumber] = &_nullObjectInstance;
- drawStatus();
+ Object::setObjectNull(_currentInputObject);
}
+
_mouseField = field;
if (_mouseField >= 768) {
- inventory_arrow(_mouseField - 768, 1);
+ inventory_arrow(_mouseField - 768, true);
} else if (_mouseField >= 512) {
- inventory_object(_mouseField - 512, 1);
- _inputObject[_objectNumber] = _inventory.get(_mouseField - 512 + _inventoryScroll);
- drawStatus();
+ inventory_object(_mouseField - 512, true);
+ _currentInputObject = _inventory.get(_mouseField - 512 + _inventoryScroll);
} else if (_mouseField >= 256) {
- drawCommandBox(_mouseField - 256, 1);
+ _guiCommandButton[_mouseField - 256].setHighlight(true);
} else if (_mouseField != -1) {
- _inputObject[_objectNumber] = _currentRoom->getObject(_mouseField);
- drawStatus();
+ _currentInputObject = _currentRoom->getObject(_mouseField);
}
}
+
+ drawStatus();
+ }
+}
+
+void GameManager::drawImage(int section) {
+ bool sectionVisible = true;
+
+ if (section > 128) {
+ sectionVisible = false;
+ section -= 128;
}
+
+ do {
+ _currentRoom->setSectionVisible(section, sectionVisible);
+ if (sectionVisible)
+ _vm->renderImage(_currentRoom->getFileNumber(), section);
+ else
+ _vm->renderImage(_currentRoom->getFileNumber(), section + 128);
+ section = _vm->_currentImage->_section[section].next;
+ } while (section != 0);
}
bool GameManager::isHelmetOff() {
@@ -416,24 +462,27 @@ void GameManager::takeObject(Object &obj) {
_inventory.add(obj);
}
-void GameManager::inventory_object(int num, bool brightness) {
+void GameManager::inventory_object(int index, bool brightness) {
+ int x = 136 * (index % 2);
+ int y = 161 + 10 * (index / 2);
+ _vm->renderBox(x, y, 135, 9, (brightness) ? HGR_INV_HELL : HGR_INV);
+ if (index < _inventory.getSize())
+ _vm->renderText(_inventory.get(index + _inventoryScroll)->_name, x + 1, y + 1,
+ (brightness) ? COL_INV_HELL : COL_INV);
}
void GameManager::drawCommandBox() {
- for (int i = 0; i < 10; ++i)
- drawCommandBox(i, 0);
-}
-
-void GameManager::drawCommandBox(int cmd, bool brightness) {
- _vm->renderBox(_guiCommandDimensions[cmd].left,
- _guiCommandDimensions[cmd].top,
- _guiCommandDimensions[cmd].width(),
- _guiCommandDimensions[cmd].height(),
- (brightness) ? HGR_BEF_HELL:HGR_BEF);
- _vm->renderText(guiCommand_DE[cmd],
- _guiCommandDimensions[cmd].left + 1,
- _guiCommandDimensions[cmd].top + 1,
- (brightness) ? COL_BEF_HELL:COL_BEF);
+ for (int i = 0; i < ARRAYSIZE(_guiCommandButton); ++i) {
+ _vm->renderBox(_guiCommandButton[i].left,
+ _guiCommandButton[i].top,
+ _guiCommandButton[i].width(),
+ _guiCommandButton[i].height(),
+ _guiCommandButton[i]._bgColor);
+ _vm->renderText(_guiCommandButton[i]._text,
+ _guiCommandButton[i]._textPosition.x,
+ _guiCommandButton[i]._textPosition.y,
+ _guiCommandButton[i]._textColor);
+ }
}
void GameManager::inventory_arrow(int num, bool brightness) {
@@ -441,14 +490,12 @@ void GameManager::inventory_arrow(int num, bool brightness) {
}
void GameManager::drawInventory() {
- // TODO: implement scrolling and moveover effects
- int brightness = 0;
for (int i = 0; i < 8; ++i) {
int x = 136 * (i % 2);
int y = 161 + 10 * (i / 2);
- _vm->renderBox(x, y, 135, 9, (brightness) ? HGR_INV_HELL : HGR_INV);
+ _vm->renderBox(x, y, 135, 9, HGR_INV);
if (i < _inventory.getSize())
- _vm->renderText(_inventory.get(i + _inventoryScroll)->_name, x + 1, y + 1, (brightness) ? COL_INV_HELL : COL_INV);
+ _vm->renderText(_inventory.get(i + _inventoryScroll)->_name, x + 1, y + 1, COL_INV);
}
_vm->renderBox(272, 161, 7, 19, HGR_INV);
_vm->renderBox(272, 181, 7, 19, HGR_INV);
@@ -517,8 +564,7 @@ void GameManager::shock() {
void GameManager::showMenu() {
_vm->renderBox(0, 138, 320, 62, 0);
_vm->renderBox(0, 140, 320, 9, HGR_BEF_ANZ);
- for (int i = 0; i < 10; i++)
- drawCommandBox(i, 0);
+ drawCommandBox();
_vm->renderBox(281, 161, 39, 39, HGR_AUSG);
drawInventory();
}
@@ -557,23 +603,23 @@ void GameManager::loadOverlayStart() {
}
void GameManager::drawStatus() {
- _vm->renderBox(0, 140, 320, 9, HGR_BEF_ANZ);
int index = static_cast<int>(_inputVerb);
+ _vm->renderBox(0, 140, 320, 9, HGR_BEF_ANZ);
_vm->renderText(guiStatusCommand_DE[index], 1, 141, COL_BEF_ANZ);
- if (_inputObject[0]->_id != NULLOBJECT) {
+ if (Object::isNullObject(_inputObject[0])) {
+ _vm->renderText(_currentInputObject->_name);
+ } else {
_vm->renderText(_inputObject[0]->_name);
- if (_inputVerb2) {
- if (_inputVerb == ACTION_GIVE) {
- // to
- _vm->renderText(" an ");
- } else {
- // with
- _vm->renderText(" mit ");
- }
- if (_inputObject[1] != &_nullObjectInstance)
- _vm->renderText(_inputObject[1]->_name);
+ if (_inputVerb == ACTION_GIVE) {
+ // to
+ _vm->renderText(" an ");
+ } else if (_inputVerb == ACTION_USE) {
+ // with
+ _vm->renderText(" mit ");
}
+
+ _vm->renderText(_currentInputObject->_name);
}
}
@@ -658,7 +704,9 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage("Halt, hier ist ein interessanter Artikel.");
mouseWait(_timer1);
_vm->removeMessage();
- _vm->renderImage(2,0);
+ // TODO: Implement a 'newspaper room' to eliminate handling
+ // those cases seperately
+ _vm->renderImage(2, 0);
_vm->setColor63(40);
mouseInput2();
_vm->renderRoom(*_currentRoom);
@@ -865,127 +913,125 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
}
void GameManager::executeRoom() {
- // TODO: clean up. minimize.
- _vm->renderRoom(*_currentRoom);
+ if (!_vm->_messageDisplayed)
+ _vm->renderRoom(*_currentRoom);
drawMapExits();
drawInventory();
drawStatus();
drawCommandBox();
+
animationOn();
roomBrightness();
if (_vm->_brightness == 0)
_vm->paletteFadeIn();
else
_vm->paletteBrightness();
-
if (!_currentRoom->hasSeen())
_currentRoom->onEntrance();
- bool validCommand = genericInteract(_inputVerb, *_inputObject[0], *_inputObject[1]);
-
+ if (_vm->_messageDisplayed || !_processInput)
+ return;
-#if 0
- if (!validCommand) {
+ bool validCommand = genericInteract(_inputVerb, *_inputObject[0], *_inputObject[1]);
+ if (!validCommand)
validCommand = _currentRoom->interact(_inputVerb, *_inputObject[0], *_inputObject[1]);
- if (!validCommand) {
- switch (_inputVerb) {
- case ACTION_LOOK:
- _vm->renderMessage(_inputObject[0]->_description);
- break;
-
- case ACTION_WALK:
- if (_inputObject[0]->hasProperty(CARRIED)) {
- // You already carry this.
- _vm->renderMessage("Das trgst du doch bei dir.");
- } else if (!_inputObject[0]->hasProperty(EXIT)) {
- // You're already there.
- _vm->renderMessage("Du bist doch schon da.");
- } else if (_inputObject[0]->hasProperty(OPEN) && !_inputObject[0]->hasProperty(OPENED)) {
- // This is closed
- _vm->renderMessage("Das ist geschlossen.");
- } else {
- _currentRoom = _rooms[_inputObject[0]->_exitRoom];
- return;
- }
- break;
-
- case ACTION_TAKE:
- if (_inputObject[0]->hasProperty(OPENED)) {
- // You already have that
- _vm->renderMessage("Das hast du doch schon.");
- } else if (_inputObject[0]->hasProperty(UNNECESSARY)) {
- // You do not need that.
- _vm->renderMessage("Das brauchst du nicht.");
- } else if (!_inputObject[0]->hasProperty(TAKE)) {
- // You can't take that.
- _vm->renderMessage("Das kannst du nicht nehmen.");
- } else {
- takeObject(*_inputObject[0]);
- }
- break;
-
- case ACTION_OPEN:
- if (!_inputObject[0]->hasProperty(OPEN)) {
- // This can't be opened
- _vm->renderMessage("Das lát sich nicht ffnen.");
- } else if (_inputObject[0]->hasProperty(OPENED)) {
- // This is already opened.
- _vm->renderMessage("Das ist schon offen.");
- } else if (_inputObject[0]->hasProperty(CLOSED)) {
- // This is locked.
- _vm->renderMessage("Das ist verschlossen.");
- } else {
- _vm->renderImage(_currentRoom->getFileNumber(), _inputObject[0]->_section);
- _inputObject[0]->setProperty(OPENED);
- byte i = _inputObject[0]->_click;
- _inputObject[0]->_click = _inputObject[0]->_click2;
- _inputObject[0]->_click2 = i;
- _vm->playSound(kAudioDoorOpen);
- }
- break;
-
- case ACTION_CLOSE:
- if (!_inputObject[0]->hasProperty(OPEN) ||
- (_inputObject[0]->hasProperty(CLOSED) &&
- _inputObject[0]->hasProperty(OPENED))) {
- // This can't be closed.
- _vm->renderMessage("Das lát sich nicht schlieáen.");
- } else if (!_inputObject[0]->hasProperty(OPENED)) {
- // This is already closed.
- _vm->renderMessage("Das ist schon geschlossen.");
- } else {
- _vm->renderImage(_currentRoom->getFileNumber(), invertSection(_inputObject[0]->_section));
- _inputObject[0]->disableProperty(OPENED);
- byte i = _inputObject[0]->_click;
- _inputObject[0]->_click = _inputObject[0]->_click2;
- _inputObject[0]->_click2 = i;
- _vm->playSound(kAudioDoorClose);
- }
- break;
-
- case ACTION_GIVE:
- if (_inputObject[0]->hasProperty(CARRIED)) {
- // Better keep it!
- _vm->renderMessage("Behalt es lieber!");
- }
- break;
-
- default:
- // This is not possible.
- _vm->renderMessage("Das geht nicht.");
+ if (!validCommand) {
+ switch (_inputVerb) {
+ case ACTION_LOOK:
+ _vm->renderMessage(_inputObject[0]->_description);
+ break;
+
+ case ACTION_WALK:
+ if (_inputObject[0]->hasProperty(CARRIED)) {
+ // You already carry this.
+ _vm->renderMessage("Das trgst du doch bei dir.");
+ } else if (!_inputObject[0]->hasProperty(EXIT)) {
+ // You're already there.
+ _vm->renderMessage("Du bist doch schon da.");
+ } else if (_inputObject[0]->hasProperty(OPEN) && !_inputObject[0]->hasProperty(OPENED)) {
+ // This is closed
+ _vm->renderMessage("Das ist geschlossen.");
+ } else {
+ changeRoom(_inputObject[0]->_exitRoom);
}
-
- if (_newOverlay) {
- loadOverlayStart();
- _newOverlay = false;
+ break;
+
+ case ACTION_TAKE:
+ if (_inputObject[0]->hasProperty(OPENED)) {
+ // You already have that
+ _vm->renderMessage("Das hast du doch schon.");
+ } else if (_inputObject[0]->hasProperty(UNNECESSARY)) {
+ // You do not need that.
+ _vm->renderMessage("Das brauchst du nicht.");
+ } else if (!_inputObject[0]->hasProperty(TAKE)) {
+ // You can't take that.
+ _vm->renderMessage("Das kannst du nicht nehmen.");
+ } else {
+ takeObject(*_inputObject[0]);
}
- if (_newRoom) {
- _newRoom = false;
- return;
+ break;
+
+ case ACTION_OPEN:
+ if (!_inputObject[0]->hasProperty(OPEN)) {
+ // This can't be opened
+ _vm->renderMessage("Das lát sich nicht ffnen.");
+ } else if (_inputObject[0]->hasProperty(OPENED)) {
+ // This is already opened.
+ _vm->renderMessage("Das ist schon offen.");
+ } else if (_inputObject[0]->hasProperty(CLOSED)) {
+ // This is locked.
+ _vm->renderMessage("Das ist verschlossen.");
+ } else {
+ drawImage(_inputObject[0]->_section);
+ _inputObject[0]->setProperty(OPENED);
+ byte i = _inputObject[0]->_click;
+ _inputObject[0]->_click = _inputObject[0]->_click2;
+ _inputObject[0]->_click2 = i;
+ _vm->playSound(kAudioDoorOpen);
}
+ break;
+
+ case ACTION_CLOSE:
+ if (!_inputObject[0]->hasProperty(OPEN) ||
+ (_inputObject[0]->hasProperty(CLOSED) &&
+ _inputObject[0]->hasProperty(OPENED))) {
+ // This can't be closed.
+ _vm->renderMessage("Das lát sich nicht schlieáen.");
+ } else if (!_inputObject[0]->hasProperty(OPENED)) {
+ // This is already closed.
+ _vm->renderMessage("Das ist schon geschlossen.");
+ } else {
+ drawImage(invertSection(_inputObject[0]->_section));
+ _inputObject[0]->disableProperty(OPENED);
+ byte i = _inputObject[0]->_click;
+ _inputObject[0]->_click = _inputObject[0]->_click2;
+ _inputObject[0]->_click2 = i;
+ _vm->playSound(kAudioDoorClose);
+ }
+ break;
+
+ case ACTION_GIVE:
+ if (_inputObject[0]->hasProperty(CARRIED)) {
+ // Better keep it!
+ _vm->renderMessage("Behalt es lieber!");
+ }
+ break;
+
+ default:
+ // This is not possible.
+ _vm->renderMessage("Das geht nicht.");
+ }
+
+ if (_newOverlay) {
+ loadOverlayStart();
+ _newOverlay = false;
+ }
+ if (_newRoom) {
+ _newRoom = false;
}
}
-#endif
+
+ resetInputState();
}
}
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index e016417..14155d5 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -118,11 +118,10 @@ public:
Inventory _inventory;
GameState _state;
int _status;
+ bool _processInput;
Action _inputVerb;
- bool _inputVerb2;
- Object _nullObjectInstance;
+ Object *_currentInputObject;
Object *_inputObject[2];
- int _objectNumber;
bool _waitEvent;
bool _newRoom;
bool _newOverlay;
@@ -130,7 +129,7 @@ public:
int _timer2;
int _inventoryScroll;
int _exitList[25];
- Common::Rect _guiCommandDimensions[10];
+ GuiElement _guiCommandButton[10];
// 0 PC Speaker | 1 SoundBlaster | 2 No Sound
int _soundDevice;
@@ -166,12 +165,13 @@ public:
int invertSection(int section);
void drawMapExits();
void drawStatus();
- void drawCommandBox(int cmd, bool brightness);
void drawCommandBox();
void inventory_arrow(int num, bool brightness);
- void inventory_object(int num, bool brightness);
+ void inventory_object(int index, bool brightness);
void drawInventory();
+ void drawImage(int section);
void changeRoom(RoomID id);
+ void resetInputState();
};
}
Commit: 40c609c40b93b557092b5e9abf68f72be63f33a7
https://github.com/scummvm/scummvm/commit/40c609c40b93b557092b5e9abf68f72be63f33a7
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:00:11Z
Commit Message:
SUPERNOVA: Adds debugging code for rendering available sections
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 9abea6b..c62efea 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -153,6 +153,12 @@ Common::Error SupernovaEngine::run() {
(_event.kbd.flags & Common::KBD_CTRL)) {
_console->attach();
}
+ if (_event.kbd.keycode == Common::KEYCODE_s) {
+ for (int i = 0; i < _currentImage->_numSections; ++i) {
+ gm.drawImage(i);
+ _system->updateScreen();
+ }
+ }
gm.processInput(_event.kbd);
break;
@@ -164,6 +170,7 @@ Common::Error SupernovaEngine::run() {
case Common::EVENT_MOUSEMOVE:
gm.processInput(_event.type, _event.mouse.x, _event.mouse.y);
break;
+
default:
break;
}
Commit: 4d3e1eed8e303bb0674ce3c2c4782623ec5d7e8b
https://github.com/scummvm/scummvm/commit/4d3e1eed8e303bb0674ce3c2c4782623ec5d7e8b
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:00:11Z
Commit Message:
SUPERNOVA: Corrects OPEN to more descriptive OPENABLE
Changed paths:
engines/supernova/msn_def.h
engines/supernova/rooms.h
engines/supernova/state.cpp
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 50c91aa..1c89a07 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -338,7 +338,7 @@ const byte initVGAPalette[768] = {
enum ObjectType {
NULLTYPE = 0,
TAKE = 1,
- OPEN = 2,
+ OPENABLE = 2,
OPENED = 4,
CLOSED = 8,
EXIT = 16,
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index c3824f8..f382fc1 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -121,13 +121,13 @@ public:
_shown[3] = false;
_shown[4] = true;
- _objectState[0] = Object("Luke", Object::defaultDescription, HATCH1, OPEN | EXIT, 0, 6, 1, CABIN_L1, 15);
- _objectState[1] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPEN | EXIT, 1, 7, 2, CABIN_L2, 10);
- _objectState[2] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPEN | EXIT, 2, 8, 3, CABIN_L3, 5);
- _objectState[3] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPEN | EXIT, 5, 11, 6, CABIN_R1, 19);
- _objectState[4] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPEN | EXIT, 4, 10, 5, CABIN_R2, 14);
- _objectState[5] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPEN | EXIT | OPENED, 9, 3, 4, CABIN_R3, 9);
- _objectState[6] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPEN | CLOSED | EXIT, 12, 12, 0, AIRLOCK, 2);
+ _objectState[0] = Object("Luke", Object::defaultDescription, HATCH1, OPENABLE | EXIT, 0, 6, 1, CABIN_L1, 15);
+ _objectState[1] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | EXIT, 1, 7, 2, CABIN_L2, 10);
+ _objectState[2] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | EXIT, 2, 8, 3, CABIN_L3, 5);
+ _objectState[3] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | EXIT, 5, 11, 6, CABIN_R1, 19);
+ _objectState[4] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | EXIT, 4, 10, 5, CABIN_R2, 14);
+ _objectState[5] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | EXIT | OPENED, 9, 3, 4, CABIN_R3, 9);
+ _objectState[6] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | CLOSED | EXIT, 12, 12, 0, AIRLOCK, 2);
_objectState[7] = Object("Knopf", "Er geh�rt zu der gro�en Luke.", BUTTON, PRESS, 13, 13, 0, NULLROOM, 0);
_objectState[8] = Object("Leiter", Object::defaultDescription, NULLOBJECT, NULLTYPE, 14, 14, 0, NULLROOM, 0);
_objectState[9] = Object("Ausgang", Object::defaultDescription, NULLOBJECT, EXIT, 15, 15, 0, HALL, 22);
@@ -145,9 +145,9 @@ public:
_fileNumber = 15;
_shown[0] = true;
- _objectState[0] = Object("Luke", "Sie f�hrt ins Cockpit.", NULLOBJECT, OPEN | EXIT, 4, 5, 1, COCKPIT, 10);
- _objectState[1] = Object("Luke", "Sie f�hrt zur K�che.", KITCHEN_HATCH, OPEN | EXIT, 0, 0, 0, NULLROOM, 1);
- _objectState[2] = Object("Luke", "Sie f�hrt zu den Tiefschlafkammern.", NULLOBJECT, OPEN | CLOSED | EXIT, 1, 1, 2, SLEEP, 8);
+ _objectState[0] = Object("Luke", "Sie f�hrt ins Cockpit.", NULLOBJECT, OPENABLE | EXIT, 4, 5, 1, COCKPIT, 10);
+ _objectState[1] = Object("Luke", "Sie f�hrt zur K�che.", KITCHEN_HATCH, OPENABLE | EXIT, 0, 0, 0, NULLROOM, 1);
+ _objectState[2] = Object("Luke", "Sie f�hrt zu den Tiefschlafkammern.", NULLOBJECT, OPENABLE | CLOSED | EXIT, 1, 1, 2, SLEEP, 8);
_objectState[3] = Object("Schlitz", "Es ist ein Keycard-Leser.", SLEEP_SLOT, COMBINABLE, 2, 2, 0, NULLROOM, 0);
_objectState[4] = Object("Leiter", Object::defaultDescription, NULLOBJECT, NULLTYPE, 3, SLEEP, 0, NULLROOM, 0);
_objectState[5] = Object("Gang", Object::defaultDescription, NULLOBJECT, EXIT, 6, 6, 0, CORRIDOR, 19);
@@ -216,10 +216,10 @@ public:
_objectState[3] = Object("Magnete", "Damit werden Sachen auf|dem Tisch festgehalten.", NULLOBJECT, UNNECESSARY, 8, 8, 0, NULLROOM, 0);
_objectState[4] = Object("Bild", "Es scheint noch nicht fertig zu sein.", NULLOBJECT, UNNECESSARY, 9, 9, 0);
_objectState[5] = Object("Stift", "Ein Kugelschreiber.", PEN, TAKE | COMBINABLE, 10, 10, 5 | 128);
- _objectState[6] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPEN | OPENED | EXIT, 3, 3, 24 | 128, CORRIDOR, 9);
+ _objectState[6] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | OPENED | EXIT, 3, 3, 24 | 128, CORRIDOR, 9);
_objectState[7] = Object("Schlitz", "Es ist ein Keycard-Leser.", NULLOBJECT, COMBINABLE, 0, 0, 0);
- _objectState[8] = Object("Schrank", Object::defaultDescription, NULLOBJECT, OPEN | CLOSED, 1, 1, 0);
- _objectState[9] = Object("Fach", Object::defaultDescription, NULLOBJECT, OPEN | CLOSED, 2, 2, 0);
+ _objectState[8] = Object("Schrank", Object::defaultDescription, NULLOBJECT, OPENABLE | CLOSED, 1, 1, 0);
+ _objectState[9] = Object("Fach", Object::defaultDescription, NULLOBJECT, OPENABLE | CLOSED, 2, 2, 0);
_objectState[10] = Object("Steckdose", Object::defaultDescription, SOCKET, COMBINABLE, 4, 4, 0);
_objectState[11] = Object("Toilette", Object::defaultDescription, BATHROOM_DOOR, EXIT, 255, 255, 0, BATHROOM, 22);
}
@@ -254,13 +254,13 @@ public:
_objectState[1] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_KL2,COMBINABLE,32,32,0);
_objectState[2] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_KL3,COMBINABLE,33,33,0);
_objectState[3] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_KL4,COMBINABLE,45,45,0);
- _objectState[4] = Object("Schrank",Object::defaultDescription,SHELF_L1,OPEN | CLOSED,25,26,17);
+ _objectState[4] = Object("Schrank",Object::defaultDescription,SHELF_L1,OPENABLE | CLOSED,25,26,17);
_objectState[5] = Object("Pistole","Es ist keine Munition drin.",PISTOL,TAKE,39,39,20);
- _objectState[6] = Object("Fach",Object::defaultDescription,SHELF_L2,OPEN | CLOSED,27,28,18);
+ _objectState[6] = Object("Fach",Object::defaultDescription,SHELF_L2,OPENABLE | CLOSED,27,28,18);
_objectState[7] = Object("B�cher","Lauter wissenschaftliche B�cher.",NULLOBJECT,UNNECESSARY,40,40,0);
- _objectState[8] = Object("Fach",Object::defaultDescription,SHELF_L3,OPEN | CLOSED,29,30,19);
+ _objectState[8] = Object("Fach",Object::defaultDescription,SHELF_L3,OPENABLE | CLOSED,29,30,19);
_objectState[9] = Object("Kabelrolle","Da sind mindestens zwanzig Meter drauf.", SPOOL,TAKE | COMBINABLE,41,41,21);
- _objectState[10] = Object("Fach",Object::defaultDescription,SHELF_L4,OPEN | CLOSED,43,44,22);
+ _objectState[10] = Object("Fach",Object::defaultDescription,SHELF_L4,OPENABLE | CLOSED,43,44,22);
_objectState[11] = Object("Buch",Object::defaultDescription,BOOK2,TAKE,46,46,23);
_objectState[12] = Object("Unterw�sche","Ich habe keine Lust, in|der Unterw�sche des|Commanders rumzuw�hlen.",NULLOBJECT,UNNECESSARY,34,34,0);
_objectState[13] = Object("Unterw�sche","Ich habe keine Lust, in|der Unterw�sche des|Commanders rumzuw�hlen.",NULLOBJECT,UNNECESSARY,35,35,0);
@@ -269,10 +269,10 @@ public:
_objectState[16] = Object("Krimskram","Es ist nichts brauchbares dabei.",NULLOBJECT,UNNECESSARY,38,38,0);
_objectState[17] = Object("Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",NULLOBJECT,UNNECESSARY,23,23,0);
_objectState[18] = Object("Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
- _objectState[19] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPEN | OPENED | EXIT,3,3,24 | 128,CORRIDOR,9);
+ _objectState[19] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,24 | 128,CORRIDOR,9);
_objectState[20] = Object("Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
- _objectState[21] = Object("Schrank",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,1,1,0);
- _objectState[22] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,2,2,0);
+ _objectState[21] = Object("Schrank",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
+ _objectState[22] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
_objectState[23] = Object("Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
_objectState[24] = Object("Ordner","Darauf steht \"Dienstanweisungen|zur Mission Supernova\".|Es steht nichts wichtiges drin.",NULLOBJECT,UNNECESSARY,49,49,0);
}
@@ -312,10 +312,10 @@ public:
_objectState[8] = Object("Leitung",Object::defaultDescription,WIRE,COMBINABLE,18,18,0);
_objectState[9] = Object("Leitung",Object::defaultDescription,WIRE2,COMBINABLE,19,19,0);
_objectState[10] = Object("Stecker",Object::defaultDescription,PLUG,COMBINABLE,20,20,0);
- _objectState[11] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPEN | OPENED | EXIT,3,3,24 | 128,CORRIDOR,9);
+ _objectState[11] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,24 | 128,CORRIDOR,9);
_objectState[12] = Object("Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
- _objectState[13] = Object("Schrank",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,1,1,0);
- _objectState[14] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,2,2,0);
+ _objectState[13] = Object("Schrank",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
+ _objectState[14] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
_objectState[15] = Object("Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
_objectState[16] = Object("Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
}
@@ -337,10 +337,10 @@ public:
_objectState[0] = Object("Bild","Manche Leute haben schon|einen komischen Geschmack.",NULLOBJECT,UNNECESSARY,5,5,0);
_objectState[1] = Object("Zeichenger�te","Auf dem Zettel sind lauter|unverst�ndliche Skizzen und Berechnungen.|(Jedenfalls f�r dich unverst�ndlich.)",NULLOBJECT,UNNECESSARY,6,6,0);
_objectState[2] = Object("Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",NULLOBJECT,UNNECESSARY,7,7,0);
- _objectState[3] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPEN | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
+ _objectState[3] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
_objectState[4] = Object("Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
- _objectState[5] = Object("Schrank",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,1,1,0);
- _objectState[6] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,2,2,0);
+ _objectState[5] = Object("Schrank",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
+ _objectState[6] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
_objectState[7] = Object("Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
_objectState[8] = Object("Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
}
@@ -363,10 +363,10 @@ public:
_objectState[0] = Object("Schachspiel","Es macht wohl Spa�, an|der Decke Schach zu spielen.",NULLOBJECT,UNNECESSARY,11,11,0);
_objectState[1] = Object("Tennisschl�ger","Fliegt Boris Becker auch mit?",NULLOBJECT,UNNECESSARY,8,8,0);
_objectState[2] = Object("Tennisball","Toll!",NULLOBJECT,UNNECESSARY,9,9,0);
- _objectState[3] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPEN | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
+ _objectState[3] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
_objectState[4] = Object("Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
- _objectState[5] = Object("Schrank",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,1,1,0);
- _objectState[6] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,2,2,0);
+ _objectState[5] = Object("Schrank",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
+ _objectState[6] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
_objectState[7] = Object("Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
_objectState[8] = Object("Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
}
@@ -402,22 +402,22 @@ public:
_objectState[3] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_K2,COMBINABLE,28,28,0);
_objectState[4] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_K3,COMBINABLE,29,29,0);
_objectState[5] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_K4,COMBINABLE,30,30,0);
- _objectState[6] = Object("Fach","Das ist eins deiner drei F�cher.",SHELF1,OPEN | CLOSED,14,18,9);
+ _objectState[6] = Object("Fach","Das ist eins deiner drei F�cher.",SHELF1,OPENABLE | CLOSED,14,18,9);
_objectState[7] = Object("Alben","Deine Briefmarkensammlung.",NULLOBJECT,UNNECESSARY,14,14,0);
- _objectState[8] = Object("Fach","Das ist eins deiner drei F�cher.",SHELF2,OPEN | CLOSED,15,19,10);
+ _objectState[8] = Object("Fach","Das ist eins deiner drei F�cher.",SHELF2,OPENABLE | CLOSED,15,19,10);
_objectState[9] = Object("Seil","Es ist ungef�hr 10 m lang und 4 cm dick.",ROPE,TAKE | COMBINABLE,15,15,12);
- _objectState[10] = Object("Schrank","Das ist dein Schrank.",SHELF3,OPEN | CLOSED,16,17,11);
+ _objectState[10] = Object("Schrank","Das ist dein Schrank.",SHELF3,OPENABLE | CLOSED,16,17,11);
_objectState[11] = Object("Krimskram","Es ist nichts brauchbares dabei.",NULLOBJECT,UNNECESSARY,20,20,0);
_objectState[12] = Object("Kleider","Es sind Standard-Weltraum-Klamotten.",NULLOBJECT,UNNECESSARY,21,21,0);
_objectState[13] = Object("Unterw�sche",Object::defaultDescription,NULLOBJECT,UNNECESSARY,22,22,0);
_objectState[14] = Object("Str�mpfe",Object::defaultDescription,NULLOBJECT,UNNECESSARY,23,23,0);
- _objectState[15] = Object("Fach","Das ist eins deiner drei F�cher.",SHELF4,OPEN | CLOSED,24,25,13);
+ _objectState[15] = Object("Fach","Das ist eins deiner drei F�cher.",SHELF4,OPENABLE | CLOSED,24,25,13);
_objectState[16] = Object("Buch","Es ist|\"Per Anhalter durch die Galaxis\"|von Douglas Adams.",BOOK,TAKE,26,26,14);
_objectState[17] = Object("Discman","Es ist eine \"Mad Monkeys\"-CD darin.",DISCMAN,TAKE | COMBINABLE,33,33,16);
- _objectState[18] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPEN | EXIT,3,3,15 | 128,CORRIDOR,5);
+ _objectState[18] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | EXIT,3,3,15 | 128,CORRIDOR,5);
_objectState[19] = Object("Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
- _objectState[20] = Object("Schrank",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,1,1,0);
- _objectState[21] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,2,2,0);
+ _objectState[20] = Object("Schrank",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
+ _objectState[21] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
_objectState[22] = Object("Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
_objectState[23] = Object("Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
}
@@ -455,8 +455,8 @@ public:
_shown[5] = false;
_shown[6] = true;
- _objectState[0] = Object("Luke","Das ist eine Luke !!!",NULLOBJECT,EXIT | OPEN | OPENED | CLOSED,0,0,0,CORRIDOR,10);
- _objectState[1] = Object("Luke","Dies ist eine Luke !!!",NULLOBJECT,EXIT | OPEN | CLOSED,1,1,0,HOLD,14);
+ _objectState[0] = Object("Luke","Das ist eine Luke !!!",NULLOBJECT,EXIT | OPENABLE | OPENED | CLOSED,0,0,0,CORRIDOR,10);
+ _objectState[1] = Object("Luke","Dies ist eine Luke !!!",NULLOBJECT,EXIT | OPENABLE | CLOSED,1,1,0,HOLD,14);
_objectState[2] = Object("Knopf",Object::defaultDescription,BUTTON1,PRESS,2,2,0);
_objectState[3] = Object("Knopf",Object::defaultDescription,BUTTON2,PRESS,3,3,0);
_objectState[4] = Object("Helm","Es ist der Helm zum Raumanzug.",HELMET,TAKE,4,4,7);
@@ -484,10 +484,10 @@ public:
_objectState[4] = Object("Reaktor","Das war einmal der Reaktor.",NULLOBJECT,NULLTYPE,6,6,0);
_objectState[5] = Object("D�se",Object::defaultDescription,NULLOBJECT,NULLTYPE,7,7,0);
_objectState[6] = Object("blauer K�rbis","Keine Ahnung, was das ist.",NULLOBJECT,NULLTYPE,8,8,0);
- _objectState[7] = Object("Luke",Object::defaultDescription,LANDINGMOD_OUTERHATCH,EXIT | OPEN,1,2,2,LANDINGMODULE,6);
+ _objectState[7] = Object("Luke",Object::defaultDescription,LANDINGMOD_OUTERHATCH,EXIT | OPENABLE,1,2,2,LANDINGMODULE,6);
_objectState[8] = Object("Landef�hre","Sie war eigentlich f�r Bodenuntersuchungen|auf Arsano 3 gedacht.",NULLOBJECT,NULLTYPE,0,0,0);
_objectState[9] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,AIRLOCK,22);
- _objectState[10] = Object("Luke","Sie f�hrt nach drau�en.",OUTERHATCH_TOP,EXIT | OPEN | OPENED,3,3,0,GENERATOR,8);
+ _objectState[10] = Object("Luke","Sie f�hrt nach drau�en.",OUTERHATCH_TOP,EXIT | OPENABLE | OPENED,3,3,0,GENERATOR,8);
_objectState[11] = Object("Generator","Er versorgt das Raumschiff mit Strom.",GENERATOR_TOP,EXIT,12,12,0,GENERATOR,8);
}
@@ -509,7 +509,7 @@ public:
_objectState[2] = Object("Monitor",Object::defaultDescription,LANDINGMOD_MONITOR,NULLTYPE,3,3,0);
_objectState[3] = Object("Tastatur",Object::defaultDescription,KEYBOARD,NULLTYPE,4,4,0);
_objectState[4] = Object("",Object::defaultDescription,LANDINGMOD_WIRE,COMBINABLE,255,255,0);
- _objectState[5] = Object("Luke",Object::defaultDescription,LANDINGMOD_HATCH,EXIT | OPEN | OPENED | COMBINABLE, 0,0,1 | 128,HOLD,10);
+ _objectState[5] = Object("Luke",Object::defaultDescription,LANDINGMOD_HATCH,EXIT | OPENABLE | OPENED | COMBINABLE, 0,0,1 | 128,HOLD,10);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -533,10 +533,10 @@ public:
_objectState[1] = Object("leere Kabelrolle",Object::defaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
_objectState[2] = Object("Keycard","Hey, das ist die Keycard des Commanders!|Er mu� sie bei dem �berst�rzten|Aufbruch verloren haben.",KEYCARD2,COMBINABLE | TAKE,12,12,5 | 128);
_objectState[3] = Object("Seil",Object::defaultDescription,GENERATOR_ROPE,COMBINABLE,255,255,0);
- _objectState[4] = Object("Luke","Sie f�hrt nach drau�en.",OUTERHATCH,EXIT | OPEN,1,2,1,OUTSIDE,22);
- _objectState[5] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPEN | CLOSED,3,3,0);
+ _objectState[4] = Object("Luke","Sie f�hrt nach drau�en.",OUTERHATCH,EXIT | OPENABLE,1,2,1,OUTSIDE,22);
+ _objectState[5] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,3,3,0);
_objectState[6] = Object("Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,4,4,0);
- _objectState[7] = Object("Klappe",Object::defaultDescription,TRAP,OPEN,5,6,2);
+ _objectState[7] = Object("Klappe",Object::defaultDescription,TRAP,OPENABLE,5,6,2);
_objectState[8] = Object("Leitung",Object::defaultDescription,NULLOBJECT,NULLTYPE,7,7,0);
_objectState[9] = Object("Spannungmessger�t",Object::defaultDescription,VOLTMETER,NULLTYPE,9,9,0,NULLROOM,0);
_objectState[10] = Object("Klemme",Object::defaultDescription,CLIP,COMBINABLE,8,8,0);
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index bcbb744..cc06c51 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -300,7 +300,7 @@ void GameManager::processInput(Common::EventType eventType, int x, int y) {
((_mouseField >= 512) && (_mouseField < 768))) {
_inputObject[0] = _currentInputObject;
type = _inputObject[0]->_type;
- if (type & OPEN) {
+ if (type & OPENABLE) {
if (type & OPENED)
_inputVerb = ACTION_CLOSE;
else
@@ -948,7 +948,7 @@ void GameManager::executeRoom() {
} else if (!_inputObject[0]->hasProperty(EXIT)) {
// You're already there.
_vm->renderMessage("Du bist doch schon da.");
- } else if (_inputObject[0]->hasProperty(OPEN) && !_inputObject[0]->hasProperty(OPENED)) {
+ } else if (_inputObject[0]->hasProperty(OPENABLE) && !_inputObject[0]->hasProperty(OPENED)) {
// This is closed
_vm->renderMessage("Das ist geschlossen.");
} else {
@@ -972,7 +972,7 @@ void GameManager::executeRoom() {
break;
case ACTION_OPEN:
- if (!_inputObject[0]->hasProperty(OPEN)) {
+ if (!_inputObject[0]->hasProperty(OPENABLE)) {
// This can't be opened
_vm->renderMessage("Das lát sich nicht ffnen.");
} else if (_inputObject[0]->hasProperty(OPENED)) {
@@ -992,7 +992,7 @@ void GameManager::executeRoom() {
break;
case ACTION_CLOSE:
- if (!_inputObject[0]->hasProperty(OPEN) ||
+ if (!_inputObject[0]->hasProperty(OPENABLE) ||
(_inputObject[0]->hasProperty(CLOSED) &&
_inputObject[0]->hasProperty(OPENED))) {
// This can't be closed.
Commit: 5224c4d313713cd9c3f87ae628a62fa976c6ce41
https://github.com/scummvm/scummvm/commit/5224c4d313713cd9c3f87ae628a62fa976c6ce41
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:00:11Z
Commit Message:
SUPERNOVA: Refactors room definitions
Calling renderImage() directly causes unintended side effects since
e9d7b7ca0f as drawImage() besides rendering also set visibility flags.
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 757fe6c..7f0d703 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -31,7 +31,7 @@ void StartingItems::onEntrance() {
for (int i = 0; i < 3; ++i)
_gm->_inventory.add(*getObject(i));
- this->setRoomSeen(true);
+ setRoomSeen(true);
_gm->changeRoom(CABIN_R3);
}
@@ -40,23 +40,23 @@ bool ShipCorridor::interact(Action verb, Object &obj1, Object &obj2) {
if (_objectState[6].hasProperty(OPENED)) {
_vm->playSound(kAudioDoorSound);
_objectState[6].disableProperty(OPENED);
- _vm->renderImage(_gm->_currentRoom->getFileNumber(), 8);
- _shown[9] = false;
+ _gm->drawImage(8);
+ setSectionVisible(9, false);
_gm->wait2(2);
- _vm->renderImage(_gm->_currentRoom->getFileNumber(), 7);
- _shown[8] = false;
+ _gm->drawImage(7);
+ setSectionVisible(8, false);
_gm->wait2(2);
- _vm->renderImage(_gm->_currentRoom->getFileNumber(), _gm->invertSection(7));
+ _gm->drawImage(_gm->invertSection(7));
} else {
_vm->playSound(kAudioDoorSound);
_objectState[6].setProperty(OPENED);
- _vm->renderImage(_gm->_currentRoom->getFileNumber(), 7);
+ _gm->drawImage(7);
_gm->wait2(2);
- _vm->renderImage(_gm->_currentRoom->getFileNumber(), 8);
- _shown[7] = false;
+ _gm->drawImage(8);
+ setSectionVisible(7, false);
_gm->wait2(2);
- _vm->renderImage(_gm->_currentRoom->getFileNumber(), 9);
- _shown[8] = false;
+ _gm->drawImage(9);
+ setSectionVisible(8, false);
}
return true;
}
@@ -69,22 +69,22 @@ bool ShipHall::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_USE) && Object::combine(obj1,obj2,KEYCARD2,SLEEP_SLOT)) {
if (_objectState[2].hasProperty(OPENED)) {
_objectState[2].disableProperty(OPENED);
- _vm->renderImage(_gm->_currentRoom->getFileNumber(), 3);
- _shown[4] = false;
+ _gm->drawImage(3);
+ setSectionVisible(4, false);
_gm->wait2(2);
- _vm->renderImage(_gm->_currentRoom->getFileNumber(), 2);
- _shown[3] = false;
+ _gm->drawImage(2);
+ setSectionVisible(3, false);
_gm->wait2(2);
- _vm->renderImage(_gm->_currentRoom->getFileNumber(), _gm->invertSection(2));
+ _gm->drawImage(_gm->invertSection(2));
} else {
_objectState[2].setProperty(OPENED);
- _vm->renderImage(_gm->_currentRoom->getFileNumber(), 2);
+ _gm->drawImage(2);
_gm->wait2(2);
- _vm->renderImage(_gm->_currentRoom->getFileNumber(), 3);
- _shown[2] = false;
+ _gm->drawImage(3);
+ setSectionVisible(2, false);
_gm->wait2(2);
- _vm->renderImage(_gm->_currentRoom->getFileNumber(), 4);
- _shown[3] = false;
+ _gm->drawImage(4);
+ setSectionVisible(3, false);
_gm->great(1);
}
} else {
@@ -102,8 +102,8 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
Room *r;
if (((verb == ACTION_LOOK) || (verb == ACTION_USE)) && (obj1._id == COMPUTER)) {
- _shown[kMaxSection - 1] = true;
- _shown[4] = false;
+ setSectionVisible(kMaxSection - 1, true);
+ setSectionVisible(4, false);
_vm->renderBox(0,0,320,200,kColorDarkBlue);
if (_gm->_state.time == 0) {
// Destination reached
@@ -115,7 +115,7 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
// Artificial coma interrupted
_vm->renderText("Tiefschlafprozess abgebrochen",60,115,kColorWhite99);
_gm->mouseInput2();
- } else if (_shown[5]) {
+ } else if (isSectionVisible(5)) {
// Sleep duration in days
_vm->renderText("Schlafdauer in Tagen:",30,85,kColorWhite99);
_vm->renderText(Common::String::format("%d",_gm->_state.timeSleep).c_str(),
@@ -164,25 +164,25 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_state.timeSleep = l;
_vm->renderText("Bitte legen Sie sich in die angezeigte Schlafkammer.",30,105,kColorWhite99);
_gm->wait2(18);
- _shown[5] = true;
+ setSectionVisible(5, true);
}
escape:
_vm->renderRoom(*this);
_gm->showMenu();
_gm->drawMapExits();
_gm->palette();
- _shown[kMaxSection - 1] = false;
+ setSectionVisible(kMaxSection - 1, false);
} else if (((verb == ACTION_WALK) || (verb == ACTION_USE)) &&
((obj1._id == CABINS) || (obj1._id == CABIN))) {
r = _gm->_rooms[AIRLOCK];
- if (!(obj1._id == CABIN) || !(_shown[5])) {
+ if (!(obj1._id == CABIN) || !isSectionVisible(5)) {
_vm->renderMessage("Es würde wenig bringen,|sich in eine Schlafkammer zu legen,|die nicht eingeschaltet ist.");
} else if (r->getObject(5)->hasProperty(WORN)) {
_vm->renderMessage("Dazu mußt du erst den Raumanzug ausziehen.");
} else {
_vm->paletteFadeOut();
- _vm->renderImage(_gm->_currentRoom->getFileNumber(), _gm->invertSection(5));
- _vm->renderImage(_gm->_currentRoom->getFileNumber(), _gm->invertSection(4));
+ _gm->drawImage(_gm->invertSection(5));
+ _gm->drawImage(_gm->invertSection(4));
r = _gm->_rooms[GENERATOR];
if (r->isSectionVisible(9)) {
energy = &_gm->_state.landingModuleEnergy;
@@ -204,7 +204,7 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
}
}
if (_gm->_state.timeSleep == _gm->_state.time) {
- _vm->renderImage(_gm->_currentRoom->getFileNumber(), 3); // landed
+ _gm->drawImage(3);
r = _gm->_rooms[COCKPIT];
r->setSectionVisible(23, true);
r = _gm->_rooms[CABIN_R2];
@@ -264,7 +264,7 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
void ShipSleepCabin::animation() {
static char color;
- if (this->isSectionVisible(kMaxSection - 1)) {
+ if (isSectionVisible(kMaxSection - 1)) {
if (color) {
color = kColorBlack;
_gm->_timer2 = 5;
@@ -274,23 +274,23 @@ void ShipSleepCabin::animation() {
}
_vm->renderText("Achtung: Triebwerke funktionsunfähig",50,145,color);
} else {
- if (this->isSectionVisible(21)) {
- _vm->renderImage(this->getFileNumber(), _gm->invertSection(21));
+ if (isSectionVisible(21)) {
+ _gm->drawImage(_gm->invertSection(21));
_gm->_timer2 = 5;
} else {
- _vm->renderImage(this->getFileNumber(), 21);
+ _gm->drawImage(21);
_gm->_timer2 = 10;
}
}
if (_gm->_state.powerOff) {
- if (this->isSectionVisible(kMaxSection - 1)) {
+ if (isSectionVisible(kMaxSection - 1)) {
_vm->renderText("Energievorrat erschöpft",97,165,color);
_vm->renderText("Notstromversorgung aktiv",97,175,color);
} else {
- if (this->isSectionVisible(21)) {
- _vm->renderImage(this->getFileNumber(), 22);
+ if (isSectionVisible(21)) {
+ _gm->drawImage(22);
} else {
- _vm->renderImage(this->getFileNumber(), _gm->invertSection(22));
+ _gm->drawImage(_gm->invertSection(22));
}
}
}
@@ -306,13 +306,14 @@ void ShipSleepCabin::onEntrance() {
_vm->renderMessage("Was steht dir jetzt wohl wirklich bevor?");
_gm->_state.dream = false;
}
+ setRoomSeen(true);
}
bool ShipCockpit::interact(Action verb, Object &obj1, Object &obj2) {
char c[2] = {0};
if ((verb == ACTION_LOOK) && (obj1._id == MONITOR)) {
- this->setSectionVisible(kMaxSection - 1, true);
+ setSectionVisible(kMaxSection - 1, true);
_vm->renderBox(0, 0, 320, 200, kColorBlack);
_vm->renderText("Geschwindigkeit: ", 50, 50, kColorLightYellow);
if (_gm->_state.time)
@@ -332,7 +333,7 @@ bool ShipCockpit::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderText(Common::String::format("%d", _gm->_state.time).c_str(), 50, 120, kColorLightYellow);
_vm->renderText(" Tage");
_gm->mouseInput2();
- this->setSectionVisible(kMaxSection - 1, false);
+ setSectionVisible(kMaxSection - 1, false);
_vm->renderRoom(*this);
_gm->showMenu();
_gm->drawMapExits();
@@ -347,7 +348,7 @@ bool ShipCockpit::interact(Action verb, Object &obj1, Object &obj2) {
void ShipCockpit::animation() {
static char color;
- if (this->isSectionVisible(kMaxSection - 1)) {
+ if (isSectionVisible(kMaxSection - 1)) {
if (color) {
color = 0;
_gm->_timer2 = 5;
@@ -357,23 +358,23 @@ void ShipCockpit::animation() {
}
_vm->renderText("Achtung: Triebwerke funktionsunfhig", 50, 145, color);
} else {
- if (this->isSectionVisible(21)) {
- _vm->renderImage(this->getFileNumber(), _gm->invertSection(21));
+ if (isSectionVisible(21)) {
+ _gm->drawImage(_gm->invertSection(21));
_gm->_timer2 = 5;
} else {
- _vm->renderImage(this->getFileNumber(), 21);
+ _gm->drawImage(21);
_gm->_timer2 = 10;
}
}
if (_gm->_state.powerOff) {
- if (this->isSectionVisible(kMaxSection - 1)) {
+ if (isSectionVisible(kMaxSection - 1)) {
_vm->renderText("Energievorrat erschpft", 97, 165, color);
_vm->renderText("Notstromversorgung aktiv", 97, 175, color);
} else {
- if (this->isSectionVisible(21))
- _vm->renderImage(this->getFileNumber(), 22);
+ if (isSectionVisible(21))
+ _gm->drawImage(22);
else
- _vm->renderImage(this->getFileNumber(), _gm->invertSection(22));
+ _gm->drawImage(_gm->invertSection(22));
}
}
}
@@ -386,45 +387,45 @@ void ShipCockpit::onEntrance() {
bool ShipCabinL2::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL1, KEYCARD2)) {
- _gm->openLocker(this, this->getObject(4), this->getObject(0), 17);
- if (this->getObject(5)->_click == 255)
- _vm->renderImage(this->getFileNumber(), 20); // Remove Pistol
+ _gm->openLocker(this, getObject(4), getObject(0), 17);
+ if (getObject(5)->_click == 255)
+ _gm->drawImage(20); // Remove Pistol
_gm->great(2);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL2, KEYCARD2)) {
- _gm->openLocker(this, this->getObject(6), this->getObject(1), 18);
+ _gm->openLocker(this, getObject(6), getObject(1), 18);
_gm->great(2);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL3, KEYCARD2)) {
- _gm->openLocker(this, this->getObject(8), this->getObject(2), 19);
- if (this->getObject(9)->_click == 255)
- _vm->renderImage(this->getFileNumber(), 21); // Remove cable spool
+ _gm->openLocker(this, getObject(8), getObject(2), 19);
+ if (getObject(9)->_click == 255)
+ _gm->drawImage(21); // Remove cable spool
_gm->great(2);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL4, KEYCARD2)) {
- _gm->openLocker(this, this->getObject(10), this->getObject(3), 22);
- if (this->getObject(11)->_click == 255)
- _vm->renderImage(this->getFileNumber(), 23); // Remove book
+ _gm->openLocker(this, getObject(10), getObject(3), 22);
+ if (getObject(11)->_click == 255)
+ _gm->drawImage(23); // Remove book
_gm->great(2);
}
else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L1)) {
- _gm->closeLocker(this, this->getObject(4), this->getObject(0), 17);
- this->setSectionVisible(20, false);
+ _gm->closeLocker(this, getObject(4), getObject(0), 17);
+ setSectionVisible(20, false);
} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L2))
- _gm->closeLocker(this, this->getObject(6), this->getObject(1), 18);
+ _gm->closeLocker(this, getObject(6), getObject(1), 18);
else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L3)) {
- _gm->closeLocker(this, this->getObject(8), this->getObject(2), 19);
- this->setSectionVisible(21, false);
+ _gm->closeLocker(this, getObject(8), getObject(2), 19);
+ setSectionVisible(21, false);
} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L4)) {
- _gm->closeLocker(this, this->getObject(10), this->getObject(3), 22);
- this->setSectionVisible(23, false);
+ _gm->closeLocker(this, getObject(10), getObject(3), 22);
+ setSectionVisible(23, false);
}
else if ((verb == ACTION_TAKE) && (obj1._id == SPOOL) &&
!(obj1.hasProperty(CARRIED))) {
- this->getObject(8)->_click = 42; // empty shelf
+ getObject(8)->_click = 42; // empty shelf
return false;
} else if ((verb == ACTION_TAKE) && (obj1._id == BOOK2) &&
!(obj1.hasProperty(CARRIED))) {
- this->getObject(10)->_click = 47; // empty shelf
+ getObject(10)->_click = 47; // empty shelf
return false;
} else
return false;
@@ -436,35 +437,35 @@ bool ShipCabinL3::interact(Action verb, Object &obj1, Object &obj2) {
Room *r;
if ((verb == ACTION_USE) && Object::combine(obj1, obj2, RECORD, TURNTABLE)) {
- if (this->isSectionVisible(kMaxSection - 1) || this->isSectionVisible(15))
+ if (isSectionVisible(kMaxSection - 1) || isSectionVisible(15))
_vm->renderMessage("Du hast die Platte schon aufgelegt.");
else {
- if (!this->getObject(4)->hasProperty(CARRIED))
- _vm->renderImage(this->getFileNumber(), _gm->invertSection(8));
+ if (!getObject(4)->hasProperty(CARRIED))
+ _gm->drawImage(_gm->invertSection(8));
else
- _gm->_inventory.remove(*this->getObject(4));
- _vm->renderImage(this->getFileNumber(), 15);
- this->getObject(4)->_click = 48;
+ _gm->_inventory.remove(*getObject(4));
+ _gm->drawImage(15);
+ getObject(4)->_click = 48;
}
} else if ((verb == ACTION_PRESS) && (obj1._id == TURNTABLE_BUTTON)) {
- if (!this->isSectionVisible(15)) {
+ if (!isSectionVisible(15)) {
_vm->renderMessage("Es ist doch gar keine Platte aufgelegt.");
- } else if (!this->isSectionVisible(10) &&
- !this->isSectionVisible(11) &&
- this->isSectionVisible(12)) {
+ } else if (!isSectionVisible(10) &&
+ !isSectionVisible(11) &&
+ isSectionVisible(12)) {
if (_gm->_soundDevice != 2) {
- _vm->renderImage(this->getFileNumber(), 14);
- this->setSectionVisible(15, false);
+ _gm->drawImage(14);
+ setSectionVisible(15, false);
for (int i = 3; i; i--) {
_vm->playSound(kAudioTurntable);
if (_gm->_soundDevice) {
do {
- if (this->isSectionVisible(13)) {
- _vm->renderImage(this->getFileNumber(), 14);
- this->setSectionVisible(13, false);
+ if (isSectionVisible(13)) {
+ _gm->drawImage(14);
+ setSectionVisible(13, false);
} else {
- _vm->renderImage(this->getFileNumber(), 13);
- this->setSectionVisible(14, false);
+ _gm->drawImage(13);
+ setSectionVisible(14, false);
}
_gm->wait2(3);
} while (_gm->_status);
@@ -474,53 +475,53 @@ bool ShipCabinL3::interact(Action verb, Object &obj1, Object &obj2) {
}
} else {
for (int i = 10; i; i--) {
- _vm->renderImage(this->getFileNumber(), 14);
+ _gm->drawImage(14);
_gm->wait2(3);
- _vm->renderImage(this->getFileNumber(), 13);
+ _gm->drawImage(13);
_gm->wait2(3);
}
}
- _vm->renderImage(this->getFileNumber(), 15);
- this->setSectionVisible(14, false);
- this->setSectionVisible(13, false);
+ _gm->drawImage(15);
+ setSectionVisible(14, false);
+ setSectionVisible(13, false);
_vm->renderMessage("Die Platte scheint einen Sprung zu haben.");
}
} else if ((verb == ACTION_TAKE) && (obj1._id == RECORD) &&
(obj1._click != 15)) {
- _vm->renderImage(this->getFileNumber(), 9);
- this->setSectionVisible(13, false);
- this->setSectionVisible(14, false);
- this->setSectionVisible(15, false);
+ _gm->drawImage(9);
+ setSectionVisible(13, false);
+ setSectionVisible(14, false);
+ setSectionVisible(15, false);
obj1._section = 0;
_gm->takeObject(obj1);
} else if ((verb == ACTION_PULL) && (obj1._id == PLUG)) {
- _vm->renderImage(this->getFileNumber(), 10);
- this->setSectionVisible(7, false);
+ _gm->drawImage(10);
+ setSectionVisible(7, false);
obj1._click = 21;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, PLUG, SOCKET)) {
- _vm->renderImage(this->getFileNumber(), 7);
- this->setSectionVisible(10, false);
- this->getObject(10)->_click = 20;
+ _gm->drawImage(7);
+ setSectionVisible(10, false);
+ getObject(10)->_click = 20;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, WIRE2))
_vm->renderMessage("Schneid doch besser ein|lngeres Stck Kabel ab!");
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, WIRE)) {
r = _gm->_rooms[AIRLOCK];
- if (!this->isSectionVisible(10) && !r->getObject(5)->hasProperty(WORN)) {
- _vm->renderImage(this->getFileNumber(), 25);
+ if (!isSectionVisible(10) && !r->getObject(5)->hasProperty(WORN)) {
+ _gm->drawImage(25);
_gm->shock();
}
- _vm->renderImage(this->getFileNumber(), 11);
- _vm->renderImage(this->getFileNumber(), 26);
- this->setSectionVisible(12, false);
+ _gm->drawImage(11);
+ _gm->drawImage(26);
+ setSectionVisible(12, false);
} else if ((verb == ACTION_TAKE) &&
((obj1._id == WIRE) || (obj1._id == WIRE2) || (obj1._id == PLUG))) {
- if (this->isSectionVisible(10) && this->isSectionVisible(11)) {
- _vm->renderImage(this->getFileNumber(), _gm->invertSection(10));
- _vm->renderImage(this->getFileNumber(), _gm->invertSection(11));
- this->getObject(8)->_name = "Leitung mit Stecker";
- _gm->takeObject(*this->getObject(8));
- this->getObject(9)->_click = 255;
- this->getObject(10)->_click = 255;
+ if (isSectionVisible(10) && isSectionVisible(11)) {
+ _gm->drawImage(_gm->invertSection(10));
+ _gm->drawImage(_gm->invertSection(11));
+ getObject(8)->_name = "Leitung mit Stecker";
+ _gm->takeObject(*getObject(8));
+ getObject(9)->_click = 255;
+ getObject(10)->_click = 255;
} else {
_vm->renderMessage("Das ist befestigt.");
}
@@ -533,48 +534,48 @@ bool ShipCabinL3::interact(Action verb, Object &obj1, Object &obj2) {
bool ShipCabinR3::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K1, KEYCARD)) {
- _gm->openLocker(this, this->getObject(6), this->getObject(2), 9);
+ _gm->openLocker(this, getObject(6), getObject(2), 9);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K2, KEYCARD)) {
- _gm->openLocker(this, this->getObject(8), this->getObject(3), 10);
- if (this->getObject(9)->_click == 255)
- _vm->renderImage(this->getFileNumber(), 12); // Remove rope
+ _gm->openLocker(this, getObject(8), getObject(3), 10);
+ if (getObject(9)->_click == 255)
+ _gm->drawImage(12); // Remove rope
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K3, KEYCARD)) {
- _gm->openLocker(this, this->getObject(10), this->getObject(4), 11);
- if (this->getObject(17)->_click == 255)
- _vm->renderImage(this->getFileNumber(), 16); // Remove Discman
+ _gm->openLocker(this, getObject(10), getObject(4), 11);
+ if (getObject(17)->_click == 255)
+ _gm->drawImage(16); // Remove Discman
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K4, KEYCARD)) {
- _gm->openLocker(this, this->getObject(15), this->getObject(5), 13);
- if (this->getObject(16)->_click == 255)
- _vm->renderImage(this->getFileNumber(), 14); // Remove book
+ _gm->openLocker(this, getObject(15), getObject(5), 13);
+ if (getObject(16)->_click == 255)
+ _gm->drawImage(14); // Remove Book
}
else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF1))
- _gm->closeLocker(this, this->getObject(6), this->getObject(2), 9);
+ _gm->closeLocker(this, getObject(6), getObject(2), 9);
else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF2)) {
- this->setSectionVisible(12, false);
- _gm->closeLocker(this, this->getObject(8), this->getObject(3), 10);
+ setSectionVisible(12, false);
+ _gm->closeLocker(this, getObject(8), getObject(3), 10);
} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF3)) {
- this->setSectionVisible(16, false);
- _gm->closeLocker(this, this->getObject(10), this->getObject(4), 11);
+ setSectionVisible(16, false);
+ _gm->closeLocker(this, getObject(10), getObject(4), 11);
} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF4)) {
- this->setSectionVisible(14, false);
- this->setSectionVisible(14, false);
- _gm->closeLocker(this, this->getObject(15), this->getObject(5), 13);
+ setSectionVisible(14, false);
+ setSectionVisible(14, false);
+ _gm->closeLocker(this, getObject(15), getObject(5), 13);
}
else if ((verb == ACTION_TAKE) && (obj1._id == DISCMAN) &&
!_gm->_rooms[0]->getObject(3)->hasProperty(CARRIED)) {
- this->getObject(10)->_click = 34; // Locker empty
+ getObject(10)->_click = 34; // Locker empty
obj1._click = 255;
_gm->takeObject(*_gm->_rooms[0]->getObject(3));
- _vm->renderImage(this->getFileNumber(), 16);
+ _gm->drawImage(16);
} else if ((verb == ACTION_TAKE) && (obj1._id == ROPE) &&
obj1.hasProperty(CARRIED)) {
- this->getObject(8)->_click = 31; // Shelf empty
+ getObject(8)->_click = 31; // Shelf empty
return false;
} else if ((verb == ACTION_TAKE) && (obj1._id == BOOK) &&
!obj1.hasProperty(CARRIED)) {
- this->getObject(15)->_click = 32; // Shelf empty
+ getObject(15)->_click = 32; // Shelf empty
return false;
} else
return false;
@@ -587,85 +588,85 @@ bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) {
Room *r;
if ((verb == ACTION_PRESS) && (obj1._id == BUTTON1)) {
- if (!this->getObject(1)->hasProperty(OPENED)) {
- _vm->renderImage(this->getFileNumber(), 10);
+ if (!getObject(1)->hasProperty(OPENED)) {
+ _gm->drawImage(10);
_vm->playSound(kAudioDoorSound);
- if (this->getObject(0)->hasProperty(OPENED)) {
- this->getObject(0)->disableProperty(OPENED);
- _vm->renderImage(this->getFileNumber(), 1);
+ if (getObject(0)->hasProperty(OPENED)) {
+ getObject(0)->disableProperty(OPENED);
+ _gm->drawImage(1);
_gm->wait2(2);
- _vm->renderImage(this->getFileNumber(), 2);
- this->setSectionVisible(1, false);
+ _gm->drawImage(2);
+ setSectionVisible(1, false);
_gm->wait2(2);
- _vm->renderImage(this->getFileNumber(), 3);
- this->setSectionVisible(2, false);
+ _gm->drawImage(3);
+ setSectionVisible(2, false);
} else {
- this->getObject(0)->setProperty(OPENED);
- _vm->renderImage(this->getFileNumber(), 2);
- this->setSectionVisible(3, false);
+ getObject(0)->setProperty(OPENED);
+ _gm->drawImage(2);
+ setSectionVisible(3, false);
_gm->wait2(2);
- _vm->renderImage(this->getFileNumber(), 1);
- this->setSectionVisible(2, false);
+ _gm->drawImage(1);
+ setSectionVisible(2, false);
_gm->wait2(2);
- _vm->renderImage(this->getFileNumber(), 1 + 128);
+ _gm->drawImage(_gm->invertSection(1));
}
- _vm->renderImage(this->getFileNumber(), _gm->invertSection(10));
+ _gm->drawImage(_gm->invertSection(10));
}
} else if ((verb == ACTION_PRESS) && (obj1._id == BUTTON2)) {
- if (!this->getObject(0)->hasProperty(OPENED)) {
- _vm->renderImage(this->getFileNumber(), 11);
- if (this->getObject(1)->hasProperty(OPENED)) {
+ if (!getObject(0)->hasProperty(OPENED)) {
+ _gm->drawImage(11);
+ if (getObject(1)->hasProperty(OPENED)) {
_vm->playSound(kAudioDoorSound);
- this->getObject(1)->disableProperty(OPENED);
- _vm->renderImage(this->getFileNumber(), 4);
+ getObject(1)->disableProperty(OPENED);
+ _gm->drawImage(4);
_gm->wait2(2);
- _vm->renderImage(this->getFileNumber(), 5);
- this->setSectionVisible(4, false);
+ _gm->drawImage(5);
+ setSectionVisible(4, false);
_gm->wait2(2);
- _vm->renderImage(this->getFileNumber(), 6);
- this->setSectionVisible(5, false);
- _vm->renderImage(this->getFileNumber(), 16);
- this->setSectionVisible(17, false);
+ _gm->drawImage(6);
+ setSectionVisible(5, false);
+ _gm->drawImage(16);
+ setSectionVisible(17, false);
_gm->wait2(3);
- _vm->renderImage(this->getFileNumber(), 15);
- this->setSectionVisible(16, false);
+ _gm->drawImage(15);
+ setSectionVisible(16, false);
_gm->wait2(3);
- _vm->renderImage(this->getFileNumber(), 14);
- this->setSectionVisible(15, false);
+ _gm->drawImage(14);
+ setSectionVisible(15, false);
_gm->wait2(3);
- _vm->renderImage(this->getFileNumber(), 13);
- this->setSectionVisible(14, false);
+ _gm->drawImage(13);
+ setSectionVisible(14, false);
_gm->wait2(3);
- _vm->renderImage(this->getFileNumber(), 12);
- this->setSectionVisible(13, false);
+ _gm->drawImage(12);
+ setSectionVisible(13, false);
_gm->wait2(3);
- _vm->renderImage(this->getFileNumber(), _gm->invertSection(12));
+ _gm->drawImage(_gm->invertSection(12));
} else {
- this->getObject(1)->setProperty(OPENED);
- _vm->renderImage(this->getFileNumber(), 12);
+ getObject(1)->setProperty(OPENED);
+ _gm->drawImage(12);
_gm->wait2(3);
- _vm->renderImage(this->getFileNumber(), 13);
- this->setSectionVisible(12, false);
+ _gm->drawImage(13);
+ setSectionVisible(12, false);
_gm->wait2(3);
- _vm->renderImage(this->getFileNumber(), 14);
- this->setSectionVisible(13, false);
+ _gm->drawImage(14);
+ setSectionVisible(13, false);
_gm->wait2(3);
- _vm->renderImage(this->getFileNumber(), 15);
- this->setSectionVisible(14, false);
+ _gm->drawImage(15);
+ setSectionVisible(14, false);
_gm->wait2(3);
- _vm->renderImage(this->getFileNumber(), 16);
- this->setSectionVisible(15, false);
+ _gm->drawImage(16);
+ setSectionVisible(15, false);
_gm->wait2(3);
- _vm->renderImage(this->getFileNumber(), 17);
- this->setSectionVisible(16, false);
+ _gm->drawImage(17);
+ setSectionVisible(16, false);
_vm->playSound(kAudioDoorSound);
- _vm->renderImage(this->getFileNumber(), 5);
- this->setSectionVisible(6, false);
+ _gm->drawImage(5);
+ setSectionVisible(6, false);
_gm->wait2(2);
- _vm->renderImage(this->getFileNumber(), 4);
- this->setSectionVisible(5, false);
+ _gm->drawImage(4);
+ setSectionVisible(5, false);
_gm->wait2(2);
- _vm->renderImage(this->getFileNumber(), _gm->invertSection(4));
+ _gm->drawImage(_gm->invertSection(4));
r = _gm->_rooms[AIRLOCK];
if (!r->getObject(4)->hasProperty(WORN) ||
!r->getObject(5)->hasProperty(WORN) ||
@@ -673,10 +674,10 @@ bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) {
// longjmp(dead, "Zu niedriger Luftdruck soll ungesund sein.");
}
}
- _vm->renderImage(this->getFileNumber(), 11 + 128);
+ _gm->drawImage(_gm->invertSection(11));
}
} else if ((verb == ACTION_LOOK) && (obj1._id == MANOMETER)) {
- if (this->getObject(1)->hasProperty(OPENED))
+ if (getObject(1)->hasProperty(OPENED))
_vm->renderMessage("Er zeigt Null an.");
else
_vm->renderMessage("Er zeigt Normaldruck an.");
@@ -687,10 +688,10 @@ bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) {
}
void ShipAirlock::onEntrance() {
- if (!this->hasSeen())
+ if (!hasSeen())
_vm->renderMessage("Komisch, es ist nur|noch ein Raumanzug da.");
- this->setRoomSeen(true);
+ setRoomSeen(true);
}
bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
@@ -701,19 +702,19 @@ bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
(obj1._description != beschr2)) {
_vm->renderMessage(obj1._description);
obj1._description = beschr2;
- _gm->takeObject(*this->getObject(2));
+ _gm->takeObject(*getObject(2));
} else if (((verb == ACTION_OPEN) || (verb == ACTION_CLOSE)) &&
(obj1._id == OUTERHATCH_TOP)) {
_vm->renderMessage("Du muát erst hingehen.");
} else if ((verb == ACTION_CLOSE) && (obj1._id == LANDINGMOD_HATCH) &&
- (this->isSectionVisible(4) || this->isSectionVisible(6)))
+ (isSectionVisible(4) || isSectionVisible(6)))
_vm->renderMessage("Das Kabel ist im Weg.");
else if (((verb == ACTION_TAKE) && (obj1._id == HOLD_WIRE)) ||
((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, LANDINGMOD_HATCH)))
_vm->renderMessage("Das Kabel ist schon ganz|richtig an dieser Stelle.");
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, HOLD_WIRE)) {
- this->getObject(0)->_name = "Leitung mit Lsterklemme";
- _gm->_inventory.remove(*this->getObject(2));
+ getObject(0)->_name = "Leitung mit Lsterklemme";
+ _gm->_inventory.remove(*getObject(2));
_gm->_state.terminalStripConnected = true;
_gm->_state.terminalStripWire = true;
_vm->renderMessage("Ok.");
@@ -721,23 +722,23 @@ bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
if (!_gm->_state.terminalStripConnected)
_vm->renderMessage("Womit denn?");
else {
- _vm->renderImage(this->getFileNumber(), 5);
- this->getObject(0)->_name = "langes Kabel mit Stecker";
- this->getObject(0)->_click = 10;
+ _gm->drawImage(5);
+ getObject(0)->_name = "langes Kabel mit Stecker";
+ getObject(0)->_click = 10;
r = _gm->_rooms[CABIN_L2];
- _gm->_inventory.remove(*this->getObject(9));
+ _gm->_inventory.remove(*getObject(9));
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, GENERATOR_TOP)) {
- if (this->isSectionVisible(5)) {
+ if (isSectionVisible(5)) {
r = _gm->_rooms[GENERATOR];
r->getObject(0)->_click = 15;
r->getObject(1)->_click = 13;
r->setSectionVisible(6, false);
r->setSectionVisible(8, false);
- _vm->renderImage(this->getFileNumber(), _gm->invertSection(5));
- _vm->renderImage(this->getFileNumber(), 6);
- this->setSectionVisible(4, false);
- this->getObject(0)->_click = 11;
+ _gm->drawImage(_gm->invertSection(5));
+ _gm->drawImage(6);
+ setSectionVisible(4, false);
+ getObject(0)->_click = 11;
} else {
_vm->renderMessage("Die Leitung ist zu kurz.");
}
@@ -749,9 +750,9 @@ bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
}
void ShipHold::onEntrance() {
- if (!this->hasSeen())
+ if (!hasSeen())
_vm->renderMessage("Was ist denn das fr ein Chaos?|Und auáerdem fehlt das Notraumschiff!|Jetzt wird mir einiges klar.|Die anderen sind geflchtet,|und ich habe es verpennt.");
- this->setRoomSeen(true);
+ setRoomSeen(true);
_gm->_rooms[COCKPIT]->setRoomSeen(true);
}
@@ -762,18 +763,18 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, PEN, LANDINGMOD_BUTTON)) {
if (_gm->_state.landingModuleEnergy) {
r = _gm->_rooms[GENERATOR];
- if (this->isSectionVisible(7)) {
- _vm->renderImage(this->getFileNumber(), _gm->invertSection(9));
- _vm->renderImage(this->getFileNumber(), _gm->invertSection(2));
- _vm->renderImage(this->getFileNumber(), _gm->invertSection(8));
- _vm->renderImage(this->getFileNumber(), _gm->invertSection(7));
- _vm->renderImage(this->getFileNumber(), _gm->invertSection(10));
+ if (isSectionVisible(7)) {
+ _gm->drawImage(_gm->invertSection(9));
+ _gm->drawImage(_gm->invertSection(2));
+ _gm->drawImage(_gm->invertSection(8));
+ _gm->drawImage(_gm->invertSection(7));
+ _gm->drawImage(_gm->invertSection(10));
if (r->isSectionVisible(9))
_gm->_state.powerOff = true;
_gm->roomBrightness();
_vm->paletteBrightness();
} else {
- _vm->renderImage(this->getFileNumber(), 7);
+ _gm->drawImage(7);
if (r->isSectionVisible(9))
_gm->_state.powerOff = false;
// load("MSN_DATA.025");
@@ -783,40 +784,40 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
r->setSectionVisible(1, false);
r->setSectionVisible(2, false);
_gm->wait2(2);
- _vm->renderImage(this->getFileNumber(), 2);
+ _gm->drawImage(2);
_gm->wait2(3);
- _vm->renderImage(this->getFileNumber(), 8);
+ _gm->drawImage(8);
_gm->wait2(2);
- _vm->renderImage(this->getFileNumber(), 9);
+ _gm->drawImage(9);
_gm->wait2(1);
- _vm->renderImage(this->getFileNumber(), 10);
+ _gm->drawImage(10);
}
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, LANDINGMOD_BUTTON))
_vm->renderMessage("Es ist nicht spitz genug.");
else if ((verb == ACTION_LOOK) && (obj1._id == LANDINGMOD_MONITOR) &&
- this->isSectionVisible(7))
+ isSectionVisible(7))
_vm->renderMessage("Du wirst aus den Anzeigen nicht schlau.");
else if ((verb == ACTION_USE) && (obj1._id == KEYBOARD))
_vm->renderMessage("Laá lieber die Finger davon!");
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, WIRE, LANDINGMOD_SOCKET)) {
r = _gm->_rooms[CABIN_L3];
_gm->_inventory.remove(*r->getObject(8));
- this->getObject(4)->_name = r->getObject(8)->_name;
- _vm->renderImage(this->getFileNumber(), 4);
+ getObject(4)->_name = r->getObject(8)->_name;
+ _gm->drawImage(4);
if (_gm->_state.cableConnected) {
- _vm->renderImage(this->getFileNumber(), 5);
- this->getObject(4)->_click = 6;
+ _gm->drawImage(5);
+ getObject(4)->_click = 6;
} else {
- this->getObject(4)->_click = 5;
+ getObject(4)->_click = 5;
if (_gm->_state.terminalStripWire)
- _vm->renderImage(this->getFileNumber(), 11);
+ _gm->drawImage(11);
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SPOOL, LANDINGMOD_SOCKET))
_vm->renderMessage("An dem Kabel ist doch gar kein Stecker.");
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, TERMINALSTRIP)) {
- _vm->renderImage(this->getFileNumber(), 11);
- this->getObject(4)->_name = "Leitung mit Lsterklemme";
+ _gm->drawImage(11);
+ getObject(4)->_name = "Leitung mit Lsterklemme";
r = _gm->_rooms[HOLD];
_gm->_inventory.remove(*r->getObject(2));
_gm->_state.terminalStripConnected = true;
@@ -825,33 +826,33 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
if (!_gm->_state.terminalStripConnected)
_vm->renderMessage("Womit denn?");
else {
- _vm->renderImage(this->getFileNumber(), 5);
- this->getObject(4)->_name = "langes Kabel mit Stecker";
- this->getObject(4)->_click = 6;
+ _gm->drawImage(5);
+ getObject(4)->_name = "langes Kabel mit Stecker";
+ getObject(4)->_click = 6;
r = _gm->_rooms[CABIN_L2];
_gm->_inventory.remove(*r->getObject(9));
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, LANDINGMOD_HATCH)) {
- if (this->getObject(5)->hasProperty(OPENED)) {
+ if (getObject(5)->hasProperty(OPENED)) {
r = _gm->_rooms[HOLD];
- if (this->isSectionVisible(5)) {
+ if (isSectionVisible(5)) {
_gm->_rooms[HOLD]->setSectionVisible(5, false);
r->getObject(0)->_click = 10;
} else
r->getObject(0)->_click = 9;
_gm->_rooms[HOLD]->setSectionVisible(4, false);
- r->getObject(0)->_name = this->getObject(4)->_name;
- _vm->renderImage(this->getFileNumber(), _gm->invertSection(5));
- _vm->renderImage(this->getFileNumber(), _gm->invertSection(4));
- this->setSectionVisible(11, false);
- _vm->renderImage(this->getFileNumber(), 6);
- this->getObject(4)->_click = 7;
+ r->getObject(0)->_name = getObject(4)->_name;
+ _gm->drawImage(_gm->invertSection(4));
+ _gm->drawImage(_gm->invertSection(5));
+ setSectionVisible(11, false);
+ _gm->drawImage(6);
+ getObject(4)->_click = 7;
} else {
_vm->renderMessage("Du solltest die Luke vielleicht erst ffnen.");
}
} else if ((verb == ACTION_CLOSE) && (obj1._id == LANDINGMOD_HATCH) &&
- this->isSectionVisible(6)) {
+ isSectionVisible(6)) {
_vm->renderMessage("Das Kabel ist im Weg.");
} else if (((verb == ACTION_TAKE) || (verb == ACTION_PULL)) &&
(obj1._id == LANDINGMOD_WIRE)) {
@@ -870,11 +871,11 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
if (obj1.hasProperty(OPENED))
return false;
_vm->playSound(kAudioDoorSound);
- _vm->renderImage(this->getFileNumber(), 1);
- if (this->isSectionVisible(7))
- _vm->renderImage(this->getFileNumber(), 10);
- if (this->isSectionVisible(13))
- _vm->renderImage(this->getFileNumber(), 13);
+ _gm->drawImage(1);
+ if (isSectionVisible(7))
+ _gm->drawImage(10);
+ if (isSectionVisible(13))
+ _gm->drawImage(13);
_gm->_rooms[HOLD]->setSectionVisible(3, true);
obj1.setProperty(OPENED);
obj1._click = 2;
@@ -882,24 +883,24 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_CLOSE) && (obj1._id == OUTERHATCH)) {
if (!obj1.hasProperty(OPENED))
return false;
- if (this->isSectionVisible(11) || this->isSectionVisible(12)) {
+ if (isSectionVisible(11) || isSectionVisible(12)) {
_vm->renderMessage("Das Seil ist im Weg.");
} else {
_vm->playSound(kAudioDoorSound);
- _vm->renderImage(this->getFileNumber(), _gm->invertSection(1));
- this->setSectionVisible(10, false);
- if (this->isSectionVisible(13))
- _vm->renderImage(this->getFileNumber(), 13);
+ _gm->drawImage(_gm->invertSection(1));
+ setSectionVisible(10, false);
+ if (isSectionVisible(13))
+ _gm->drawImage(13);
_gm->_rooms[HOLD]->setSectionVisible(3, false);
obj1.disableProperty(OPENED);
obj1._click = 1;
_vm->playSound(kAudioDoorClose);
}
} else if ((verb == ACTION_WALK) && (obj1._id == OUTERHATCH) &&
- this->isSectionVisible(7)) {
+ isSectionVisible(7)) {
if (!obj1.hasProperty(OPENED))
_vm->renderMessage("Das ist geschlossen.");
- else if (!this->isSectionVisible(11))
+ else if (!isSectionVisible(11))
_vm->renderMessage("Das geht nicht.|Die Luke ist mindestens|5 Meter ber dem Boden.");
else {
obj1._exitRoom = ROCKS;
@@ -912,68 +913,68 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage("Das Kabel ist schon ganz|richtig an dieser Stelle.");
else if ((verb == ACTION_PULL) && (obj1._id == SHORT_WIRE) &&
(obj1._click != 11)) {
- _vm->renderImage(this->getFileNumber(), 3);
- _vm->renderImage(this->getFileNumber(), 4);
+ _gm->drawImage(3);
+ _gm->drawImage(4);
obj1._click = 11;
_gm->turnOff();
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SHORT_WIRE, CLIP) &&
- (this->getObject(11)->_click == 11) && !this->isSectionVisible(9)) {
- _vm->renderImage(this->getFileNumber(), 2);
- this->setSectionVisible(3, false);
- this->setSectionVisible(4, false);
- this->getObject(11)->_click = 10;
+ (getObject(11)->_click == 11) && !isSectionVisible(9)) {
+ _gm->drawImage(2);
+ setSectionVisible(3, false);
+ setSectionVisible(4, false);
+ getObject(11)->_click = 10;
if (_gm->_state.shipEnergy)
_gm->turnOn();
else
- _vm->renderImage(this->getFileNumber(), 4);
+ _gm->drawImage(4);
} else if ((verb == ACTION_OPEN) && (obj1._id == TRAP)) {
_vm->playSound(kAudioDoorSound);
- _vm->renderImage(this->getFileNumber(), 2);
- if (this->getObject(11)->_click == 11)
- _vm->renderImage(this->getFileNumber(), 3);
+ _gm->drawImage(2);
+ if (getObject(11)->_click == 11)
+ _gm->drawImage(3);
if (_gm->_state.powerOff)
- _vm->renderImage(this->getFileNumber(), 4);
+ _gm->drawImage(4);
obj1.setProperty(OPENED);
obj1._click = 6;
obj1._click2 = 5;
_vm->playSound(kAudioDoorOpen);
} else if ((verb == ACTION_CLOSE) && (obj1._id == TRAP)) {
- if (this->isSectionVisible(9))
+ if (isSectionVisible(9))
_vm->renderMessage("Das Kabel ist im Weg.");
else {
- this->setSectionVisible(3, false);
+ setSectionVisible(3, false);
return false;
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, GENERATOR_WIRE, CLIP) &&
- this->isSectionVisible(3) && (this->getObject(0)->_click != 16)) {
- _vm->renderImage(this->getFileNumber(), _gm->invertSection(8));
- _vm->renderImage(this->getFileNumber(), 2);
- this->setSectionVisible(4, false);
- _vm->renderImage(this->getFileNumber(), 3);
- _vm->renderImage(this->getFileNumber(), 9);
- this->getObject(0)->_click = 16;
+ isSectionVisible(3) && (getObject(0)->_click != 16)) {
+ _gm->drawImage(_gm->invertSection(8));
+ _gm->drawImage(2);
+ setSectionVisible(4, false);
+ _gm->drawImage(3);
+ _gm->drawImage(9);
+ getObject(0)->_click = 16;
r = _gm->_rooms[LANDINGMODULE];
if (_gm->_state.landingModuleEnergy && r->isSectionVisible(7))
_gm->turnOn();
else
- _vm->renderImage(this->getFileNumber(), 4);
+ _gm->drawImage(4);
_gm->_rooms[HOLD]->setSectionVisible(7, true);
_gm->great(3);
} else if ((verb == ACTION_PULL) && (obj1._id == GENERATOR_WIRE) &&
(obj1._click == 16)) {
- _vm->renderImage(this->getFileNumber(), _gm->invertSection(9));
- _vm->renderImage(this->getFileNumber(), 2);
- _vm->renderImage(this->getFileNumber(), 3);
- _vm->renderImage(this->getFileNumber(), 4);
- _vm->renderImage(this->getFileNumber(), 8);
+ _gm->drawImage(_gm->invertSection(9));
+ _gm->drawImage(2);
+ _gm->drawImage(3);
+ _gm->drawImage(4);
+ _gm->drawImage(8);
obj1._click = 15;
_gm->turnOff();
_gm->_rooms[HOLD]->setSectionVisible(7, false);
} else if ((verb == ACTION_USE) &&
(Object::combine(obj1, obj2, WIRE, CLIP) ||
Object::combine(obj1, obj2, SPOOL, CLIP)) &&
- this->isSectionVisible(3)) {
+ isSectionVisible(3)) {
_vm->renderMessage("Was ntzt dir der Anschluá|ohne eine Stromquelle?!");
} else if ((verb == ACTION_LOOK) && (obj1._id == VOLTMETER)) {
if (_gm->_state.powerOff)
@@ -981,31 +982,31 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
else
_vm->renderMessage("Es zeigt volle Spannung an.");
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LADDER, ROPE)) {
- _vm->renderImage(this->getFileNumber(), 13);
+ _gm->drawImage(13);
r = _gm->_rooms[CABIN_R3];
_gm->_inventory.remove(*r->getObject(9));
- this->getObject(3)->_click = 18;
+ getObject(3)->_click = 18;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, OUTERHATCH, GENERATOR_ROPE)) {
- if (!this->isSectionVisible(1))
+ if (!isSectionVisible(1))
_vm->renderMessage("Du muát die Luke erst ffnen.");
else {
- _vm->renderImage(this->getFileNumber(), _gm->invertSection(13));
- _vm->renderImage(this->getFileNumber(), 1);
- if (this->isSectionVisible(7)) {
- _vm->renderImage(this->getFileNumber(), 10);
- _vm->renderImage(this->getFileNumber(), 11);
+ _gm->drawImage(_gm->invertSection(13));
+ _gm->drawImage(1);
+ if (isSectionVisible(7)) {
+ _gm->drawImage(10);
+ _gm->drawImage(11);
} else {
- _vm->renderImage(this->getFileNumber(), 12);
+ _gm->drawImage(12);
}
r = _gm->_rooms[OUTSIDE];
r->setSectionVisible(1, true);
r->getObject(1)->_click = 1;
- this->getObject(3)->_click = 17;
+ getObject(3)->_click = 17;
}
} else if ((verb == ACTION_TAKE) && (obj1._id == GENERATOR_ROPE)) {
_vm->renderMessage("Das Seil ist hier schon ganz richtig.");
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, OUTERHATCH, GENERATOR_WIRE) &&
- this->isSectionVisible(1)) {
+ isSectionVisible(1)) {
_vm->renderMessage("Das Kabel ist zu kurz.");
} else {
return false;
Commit: 4c26b418cd5eb0681366bb88ef5c601a13fc3401
https://github.com/scummvm/scummvm/commit/4c26b418cd5eb0681366bb88ef5c601a13fc3401
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:00:11Z
Commit Message:
SUPERNOVA: Makes Inventory::get() return nullObject
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index cc06c51..37ff15f 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -57,7 +57,7 @@ Object *Inventory::get(int index) const {
if (index < _numObjects)
return _inventory[index];
- return NULL;
+ return const_cast<Object *>(&Object::nullObject);
}
Object *Inventory::get(ObjectID id) const {
@@ -66,7 +66,7 @@ Object *Inventory::get(ObjectID id) const {
return _inventory[i];
}
- return NULL;
+ return const_cast<Object *>(&Object::nullObject);
}
GuiElement::GuiElement()
Commit: 2a19f34bb5dd447c11a3aa99949eca35bc4ec629
https://github.com/scummvm/scummvm/commit/2a19f34bb5dd447c11a3aa99949eca35bc4ec629
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:00:11Z
Commit Message:
SUPERNOVA: Adds table for octal cp437 umlauts
Changed paths:
engines/supernova/NOTES
diff --git a/engines/supernova/NOTES b/engines/supernova/NOTES
index e8138ec..7176655 100644
--- a/engines/supernova/NOTES
+++ b/engines/supernova/NOTES
@@ -50,6 +50,14 @@ Dimensions
Exit Maps: (283, 163) (317, 197)
+Text
+-------
+AE - 216 ae - 204
+OE - 231 oe - 224
+UE - 232 ue - 201
+SZ - 341
+
+
Ingame Bugs
------------
In Cabin_R3 (starting room) you can take the discman from your locker without
Commit: e0aa700daccc4381ef9d90ca5f1a50d4d3aae8ec
https://github.com/scummvm/scummvm/commit/e0aa700daccc4381ef9d90ca5f1a50d4d3aae8ec
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:00:11Z
Commit Message:
SUPERNOVA: Renames charcterWidth() to textWidth()
Changed paths:
engines/supernova/state.cpp
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 37ff15f..0b4b78f 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -209,7 +209,7 @@ void GameManager::initGui() {
for (int i = 0; i < ARRAYSIZE(_guiCommandButton); ++i) {
int width;
if (i < 9)
- width = _vm->characterWidth(guiCommand_DE[i]) + 2;
+ width = _vm->textWidth(guiCommand_DE[i]) + 2;
else
width = 320 - x;
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index c62efea..678d5ce 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -348,7 +348,7 @@ void SupernovaEngine::renderRoom(Room &room) {
}
}
-int SupernovaEngine::characterWidth(const char *text) {
+int SupernovaEngine::textWidth(const char *text) {
int charWidth = 0;
while (*text != '\0') {
byte c = *text++;
@@ -391,7 +391,7 @@ void SupernovaEngine::renderMessage(const char *text, MessagePosition position)
}
}
for (uint i = 0; i < numRows; ++i) {
- int rowWidth = characterWidth(row[i]);
+ int rowWidth = textWidth(row[i]);
if (rowWidth > rowWidthMax)
rowWidthMax = rowWidth;
}
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 67c7067..f8769c8 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -107,7 +107,7 @@ public:
int _textColor;
int getDOSTicks();
- int characterWidth(const char *text);
+ int textWidth(const char *text);
void initData();
void initPalette();
void paletteFadeIn();
Commit: 36263aaa0bc3d2452f77264863d2f95dc26e806c
https://github.com/scummvm/scummvm/commit/36263aaa0bc3d2452f77264863d2f95dc26e806c
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:00:11Z
Commit Message:
SUPERNOVA: Fixes font rendering
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 678d5ce..0c0866e 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -359,11 +359,12 @@ int SupernovaEngine::textWidth(const char *text) {
}
for (uint i = 0; i < 5; ++i) {
- ++charWidth;
if (font[c - 32][i] == 0xff) {
break;
}
+ ++charWidth;
}
+ ++charWidth;
}
return charWidth;
@@ -464,7 +465,6 @@ void SupernovaEngine::renderText(const char *text, int x, int y, byte color) {
for (uint i = 0; i < 5; ++i) {
if (font[c - 32][i] == 0xff) {
- ++cursor;
break;
}
@@ -477,6 +477,7 @@ void SupernovaEngine::renderText(const char *text, int x, int y, byte color) {
}
cursor = ++ascentLine;
}
+ ++cursor;
}
_system->unlockScreen();
Commit: aa22029ffe4fc13470fb9068b5ac2d24410a1d6a
https://github.com/scummvm/scummvm/commit/aa22029ffe4fc13470fb9068b5ac2d24410a1d6a
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:00:11Z
Commit Message:
SUPERNOVA: Removes isVisible flag from GuiElement
Changed paths:
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 0b4b78f..f82d961 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -72,7 +72,6 @@ Object *Inventory::get(ObjectID id) const {
GuiElement::GuiElement()
: _text("")
, _isHighlighted(false)
- , _isVisible(true)
, _bgColorNormal(kColorWhite25)
, _bgColorHighlighted(kColorWhite44)
, _bgColor(kColorWhite25)
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 14155d5..92c9a21 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -83,10 +83,6 @@ public:
void setColor(int bgColor, int textColor, int bgColorHighlighted, int textColorHightlighted);
void setHighlight(bool isHighlighted);
-// virtual void onMouseOver() {}
-// virtual void onMouseOut() {}
-// virtual void onMouseClick() {}
-
Common::Point _textPosition;
char _text[128];
int _bgColor;
@@ -96,7 +92,6 @@ public:
int _textColorNormal;
int _textColorHighlighted;
bool _isHighlighted;
- bool _isVisible;
};
class GameManager {
Commit: 4fc7f73442ac3acb0d25b2284c8662c6ff9b774b
https://github.com/scummvm/scummvm/commit/4fc7f73442ac3acb0d25b2284c8662c6ff9b774b
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:00:11Z
Commit Message:
SUPERNOVA: Converts Inventory as GuiElements
By encapsulating the inventory state in GuiElements we can through out
inventory_object
Changed paths:
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index f82d961..0e811bf 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -219,6 +219,13 @@ void GameManager::initGui() {
}
// Inventory + Inventory Arrows
+ for (int i = 0; i < ARRAYSIZE(_guiInventory); ++i) {
+ int x = 136 * (i % 2);
+ int y = 161 + 10 * (i / 2);
+
+ _guiInventory[i].setSize(x, y, x + 135, y + 9);
+ _guiInventory[i].setColor(kColorWhite25, kColorDarkRed, kColorWhite35, kColorRed);
+ }
// Minimap
@@ -368,19 +375,18 @@ void GameManager::processInput(Common::EventType eventType, int x, int y) {
if (_mouseField >= 768) {
inventory_arrow(_mouseField - 768, false);
} else if (_mouseField >= 512) {
- inventory_object(_mouseField - 512, false);
- Object::setObjectNull(_currentInputObject);
+ _guiInventory[_mouseField - 512].setHighlight(false);
} else if (_mouseField >= 256) {
_guiCommandButton[_mouseField - 256].setHighlight(false);
} else if (_mouseField != -1) {
- Object::setObjectNull(_currentInputObject);
}
+ Object::setObjectNull(_currentInputObject);
_mouseField = field;
if (_mouseField >= 768) {
inventory_arrow(_mouseField - 768, true);
} else if (_mouseField >= 512) {
- inventory_object(_mouseField - 512, true);
+ _guiInventory[_mouseField - 512].setHighlight(true);
_currentInputObject = _inventory.get(_mouseField - 512 + _inventoryScroll);
} else if (_mouseField >= 256) {
_guiCommandButton[_mouseField - 256].setHighlight(true);
@@ -461,15 +467,6 @@ void GameManager::takeObject(Object &obj) {
_inventory.add(obj);
}
-void GameManager::inventory_object(int index, bool brightness) {
- int x = 136 * (index % 2);
- int y = 161 + 10 * (index / 2);
- _vm->renderBox(x, y, 135, 9, (brightness) ? HGR_INV_HELL : HGR_INV);
- if (index < _inventory.getSize())
- _vm->renderText(_inventory.get(index + _inventoryScroll)->_name, x + 1, y + 1,
- (brightness) ? COL_INV_HELL : COL_INV);
-}
-
void GameManager::drawCommandBox() {
for (int i = 0; i < ARRAYSIZE(_guiCommandButton); ++i) {
_vm->renderBox(_guiCommandButton[i].left,
@@ -489,13 +486,18 @@ void GameManager::inventory_arrow(int num, bool brightness) {
}
void GameManager::drawInventory() {
- for (int i = 0; i < 8; ++i) {
- int x = 136 * (i % 2);
- int y = 161 + 10 * (i / 2);
- _vm->renderBox(x, y, 135, 9, HGR_INV);
- if (i < _inventory.getSize())
- _vm->renderText(_inventory.get(i + _inventoryScroll)->_name, x + 1, y + 1, COL_INV);
+ for (int i = 0; i < ARRAYSIZE(_guiInventory); ++i) {
+ _vm->renderBox(_guiInventory[i].left,
+ _guiInventory[i].top,
+ _guiInventory[i].width(),
+ _guiInventory[i].height(),
+ _guiInventory[i]._bgColor);
+ _vm->renderText(_inventory.get(i + _inventoryScroll)->_name,
+ _guiInventory[i]._textPosition.x,
+ _guiInventory[i]._textPosition.y,
+ _guiInventory[i]._textColor);
}
+
_vm->renderBox(272, 161, 7, 19, HGR_INV);
_vm->renderBox(272, 181, 7, 19, HGR_INV);
}
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 92c9a21..6678a26 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -125,6 +125,7 @@ public:
int _inventoryScroll;
int _exitList[25];
GuiElement _guiCommandButton[10];
+ GuiElement _guiInventory[8];
// 0 PC Speaker | 1 SoundBlaster | 2 No Sound
int _soundDevice;
@@ -162,7 +163,6 @@ public:
void drawStatus();
void drawCommandBox();
void inventory_arrow(int num, bool brightness);
- void inventory_object(int index, bool brightness);
void drawInventory();
void drawImage(int section);
void changeRoom(RoomID id);
Commit: d70ded12f67b45a9693dbd04f13f6240b344cd9b
https://github.com/scummvm/scummvm/commit/d70ded12f67b45a9693dbd04f13f6240b344cd9b
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:00:11Z
Commit Message:
SUPERNOVA: Fixes that objects are removed when taken
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 0e811bf..b1e4182 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -461,7 +461,7 @@ void GameManager::takeObject(Object &obj) {
return;
if (obj._section != 0)
- _vm->renderImage(_currentRoom->getFileNumber(), obj._section);
+ drawImage(obj._section);
obj.setProperty(CARRIED);
obj._click = obj._click2 = 255;
_inventory.add(obj);
Commit: 83523ebbdc837290e48f9b22f23ac2e83e1510a4
https://github.com/scummvm/scummvm/commit/83523ebbdc837290e48f9b22f23ac2e83e1510a4
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:00:11Z
Commit Message:
SUPERNOVA: Corrects left mouse click behavior
This still needs work especially concerning actions that need two
objects like ACTION_USE or ACTION_GIVE.
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index b1e4182..b90e816 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -278,24 +278,31 @@ void GameManager::processInput(Common::EventType eventType, int x, int y) {
if (_mouseClickType == Common::EVENT_LBUTTONUP) {
_vm->removeMessage();
- if (Object::isNullObject(_currentInputObject))
- return;
- if (_mouseField >= 256 && _mouseField < 512) {
+ if (((_mouseField >= 0) && (_mouseField < 256)) ||
+ ((_mouseField >= 512) && (_mouseField < 768))) {
+ if (_inputVerb == ACTION_GIVE || _inputVerb == ACTION_USE) {
+ // TODO: There are cases where here is no second object needed
+ // for example, putting on the space suit
+ if (Object::isNullObject(_inputObject[0]))
+ _inputObject[0] = _currentInputObject;
+ else
+ _inputObject[1] = _currentInputObject;
+ } else {
+ _inputObject[0] = _currentInputObject;
+ if (!Object::isNullObject(_currentInputObject))
+ _processInput = true;
+ }
+ } else if (_mouseField >= 256 && _mouseField < 512) {
resetInputState();
_inputVerb = static_cast<Action>(_mouseField - 256);
drawStatus();
+ } else if (_mouseField == 768) {
+ if (_inventoryScroll >= 0)
+ --_inventoryScroll;
+ } else if (_mouseField == 769) {
+ ++_inventoryScroll;
}
- if (_inputVerb == ACTION_GIVE || _inputVerb == ACTION_USE) {
- if (Object::isNullObject(_inputObject[0]))
- _inputObject[0] = _currentInputObject;
- else
- _inputObject[1] = _currentInputObject;
- } else {
- _inputObject[0] = _currentInputObject;
- _processInput = true;
- }
-
} else if (_mouseClickType == Common::EVENT_RBUTTONUP) {
_vm->removeMessage();
if (Object::isNullObject(_currentInputObject))
Commit: aa447e81bc378ea327a2d3f943997416cd118039
https://github.com/scummvm/scummvm/commit/aa447e81bc378ea327a2d3f943997416cd118039
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:00:12Z
Commit Message:
SUPERNOVA: Initializes clickField.next with 0
It seems it is possible that some objects or subsequent click fields
'pointed' to by next are outside of the initialized range and are
expected to be zeroed. This would explain the non-deterministic freezes
I experienced.
Changed paths:
engines/supernova/graphics.cpp
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index d28c601..df3b706 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -98,6 +98,9 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
}
_numClickFields = stream.readByte();
+ for (int i = 0; i < kMaxClickFields; ++i) {
+ _clickField[i].next = 0;
+ }
for (int i = 0; i < _numClickFields; ++i) {
_clickField[i].x1 = stream.readUint16LE();
_clickField[i].x2 = stream.readUint16LE();
Commit: 83a5c81468af64177082059d16b47564e794c4b1
https://github.com/scummvm/scummvm/commit/83a5c81468af64177082059d16b47564e794c4b1
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:00:12Z
Commit Message:
SUPERNOVA: Fixes typo in room definition
Changed paths:
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index f382fc1..0db48b0 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -188,7 +188,7 @@ public:
_objectState[0] = Object("Instrumente", "Hmm, sieht ziemlich kompliziert aus.", INSTRUMENTS, NULLTYPE, 2, 2, 0, NULLROOM, 0);
_objectState[1] = Object("Monitor", Object::defaultDescription, MONITOR, NULLTYPE, 0, 0, 0, NULLROOM, 0);
_objectState[2] = Object("Monitor", "Dieser Monitor sagt dir nichts.", NULLOBJECT, TAKE, 1, 0, 0, NULLROOM, 0);
- _objectState[3] = Object("Ausgang", Object::defaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL, 2);
+ _objectState[3] = Object("Ausgang", Object::defaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL, 22);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
Commit: 30c5c852435e6f507599934d03bd7fed11367948
https://github.com/scummvm/scummvm/commit/30c5c852435e6f507599934d03bd7fed11367948
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:00:12Z
Commit Message:
SUPERNOVA: Refactors event loop
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 0c0866e..b5e674d 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -96,6 +96,7 @@ ObjectType &operator^=(ObjectType &a, ObjectType b) {
SupernovaEngine::SupernovaEngine(OSystem *syst)
: Engine(syst)
, _console(NULL)
+ , _gm(NULL)
, _currentImage(_images)
, _brightness(255)
, _menuBrightness(255)
@@ -121,6 +122,7 @@ SupernovaEngine::~SupernovaEngine() {
delete _rnd;
delete _console;
+ delete _gm;
for (int i = 0; i < kAudioNumSamples; ++i) {
delete[] _soundSamples[i]._buffer;
}
@@ -130,8 +132,8 @@ SupernovaEngine::~SupernovaEngine() {
Common::Error SupernovaEngine::run() {
initGraphics(_screenWidth, _screenHeight);
- GameManager gm(this);
- _console = new Console(this, &gm);
+ _gm = new GameManager(this);
+ _console = new Console(this, _gm);
initData();
initPalette();
@@ -141,43 +143,8 @@ Common::Error SupernovaEngine::run() {
CursorMan.showMouse(true);
while (_gameRunning) {
- while (g_system->getEventManager()->pollEvent(_event)) {
- switch (_event.type) {
- case Common::EVENT_QUIT:
- case Common::EVENT_RTL:
- _gameRunning = false;
- break;
-
- case Common::EVENT_KEYDOWN:
- if (_event.kbd.keycode == Common::KEYCODE_d &&
- (_event.kbd.flags & Common::KBD_CTRL)) {
- _console->attach();
- }
- if (_event.kbd.keycode == Common::KEYCODE_s) {
- for (int i = 0; i < _currentImage->_numSections; ++i) {
- gm.drawImage(i);
- _system->updateScreen();
- }
- }
-
- gm.processInput(_event.kbd);
- break;
-
- case Common::EVENT_LBUTTONUP:
- // fallthrough
- case Common::EVENT_RBUTTONUP:
- // fallthrough
- case Common::EVENT_MOUSEMOVE:
- gm.processInput(_event.type, _event.mouse.x, _event.mouse.y);
- break;
-
- default:
- break;
- }
-
- }
-
- gm.executeRoom();
+ updateEvents();
+ _gm->executeRoom();
_console->onFrame();
_system->updateScreen();
_system->delayMillis(_delay);
@@ -200,6 +167,40 @@ int SupernovaEngine::getDOSTicks() {
}
void SupernovaEngine::updateEvents() {
+ while (g_system->getEventManager()->pollEvent(_event)) {
+ switch (_event.type) {
+ case Common::EVENT_QUIT:
+ case Common::EVENT_RTL:
+ _gameRunning = false;
+ break;
+
+ case Common::EVENT_KEYDOWN:
+ if (_event.kbd.keycode == Common::KEYCODE_d &&
+ (_event.kbd.flags & Common::KBD_CTRL)) {
+ _console->attach();
+ }
+ if (_event.kbd.keycode == Common::KEYCODE_s) {
+ for (int i = 0; i < _currentImage->_numSections; ++i) {
+ _gm->drawImage(i);
+ _system->updateScreen();
+ }
+ }
+
+ _gm->processInput(_event.kbd);
+ break;
+
+ case Common::EVENT_LBUTTONUP:
+ // fallthrough
+ case Common::EVENT_RBUTTONUP:
+ // fallthrough
+ case Common::EVENT_MOUSEMOVE:
+ _gm->processInput(_event.type, _event.mouse.x, _event.mouse.y);
+ break;
+
+ default:
+ break;
+ }
+ }
}
void SupernovaEngine::initData() {
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index f8769c8..86d5d81 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -79,6 +79,7 @@ public:
virtual Common::Error run();
Common::RandomSource *_rnd;
+ GameManager *_gm;
Console *_console;
Audio::SoundHandle _soundHandle;
ScreenBufferStack _screenBuffer;
Commit: 0627ca35cb3126bcb52595017fc947c6aafdb2ea
https://github.com/scummvm/scummvm/commit/0627ca35cb3126bcb52595017fc947c6aafdb2ea
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:00:12Z
Commit Message:
SUPERNOVA: Implements delay for animations
Changed paths:
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index b90e816..2b79bb1 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -550,8 +550,14 @@ void GameManager::errorTemp() {
// STUB
}
-void GameManager::wait2(int delay) {
- // STUB
+void GameManager::wait2(int ticks) {
+ // 1 tick = 1/18.2s
+ uint end = g_system->getMillis() + (55 * ticks);
+ while (g_system->getMillis() < end) {
+ _vm->updateEvents();
+ g_system->updateScreen();
+ g_system->delayMillis(_vm->_delay);
+ }
}
void GameManager::screenShake() {
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 6678a26..70015e4 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -141,7 +141,7 @@ public:
void mouseInput2();
void mouseInput3();
void mouseWait(int delay);
- void wait2(int delay);
+ void wait2(int ticks);
void turnOff();
void turnOn();
void screenShake();
Commit: 02995da224ee970b0fa1364bd69d23a71cd4d790
https://github.com/scummvm/scummvm/commit/02995da224ee970b0fa1364bd69d23a71cd4d790
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:28:22Z
Commit Message:
SUPERNOVA: Adds definitions for remaining rooms
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 7f0d703..e7ee6cf 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -1015,4 +1015,193 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
return true;
}
+// Arsano
+void ArsanoRocks::onEntrance() {
+
+}
+
+bool ArsanoRocks::interact(Action verb, Object &obj1, Object &obj2) {
+
+}
+
+void ArsanoMeetup::onEntrance() {
+
+}
+
+void ArsanoMeetup::animation() {
+
+}
+
+bool ArsanoMeetup::interact(Action verb, Object &obj1, Object &obj2) {
+
+}
+
+void ArsanoEntrance::animation() {
+
+}
+
+bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
+
+}
+
+void ArsanoRemaining::animation() {
+
+}
+
+void ArsanoRoger::onEntrance() {
+
+}
+
+void ArsanoRoger::animation() {
+
+}
+
+bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
+
+}
+
+void ArsanoGlider::onEntrance() {
+
+}
+
+void ArsanoGlider::animation() {
+
+}
+
+void ArsanoMeetup2::onEntrance() {
+
+}
+
+bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
+
+}
+
+bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
+
+}
+
+void AxacussCell::onEntrance() {
+
+}
+
+void AxacussCell::animation() {
+
+}
+
+bool AxacussCell::interact(Action verb, Object &obj1, Object &obj2) {
+
+}
+
+void AxacussCorridor1::onEntrance() {
+
+}
+
+void AxacussCorridor2::onEntrance() {
+
+}
+
+void AxacussCorridor3::onEntrance() {
+
+}
+
+void AxacussCorridor4::onEntrance() {
+
+}
+
+void AxacussCorridor4::animation() {
+
+}
+
+bool AxacussCorridor4::interact(Action verb, Object &obj1, Object &obj2) {
+
+}
+
+void AxacussCorridor5::onEntrance() {
+
+}
+
+bool AxacussCorridor5::interact(Action verb, Object &obj1, Object &obj2) {
+
+}
+
+void AxacussCorridor6::onEntrance() {
+
+}
+
+bool AxacussCorridor6::interact(Action verb, Object &obj1, Object &obj2) {
+
+}
+
+void AxacussCorridor7::onEntrance() {
+
+}
+
+void AxacussCorridor8::onEntrance() {
+
+}
+
+bool AxacussCorridor8::interact(Action verb, Object &obj1, Object &obj2) {
+
+}
+
+void AxacussCorridor9::onEntrance() {
+
+}
+
+bool AxacussCorridor9::interact(Action verb, Object &obj1, Object &obj2) {
+
+}
+
+void AxacussBcorridor::onEntrance() {
+
+}
+
+bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
+
+}
+
+bool AxacussIntersection::interact(Action verb, Object &obj1, Object &obj2) {
+
+}
+
+bool AxacussExit::interact(Action verb, Object &obj1, Object &obj2) {
+
+}
+
+bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
+
+}
+
+bool AxacussOffice2::interact(Action verb, Object &obj1, Object &obj2) {
+
+}
+
+bool AxacussOffice3::interact(Action verb, Object &obj1, Object &obj2) {
+
+}
+
+bool AxacussOffice4::interact(Action verb, Object &obj1, Object &obj2) {
+
+}
+
+void AxacussOffice5::onEntrance() {
+
+}
+
+bool AxacussOffice5::interact(Action verb, Object &obj1, Object &obj2) {
+
+}
+
+bool AxacussElevator::interact(Action verb, Object &obj1, Object &obj2) {
+
+}
+
+bool AxacussStation::interact(Action verb, Object &obj1, Object &obj2) {
+
+}
+
+bool AxacussSign::interact(Action verb, Object &obj1, Object &obj2) {
+
+}
+
}
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 0db48b0..ef84161 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -562,9 +562,861 @@ public:
};
// Arsano
+class ArsanoRocks : public Room {
+public:
+ ArsanoRocks(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 12;
+ _shown[0] = true;
+
+ _objectState[0] = Object("Seil",Object::defaultDescription,NULLOBJECT,UNNECESSARY | EXIT,0,0,0,GENERATOR,12);
+ _objectState[1] = Object("Stein",Object::defaultDescription,STONE,NULLTYPE,1,1,0);
+ _objectState[2] = Object("Stein",Object::defaultDescription,NULLOBJECT,NULLTYPE,2,2,0);
+ _objectState[3] = Object("Loch","Es scheint eine Höhle zu sein.",NULLOBJECT,NULLTYPE,255,255,0,CAVE,1);
+ }
+
+ virtual void onEntrance();
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
+class ArsanoPassthrough : public Room {
+public:
+ ArsanoPassthrough(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 12;
+ _shown[0] = false;
+
+ _objectState[0] = Object("Ausgang","Hier bist du gerade hergekommen.",NULLOBJECT,EXIT,255,255,0,ROCKS,22);
+ _objectState[1] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,MEETUP,2);
+ }
+};
+class ArsanoMeetup : public Room {
+public:
+ ArsanoMeetup(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 37;
+ _shown[0] = true;
+
+ _objectState[0] = Object("Höhle",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
+ _objectState[1] = Object("Schild","Diese Schrift kannst du nicht lesen.",MEETUP_SIGN,NULLTYPE,0,0,0);
+ _objectState[2] = Object("Eingang",Object::defaultDescription,DOOR,EXIT,1,1,0,ENTRANCE,7);
+ _objectState[3] = Object("Stern",Object::defaultDescription,STAR,NULLTYPE,2,2,0);
+ _objectState[4] = Object("Raumschiff",Object::defaultDescription,SPACESHIPS,COMBINABLE,3,3,0);
+ _objectState[5] = Object("Raumschiff",Object::defaultDescription,SPACESHIP,COMBINABLE,4,4,0);
+ }
+
+ virtual void onEntrance();
+ virtual void animation();
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
+class ArsanoEntrance : public Room {
+public:
+ ArsanoEntrance(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 10;
+ _shown[0] = true;
+
+ _objectState[0] = Object("Portier","Du siehst doch selbst, wie er aussieht.",PORTER,TALK,0,0,0);
+ _objectState[1] = Object("Tür",Object::defaultDescription,NULLOBJECT,EXIT | OPENABLE | CLOSED,1,1,0,NULLROOM,5);
+ _objectState[2] = Object("Schild","Diese Schrift kannst du nicht lesen.",KITCHEN_SIGN,NULLTYPE,2,2,0);
+ _objectState[3] = Object("Kaugummi",Object::defaultDescription,SCHNUCK,TAKE,255,255,10+128);
+ _objectState[4] = Object("Gummibärchen",Object::defaultDescription,SCHNUCK,TAKE,255,255,11+128);
+ _objectState[5] = Object("Schokokugel",Object::defaultDescription,SCHNUCK,TAKE,255,255,12+128);
+ _objectState[6] = Object("Überraschungsei",Object::defaultDescription,EGG,TAKE,255,255,13+128);
+ _objectState[7] = Object("Lakritz",Object::defaultDescription,SCHNUCK,TAKE,255,255,14+128);
+ _objectState[8] = Object("Tablette","Die Plastikhülle zeigt einen|Mund mit einer Sprechblase. Was|darin steht, kannst du nicht lesen.",PILL,TAKE,255,255,0);
+ _objectState[9] = Object("Schlitz",Object::defaultDescription,CAR_SLOT,COMBINABLE,6,6,0);
+ _objectState[10] = Object("Automat","Sieht aus wie ein Kaugummiautomat.",NULLOBJECT,NULLTYPE,5,5,0);
+ _objectState[11] = Object("Toilette","Die Toiletten sind denen|auf der Erde sehr ähnlich.",ARS_BATHROOM,NULLTYPE,255,255,0);
+ _objectState[12] = Object("Knopf",Object::defaultDescription,BATHROOM_BUTTON,PRESS,3,3,0);
+ _objectState[13] = Object("Schild","Diese Schrift kannst du nicht lesen.",BATHROOM_SIGN,NULLTYPE,4,4,0);
+ _objectState[14] = Object("Treppe",Object::defaultDescription,STAIRCASE,EXIT,8,8,0,REST,3);
+ _objectState[15] = Object("Ausgang",Object::defaultDescription,MEETUP_EXIT,EXIT,255,255,0,MEETUP,22);
+ _objectState[16] = Object("Münzen","Es sind seltsame|Köpfe darauf abgebildet.",COINS,TAKE|COMBINABLE,255,255,0);
+ _objectState[17] = Object("Tablettenhülle","Darauf steht:\"Wenn Sie diese|Schrift jetzt lesen können,|hat die Tablette gewirkt.\"",PILL_HULL,TAKE,255,255,0);
+ }
+
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+ virtual void animation();
+};
+class ArsanoRemaining : public Room {
+public:
+ ArsanoRemaining(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 28;
+ _shown[0] = true;
+
+ _objectState[0] = Object("Treppe",Object::defaultDescription,NULLOBJECT,EXIT,0,0,0,ENTRANCE,17);
+ _objectState[1] = Object("Stuhl",Object::defaultDescription,NULLOBJECT,EXIT,1,1,0,ROGER,2);
+ _objectState[2] = Object("Schuhe","Wie ist der denn mit|Schuhen hier reingekommen?",NULLOBJECT,NULLTYPE,2,2,0);
+ }
+
+ virtual void animation();
+};
+class ArsanoRoger : public Room {
+public:
+ ArsanoRoger(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 29;
+ _shown[0] = true;
+
+ _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,REST,19);
+ _objectState[1] = Object("Froschgesicht",Object::defaultDescription,ROGER_W,TALK,0,0,0);
+ _objectState[2] = Object("Gekritzel","\"Mr Spock was here\"",NULLOBJECT,NULLTYPE,3,3,0);
+ _objectState[3] = Object("Brieftasche",Object::defaultDescription,WALLET,TAKE,1,1,4);
+ _objectState[4] = Object("Speisekarte","\"Heute empfehlen wir:|Fonua Opra mit Ulk.\"",NULLOBJECT,UNNECESSARY,2,2,0);
+ _objectState[5] = Object("Tasse","Sie enthält eine grünliche Flüssigkeit.",CUP,UNNECESSARY,4,4,0);
+ _objectState[6] = Object("Schachspiel",Object::defaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
+ _objectState[7] = Object("10-Buckazoid-Schein","Nicht gerade sehr viel Geld.",NULLOBJECT,TAKE|COMBINABLE,255,255,0);
+ _objectState[8] = Object("Keycard von Roger",Object::defaultDescription,KEYCARD_R,TAKE|COMBINABLE,255,255,0);
+ }
+
+ virtual void animation();
+ virtual void onEntrance();
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
+class ArsanoGlider : public Room {
+public:
+ ArsanoGlider(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 19;
+ _shown[0] = true;
+
+ _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,MEETUP,15);
+ _objectState[1] = Object("Knopf",Object::defaultDescription,GLIDER_BUTTON1,PRESS,0,0,0);
+ _objectState[2] = Object("Knopf",Object::defaultDescription,GLIDER_BUTTON2,PRESS,1,1,0);
+ _objectState[3] = Object("Knopf",Object::defaultDescription,GLIDER_BUTTON3,PRESS,2,2,0);
+ _objectState[4] = Object("Knopf",Object::defaultDescription,GLIDER_BUTTON4,PRESS,3,3,0);
+ _objectState[5] = Object("Keycard von Roger",Object::defaultDescription,GLIDER_KEYCARD,TAKE|COMBINABLE,255,255,0);
+ _objectState[6] = Object("Schlitz",Object::defaultDescription,GLIDER_SLOT,COMBINABLE,4,4,0);
+ _objectState[7] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPENABLE,5,6,6);
+ _objectState[8] = Object("Tastatur",Object::defaultDescription,GLIDER_BUTTONS,NULLTYPE,7,7,0);
+ _objectState[9] = Object("Anzeige","Hmm, seltsame Anzeigen.",GLIDER_DISPLAY,NULLTYPE,8,8,0);
+ _objectState[10] = Object("Instrumente","Hmm, seltsame Anzeigen.",GLIDER_INSTRUMENTS,NULLTYPE,9,9,0);
+ }
+
+ virtual void animation();
+ virtual void onEntrance();
+};
+class ArsanoMeetup2 : public Room {
+public:
+ ArsanoMeetup2(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 38;
+ _shown[0] = true;
+
+ _objectState[0] = Object("Roger W.",Object::defaultDescription,ROGER_W,TALK,255,255,0);
+ _objectState[1] = Object("Raumschiff",Object::defaultDescription,SPACESHIP,COMBINABLE,255,255,0);
+ _objectState[2] = Object("Höhle",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
+ }
+
+ virtual void onEntrance();
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
+class ArsanoMeetup3 : public Room {
+public:
+ ArsanoMeetup3(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 39;
+ _shown[0] = true;
+
+ _objectState[0] = Object("Ufo","Der Eingang scheint offen zu sein.",UFO,EXIT,0,0,0,NULLROOM,3);
+ _objectState[1] = Object("Stern",Object::defaultDescription,STAR,NULLTYPE,1,1,0);
+ _objectState[2] = Object("Höhle",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
+ }
+
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
// Axacuss
+class AxacussCell : public Room {
+public:
+ AxacussCell(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 43;
+ _shown[0] = true;
+ _shown[1] = true;
+ _shown[2] = false;
+ _shown[3] = false;
+ _shown[4] = false;
+ _shown[5] = false;
+ _shown[6] = false;
+ _shown[7] = false;
+ _shown[8] = false;
+ _shown[9] = false;
+ _shown[10] = false;
+ _shown[11] = false;
+ _shown[12] = false;
+ _shown[13] = false;
+ _shown[14] = false;
+ _shown[15] = false;
+ _shown[16] = false;
+ _shown[17] = false;
+ _shown[18] = false;
+ _shown[19] = false;
+ _shown[20] = false;
+ _shown[21] = false;
+ _shown[22] = false;
+ _shown[23] = false;
+ _shown[24] = false;
+ _shown[25] = false;
+ _shown[26] = false;
+ _shown[27] = false;
+ _shown[28] = false;
+ _shown[29] = false;
+ _shown[30] = false;
+ _shown[31] = true;
+
+ _objectState[0] = Object("Knopf",Object::defaultDescription,CELL_BUTTON,PRESS,1,1,0);
+ _objectState[1] = Object("Tür",Object::defaultDescription,CELL_DOOR,EXIT|OPENABLE|CLOSED,0,0,31+128,CORRIDOR4,1);
+ _objectState[2] = Object("Tablett","Es ist irgendein Fraß und|etwas zu Trinken darauf.",TRAY,UNNECESSARY,255,255,0);
+ _objectState[3] = Object("Stange","Es scheint eine Lampe zu sein.",NULLOBJECT,COMBINABLE,3,3,0);
+ _objectState[4] = Object("Augen","Es ist nur ein Bild.",NULLOBJECT,NULLTYPE,4,4,0);
+ _objectState[5] = Object("Leitung",Object::defaultDescription,CELL_WIRE,COMBINABLE|TAKE,6,6,0);
+ _objectState[6] = Object("Steckdose","Sieht etwas anders aus als auf der Erde.",SOCKET,COMBINABLE,5,5,0);
+ _objectState[7] = Object("Metallblock","Er ist ziemlich schwer.",MAGNET,TAKE|COMBINABLE,255,255,30);
+ _objectState[8] = Object("Roboter","Den hast du erledigt.",NULLOBJECT,NULLTYPE,255,255,0);
+ _objectState[9] = Object("Tisch","Ein kleiner Metalltisch.",CELL_TABLE,COMBINABLE,2,2,0);
+ }
+
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+ virtual void animation();
+ virtual void onEntrance();
+};
+class AxacussCorridor1 : public Room {
+public:
+ AxacussCorridor1(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 16;
+ _shown[0] = true;
+ _shown[1] = false;
+ _shown[2] = false;
+ _shown[3] = true;
+ _shown[4] = true;
+ _shown[5] = true;
+ _shown[6] = false;
+ _shown[7] = false;
+ _shown[8] = false;
+ _shown[9] = false;
+ _shown[10] = false;
+ _shown[11] = false;
+ _shown[12] = false;
+ _shown[13] = true;
+ _shown[14] = false;
+ _shown[15] = false;
+ _shown[16] = false;
+ _shown[17] = false;
+ _shown[18] = false;
+ _shown[19] = false;
+ _shown[20] = false;
+ _shown[21] = true;
+ _shown[22] = false;
+ _shown[23] = true;
+ _shown[24] = false;
+ _shown[25] = true;
+
+ _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,GUARD3,2);
+ _objectState[1] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR2,22);
+ }
+
+ virtual void onEntrance();
+};
+class AxacussCorridor2 : public Room {
+public:
+ AxacussCorridor2(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 16;
+ _shown[0] = true;
+ _shown[1] = false;
+ _shown[2] = true;
+ _shown[3] = true;
+ _shown[4] = true;
+ _shown[5] = true;
+ _shown[6] = false;
+ _shown[7] = false;
+ _shown[8] = false;
+ _shown[9] = false;
+ _shown[10] = false;
+ _shown[11] = false;
+ _shown[12] = false;
+ _shown[13] = false;
+ _shown[14] = false;
+ _shown[15] = false;
+ _shown[16] = false;
+ _shown[17] = true;
+ _shown[18] = false;
+ _shown[19] = false;
+ _shown[20] = false;
+ _shown[21] = true;
+ _shown[22] = false;
+ _shown[23] = false;
+ _shown[24] = true;
+
+ _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR1,2);
+ _objectState[1] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR3,22);
+ _objectState[2] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,1,1,0,CORRIDOR4,14);
+ }
+
+ virtual void onEntrance();
+};
+class AxacussCorridor3 : public Room {
+ AxacussCorridor3(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 16;
+
+ _shown[0] = true;
+ _shown[1] = false;
+ _shown[2] = false;
+ _shown[3] = true;
+ _shown[4] = false;
+ _shown[5] = true;
+ _shown[6] = false;
+ _shown[7] = false;
+ _shown[8] = false;
+ _shown[9] = false;
+ _shown[10] = false;
+ _shown[11] = false;
+ _shown[12] = false;
+ _shown[13] = false;
+ _shown[14] = false;
+ _shown[15] = false;
+ _shown[16] = false;
+ _shown[17] = false;
+ _shown[18] = false;
+ _shown[19] = true;
+ _shown[20] = false;
+ _shown[21] = false;
+ _shown[22] = false;
+ _shown[23] = true;
+
+ _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR2,2);
+ }
+
+ virtual void onEntrance();
+};
+class AxacussCorridor4 : public Room {
+ AxacussCorridor4(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 16;
+ _shown[0] = true;
+ _shown[1] = true;
+ _shown[2] = true;
+ _shown[3] = false;
+ _shown[4] = false;
+ _shown[5] = false;
+ _shown[6] = false;
+ _shown[7] = false;
+ _shown[8] = true;
+ _shown[9] = true;
+ _shown[10] = false;
+ _shown[11] = true;
+ _shown[12] = false;
+ _shown[13] = false;
+ _shown[14] = false;
+ _shown[15] = true;
+ _shown[16] = false;
+ _shown[17] = false;
+ _shown[18] = true;
+ _shown[19] = false;
+ _shown[20] = true;
+ _shown[21] = false;
+ _shown[22] = false;
+ _shown[23] = false;
+ _shown[24] = false;
+ _shown[25] = false;
+ _shown[26] = true;
+
+ _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,0,0,0,CORRIDOR2,10);
+ _objectState[1] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,1,1,0,GUARD,14);
+ _objectState[2] = Object("Zellentür","Hier warst du eingesperrt.",DOOR,EXIT|OPENABLE|OPENED|CLOSED,7,7,0,CELL,16);
+ _objectState[3] = Object("Laptop",Object::defaultDescription,NEWSPAPER,TAKE,6,6,8);
+ _objectState[4] = Object("Armbanduhr",Object::defaultDescription,WATCH,TAKE|COMBINABLE,255,255,8);
+ _objectState[5] = Object("Tisch",Object::defaultDescription,TABLE,COMBINABLE,5,5,0);
+ }
+
+ virtual void onEntrance();
+ virtual void animation();
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
+class AxacussCorridor5 : public Room {
+ AxacussCorridor5(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 16;
+ _shown[0] = true;
+ _shown[1] = false;
+ _shown[2] = false;
+ _shown[3] = true;
+ _shown[4] = true;
+ _shown[5] = true;
+ _shown[6] = false;
+ _shown[7] = false;
+ _shown[8] = false;
+ _shown[9] = false;
+ _shown[10] = false;
+ _shown[11] = false;
+ _shown[12] = true;
+ _shown[13] = false;
+ _shown[14] = false;
+ _shown[15] = false;
+ _shown[16] = false;
+ _shown[17] = false;
+ _shown[18] = false;
+ _shown[19] = false;
+ _shown[20] = false;
+ _shown[21] = false;
+ _shown[22] = true;
+ _shown[23] = true;
+ _shown[24] = true;
+
+ _objectState[0] = Object("Ausgang",Object::defaultDescription,DOOR,EXIT,2,2,0,NULLROOM,2);
+ _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR6,22);
+ }
+
+ virtual void onEntrance();
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
+class AxacussCorridor6 : public Room {
+ AxacussCorridor6(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 16;
+ _shown[0] = true;
+ _shown[1] = false;
+ _shown[2] = false;
+ _shown[3] = true;
+ _shown[4] = true;
+ _shown[5] = true;
+ _shown[6] = true;
+ _shown[7] = false;
+ _shown[8] = false;
+ _shown[9] = false;
+ _shown[10] = false;
+ _shown[11] = false;
+ _shown[12] = false;
+ _shown[13] = false;
+ _shown[14] = false;
+ _shown[15] = false;
+ _shown[16] = false;
+ _shown[17] = false;
+ _shown[18] = false;
+ _shown[19] = false;
+ _shown[20] = false;
+ _shown[21] = false;
+ _shown[22] = true;
+ _shown[23] = false;
+ _shown[24] = true;
+ _shown[25] = true;
+
+ _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR5,2);
+ _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR7,22);
+ _objectState[0] = Object("Tür",Object::defaultDescription,DOOR,OPENABLE|CLOSED,255,255,0,CORRIDOR8,13);
+ }
+
+ virtual void onEntrance();
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
+class AxacussCorridor7 : public Room {
+ AxacussCorridor7(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 16;
+ _shown[0] = true;
+ _shown[1] = false;
+ _shown[2] = false;
+ _shown[3] = true;
+ _shown[4] = true;
+ _shown[5] = true;
+ _shown[6] = false;
+ _shown[7] = false;
+ _shown[8] = false;
+ _shown[9] = false;
+ _shown[10] = true;
+ _shown[11] = false;
+ _shown[12] = false;
+ _shown[13] = false;
+ _shown[14] = false;
+ _shown[15] = false;
+ _shown[16] = false;
+ _shown[17] = false;
+ _shown[18] = false;
+ _shown[19] = false;
+ _shown[20] = false;
+ _shown[21] = true;
+ _shown[22] = false;
+ _shown[23] = false;
+ _shown[24] = true;
+ _shown[25] = true;
+
+ _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR6,2);
+ _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,GUARD,22);
+ }
+
+ virtual void onEntrance();
+};
+class AxacussCorridor8 : public Room {
+ AxacussCorridor8(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 16;
+ _shown[0] = true;
+ _shown[1] = true;
+ _shown[2] = false;
+ _shown[3] = false;
+ _shown[4] = true;
+ _shown[5] = false;
+ _shown[6] = false;
+ _shown[7] = false;
+ _shown[8] = false;
+ _shown[9] = false;
+ _shown[10] = false;
+ _shown[11] = false;
+ _shown[12] = false;
+ _shown[13] = false;
+ _shown[14] = false;
+ _shown[15] = true;
+ _shown[16] = false;
+ _shown[17] = false;
+ _shown[18] = false;
+ _shown[19] = false;
+ _shown[20] = true;
+ _shown[21] = false;
+ _shown[22] = true;
+ _shown[23] = false;
+ _shown[24] = false;
+ _shown[25] = false;
+ _shown[26] = false;
+ _shown[27] = false;
+ _shown[28] = true;
+
+ _objectState[0] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE,0,0,0,CORRIDOR6,10);
+ _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,BCORRIDOR,22);
+ }
+ virtual void onEntrance();
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
+class AxacussCorridor9 : public Room {
+ AxacussCorridor9(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 16;
+ _shown[0] = true;
+ _shown[1] = true;
+ _shown[2] = false;
+ _shown[3] = true;
+ _shown[4] = false;
+ _shown[5] = false;
+ _shown[6] = false;
+ _shown[7] = false;
+ _shown[8] = false;
+ _shown[9] = false;
+ _shown[10] = false;
+ _shown[11] = false;
+ _shown[12] = false;
+ _shown[13] = false;
+ _shown[14] = true;
+ _shown[15] = false;
+ _shown[16] = false;
+ _shown[17] = false;
+ _shown[18] = false;
+ _shown[19] = true;
+ _shown[20] = false;
+ _shown[21] = false;
+ _shown[22] = false;
+ _shown[23] = true;
+ _shown[24] = false;
+ _shown[25] = false;
+ _shown[26] = false;
+ _shown[27] = false;
+ _shown[28] = true;
+
+ _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,BCORRIDOR,2);
+ _objectState[0] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE,0,0,0,GUARD,10);
+ }
+
+ virtual void onEntrance();
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
+class AxacussBcorridor : public Room {
+ AxacussBcorridor(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 6;
+ _shown[0] = true;
+ _shown[1] = false;
+ _shown[2] = false;
+ _shown[3] = true;
+
+ _objectState[0] = Object("Säule",Object::defaultDescription,PILLAR1,NULLTYPE,4,4,0);
+ _objectState[1] = Object("Säule",Object::defaultDescription,PILLAR2,NULLTYPE,5,5,0);
+ _objectState[2] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,6,6,0,CORRIDOR8,2);
+ _objectState[3] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,7,7,0,CORRIDOR9,22);
+ _objectState[4] = Object("Tür","Auf einem Schild an der Tür steht \"Dr. Alab Hansi\".",DOOR1,EXIT|OPENABLE|CLOSED|OCCUPIED,0,0,1,OFFICE_L1,6);
+ _objectState[5] = Object("Tür","Auf einem Schild an der Tür steht \"Saval Lun\".",DOOR2,EXIT|OPENABLE|CLOSED|OCCUPIED,1,1,2,OFFICE_L2,16);
+ _objectState[6] = Object("Tür","Auf einem Schild an der Tür steht \"Prof. Dr. Ugnul Tschabb\".",DOOR3,EXIT|OPENABLE|OPENED,2,2,3,OFFICE_R1,8);
+ _objectState[7] = Object("Tür","Auf einem Schild an der Tür steht \"Alga Hurz Li\".",DOOR4,EXIT|OPENABLE|CLOSED|OCCUPIED,3,3,4,OFFICE_R2,18);
+ }
+
+ virtual void onEntrance();
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
+class AxacussIntersection : public Room {
+ AxacussIntersection(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 40;
+ _shown[0] = true;
+
+ _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CORRIDOR4,21);
+ _objectState[1] = Object("Gang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR7,5);
+ _objectState[2] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE,1,1,6,CORRIDOR9,3);
+ // Originally GUARD was ObjectID..
+ _objectState[3] = Object("Axacussaner","Du müßtest ihn irgendwie ablenken.",INSTRUMENTS,TALK,0,0,0);
+ _objectState[4] = Object("Bild","Komisches Bild.",NULLOBJECT,NULLTYPE,2,2,0);
+ _objectState[5] = Object("Karte","Darauf steht: \"Generalkarte\".",MASTERKEYCARD,TAKE|COMBINABLE,255,255,1);
+ }
+
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
+class AxacussExit : public Room {
+ AxacussExit(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 42;
+ _shown[0] = true;
+
+ _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CORRIDOR1,22);
+ _objectState[1] = Object("Tür",Object::defaultDescription,NULLOBJECT,EXIT|OPENABLE|CLOSED,0,0,0,NULLROOM,20);
+ _objectState[2] = Object("Tür",Object::defaultDescription,NULLOBJECT,EXIT|OPENABLE|CLOSED,1,1,0,NULLROOM,15);
+ _objectState[3] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE,2,2,11,OFFICE_L,0);
+ _objectState[4] = Object("Lampe",Object::defaultDescription,LAMP,COMBINABLE,3,3,0);
+ // Originally GUARD was ObjectID..
+ _objectState[5] = Object("Axacussaner",Object::defaultDescription,INSTRUMENTS,TALK,5,5,0);
+ _objectState[6] = Object("Bild","Seltsam!",NULLOBJECT,NULLTYPE,4,4,0);
+ }
+
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
+class AxacussOffice1 : public Room {
+ AxacussOffice1(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 7;
+ _shown[0] = true;
+ _shown[1] = false;
+ _shown[2] = true;
+ _shown[3] = false;
+ _shown[4] = false;
+ _shown[5] = false;
+ _shown[6] = false;
+ _shown[7] = true;
+ _shown[8] = false;
+ _shown[9] = true;
+ _shown[10] = false;
+ _shown[11] = false;
+ _shown[12] = false;
+ _shown[13] = false;
+ _shown[14] = false;
+ _shown[15] = false;
+ _shown[16] = true;
+
+ _objectState[0] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,9,BCORRIDOR,9);
+ _objectState[1] = Object("Computer",Object::defaultDescription,COMPUTER,COMBINABLE,4,4,0);
+ _objectState[2] = Object("Geld","Es sind 500 Xa.",TICKETS,TAKE,255,255,0);
+ _objectState[3] = Object("Schließfach","Es hat ein elektronisches Zahlenschloß.",LOCKER,OPENABLE|CLOSED,5,5,0);
+ _objectState[4] = Object("Brief",Object::defaultDescription,LETTER,UNNECESSARY,3,3,0);
+ }
+
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
+class AxacussOffice2 : public Room {
+ AxacussOffice2(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 7;
+ _shown[0] = true;
+ _shown[1] = true;
+ _shown[2] = false;
+ _shown[3] = false;
+ _shown[4] = false;
+ _shown[5] = false;
+ _shown[6] = false;
+ _shown[7] = false;
+ _shown[8] = false;
+ _shown[9] = true;
+ _shown[10] = false;
+ _shown[11] = false;
+ _shown[12] = false;
+ _shown[13] = false;
+ _shown[14] = false;
+ _shown[15] = false;
+ _shown[16] = true;
+
+ _objectState[0] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,9,BCORRIDOR,9);
+ _objectState[0] = Object("Computer",Object::defaultDescription,COMPUTER,COMBINABLE,4,4,0);
+ _objectState[0] = Object("Würfel","Sonderbar!",NULLOBJECT,NULLTYPE,0,0,0);
+ _objectState[0] = Object("Bild","Affenstark!",NULLOBJECT,NULLTYPE,1,1,0);
+ _objectState[0] = Object("Komisches Ding","Wundersam!",NULLOBJECT,UNNECESSARY,2,2,0);
+ }
+
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
+class AxacussOffice3 : public Room {
+ AxacussOffice3(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 8;
+ _shown[0] = true;
+ _shown[1] = true;
+ _shown[2] = false;
+ _shown[3] = true;
+
+ _objectState[0] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,0,0,3,BCORRIDOR,5);
+ _objectState[1] = Object("Computer",Object::defaultDescription,COMPUTER,COMBINABLE,4,4,0);
+ _objectState[2] = Object("Bild","Es ist ein Axacussanerkopf auf dem Bild.",NULLOBJECT,UNNECESSARY,1,1,0);
+ _objectState[3] = Object("Bild","Es ist ein Axacussanerkopf auf dem Bild.",PAINTING,UNNECESSARY,2,2,0);
+ _objectState[4] = Object("Pflanze",Object::defaultDescription,NULLOBJECT,UNNECESSARY,3,3,0);
+ _objectState[5] = Object("",Object::defaultDescription,MONEY,TAKE|COMBINABLE,255,255,0);
+ }
+
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
+class AxacussOffice4 : public Room {
+ AxacussOffice4(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 8;
+ _shown[0] = true;
+ _shown[1] = false;
+ _shown[2] = true;
+ _shown[3] = true;
+
+ _objectState[0] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,0,0,3,BCORRIDOR,5);
+ _objectState[1] = Object("Computer",Object::defaultDescription,COMPUTER,COMBINABLE,4,4,0);
+ _objectState[2] = Object("Figur","Stark!",NULLOBJECT,UNNECESSARY,6,6,0);
+ _objectState[3] = Object("Pflanze","Sie ist den Pflanzen auf der Erde sehr ähnlich.",NULLOBJECT,UNNECESSARY,5,5,0);
+ }
+
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
+class AxacussOffice5 : public Room {
+ AxacussOffice5(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 7;
+ _shown[0] = true;
+ _shown[1] = false;
+ _shown[2] = false;
+ _shown[3] = true;
+ _shown[4] = false;
+ _shown[5] = true;
+ _shown[6] = false;
+ _shown[7] = false;
+ _shown[8] = false;
+ _shown[9] = false;
+ _shown[10] = false;
+ _shown[11] = false;
+ _shown[12] = false;
+ _shown[13] = false;
+ _shown[14] = false;
+ _shown[15] = false;
+ _shown[16] = false;
+ _shown[17] = true;
+
+ _objectState[0] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,17,GUARD3,9);
+ _objectState[1] = Object("Computer","Er funktioniert nicht.",COMPUTER,COMBINABLE,4,4,0);
+ _objectState[2] = Object("Graffiti","Seltsamer Büroschmuck!",NULLOBJECT,NULLTYPE,7,7,0);
+ _objectState[3] = Object("Geld","Es sind 350 Xa.",TICKETS,TAKE,8,8,0);
+ }
+
+ virtual void onEntrance();
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
+class AxacussElevator : public Room {
+ AxacussElevator(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 3;
+ _shown[0] = true;
+
+ _objectState[0] = Object("Knopf",Object::defaultDescription,BUTTON1,PRESS,0,0,0);
+ _objectState[1] = Object("Knopf",Object::defaultDescription,BUTTON2,PRESS,1,1,0);
+ _objectState[2] = Object("Ausgang",Object::defaultDescription,DOOR,EXIT,255,255,0,NULLROOM,22);
+ _objectState[3] = Object("Dschungel","Lauter Bäume.",JUNGLE,NULLTYPE,255,255,0,STATION,2);
+ }
+
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
+class AxacussStation : public Room {
+ AxacussStation(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 5;
+ _shown[0] = true;
+ _objectState[0] = Object("Schild",Object::defaultDescription,STATION_SIGN,NULLTYPE,0,0,0);
+ _objectState[0] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE|CLOSED,1,1,0,NULLROOM,7);
+ }
+
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
+class AxacussSign : public Room {
+ AxacussSign(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 32;
+ _shown[0] = true;
+ _shown[1] = true;
+
+ _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,STATION,22);
+ _objectState[1] = Object("Schlitz",Object::defaultDescription,SLOT,COMBINABLE,0,0,0);
+ }
+
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+};
}
#endif // ROOMS_H
Commit: 3f98c29ab1788b9631da8e8d2280682ce1749584
https://github.com/scummvm/scummvm/commit/3f98c29ab1788b9631da8e8d2280682ce1749584
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:28:29Z
Commit Message:
SUPERNOVA: Corrects exit direction of sleeping cabin
Changed paths:
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index ef84161..d5e77dd 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -168,7 +168,7 @@ public:
_objectState[0] = Object("Luke", "Dies ist eine der Tiefschlafkammern.", CABINS, NULLTYPE, 0, 0, 0, NULLROOM, 0);
_objectState[1] = Object("Luke", "Dies ist eine der Tiefschlafkammern.", CABIN, NULLTYPE, 1, 1, 0, NULLROOM, 0);
_objectState[2] = Object("Computer", Object::defaultDescription, COMPUTER, NULLTYPE, 2, 2, 0, NULLROOM, 0);
- _objectState[3] = Object("Ausgang", Object::defaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL, 2);
+ _objectState[3] = Object("Ausgang", Object::defaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL, 22);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
Commit: ffcd447a08ff55fbeb677ab9117c80ccf4b4bbbc
https://github.com/scummvm/scummvm/commit/ffcd447a08ff55fbeb677ab9117c80ccf4b4bbbc
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:28:29Z
Commit Message:
SUPERNOVA: Fixes visibility of room constructors
Signed-off-by: Joseph-Eugene Winzer <m999 at openmailbox.org>
Changed paths:
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index d5e77dd..4544cad 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -580,9 +580,9 @@ public:
virtual void onEntrance();
virtual bool interact(Action verb, Object &obj1, Object &obj2);
};
-class ArsanoPassthrough : public Room {
+class ArsanoCave : public Room {
public:
- ArsanoPassthrough(SupernovaEngine *vm, GameManager *gm) {
+ ArsanoCave(SupernovaEngine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
@@ -883,6 +883,7 @@ public:
virtual void onEntrance();
};
class AxacussCorridor3 : public Room {
+public:
AxacussCorridor3(SupernovaEngine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
@@ -920,6 +921,7 @@ class AxacussCorridor3 : public Room {
virtual void onEntrance();
};
class AxacussCorridor4 : public Room {
+public:
AxacussCorridor4(SupernovaEngine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
@@ -966,6 +968,7 @@ class AxacussCorridor4 : public Room {
virtual bool interact(Action verb, Object &obj1, Object &obj2);
};
class AxacussCorridor5 : public Room {
+public:
AxacussCorridor5(SupernovaEngine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
@@ -1005,6 +1008,7 @@ class AxacussCorridor5 : public Room {
virtual bool interact(Action verb, Object &obj1, Object &obj2);
};
class AxacussCorridor6 : public Room {
+public:
AxacussCorridor6(SupernovaEngine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
@@ -1046,6 +1050,7 @@ class AxacussCorridor6 : public Room {
virtual bool interact(Action verb, Object &obj1, Object &obj2);
};
class AxacussCorridor7 : public Room {
+public:
AxacussCorridor7(SupernovaEngine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
@@ -1085,6 +1090,7 @@ class AxacussCorridor7 : public Room {
virtual void onEntrance();
};
class AxacussCorridor8 : public Room {
+public:
AxacussCorridor8(SupernovaEngine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
@@ -1128,6 +1134,7 @@ class AxacussCorridor8 : public Room {
virtual bool interact(Action verb, Object &obj1, Object &obj2);
};
class AxacussCorridor9 : public Room {
+public:
AxacussCorridor9(SupernovaEngine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
@@ -1171,6 +1178,7 @@ class AxacussCorridor9 : public Room {
virtual bool interact(Action verb, Object &obj1, Object &obj2);
};
class AxacussBcorridor : public Room {
+public:
AxacussBcorridor(SupernovaEngine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
@@ -1195,6 +1203,7 @@ class AxacussBcorridor : public Room {
virtual bool interact(Action verb, Object &obj1, Object &obj2);
};
class AxacussIntersection : public Room {
+public:
AxacussIntersection(SupernovaEngine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
@@ -1214,6 +1223,7 @@ class AxacussIntersection : public Room {
virtual bool interact(Action verb, Object &obj1, Object &obj2);
};
class AxacussExit : public Room {
+public:
AxacussExit(SupernovaEngine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
@@ -1234,6 +1244,7 @@ class AxacussExit : public Room {
virtual bool interact(Action verb, Object &obj1, Object &obj2);
};
class AxacussOffice1 : public Room {
+public:
AxacussOffice1(SupernovaEngine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
@@ -1267,6 +1278,7 @@ class AxacussOffice1 : public Room {
virtual bool interact(Action verb, Object &obj1, Object &obj2);
};
class AxacussOffice2 : public Room {
+public:
AxacussOffice2(SupernovaEngine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
@@ -1300,6 +1312,7 @@ class AxacussOffice2 : public Room {
virtual bool interact(Action verb, Object &obj1, Object &obj2);
};
class AxacussOffice3 : public Room {
+public:
AxacussOffice3(SupernovaEngine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
@@ -1321,6 +1334,7 @@ class AxacussOffice3 : public Room {
virtual bool interact(Action verb, Object &obj1, Object &obj2);
};
class AxacussOffice4 : public Room {
+public:
AxacussOffice4(SupernovaEngine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
@@ -1340,6 +1354,7 @@ class AxacussOffice4 : public Room {
virtual bool interact(Action verb, Object &obj1, Object &obj2);
};
class AxacussOffice5 : public Room {
+public:
AxacussOffice5(SupernovaEngine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
@@ -1374,6 +1389,7 @@ class AxacussOffice5 : public Room {
virtual bool interact(Action verb, Object &obj1, Object &obj2);
};
class AxacussElevator : public Room {
+public:
AxacussElevator(SupernovaEngine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
@@ -1390,6 +1406,7 @@ class AxacussElevator : public Room {
virtual bool interact(Action verb, Object &obj1, Object &obj2);
};
class AxacussStation : public Room {
+public:
AxacussStation(SupernovaEngine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
@@ -1397,12 +1414,13 @@ class AxacussStation : public Room {
_fileNumber = 5;
_shown[0] = true;
_objectState[0] = Object("Schild",Object::defaultDescription,STATION_SIGN,NULLTYPE,0,0,0);
- _objectState[0] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE|CLOSED,1,1,0,NULLROOM,7);
+ _objectState[1] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE|CLOSED,1,1,0,NULLROOM,7);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
};
class AxacussSign : public Room {
+public:
AxacussSign(SupernovaEngine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
Commit: daf55369a9a454607ed649c8fd102ef3b7826dd4
https://github.com/scummvm/scummvm/commit/daf55369a9a454607ed649c8fd102ef3b7826dd4
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:28:29Z
Commit Message:
SUPERNOVA: Implements showing cockpit monitor
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/state.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index e7ee6cf..2a05471 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -310,34 +310,38 @@ void ShipSleepCabin::onEntrance() {
}
bool ShipCockpit::interact(Action verb, Object &obj1, Object &obj2) {
+ // TODO: distance and remaining time not accurate
char c[2] = {0};
if ((verb == ACTION_LOOK) && (obj1._id == MONITOR)) {
- setSectionVisible(kMaxSection - 1, true);
- _vm->renderBox(0, 0, 320, 200, kColorBlack);
- _vm->renderText("Geschwindigkeit: ", 50, 50, kColorLightYellow);
- if (_gm->_state.time)
- _vm->renderText("8000 hpm");
- else
- _vm->renderText("0 hpm");
- _vm->renderText("Ziel: Arsano 3", 50, 70, kColorLightYellow);
- _vm->renderText("Entfernung: ", 50, 90, kColorLightYellow);
- _vm->renderText(Common::String::format("%d", _gm->_state.time / 400).c_str());
- _vm->renderText(",");
- c[0] = (_gm->_state.time / 40) % 10 + '0';
- _vm->renderText(c);
- c[0] = (_gm->_state.time / 4) % 10 + '0';
- _vm->renderText(c);
- _vm->renderText(" Lichtjahre");
- _vm->renderText("Dauer der Reise bei momentaner Geschwindigkeit:", 50, 110, 14);
- _vm->renderText(Common::String::format("%d", _gm->_state.time).c_str(), 50, 120, kColorLightYellow);
- _vm->renderText(" Tage");
- _gm->mouseInput2();
- setSectionVisible(kMaxSection - 1, false);
- _vm->renderRoom(*this);
- _gm->showMenu();
- _gm->drawMapExits();
- _vm->paletteBrightness();
+ _gm->_guiEnabled = false;
+ _vm->renderBox(0, 0, 320, 200, kColorBlack);
+ _vm->renderText("Geschwindigkeit: ", 50, 50, kColorLightYellow);
+ if (_gm->_state.time)
+ _vm->renderText("8000 hpm");
+ else
+ _vm->renderText("0 hpm");
+ _vm->renderText("Ziel: Arsano 3", 50, 70, kColorLightYellow);
+ _vm->renderText("Entfernung: ", 50, 90, kColorLightYellow);
+ _vm->renderText(Common::String::format("%d", _gm->_state.timeStarting / 7200000).c_str());
+ _vm->renderText(",");
+ c[0] = (_gm->_state.timeStarting / 720000) % 10 + '0';
+ _vm->renderText(c);
+ c[0] = (_gm->_state.timeStarting / 72000) % 10 + '0';
+ _vm->renderText(c);
+ _vm->renderText(" Lichtjahre");
+ _vm->renderText("Dauer der Reise bei momentaner Geschwindigkeit:", 50, 110, kColorLightYellow);
+ _vm->renderText(Common::String::format("%d", _gm->_state.timeStarting / 18000).c_str(), 50, 120, kColorLightYellow);
+ _vm->renderText(" Tage");
+
+ while (!_gm->_guiEnabled) {
+ _vm->updateEvents();
+ if (_gm->_key || _gm->_mouseClicked) {
+ _gm->_guiEnabled = true;
+ }
+ g_system->updateScreen();
+ g_system->delayMillis(_vm->_delay);
+ }
} else if ((verb == ACTION_USE) && (obj1._id == INSTRUMENTS))
_vm->renderMessage("Vergiá nicht, du bist nur der|Schiffskoch und hast keine Ahnung,|wie man ein Raumschiff fliegt.");
else
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 70015e4..d37069e 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -105,6 +105,7 @@ public:
SupernovaEngine *_vm;
uint16 _key;
Common::EventType _mouseClickType;
+ bool _mouseClicked;
int _mouseX;
int _mouseY;
int _mouseField;
@@ -114,6 +115,7 @@ public:
GameState _state;
int _status;
bool _processInput;
+ bool _guiEnabled;
Action _inputVerb;
Object *_currentInputObject;
Object *_inputObject[2];
Commit: 4227195a82098a095a310efbf71b83a63c97db3b
https://github.com/scummvm/scummvm/commit/4227195a82098a095a310efbf71b83a63c97db3b
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:28:29Z
Commit Message:
SUPERNOVA: Rewrites animation for Cockpit and SleepCabin
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 2a05471..41210d5 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -264,26 +264,26 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
void ShipSleepCabin::animation() {
static char color;
- if (isSectionVisible(kMaxSection - 1)) {
+ if (!_gm->_guiEnabled) {
if (color) {
color = kColorBlack;
- _gm->_timer2 = 5;
+ _gm->setAnimationTimer(5);
} else {
color = kColorLightYellow;
- _gm->_timer2 = 10;
+ _gm->setAnimationTimer(10);
}
_vm->renderText("Achtung: Triebwerke funktionsunfähig",50,145,color);
} else {
if (isSectionVisible(21)) {
_gm->drawImage(_gm->invertSection(21));
- _gm->_timer2 = 5;
+ _gm->setAnimationTimer(5);
} else {
_gm->drawImage(21);
- _gm->_timer2 = 10;
+ _gm->setAnimationTimer(10);
}
}
if (_gm->_state.powerOff) {
- if (isSectionVisible(kMaxSection - 1)) {
+ if (!_gm->_guiEnabled) {
_vm->renderText("Energievorrat erschöpft",97,165,color);
_vm->renderText("Notstromversorgung aktiv",97,175,color);
} else {
@@ -350,28 +350,28 @@ bool ShipCockpit::interact(Action verb, Object &obj1, Object &obj2) {
return true;
}
void ShipCockpit::animation() {
- static char color;
+ static byte color;
- if (isSectionVisible(kMaxSection - 1)) {
+ if (!_gm->_guiEnabled) {
if (color) {
- color = 0;
- _gm->_timer2 = 5;
+ color = kColorBlack;
+ _gm->setAnimationTimer(5);
} else {
- color = 14;
- _gm->_timer2 = 10;
+ color = kColorLightYellow;
+ _gm->setAnimationTimer(10);
}
_vm->renderText("Achtung: Triebwerke funktionsunfhig", 50, 145, color);
} else {
if (isSectionVisible(21)) {
_gm->drawImage(_gm->invertSection(21));
- _gm->_timer2 = 5;
+ _gm->setAnimationTimer(5);
} else {
_gm->drawImage(21);
- _gm->_timer2 = 10;
+ _gm->setAnimationTimer(10);
}
}
if (_gm->_state.powerOff) {
- if (isSectionVisible(kMaxSection - 1)) {
+ if (!_gm->_guiEnabled) {
_vm->renderText("Energievorrat erschpft", 97, 165, color);
_vm->renderText("Notstromversorgung aktiv", 97, 175, color);
} else {
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 2b79bb1..45a2069 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -560,6 +560,10 @@ void GameManager::wait2(int ticks) {
}
}
+void GameManager::setAnimationTimer(int ticks) {
+ _animationTimer = g_system->getMillis() + (55 * ticks);
+}
+
void GameManager::screenShake() {
// STUB
}
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index d37069e..79b8a8e 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -123,7 +123,7 @@ public:
bool _newRoom;
bool _newOverlay;
int _timer1;
- int _timer2;
+ int _animationTimer;
int _inventoryScroll;
int _exitList[25];
GuiElement _guiCommandButton[10];
@@ -169,6 +169,7 @@ public:
void drawImage(int section);
void changeRoom(RoomID id);
void resetInputState();
+ void setAnimationTimer(int ticks);
};
}
Commit: 97ef7cbe871791a48dbcaf3d0b983ff85afe3640
https://github.com/scummvm/scummvm/commit/97ef7cbe871791a48dbcaf3d0b983ff85afe3640
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:28:29Z
Commit Message:
SUERNOVA: Initializes missing rooms on startup
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 45a2069..8ee7cd5 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -158,37 +158,37 @@ GameManager::GameManager(SupernovaEngine *vm) {
_rooms[CABIN_L3] = new ShipCabinL3(vm, this);
_rooms[BATHROOM] = new ShipCabinBathroom(vm, this);
-// _rooms[ROCKS]
-// _rooms[CAVE]
-// _rooms[MEETUP]
-// _rooms[ENTRANCE]
-// _rooms[REST]
-// _rooms[ROGER]
-// _rooms[GLIDER]
-// _rooms[MEETUP2]
-// _rooms[MEETUP3]
-
-// _rooms[CELL]
-// _rooms[CORRIDOR1]
-// _rooms[CORRIDOR2]
-// _rooms[CORRIDOR3]
-// _rooms[CORRIDOR4]
-// _rooms[CORRIDOR5]
-// _rooms[CORRIDOR6]
-// _rooms[CORRIDOR7]
-// _rooms[CORRIDOR8]
-// _rooms[CORRIDOR9]
-// _rooms[BCORRIDOR]
-// _rooms[GUARD]
-// _rooms[GUARD3]
-// _rooms[OFFICE_L1]
-// _rooms[OFFICE_L2]
-// _rooms[OFFICE_R1]
-// _rooms[OFFICE_R2]
-// _rooms[OFFICE_L]
-// _rooms[ELEVATOR]
-// _rooms[STATION]
-// _rooms[SIGN]
+ _rooms[ROCKS] = new ArsanoRocks(vm, this);
+ _rooms[CAVE] = new ArsanoCave(vm, this);
+ _rooms[MEETUP] = new ArsanoMeetup(vm, this);
+ _rooms[ENTRANCE] = new ArsanoEntrance(vm, this);
+ _rooms[REST] = new ArsanoRemaining(vm, this);
+ _rooms[ROGER] = new ArsanoRoger(vm, this);
+ _rooms[GLIDER] = new ArsanoGlider(vm, this);
+ _rooms[MEETUP2] = new ArsanoMeetup2(vm, this);
+ _rooms[MEETUP3] = new ArsanoMeetup3(vm, this);
+
+ _rooms[CELL] = new AxacussCell(vm, this);
+ _rooms[CORRIDOR1] = new AxacussCorridor1(vm, this);
+ _rooms[CORRIDOR2] = new AxacussCorridor2(vm, this);
+ _rooms[CORRIDOR3] = new AxacussCorridor3(vm, this);
+ _rooms[CORRIDOR4] = new AxacussCorridor3(vm, this);
+ _rooms[CORRIDOR5] = new AxacussCorridor4(vm, this);
+ _rooms[CORRIDOR6] = new AxacussCorridor5(vm, this);
+ _rooms[CORRIDOR7] = new AxacussCorridor6(vm, this);
+ _rooms[CORRIDOR8] = new AxacussCorridor7(vm, this);
+ _rooms[CORRIDOR9] = new AxacussCorridor8(vm, this);
+ _rooms[BCORRIDOR] = new AxacussBcorridor(vm, this);
+ _rooms[GUARD] = new AxacussIntersection(vm, this);
+ _rooms[GUARD3] = new AxacussExit(vm, this);
+ _rooms[OFFICE_L1] = new AxacussOffice1(vm, this);
+ _rooms[OFFICE_L2] = new AxacussOffice2(vm, this);
+ _rooms[OFFICE_R1] = new AxacussOffice3(vm, this);
+ _rooms[OFFICE_R2] = new AxacussOffice4(vm, this);
+ _rooms[OFFICE_L] = new AxacussOffice5(vm, this);
+ _rooms[ELEVATOR] = new AxacussElevator(vm, this);
+ _rooms[STATION] = new AxacussStation(vm, this);
+ _rooms[SIGN] = new AxacussSign(vm, this);
_currentRoom = _rooms[INTRO];
_vm = vm;
Commit: 0462bd0184edf230b92e6513eb4f6ca0804ec73f
https://github.com/scummvm/scummvm/commit/0462bd0184edf230b92e6513eb4f6ca0804ec73f
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:29:34Z
Commit Message:
SUPERNOVA: Implements animation
The original game's time was stored in 55ms ticks but we just run on
milliseconds. setAnimationTimer() sets the ticks the currrent room's
animation() function will not be called.
Changed paths:
engines/supernova/state.cpp
engines/supernova/state.h
engines/supernova/supernova.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 8ee7cd5..9066ac4 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -118,11 +118,9 @@ void GuiElement::setHighlight(bool isHighlighted) {
}
-static const char *timeToString(int t) {
- // TODO: Does ScummVM emulate PIT timings for DOS?
-
- static char s[9];
- strcpy(s," 0:00:00");
+static Common::String timeToString(int t) {
+ char s[9] = " 0:00:00";
+ t /= 1000;
s[7] = t % 10 + '0';
t /= 10;
s[6] = t % 6 + '0';
@@ -134,9 +132,9 @@ static const char *timeToString(int t) {
s[1] = t % 10 + '0';
t /= 10;
if (t)
- s[0] = t+48;
+ s[0] = t + '0';
- return(s);
+ return Common::String(s);
}
GameManager::GameManager(SupernovaEngine *vm) {
@@ -197,8 +195,40 @@ GameManager::GameManager(SupernovaEngine *vm) {
Object::setObjectNull(_inputObject[1]);
_inputVerb = ACTION_WALK;
_processInput = false;
+ _guiEnabled = true;
+ _animationEnabled = true;
_mouseField = -1;
_inventoryScroll = 0;
+ _timer1 = 0;
+ _animationTimer = 0;
+
+ _state.time = 14200;
+ _state.timeSleep = 0;
+ _state.timeStarting = 50400000;
+ _state.timeAlarm = 25200000;
+ _state.timeAlarmSystem = _state.timeAlarm + _state.timeStarting;
+ _state.eventTime = 0xffffffff;
+ _state.shipEnergy = 2135;
+ _state.landingModuleEnergy = 923;
+ _state.greatF = 0;
+ _state.timeRobot = 0;
+ _state.money = 0;
+ _state.coins = 0;
+ _state.shoes = 0;
+ _state.nameSeen = 0;
+ _state.destination = 255;
+ _state.benOverlay = 0;
+ _state.language = 0;
+ _state.corridorSearch = false;
+ _state.alarmOn = false;
+ _state.terminalStripConnected = false;
+ _state.terminalStripWire = false;
+ _state.cableConnected = false;
+ _state.powerOff = false;
+ _state.cockpitSeen = false;
+ _state.airlockSeen = false;
+ _state.holdSeen = false;
+ _state.dream = false;
initGui();
}
@@ -218,7 +248,6 @@ void GameManager::initGui() {
x += width + 2;
}
- // Inventory + Inventory Arrows
for (int i = 0; i < ARRAYSIZE(_guiInventory); ++i) {
int x = 136 * (i % 2);
int y = 161 + 10 * (i / 2);
@@ -226,12 +255,9 @@ void GameManager::initGui() {
_guiInventory[i].setSize(x, y, x + 135, y + 9);
_guiInventory[i].setColor(kColorWhite25, kColorDarkRed, kColorWhite35, kColorRed);
}
-
- // Minimap
-
- // Status (?)
}
+
void GameManager::processInput(Common::KeyState &state) {
switch (state.keycode) {
case Common::KEYCODE_F1:
@@ -267,27 +293,28 @@ void GameManager::resetInputState() {
Object::setObjectNull(_inputObject[1]);
_inputVerb = ACTION_WALK;
_processInput = false;
+ _mouseClicked = false;
+ _key = 0;
+ _mouseClickType = Common::EVENT_MOUSEMOVE;
- processInput(Common::EVENT_MOUSEMOVE, _mouseX, _mouseY);
+ processInput();
}
-void GameManager::processInput(Common::EventType eventType, int x, int y) {
- _mouseClickType = eventType;
- _mouseX = x;
- _mouseY = y;
-
+void GameManager::processInput() {
if (_mouseClickType == Common::EVENT_LBUTTONUP) {
_vm->removeMessage();
if (((_mouseField >= 0) && (_mouseField < 256)) ||
((_mouseField >= 512) && (_mouseField < 768))) {
if (_inputVerb == ACTION_GIVE || _inputVerb == ACTION_USE) {
- // TODO: There are cases where here is no second object needed
- // for example, putting on the space suit
- if (Object::isNullObject(_inputObject[0]))
+ if (Object::isNullObject(_inputObject[0])) {
_inputObject[0] = _currentInputObject;
- else
+ if (!_inputObject[0]->hasProperty(COMBINABLE))
+ _processInput = true;
+ } else {
_inputObject[1] = _currentInputObject;
+ _processInput = true;
+ }
} else {
_inputObject[0] = _currentInputObject;
if (!Object::isNullObject(_currentInputObject))
@@ -296,12 +323,11 @@ void GameManager::processInput(Common::EventType eventType, int x, int y) {
} else if (_mouseField >= 256 && _mouseField < 512) {
resetInputState();
_inputVerb = static_cast<Action>(_mouseField - 256);
- drawStatus();
} else if (_mouseField == 768) {
- if (_inventoryScroll >= 0)
- --_inventoryScroll;
+ if (_inventoryScroll >= 2)
+ _inventoryScroll -= 2;
} else if (_mouseField == 769) {
- ++_inventoryScroll;
+ _inventoryScroll += 2;
}
} else if (_mouseClickType == Common::EVENT_RBUTTONUP) {
_vm->removeMessage();
@@ -334,40 +360,40 @@ void GameManager::processInput(Common::EventType eventType, int x, int y) {
int click = -1;
/* command row? */
- if ((y >= _guiCommandButton[0].top) && (y <= _guiCommandButton[0].bottom)) {
+ if ((_mouseY >= _guiCommandButton[0].top) && (_mouseY <= _guiCommandButton[0].bottom)) {
field = 9;
- while (x < _guiCommandButton[field].left - 1)
+ while (_mouseX < _guiCommandButton[field].left - 1)
field--;
field += 256;
}
/* exit box? */
- else if ((x >= 283) && (x <= 317) && (y >= 163) && (y <= 197)) {
- field = _exitList[(x - 283) / 7 + 5 * ((y - 163) / 7)];
+ else if ((_mouseX >= 283) && (_mouseX <= 317) && (_mouseY >= 163) && (_mouseY <= 197)) {
+ field = _exitList[(_mouseX - 283) / 7 + 5 * ((_mouseY - 163) / 7)];
}
/* inventory box */
- else if ((y >= 161) && (x <= 270)) {
- field = (x + 1) / 136 + ((y - 161) / 10) * 2;
+ else if ((_mouseY >= 161) && (_mouseX <= 270)) {
+ field = (_mouseX + 1) / 136 + ((_mouseY - 161) / 10) * 2;
if (field + _inventoryScroll < _inventory.getSize())
field += 512;
else
field = -1;
}
/* inventory arrows */
- else if ((y >= 161) && (x >= 271) && (x < 279)) {
- if (y > 180)
+ else if ((_mouseY >= 161) && (_mouseX >= 271) && (_mouseX < 279)) {
+ if (_mouseY > 180)
field = 769;
else
field = 768;
}
/* normal item */
else {
- for (int i = 0; (_currentRoom->getObject(i)->_name[0] != '\0') && (field == -1); i++) {
+ for (int i = 0; (_currentRoom->getObject(i)->_name[0] != '\0') && (field == -1) && i < kMaxObject; i++) {
click = _currentRoom->getObject(i)->_click;
if (click != 255) {
MSNImageDecoder::ClickField *clickField = _vm->_currentImage->_clickField;
do {
- if ((x >= clickField[click].x1) && (x <= clickField[click].x2) &&
- (y >= clickField[click].y1) && (y <= clickField[click].y2))
+ if ((_mouseX >= clickField[click].x1) && (_mouseX <= clickField[click].x2) &&
+ (_mouseY >= clickField[click].y1) && (_mouseY <= clickField[click].y2))
field = i;
click = clickField[click].next;
@@ -402,7 +428,7 @@ void GameManager::processInput(Common::EventType eventType, int x, int y) {
}
}
- drawStatus();
+// drawStatus();
}
}
@@ -515,6 +541,7 @@ void GameManager::mouseInput() {
void GameManager::mouseInput2() {
// STUB
+ // If animation off and timer expired, skip room animation
}
void GameManager::mouseInput3() {
@@ -564,6 +591,12 @@ void GameManager::setAnimationTimer(int ticks) {
_animationTimer = g_system->getMillis() + (55 * ticks);
}
+void GameManager::handleTime() {
+ _state.time = g_system->getMillis();
+ if (_animationTimer <= _state.time)
+ _animationTimer = 0;
+}
+
void GameManager::screenShake() {
// STUB
}
@@ -605,11 +638,11 @@ void GameManager::drawMapExits() {
}
void GameManager::animationOff() {
- // STUB
+ _animationEnabled = false;
}
void GameManager::animationOn() {
- // STUB
+ _animationEnabled = true;
}
void GameManager::edit(char *text, int x, int y, int length) {
@@ -622,8 +655,8 @@ void GameManager::loadOverlayStart() {
void GameManager::drawStatus() {
int index = static_cast<int>(_inputVerb);
- _vm->renderBox(0, 140, 320, 9, HGR_BEF_ANZ);
- _vm->renderText(guiStatusCommand_DE[index], 1, 141, COL_BEF_ANZ);
+ _vm->renderBox(0, 140, 320, 9, kColorWhite25);
+ _vm->renderText(guiStatusCommand_DE[index], 1, 141, kColorDarkGreen);
if (Object::isNullObject(_inputObject[0])) {
_vm->renderText(_currentInputObject->_name);
@@ -642,7 +675,7 @@ void GameManager::drawStatus() {
}
void GameManager::openLocker(const Room *room, Object *obj, Object *lock, int section) {
- _vm->renderImage(room->getFileNumber(), section);
+ drawImage(section);
obj->setProperty(OPENED);
lock->_click = 255;
int i = obj->_click;
@@ -651,7 +684,16 @@ void GameManager::openLocker(const Room *room, Object *obj, Object *lock, int se
}
void GameManager::closeLocker(const Room *room, Object *obj, Object *lock, int section) {
- // STUB
+ if (!obj->hasProperty(OPENED)) {
+ _vm->renderMessage("Das ist schon geschlossen.");
+ } else {
+ drawImage(invertSection(section));
+ obj->disableProperty(OPENED);
+ lock->_click = lock->_click2;
+ int i = obj->_click;
+ obj->_click = obj->_click2;
+ obj->_click2 = i;
+ }
}
int GameManager::invertSection(int section) {
@@ -741,8 +783,8 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
"Es ist eine Uhr mit extra|lautem Wecker. "
"Sie hat einen|Knopf zum Verstellen der Alarmzeit.|"
"Uhrzeit: %s Alarmzeit: %s",
- timeToString(_vm->getDOSTicks() - _state.timeStarting),
- timeToString(_state.timeAlarm)).c_str());
+ timeToString(_state.time + _state.timeStarting).c_str(),
+ timeToString(_state.timeAlarm).c_str()).c_str());
} else if ((verb == ACTION_PRESS) && (obj1._id == WATCH)) {
char *min;
int hours, minutes;
@@ -930,26 +972,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
return true;
}
-void GameManager::executeRoom() {
- if (!_vm->_messageDisplayed)
- _vm->renderRoom(*_currentRoom);
- drawMapExits();
- drawInventory();
- drawStatus();
- drawCommandBox();
-
- animationOn();
- roomBrightness();
- if (_vm->_brightness == 0)
- _vm->paletteFadeIn();
- else
- _vm->paletteBrightness();
- if (!_currentRoom->hasSeen())
- _currentRoom->onEntrance();
-
- if (_vm->_messageDisplayed || !_processInput)
- return;
-
+void GameManager::handleInput() {
bool validCommand = genericInteract(_inputVerb, *_inputObject[0], *_inputObject[1]);
if (!validCommand)
validCommand = _currentRoom->interact(_inputVerb, *_inputObject[0], *_inputObject[1]);
@@ -1039,17 +1062,35 @@ void GameManager::executeRoom() {
// This is not possible.
_vm->renderMessage("Das geht nicht.");
}
+ }
+}
- if (_newOverlay) {
- loadOverlayStart();
- _newOverlay = false;
- }
- if (_newRoom) {
- _newRoom = false;
+void GameManager::executeRoom() {
+ if (_guiEnabled) {
+ if (!_vm->_messageDisplayed) {
+ g_system->fillScreen(kColorBlack);
+ _vm->renderRoom(*_currentRoom);
}
+ drawMapExits();
+ drawInventory();
+ drawStatus();
+ drawCommandBox();
+ }
+ roomBrightness();
+ if (_vm->_brightness == 0)
+ _vm->paletteFadeIn();
+ else
+ _vm->paletteBrightness();
+ if (!_currentRoom->hasSeen())
+ _currentRoom->onEntrance();
+
+ if (!_guiEnabled || !_processInput || _vm->_messageDisplayed) {
+
+ } else {
+ handleInput();
+ resetInputState();
}
- resetInputState();
}
}
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 79b8a8e..ced1de6 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -99,7 +99,7 @@ public:
GameManager(SupernovaEngine *vm);
void processInput(Common::KeyState &state);
- void processInput(Common::EventType eventType, int x, int y);
+ void processInput();
void executeRoom();
SupernovaEngine *_vm;
@@ -116,6 +116,7 @@ public:
int _status;
bool _processInput;
bool _guiEnabled;
+ bool _animationEnabled;
Action _inputVerb;
Object *_currentInputObject;
Object *_inputObject[2];
@@ -169,6 +170,8 @@ public:
void drawImage(int section);
void changeRoom(RoomID id);
void resetInputState();
+ void handleInput();
+ void handleTime();
void setAnimationTimer(int ticks);
};
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index b5e674d..e1293c4 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -167,6 +167,11 @@ int SupernovaEngine::getDOSTicks() {
}
void SupernovaEngine::updateEvents() {
+ _gm->handleTime();
+ if (_gm->_animationEnabled && _gm->_animationTimer == 0)
+ _gm->_currentRoom->animation();
+
+ _gm->_mouseClicked = false;
while (g_system->getEventManager()->pollEvent(_event)) {
switch (_event.type) {
case Common::EVENT_QUIT:
@@ -193,8 +198,13 @@ void SupernovaEngine::updateEvents() {
// fallthrough
case Common::EVENT_RBUTTONUP:
// fallthrough
+ _gm->_mouseClicked = true;
case Common::EVENT_MOUSEMOVE:
- _gm->processInput(_event.type, _event.mouse.x, _event.mouse.y);
+ _gm->_mouseClickType = _event.type;
+ _gm->_mouseX = _event.mouse.x;
+ _gm->_mouseY = _event.mouse.y;
+ if (_gm->_guiEnabled)
+ _gm->processInput();
break;
default:
Commit: 2ff15f37ebe34785aec6e065611a3871544c3f37
https://github.com/scummvm/scummvm/commit/2ff15f37ebe34785aec6e065611a3871544c3f37
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:29:34Z
Commit Message:
SUPERNOVA: Gets input before drawing calls;
Before the status line would show invalid input for a frame what was
especially annoying during animations, as they currently tend to block the game
loop for their duration.
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 9066ac4..cb08c7b 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1066,6 +1066,11 @@ void GameManager::handleInput() {
}
void GameManager::executeRoom() {
+ if (_processInput && !_vm->_messageDisplayed && _guiEnabled) {
+ handleInput();
+ resetInputState();
+ }
+
if (_guiEnabled) {
if (!_vm->_messageDisplayed) {
g_system->fillScreen(kColorBlack);
@@ -1083,14 +1088,6 @@ void GameManager::executeRoom() {
_vm->paletteBrightness();
if (!_currentRoom->hasSeen())
_currentRoom->onEntrance();
-
- if (!_guiEnabled || !_processInput || _vm->_messageDisplayed) {
-
- } else {
- handleInput();
- resetInputState();
- }
-
}
}
Commit: cf98468c32707d3fa93fa636dc78c151b3f8eb44
https://github.com/scummvm/scummvm/commit/cf98468c32707d3fa93fa636dc78c151b3f8eb44
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:29:34Z
Commit Message:
SUPERNOVA: Removes shadowing of variables
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index cb08c7b..42e1db9 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -234,25 +234,25 @@ GameManager::GameManager(SupernovaEngine *vm) {
}
void GameManager::initGui() {
- int x = 0;
+ int commandButtonX = 0;
for (int i = 0; i < ARRAYSIZE(_guiCommandButton); ++i) {
int width;
if (i < 9)
width = _vm->textWidth(guiCommand_DE[i]) + 2;
else
- width = 320 - x;
+ width = 320 - commandButtonX;
- _guiCommandButton[i].setSize(x, 150, x + width, 159);
+ _guiCommandButton[i].setSize(commandButtonX, 150, commandButtonX + width, 159);
_guiCommandButton[i].setText(guiCommand_DE[i]);
_guiCommandButton[i].setColor(kColorWhite25, kColorDarkGreen, kColorWhite44, kColorGreen);
- x += width + 2;
+ commandButtonX += width + 2;
}
for (int i = 0; i < ARRAYSIZE(_guiInventory); ++i) {
- int x = 136 * (i % 2);
- int y = 161 + 10 * (i / 2);
+ int inventoryX = 136 * (i % 2);
+ int inventoryY = 161 + 10 * (i / 2);
- _guiInventory[i].setSize(x, y, x + 135, y + 9);
+ _guiInventory[i].setSize(inventoryX, inventoryY, inventoryX + 135, inventoryY + 9);
_guiInventory[i].setColor(kColorWhite25, kColorDarkRed, kColorWhite35, kColorRed);
}
}
Commit: afb873c032af084958b3ec7227ed641392eff380
https://github.com/scummvm/scummvm/commit/afb873c032af084958b3ec7227ed641392eff380
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:29:34Z
Commit Message:
SUPERNOVA: Adjusts game loop delay
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index e1293c4..cde54ab 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -143,11 +143,14 @@ Common::Error SupernovaEngine::run() {
CursorMan.showMouse(true);
while (_gameRunning) {
+ uint32 start = _system->getMillis();
updateEvents();
_gm->executeRoom();
_console->onFrame();
_system->updateScreen();
- _system->delayMillis(_delay);
+ int end = _delay - (_system->getMillis() - start);
+ if (end > 0)
+ _system->delayMillis(end);
}
//deinit timer/sound/..
Commit: 5dce4bc874a9befa3160e0f23bb3ea814f164327
https://github.com/scummvm/scummvm/commit/5dce4bc874a9befa3160e0f23bb3ea814f164327
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:29:34Z
Commit Message:
SUPERNOVA: Converts char game state variables to byte
Changed paths:
engines/supernova/state.h
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index ced1de6..2072d91 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -40,12 +40,12 @@ struct GameState {
uint16 greatF;
int16 timeRobot;
int16 money;
- char coins;
- char shoes;
- char nameSeen;
- char destination;
- char benOverlay;
- char language;
+ byte coins;
+ byte shoes;
+ byte nameSeen;
+ byte destination;
+ byte benOverlay;
+ byte language;
bool corridorSearch;
bool alarmOn;
bool terminalStripConnected;
Commit: bcd32509bb3b27073d57e2e9e4a4d0bcf7743403
https://github.com/scummvm/scummvm/commit/bcd32509bb3b27073d57e2e9e4a4d0bcf7743403
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:29:34Z
Commit Message:
SUPERNOVA: Implements 'wait for input'
Currrently the only implemented scene that uses this function is looking
at the monitor in the cockpit. Depending on use cases in other scenes
the function needs to be extended.
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 42e1db9..4fb856a 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -540,8 +540,15 @@ void GameManager::mouseInput() {
}
void GameManager::mouseInput2() {
- // STUB
- // If animation off and timer expired, skip room animation
+ while (true) {
+ _vm->updateEvents();
+ // TODO: handle key input (e.g. alt+x, F-keys?)
+ if (_mouseClicked || _key) {
+ break;
+ }
+ g_system->updateScreen();
+ g_system->delayMillis(_vm->_delay);
+ }
}
void GameManager::mouseInput3() {
Commit: 18c3647a63281a578b84d656986fbc488dcf72f1
https://github.com/scummvm/scummvm/commit/18c3647a63281a578b84d656986fbc488dcf72f1
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:29:35Z
Commit Message:
SUPERNOVA: Updates NOTES
Changed paths:
engines/supernova/NOTES
diff --git a/engines/supernova/NOTES b/engines/supernova/NOTES
index 7176655..909f4eb 100644
--- a/engines/supernova/NOTES
+++ b/engines/supernova/NOTES
@@ -5,9 +5,9 @@ There may be several sound effects in one file.
This list shows them and their offsets.
46:
- 0 - Voice "Halt!"
- 2510 -
- 4020 -
+ 0 - Voice "Halt!"
+ 2510 -
+ 4020 -
47:
0 - Voice "Mission Supernova"
@@ -50,6 +50,9 @@ Dimensions
Exit Maps: (283, 163) (317, 197)
+timer2 == animation timer
+
+
Text
-------
AE - 216 ae - 204
Commit: 678c10ea5504495588e88c2dbc3807aa58e3d4c7
https://github.com/scummvm/scummvm/commit/678c10ea5504495588e88c2dbc3807aa58e3d4c7
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:29:35Z
Commit Message:
SUPERNOVA: Corrects typo
Changed paths:
engines/supernova/msn_def.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 1c89a07..0d92799 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -124,7 +124,7 @@ const int kColorCursorTransparent = kColorWhite25;
#define HGR_NAME kColorDarkBlue
#define COL_NAME kColorLightRed
-#define HGR_EDIT kcolorDarkBlue
+#define HGR_EDIT kColorDarkBlue
#define COL_EDIT kColorWhite99
Commit: 160ff13934c3013479e6106cc7df0528681af2ae
https://github.com/scummvm/scummvm/commit/160ff13934c3013479e6106cc7df0528681af2ae
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:29:35Z
Commit Message:
SUPERNOVA: Fixes object indices in room definition
Changed paths:
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 4544cad..5db3dcf 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -1001,7 +1001,7 @@ public:
_shown[24] = true;
_objectState[0] = Object("Ausgang",Object::defaultDescription,DOOR,EXIT,2,2,0,NULLROOM,2);
- _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR6,22);
+ _objectState[1] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR6,22);
}
virtual void onEntrance();
@@ -1042,8 +1042,8 @@ public:
_shown[25] = true;
_objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR5,2);
- _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR7,22);
- _objectState[0] = Object("Tür",Object::defaultDescription,DOOR,OPENABLE|CLOSED,255,255,0,CORRIDOR8,13);
+ _objectState[1] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR7,22);
+ _objectState[2] = Object("Tür",Object::defaultDescription,DOOR,OPENABLE|CLOSED,255,255,0,CORRIDOR8,13);
}
virtual void onEntrance();
@@ -1084,7 +1084,7 @@ public:
_shown[25] = true;
_objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR6,2);
- _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,GUARD,22);
+ _objectState[1] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,GUARD,22);
}
virtual void onEntrance();
@@ -1127,7 +1127,7 @@ public:
_shown[28] = true;
_objectState[0] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE,0,0,0,CORRIDOR6,10);
- _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,BCORRIDOR,22);
+ _objectState[1] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,BCORRIDOR,22);
}
virtual void onEntrance();
@@ -1171,7 +1171,7 @@ public:
_shown[28] = true;
_objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,BCORRIDOR,2);
- _objectState[0] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE,0,0,0,GUARD,10);
+ _objectState[1] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE,0,0,0,GUARD,10);
}
virtual void onEntrance();
@@ -1303,10 +1303,10 @@ public:
_shown[16] = true;
_objectState[0] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,9,BCORRIDOR,9);
- _objectState[0] = Object("Computer",Object::defaultDescription,COMPUTER,COMBINABLE,4,4,0);
- _objectState[0] = Object("Würfel","Sonderbar!",NULLOBJECT,NULLTYPE,0,0,0);
- _objectState[0] = Object("Bild","Affenstark!",NULLOBJECT,NULLTYPE,1,1,0);
- _objectState[0] = Object("Komisches Ding","Wundersam!",NULLOBJECT,UNNECESSARY,2,2,0);
+ _objectState[1] = Object("Computer",Object::defaultDescription,COMPUTER,COMBINABLE,4,4,0);
+ _objectState[2] = Object("Würfel","Sonderbar!",NULLOBJECT,NULLTYPE,0,0,0);
+ _objectState[3] = Object("Bild","Affenstark!",NULLOBJECT,NULLTYPE,1,1,0);
+ _objectState[4] = Object("Komisches Ding","Wundersam!",NULLOBJECT,UNNECESSARY,2,2,0);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
Commit: 0fdb3d8d10e0347a647cb0529c399bd74b9d8350
https://github.com/scummvm/scummvm/commit/0fdb3d8d10e0347a647cb0529c399bd74b9d8350
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:29:35Z
Commit Message:
SUPERNOVA: Extends text rendering
textWidth() and renderText() are overloaded for handling single uint16
characters (useful when rendering key strokes directly)
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index cde54ab..d11f856 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -362,6 +362,11 @@ void SupernovaEngine::renderRoom(Room &room) {
}
}
+int SupernovaEngine::textWidth(const uint16 key) {
+ const char text[2] = {key & 0xFF, 0};
+ return textWidth(text);
+}
+
int SupernovaEngine::textWidth(const char *text) {
int charWidth = 0;
while (*text != '\0') {
@@ -502,10 +507,20 @@ void SupernovaEngine::renderText(const char *text, int x, int y, byte color) {
_textColor = color;
}
+void SupernovaEngine::renderText(const uint16 character, int x, int y, byte color) {
+ char text[2] = {character & 0xFF, 0};
+ renderText(text, x, y, color);
+}
+
void SupernovaEngine::renderText(const char *text) {
renderText(text, _textCursorX, _textCursorY, _textColor);
}
+void SupernovaEngine::renderText(const uint16 character) {
+ char text[2] = {character & 0xFF, 0};
+ renderText(text, _textCursorX, _textCursorY, _textColor);
+}
+
void SupernovaEngine::renderBox(int x, int y, int width, int height, byte color) {
Graphics::Surface *screen = _system->lockScreen();
screen->fillRect(Common::Rect(x, y, x + width, y + height), color);
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 86d5d81..eef3c9d 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -109,6 +109,7 @@ public:
int getDOSTicks();
int textWidth(const char *text);
+ int textWidth(const uint16 key);
void initData();
void initPalette();
void paletteFadeIn();
@@ -126,7 +127,9 @@ public:
void renderMessage(const char *text, MessagePosition position = kMessageNormal);
void removeMessage();
void renderText(const char *text, int x, int y, byte color);
+ void renderText(const uint16 character, int x, int y, byte color);
void renderText(const char *text);
+ void renderText(const uint16 character);
void renderBox(int x, int y, int width, int height, byte color);
void setColor63(byte value);
void command_print();
Commit: 30e138dcfa3f154f03a41f6bbb1a6e2838f6d568
https://github.com/scummvm/scummvm/commit/30e138dcfa3f154f03a41f6bbb1a6e2838f6d568
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T00:29:35Z
Commit Message:
SUPERNOVA: Adds indicator for key presses
Changed paths:
engines/supernova/state.cpp
engines/supernova/state.h
engines/supernova/supernova.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 4fb856a..9bfc474 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -295,6 +295,7 @@ void GameManager::resetInputState() {
_processInput = false;
_mouseClicked = false;
_key = 0;
+ _keyPressed = false;
_mouseClickType = Common::EVENT_MOUSEMOVE;
processInput();
@@ -543,7 +544,7 @@ void GameManager::mouseInput2() {
while (true) {
_vm->updateEvents();
// TODO: handle key input (e.g. alt+x, F-keys?)
- if (_mouseClicked || _key) {
+ if (_mouseClicked || _keyPressed) {
break;
}
g_system->updateScreen();
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 2072d91..2c61e15 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -106,6 +106,7 @@ public:
uint16 _key;
Common::EventType _mouseClickType;
bool _mouseClicked;
+ bool _keyPressed;
int _mouseX;
int _mouseY;
int _mouseField;
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index d11f856..ff2211c 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -175,6 +175,7 @@ void SupernovaEngine::updateEvents() {
_gm->_currentRoom->animation();
_gm->_mouseClicked = false;
+ _gm->_keyPressed = false;
while (g_system->getEventManager()->pollEvent(_event)) {
switch (_event.type) {
case Common::EVENT_QUIT:
@@ -183,6 +184,7 @@ void SupernovaEngine::updateEvents() {
break;
case Common::EVENT_KEYDOWN:
+ _gm->_keyPressed = true;
if (_event.kbd.keycode == Common::KEYCODE_d &&
(_event.kbd.flags & Common::KBD_CTRL)) {
_console->attach();
Commit: 99d7e7c1f6e69afc5cf89b0ae8edacf687bc12b2
https://github.com/scummvm/scummvm/commit/99d7e7c1f6e69afc5cf89b0ae8edacf687bc12b2
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:01:10Z
Commit Message:
SUPERNOVA: Input handling
GetKeyInput/MouseInput/Input() block until the expected input happens.
GetKeyInput() takes a parameter that checks if the key input is a
'printable' character, backspace, delete, return or escape.
Also, the key state is now stored instead of just the ascii value of the
pressed key.
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 41210d5..484a44f 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -102,34 +102,35 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
Room *r;
if (((verb == ACTION_LOOK) || (verb == ACTION_USE)) && (obj1._id == COMPUTER)) {
- setSectionVisible(kMaxSection - 1, true);
+ _gm->_guiEnabled = false;
setSectionVisible(4, false);
- _vm->renderBox(0,0,320,200,kColorDarkBlue);
+ g_system->fillScreen(kColorDarkBlue);
if (_gm->_state.time == 0) {
// Destination reached
_vm->renderText("Flugziel erreicht", 60, 95, kColorWhite99);
- _gm->mouseInput2();
+ _gm->getInput();
} else if (_gm->_state.powerOff) {
// Energy depleted
- _vm->renderText("Energie erschöpft",60,95,kColorWhite99);
+ _vm->renderText("Energie erschöpft", 60, 95, kColorWhite99);
// Artificial coma interrupted
- _vm->renderText("Tiefschlafprozess abgebrochen",60,115,kColorWhite99);
- _gm->mouseInput2();
+ _vm->renderText("Tiefschlafprozess abgebrochen", 60, 115, kColorWhite99);
+ _gm->getInput();
} else if (isSectionVisible(5)) {
// Sleep duration in days
- _vm->renderText("Schlafdauer in Tagen:",30,85,kColorWhite99);
+ _vm->renderText("Schlafdauer in Tagen:", 30, 85, kColorWhite99);
_vm->renderText(Common::String::format("%d",_gm->_state.timeSleep).c_str(),
- 150,85,kColorWhite99);
+ 150, 85, kColorWhite99);
_vm->renderText("Bitte legen Sie sich in die angezeigte Schlafkammer.",
- 30,105,kColorWhite99);
- _gm->mouseInput2();
+ 30, 105, kColorWhite99);
+ _gm->getInput();
} else {
- _vm->renderText("Bitte Passwort eingeben:",100,85,kColorWhite99);
+ _vm->renderText("Bitte Passwort eingeben:", 100, 85, kColorWhite99);
input[0] = 0;
do {
- _gm->edit(input,100,105,30);
- } while ((_gm->_key != Common::ASCII_RETURN) && (_gm->_key != Common::ASCII_ESCAPE));
- if (_gm->_key == Common::ASCII_ESCAPE) {
+ _gm->edit(input, 100, 105, 30);
+ } while ((_gm->_key.keycode != Common::KEYCODE_RETURN) &&
+ (_gm->_key.keycode != Common::KEYCODE_ESCAPE));
+ if (_gm->_key.keycode == Common::KEYCODE_ESCAPE) {
goto escape;
}
for (int i = 0; i < 30; ++i) {
@@ -138,20 +139,21 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
}
}
if (strcmp(input,codeword_DE) != 0) {
- _vm->renderText("Falsches Passwort",100,125,kColorLightRed);
+ _vm->renderText("Falsches Passwort", 100, 125, kColorLightRed);
_gm->wait2(18);
goto escape;
}
_gm->great(6);
- _vm->renderBox(0,0,320,200,kColorDarkBlue);
- _vm->renderText("Schlafdauer in Tagen:",30,85,kColorWhite99);
+ _vm->renderBox(0, 0, 320, 200, kColorDarkBlue);
+ _vm->renderText("Schlafdauer in Tagen:", 30, 85, kColorWhite99);
do {
- _vm->renderBox(150,85,150,8,kColorDarkBlue);
+ _vm->renderBox(150, 85, 150, 8, kColorDarkBlue);
input[0] = 0;
do {
- _gm->edit(input,150,85,10);
- } while ((_gm->_key != Common::ASCII_RETURN) && (_gm->_key != Common::ASCII_ESCAPE));
- if (_gm->_key == Common::ASCII_ESCAPE) {
+ _gm->edit(input, 150, 85, 10);
+ } while ((_gm->_key.keycode != Common::KEYCODE_RETURN) &&
+ (_gm->_key.keycode != Common::KEYCODE_ESCAPE));
+ if (_gm->_key.keycode == Common::KEYCODE_ESCAPE) {
goto escape;
}
l = atol(input);
@@ -171,7 +173,7 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
_gm->showMenu();
_gm->drawMapExits();
_gm->palette();
- setSectionVisible(kMaxSection - 1, false);
+ _gm->_guiEnabled = true;
} else if (((verb == ACTION_WALK) || (verb == ACTION_USE)) &&
((obj1._id == CABINS) || (obj1._id == CABIN))) {
r = _gm->_rooms[AIRLOCK];
@@ -315,33 +317,27 @@ bool ShipCockpit::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_LOOK) && (obj1._id == MONITOR)) {
_gm->_guiEnabled = false;
- _vm->renderBox(0, 0, 320, 200, kColorBlack);
- _vm->renderText("Geschwindigkeit: ", 50, 50, kColorLightYellow);
- if (_gm->_state.time)
- _vm->renderText("8000 hpm");
- else
- _vm->renderText("0 hpm");
- _vm->renderText("Ziel: Arsano 3", 50, 70, kColorLightYellow);
- _vm->renderText("Entfernung: ", 50, 90, kColorLightYellow);
- _vm->renderText(Common::String::format("%d", _gm->_state.timeStarting / 7200000).c_str());
- _vm->renderText(",");
- c[0] = (_gm->_state.timeStarting / 720000) % 10 + '0';
- _vm->renderText(c);
- c[0] = (_gm->_state.timeStarting / 72000) % 10 + '0';
- _vm->renderText(c);
- _vm->renderText(" Lichtjahre");
- _vm->renderText("Dauer der Reise bei momentaner Geschwindigkeit:", 50, 110, kColorLightYellow);
- _vm->renderText(Common::String::format("%d", _gm->_state.timeStarting / 18000).c_str(), 50, 120, kColorLightYellow);
- _vm->renderText(" Tage");
-
- while (!_gm->_guiEnabled) {
- _vm->updateEvents();
- if (_gm->_key || _gm->_mouseClicked) {
- _gm->_guiEnabled = true;
- }
- g_system->updateScreen();
- g_system->delayMillis(_vm->_delay);
- }
+ _vm->renderBox(0, 0, 320, 200, kColorBlack);
+ _vm->renderText("Geschwindigkeit: ", 50, 50, kColorLightYellow);
+ if (_gm->_state.time)
+ _vm->renderText("8000 hpm");
+ else
+ _vm->renderText("0 hpm");
+ _vm->renderText("Ziel: Arsano 3", 50, 70, kColorLightYellow);
+ _vm->renderText("Entfernung: ", 50, 90, kColorLightYellow);
+ _vm->renderText(Common::String::format("%d", _gm->_state.timeStarting / 7200000).c_str());
+ _vm->renderText(",");
+ c[0] = (_gm->_state.timeStarting / 720000) % 10 + '0';
+ _vm->renderText(c);
+ c[0] = (_gm->_state.timeStarting / 72000) % 10 + '0';
+ _vm->renderText(c);
+ _vm->renderText(" Lichtjahre");
+ _vm->renderText("Dauer der Reise bei momentaner Geschwindigkeit:", 50, 110, kColorLightYellow);
+ _vm->renderText(Common::String::format("%d", _gm->_state.timeStarting / 18000).c_str(), 50, 120, kColorLightYellow);
+ _vm->renderText(" Tage");
+
+ _gm->getInput();
+ _gm->_guiEnabled = true;
} else if ((verb == ACTION_USE) && (obj1._id == INSTRUMENTS))
_vm->renderMessage("Vergiá nicht, du bist nur der|Schiffskoch und hast keine Ahnung,|wie man ein Raumschiff fliegt.");
else
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 9bfc474..7548f92 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -259,6 +259,8 @@ void GameManager::initGui() {
void GameManager::processInput(Common::KeyState &state) {
+ _key = state;
+
switch (state.keycode) {
case Common::KEYCODE_F1:
// help
@@ -279,12 +281,10 @@ void GameManager::processInput(Common::KeyState &state) {
if (state.flags & Common::KBD_ALT) {
// quit game
_vm->_gameRunning = false;
- } else {
- _key = state.ascii;
}
break;
default:
- _key = state.ascii;
+ break;
}
}
@@ -294,8 +294,8 @@ void GameManager::resetInputState() {
_inputVerb = ACTION_WALK;
_processInput = false;
_mouseClicked = false;
- _key = 0;
_keyPressed = false;
+ _key.reset();
_mouseClickType = Common::EVENT_MOUSEMOVE;
processInput();
@@ -536,11 +536,44 @@ void GameManager::drawInventory() {
_vm->renderBox(272, 181, 7, 19, HGR_INV);
}
-void GameManager::mouseInput() {
- // STUB
+uint16 GameManager::getKeyInput(bool blockForPrintChar) {
+ while (true) {
+ _vm->updateEvents();
+ // TODO: Check for valid ascii
+ if (_keyPressed) {
+ if (blockForPrintChar) {
+ if (Common::isPrint(_key.keycode) ||
+ _key.keycode == Common::KEYCODE_BACKSPACE ||
+ _key.keycode == Common::KEYCODE_DELETE ||
+ _key.keycode == Common::KEYCODE_RETURN ||
+ _key.keycode == Common::KEYCODE_SPACE ||
+ _key.keycode == Common::KEYCODE_ESCAPE) {
+ if (_key.flags & Common::KBD_SHIFT)
+ return toupper(_key.ascii);
+ else
+ return tolower(_key.ascii);
+ }
+ } else {
+ return _key.ascii;
+ }
+ }
+ g_system->updateScreen();
+ g_system->delayMillis(_vm->_delay);
+ }
}
-void GameManager::mouseInput2() {
+Common::EventType GameManager::getMouseInput() {
+ while (true) {
+ _vm->updateEvents();
+ if (_mouseClicked) {
+ return _mouseClickType;
+ }
+ g_system->updateScreen();
+ g_system->delayMillis(_vm->_delay);
+ }
+}
+
+void GameManager::getInput() {
while (true) {
_vm->updateEvents();
// TODO: handle key input (e.g. alt+x, F-keys?)
@@ -552,10 +585,10 @@ void GameManager::mouseInput2() {
}
}
+// TODO: Unify mouseInput3 and mouseWait with getMouseInput
void GameManager::mouseInput3() {
// STUB
}
-
void GameManager::mouseWait(int delay) {
// STUB
}
@@ -629,7 +662,7 @@ void GameManager::showMenu() {
}
void GameManager::drawMapExits() {
- // TODO: Preload _exitList on room entry instead on every call
+// TODO: Preload _exitList on room entry instead on every call
_vm->renderBox(281, 161, 39, 39, HGR_AUSG);
for (int i = 0; i < 25; i++)
@@ -776,7 +809,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
// those cases seperately
_vm->renderImage(2, 0);
_vm->setColor63(40);
- mouseInput2();
+ getInput();
_vm->renderRoom(*_currentRoom);
roomBrightness();
palette();
@@ -806,7 +839,8 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
_vm->renderBox(91, 99, 138, 9, kColorDarkBlue);
do {
edit(t, 91, 100, 5);
- } while ((_key != Common::ASCII_RETURN) && (_key != Common::ASCII_ESCAPE));
+ } while ((_key.keycode != Common::KEYCODE_RETURN) &&
+ (_key.keycode != Common::KEYCODE_ESCAPE));
f = false;
if (t[0] == ':') {
t[0] = 0;
@@ -829,9 +863,9 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
minutes = atoi(min);
if ((hours > 23) || (minutes > 59)) f = true;
animationOn();
- } while (f && (_key != Common::ASCII_ESCAPE));
+ } while (f && (_key.keycode != Common::KEYCODE_ESCAPE));
_vm->restoreScreen();
- if (_key != Common::ASCII_ESCAPE) {
+ if (_key.keycode != Common::KEYCODE_ESCAPE) {
_state.timeAlarm = (hours * 60 + minutes) * 1092.3888 + 8;
_state.timeAlarmSystem = _state.timeAlarm + _state.timeStarting;
_state.alarmOn = (_state.timeAlarmSystem > _vm->getDOSTicks());
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 2c61e15..a9741d7 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -103,7 +103,7 @@ public:
void executeRoom();
SupernovaEngine *_vm;
- uint16 _key;
+ Common::KeyState _key;
Common::EventType _mouseClickType;
bool _mouseClicked;
bool _keyPressed;
@@ -141,8 +141,9 @@ public:
void great(uint number);
bool airless();
void shock();
- void mouseInput();
- void mouseInput2();
+ Common::EventType getMouseInput();
+ uint16 getKeyInput(bool blockForAlNum = false);
+ void getInput();
void mouseInput3();
void mouseWait(int delay);
void wait2(int ticks);
Commit: 8ce533bb1b4ec744cd97213f14abde9d4e972cff
https://github.com/scummvm/scummvm/commit/8ce533bb1b4ec744cd97213f14abde9d4e972cff
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:01:18Z
Commit Message:
SUPERNOVA: Adds clear() to Inventory Class
Changed paths:
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 7548f92..0e99885 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -53,6 +53,10 @@ void Inventory::remove(Object &obj) {
}
}
+void Inventory::clear() {
+ _numObjects = 0;
+}
+
Object *Inventory::get(int index) const {
if (index < _numObjects)
return _inventory[index];
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index a9741d7..85c81c3 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -64,6 +64,7 @@ public:
void add(Object &obj);
void remove(Object &obj);
+ void clear();
Object *get(int index) const;
Object *get(ObjectID id) const;
int getSize() const { return _numObjects; }
Commit: 37b4a77732a25c5097cdb1513d12de836425307a
https://github.com/scummvm/scummvm/commit/37b4a77732a25c5097cdb1513d12de836425307a
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:01:18Z
Commit Message:
SUPERNOVA: Refactors init and destruction of GameManager
During the gameplay room state is overwritten and needs to be restored
on restart/load. Currently the original room state is not preserved and
thus needs to be destroyed and reinitialized to obtain the original
state.
Changed paths:
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 0e99885..cd09687 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -142,58 +142,72 @@ static Common::String timeToString(int t) {
}
GameManager::GameManager(SupernovaEngine *vm) {
- _rooms[INTRO] = new StartingItems(vm, this);
- _rooms[CORRIDOR] = new ShipCorridor(vm, this);
- _rooms[HALL] = new ShipHall(vm, this);
- _rooms[SLEEP] = new ShipSleepCabin(vm, this);
- _rooms[COCKPIT] = new ShipCockpit(vm, this);
- _rooms[AIRLOCK] = new ShipAirlock(vm, this);
- _rooms[HOLD] = new ShipHold(vm, this);
- _rooms[LANDINGMODULE] = new ShipLandingModule(vm, this);
- _rooms[GENERATOR] = new ShipGenerator(vm, this);
- _rooms[OUTSIDE] = new ShipOuterSpace(vm, this);
- _rooms[CABIN_R1] = new ShipCabinR1(vm, this);
- _rooms[CABIN_R2] = new ShipCabinR2(vm, this);
- _rooms[CABIN_R3] = new ShipCabinR3(vm, this);
- _rooms[CABIN_L1] = new ShipCabinL1(vm, this);
- _rooms[CABIN_L2] = new ShipCabinL2(vm, this);
- _rooms[CABIN_L3] = new ShipCabinL3(vm, this);
- _rooms[BATHROOM] = new ShipCabinBathroom(vm, this);
-
- _rooms[ROCKS] = new ArsanoRocks(vm, this);
- _rooms[CAVE] = new ArsanoCave(vm, this);
- _rooms[MEETUP] = new ArsanoMeetup(vm, this);
- _rooms[ENTRANCE] = new ArsanoEntrance(vm, this);
- _rooms[REST] = new ArsanoRemaining(vm, this);
- _rooms[ROGER] = new ArsanoRoger(vm, this);
- _rooms[GLIDER] = new ArsanoGlider(vm, this);
- _rooms[MEETUP2] = new ArsanoMeetup2(vm, this);
- _rooms[MEETUP3] = new ArsanoMeetup3(vm, this);
-
- _rooms[CELL] = new AxacussCell(vm, this);
- _rooms[CORRIDOR1] = new AxacussCorridor1(vm, this);
- _rooms[CORRIDOR2] = new AxacussCorridor2(vm, this);
- _rooms[CORRIDOR3] = new AxacussCorridor3(vm, this);
- _rooms[CORRIDOR4] = new AxacussCorridor3(vm, this);
- _rooms[CORRIDOR5] = new AxacussCorridor4(vm, this);
- _rooms[CORRIDOR6] = new AxacussCorridor5(vm, this);
- _rooms[CORRIDOR7] = new AxacussCorridor6(vm, this);
- _rooms[CORRIDOR8] = new AxacussCorridor7(vm, this);
- _rooms[CORRIDOR9] = new AxacussCorridor8(vm, this);
- _rooms[BCORRIDOR] = new AxacussBcorridor(vm, this);
- _rooms[GUARD] = new AxacussIntersection(vm, this);
- _rooms[GUARD3] = new AxacussExit(vm, this);
- _rooms[OFFICE_L1] = new AxacussOffice1(vm, this);
- _rooms[OFFICE_L2] = new AxacussOffice2(vm, this);
- _rooms[OFFICE_R1] = new AxacussOffice3(vm, this);
- _rooms[OFFICE_R2] = new AxacussOffice4(vm, this);
- _rooms[OFFICE_L] = new AxacussOffice5(vm, this);
- _rooms[ELEVATOR] = new AxacussElevator(vm, this);
- _rooms[STATION] = new AxacussStation(vm, this);
- _rooms[SIGN] = new AxacussSign(vm, this);
-
- _currentRoom = _rooms[INTRO];
_vm = vm;
+
+ initRooms();
+ _currentRoom = _rooms[SLEEP];
+ initState();
+ initGui();
+}
+
+GameManager::~GameManager() {
+ destroyRooms();
+}
+
+void GameManager::destroyRooms() {
+ delete _rooms[INTRO];
+ delete _rooms[CORRIDOR];
+ delete _rooms[HALL];
+ delete _rooms[SLEEP];
+ delete _rooms[COCKPIT];
+ delete _rooms[AIRLOCK];
+ delete _rooms[HOLD];
+ delete _rooms[LANDINGMODULE];
+ delete _rooms[GENERATOR];
+ delete _rooms[OUTSIDE];
+ delete _rooms[CABIN_R1];
+ delete _rooms[CABIN_R2];
+ delete _rooms[CABIN_R3];
+ delete _rooms[CABIN_L1];
+ delete _rooms[CABIN_L2];
+ delete _rooms[CABIN_L3];
+ delete _rooms[BATHROOM];
+
+ delete _rooms[ROCKS];
+ delete _rooms[CAVE];
+ delete _rooms[MEETUP];
+ delete _rooms[ENTRANCE];
+ delete _rooms[REST];
+ delete _rooms[ROGER];
+ delete _rooms[GLIDER];
+ delete _rooms[MEETUP2];
+ delete _rooms[MEETUP3];
+
+ delete _rooms[CELL];
+ delete _rooms[CORRIDOR1];
+ delete _rooms[CORRIDOR2];
+ delete _rooms[CORRIDOR3];
+ delete _rooms[CORRIDOR4];
+ delete _rooms[CORRIDOR5];
+ delete _rooms[CORRIDOR6];
+ delete _rooms[CORRIDOR7];
+ delete _rooms[CORRIDOR8];
+ delete _rooms[CORRIDOR9];
+ delete _rooms[BCORRIDOR];
+ delete _rooms[GUARD];
+ delete _rooms[GUARD3];
+ delete _rooms[OFFICE_L1];
+ delete _rooms[OFFICE_L2];
+ delete _rooms[OFFICE_R1];
+ delete _rooms[OFFICE_R2];
+ delete _rooms[OFFICE_L];
+ delete _rooms[ELEVATOR];
+ delete _rooms[STATION];
+ delete _rooms[SIGN];
+}
+
+
+void GameManager::initState() {
Object::setObjectNull(_currentInputObject);
Object::setObjectNull(_inputObject[0]);
Object::setObjectNull(_inputObject[1]);
@@ -233,8 +247,58 @@ GameManager::GameManager(SupernovaEngine *vm) {
_state.airlockSeen = false;
_state.holdSeen = false;
_state.dream = false;
+}
- initGui();
+void GameManager::initRooms() {
+ _rooms[INTRO] = new StartingItems(_vm, this);
+ _rooms[CORRIDOR] = new ShipCorridor(_vm, this);
+ _rooms[HALL] = new ShipHall(_vm, this);
+ _rooms[SLEEP] = new ShipSleepCabin(_vm, this);
+ _rooms[COCKPIT] = new ShipCockpit(_vm, this);
+ _rooms[AIRLOCK] = new ShipAirlock(_vm, this);
+ _rooms[HOLD] = new ShipHold(_vm, this);
+ _rooms[LANDINGMODULE] = new ShipLandingModule(_vm, this);
+ _rooms[GENERATOR] = new ShipGenerator(_vm, this);
+ _rooms[OUTSIDE] = new ShipOuterSpace(_vm, this);
+ _rooms[CABIN_R1] = new ShipCabinR1(_vm, this);
+ _rooms[CABIN_R2] = new ShipCabinR2(_vm, this);
+ _rooms[CABIN_R3] = new ShipCabinR3(_vm, this);
+ _rooms[CABIN_L1] = new ShipCabinL1(_vm, this);
+ _rooms[CABIN_L2] = new ShipCabinL2(_vm, this);
+ _rooms[CABIN_L3] = new ShipCabinL3(_vm, this);
+ _rooms[BATHROOM] = new ShipCabinBathroom(_vm, this);
+
+ _rooms[ROCKS] = new ArsanoRocks(_vm, this);
+ _rooms[CAVE] = new ArsanoCave(_vm, this);
+ _rooms[MEETUP] = new ArsanoMeetup(_vm, this);
+ _rooms[ENTRANCE] = new ArsanoEntrance(_vm, this);
+ _rooms[REST] = new ArsanoRemaining(_vm, this);
+ _rooms[ROGER] = new ArsanoRoger(_vm, this);
+ _rooms[GLIDER] = new ArsanoGlider(_vm, this);
+ _rooms[MEETUP2] = new ArsanoMeetup2(_vm, this);
+ _rooms[MEETUP3] = new ArsanoMeetup3(_vm, this);
+
+ _rooms[CELL] = new AxacussCell(_vm, this);
+ _rooms[CORRIDOR1] = new AxacussCorridor1(_vm, this);
+ _rooms[CORRIDOR2] = new AxacussCorridor2(_vm, this);
+ _rooms[CORRIDOR3] = new AxacussCorridor3(_vm, this);
+ _rooms[CORRIDOR4] = new AxacussCorridor3(_vm, this);
+ _rooms[CORRIDOR5] = new AxacussCorridor4(_vm, this);
+ _rooms[CORRIDOR6] = new AxacussCorridor5(_vm, this);
+ _rooms[CORRIDOR7] = new AxacussCorridor6(_vm, this);
+ _rooms[CORRIDOR8] = new AxacussCorridor7(_vm, this);
+ _rooms[CORRIDOR9] = new AxacussCorridor8(_vm, this);
+ _rooms[BCORRIDOR] = new AxacussBcorridor(_vm, this);
+ _rooms[GUARD] = new AxacussIntersection(_vm, this);
+ _rooms[GUARD3] = new AxacussExit(_vm, this);
+ _rooms[OFFICE_L1] = new AxacussOffice1(_vm, this);
+ _rooms[OFFICE_L2] = new AxacussOffice2(_vm, this);
+ _rooms[OFFICE_R1] = new AxacussOffice3(_vm, this);
+ _rooms[OFFICE_R2] = new AxacussOffice4(_vm, this);
+ _rooms[OFFICE_L] = new AxacussOffice5(_vm, this);
+ _rooms[ELEVATOR] = new AxacussElevator(_vm, this);
+ _rooms[STATION] = new AxacussStation(_vm, this);
+ _rooms[SIGN] = new AxacussSign(_vm, this);
}
void GameManager::initGui() {
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 85c81c3..b85ff76 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -98,6 +98,7 @@ public:
class GameManager {
public:
GameManager(SupernovaEngine *vm);
+ ~GameManager();
void processInput(Common::KeyState &state);
void processInput();
@@ -136,6 +137,9 @@ public:
void takeObject(Object &obj);
+ void initState();
+ void initRooms();
+ void destroyRooms();
void initGui();
bool genericInteract(Action verb, Object &obj1, Object &obj2);
bool isHelmetOff();
Commit: 51c93575491a73e1c8d880b994190173bb0bbd9c
https://github.com/scummvm/scummvm/commit/51c93575491a73e1c8d880b994190173bb0bbd9c
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:01:18Z
Commit Message:
SUPERNOVA: Implements death screen
Changed paths:
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index cd09687..d612c23 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -805,6 +805,29 @@ void GameManager::closeLocker(const Room *room, Object *obj, Object *lock, int s
}
}
+void GameManager::death(const char *message) {
+ _vm->paletteFadeOut();
+ _guiEnabled = false;
+ _vm->renderImage(11, 0);
+ _vm->renderMessage(message);
+ _vm->playSound(kAudioDeath);
+ _vm->paletteFadeIn();
+ getInput();
+ _vm->paletteFadeOut();
+ _vm->removeMessage();
+
+ // TODO: Load screen
+ destroyRooms();
+ initRooms();
+ initState();
+ initGui();
+ _inventory.clear();
+ changeRoom(INTRO);
+ _vm->paletteFadeIn();
+
+ _guiEnabled = true;
+}
+
int GameManager::invertSection(int section) {
if (section < 128)
section += 128;
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index b85ff76..383b1ca 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -180,6 +180,7 @@ public:
void handleInput();
void handleTime();
void setAnimationTimer(int ticks);
+ void death(const char *message);
};
}
Commit: 6f9374c737d2e287ccece4bd026399c1a948a366
https://github.com/scummvm/scummvm/commit/6f9374c737d2e287ccece4bd026399c1a948a366
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:01:18Z
Commit Message:
SUPERNOVA: Fixes parameter name for getKeyInput()
Changed paths:
engines/supernova/state.h
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 383b1ca..b411cbd 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -147,7 +147,7 @@ public:
bool airless();
void shock();
Common::EventType getMouseInput();
- uint16 getKeyInput(bool blockForAlNum = false);
+ uint16 getKeyInput(bool blockForPrintChar = false);
void getInput();
void mouseInput3();
void mouseWait(int delay);
Commit: 2c9f7b4ba97439db1d295b7bb68d27d1a6cc167b
https://github.com/scummvm/scummvm/commit/2c9f7b4ba97439db1d295b7bb68d27d1a6cc167b
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:01:18Z
Commit Message:
SUPERNOVA: Implements edit()
As the TODO says, there are still problems with the function that can be
observed when using the terminal in the sleeping chamber.
Changed paths:
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index d612c23..c624d7b 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -754,8 +754,98 @@ void GameManager::animationOn() {
_animationEnabled = true;
}
-void GameManager::edit(char *text, int x, int y, int length) {
- // STUB
+void GameManager::edit(char *text, int x, int y, uint length) {
+ // TODO: DOES NOT WORK!!!
+#define GET_STRING_CHAR(str, index) (index < str.size() ? str[index] : 0)
+
+ bool isEditing = true;
+ Common::String input(text);
+ int cursorPos = x + _vm->textWidth(text);
+ char cursorChar = 0;
+ uint cursorIndex = input.size();
+ int cursorCharWidth = 0;
+
+ while (isEditing) {
+ cursorChar = GET_STRING_CHAR(input, cursorIndex);
+
+ _vm->_textCursorX = x;
+ _vm->_textCursorY = y;
+ _vm->_textColor = COL_EDIT;
+ for (uint i = 0; i < input.size(); ++i) {
+ // Draw char highlight depending on cursor position
+ if (i == cursorIndex && cursorChar) {
+ cursorCharWidth = _vm->textWidth(cursorChar);
+ _vm->renderBox(cursorPos, y - 1, cursorCharWidth, 9, COL_EDIT);
+// _vm->renderBox(cursorPos + cursorCharWidth, y - 1, _vm->textWidth(cursor + 1) + 6, 9, HGR_EDIT);
+ _vm->renderText(cursorChar, cursorPos, y, HGR_EDIT);
+ _vm->_textColor = COL_EDIT;
+ } else {
+ _vm->renderText(input[i]);
+ }
+ }
+ if (cursorIndex == input.size()) {
+ _vm->renderBox(cursorPos, y - 1, 1, 9, COL_EDIT);
+ _vm->renderBox(cursorPos + 1, y - 1, 6, 9, HGR_EDIT);
+ }
+
+ getKeyInput(true);
+ switch (_key.keycode) {
+ case Common::KEYCODE_RETURN:
+ case Common::KEYCODE_ESCAPE:
+ case Common::KEYCODE_UP:
+ case Common::KEYCODE_DOWN:
+ cursorChar = GET_STRING_CHAR(input, cursorIndex);
+ if (cursorChar) {
+ cursorCharWidth = _vm->textWidth(cursorChar);
+ } else {
+ cursorCharWidth = 1;
+ }
+ _vm->renderBox(cursorPos, y - 1, cursorCharWidth, 9, HGR_EDIT);
+ _vm->renderText(cursorPos, y, cursorChar, COL_EDIT);
+ return;
+ case Common::KEYCODE_LEFT:
+ if (cursorIndex != 0) {
+ --cursorIndex;
+ cursorChar = GET_STRING_CHAR(input, cursorIndex);
+ cursorPos -= _vm->textWidth(cursorChar);
+ }
+ break;
+ case Common::KEYCODE_RIGHT:
+ if (cursorIndex != input.size()) {
+ cursorChar = GET_STRING_CHAR(input, cursorIndex);
+ cursorCharWidth = _vm->textWidth(cursorChar);
+ _vm->renderBox(cursorPos, y - 1, cursorCharWidth, 9, HGR_EDIT);
+ _vm->renderText(cursorChar, cursorPos, y, COL_EDIT);
+ ++cursorIndex;
+ cursorPos += cursorCharWidth;
+ }
+ break;
+ case Common::KEYCODE_DELETE:
+ if (cursorIndex != input.size()) {
+ input.deleteChar(cursorIndex);
+ }
+ break;
+ case Common::KEYCODE_BACKSPACE:
+ if (cursorIndex != 0) {
+ --cursorIndex;
+ input.deleteChar(cursorIndex);
+ }
+ break;
+ default:
+ if (Common::isPrint(_key.ascii) && input.size() < length) {
+ int charWidth = _vm->textWidth(_key.ascii);
+ input.insertChar(_key.ascii, cursorIndex);
+ ++cursorIndex;
+ cursorPos += charWidth;
+ }
+ break;
+ }
+ }
+
+ _vm->renderBox(x, y - 1, 320 - x, 10, HGR_EDIT);
+ Common::copy(input.begin(), input.end(), text);
+
+#undef GET_STRING_CHAR
}
void GameManager::loadOverlayStart() {
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index b411cbd..48499d7 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -167,7 +167,7 @@ public:
void loadOverlayStart();
void openLocker(const Room *room, Object *obj, Object *lock, int section);
void closeLocker(const Room *room, Object *obj, Object *lock, int section);
- void edit(char *text, int x, int y, int length);
+ void edit(char *text, int x, int y, uint length);
int invertSection(int section);
void drawMapExits();
void drawStatus();
Commit: 172377f09334d5d267b1d143014763f57a2b498f
https://github.com/scummvm/scummvm/commit/172377f09334d5d267b1d143014763f57a2b498f
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:01:18Z
Commit Message:
SUPERNOVA: cleanup
Changed paths:
engines/supernova/state.cpp
engines/supernova/supernova.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index c624d7b..9a8bba3 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -403,11 +403,10 @@ void GameManager::processInput() {
if (Object::isNullObject(_currentInputObject))
return;
- ObjectType type;
if (((_mouseField >= 0) && (_mouseField < 256)) ||
((_mouseField >= 512) && (_mouseField < 768))) {
_inputObject[0] = _currentInputObject;
- type = _inputObject[0]->_type;
+ ObjectType type = _inputObject[0]->_type;
if (type & OPENABLE) {
if (type & OPENED)
_inputVerb = ACTION_CLOSE;
@@ -496,8 +495,6 @@ void GameManager::processInput() {
_currentInputObject = _currentRoom->getObject(_mouseField);
}
}
-
-// drawStatus();
}
}
@@ -862,10 +859,8 @@ void GameManager::drawStatus() {
} else {
_vm->renderText(_inputObject[0]->_name);
if (_inputVerb == ACTION_GIVE) {
- // to
_vm->renderText(" an ");
} else if (_inputVerb == ACTION_USE) {
- // with
_vm->renderText(" mit ");
}
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index ff2211c..447316f 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -421,7 +421,7 @@ void SupernovaEngine::renderMessage(const char *text, MessagePosition position)
switch (position) {
case kMessageNormal:
x = 160 - rowWidthMax / 2;
- textColor = COL_MELD;
+ textColor = kColorWhite99;
break;
case kMessageTop:
x = 160 - rowWidthMax / 2;
@@ -454,7 +454,7 @@ void SupernovaEngine::renderMessage(const char *text, MessagePosition position)
int message_width = rowWidthMax + 6;
int message_height = numRows * 9 + 5;
saveScreen(message_columns, message_rows, message_width, message_height);
- renderBox(message_columns, message_rows, message_width, message_height, HGR_MELD);
+ renderBox(message_columns, message_rows, message_width, message_height, kColorWhite35);
for (uint i = 0; i < numRows; ++i) {
renderText(row[i], x, y, textColor);
y += 9;
Commit: 48870921f09d126a3084f12e265719bdd97e9bb3
https://github.com/scummvm/scummvm/commit/48870921f09d126a3084f12e265719bdd97e9bb3
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:01:18Z
Commit Message:
SUPERNOVA: Implements shock() and removes longjmps to 'dead'
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 9a8bba3..90ca7ab 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -713,9 +713,8 @@ void GameManager::palette() {
}
void GameManager::shock() {
- // STUB
_vm->playSound(kAudioShock);
- // die
+ death("Du h\204ttest besser vorher|den Stecker rausgezogen.");
}
void GameManager::showMenu() {
@@ -1130,8 +1129,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
} else {
if (obj1.hasProperty(WORN)) {
if (airless()) {
- //TODO: Death screen
-// longjmp(dead, "Den Helm httest du|besser angelassen!");
+ death("Den Helm h\204ttest du|besser angelassen!");
}
obj1.disableProperty(WORN);
_vm->renderMessage("Du ziehst den Helm ab.");
@@ -1158,8 +1156,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
} else {
if (obj1.hasProperty(WORN)) {
if (airless()) {
- //TODO: Death screen
-// longjmp(dead, "Den Versorungsteil httest du|besser nicht abgenommen!");
+ death("Den Versorgungsteil h\204ttest du|besser nicht abgenommen!");
}
obj1.disableProperty(WORN);
_vm->renderMessage("Du nimmst den Versorgungsteil ab.");
Commit: 8e9141d516b18c3a297c70198aff9008a734055d
https://github.com/scummvm/scummvm/commit/8e9141d516b18c3a297c70198aff9008a734055d
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:01:19Z
Commit Message:
SUPERNOVA: Fixes SleepCabin::animation()
Some of the code didn't belong into the function.
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 484a44f..d608f6f 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -265,37 +265,32 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
void ShipSleepCabin::animation() {
static char color;
-
- if (!_gm->_guiEnabled) {
- if (color) {
- color = kColorBlack;
- _gm->setAnimationTimer(5);
- } else {
- color = kColorLightYellow;
- _gm->setAnimationTimer(10);
- }
- _vm->renderText("Achtung: Triebwerke funktionsunfähig",50,145,color);
- } else {
- if (isSectionVisible(21)) {
- _gm->drawImage(_gm->invertSection(21));
- _gm->setAnimationTimer(5);
- } else {
- _gm->drawImage(21);
- _gm->setAnimationTimer(10);
- }
- }
- if (_gm->_state.powerOff) {
- if (!_gm->_guiEnabled) {
- _vm->renderText("Energievorrat erschöpft",97,165,color);
- _vm->renderText("Notstromversorgung aktiv",97,175,color);
+ if (_gm->_state.powerOff && _gm->_state.time) {
+ if (_gm->_guiEnabled) {
+ if (isSectionVisible(1)) {
+ _gm->drawImage(2);
+ setSectionVisible(1, false);
+ } else {
+ _gm->drawImage(1);
+ setSectionVisible(2, false);
+ }
} else {
- if (isSectionVisible(21)) {
- _gm->drawImage(22);
+ if (color == kColorLightRed) {
+ color = kColorDarkBlue;
} else {
- _gm->drawImage(_gm->invertSection(22));
+ color = kColorLightRed;
}
+
+ _vm->renderText("Achtung", 60, 75, color);
}
+ } else if (isSectionVisible(5) && _gm->_guiEnabled) {
+ if (isSectionVisible(4))
+ _gm->drawImage(_gm->invertSection(4));
+ else
+ _gm->drawImage(4);
}
+
+ _gm->setAnimationTimer(6);
}
void ShipSleepCabin::onEntrance() {
if (_gm->_state.dream && (_gm->_rooms[CAVE]->getObject(1)->_exitRoom == MEETUP3)) {
Commit: d4c8fe528a5d831c23e30d5ec53e159b60c50925
https://github.com/scummvm/scummvm/commit/d4c8fe528a5d831c23e30d5ec53e159b60c50925
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:01:19Z
Commit Message:
SUPERNOVA: Substitues umlauts with their cp437 octal equivalent
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index d608f6f..bb9667c 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -746,7 +746,7 @@ bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
void ShipHold::onEntrance() {
if (!hasSeen())
- _vm->renderMessage("Was ist denn das fr ein Chaos?|Und auáerdem fehlt das Notraumschiff!|Jetzt wird mir einiges klar.|Die anderen sind geflchtet,|und ich habe es verpennt.");
+ _vm->renderMessage("Was ist denn das f\201r ein Chaos?|Und au\341erdem fehlt das Notraumschiff!|Jetzt wird mir einiges klar.|Die anderen sind gefl\201chtet,|und ich habe es verpennt.");
setRoomSeen(true);
_gm->_rooms[COCKPIT]->setRoomSeen(true);
}
@@ -794,7 +794,7 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
isSectionVisible(7))
_vm->renderMessage("Du wirst aus den Anzeigen nicht schlau.");
else if ((verb == ACTION_USE) && (obj1._id == KEYBOARD))
- _vm->renderMessage("Laá lieber die Finger davon!");
+ _vm->renderMessage("La\341 lieber die Finger davon!");
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, WIRE, LANDINGMOD_SOCKET)) {
r = _gm->_rooms[CABIN_L3];
_gm->_inventory.remove(*r->getObject(8));
@@ -812,7 +812,7 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage("An dem Kabel ist doch gar kein Stecker.");
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, TERMINALSTRIP)) {
_gm->drawImage(11);
- getObject(4)->_name = "Leitung mit Lsterklemme";
+ getObject(4)->_name = "Leitung mit L\201sterklemme";
r = _gm->_rooms[HOLD];
_gm->_inventory.remove(*r->getObject(2));
_gm->_state.terminalStripConnected = true;
@@ -844,7 +844,7 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
_gm->drawImage(6);
getObject(4)->_click = 7;
} else {
- _vm->renderMessage("Du solltest die Luke vielleicht erst ffnen.");
+ _vm->renderMessage("Du solltest die Luke vielleicht erst \224ffnen.");
}
} else if ((verb == ACTION_CLOSE) && (obj1._id == LANDINGMOD_HATCH) &&
isSectionVisible(6)) {
@@ -970,7 +970,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
(Object::combine(obj1, obj2, WIRE, CLIP) ||
Object::combine(obj1, obj2, SPOOL, CLIP)) &&
isSectionVisible(3)) {
- _vm->renderMessage("Was ntzt dir der Anschluá|ohne eine Stromquelle?!");
+ _vm->renderMessage("Was n\201tzt dir der Anschlu\341|ohne eine Stromquelle?!");
} else if ((verb == ACTION_LOOK) && (obj1._id == VOLTMETER)) {
if (_gm->_state.powerOff)
_vm->renderMessage("Die Spannung ist auf Null abgesunken.");
@@ -983,7 +983,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
getObject(3)->_click = 18;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, OUTERHATCH, GENERATOR_ROPE)) {
if (!isSectionVisible(1))
- _vm->renderMessage("Du muát die Luke erst ffnen.");
+ _vm->renderMessage("Du mu\341t die Luke erst \224ffnen.");
else {
_gm->drawImage(_gm->invertSection(13));
_gm->drawImage(1);
Commit: aa0606beedc5bd68852bd5195373a80c685312ff
https://github.com/scummvm/scummvm/commit/aa0606beedc5bd68852bd5195373a80c685312ff
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:01:19Z
Commit Message:
SUPERNOVA: Replaces longjmp to 'dead'
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index bb9667c..d19529a 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -666,7 +666,8 @@ bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) {
if (!r->getObject(4)->hasProperty(WORN) ||
!r->getObject(5)->hasProperty(WORN) ||
!r->getObject(6)->hasProperty(WORN)) {
-// longjmp(dead, "Zu niedriger Luftdruck soll ungesund sein.");
+ _gm->death("Zu niedriger Luftdruck soll ungesund sein.");
+ return true;
}
}
_gm->drawImage(_gm->invertSection(11));
Commit: 7c13706d2830eeace1f38dbc1908d6a62d250e07
https://github.com/scummvm/scummvm/commit/7c13706d2830eeace1f38dbc1908d6a62d250e07
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:01:19Z
Commit Message:
SUPERNOVA: Fixes code
kMaxSection - 1 was used in the original code to indicate if the GUI is
currently shown. In this engine an explicit variable _guiEnabled is
used.
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index d19529a..9220028 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -432,7 +432,7 @@ bool ShipCabinL3::interact(Action verb, Object &obj1, Object &obj2) {
Room *r;
if ((verb == ACTION_USE) && Object::combine(obj1, obj2, RECORD, TURNTABLE)) {
- if (isSectionVisible(kMaxSection - 1) || isSectionVisible(15))
+ if (!_gm->_guiEnabled || isSectionVisible(15))
_vm->renderMessage("Du hast die Platte schon aufgelegt.");
else {
if (!getObject(4)->hasProperty(CARRIED))
Commit: 3579bdef80cbb858a3d8dbb06fbdffea1c8ab933
https://github.com/scummvm/scummvm/commit/3579bdef80cbb858a3d8dbb06fbdffea1c8ab933
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:13:41Z
Commit Message:
SUPERNOVA: Adds and corrects constants
Changed paths:
engines/supernova/msn_def.h
engines/supernova/rooms.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 0d92799..08bcfe0 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -53,7 +53,7 @@ enum AudioIndex {
kAudioGreat, // 44|0
kAudioCrash, // 45|0
kAudioVoiceHalt, // 46|0
- kAudioUndef1, // 46|2510
+ kAudioGunShot, // 46|2510
kAudioUndef2, // 46|4020
kAudioVoiceSupernova, // 47|0
kAudioVoiceYeah, // 47|24010
@@ -63,6 +63,7 @@ enum AudioIndex {
kAudioTurntable, // 48|13530
kAudioUndef5, // 50|0
kAudioUndef6, // 50|12786
+ kAudioRocks, // 51|0
kAudioDeath, // 53|0
kAudioAlarm, // 54|0
kAudioUndef7, // 54|8010
@@ -405,7 +406,7 @@ enum ObjectID {
STONE,
SPACESHIPS,SPACESHIP,STAR,DOOR,MEETUP_SIGN,
PORTER,BATHROOM_BUTTON,BATHROOM_SIGN,KITCHEN_SIGN,CAR_SLOT,
- ARS_BATHROOM,COINS,SCHNUCK,EGG,PILL,PILL_HULL,STAIRCASE,
+ ARSANO_BATHROOM,COINS,SCHNUCK,EGG,PILL,PILL_HULL,STAIRCASE,
MEETUP_EXIT,
ROGER_W,WALLET,KEYCARD_R,CUP,
GLIDER_BUTTON1,GLIDER_BUTTON2,GLIDER_BUTTON3,GLIDER_BUTTON4,GLIDER_SLOT,GLIDER_BUTTONS,
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 5db3dcf..48bee74 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -634,7 +634,7 @@ public:
_objectState[8] = Object("Tablette","Die Plastikhülle zeigt einen|Mund mit einer Sprechblase. Was|darin steht, kannst du nicht lesen.",PILL,TAKE,255,255,0);
_objectState[9] = Object("Schlitz",Object::defaultDescription,CAR_SLOT,COMBINABLE,6,6,0);
_objectState[10] = Object("Automat","Sieht aus wie ein Kaugummiautomat.",NULLOBJECT,NULLTYPE,5,5,0);
- _objectState[11] = Object("Toilette","Die Toiletten sind denen|auf der Erde sehr ähnlich.",ARS_BATHROOM,NULLTYPE,255,255,0);
+ _objectState[11] = Object("Toilette","Die Toiletten sind denen|auf der Erde sehr ähnlich.",ARSANO_BATHROOM,NULLTYPE,255,255,0);
_objectState[12] = Object("Knopf",Object::defaultDescription,BATHROOM_BUTTON,PRESS,3,3,0);
_objectState[13] = Object("Schild","Diese Schrift kannst du nicht lesen.",BATHROOM_SIGN,NULLTYPE,4,4,0);
_objectState[14] = Object("Treppe",Object::defaultDescription,STAIRCASE,EXIT,8,8,0,REST,3);
Commit: f0b638d762a05dba9af9362833d82ad9973a95f2
https://github.com/scummvm/scummvm/commit/f0b638d762a05dba9af9362833d82ad9973a95f2
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:13:53Z
Commit Message:
SUPERNOVA: Adds resetProperty() for Objects
resetProperty() optionally takes an ObjectType as parameter that the
object gets set to. Otherwise it will be set as NULLTYPE.
Changed paths:
engines/supernova/msn_def.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 08bcfe0..02a38d5 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -483,6 +483,10 @@ struct Object {
static bool isNullObject(Object *obj) {
return obj == &nullObject;
}
+ void resetProperty(ObjectType type = NULLTYPE) {
+ _type = type;
+ }
+
void setProperty(ObjectType type) {
_type |= type;
}
Commit: 830f983d837dabd27ff026dabfc4199f7846835d
https://github.com/scummvm/scummvm/commit/830f983d837dabd27ff026dabfc4199f7846835d
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:13:53Z
Commit Message:
SUPERNOVA: Adds text
Changed paths:
engines/supernova/msn_def.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 02a38d5..f38bbd2 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -423,6 +423,10 @@ enum ObjectID {
TICKETS
};
+
+static const char *const broken_DE = "Hmm, er scheint kaputt zu sein.";
+static const char *const broken_EN = "Hmm, it seems to be broken.";
+
static const char *const guiCommand_DE[] = {
"Gehe",
"Schau",
@@ -436,9 +440,9 @@ static const char *const guiCommand_DE[] = {
"Gib"
};
-static const char *guiStatusCommand_DE[10] =
+static const char *const guiStatusCommand_DE[10] =
{"Gehe zu ","Schau ","Nimm ","\231ffne ","Schlie\341e ","Dr\201cke ","Ziehe ","Benutze ","Rede mit ","Gib "};
-static const char *guiStatusCommand_EN[10] =
+static const char *const guiStatusCommand_EN[10] =
{"Go to ", "Look at ", "Take ", "Open ", "Close ", "Press ", "Pull ", "Use ", "Talk to ", "Give "};
ObjectType operator|(ObjectType a, ObjectType b);
Commit: 8a766b5b48dd82f426dd443d6ec5f8589bd13ec4
https://github.com/scummvm/scummvm/commit/8a766b5b48dd82f426dd443d6ec5f8589bd13ec4
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:19:02Z
Commit Message:
SUPERNOVA: Adds code for remaining game logic
Changed paths:
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 90ca7ab..26c9c91 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -73,6 +73,7 @@ Object *Inventory::get(ObjectID id) const {
return const_cast<Object *>(&Object::nullObject);
}
+
GuiElement::GuiElement()
: _text("")
, _isHighlighted(false)
@@ -228,7 +229,7 @@ void GameManager::initState() {
_state.eventTime = 0xffffffff;
_state.shipEnergy = 2135;
_state.landingModuleEnergy = 923;
- _state.greatF = 0;
+ _state.greatFlag = 0;
_state.timeRobot = 0;
_state.money = 0;
_state.coins = 0;
@@ -516,22 +517,141 @@ void GameManager::drawImage(int section) {
} while (section != 0);
}
-bool GameManager::isHelmetOff() {
- Object *helmet = _inventory.get(HELMET);
- if (helmet && helmet->hasProperty(WORN)) {
- _vm->renderMessage("Irgendwie ist ein Raumhelm|beim Essen unpraktisch.");
- return false;
+void GameManager::corridorOnEntrance() {
+ if (_state.corridorSearch)
+ busted(0);
+}
+
+void busted(int i) {
+ // STUB
+}
+
+void GameManager::telomat(int number) {
+ // STUB
+}
+
+void GameManager::startSearch() {
+ if ((_currentRoom >= _rooms[CORRIDOR1]) && (_currentRoom <= _rooms[BCORRIDOR]))
+ busted(0);
+
+ _state.corridorSearch = true;
+}
+
+void GameManager::search(int time) {
+ _state.eventTime = _vm->getDOSTicks() + time;
+// *event = &search_start;
+}
+
+void GameManager::guardNoticed() {
+ // STUB
+}
+
+void GameManager::busted(int i) {
+ if (i > 0)
+ drawImage(i);
+ if (i == 0) {
+ if ((_currentRoom >= _rooms[OFFICE_L1]) && (_currentRoom <= _rooms[OFFICE_R2])) {
+ if (_currentRoom < _rooms[OFFICE_R1])
+ i = 10;
+ else
+ i = 5;
+ if (!_currentRoom->getObject(0)->hasProperty(OPENED)) {
+ drawImage(i - 1);
+ _vm->playSound(kAudioDoorOpen);
+ wait2(2);
+ }
+ drawImage(i);
+ wait2(3);
+ drawImage(i + 3);
+ _vm->playSound(kAudioVoiceHalt);
+ drawImage(i);
+ wait2(5);
+ if (_currentRoom == _rooms[OFFICE_L2])
+ i = 13;
+ drawImage(i + 1);
+ wait2(3);
+ drawImage(i + 2);
+ shot(0, 0);
+ } else if (_currentRoom == _rooms[BCORRIDOR]) {
+ drawImage(21);
+ } else {
+ if (_currentRoom->isSectionVisible(4))
+ drawImage(32); // below
+ else if (_currentRoom->isSectionVisible(2))
+ drawImage(30); // right
+ else if (_currentRoom->isSectionVisible(1))
+ drawImage(31); // left
+ else
+ drawImage(33); // above
+ }
}
+ _vm->playSound(kAudioVoiceHalt);
+ wait2(3);
+ shot(0, 0);
+}
- return true;
+void GameManager::guardReturned() {
+ if (_currentRoom == _rooms[GUARD])
+ busted(-1);
+ else if ((_currentRoom == _rooms[CORRIDOR9]) && (_currentRoom->isSectionVisible(27)))
+ busted(0);
+
+ _rooms[GUARD]->setSectionVisible(1, false);
+ _rooms[GUARD]->getObject(3)->_click = 0;
+ _rooms[GUARD]->setSectionVisible(6, false);
+ _rooms[GUARD]->getObject(2)->disableProperty(OPENED);
+ _rooms[GUARD]->setSectionVisible(7, false);
+ _rooms[GUARD]->getObject(5)->_click = 255;
+ _rooms[CORRIDOR9]->setSectionVisible(27, false);
+ _rooms[CORRIDOR9]->setSectionVisible(28, true);
+ _rooms[CORRIDOR9]->getObject(1)->disableProperty(OPENED);
+}
+
+void GameManager::taxi() {
+ if (_currentRoom == _rooms[SIGN]) {
+ changeRoom(STATION);
+ }
+
+ drawImage(1);
+ drawImage(2);
+ _vm->playSound(kAudioRocks);
+ screenShake();
+ drawImage(9);
+ _currentRoom->getObject(1)->setProperty(OPENED);
+ drawImage(1);
+ _currentRoom->setSectionVisible(2, false);
+ drawImage(3);
+ for (int i = 4; i <= 8; i++) {
+ wait2(2);
+ drawImage(invertSection(i - 1));
+ drawImage(i);
+ }
+ _rooms[SIGN]->setSectionVisible(2, false);
+ _rooms[SIGN]->setSectionVisible(3, true);
+}
+
+void GameManager::outro() {
+ _state.benOverlay = 3;
+// load_overlay();
+// title = 2;
+ _vm->playSoundMod(49);
+// title = 0;
+ _state.benOverlay = 0;
+ _vm->paletteFadeOut();
+ _vm->renderImage(55, 0);
+ _vm->paletteFadeIn();
+ getInput();
+ _vm->paletteFadeOut();
+ // TODO: render info file
+// longjmp(termination,1);
}
void GameManager::great(uint number) {
- if (number && (_state.greatF & (1 << number)))
+ if (number && (_state.greatFlag & (1 << number)))
return;
_vm->playSound(kAudioUndef7);
- _state.greatF |= 1 << number;
+ _state.greatFlag |= 1 << number;
}
bool GameManager::airless() {
@@ -543,6 +663,31 @@ bool GameManager::airless() {
);
}
+void GameManager::shipStart() {
+ // STUB
+}
+
+void GameManager::removeSentence(int sentence, int number) {
+ // STUB
+}
+
+void GameManager::addSentence(int sentence, int number) {
+ // STUB
+}
+
+void GameManager::say(const char *text) {
+ // STUB
+}
+
+void GameManager::reply(const char *text, int aus1, int aus2) {
+ // STUB
+}
+
+int GameManager::dialog(int num, byte *rowLength[], const char **text[6], int number) {
+ // STUB
+ return 0;
+}
+
void GameManager::turnOff() {
if (_state.powerOff)
return;
@@ -612,7 +757,11 @@ uint16 GameManager::getKeyInput(bool blockForPrintChar) {
_key.keycode == Common::KEYCODE_DELETE ||
_key.keycode == Common::KEYCODE_RETURN ||
_key.keycode == Common::KEYCODE_SPACE ||
- _key.keycode == Common::KEYCODE_ESCAPE) {
+ _key.keycode == Common::KEYCODE_ESCAPE ||
+ _key.keycode == Common::KEYCODE_UP ||
+ _key.keycode == Common::KEYCODE_DOWN ||
+ _key.keycode == Common::KEYCODE_LEFT ||
+ _key.keycode == Common::KEYCODE_RIGHT) {
if (_key.flags & Common::KBD_SHIFT)
return toupper(_key.ascii);
else
@@ -663,7 +812,10 @@ void GameManager::roomBrightness() {
}
void GameManager::loadTime() {
- // STUB
+ _state.timeStarting += _state.time;
+ if (_state.eventTime != 1)
+ _state.eventTime += _state.time;
+ _state.timeAlarmSystem = _state.timeAlarm + _state.timeStarting;
}
void GameManager::saveTime() {
@@ -848,6 +1000,42 @@ void GameManager::loadOverlayStart() {
// STUB
}
+void GameManager::shot(int a, int b) {
+ if (a)
+ drawImage(a);
+ _vm->playSound(kAudioGunShot);
+ wait2(2);
+ if (b)
+ drawImage(b);
+ wait2(2);
+ if (a)
+ drawImage(a);
+ _vm->playSound(kAudioGunShot);
+ wait2(2);
+ if (b)
+ drawImage(b);
+
+ death("Der Axacussaner hat dich erwischt.");
+}
+
+void GameManager::takeMoney(int amount) {
+ _state.money += amount;
+ if (amount > 0)
+ great(0);
+ // TODO: kmaxobject - 1?
+// _rooms[OFFICE_R1]->getObject(5)->_name = _rooms[OFFICE_R1]->getObject(kMaxObject - 1);
+// raumz[OFFICE_R1]->object[5].name = &(raumz[OFFICE_R1]->object[MAX_OBJECT-1]);
+// strcpy(raumz[OFFICE_R1]->object[5].name,ltoa((long)_state.money));
+// strcat(raumz[OFFICE_R1]->object[5].name," Xa");
+
+ if (_state.money) {
+ if (!_rooms[OFFICE_R1]->getObject(5)->hasProperty(CARRIED))
+ takeObject(*_rooms[OFFICE_R1]->getObject(5));
+ } else {
+ _inventory.remove(*_rooms[OFFICE_R1]->getObject(5));
+ }
+}
+
void GameManager::drawStatus() {
int index = static_cast<int>(_inputVerb);
_vm->renderBox(0, 140, 320, 9, kColorWhite25);
@@ -907,6 +1095,7 @@ void GameManager::death(const char *message) {
initGui();
_inventory.clear();
changeRoom(INTRO);
+ _vm->renderRoom(*_currentRoom);
_vm->paletteFadeIn();
_guiEnabled = true;
@@ -921,6 +1110,15 @@ int GameManager::invertSection(int section) {
return section;
}
+bool GameManager::isHelmetOff() {
+ Object *helmet = _inventory.get(HELMET);
+ if (helmet && helmet->hasProperty(WORN)) {
+ _vm->renderMessage("Irgendwie ist ein Raumhelm|beim Essen unpraktisch.");
+ return false;
+ }
+
+ return true;
+}
bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
Room *r;
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 48499d7..ad43ff5 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -37,7 +37,7 @@ struct GameState {
int32 eventTime;
int32 shipEnergy;
int32 landingModuleEnergy;
- uint16 greatF;
+ uint16 greatFlag;
int16 timeRobot;
int16 money;
byte coins;
@@ -181,6 +181,26 @@ public:
void handleTime();
void setAnimationTimer(int ticks);
void death(const char *message);
+ int dialog(int num, byte *rowLength[6], const char **text[6], int number);
+ void sentence(int number, bool brightness);
+ void removeSentence(int sentence, int number);
+ void addSentence(int sentence, int number);
+ void say(const char *text);
+ void reply(const char *text, int aus1, int aus2);
+ void shipStart();
+ void inventorySeize();
+ void shot(int a, int b);
+ void takeMoney(int amount);
+ void search(int time);
+ void startSearch();
+ void guardNoticed();
+ void guardReturned();
+ void busted(int i);
+ void corridorOnEntrance();
+ void event(int time);
+ void telomat(int number);
+ void taxi();
+ void outro();
};
}
Commit: 1797b174c7d349380d65744c143af3392b1b918f
https://github.com/scummvm/scummvm/commit/1797b174c7d349380d65744c143af3392b1b918f
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:33:01Z
Commit Message:
SUPERNOVA: Implements the remaining room definitions
While it compiles, it is still WIP.
Also there has been some confusion about the numbering of the
AxacussCorridor classes among other things that need to be done.
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/rooms.h
engines/supernova/state.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 9220028..c5c93e2 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -1013,81 +1013,1090 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
// Arsano
void ArsanoRocks::onEntrance() {
-
+ _gm->great(8);
}
bool ArsanoRocks::interact(Action verb, Object &obj1, Object &obj2) {
-
+ if (((verb == ACTION_PULL) || (verb == ACTION_PRESS)) &&
+ (obj1._id == STONE) && !isSectionVisible(3)) {
+ _gm->drawImage(1);
+ _gm->wait2(2);
+ _gm->drawImage(2);
+ _gm->wait2(2);
+ _gm->drawImage(3);
+ _vm->playSound(kAudioRocks);
+ obj1._click = 3;
+ getObject(3)->_click = 4;
+ getObject(3)->setProperty(EXIT);
+ return true;
+ }
+ return false;
}
void ArsanoMeetup::onEntrance() {
-
+ if (isSectionVisible(7)) {
+ _gm->wait2(3);
+ _gm->drawImage(6);
+ setSectionVisible(7, false);
+ _gm->wait2(3);
+ _gm->drawImage(_gm->invertSection(6));
+ }
+ if (!(_gm->_state.greatFlag & 0x8000)) {
+ _vm->playSound(kAudioGreat);
+ _gm->_state.greatFlag |= 0x8000;
+ }
}
void ArsanoMeetup::animation() {
+ _gm->drawImage(_gm->invertSection(1) + beacon);
+ beacon = (beacon + 1) % 5;
+ _gm->drawImage(beacon + 1);
+ _gm->drawImage(beacon + 8);
+ if (isSectionVisible(sign + 13))
+ _gm->drawImage(_gm->invertSection(13) + sign);
+ else
+ _gm->drawImage(13 + sign);
+ sign = (sign + 1) % 14;
+ _gm->setAnimationTimer(3);
}
bool ArsanoMeetup::interact(Action verb, Object &obj1, Object &obj2) {
+ if ((verb == ACTION_WALK) &&
+ ((obj1._id == SPACESHIPS) ||
+ ((obj1._id == SPACESHIP) && !obj1.hasProperty(OPENED)))) {
+ _vm->renderMessage("Die Raumschifft sind alle verschlossen.");
+ } else if ((verb == ACTION_WALK) && (obj1._id == SPACESHIP)) {
+ _gm->changeRoom(GLIDER);
+ _gm->_newRoom = true;
+ } else if ((verb == ACTION_WALK) && (obj1._id == STAR)) {
+ _vm->renderMessage("Unsinn!");
+ } else if ((verb == ACTION_LOOK) && (obj1._id == STAR)) {
+ _vm->renderImage(26, 0);
+ _vm->paletteBrightness();
+ _gm->animationOff();
+ _gm->getInput();
+ _gm->animationOn();
+ g_system->fillScreen(kColorBlack);
+ // TODO: those two function calls needed?
+ _vm->renderRoom(*this);
+ _vm->paletteBrightness();
+ } else if ((verb == ACTION_WALK) && (obj1._id == DOOR)) {
+ _gm->drawImage(6);
+ _gm->wait2(3);
+ _gm->drawImage(7);
+ setSectionVisible(6, false);
+ _gm->wait2(3);
+
+ return false;
+ } else if ((verb == ACTION_LOOK) && (obj1._id == MEETUP_SIGN) && _gm->_state.language) {
+ if (_gm->_state.language == 2)
+ _vm->renderMessage("Komisch! Auf einmal kannst du|das Schild lesen! Darauf steht:|\"Treffpunkt Galactica\".");
+
+ obj1._description = "Darauf steht:|\"Treffpunkt Galactica\".";
+ if (_gm->_state.language == 1)
+ return false;
+
+ _gm->_state.language = 1;
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KEYCARD_R, SPACESHIP)) {
+ getObject(5)->setProperty(OPENED);
+ _gm->changeRoom(GLIDER);
+ _gm->_newRoom = true;
+ } else {
+ return false;
+ }
+ return true;
}
void ArsanoEntrance::animation() {
+ if (!_vm->_messageDisplayed && isSectionVisible(kMaxSection - 5)) {
+ _vm->playSound(kAudioDoorSound);
+ _gm->drawImage(8);
+ setSectionVisible(9, false);
+ _gm->wait2(2);
+ _gm->drawImage(7);
+ setSectionVisible(8, false);
+ _gm->wait2(2);
+ _gm->drawImage(6);
+ setSectionVisible(7, false);
+ _gm->wait2(2);
+ _gm->drawImage(5);
+ setSectionVisible(6, false);
+ _gm->wait2(2);
+ _gm->drawImage(_gm->invertSection(5));
+ getObject(11)->_click = 255;
+ setSectionVisible(kMaxSection - 5, false);
+ }
+ if (isSectionVisible(2)) {
+ _gm->drawImage(_gm->invertSection(2));
+ } else {
+ if (eyewitness) {
+ --eyewitness;
+ } else {
+ eyewitness = 20;
+ _gm->drawImage(2);
+ }
+ }
+ _gm->setAnimationTimer(4);
}
bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
+ // TODO: Refactor row/dialog data structure for dialog()
+ byte zeilen1[5] = {1, 1, 1, 1, 1};
+ byte zeilen2[5] = {1, 1, 1, 1, 1};
+ byte zeilen3[2] = {1, 1};
+
+ char e;
+ if ((verb == ACTION_TALK) && (obj1._id == PORTER)) {
+ if (_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN)) {
+ _vm->renderMessage("Durch deinen Helm kannst|du nicht sprechen.");
+ } else {
+ if (_gm->_state.language) {
+ do {
+ if (_gm->_state.shoes == 1) {
+ dialog2[2] = "Wo soll ich die Schuhe ablegen?";
+ _gm->addSentence(2, 2);
+ } else if (_gm->_state.shoes > 1) {
+ _gm->removeSentence(2, 2);
+ }
+ switch (e = _gm->dialog(5, nullptr, nullptr, 2)) { // row2, dialog2
+ case 0:
+ _gm->reply("Was, das wissen Sie nicht?", 1, _gm->invertSection(1));
+ _gm->reply("Sie befinden sich im Restaurant|\"Treffpunkt Galactica\".", 1, _gm->invertSection(1));
+ _gm->reply("Wir sind bei den interessantesten|Ereignissen in der Galaxis|immer zur Stelle.", 1, _gm->invertSection(1));
+ _gm->removeSentence(1, 1);
+ break;
+ case 1:
+ _gm->reply("Wenn Sie meinen.", 1, _gm->invertSection(1));
+ _gm->addSentence(1, 2);
+ break;
+ case 2:
+ if (_gm->_state.shoes == 1) {
+ _gm->reply("In der Toilette gibt es|Schlieáfcher fr Schuhe.", 1, _gm->invertSection(1));
+ _gm->_state.shoes = 2;
+ } else {
+ _gm->reply("Wenn Sie das Lokal betreten|wollen, mssen Sie erst|ihre Schuhe ausziehen.", 1, _gm->invertSection(1));
+ _gm->_state.shoes = 1;
+ }
+ break;
+ case 3:
+ _gm->reply("Wollen Sie, daá ich Sie rauáschmeiáe?", 1, _gm->invertSection(1));
+ }
+ } while (e != 4);
+ } else {
+ if (_gm->dialog(5, nullptr, nullptr, 0) != 4) // row2, dialog2
+ _gm->reply("Hhius otgfh Dgfdrkjlh Fokj gf.", 1, _gm->invertSection(1));
+ }
+ }
+ } else if ((verb == ACTION_WALK) && (obj1._id == STAIRCASE) && (_gm->_state.shoes != 3)) {
+ _gm->drawImage(3);
+ _gm->wait2(2);
+ _gm->drawImage(4);
+ setSectionVisible(3, false);
+ if (_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN))
+ _gm->reply("|", 1, _gm->invertSection(1));
+ else if (_gm->_state.language)
+ _gm->reply("Halt!", 1, _gm->invertSection(1));
+ else
+ _gm->reply("Uhwdejkt!", 1, _gm->invertSection(1));
+ _gm->drawImage(3);
+ setSectionVisible(4, false);
+ _gm->wait2(2);
+ _gm->drawImage(_gm->invertSection(3));
+ if (!_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN)) {
+ if (_gm->_state.language) {
+ if (_gm->_state.shoes)
+ _gm->reply("Sie mssen erst ihre Schuhe ausziehen, Sie Trottel!", 1, _gm->invertSection(1));
+ else
+ _gm->reply("Was fllt ihnen ein!|Sie knnen doch ein Lokal|nicht mit Schuhen betreten!", 1, _gm->invertSection(1));
+ e = 0;
+ while ((e < 3) && (_shown[kMaxSection - 1] != 15)) {
+ switch (e = _gm->dialog(5, nullptr, nullptr, 1)) { // row1, dialog1
+ case 0:
+ _gm->reply("Fragen Sie nicht so doof!", 1, 1 + 128);
+ break;
+ case 1:
+ _gm->reply("Was, das wissen Sie nicht?", 1, 1 + 128);
+ _gm->reply("Sie befinden sich im Restaurant|\"Treffpunkt Galactica\".", 1, 1 + 128);
+ _gm->reply("Wir sind bei den interessantesten|Ereignissen in der Galaxis|immer zur Stelle.", 1, 1 + 128);
+ _gm->removeSentence(0, 2);
+ break;
+ case 2:
+ _gm->reply("In der Toilette gibt es|Schlieáfcher fr Schuhe.", 1, 1 + 128);
+ _gm->_state.shoes = 2;
+ break;
+ case 3:
+ _gm->drawImage(3);
+ _gm->wait2(2);
+ _gm->drawImage(4);
+ setSectionVisible(3, false);
+ _gm->reply("Das wrde ich an ihrer|Stelle nicht versuchen!", 1, 1 + 128);
+ _gm->drawImage(3);
+ setSectionVisible(4, false);
+ _gm->wait2(2);
+ _gm->drawImage(_gm->invertSection(3));
+ break;
+ }
+ _gm->removeSentence(0, 1);
+ }
+ } else {
+ _gm->dialog(2, nullptr, nullptr, 0); // row3, dialog3
+ _gm->reply("Hhius otgfh Dgfdrkjlh Fokj gf.", 1, 1 + 128);
+ }
+ }
+ } else if ((verb == ACTION_PRESS) && (obj1._id == BATHROOM_BUTTON)) {
+ _vm->playSound(kAudioDoorSound);
+ _gm->drawImage(5);
+ _gm->wait2(2);
+ _gm->drawImage(6);
+ setSectionVisible(5, false);
+ _gm->wait2(2);
+ _gm->drawImage(7);
+ setSectionVisible(6, false);
+ _gm->wait2(2);
+ _gm->drawImage(8);
+ setSectionVisible(7, false);
+ _gm->wait2(2);
+ _gm->drawImage(9);
+ setSectionVisible(8, false);
+ getObject(11)->_click = 9;
+ } else if ((verb == ACTION_WALK) && (obj1._id == ARSANO_BATHROOM)) {
+ if (_gm->_state.coins) {
+ if (_gm->_state.shoes == 2) {
+ _vm->renderMessage("Du ziehst deine Schuhe|aus und legst sie in|eins der Schlieáfcher.");
+ _gm->_state.shoes = 3;
+ _gm->removeSentence(2, 2);
+ _gm->removeSentence(3, 2);
+ } else if (_gm->_state.shoes == 3) {
+ _vm->renderMessage("Du ziehst deine Schuhe wieder an.");
+ _gm->_state.shoes = 2;
+ } else
+ _vm->renderMessage("Du durchsuchst die Klos nach|anderen brauchbaren Sachen,|findest aber nichts.");
+ } else {
+ if (_gm->_rooms[AIRLOCK]->getObject(5)->hasProperty(WORN))
+ _vm->renderMessage("Bevor du aufs Klo gehst,|solltest du besser deinen|Raumanzug ausziehen.");
+ else {
+ _vm->renderMessage("Du gehst seit sieben Jahren das|erste Mal wieder aufs Klo!");
+ _gm->mouseWait(_gm->_timer1);
+ _vm->removeMessage();
+ _vm->renderMessage("In einem der Schlieáfcher,|die sich auch im Raum befinden,|findest du einige Mnzen.");
+ _gm->takeObject(*getObject(16));
+ _gm->_state.coins = 5;
+ }
+ }
+ _shown[kMaxSection - 5] = true;
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COINS, CAR_SLOT)) {
+ if ((_gm->_state.coins < 5) && (getObject(7 - _gm->_state.coins)->_click == 7))
+ _vm->renderMessage("Mach doch zuerst das Fach leer!");
+ else {
+ _gm->drawImage(15 - _gm->_state.coins);
+ getObject(8 - _gm->_state.coins)->_click = 7;
+ --_gm->_state.coins;
+ if (_gm->_state.coins == 1) {
+ getObject(16)->_name = "M\201nze";
+ }
+ if (_gm->_state.coins == 0) {
+ _gm->_inventory.remove(*getObject(16));
+ _gm->_state.coins = 255;
+ }
+ }
+ } else if ((verb == ACTION_LOOK) && (obj1._id == KITCHEN_SIGN) && _gm->_state.language) {
+ if (_gm->_state.language == 2)
+ _vm->renderMessage("Komisch! Auf einmal kannst du|das Schild lesen! Darauf steht:|\"Zutritt nur fr Personal\".");
+ obj1._description = "Darauf steht:|\"Zutritt nur fr Personal\".";
+ if (_gm->_state.language == 1)
+ return false;
+ _gm->_state.language = 1;
+ } else if ((verb == ACTION_LOOK) && (obj1._id == BATHROOM_SIGN) && _gm->_state.language) {
+ if (_gm->_state.language == 2)
+ _vm->renderMessage("Komisch! Auf einmal kannst|du das Schild lesen!|Darauf steht:\"Toilette\".");
+ obj1._description = "Darauf steht:|\"Toilette\".";
+ if (_gm->_state.language == 1)
+ return false;
+ _gm->_state.language = 1;
+ } else if ((verb == ACTION_WALK) && (obj1._id == MEETUP_EXIT)) {
+ if (!((_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN)) &&
+ (_gm->_rooms[AIRLOCK]->getObject(5)->hasProperty(WORN)) &&
+ (_gm->_rooms[AIRLOCK]->getObject(6)->hasProperty(WORN)))) {
+ _vm->renderMessage("Du ziehst den Raumanzug wieder an.");
+ getObject(4)->setProperty(WORN);
+ getObject(5)->setProperty(WORN);
+ getObject(6)->setProperty(WORN);
+ _gm->mouseWait(_gm->_timer1);
+ _vm->removeMessage();
+ }
+ return false;
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, PORTER))
+ _vm->renderMessage("Nicht so gewaltttig!");
+ else
+ return false;
+ return true;
}
void ArsanoRemaining::animation() {
+ switch (i) {
+ case 0:
+ _gm->drawImage(1);
+ _gm->drawImage(_gm->invertSection(4));
+ break;
+ case 1:
+ _gm->drawImage(_gm->invertSection(1));
+ _gm->drawImage(4);
+ break;
+ case 2:
+ _gm->drawImage(2);
+ _gm->drawImage(_gm->invertSection(4));
+ break;
+
+ case 3:
+ _gm->drawImage(7); // Dragon
+ _gm->drawImage(_gm->invertSection(2));
+ _gm->drawImage(4);
+ break;
+ case 4:
+ _gm->drawImage(8);
+ setSectionVisible(7, false);
+ _gm->drawImage(2);
+ _gm->drawImage(_gm->invertSection(4));
+ break;
+ case 5:
+ _gm->drawImage(_gm->invertSection(8));
+ _gm->drawImage(_gm->invertSection(2));
+ break;
+ case 6:
+ _gm->drawImage(3);
+ _gm->drawImage(2);
+ break;
+ case 7:
+ _gm->drawImage(_gm->invertSection(3));
+ _gm->drawImage(_gm->invertSection(2));
+ break;
+ case 8:
+ _gm->drawImage(3);
+ break;
+ case 9:
+ _gm->drawImage(14); // Card Player 1
+ _gm->drawImage(4);
+ _gm->drawImage(_gm->invertSection(3));
+ break;
+ case 10:
+ _gm->drawImage(15);
+ _gm->drawImage(14);
+ _gm->drawImage(_gm->invertSection(4));
+ _gm->drawImage(3);
+ break;
+ case 11:
+ _gm->drawImage(16);
+ setSectionVisible(15, false);
+ _gm->drawImage(4);
+ _gm->drawImage(_gm->invertSection(3));
+ break;
+ case 12:
+ _gm->drawImage(17);
+ setSectionVisible(16, false);
+ _gm->drawImage(_gm->invertSection(4));
+ _gm->drawImage(3);
+ break;
+ case 13:
+ _gm->drawImage(_gm->invertSection(17));
+ _gm->drawImage(4);
+ _gm->drawImage(_gm->invertSection(3));
+ break;
+ case 14:
+ _gm->drawImage(_gm->invertSection(4));
+ break;
+ case 15:
+ _gm->drawImage(6);
+ break;
+ case 16:
+ _gm->drawImage(18); // Card Player 2
+ _gm->drawImage(5);
+ break;
+ case 17:
+ _gm->drawImage(19);
+ setSectionVisible(18, false);
+ _gm->drawImage(_gm->invertSection(5));
+ break;
+ case 18:
+ _gm->drawImage(20);
+ setSectionVisible(19, false);
+ _gm->drawImage(5);
+ break;
+ case 19:
+ _gm->drawImage(21);
+ setSectionVisible(20, false);
+ _gm->drawImage(_gm->invertSection(5));
+ break;
+ case 20:
+ _gm->drawImage(_gm->invertSection(21));
+ _gm->drawImage(5);
+ break;
+ case 21:
+ _gm->drawImage(_gm->invertSection(5));
+ break;
+ case 22:
+ _gm->drawImage(5);
+ break;
+ case 23:
+ _gm->drawImage(10);
+ chewing = false;
+ _gm->drawImage(_gm->invertSection(5));
+ break;
+ case 24:
+ _gm->drawImage(11);
+ setSectionVisible(10, false);
+ break;
+ case 25:
+ _gm->drawImage(12);
+ setSectionVisible(11, false);
+ break;
+ case 26:
+ _gm->drawImage(13);
+ setSectionVisible(12, false);
+ break;
+ case 27:
+ _gm->drawImage(12);
+ setSectionVisible(13, false);
+ break;
+ case 28:
+ _gm->drawImage(11);
+ setSectionVisible(12, false);
+ break;
+ case 29:
+ _gm->drawImage(10);
+ setSectionVisible(11, false);
+ break;
+ case 30:
+ _gm->drawImage(_gm->invertSection(10));
+ chewing = true;
+ break;
+ case 31:
+ _gm->drawImage(22); // Card Player 3
+ break;
+ case 32:
+ _gm->drawImage(_gm->invertSection(22));
+ break;
+ case 33:
+ _gm->drawImage(_gm->invertSection(6));
+ break;
+ case 34:
+ _gm->drawImage(4);
+ }
+ i = (i + 1) % 35;
+ if (chewing) {
+ if (isSectionVisible(9))
+ _gm->drawImage(_gm->invertSection(9));
+ else
+ _gm->drawImage(9);
+ }
+ _gm->setAnimationTimer(3);
}
void ArsanoRoger::onEntrance() {
-
+ if (!_shown[kMaxSection - 2]) {
+ _gm->say("Darf ich hier Platz nehmen?");
+ _gm->reply("Klar!", 2, 2 + 128);
+ _shown[kMaxSection - 2] = true;
+ }
}
void ArsanoRoger::animation() {
-
+ if (isSectionVisible(1))
+ _gm->drawImage(_gm->invertSection(1));
+ else if (isSectionVisible(10)) {
+ _gm->drawImage(12);
+ setSectionVisible(10, false);
+ setSectionVisible(12, false);
+ } else {
+ if (eyewitness) {
+ --eyewitness;
+ } else {
+ eyewitness = 20;
+ if (isSectionVisible(3))
+ _gm->drawImage(10);
+ else
+ _gm->drawImage(1);
+ }
+ }
+ if (isSectionVisible(3)) {
+ setSectionVisible(5 + hands, false);
+ hands = (hands + 1) % 5;
+ _gm->drawImage(5 + hands);
+ }
+ _gm->setAnimationTimer(4);
}
bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
+ byte zeilen1[4] = {1, 1, 1, 1};
+
+ if ((verb == ACTION_TAKE) && (obj1._id == WALLET)) {
+ if (isSectionVisible(3)) {
+ _gm->great(0);
+ return false;
+ }
+ _gm->reply("Hey, Witzkeks, laá die Brieftasche da liegen!", 2, 2 + 128);
+ } else if ((verb == ACTION_USE) && (obj1._id == CUP)) {
+ _vm->renderMessage("Das ist nicht deine.");
+ } else if ((verb == ACTION_TALK) && (obj1._id == ROGER_W)) {
+ if (isSectionVisible(3))
+ _vm->renderMessage("Roger ist im Moment nicht ansprechbar.");
+ else {
+ switch (_gm->dialog(4, nullptr, nullptr, 1)) { // row1, dialog1
+ case 0:
+ _gm->reply("Bestellen Sie lieber nichts!", 2, 2 + 128);
+ _gm->reply("Ich habe vor zwei Stunden mein Essen|bestellt und immer noch nichts bekommen.", 2, 2 + 128);
+ break;
+ case 1:
+ _gm->reply("Noch mindestens zwei Stunden.", 2, 2 + 128);
+ _gm->reply("Haben Sie keine Idee, womit wir uns|bis dahin die Zeit vertreiben knnen?", 2, 2 + 128);
+ _gm->say("Hmm ... im Moment fllt mir nichts ein, aber vielleicht|hat der Spieler des Adventures ja eine Idee.");
+ break;
+ case 2:
+ _gm->reply("Nein, Sie mssen sich irren.|Ich kenne Sie jedenfalls nicht.", 2, 2 + 128);
+ _gm->say("Aber ihre Kleidung habe ich irgendwo schon mal gesehen.");
+ _gm->reply("Ja? Komisch.", 2, 2 + 128);
+ _gm->say("Jetzt weiá ich's. Sie sind Roger W. !");
+ _gm->reply("Pssst, nicht so laut, sonst will|gleich jeder ein Autogramm von mir.", 2, 2 + 128);
+ _gm->reply("Ich habe extra eine Maske auf, damit|ich nicht von jedem angelabert werde.", 2, 2 + 128);
+ _gm->say("h ... ach so.");
+ _gm->say("Wann kommt denn das nchste SQ-Abenteuer raus?");
+ _gm->reply("SQ 127 máte in einem Monat erscheinen.", 2, 2 + 128);
+ _gm->say("Was, Teil 127 ??");
+ _gm->say("Bei uns ist gerade Teil 8 erschienen.");
+ _gm->reply("Hmm ... von welchem Planeten sind Sie denn?", 2, 2 + 128);
+ _gm->say("Von der Erde.");
+ _gm->reply("Erde? Nie gehrt.", 2, 2 + 128);
+ _gm->reply("Wahrscheinlich irgendein Kaff, wo Neuerungen|erst hundert Jahre spter hingelangen.", 2, 2 + 128);
+ _gm->say("h ... kann sein.");
+ _gm->reply("Aber eins mssen Sie mir erklren!", 2, 2 + 128);
+ _gm->reply("Wieso sehen Sie mir so verdammt hnlich, wenn|Sie nicht von Xenon stammen, wie ich?", 2, 2 + 128);
+ _gm->say("Keine Ahnung. Bis jetzt dachte ich immer, Sie wren ein|von Programmierern auf der Erde erfundenes Computersprite.");
+ _gm->reply("Was? Lachhaft!", 2, 2 + 128);
+ _gm->reply("Wie erklren Sie sich dann,|daá ich ihnen gegenbersitze?", 2, 2 + 128);
+ _gm->say("Ja, das ist in der Tat seltsam.");
+ _gm->reply("Halt, jetzt weiá ich es. Sie sind von der Konkurrenz,|von \"Georgefilm Games\" und wollen mich verunsichern.", 2, 2 + 128);
+ _gm->say("Nein, ich bin nur ein Ahnungsloser Koch von der Erde.");
+ _gm->reply("Na gut, ich glaube Ihnen. Lassen wir jetzt|dieses Thema, langsam wird es mir zu bunt!", 2, 2 + 128);
+ }
+ }
+ } else if (((verb == ACTION_USE) && Object::combine(obj1, obj2, CHESS, ROGER_W)) ||
+ ((verb == ACTION_GIVE) && (obj1._id == CHESS) && (obj2._id == ROGER_W))) {
+ _gm->drawImage(11);
+ _gm->great(0);
+ _gm->say("Eine Partie Schach! Das ist eine gute Idee.");
+ _gm->reply("Schach? Was ist das denn?", 2, 2 + 128);
+ _gm->say("Schach ist ein interessantes Spiel.|Ich werde es Ihnen erklren.");
+ _vm->paletteFadeOut();
+ _gm->_inventory.remove(*_gm->_rooms[CABIN_R3]->getObject(0)); // Chess board
+ g_system->fillScreen(kColorBlack);
+ _vm->_menuBrightness = 255;
+ _vm->paletteBrightness();
+ _vm->renderMessage("Knapp zwei Stunden spter ...");
+ _gm->mouseWait(_gm->_timer1);
+ _vm->removeMessage();
+ _vm->_menuBrightness = 0;
+ _vm->paletteBrightness();
+ _gm->_state.timeStarting -= 125000; /* 2 Stunden */
+ _gm->_state.timeAlarmSystem -= 125000;
+ _gm->_state.eventTime = _vm->getDOSTicks() + 4000;
+ // TODO: implement event calling
+// _gm->_state.event = &supernova;
+ _gm->_state.alarmOn = (_gm->_state.timeAlarmSystem > _vm->getDOSTicks());
+ setSectionVisible(11, false);
+ setSectionVisible(1, false);
+ _vm->renderRoom(*this);
+ _gm->drawImage(3);
+ getObject(3)->_click = 5;
+ getObject(5)->_click = 6;
+ getObject(6)->_click = 7;
+ _vm->paletteFadeIn();
+ _vm->renderMessage("Roger W. steht kurz vor dem Schachmatt|und grbelt nach einem Ausweg.");
+ _gm->mouseWait(_gm->_timer1);
+ _vm->removeMessage();
+ } else {
+ return false;
+ }
+ return true;
}
-void ArsanoGlider::onEntrance() {
+void ArsanoGlider::animation() {
+ if (isSectionVisible(8)) {
+ setSectionVisible(24 + sinus, false);
+ sinus = (sinus + 1) % 14;
+ _gm->drawImage(24 + sinus);
+ } else if (isSectionVisible(24 + sinus))
+ _gm->drawImage(_gm->invertSection(24 + sinus));
+ _gm->setAnimationTimer(2);
}
-void ArsanoGlider::animation() {
+bool ArsanoGlider::interact(Action verb, Object &obj1, Object &obj2) {
+ static char l, r;
+ if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KEYCARD_R, GLIDER_SLOT)) {
+ _gm->drawImage(5);
+ _gm->wait2(7);
+ _gm->drawImage(8);
+ getObject(5)->_click = 10;
+ _gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(8));
+ } else if (((verb == ACTION_TAKE) || (verb == ACTION_PULL)) &&
+ (obj1._id == GLIDER_KEYCARD)) {
+ _gm->drawImage(_gm->invertSection(5));
+ _gm->drawImage(_gm->invertSection(8));
+ getObject(5)->_click = 255;
+ _gm->takeObject(*_gm->_rooms[ROGER]->getObject(8));
+ for (int i = 9; i <= 22; i++)
+ _gm->drawImage(_gm->invertSection(i));
+ l = r = 0;
+ } else if ((verb == ACTION_PRESS) &&
+ (obj1._id >= GLIDER_BUTTON1) && (obj1._id <= GLIDER_BUTTON4)) {
+ int i = obj1._id - GLIDER_BUTTON1 + 1;
+ _gm->drawImage(i);
+ if (isSectionVisible(8)) {
+ l = 0;
+ r = 0;
+ for (int j = 1; j < 8; j++) {
+ if (isSectionVisible(j + 8))
+ l = j;
+ if (isSectionVisible(j + 15))
+ r = j;
+ }
+ switch (i) {
+ case 1:
+ if (l < 7) {
+ l++;
+ _gm->drawImage(l + 8);
+ }
+ break;
+ case 3:
+ if (r < 7) {
+ r++;
+ _gm->drawImage(r + 15);
+ }
+ break;
+ case 2:
+ if (l) {
+ _gm->drawImage(_gm->invertSection(l + 8));
+ l--;
+ }
+ break;
+ case 4:
+ if (r) {
+ _gm->drawImage(_gm->invertSection(r + 15));
+ r--;
+ }
+ }
+ }
+ _gm->wait2(4);
+ _gm->drawImage(_gm->invertSection(i));
+ } else if ((verb == ACTION_USE) && (obj1._id == GLIDER_BUTTONS)) {
+ _vm->renderMessage("Du tippst auf den Tasten herum,|aber es passiert nichts.");
+ } else {
+ return false;
+ }
+ return true;
}
void ArsanoMeetup2::onEntrance() {
-
+ switch (!_gm->_guiEnabled) {
+ case 1:
+ _gm->shipStart();
+ break;
+ case 2:
+ _vm->renderMessage("Alle Raumschiffe haben|den Planeten verlassen.");
+ break;
+ case 3:
+ _vm->renderMessage("Alle Raumschiffe haben den Planeten|verlassen, bis auf eins ...");
+ }
+ _gm->_guiEnabled = true;
}
bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
+ byte zeilen1[2] = {1, 1};
+ byte zeilen2[2] = {1, 1};
+ byte zeilen3[4] = {1, 1, 1, 1};
+ byte zeilen4[2] = {2, 1};
+
+ bool found, flight;
+
+ if (((verb == ACTION_WALK) &&
+ ((obj1._id == SPACESHIP) || (obj1._id == ROGER_W))) ||
+ ((verb == ACTION_TALK) && (obj1._id == ROGER_W))) {
+ _gm->changeRoom(INTRO);
+ _vm->renderImage(30, 0);
+ _vm->paletteBrightness();
+ if (_gm->_rooms[MEETUP2]->isSectionVisible(kMaxSection - 2)) {
+ _gm->reply("Was wollen Sie denn schon wieder?", 1, 1 + 128);
+ found = !_gm->dialog(2, nullptr, nullptr, 0); // row4, dialog4
+ if (!(found))
+ _gm->reply("Nein.", 1, 1 + 128);
+ } else {
+ _gm->reply("Haben Sie zufllig meine Brieftasche gesehen?|Ich muá Sie irgendwo verloren haben.", 1, 1 + 128);
+ _gm->reply("Ohne die Brieftasche kann ich nicht|starten, weil meine Keycard darin ist.", 1, 1 + 128);
+ found = !_gm->dialog(2, nullptr, nullptr, 0); // row1, dialog1
+ _gm->_rooms[MEETUP2]->setSectionVisible(kMaxSection - 2, true);
+ }
+ if (found) {
+ _gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(3));
+ _gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(7));
+ _gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(8));
+ _gm->reply("Oh! Vielen Dank.", 1, 1 + 128);
+ _gm->reply("Wo ist denn Ihr Raumschiff?|Soll ich Sie ein Stck mitnehmen?", 1, 1 + 128);
+ if (flight = _gm->dialog(2, nullptr, nullptr, 0)) { // row2, dialog2
+ _gm->reply("Wo wollen Sie denn hin?", 1, 1 + 128);
+ _gm->dialog(4, nullptr, nullptr, 0); // row3, dialog3
+ _gm->reply("Ok, steigen Sie ein!", 1, 1 + 128);
+ } else {
+ _gm->reply("Wie Sie wollen.", 1, 1 + 128);
+ }
+ _gm->changeRoom(MEETUP2);
+ _gm->_rooms[MEETUP2]->setSectionVisible(12, false);
+ _gm->_rooms[MEETUP2]->getObject(0)->_click = 255;
+ _gm->_rooms[MEETUP2]->getObject(1)->_click = 255;
+ _vm->renderRoom(*this);
+ _vm->paletteBrightness();
+ _gm->shipStart();
+ if (flight) {
+ _vm->renderImage(13, 0);
+ _vm->paletteBrightness();
+ _gm->wait2(36);
+ for (int i = 1; i <= 13; i++) {
+ if (i > 1)
+ _gm->drawImage(_gm->invertSection(i - 1));
+ _gm->drawImage(i);
+ _gm->wait2(2);
+ }
+ _gm->drawImage(_gm->invertSection(13));
+ _gm->wait2(20);
+ _vm->renderImage(14, 0);
+ _vm->paletteBrightness();
+ _gm->wait2(36);
+ for (int i = 1; i <= 13; i++) {
+ if (i > 1)
+ _gm->drawImage(_gm->invertSection(i - 1));
+ _gm->drawImage(i);
+ _gm->wait2(2);
+ }
+ _gm->drawImage(_gm->invertSection(13));
+ _gm->wait2(9);
+ _vm->playSound(kAudioCrash);
+ for (int i = 14; i <= 19; i++) {
+ _gm->drawImage(i);
+ _gm->wait2(3);
+ }
+ _vm->paletteFadeOut();
+ _vm->renderImage(11, 0);
+ _vm->paletteFadeIn();
+ _gm->wait2(18);
+ _vm->renderMessage("Huch, du lebst ja noch!");
+ _gm->great(0);
+ _gm->mouseWait(_gm->_timer1);
+ _vm->removeMessage();
+ _vm->paletteFadeOut();
+ g_system->fillScreen(kColorBlack);
+ _gm->_state.dream = false;
+ // TODO:
+// if (!load_game(-2)) error_temp();
+ _gm->loadTime();
+ _gm->_newRoom = true;
+ _gm->_rooms[CAVE]->getObject(1)->_exitRoom = MEETUP3;
+ _gm->_state.dream = true;
+ }
+ } else {
+ _gm->changeRoom(MEETUP2);
+ }
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KEYCARD_R, SPACESHIP))
+ _vm->renderMessage("Das wrde ich jetzt nicht tun, schlieálich|steht Roger W. neben seinem Schiff.");
+ else
+ return false;
+ return true;
}
bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
+ byte zeilen2[4] = {1, 1, 1, 1};
+ byte zeilen3[2] = {1, 1};
+
+ if ((verb == ACTION_WALK) && (obj1._id == STAR))
+ _vm->renderMessage("Unsinn!");
+ else if ((verb == ACTION_LOOK) && (obj1._id == STAR)) {
+ _vm->renderImage(26, 0);
+ _vm->paletteBrightness();
+ _gm->getInput();
+ g_system->fillScreen(kColorBlack);
+ } else if ((verb == ACTION_WALK) && (obj1._id == UFO)) {
+ g_system->fillScreen(kColorBlack);
+ _vm->renderImage(36, 0);
+ _vm->paletteBrightness();
+ _gm->dialog(3, nullptr, nullptr, 0); // rowX, dialogX
+ _vm->renderImage(36, 1);
+ _gm->wait2(3);
+ _vm->renderImage(36, 2);
+ _gm->wait2(3);
+ _vm->renderImage(36, 3);
+ _gm->wait2(6);
+ _vm->renderImage(36, 4);
+ _vm->playSound(kAudioGunShot);
+ // TODO: wait until audio finshed playing
+ _vm->renderImage(36, 5);
+ _gm->wait2(3);
+ _vm->renderImage(36, 4);
+ _vm->playSound(kAudioGunShot);
+ // TODO: wait until audio finshed playing
+ _vm->renderImage(36, 5);
+ _vm->paletteFadeOut();
+ _gm->wait2(12);
+ _vm->renderImage(0, 0);
+ _vm->paletteFadeIn();
+ _gm->wait2(18);
+ _gm->reply("Ich glaube, er wacht auf.", 2, 2 + 128);
+ _gm->wait2(10);
+ _gm->reply("Ja, sieht so aus.", 1, 1 + 128);
+
+ int i;
+ do {
+ switch (i = _gm->dialog(4, nullptr, nullptr, 2)) { // row2, dialog2
+ case 0:
+ _gm->reply("Sie befinden sich im Raumschiff \"Dexxa\".", 1, 1 + 128);
+ _gm->reply("Wir kommen vom Planeten Axacuss und|sind aus dem gleichen Grund hier wie Sie,|nmlich zur Erforschung der Supernova.", 1, 1 + 128);
+ break;
+ case 1:
+ _gm->reply("Sie knnen beruhigt sein, wir wollen Ihnen nur helfen.", 2, 2 + 128);
+ _gm->say("Und wieso hat der Typ im Raumanzug|eben auf mich geschossen?");
+ _gm->reply("Das war eine Schreckreaktion.", 2, 2 + 128);
+ _gm->reply("Schlieálich ist es fr uns das erste Mal,|daá wir auf eine fremde Intelligenz treffen.", 2, 2 + 128);
+ _gm->reply("Wie wir festgestellt haben, ist|Ihr Raumschiff vllig zerstrt.", 2, 2 + 128);
+ _gm->reply("Wahrscheinlich knnen Sie nicht|mehr auf ihren Heimatplaneten zurck.", 2, 2 + 128);
+ _gm->reply("Wir bieten Ihnen an, Sie|mit nach Axacuss zu nehmen.", 2, 2 + 128);
+ if (_gm->dialog(2, nullptr, nullptr, 0)) { // row3, dialog3
+ _gm->reply("Sind Sie sich da wirklich sicher?", 2, 2 + 128);
+ _gm->say("Wenn ich es mir genau berlege,|fliege ich doch lieber mit.");
+ }
+ _gm->reply("Gut, wir nehmen Sie unter der|Bedingung mit, daá wir Sie jetzt|sofort in Tiefschlaf versetzen drfen.", 2, 2 + 128);
+ _gm->reply("Diese Art des Reisens ist Ihnen|ja scheinbar nicht unbekannt.", 2, 2 + 128);
+ _gm->reply("Sie werden in vier Jahren nach der|Landung der \"Dexxa\" wieder aufgeweckt.", 2, 2 + 128);
+ _gm->reply("Sind Sie damit einverstanden?", 2, 2 + 128);
+ if (_gm->dialog(2, nullptr, nullptr, 0)) { // row3, dialog3
+ _gm->reply("Sind Sie sich da wirklich sicher?", 2, 2 + 128);
+ _gm->say("Wenn ich es mir genau berlege,|fliege ich doch lieber mit.");
+ }
+ _gm->reply("Gut, haben Sie noch irgendwelche Fragen?", 2, 2 + 128);
+ break;
+ case 2:
+ _gm->reply("Keine Panik!", 2, 2 + 128);
+ _gm->reply("Wir tun Ihnen nichts.", 2, 2 + 128);
+ break;
+ case 3:
+ _gm->reply("Wir sprechen nicht ihre Sprache,|sondern Sie sprechen unsere.", 1, 1 + 128);
+ _gm->reply("Nach einer Gehirnanalyse konnten|wir Ihr Gehirn an unsere Sprache anpassen.", 1, 1 + 128);
+ _gm->say("Was? Sie haben in mein Gehirn eingegriffen?");
+ _gm->reply("Keine Angst, wir haben sonst nichts verndert.", 1, 1 + 128);
+ _gm->reply("Ohne diesen Eingriff wren|Sie verloren gewesen.", 1, 1 + 128);
+ }
+ _gm->removeSentence(2, 2);
+ } while (_shown[kMaxSection - 2] != 15);
+ _gm->say("Ich habe keine weiteren Fragen mehr.");
+ _gm->reply("Gut, dann versetzen wir Sie jetzt in Tiefschlaf.", 1, 1 + 128);
+ _gm->reply("Gute Nacht!", 1, 1 + 128);
+ _vm->paletteFadeOut();
+ _gm->_inventory.clear();
+ _gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(1)); // Knife
+ _gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(2)); // Watch
+ _gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(3)); // Discman
+ _gm->changeRoom(CELL);
+ _gm->_newRoom = true;
+ _gm->_state.benOverlay = 2;
+ _gm->_newOverlay = true;
+ _gm->_state.dream = true;
+ } else
+ return false;
+ return true;
}
void AxacussCell::onEntrance() {
-
+ if (_gm->_state.dream) {
+ _vm->renderMessage("Du wachst auf und findest dich in|einem geschlossenen Raum wieder.");
+ _gm->_state.timeStarting = _gm->_state.time - 500000;
+ _gm->_state.timeAlarmSystem = _gm->_state.timeAlarm + _gm->_state.timeStarting;
+ _gm->_state.alarmOn = (_gm->_state.timeAlarmSystem > _gm->_state.time);
+ _gm->_state.powerOff = false;
+ _gm->_state.dream = false;
+ }
}
void AxacussCell::animation() {
+ ++_gm->_state.timeRobot;
+
+ if (_gm->_state.timeRobot == 299) {
+ _gm->drawImage(_gm->invertSection(31));
+ _gm->drawImage(28);
+ getObject(0)->_click = 255;
+ getObject(1)->setProperty(EXIT | OPENABLE | OPENED | CLOSED);
+ } else if ((_gm->_state.timeRobot >= 301) && (_gm->_state.timeRobot <= 320)) {
+ _gm->drawImage(_gm->invertSection(329 - _gm->_state.timeRobot));
+ _gm->drawImage(328 - _gm->_state.timeRobot);
+ } else if (_gm->_state.timeRobot == 321) {
+ _gm->drawImage(31);
+ setSectionVisible(8, false);
+ getObject(0)->_click = 1;
+ getObject(1)->setProperty(EXIT | OPENABLE | CLOSED);
+ }
+
+ if (_gm->_state.timeRobot == 599) {
+ _gm->drawImage(_gm->invertSection(31));
+ _gm->drawImage(8);
+ getObject(0)->_click = 255;
+ getObject(1)->setProperty(EXIT | OPENABLE | OPENED | CLOSED);
+ } else if ((_gm->_state.timeRobot >= 601) && (_gm->_state.timeRobot <= 620)) {
+ _gm->drawImage(_gm->_state.timeRobot - 593 + 128);
+ _gm->drawImage(_gm->_state.timeRobot - 592);
+ } else if (_gm->_state.timeRobot == 621) {
+ _gm->drawImage(31);
+ setSectionVisible(28, false);
+ getObject(0)->_click = 1;
+ getObject(1)->setProperty(EXIT | OPENABLE | CLOSED);
+ } else if (_gm->_state.timeRobot == 700) {
+ _gm->_state.timeRobot = 0;
+ } else if (_gm->_state.timeRobot == 10002) {
+ _gm->drawImage(18 + 128);
+ _gm->drawImage(29);
+ _gm->drawImage(7);
+ getObject(2)->_click = 13;
+ } else if (_gm->_state.timeRobot == 10003) {
+ setSectionVisible(29, false);
+ _gm->drawImage(30);
+ getObject(8)->_click = 12;
+ getObject(7)->_click = 14;
+ _vm->playSound(kAudioUndef4);
+ } else if (_gm->_state.timeRobot == 10010) {
+ --_gm->_state.timeRobot;
+ }
+ if (_gm->_state.timeRobot == 312) {
+ _gm->drawImage(7);
+ getObject(2)->_click = 13;
+ } else if (_gm->_state.timeRobot == 610) {
+ setSectionVisible(7, false);
+ getObject(2)->_click = 255;
+ }
+
+ if ((isSectionVisible(6)) &&
+ ((_gm->_state.timeRobot == 310) || (_gm->_state.timeRobot == 610))) {
+ _vm->playSound(kAudioUndef3);
+ _gm->_state.timeRobot = 10000;
+ }
+
+ _gm->setAnimationTimer(3);
}
bool AxacussCell::interact(Action verb, Object &obj1, Object &obj2) {
+ if ((verb == ACTION_PRESS) && (obj1._id == CELL_BUTTON))
+ _vm->renderMessage("Du drckst den Knopf,|aber nichts passiert.");
+ else if ((verb == ACTION_PULL) && (obj1._id == CELL_WIRE) &&
+ !isSectionVisible(2) &&
+ !isSectionVisible(3) &&
+ !isSectionVisible(5)) {
+ if (isSectionVisible(1)) {
+ _gm->drawImage(_gm->invertSection(1));
+ _gm->drawImage(2);
+ getObject(5)->_click = 7;
+ } else if (isSectionVisible(4)) {
+ _gm->drawImage(_gm->invertSection(4));
+ _gm->drawImage(3);
+ getObject(5)->_click = 8;
+ } else if (isSectionVisible(6)) {
+ _gm->drawImage(_gm->invertSection(6));
+ _gm->drawImage(5);
+ getObject(5)->_click = 10;
+ }
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, CELL_WIRE, SOCKET) &&
+ !isSectionVisible(1) &&
+ !isSectionVisible(4) &&
+ !isSectionVisible(6)) {
+ if (isSectionVisible(2)) {
+ _gm->drawImage(_gm->invertSection(2));
+ _gm->drawImage(1);
+ getObject(5)->_click = 6;
+ } else if (isSectionVisible(3)) {
+ _gm->drawImage(_gm->invertSection(3));
+ _gm->drawImage(4);
+ getObject(5)->_click = 9;
+ } else if (isSectionVisible(5)) {
+ _gm->drawImage(_gm->invertSection(5));
+ _gm->drawImage(6);
+ getObject(5)->_click = 11;
+ } else {
+ _gm->_inventory.remove(*getObject(5));
+ _gm->drawImage(4);
+ getObject(5)->_click = 9;
+ }
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, CELL_WIRE, KNIFE) &&
+ ((isSectionVisible(1)) || (isSectionVisible(2)))) {
+ if (isSectionVisible(1))
+ _gm->shock();
+ else {
+ _gm->drawImage(_gm->invertSection(2));
+ _gm->drawImage(3);
+ getObject(5)->_click = 8;
+ }
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, CELL_WIRE, CELL_TABLE) &&
+ !isSectionVisible(1) &&
+ !isSectionVisible(2) &&
+ !isSectionVisible(5) &&
+ !isSectionVisible(6)) {
+ if (isSectionVisible(3)) {
+ _gm->drawImage(_gm->invertSection(3));
+ _gm->drawImage(5);
+ getObject(5)->_click = 10;
+ } else if (isSectionVisible(4)) {
+ _gm->drawImage(_gm->invertSection(4));
+ _gm->drawImage(6);
+ _gm->shock();
+ } else {
+ _gm->_inventory.remove(*getObject(5));
+ _gm->drawImage(5);
+ getObject(5)->_click = 10;
+ }
+ } else if ((verb == ACTION_TAKE) && (obj1._id == CELL_WIRE) &&
+ !(obj1.hasProperty(CARRIED))) {
+ if (isSectionVisible(3)) {
+ _gm->drawImage(_gm->invertSection(3));
+ _gm->takeObject(obj1);
+ } else if (isSectionVisible(5)) {
+ _gm->drawImage(_gm->invertSection(5));
+ _gm->takeObject(obj1);
+ } else {
+ _vm->renderMessage("Das ist befestigt.");
+ }
+ } else if ((verb == ACTION_WALK) && (obj1._id == CELL_DOOR) &&
+ (obj1.hasProperty(OPENED))) {
+ if (isSectionVisible(30) || isSectionVisible(29))
+ return false;
+ _vm->playSound(kAudioGunShot);
+ // TODO: wait till sound is played
+ _vm->playSound(kAudioGunShot);
+ _vm->playSound(kAudioGunShot);
+ _gm->death("Bei deinem Fluchtversuch hat|dich der Roboter erschossen.");
+ } else if ((verb == ACTION_USE) && (obj1._id == TRAY))
+ _vm->renderMessage("Du iát etwas, aber|es schmeckt scheuálich.");
+ else if ((verb == ACTION_TAKE) && (obj1._id == MAGNET)) {
+ if (isSectionVisible(6))
+ _gm->shock();
+ _gm->takeObject(obj1);
+ _vm->renderMessage("Ok.");
+ } else
+ return false;
+ return true;
}
+
void AxacussCorridor1::onEntrance() {
}
@@ -1101,7 +2110,10 @@ void AxacussCorridor3::onEntrance() {
}
void AxacussCorridor4::onEntrance() {
-
+ _gm->great(4);
+ _gm->corridorOnEntrance();
+ if (_gm->_rooms[GUARD]->isSectionVisible(1))
+ _gm->busted(0);
}
void AxacussCorridor4::animation() {
@@ -1109,7 +2121,32 @@ void AxacussCorridor4::animation() {
}
bool AxacussCorridor4::interact(Action verb, Object &obj1, Object &obj2) {
+ if ((verb == ACTION_TAKE) && (obj1._id == NEWSPAPER)) {
+ setSectionVisible(9, false);
+ _gm->takeObject(obj1);
+ if (isSectionVisible(29))
+ _gm->drawImage(29);
+ } else if (((verb == ACTION_USE) && Object::combine(obj1, obj2, TABLE, WATCH)) ||
+ ((verb == ACTION_GIVE) && (obj1._id == WATCH) &&
+ (obj2._id == TABLE))) {
+ if (obj1._id == WATCH)
+ _gm->_inventory.remove(obj1);
+ else
+ _gm->_inventory.remove(obj2);
+ _gm->drawImage(29);
+ getObject(4)->_click = 8;
+ } else if ((verb == ACTION_TAKE) && (obj1._id == WATCH) &&
+ !obj1.hasProperty(CARRIED)) {
+ setSectionVisible(29, false);
+ getObject(4)->_click = 255;
+ _gm->takeObject(*_gm->_rooms[INTRO]->getObject(2));
+ if (isSectionVisible(9))
+ _gm->drawImage(9);
+ } else
+ return false;
+
+ return true;
}
void AxacussCorridor5::onEntrance() {
@@ -1117,7 +2154,75 @@ void AxacussCorridor5::onEntrance() {
}
bool AxacussCorridor5::interact(Action verb, Object &obj1, Object &obj2) {
+ // TODO: needs to be refactored
+// static char
+// rows[] = {1, 1, 1, 1},
+
+ int sum;
+
+ if ((verb == ACTION_WALK) && (obj1._id == DOOR)) {
+ g_system->fillScreen(kColorBlack);
+ _vm->renderImage(41, 0);
+ _vm->paletteBrightness();
+ if (_gm->_guiEnabled) {
+ _gm->reply("Sie schon wieder?", 1, 1 + 128);
+ goto bestechen;
+ } else {
+ _gm->_guiEnabled = true;
+ _gm->reply("Halt! Sie sind doch dieser Hummel.|Bleiben Sie sofort stehen!", 1, 1 + 128);
+ if (_gm->dialog(2, nullptr, nullptr, 0)) // rows, dialog1
+ _gm->reply("Sehr witzig!", 1, 1 + 128);
+ else {
+ _gm->reply("Kann auch sein, auf jeden Fall|sind Sie der Nicht-Axacussaner.", 1, 1 + 128);
+bestechen:
+ if (_gm->dialog(2, nullptr, nullptr, 0) == 0) { // rows, dialog2
+ _gm->reply("Nein!", 1, 1 + 128);
+ setSectionVisible(kMaxSection - 2, false);
+ if (_gm->_state.money == 0) {
+ _gm->removeSentence(2, 2);
+ _gm->removeSentence(3, 2);
+ } else {
+ _dialog3[2] += Common::String::format("%d Xa.", _gm->_state.money - 200);
+ _dialog3[3] += Common::String::format("%d Xa.", _gm->_state.money);
+ }
+ switch (_gm->dialog(4, nullptr, nullptr, 2)) { // rows, dialog3
+ case 1:
+ _gm->wait2(3);
+ _gm->drawImage(1);
+ _vm->playSound(kAudioVoiceHalt);
+ _gm->drawImage(_gm->invertSection(1));
+ _gm->wait2(5);
+ _gm->drawImage(2);
+ _gm->wait2(2);
+ _gm->shot(3, _gm->invertSection(3));
+ break;
+ case 3:
+ if (_gm->_state.money >= 900) {
+ sum = _gm->_state.money;
+ goto genug;
+ }
+ case 2:
+ if (_gm->_state.money > 1100) {
+ sum = _gm->_state.money - 200;
+ goto genug;
+ }
+ _gm->reply("Das máte schon ein biáchen mehr sein.", 1, 1 + 128);
+ }
+ }
+ }
+ }
+ g_system->fillScreen(kColorBlack);
+ return true;
+genug:
+ _gm->reply("Ok, dann machen Sie daá Sie wegkommen!", 1, 1 + 128);
+ _gm->great(0);
+ _gm->changeRoom(ELEVATOR);
+ _gm->_newRoom = true;
+ _gm->takeMoney(-sum);
+ return true;
+ }
+ return false;
}
void AxacussCorridor6::onEntrance() {
@@ -1125,7 +2230,19 @@ void AxacussCorridor6::onEntrance() {
}
bool AxacussCorridor6::interact(Action verb, Object &obj1, Object &obj2) {
+ if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
+ (obj1.hasProperty(OPENED))) {
+ _gm->drawImage(6);
+ setSectionVisible(7, false);
+ obj1.setProperty(EXIT | OPENABLE | CLOSED);
+ _gm->_rooms[CORRIDOR8]->setSectionVisible(27, false);
+ _gm->_rooms[CORRIDOR8]->setSectionVisible(28, true);
+ _gm->_rooms[CORRIDOR8]->getObject(0)->disableProperty(OPENED);
+ _vm->playSound(kAudioDoorClose);
+ } else
+ return false;
+ return true;
}
void AxacussCorridor7::onEntrance() {
@@ -1137,7 +2254,29 @@ void AxacussCorridor8::onEntrance() {
}
bool AxacussCorridor8::interact(Action verb, Object &obj1, Object &obj2) {
+ if ((verb == ACTION_OPEN) && (obj1._id == DOOR) &&
+ !obj1.hasProperty(OPENED)) {
+ _gm->drawImage(27);
+ setSectionVisible(28, false);
+ obj1.setProperty(OPENED);
+ _gm->_rooms[CORRIDOR6]->setSectionVisible(6, false);
+ _gm->_rooms[CORRIDOR6]->setSectionVisible(7, true);
+ _gm->_rooms[CORRIDOR6]->getObject(2)->setProperty(EXIT | OPENED | OPENABLE);
+ _gm->_rooms[CORRIDOR6]->getObject(2)->_click = 4;
+ _vm->playSound(kAudioDoorOpen);
+ } else if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
+ (obj1._type & OPENED)) {
+ _gm->drawImage(28);
+ setSectionVisible(27, false);
+ obj1.disableProperty(OPENED);
+ _gm->_rooms[CORRIDOR6]->setSectionVisible(6, true);
+ _gm->_rooms[CORRIDOR6]->setSectionVisible(7, false);
+ _gm->_rooms[CORRIDOR6]->getObject(2)->setProperty(EXIT | CLOSED | OPENABLE);
+ _vm->playSound(kAudioDoorClose);
+ } else
+ return false;
+ return true;
}
void AxacussCorridor9::onEntrance() {
@@ -1145,59 +2284,418 @@ void AxacussCorridor9::onEntrance() {
}
bool AxacussCorridor9::interact(Action verb, Object &obj1, Object &obj2) {
+ if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
+ (obj1.hasProperty(OPENED))) {
+ _gm->drawImage(28);
+ setSectionVisible(27, false);
+ obj1.disableProperty(OPENED);
+ _gm->_rooms[GUARD]->setSectionVisible(6, false);
+ _gm->_rooms[GUARD]->getObject(2)->disableProperty(OPENED);
+ _vm->playSound(kAudioDoorClose);
+ } else if ((verb == ACTION_OPEN) && (obj1._id == DOOR) &&
+ !obj1.hasProperty(OPENED)) {
+ _gm->drawImage(27);
+ setSectionVisible(28, false);
+ obj1.setProperty(OPENED);
+ _gm->_rooms[GUARD]->setSectionVisible(6, true);
+ _gm->_rooms[GUARD]->getObject(2)->setProperty(OPENED);
+ _vm->playSound(kAudioDoorOpen);
+ if (!_gm->_rooms[GUARD]->isSectionVisible(1)) {
+ _gm->busted(0);
+ }
+ } else
+ return false;
+ return true;
}
void AxacussBcorridor::onEntrance() {
-
+ _gm->corridorOnEntrance();
+ if (isSectionVisible(7))
+ _gm->busted(-1);
}
bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
+ if (obj1.hasProperty(EXIT) ||
+ ((verb == ACTION_USE) && obj1.hasProperty(COMBINABLE) && obj2.hasProperty(EXIT)))
+ _gm->_guiEnabled = false;
+ if ((verb == ACTION_CLOSE) && (obj1._id >= DOOR1) && (obj1._id <= DOOR4) &&
+ obj1.hasProperty(OPENED)) {
+ _gm->drawImage(_gm->invertSection(obj1._id - DOOR1 + 1));
+ _vm->playSound(kAudioDoorClose);
+ if (obj1.hasProperty(OCCUPIED)) {
+ _gm->_state.destination = 255;
+ obj1.setProperty(EXIT | OPENABLE | CLOSED | CAUGHT);
+ if (!_gm->_rooms[OFFICE_L1 + obj1._id - DOOR1]->isSectionVisible(4))
+ _gm->search(180);
+ else
+ _gm->_state.eventTime = 0xffffffff;
+ } else
+ obj1.setProperty(EXIT | OPENABLE | CLOSED);
+ } else if (((verb == ACTION_WALK) || ((verb == ACTION_OPEN) && !obj1.hasProperty(OPENED))) &&
+ (obj1._id >= DOOR1) && (obj1._id <= DOOR4) &&
+ obj1.hasProperty(OCCUPIED)) {
+ _vm->renderMessage(dontEnter.c_str());
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR1) &&
+ !getObject(4)->hasProperty(OPENED)) {
+ if (getObject(4)->hasProperty(OCCUPIED))
+ _vm->renderMessage(dontEnter.c_str());
+ else {
+ _gm->drawImage(1);
+ _vm->playSound(kAudioDoorOpen);
+ if (getObject(4)->hasProperty(CAUGHT))
+ _gm->busted(11);
+ getObject(4)->setProperty(EXIT | OPENABLE | OPENED);
+ }
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR2) &&
+ !getObject(5)->hasProperty(OPENED)) {
+ if (getObject(5)->hasProperty(OCCUPIED)) {
+ _vm->renderMessage(dontEnter.c_str());
+ } else {
+ _gm->drawImage(2);
+ _vm->playSound(kAudioDoorOpen);
+ if (getObject(5)->hasProperty(CAUGHT))
+ _gm->busted(16);
+ getObject(5)->setProperty(EXIT | OPENABLE | OPENED);
+ }
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR3) &&
+ !getObject(6)->hasProperty(OPENED)) {
+ if (getObject(6)->hasProperty(OCCUPIED)) {
+ _vm->renderMessage(dontEnter.c_str());
+ } else {
+ _gm->drawImage(3);
+ _vm->playSound(kAudioDoorOpen);
+ if (getObject(6)->hasProperty(CAUGHT))
+ _gm->busted(15);
+ getObject(6)->setProperty(EXIT | OPENABLE | OPENED);
+ }
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR4) &&
+ !getObject(7)->hasProperty(OPENED)) {
+ if (getObject(7)->hasProperty(OCCUPIED)) {
+ _vm->renderMessage(dontEnter.c_str());
+ } else {
+ _gm->drawImage(4);
+ _vm->playSound(kAudioDoorOpen);
+ if (getObject(7)->hasProperty(CAUGHT))
+ _gm->busted(20);
+ getObject(7)->setProperty(EXIT | OPENABLE | OPENED);
+ }
+ } else if ((verb == ACTION_LOOK) &&
+ (obj1._id >= DOOR1) && (obj1._id <= DOOR4)) {
+ _gm->_state.nameSeen |= 1 << (obj1._id - DOOR1);
+ return false;
+ } else if ((verb == ACTION_WALK) &&
+ ((obj1._id == PILLAR1) || (obj1._id == PILLAR2))) {
+ _vm->renderMessage("Du stellst dich hinter die Sule.");
+ _gm->_guiEnabled = true;
+ } else
+ return false;
+
+ return true;
}
bool AxacussIntersection::interact(Action verb, Object &obj1, Object &obj2) {
-
+ // STUB
+ return false;
}
bool AxacussExit::interact(Action verb, Object &obj1, Object &obj2) {
-
+ // STUB
+ return false;
}
bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
+ // TODO: use String for manipulation instead of raw char string?
+ char input[11];
+ if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
+ obj1.hasProperty(OPENED)) {
+ _gm->drawImage(_gm->invertSection(9));
+ obj1.setProperty(EXIT | OPENABLE | CLOSED);
+ _vm->playSound(kAudioDoorClose);
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR) &&
+ !getObject(0)->hasProperty(OPENED)) {
+ _gm->drawImage(9);
+ getObject(0)->setProperty(EXIT | OPENABLE | OPENED);
+ _vm->playSound(kAudioDoorOpen);
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
+ _gm->drawImage(4);
+ setSectionVisible(16, false);
+ _vm->playSound(kAudioUndef2);
+ } else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
+ if (isSectionVisible(4))
+ _vm->renderMessage(broken_DE);
+ else
+ _gm->telomat(0);
+ } else if (((verb == ACTION_OPEN) || (verb == ACTION_USE)) &&
+ (obj1._id == LOCKER) &&
+ !obj1.hasProperty(OPENED)) {
+ _vm->renderMessage("Welche Zahlenkombination willst|du eingeben?");
+ _vm->renderBox(160, 70, 70, 10, kColorDarkBlue);
+ input[0] = 0;
+ do
+ _gm->edit(input, 161, 71, 10);
+ while ((_gm->_key.keycode != Common::KEYCODE_ESCAPE) &&
+ (_gm->_key.keycode != Common::KEYCODE_RETURN));
+ _vm->removeMessage();
+ if (_gm->_key.keycode != Common::KEYCODE_ESCAPE) {
+ if (strcmp(input, "89814") != 0) {
+ if (strcmp(input, "41898") == 0)
+ _vm->renderMessage("Hmm, das haut nicht ganz hin,|aber irgendwie muá die Zahl|mit dem Code zusammenhngen.");
+ else
+ _vm->renderMessage("Das war die falsche Kombination.");
+ } else {
+ _gm->drawImage(6);
+ setSectionVisible(7, false);
+ obj1.setProperty(OPENABLE | OPENED);
+ if (getObject(2)->hasProperty(TAKE)) {
+ _gm->drawImage(8);
+ getObject(2)->_click = 9;
+ }
+ _vm->playSound(kAudioDoorOpen);
+ _gm->great(7);
+ }
+ }
+ } else if ((verb == ACTION_CLOSE) && (obj1._id == LOCKER) &&
+ obj1.hasProperty(OPENED)) {
+ _gm->drawImage(7);
+ setSectionVisible(6, false);
+ obj1.setProperty(OPENABLE | CLOSED);
+ setSectionVisible(8, false);
+ getObject(2)->_click = 255;
+ _vm->playSound(kAudioDoorClose);
+ } else if ((verb == ACTION_TAKE) && (obj1._id == TICKETS)) {
+ _gm->drawImage(6);
+ setSectionVisible(8, false);
+ getObject(2)->_click = 255;
+ getObject(2)->resetProperty();
+ _gm->takeMoney(500);
+ } else if ((verb == ACTION_LOOK) && (obj1._id == LETTER)) {
+ g_system->fillScreen(kColorBlack);
+ _vm->renderText("Streng geheim", 10, 10, 4);
+ _vm->renderText("418-98", 270, 10, 4);
+ _vm->renderText("Sehr geehrter Dr. Hansi,", 10, 60, 4);
+ _vm->renderText("Ich muá Ihren Roboterexperten ein Lob aussprechen. Die", 10, 75, 4);
+ _vm->renderText("Imitation von Horst Hummel ist perfekt gelungen, wie ich", 10, 86, 4);
+ _vm->renderText("heute bei der bertragung des Interviews feststellen", 10, 97, 4);
+ _vm->renderText("konnte. Dem Aufschwung Ihrer Firma durch die Werbe-", 10, 108, 4);
+ _vm->renderText("kampagne mit dem falschen Horst Hummel drfte ja jetzt", 10, 119, 4);
+ _vm->renderText("nichts mehr im Wege stehen.", 10, 130, 4);
+ _vm->renderText("PS: Herzlichen zum Geburtstag!", 10, 147, 4);
+ _vm->renderText("Hochachtungsvoll", 200, 170, 4);
+ _vm->renderText("Commander Sumoti", 200, 181, 4);
+ _gm->getInput();
+ g_system->fillScreen(kColorBlack);
+ _vm->renderMessage("Nicht zu fassen!");
+ } else
+ return false;
+ return true;
}
bool AxacussOffice2::interact(Action verb, Object &obj1, Object &obj2) {
+ if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
+ obj1.hasProperty(OPENED)) {
+ _gm->drawImage(_gm->invertSection(9));
+ obj1.setProperty(EXIT | OPENABLE | CLOSED);
+ _vm->playSound(kAudioDoorClose);
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR) &&
+ !getObject(0)->hasProperty(OPENED)) {
+ _gm->drawImage(9);
+ getObject(0)->setProperty(EXIT | OPENABLE | OPENED);
+ _vm->playSound(kAudioDoorOpen);
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
+ _gm->drawImage(4);
+ setSectionVisible(16, false);
+ _vm->playSound(kAudioUndef2);
+ } else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
+ if (isSectionVisible(4))
+ _vm->renderMessage(broken_DE);
+ else
+ _gm->telomat(1);
+ } else
+ return false;
+ return true;
}
bool AxacussOffice3::interact(Action verb, Object &obj1, Object &obj2) {
+ if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
+ obj1.hasProperty(OPENED)) {
+ _gm->drawImage(_gm->invertSection(3));
+ obj1.setProperty(EXIT | OPENABLE | CLOSED);
+ _vm->playSound(kAudioDoorClose);
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR) &&
+ !getObject(0)->hasProperty(OPENED)) {
+ _gm->drawImage(3);
+ getObject(0)->setProperty(EXIT | OPENABLE | OPENED);
+ _vm->playSound(kAudioDoorOpen);
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
+ _gm->drawImage(4);
+ _vm->playSound(kAudioUndef2);
+ } else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
+ if (isSectionVisible(4))
+ _vm->renderMessage(broken_DE);
+ else
+ _gm->telomat(2);
+ } else if ((verb == ACTION_LOOK) && (obj1._id == PAINTING)) {
+ _vm->renderMessage("Hey, hinter dem Bild ist Geld|versteckt. Ich nehme es mit.");
+ _gm->takeMoney(300);
+ obj1._id = NULLOBJECT;
+ } else
+ return false;
+ return true;
}
bool AxacussOffice4::interact(Action verb, Object &obj1, Object &obj2) {
+ if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
+ obj1.hasProperty(OPENED)) {
+ _gm->drawImage(_gm->invertSection(3));
+ obj1.setProperty(EXIT | OPENABLE | CLOSED);
+ _vm->playSound(kAudioDoorClose);
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR) &&
+ !getObject(0)->hasProperty(OPENED)) {
+ _gm->drawImage(3);
+ getObject(0)->setProperty(EXIT | OPENABLE | OPENED);
+ _vm->playSound(kAudioDoorOpen);
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
+ _gm->drawImage(4);
+ _vm->playSound(kAudioUndef2);
+ } else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
+ if (isSectionVisible(4))
+ _vm->renderMessage(broken_DE);
+ else
+ _gm->telomat(3);
+ } else
+ return false;
+ return true;
}
void AxacussOffice5::onEntrance() {
-
+ _gm->great(5);
}
bool AxacussOffice5::interact(Action verb, Object &obj1, Object &obj2) {
+ if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
+ _gm->drawImage(4);
+ _vm->playSound(kAudioUndef2);
+ } else if ((verb == ACTION_TAKE) && (obj1._id == TICKETS)) {
+ _gm->drawImage(_gm->invertSection(5));
+ obj1._click = 255;
+ _gm->takeMoney(350);
+ } else
+ return false;
+ return true;
}
bool AxacussElevator::interact(Action verb, Object &obj1, Object &obj2) {
+ if ((verb == ACTION_WALK) && (obj1._id == DOOR)) {
+ g_system->fillScreen(kColorBlack);
+ _vm->renderImage(41, 0);
+ _vm->paletteBrightness();
+ _gm->reply("Jetzt verschwinden Sie endlich!", 1, 1 + 128);
+ _gm->say("Huch, ich habe mich vertan.");
+ g_system->fillScreen(kColorBlack);
+ } else if ((verb == ACTION_PRESS) && (obj1._id == BUTTON1)) {
+ if (!isSectionVisible(3)) {
+ _gm->drawImage(1);
+ getObject(2)->resetProperty();
+ _vm->playSound(kAudioDoorSound);
+ _gm->wait2(25);
+ for (int i = 3; i <= 7; i++) {
+ _gm->wait2(2);
+ _gm->drawImage(i);
+ }
+ getObject(3)->resetProperty(EXIT);
+ getObject(3)->_click = 2;
+ _gm->drawImage(_gm->invertSection(1));
+ if (!(_gm->_state.greatFlag & 0x4000)) {
+ _vm->playSound(kAudioGreat);
+ _gm->_state.greatFlag |= 0x4000;
+ }
+ }
+ } else if ((verb == ACTION_PRESS) && (obj1._id == BUTTON2)) {
+ if (isSectionVisible(3)) {
+ _gm->drawImage(2);
+ getObject(3)->resetProperty();
+ getObject(3)->_click = 255;
+ _vm->playSound(kAudioDoorSound);
+ for (int i = 7; i >= 3; i--) {
+ _gm->wait2(2);
+ _gm->drawImage(_gm->invertSection(i));
+ }
+ _gm->wait2(25);
+ _vm->playSound(kAudioDoorSound);
+ getObject(2)->resetProperty(EXIT);
+ _gm->drawImage(_gm->invertSection(2));
+ }
+ } else if ((verb == ACTION_WALK) && (obj1._id == JUNGLE)) {
+ _vm->paletteFadeOut();
+ g_system->fillScreen(kColorBlack);
+ _vm->_menuBrightness = 255;
+ _vm->paletteBrightness();
+ _vm->renderMessage("Nachdem du zwei Stunden im|Dschungel herumgeirrt bist,|findest du ein Gebude.");
+ _gm->mouseWait(_gm->_timer1);
+ _vm->removeMessage();
+ _vm->_menuBrightness = 0;
+ _vm->paletteBrightness();
+ // TODO: Reset Time
+// *startingtime -= 125000; // 2 hours
+// *alarmsystime -= 125000;
+// *alarm_on = (*alarmsystime > systime());
+ return false;
+ } else
+ return false;
+ return true;
}
bool AxacussStation::interact(Action verb, Object &obj1, Object &obj2) {
+ if ((verb == ACTION_LOOK) && (obj1._id == STATION_SIGN)) {
+ _gm->changeRoom(SIGN);
+ _gm->_newRoom = true;
+ } else if ((verb == ACTION_WALK) && (obj1._id == DOOR) &&
+ obj1.hasProperty(OPENED)) {
+ _gm->great(0);
+ _vm->paletteFadeOut();
+ _vm->renderImage(35, 0);
+ _vm->renderImage(35, 1);
+ _vm->paletteFadeIn();
+ _gm->wait2(10);
+ for (int i = 8; i <= 21; i++) {
+ _vm->renderImage(35, i);
+ _gm->wait2(2);
+ _vm->renderImage(35, _gm->invertSection(i));
+ }
+ _gm->wait2(18);
+ _vm->renderImage(35, _gm->invertSection(1));
+ for (int i = 2; i <= 7; i++) {
+ _vm->renderImage(35, _gm->invertSection(i));
+ _gm->wait2(3);
+ _vm->renderImage(35, _gm->invertSection(i));
+ }
+ _gm->outro();
+ } else {
+ return false;
+ }
+ return true;
}
bool AxacussSign::interact(Action verb, Object &obj1, Object &obj2) {
-
+ if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT, MONEY) &&
+ isSectionVisible(1)) {
+ _gm->takeMoney(-180);
+ _gm->drawImage(2);
+ setSectionVisible(1, false);
+ _gm->_state.eventTime = _vm->getDOSTicks() + 600;
+// *event = &taxi;
+ return true;
+ }
+ return false;
}
}
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 48bee74..8661edb 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -613,6 +613,10 @@ public:
virtual void onEntrance();
virtual void animation();
virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+ byte sign;
+ byte beacon;
};
class ArsanoEntrance : public Room {
public:
@@ -641,10 +645,33 @@ public:
_objectState[15] = Object("Ausgang",Object::defaultDescription,MEETUP_EXIT,EXIT,255,255,0,MEETUP,22);
_objectState[16] = Object("Münzen","Es sind seltsame|Köpfe darauf abgebildet.",COINS,TAKE|COMBINABLE,255,255,0);
_objectState[17] = Object("Tablettenhülle","Darauf steht:\"Wenn Sie diese|Schrift jetzt lesen können,|hat die Tablette gewirkt.\"",PILL_HULL,TAKE,255,255,0);
+
+ dialog1[0] = "Wieso das denn nicht?";
+ dialog1[1] = "Wo bin ich hier?";
+ dialog1[2] = "Wo soll ich die Schuhe ablegen?";
+ dialog1[3] = "Schwachsinn! Ich gehe jetzt nach oben!";
+ dialog1[4] = "|";
+
+ dialog2[0] = "Wo bin ich hier?";
+ dialog2[1] = "Schnes Wetter heute, nicht wahr?";
+ dialog2[2] = "Wrden Sie mich bitte durchlassen.";
+ dialog2[3] = "Hey Alter, laá mich durch!";
+ dialog2[4] = "|";
+
+ dialog3[0] = "Was haben Sie gesagt?";
+ dialog3[1] = "Sprechen Sie bitte etwas deutlicher!";
+
+ eyewitness = 5;
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
virtual void animation();
+
+private:
+ Common::String dialog1[5];
+ Common::String dialog2[5];
+ Common::String dialog3[5];
+ byte eyewitness;
};
class ArsanoRemaining : public Room {
public:
@@ -658,9 +685,15 @@ public:
_objectState[0] = Object("Treppe",Object::defaultDescription,NULLOBJECT,EXIT,0,0,0,ENTRANCE,17);
_objectState[1] = Object("Stuhl",Object::defaultDescription,NULLOBJECT,EXIT,1,1,0,ROGER,2);
_objectState[2] = Object("Schuhe","Wie ist der denn mit|Schuhen hier reingekommen?",NULLOBJECT,NULLTYPE,2,2,0);
+
+ chewing = true;
}
virtual void animation();
+
+private:
+ bool chewing;
+ int i;
};
class ArsanoRoger : public Room {
public:
@@ -680,11 +713,23 @@ public:
_objectState[6] = Object("Schachspiel",Object::defaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
_objectState[7] = Object("10-Buckazoid-Schein","Nicht gerade sehr viel Geld.",NULLOBJECT,TAKE|COMBINABLE,255,255,0);
_objectState[8] = Object("Keycard von Roger",Object::defaultDescription,KEYCARD_R,TAKE|COMBINABLE,255,255,0);
+
+ dialog1[0] = "Knnten Sie mir ein Gericht empfehlen?";
+ dialog1[1] = "Wie lange dauert es denn noch bis zur Supernova?";
+ dialog1[2] = "Sie kommen mir irgendwie bekannt vor.";
+ dialog1[3] = "|";
+
+ eyewitness = 5;
}
virtual void animation();
virtual void onEntrance();
virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+ Common::String dialog1[4];
+ byte eyewitness;
+ byte hands;
};
class ArsanoGlider : public Room {
public:
@@ -709,7 +754,10 @@ public:
}
virtual void animation();
- virtual void onEntrance();
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+ byte sinus;
};
class ArsanoMeetup2 : public Room {
public:
@@ -723,10 +771,30 @@ public:
_objectState[0] = Object("Roger W.",Object::defaultDescription,ROGER_W,TALK,255,255,0);
_objectState[1] = Object("Raumschiff",Object::defaultDescription,SPACESHIP,COMBINABLE,255,255,0);
_objectState[2] = Object("Höhle",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
+
+ dialog1[0] = "Ach, Ihnen gehrt die. Ich habe sie eben im Sand gefunden.";
+ dialog1[1] = "Nein, tut mir leid.";
+ dialog2[0] = "Nein, danke. Ich bleibe lieber hier.";
+ dialog2[1] = "Ja, das wre gut.";
+ dialog3[0] = "Zur Erde.";
+ dialog3[1] = "Zum Prsident der Galaxis.";
+ dialog3[2] = "Nach Xenon.";
+ dialog3[3] = "Mir egal, setzen Sie mich irgendwo ab!";
+ dialog4[0] = "Ich habe gerade Ihre Brieftasche gefunden!";
+ dialog4[1] = "Sie lag da drben hinter einem Felsen.";
+ dialog4[2] = "Ich wollte nur wissen, ob Sie die Brieftasche wiederhaben.";
}
virtual void onEntrance();
virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+ Common::String dialog1[2];
+ Common::String dialog2[2];
+ Common::String dialog3[4];
+ Common::String dialog4[3];
+ bool found;
+ bool flug;
};
class ArsanoMeetup3 : public Room {
public:
@@ -740,9 +808,20 @@ public:
_objectState[0] = Object("Ufo","Der Eingang scheint offen zu sein.",UFO,EXIT,0,0,0,NULLROOM,3);
_objectState[1] = Object("Stern",Object::defaultDescription,STAR,NULLTYPE,1,1,0);
_objectState[2] = Object("Höhle",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
+
+ dialog2[0] = "Wo bin ich hier?";
+ dialog2[1] = "Was wollen Sie von mir?";
+ dialog2[2] = "Hilfe!!";
+ dialog2[3] = "Warum sprechen Sie meine Sprache?";
+ dialog3[0] = "Ja, ich bin einverstanden.";
+ dialog3[1] = "Nein, lieber bleibe ich hier, als mit Ihnen zu fliegen.";
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+ Common::String dialog2[4];
+ Common::String dialog3[2];
};
// Axacuss
@@ -1002,10 +1081,24 @@ public:
_objectState[0] = Object("Ausgang",Object::defaultDescription,DOOR,EXIT,2,2,0,NULLROOM,2);
_objectState[1] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR6,22);
+
+ _dialog1[0] = "h ... nein, mein Name ist Mller.";
+ _dialog1[1] = "Oh, ich habe mich im Gang vertan.";
+ _dialog2[0] = "Wrden Sie mich bitte zum Fahrstuhl lassen?";
+ _dialog2[1] = "Ich gehe wieder.";
+ _dialog3[0] = "Dann gehe ich eben wieder.";
+ _dialog3[1] = "Ach, halten Sie's Maul, ich gehe trotzdem!";
+ _dialog3[2] = "Wenn Sie mich durchlassen gebe ich Ihnen ";
+ _dialog3[3] = "Wenn Sie mich durchlassen gebe ich Ihnen ";
}
virtual void onEntrance();
virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+ Common::String _dialog1[2];
+ Common::String _dialog2[2];
+ Common::String _dialog3[4];
};
class AxacussCorridor6 : public Room {
public:
@@ -1197,10 +1290,15 @@ public:
_objectState[5] = Object("Tür","Auf einem Schild an der Tür steht \"Saval Lun\".",DOOR2,EXIT|OPENABLE|CLOSED|OCCUPIED,1,1,2,OFFICE_L2,16);
_objectState[6] = Object("Tür","Auf einem Schild an der Tür steht \"Prof. Dr. Ugnul Tschabb\".",DOOR3,EXIT|OPENABLE|OPENED,2,2,3,OFFICE_R1,8);
_objectState[7] = Object("Tür","Auf einem Schild an der Tür steht \"Alga Hurz Li\".",DOOR4,EXIT|OPENABLE|CLOSED|OCCUPIED,3,3,4,OFFICE_R2,18);
+
+ dontEnter = "Diese Tr wrde ich lieber|nicht ffnen. Nach dem Schild zu|urteilen, ist jemand in dem Raum.";
}
virtual void onEntrance();
virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+ Common::String dontEnter;
};
class AxacussIntersection : public Room {
public:
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index ad43ff5..69f7d51 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -188,7 +188,6 @@ public:
void say(const char *text);
void reply(const char *text, int aus1, int aus2);
void shipStart();
- void inventorySeize();
void shot(int a, int b);
void takeMoney(int amount);
void search(int time);
Commit: bfa96d6f5071af1b1d175babe7c641c9406a3a18
https://github.com/scummvm/scummvm/commit/bfa96d6f5071af1b1d175babe7c641c9406a3a18
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:33:12Z
Commit Message:
SUPERNOVA: Adds Audio info for rocks
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 447316f..5bd49d0 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -57,6 +57,7 @@ const AudioInfo audioInfo[kAudioNumSamples] = {
{48, 13530, -1},
{50, 0, 12786},
{50, 12786, -1},
+ {51, 0, -1},
{53, 0, -1},
{54, 0, 8010},
{54, 8010, 24020},
Commit: 5845cd7bd20eaaed9383389c397c321376a47db6
https://github.com/scummvm/scummvm/commit/5845cd7bd20eaaed9383389c397c321376a47db6
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:33:24Z
Commit Message:
SUPERNOVA: Fixes rerendering of the room
One sprite can consist of many sections that are concatenated in a
linked list.
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 5bd49d0..faff7bc 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -359,8 +359,13 @@ void SupernovaEngine::restoreScreen() {
void SupernovaEngine::renderRoom(Room &room) {
if (room.getFileNumber() != -1) {
for (int i = 0; i < _currentImage->_numSections; ++i) {
- if (room.isSectionVisible(i))
- renderImage(room.getFileNumber(), i);
+ int section = i;
+ if (room.isSectionVisible(section)) {
+ do {
+ renderImage(room.getFileNumber(), section);
+ section = _currentImage->_section[section].next;
+ } while (section != 0);
+ }
}
}
}
Commit: cac51759f7fb400c440166263bf9a51a4f4d40f2
https://github.com/scummvm/scummvm/commit/cac51759f7fb400c440166263bf9a51a4f4d40f2
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:33:24Z
Commit Message:
SUPERNOVA: Corrects variables according to naming convention
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index c5c93e2..fa06075 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -1048,16 +1048,16 @@ void ArsanoMeetup::onEntrance() {
}
void ArsanoMeetup::animation() {
- _gm->drawImage(_gm->invertSection(1) + beacon);
- beacon = (beacon + 1) % 5;
- _gm->drawImage(beacon + 1);
- _gm->drawImage(beacon + 8);
- if (isSectionVisible(sign + 13))
- _gm->drawImage(_gm->invertSection(13) + sign);
+ _gm->drawImage(_gm->invertSection(1) + _beacon);
+ _beacon = (_beacon + 1) % 5;
+ _gm->drawImage(_beacon + 1);
+ _gm->drawImage(_beacon + 8);
+ if (isSectionVisible(_sign + 13))
+ _gm->drawImage(_gm->invertSection(13) + _sign);
else
- _gm->drawImage(13 + sign);
+ _gm->drawImage(13 + _sign);
- sign = (sign + 1) % 14;
+ _sign = (_sign + 1) % 14;
_gm->setAnimationTimer(3);
}
@@ -1131,10 +1131,10 @@ void ArsanoEntrance::animation() {
if (isSectionVisible(2)) {
_gm->drawImage(_gm->invertSection(2));
} else {
- if (eyewitness) {
- --eyewitness;
+ if (_eyewitness) {
+ --_eyewitness;
} else {
- eyewitness = 20;
+ _eyewitness = 20;
_gm->drawImage(2);
}
}
@@ -1157,7 +1157,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
if (_gm->_state.language) {
do {
if (_gm->_state.shoes == 1) {
- dialog2[2] = "Wo soll ich die Schuhe ablegen?";
+ _dialog2[2] = "Wo soll ich die Schuhe ablegen?";
_gm->addSentence(2, 2);
} else if (_gm->_state.shoes > 1) {
_gm->removeSentence(2, 2);
@@ -1337,7 +1337,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
}
void ArsanoRemaining::animation() {
- switch (i) {
+ switch (_i) {
case 0:
_gm->drawImage(1);
_gm->drawImage(_gm->invertSection(4));
@@ -1442,7 +1442,7 @@ void ArsanoRemaining::animation() {
break;
case 23:
_gm->drawImage(10);
- chewing = false;
+ _chewing = false;
_gm->drawImage(_gm->invertSection(5));
break;
case 24:
@@ -1471,7 +1471,7 @@ void ArsanoRemaining::animation() {
break;
case 30:
_gm->drawImage(_gm->invertSection(10));
- chewing = true;
+ _chewing = true;
break;
case 31:
_gm->drawImage(22); // Card Player 3
@@ -1486,8 +1486,8 @@ void ArsanoRemaining::animation() {
_gm->drawImage(4);
}
- i = (i + 1) % 35;
- if (chewing) {
+ _i = (_i + 1) % 35;
+ if (_chewing) {
if (isSectionVisible(9))
_gm->drawImage(_gm->invertSection(9));
else
@@ -1512,10 +1512,10 @@ void ArsanoRoger::animation() {
setSectionVisible(10, false);
setSectionVisible(12, false);
} else {
- if (eyewitness) {
- --eyewitness;
+ if (_eyewitness) {
+ --_eyewitness;
} else {
- eyewitness = 20;
+ _eyewitness = 20;
if (isSectionVisible(3))
_gm->drawImage(10);
else
@@ -1523,9 +1523,9 @@ void ArsanoRoger::animation() {
}
}
if (isSectionVisible(3)) {
- setSectionVisible(5 + hands, false);
- hands = (hands + 1) % 5;
- _gm->drawImage(5 + hands);
+ setSectionVisible(5 + _hands, false);
+ _hands = (_hands + 1) % 5;
+ _gm->drawImage(5 + _hands);
}
_gm->setAnimationTimer(4);
}
@@ -1626,11 +1626,11 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
void ArsanoGlider::animation() {
if (isSectionVisible(8)) {
- setSectionVisible(24 + sinus, false);
- sinus = (sinus + 1) % 14;
- _gm->drawImage(24 + sinus);
- } else if (isSectionVisible(24 + sinus))
- _gm->drawImage(_gm->invertSection(24 + sinus));
+ setSectionVisible(24 + _sinus, false);
+ _sinus = (_sinus + 1) % 14;
+ _gm->drawImage(24 + _sinus);
+ } else if (isSectionVisible(24 + _sinus))
+ _gm->drawImage(_gm->invertSection(24 + _sinus));
_gm->setAnimationTimer(2);
}
@@ -1747,7 +1747,8 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(8));
_gm->reply("Oh! Vielen Dank.", 1, 1 + 128);
_gm->reply("Wo ist denn Ihr Raumschiff?|Soll ich Sie ein Stck mitnehmen?", 1, 1 + 128);
- if (flight = _gm->dialog(2, nullptr, nullptr, 0)) { // row2, dialog2
+ flight = _gm->dialog(2, nullptr, nullptr, 0); // row2, dialog2
+ if (flight) {
_gm->reply("Wo wollen Sie denn hin?", 1, 1 + 128);
_gm->dialog(4, nullptr, nullptr, 0); // row3, dialog3
_gm->reply("Ok, steigen Sie ein!", 1, 1 + 128);
@@ -2336,11 +2337,11 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
} else if (((verb == ACTION_WALK) || ((verb == ACTION_OPEN) && !obj1.hasProperty(OPENED))) &&
(obj1._id >= DOOR1) && (obj1._id <= DOOR4) &&
obj1.hasProperty(OCCUPIED)) {
- _vm->renderMessage(dontEnter.c_str());
+ _vm->renderMessage(_dontEnter.c_str());
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR1) &&
!getObject(4)->hasProperty(OPENED)) {
if (getObject(4)->hasProperty(OCCUPIED))
- _vm->renderMessage(dontEnter.c_str());
+ _vm->renderMessage(_dontEnter.c_str());
else {
_gm->drawImage(1);
_vm->playSound(kAudioDoorOpen);
@@ -2351,7 +2352,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR2) &&
!getObject(5)->hasProperty(OPENED)) {
if (getObject(5)->hasProperty(OCCUPIED)) {
- _vm->renderMessage(dontEnter.c_str());
+ _vm->renderMessage(_dontEnter.c_str());
} else {
_gm->drawImage(2);
_vm->playSound(kAudioDoorOpen);
@@ -2362,7 +2363,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR3) &&
!getObject(6)->hasProperty(OPENED)) {
if (getObject(6)->hasProperty(OCCUPIED)) {
- _vm->renderMessage(dontEnter.c_str());
+ _vm->renderMessage(_dontEnter.c_str());
} else {
_gm->drawImage(3);
_vm->playSound(kAudioDoorOpen);
@@ -2373,7 +2374,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR4) &&
!getObject(7)->hasProperty(OPENED)) {
if (getObject(7)->hasProperty(OCCUPIED)) {
- _vm->renderMessage(dontEnter.c_str());
+ _vm->renderMessage(_dontEnter.c_str());
} else {
_gm->drawImage(4);
_vm->playSound(kAudioDoorOpen);
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 8661edb..395a279 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -169,11 +169,19 @@ public:
_objectState[1] = Object("Luke", "Dies ist eine der Tiefschlafkammern.", CABIN, NULLTYPE, 1, 1, 0, NULLROOM, 0);
_objectState[2] = Object("Computer", Object::defaultDescription, COMPUTER, NULLTYPE, 2, 2, 0, NULLROOM, 0);
_objectState[3] = Object("Ausgang", Object::defaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL, 22);
+
+ _codeword_DE = "ZWEIUNDVIERZIG";
+ _codeword_EN = "FORTYTWO";
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
virtual void animation();
virtual void onEntrance();
+
+private:
+ Common::String _input;
+ Common::String _codeword_DE;
+ Common::String _codeword_EN;
};
class ShipCockpit : public Room {
@@ -615,8 +623,8 @@ public:
virtual bool interact(Action verb, Object &obj1, Object &obj2);
private:
- byte sign;
- byte beacon;
+ byte _sign;
+ byte _beacon;
};
class ArsanoEntrance : public Room {
public:
@@ -646,32 +654,32 @@ public:
_objectState[16] = Object("Münzen","Es sind seltsame|Köpfe darauf abgebildet.",COINS,TAKE|COMBINABLE,255,255,0);
_objectState[17] = Object("Tablettenhülle","Darauf steht:\"Wenn Sie diese|Schrift jetzt lesen können,|hat die Tablette gewirkt.\"",PILL_HULL,TAKE,255,255,0);
- dialog1[0] = "Wieso das denn nicht?";
- dialog1[1] = "Wo bin ich hier?";
- dialog1[2] = "Wo soll ich die Schuhe ablegen?";
- dialog1[3] = "Schwachsinn! Ich gehe jetzt nach oben!";
- dialog1[4] = "|";
+ _dialog1[0] = "Wieso das denn nicht?";
+ _dialog1[1] = "Wo bin ich hier?";
+ _dialog1[2] = "Wo soll ich die Schuhe ablegen?";
+ _dialog1[3] = "Schwachsinn! Ich gehe jetzt nach oben!";
+ _dialog1[4] = "|";
- dialog2[0] = "Wo bin ich hier?";
- dialog2[1] = "Schnes Wetter heute, nicht wahr?";
- dialog2[2] = "Wrden Sie mich bitte durchlassen.";
- dialog2[3] = "Hey Alter, laá mich durch!";
- dialog2[4] = "|";
+ _dialog2[0] = "Wo bin ich hier?";
+ _dialog2[1] = "Schnes Wetter heute, nicht wahr?";
+ _dialog2[2] = "Wrden Sie mich bitte durchlassen.";
+ _dialog2[3] = "Hey Alter, laá mich durch!";
+ _dialog2[4] = "|";
- dialog3[0] = "Was haben Sie gesagt?";
- dialog3[1] = "Sprechen Sie bitte etwas deutlicher!";
+ _dialog3[0] = "Was haben Sie gesagt?";
+ _dialog3[1] = "Sprechen Sie bitte etwas deutlicher!";
- eyewitness = 5;
+ _eyewitness = 5;
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
virtual void animation();
private:
- Common::String dialog1[5];
- Common::String dialog2[5];
- Common::String dialog3[5];
- byte eyewitness;
+ Common::String _dialog1[5];
+ Common::String _dialog2[5];
+ Common::String _dialog3[5];
+ byte _eyewitness;
};
class ArsanoRemaining : public Room {
public:
@@ -686,14 +694,14 @@ public:
_objectState[1] = Object("Stuhl",Object::defaultDescription,NULLOBJECT,EXIT,1,1,0,ROGER,2);
_objectState[2] = Object("Schuhe","Wie ist der denn mit|Schuhen hier reingekommen?",NULLOBJECT,NULLTYPE,2,2,0);
- chewing = true;
+ _chewing = true;
}
virtual void animation();
private:
- bool chewing;
- int i;
+ bool _chewing;
+ int _i;
};
class ArsanoRoger : public Room {
public:
@@ -714,12 +722,12 @@ public:
_objectState[7] = Object("10-Buckazoid-Schein","Nicht gerade sehr viel Geld.",NULLOBJECT,TAKE|COMBINABLE,255,255,0);
_objectState[8] = Object("Keycard von Roger",Object::defaultDescription,KEYCARD_R,TAKE|COMBINABLE,255,255,0);
- dialog1[0] = "Knnten Sie mir ein Gericht empfehlen?";
- dialog1[1] = "Wie lange dauert es denn noch bis zur Supernova?";
- dialog1[2] = "Sie kommen mir irgendwie bekannt vor.";
- dialog1[3] = "|";
+ _dialog1[0] = "Knnten Sie mir ein Gericht empfehlen?";
+ _dialog1[1] = "Wie lange dauert es denn noch bis zur Supernova?";
+ _dialog1[2] = "Sie kommen mir irgendwie bekannt vor.";
+ _dialog1[3] = "|";
- eyewitness = 5;
+ _eyewitness = 5;
}
virtual void animation();
@@ -727,9 +735,9 @@ public:
virtual bool interact(Action verb, Object &obj1, Object &obj2);
private:
- Common::String dialog1[4];
- byte eyewitness;
- byte hands;
+ Common::String _dialog1[4];
+ byte _eyewitness;
+ byte _hands;
};
class ArsanoGlider : public Room {
public:
@@ -757,7 +765,7 @@ public:
virtual bool interact(Action verb, Object &obj1, Object &obj2);
private:
- byte sinus;
+ byte _sinus;
};
class ArsanoMeetup2 : public Room {
public:
@@ -772,29 +780,29 @@ public:
_objectState[1] = Object("Raumschiff",Object::defaultDescription,SPACESHIP,COMBINABLE,255,255,0);
_objectState[2] = Object("Höhle",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
- dialog1[0] = "Ach, Ihnen gehrt die. Ich habe sie eben im Sand gefunden.";
- dialog1[1] = "Nein, tut mir leid.";
- dialog2[0] = "Nein, danke. Ich bleibe lieber hier.";
- dialog2[1] = "Ja, das wre gut.";
- dialog3[0] = "Zur Erde.";
- dialog3[1] = "Zum Prsident der Galaxis.";
- dialog3[2] = "Nach Xenon.";
- dialog3[3] = "Mir egal, setzen Sie mich irgendwo ab!";
- dialog4[0] = "Ich habe gerade Ihre Brieftasche gefunden!";
- dialog4[1] = "Sie lag da drben hinter einem Felsen.";
- dialog4[2] = "Ich wollte nur wissen, ob Sie die Brieftasche wiederhaben.";
+ _dialog1[0] = "Ach, Ihnen gehrt die. Ich habe sie eben im Sand gefunden.";
+ _dialog1[1] = "Nein, tut mir leid.";
+ _dialog2[0] = "Nein, danke. Ich bleibe lieber hier.";
+ _dialog2[1] = "Ja, das wre gut.";
+ _dialog3[0] = "Zur Erde.";
+ _dialog3[1] = "Zum Prsident der Galaxis.";
+ _dialog3[2] = "Nach Xenon.";
+ _dialog3[3] = "Mir egal, setzen Sie mich irgendwo ab!";
+ _dialog4[0] = "Ich habe gerade Ihre Brieftasche gefunden!";
+ _dialog4[1] = "Sie lag da drben hinter einem Felsen.";
+ _dialog4[2] = "Ich wollte nur wissen, ob Sie die Brieftasche wiederhaben.";
}
virtual void onEntrance();
virtual bool interact(Action verb, Object &obj1, Object &obj2);
private:
- Common::String dialog1[2];
- Common::String dialog2[2];
- Common::String dialog3[4];
- Common::String dialog4[3];
- bool found;
- bool flug;
+ Common::String _dialog1[2];
+ Common::String _dialog2[2];
+ Common::String _dialog3[4];
+ Common::String _dialog4[3];
+ bool _found;
+ bool _flug;
};
class ArsanoMeetup3 : public Room {
public:
@@ -809,19 +817,19 @@ public:
_objectState[1] = Object("Stern",Object::defaultDescription,STAR,NULLTYPE,1,1,0);
_objectState[2] = Object("Höhle",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
- dialog2[0] = "Wo bin ich hier?";
- dialog2[1] = "Was wollen Sie von mir?";
- dialog2[2] = "Hilfe!!";
- dialog2[3] = "Warum sprechen Sie meine Sprache?";
- dialog3[0] = "Ja, ich bin einverstanden.";
- dialog3[1] = "Nein, lieber bleibe ich hier, als mit Ihnen zu fliegen.";
+ _dialog2[0] = "Wo bin ich hier?";
+ _dialog2[1] = "Was wollen Sie von mir?";
+ _dialog2[2] = "Hilfe!!";
+ _dialog2[3] = "Warum sprechen Sie meine Sprache?";
+ _dialog3[0] = "Ja, ich bin einverstanden.";
+ _dialog3[1] = "Nein, lieber bleibe ich hier, als mit Ihnen zu fliegen.";
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
private:
- Common::String dialog2[4];
- Common::String dialog3[2];
+ Common::String _dialog2[4];
+ Common::String _dialog3[2];
};
// Axacuss
@@ -1291,14 +1299,14 @@ public:
_objectState[6] = Object("Tür","Auf einem Schild an der Tür steht \"Prof. Dr. Ugnul Tschabb\".",DOOR3,EXIT|OPENABLE|OPENED,2,2,3,OFFICE_R1,8);
_objectState[7] = Object("Tür","Auf einem Schild an der Tür steht \"Alga Hurz Li\".",DOOR4,EXIT|OPENABLE|CLOSED|OCCUPIED,3,3,4,OFFICE_R2,18);
- dontEnter = "Diese Tr wrde ich lieber|nicht ffnen. Nach dem Schild zu|urteilen, ist jemand in dem Raum.";
+ _dontEnter = "Diese Tr wrde ich lieber|nicht ffnen. Nach dem Schild zu|urteilen, ist jemand in dem Raum.";
}
virtual void onEntrance();
virtual bool interact(Action verb, Object &obj1, Object &obj2);
private:
- Common::String dontEnter;
+ Common::String _dontEnter;
};
class AxacussIntersection : public Room {
public:
Commit: eabcca3e89d15ffb45c735919666cf1ae0ff7e18
https://github.com/scummvm/scummvm/commit/eabcca3e89d15ffb45c735919666cf1ae0ff7e18
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:33:24Z
Commit Message:
SUPERNOVA: Adds Alt-X as exit shortcut
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index faff7bc..c79748d 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -190,11 +190,10 @@ void SupernovaEngine::updateEvents() {
(_event.kbd.flags & Common::KBD_CTRL)) {
_console->attach();
}
- if (_event.kbd.keycode == Common::KEYCODE_s) {
- for (int i = 0; i < _currentImage->_numSections; ++i) {
- _gm->drawImage(i);
- _system->updateScreen();
- }
+ if (_event.kbd.keycode == Common::KEYCODE_x &&
+ (_event.kbd.flags & Common::KBD_CTRL)) {
+ // TODO: Draw exit box
+ _gameRunning = false;
}
_gm->processInput(_event.kbd);
Commit: c8e0f94fd14073a26bab359900854e4252efea97
https://github.com/scummvm/scummvm/commit/c8e0f94fd14073a26bab359900854e4252efea97
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:33:24Z
Commit Message:
SUPERNOVA: Fixes terminal in sleeping chamber
Instead of manipulating C-Strings edit() now takes a Common::String as a
parameter and the terminal input gets redrawn after every keystroke what
simplifies the function greatly.
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/rooms.h
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index fa06075..2904ca1 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -95,11 +95,9 @@ bool ShipHall::interact(Action verb, Object &obj1, Object &obj2) {
}
bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
- char input[31];
- static char codeword_DE[] = "ZWEIUNDVIERZIG";
- static char codeword_EN[] = "FORTYTWO";
- int32 l,*energy;
- Room *r;
+ int32 *energy;
+ Room *room;
+ Common::String input;
if (((verb == ACTION_LOOK) || (verb == ACTION_USE)) && (obj1._id == COMPUTER)) {
_gm->_guiEnabled = false;
@@ -125,68 +123,60 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
_gm->getInput();
} else {
_vm->renderText("Bitte Passwort eingeben:", 100, 85, kColorWhite99);
- input[0] = 0;
- do {
- _gm->edit(input, 100, 105, 30);
- } while ((_gm->_key.keycode != Common::KEYCODE_RETURN) &&
- (_gm->_key.keycode != Common::KEYCODE_ESCAPE));
- if (_gm->_key.keycode == Common::KEYCODE_ESCAPE) {
- goto escape;
- }
- for (int i = 0; i < 30; ++i) {
- if ((input[i] >= 'a') && (input[i] <= 'z')) {
- input[i] -= 'a' - 'A';
+ _gm->edit(input, 100, 105, 30);
+
+ input.toUppercase();
+ if (_gm->_key.keycode != Common::KEYCODE_ESCAPE) {
+ if (input == _codeword_DE) {
+ _gm->great(6);
+ g_system->fillScreen(kColorDarkBlue);
+ _vm->renderText("Schlafdauer in Tagen:", 30, 85, kColorWhite99);
+ uint daysSleep = 0;
+ do {
+ input.clear();
+ _vm->renderBox(150, 85, 150, 8, kColorDarkBlue);
+ _gm->edit(input, 150, 85, 10);
+
+ if (_gm->_key.keycode == Common::KEYCODE_ESCAPE) {
+ break;
+ } else {
+ daysSleep = input.asUint64();
+ for (uint i = 0; i < input.size(); i++) {
+ if (!Common::isDigit(input[i])) {
+ daysSleep = 0;
+ break;
+ }
+ }
+ }
+ if (daysSleep != 0) {
+ _gm->_state.timeSleep = daysSleep;
+ _vm->renderText("Bitte legen Sie sich in die angezeigte Schlafkammer.", 30, 105, kColorWhite99);
+ _gm->wait2(18);
+ setSectionVisible(5, true);
+ }
+ } while (daysSleep == 0);
+ } else {
+ _vm->renderText("Falsches Passwort", 100, 125, kColorLightRed);
+ _gm->wait2(18);
}
}
- if (strcmp(input,codeword_DE) != 0) {
- _vm->renderText("Falsches Passwort", 100, 125, kColorLightRed);
- _gm->wait2(18);
- goto escape;
- }
- _gm->great(6);
- _vm->renderBox(0, 0, 320, 200, kColorDarkBlue);
- _vm->renderText("Schlafdauer in Tagen:", 30, 85, kColorWhite99);
- do {
- _vm->renderBox(150, 85, 150, 8, kColorDarkBlue);
- input[0] = 0;
- do {
- _gm->edit(input, 150, 85, 10);
- } while ((_gm->_key.keycode != Common::KEYCODE_RETURN) &&
- (_gm->_key.keycode != Common::KEYCODE_ESCAPE));
- if (_gm->_key.keycode == Common::KEYCODE_ESCAPE) {
- goto escape;
- }
- l = atol(input);
- for (uint i = 0; i < strlen(input); i++) {
- if ((input[i] < '0') || (input[i] > '9')) {
- l = 0;
- }
- }
- } while (l == 0);
- _gm->_state.timeSleep = l;
- _vm->renderText("Bitte legen Sie sich in die angezeigte Schlafkammer.",30,105,kColorWhite99);
- _gm->wait2(18);
- setSectionVisible(5, true);
}
- escape:
- _vm->renderRoom(*this);
- _gm->showMenu();
- _gm->drawMapExits();
- _gm->palette();
+
_gm->_guiEnabled = true;
+ input.clear();
} else if (((verb == ACTION_WALK) || (verb == ACTION_USE)) &&
((obj1._id == CABINS) || (obj1._id == CABIN))) {
- r = _gm->_rooms[AIRLOCK];
+ room = _gm->_rooms[AIRLOCK];
if (!(obj1._id == CABIN) || !isSectionVisible(5)) {
_vm->renderMessage("Es würde wenig bringen,|sich in eine Schlafkammer zu legen,|die nicht eingeschaltet ist.");
- } else if (r->getObject(5)->hasProperty(WORN)) {
+ } else if (room->getObject(5)->hasProperty(WORN)) {
_vm->renderMessage("Dazu mußt du erst den Raumanzug ausziehen.");
} else {
_vm->paletteFadeOut();
_gm->drawImage(_gm->invertSection(5));
_gm->drawImage(_gm->invertSection(4));
- r = _gm->_rooms[GENERATOR];
- if (r->isSectionVisible(9)) {
+ room = _gm->_rooms[GENERATOR];
+ if (room->isSectionVisible(9)) {
energy = &_gm->_state.landingModuleEnergy;
} else {
energy = &_gm->_state.shipEnergy;
@@ -196,38 +186,38 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
}
if (_gm->_state.timeSleep >= *energy) {
_gm->_state.timeSleep = *energy;
- if (r->isSectionVisible(9)) {
- r = _gm->_rooms[LANDINGMODULE]; // Monitors off
- r->setSectionVisible(2, false);
- r->setSectionVisible(7, false);
- r->setSectionVisible(8, false);
- r->setSectionVisible(9, false);
- r->setSectionVisible(10, false);
+ if (room->isSectionVisible(9)) {
+ room = _gm->_rooms[LANDINGMODULE]; // Monitors off
+ room->setSectionVisible(2, false);
+ room->setSectionVisible(7, false);
+ room->setSectionVisible(8, false);
+ room->setSectionVisible(9, false);
+ room->setSectionVisible(10, false);
}
}
if (_gm->_state.timeSleep == _gm->_state.time) {
_gm->drawImage(3);
- r = _gm->_rooms[COCKPIT];
- r->setSectionVisible(23, true);
- r = _gm->_rooms[CABIN_R2];
- r->setSectionVisible(5, false);
- r->setSectionVisible(6, true);
- r->getObject(2)->_click = 10;
- r = _gm->_rooms[HOLD];
- r->setSectionVisible(0, false);
- r->setSectionVisible(1, true);
- r->getObject(1)->_click = 255;
- r->getObject(3)->_click = 255;
- r = _gm->_rooms[GENERATOR];
- r->setSectionVisible(6, false);
- r->setSectionVisible(7, true);
- r->getObject(1)->_click = 14;
- if (r->isSectionVisible(1)) {
- r->setSectionVisible(10, true);
+ room = _gm->_rooms[COCKPIT];
+ room->setSectionVisible(23, true);
+ room = _gm->_rooms[CABIN_R2];
+ room->setSectionVisible(5, false);
+ room->setSectionVisible(6, true);
+ room->getObject(2)->_click = 10;
+ room = _gm->_rooms[HOLD];
+ room->setSectionVisible(0, false);
+ room->setSectionVisible(1, true);
+ room->getObject(1)->_click = 255;
+ room->getObject(3)->_click = 255;
+ room = _gm->_rooms[GENERATOR];
+ room->setSectionVisible(6, false);
+ room->setSectionVisible(7, true);
+ room->getObject(1)->_click = 14;
+ if (room->isSectionVisible(1)) {
+ room->setSectionVisible(10, true);
}
- if (r->isSectionVisible(12)) {
- r->setSectionVisible(12, false);
- r->setSectionVisible(11, true);
+ if (room->isSectionVisible(12)) {
+ room->setSectionVisible(12, false);
+ room->setSectionVisible(11, true);
}
}
_gm->_state.time -= _gm->_state.timeSleep;
@@ -237,8 +227,8 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_state.alarmOn = (_gm->_state.timeAlarmSystem > _vm->getDOSTicks());
if (!*energy) {
_gm->turnOff();
- r = _gm->_rooms[GENERATOR];
- r->setSectionVisible(4, r->isSectionVisible(2));
+ room = _gm->_rooms[GENERATOR];
+ room->setSectionVisible(4, room->isSectionVisible(2));
}
if (_gm->_state.time == 0) {
_gm->saveTime();
@@ -2407,8 +2397,7 @@ bool AxacussExit::interact(Action verb, Object &obj1, Object &obj2) {
}
bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
- // TODO: use String for manipulation instead of raw char string?
- char input[11];
+ Common::String input;
if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
obj1.hasProperty(OPENED)) {
_gm->drawImage(_gm->invertSection(9));
@@ -2433,15 +2422,14 @@ bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
!obj1.hasProperty(OPENED)) {
_vm->renderMessage("Welche Zahlenkombination willst|du eingeben?");
_vm->renderBox(160, 70, 70, 10, kColorDarkBlue);
- input[0] = 0;
do
_gm->edit(input, 161, 71, 10);
while ((_gm->_key.keycode != Common::KEYCODE_ESCAPE) &&
(_gm->_key.keycode != Common::KEYCODE_RETURN));
_vm->removeMessage();
if (_gm->_key.keycode != Common::KEYCODE_ESCAPE) {
- if (strcmp(input, "89814") != 0) {
- if (strcmp(input, "41898") == 0)
+ if (!input.equals("89814")) {
+ if (input.equals("41898"))
_vm->renderMessage("Hmm, das haut nicht ganz hin,|aber irgendwie muá die Zahl|mit dem Code zusammenhngen.");
else
_vm->renderMessage("Das war die falsche Kombination.");
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 395a279..ffaf605 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -179,7 +179,6 @@ public:
virtual void onEntrance();
private:
- Common::String _input;
Common::String _codeword_DE;
Common::String _codeword_EN;
};
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 26c9c91..8a8a12d 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -902,98 +902,70 @@ void GameManager::animationOn() {
_animationEnabled = true;
}
-void GameManager::edit(char *text, int x, int y, uint length) {
- // TODO: DOES NOT WORK!!!
-#define GET_STRING_CHAR(str, index) (index < str.size() ? str[index] : 0)
-
+void GameManager::edit(Common::String &input, int x, int y, uint length) {
bool isEditing = true;
- Common::String input(text);
- int cursorPos = x + _vm->textWidth(text);
- char cursorChar = 0;
uint cursorIndex = input.size();
- int cursorCharWidth = 0;
while (isEditing) {
- cursorChar = GET_STRING_CHAR(input, cursorIndex);
-
_vm->_textCursorX = x;
_vm->_textCursorY = y;
_vm->_textColor = COL_EDIT;
+ _vm->renderBox(x, y - 1, 320 - x, 10, HGR_EDIT);
for (uint i = 0; i < input.size(); ++i) {
// Draw char highlight depending on cursor position
- if (i == cursorIndex && cursorChar) {
- cursorCharWidth = _vm->textWidth(cursorChar);
- _vm->renderBox(cursorPos, y - 1, cursorCharWidth, 9, COL_EDIT);
-// _vm->renderBox(cursorPos + cursorCharWidth, y - 1, _vm->textWidth(cursor + 1) + 6, 9, HGR_EDIT);
- _vm->renderText(cursorChar, cursorPos, y, HGR_EDIT);
+ if (i == cursorIndex) {
+ _vm->renderBox(_vm->_textCursorX, y - 1, _vm->textWidth(input[i]), 9, COL_EDIT);
+ _vm->_textColor = HGR_EDIT;
+ _vm->renderText(input[i]);
_vm->_textColor = COL_EDIT;
} else {
_vm->renderText(input[i]);
}
}
if (cursorIndex == input.size()) {
- _vm->renderBox(cursorPos, y - 1, 1, 9, COL_EDIT);
- _vm->renderBox(cursorPos + 1, y - 1, 6, 9, HGR_EDIT);
+ _vm->renderBox(_vm->_textCursorX + 1, y - 1, 6, 9, HGR_EDIT);
+ _vm->renderBox(_vm->_textCursorX , y - 1, 1, 9, COL_EDIT);
}
getKeyInput(true);
switch (_key.keycode) {
case Common::KEYCODE_RETURN:
case Common::KEYCODE_ESCAPE:
+ isEditing = false;
+ break;
case Common::KEYCODE_UP:
case Common::KEYCODE_DOWN:
- cursorChar = GET_STRING_CHAR(input, cursorIndex);
- if (cursorChar) {
- cursorCharWidth = _vm->textWidth(cursorChar);
- } else {
- cursorCharWidth = 1;
- }
- _vm->renderBox(cursorPos, y - 1, cursorCharWidth, 9, HGR_EDIT);
- _vm->renderText(cursorPos, y, cursorChar, COL_EDIT);
- return;
+ cursorIndex = input.size();
+ break;
case Common::KEYCODE_LEFT:
if (cursorIndex != 0) {
--cursorIndex;
- cursorChar = GET_STRING_CHAR(input, cursorIndex);
- cursorPos -= _vm->textWidth(cursorChar);
}
- break;
+ break;
case Common::KEYCODE_RIGHT:
if (cursorIndex != input.size()) {
- cursorChar = GET_STRING_CHAR(input, cursorIndex);
- cursorCharWidth = _vm->textWidth(cursorChar);
- _vm->renderBox(cursorPos, y - 1, cursorCharWidth, 9, HGR_EDIT);
- _vm->renderText(cursorChar, cursorPos, y, COL_EDIT);
++cursorIndex;
- cursorPos += cursorCharWidth;
}
- break;
+ break;
case Common::KEYCODE_DELETE:
if (cursorIndex != input.size()) {
input.deleteChar(cursorIndex);
}
- break;
+ break;
case Common::KEYCODE_BACKSPACE:
if (cursorIndex != 0) {
--cursorIndex;
input.deleteChar(cursorIndex);
}
- break;
+ break;
default:
if (Common::isPrint(_key.ascii) && input.size() < length) {
- int charWidth = _vm->textWidth(_key.ascii);
input.insertChar(_key.ascii, cursorIndex);
++cursorIndex;
- cursorPos += charWidth;
}
- break;
+ break;
}
}
-
- _vm->renderBox(x, y - 1, 320 - x, 10, HGR_EDIT);
- Common::copy(input.begin(), input.end(), text);
-
-#undef GET_STRING_CHAR
}
void GameManager::loadOverlayStart() {
@@ -1123,6 +1095,7 @@ bool GameManager::isHelmetOff() {
bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
Room *r;
char t[150];
+ Common::String input;
if ((verb == ACTION_USE) && (obj1._id == SCHNUCK)) {
if (isHelmetOff()) {
@@ -1208,10 +1181,9 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
_vm->renderBox(88, 87, 144, 24, kColorWhite35);
_vm->renderText("Neue Alarmzeit (hh:mm) :", 91, 90, kColorWhite99);
do {
- t[0] = 0;
_vm->renderBox(91, 99, 138, 9, kColorDarkBlue);
do {
- edit(t, 91, 100, 5);
+ edit(input, 91, 100, 5);
} while ((_key.keycode != Common::KEYCODE_RETURN) &&
(_key.keycode != Common::KEYCODE_ESCAPE));
f = false;
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 69f7d51..4ab3cf1 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -167,7 +167,7 @@ public:
void loadOverlayStart();
void openLocker(const Room *room, Object *obj, Object *lock, int section);
void closeLocker(const Room *room, Object *obj, Object *lock, int section);
- void edit(char *text, int x, int y, uint length);
+ void edit(Common::String &input, int x, int y, uint length);
int invertSection(int section);
void drawMapExits();
void drawStatus();
Commit: 29b7b91a5916b6adc11c813e95730a0feba26adb
https://github.com/scummvm/scummvm/commit/29b7b91a5916b6adc11c813e95730a0feba26adb
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:33:24Z
Commit Message:
SUPERNOVA: Removes TODOs
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 8a8a12d..6f5fe1d 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -749,7 +749,6 @@ void GameManager::drawInventory() {
uint16 GameManager::getKeyInput(bool blockForPrintChar) {
while (true) {
_vm->updateEvents();
- // TODO: Check for valid ascii
if (_keyPressed) {
if (blockForPrintChar) {
if (Common::isPrint(_key.keycode) ||
@@ -790,7 +789,6 @@ Common::EventType GameManager::getMouseInput() {
void GameManager::getInput() {
while (true) {
_vm->updateEvents();
- // TODO: handle key input (e.g. alt+x, F-keys?)
if (_mouseClicked || _keyPressed) {
break;
}
@@ -1151,8 +1149,6 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage("Halt, hier ist ein interessanter Artikel.");
mouseWait(_timer1);
_vm->removeMessage();
- // TODO: Implement a 'newspaper room' to eliminate handling
- // those cases seperately
_vm->renderImage(2, 0);
_vm->setColor63(40);
getInput();
Commit: b0c108ff60930a5b07f134528e058523f7acffba
https://github.com/scummvm/scummvm/commit/b0c108ff60930a5b07f134528e058523f7acffba
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:33:25Z
Commit Message:
SUPERNOVA: Adds ticks to msec conversion constant
Changed paths:
engines/supernova/msn_def.h
engines/supernova/state.cpp
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index f38bbd2..7c596a2 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -28,6 +28,7 @@ namespace Supernova {
const int kScreenWidth = 320;
const int kScreenHeight = 200;
const int kTextSpeed[] = {19, 14, 10, 7, 4};
+const int kMsecPerTick = 55;
const int kMaxSection = 40;
const int kMaxSectionZus = 50;
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 6f5fe1d..4c28a06 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -221,10 +221,10 @@ void GameManager::initState() {
_timer1 = 0;
_animationTimer = 0;
- _state.time = 14200;
+ _state.time = 2840 * kMsecPerTick;
_state.timeSleep = 0;
- _state.timeStarting = 50400000;
- _state.timeAlarm = 25200000;
+ _state.timeStarting = 50400000; // 2 pm -- Originally: systime() - 917650
+ _state.timeAlarm = 25200000; // 7 am
_state.timeAlarmSystem = _state.timeAlarm + _state.timeStarting;
_state.eventTime = 0xffffffff;
_state.shipEnergy = 2135;
Commit: 18894e8f138356234386ff3b4fddf8e9e2c468c7
https://github.com/scummvm/scummvm/commit/18894e8f138356234386ff3b4fddf8e9e2c468c7
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:42:26Z
Commit Message:
SUPERNOVA: Implements turnOn()
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 4c28a06..66ea0af 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -697,7 +697,16 @@ void GameManager::turnOff() {
}
void GameManager::turnOn() {
- // STUB
+ if (!_state.powerOff)
+ return;
+
+ _state.powerOff = false;
+ _vm->paletteBrightness();
+ Room *room = _rooms[SLEEP];
+ room->setSectionVisible(1, false);
+ room->setSectionVisible(2, false);
+ room = _rooms[COCKPIT];
+ room->setSectionVisible(22, false);
}
void GameManager::takeObject(Object &obj) {
Commit: 89059ff50d32bee187b5e03f8c720b17dc490cb2
https://github.com/scummvm/scummvm/commit/89059ff50d32bee187b5e03f8c720b17dc490cb2
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:42:32Z
Commit Message:
SUPERNOVA: Fixes render error on death screen fadeout
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 66ea0af..51cc97f 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1074,7 +1074,7 @@ void GameManager::death(const char *message) {
initGui();
_inventory.clear();
changeRoom(INTRO);
- _vm->renderRoom(*_currentRoom);
+ g_system->fillScreen(kColorBlack);
_vm->paletteFadeIn();
_guiEnabled = true;
Commit: a2f43c4eb6adb3e6c61cc4c1838707e8adb580c2
https://github.com/scummvm/scummvm/commit/a2f43c4eb6adb3e6c61cc4c1838707e8adb580c2
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:42:32Z
Commit Message:
SUPERNOVA: Adds ticks to msec conversion macro
Changed paths:
engines/supernova/msn_def.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 7c596a2..93f4333 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -523,6 +523,8 @@ struct Object {
byte _direction;
};
+#define ticksToMsec(x) (x * kMsecPerTick)
+
}
#endif // MSN_DEF_H
Commit: a24af98b5e7a94fa1d4a91ca66f12b3cb2f0b250
https://github.com/scummvm/scummvm/commit/a24af98b5e7a94fa1d4a91ca66f12b3cb2f0b250
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:42:32Z
Commit Message:
SUPERNOVA: Corrects GameState variable names
According to the naming convention class member variables need to be
prefixed with an underscore.
Unfortunately, I already started converting time constants when making
this change so ticksToMsec() and constant changes are sprinkled over
this commit.
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 2904ca1..9e28c30 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -103,11 +103,11 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_guiEnabled = false;
setSectionVisible(4, false);
g_system->fillScreen(kColorDarkBlue);
- if (_gm->_state.time == 0) {
+ if (_gm->_state._time == 0) {
// Destination reached
_vm->renderText("Flugziel erreicht", 60, 95, kColorWhite99);
_gm->getInput();
- } else if (_gm->_state.powerOff) {
+ } else if (_gm->_state._powerOff) {
// Energy depleted
_vm->renderText("Energie erschöpft", 60, 95, kColorWhite99);
// Artificial coma interrupted
@@ -116,7 +116,7 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
} else if (isSectionVisible(5)) {
// Sleep duration in days
_vm->renderText("Schlafdauer in Tagen:", 30, 85, kColorWhite99);
- _vm->renderText(Common::String::format("%d",_gm->_state.timeSleep).c_str(),
+ _vm->renderText(Common::String::format("%d",_gm->_state._timeSleep).c_str(),
150, 85, kColorWhite99);
_vm->renderText("Bitte legen Sie sich in die angezeigte Schlafkammer.",
30, 105, kColorWhite99);
@@ -149,7 +149,7 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
}
}
if (daysSleep != 0) {
- _gm->_state.timeSleep = daysSleep;
+ _gm->_state._timeSleep = daysSleep;
_vm->renderText("Bitte legen Sie sich in die angezeigte Schlafkammer.", 30, 105, kColorWhite99);
_gm->wait2(18);
setSectionVisible(5, true);
@@ -177,15 +177,15 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
_gm->drawImage(_gm->invertSection(4));
room = _gm->_rooms[GENERATOR];
if (room->isSectionVisible(9)) {
- energy = &_gm->_state.landingModuleEnergy;
+ energy = &_gm->_state._landingModuleEnergy;
} else {
- energy = &_gm->_state.shipEnergy;
+ energy = &_gm->_state._shipEnergy;
}
- if (_gm->_state.timeSleep > _gm->_state.time) {
- _gm->_state.timeSleep = _gm->_state.time;
+ if (_gm->_state._timeSleep > _gm->_state._time) {
+ _gm->_state._timeSleep = _gm->_state._time;
}
- if (_gm->_state.timeSleep >= *energy) {
- _gm->_state.timeSleep = *energy;
+ if (_gm->_state._timeSleep >= *energy) {
+ _gm->_state._timeSleep = *energy;
if (room->isSectionVisible(9)) {
room = _gm->_rooms[LANDINGMODULE]; // Monitors off
room->setSectionVisible(2, false);
@@ -195,7 +195,7 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
room->setSectionVisible(10, false);
}
}
- if (_gm->_state.timeSleep == _gm->_state.time) {
+ if (_gm->_state._timeSleep == _gm->_state._time) {
_gm->drawImage(3);
room = _gm->_rooms[COCKPIT];
room->setSectionVisible(23, true);
@@ -220,26 +220,26 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
room->setSectionVisible(11, true);
}
}
- _gm->_state.time -= _gm->_state.timeSleep;
- *energy -= _gm->_state.timeSleep;
- _gm->_state.timeStarting = _vm->getDOSTicks() - 786520; // 12pm
- _gm->_state.timeAlarmSystem = _gm->_state.timeAlarm + _gm->_state.timeStarting;
- _gm->_state.alarmOn = (_gm->_state.timeAlarmSystem > _vm->getDOSTicks());
+ _gm->_state._time -= _gm->_state._timeSleep;
+ *energy -= _gm->_state._timeSleep;
+ _gm->_state._timeStarting = _vm->_system->getMillis() - ticksToMsec(786520); // 12pm
+ _gm->_state._timeAlarmSystem = _gm->_state._timeAlarm + _gm->_state._timeStarting;
+ _gm->_state._alarmOn = (_gm->_state._timeAlarmSystem > _vm->_system->getMillis());
if (!*energy) {
_gm->turnOff();
room = _gm->_rooms[GENERATOR];
room->setSectionVisible(4, room->isSectionVisible(2));
}
- if (_gm->_state.time == 0) {
+ if (_gm->_state._time == 0) {
_gm->saveTime();
if (!_gm->saveGame(-2))
_gm->errorTemp();
- _gm->_state.dream = true;
+ _gm->_state._dream = true;
_gm->loadTime();
}
_gm->wait2(18);
_vm->paletteFadeIn();
- if (_gm->_state.time == 0) {
+ if (_gm->_state._time == 0) {
_vm->playSound(kAudioCrash);
_gm->screenShake();
_gm->wait2(18);
@@ -255,7 +255,7 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
void ShipSleepCabin::animation() {
static char color;
- if (_gm->_state.powerOff && _gm->_state.time) {
+ if (_gm->_state._powerOff && _gm->_state._time) {
if (_gm->_guiEnabled) {
if (isSectionVisible(1)) {
_gm->drawImage(2);
@@ -283,7 +283,7 @@ void ShipSleepCabin::animation() {
_gm->setAnimationTimer(6);
}
void ShipSleepCabin::onEntrance() {
- if (_gm->_state.dream && (_gm->_rooms[CAVE]->getObject(1)->_exitRoom == MEETUP3)) {
+ if (_gm->_state._dream && (_gm->_rooms[CAVE]->getObject(1)->_exitRoom == MEETUP3)) {
_vm->renderMessage("Du wachst mit brummendem Schädel auf|und merkst, daß du nur geträumt hast.");
_gm->mouseWait(_gm->_timer1);
_vm->removeMessage();
@@ -291,7 +291,7 @@ void ShipSleepCabin::onEntrance() {
_gm->mouseWait(_gm->_timer1);
_vm->removeMessage();
_vm->renderMessage("Was steht dir jetzt wohl wirklich bevor?");
- _gm->_state.dream = false;
+ _gm->_state._dream = false;
}
setRoomSeen(true);
}
@@ -304,21 +304,22 @@ bool ShipCockpit::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_guiEnabled = false;
_vm->renderBox(0, 0, 320, 200, kColorBlack);
_vm->renderText("Geschwindigkeit: ", 50, 50, kColorLightYellow);
- if (_gm->_state.time)
+ if (_gm->_state._time)
_vm->renderText("8000 hpm");
else
_vm->renderText("0 hpm");
_vm->renderText("Ziel: Arsano 3", 50, 70, kColorLightYellow);
_vm->renderText("Entfernung: ", 50, 90, kColorLightYellow);
- _vm->renderText(Common::String::format("%d", _gm->_state.timeStarting / 7200000).c_str());
+ _vm->renderText(Common::String::format("%d", _gm->_state._time / ticksToMsec(400)).c_str());
_vm->renderText(",");
- c[0] = (_gm->_state.timeStarting / 720000) % 10 + '0';
+ c[0] = (_gm->_state._time / ticksToMsec(40)) % 10 + '0';
_vm->renderText(c);
- c[0] = (_gm->_state.timeStarting / 72000) % 10 + '0';
+ c[0] = (_gm->_state._time / ticksToMsec(4)) % 10 + '0';
_vm->renderText(c);
_vm->renderText(" Lichtjahre");
_vm->renderText("Dauer der Reise bei momentaner Geschwindigkeit:", 50, 110, kColorLightYellow);
- _vm->renderText(Common::String::format("%d", _gm->_state.timeStarting / 18000).c_str(), 50, 120, kColorLightYellow);
+ _vm->renderText(Common::String::format("%d", _gm->_state._time).c_str(),
+ 50, 120, kColorLightYellow);
_vm->renderText(" Tage");
_gm->getInput();
@@ -351,7 +352,7 @@ void ShipCockpit::animation() {
_gm->setAnimationTimer(10);
}
}
- if (_gm->_state.powerOff) {
+ if (_gm->_state._powerOff) {
if (!_gm->_guiEnabled) {
_vm->renderText("Energievorrat erschpft", 97, 165, color);
_vm->renderText("Notstromversorgung aktiv", 97, 175, color);
@@ -701,11 +702,11 @@ bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, HOLD_WIRE)) {
getObject(0)->_name = "Leitung mit Lsterklemme";
_gm->_inventory.remove(*getObject(2));
- _gm->_state.terminalStripConnected = true;
- _gm->_state.terminalStripWire = true;
+ _gm->_state._terminalStripConnected = true;
+ _gm->_state._terminalStripWire = true;
_vm->renderMessage("Ok.");
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, SPOOL)) {
- if (!_gm->_state.terminalStripConnected)
+ if (!_gm->_state._terminalStripConnected)
_vm->renderMessage("Womit denn?");
else {
_gm->drawImage(5);
@@ -747,7 +748,7 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_PRESS) && (obj1._id == LANDINGMOD_BUTTON))
_vm->renderMessage(obj1._description);
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, PEN, LANDINGMOD_BUTTON)) {
- if (_gm->_state.landingModuleEnergy) {
+ if (_gm->_state._landingModuleEnergy) {
r = _gm->_rooms[GENERATOR];
if (isSectionVisible(7)) {
_gm->drawImage(_gm->invertSection(9));
@@ -756,13 +757,13 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
_gm->drawImage(_gm->invertSection(7));
_gm->drawImage(_gm->invertSection(10));
if (r->isSectionVisible(9))
- _gm->_state.powerOff = true;
+ _gm->_state._powerOff = true;
_gm->roomBrightness();
_vm->paletteBrightness();
} else {
_gm->drawImage(7);
if (r->isSectionVisible(9))
- _gm->_state.powerOff = false;
+ _gm->_state._powerOff = false;
// load("MSN_DATA.025");
_gm->roomBrightness();
_vm->paletteBrightness();
@@ -791,12 +792,12 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_inventory.remove(*r->getObject(8));
getObject(4)->_name = r->getObject(8)->_name;
_gm->drawImage(4);
- if (_gm->_state.cableConnected) {
+ if (_gm->_state._cableConnected) {
_gm->drawImage(5);
getObject(4)->_click = 6;
} else {
getObject(4)->_click = 5;
- if (_gm->_state.terminalStripWire)
+ if (_gm->_state._terminalStripWire)
_gm->drawImage(11);
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SPOOL, LANDINGMOD_SOCKET))
@@ -806,10 +807,10 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
getObject(4)->_name = "Leitung mit L\201sterklemme";
r = _gm->_rooms[HOLD];
_gm->_inventory.remove(*r->getObject(2));
- _gm->_state.terminalStripConnected = true;
- _gm->_state.terminalStripWire = true;
+ _gm->_state._terminalStripConnected = true;
+ _gm->_state._terminalStripWire = true;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, SPOOL)) {
- if (!_gm->_state.terminalStripConnected)
+ if (!_gm->_state._terminalStripConnected)
_vm->renderMessage("Womit denn?");
else {
_gm->drawImage(5);
@@ -909,7 +910,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
setSectionVisible(3, false);
setSectionVisible(4, false);
getObject(11)->_click = 10;
- if (_gm->_state.shipEnergy)
+ if (_gm->_state._shipEnergy)
_gm->turnOn();
else
_gm->drawImage(4);
@@ -918,7 +919,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
_gm->drawImage(2);
if (getObject(11)->_click == 11)
_gm->drawImage(3);
- if (_gm->_state.powerOff)
+ if (_gm->_state._powerOff)
_gm->drawImage(4);
obj1.setProperty(OPENED);
obj1._click = 6;
@@ -941,7 +942,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
_gm->drawImage(9);
getObject(0)->_click = 16;
r = _gm->_rooms[LANDINGMODULE];
- if (_gm->_state.landingModuleEnergy && r->isSectionVisible(7))
+ if (_gm->_state._landingModuleEnergy && r->isSectionVisible(7))
_gm->turnOn();
else
_gm->drawImage(4);
@@ -963,7 +964,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
isSectionVisible(3)) {
_vm->renderMessage("Was n\201tzt dir der Anschlu\341|ohne eine Stromquelle?!");
} else if ((verb == ACTION_LOOK) && (obj1._id == VOLTMETER)) {
- if (_gm->_state.powerOff)
+ if (_gm->_state._powerOff)
_vm->renderMessage("Die Spannung ist auf Null abgesunken.");
else
_vm->renderMessage("Es zeigt volle Spannung an.");
@@ -1031,9 +1032,9 @@ void ArsanoMeetup::onEntrance() {
_gm->wait2(3);
_gm->drawImage(_gm->invertSection(6));
}
- if (!(_gm->_state.greatFlag & 0x8000)) {
+ if (!(_gm->_state._greatFlag & 0x8000)) {
_vm->playSound(kAudioGreat);
- _gm->_state.greatFlag |= 0x8000;
+ _gm->_state._greatFlag |= 0x8000;
}
}
@@ -1079,15 +1080,15 @@ bool ArsanoMeetup::interact(Action verb, Object &obj1, Object &obj2) {
_gm->wait2(3);
return false;
- } else if ((verb == ACTION_LOOK) && (obj1._id == MEETUP_SIGN) && _gm->_state.language) {
- if (_gm->_state.language == 2)
+ } else if ((verb == ACTION_LOOK) && (obj1._id == MEETUP_SIGN) && _gm->_state._language) {
+ if (_gm->_state._language == 2)
_vm->renderMessage("Komisch! Auf einmal kannst du|das Schild lesen! Darauf steht:|\"Treffpunkt Galactica\".");
obj1._description = "Darauf steht:|\"Treffpunkt Galactica\".";
- if (_gm->_state.language == 1)
+ if (_gm->_state._language == 1)
return false;
- _gm->_state.language = 1;
+ _gm->_state._language = 1;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KEYCARD_R, SPACESHIP)) {
getObject(5)->setProperty(OPENED);
_gm->changeRoom(GLIDER);
@@ -1144,12 +1145,12 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
if (_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN)) {
_vm->renderMessage("Durch deinen Helm kannst|du nicht sprechen.");
} else {
- if (_gm->_state.language) {
+ if (_gm->_state._language) {
do {
- if (_gm->_state.shoes == 1) {
+ if (_gm->_state._shoes == 1) {
_dialog2[2] = "Wo soll ich die Schuhe ablegen?";
_gm->addSentence(2, 2);
- } else if (_gm->_state.shoes > 1) {
+ } else if (_gm->_state._shoes > 1) {
_gm->removeSentence(2, 2);
}
switch (e = _gm->dialog(5, nullptr, nullptr, 2)) { // row2, dialog2
@@ -1164,12 +1165,12 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
_gm->addSentence(1, 2);
break;
case 2:
- if (_gm->_state.shoes == 1) {
+ if (_gm->_state._shoes == 1) {
_gm->reply("In der Toilette gibt es|Schlieáfcher fr Schuhe.", 1, _gm->invertSection(1));
- _gm->_state.shoes = 2;
+ _gm->_state._shoes = 2;
} else {
_gm->reply("Wenn Sie das Lokal betreten|wollen, mssen Sie erst|ihre Schuhe ausziehen.", 1, _gm->invertSection(1));
- _gm->_state.shoes = 1;
+ _gm->_state._shoes = 1;
}
break;
case 3:
@@ -1181,14 +1182,14 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
_gm->reply("Hhius otgfh Dgfdrkjlh Fokj gf.", 1, _gm->invertSection(1));
}
}
- } else if ((verb == ACTION_WALK) && (obj1._id == STAIRCASE) && (_gm->_state.shoes != 3)) {
+ } else if ((verb == ACTION_WALK) && (obj1._id == STAIRCASE) && (_gm->_state._shoes != 3)) {
_gm->drawImage(3);
_gm->wait2(2);
_gm->drawImage(4);
setSectionVisible(3, false);
if (_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN))
_gm->reply("|", 1, _gm->invertSection(1));
- else if (_gm->_state.language)
+ else if (_gm->_state._language)
_gm->reply("Halt!", 1, _gm->invertSection(1));
else
_gm->reply("Uhwdejkt!", 1, _gm->invertSection(1));
@@ -1197,8 +1198,8 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
_gm->wait2(2);
_gm->drawImage(_gm->invertSection(3));
if (!_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN)) {
- if (_gm->_state.language) {
- if (_gm->_state.shoes)
+ if (_gm->_state._language) {
+ if (_gm->_state._shoes)
_gm->reply("Sie mssen erst ihre Schuhe ausziehen, Sie Trottel!", 1, _gm->invertSection(1));
else
_gm->reply("Was fllt ihnen ein!|Sie knnen doch ein Lokal|nicht mit Schuhen betreten!", 1, _gm->invertSection(1));
@@ -1216,7 +1217,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
break;
case 2:
_gm->reply("In der Toilette gibt es|Schlieáfcher fr Schuhe.", 1, 1 + 128);
- _gm->_state.shoes = 2;
+ _gm->_state._shoes = 2;
break;
case 3:
_gm->drawImage(3);
@@ -1254,15 +1255,15 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
setSectionVisible(8, false);
getObject(11)->_click = 9;
} else if ((verb == ACTION_WALK) && (obj1._id == ARSANO_BATHROOM)) {
- if (_gm->_state.coins) {
- if (_gm->_state.shoes == 2) {
+ if (_gm->_state._coins) {
+ if (_gm->_state._shoes == 2) {
_vm->renderMessage("Du ziehst deine Schuhe|aus und legst sie in|eins der Schlieáfcher.");
- _gm->_state.shoes = 3;
+ _gm->_state._shoes = 3;
_gm->removeSentence(2, 2);
_gm->removeSentence(3, 2);
- } else if (_gm->_state.shoes == 3) {
+ } else if (_gm->_state._shoes == 3) {
_vm->renderMessage("Du ziehst deine Schuhe wieder an.");
- _gm->_state.shoes = 2;
+ _gm->_state._shoes = 2;
} else
_vm->renderMessage("Du durchsuchst die Klos nach|anderen brauchbaren Sachen,|findest aber nichts.");
} else {
@@ -1274,39 +1275,39 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
_vm->removeMessage();
_vm->renderMessage("In einem der Schlieáfcher,|die sich auch im Raum befinden,|findest du einige Mnzen.");
_gm->takeObject(*getObject(16));
- _gm->_state.coins = 5;
+ _gm->_state._coins = 5;
}
}
_shown[kMaxSection - 5] = true;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COINS, CAR_SLOT)) {
- if ((_gm->_state.coins < 5) && (getObject(7 - _gm->_state.coins)->_click == 7))
+ if ((_gm->_state._coins < 5) && (getObject(7 - _gm->_state._coins)->_click == 7))
_vm->renderMessage("Mach doch zuerst das Fach leer!");
else {
- _gm->drawImage(15 - _gm->_state.coins);
- getObject(8 - _gm->_state.coins)->_click = 7;
- --_gm->_state.coins;
- if (_gm->_state.coins == 1) {
+ _gm->drawImage(15 - _gm->_state._coins);
+ getObject(8 - _gm->_state._coins)->_click = 7;
+ --_gm->_state._coins;
+ if (_gm->_state._coins == 1) {
getObject(16)->_name = "M\201nze";
}
- if (_gm->_state.coins == 0) {
+ if (_gm->_state._coins == 0) {
_gm->_inventory.remove(*getObject(16));
- _gm->_state.coins = 255;
+ _gm->_state._coins = 255;
}
}
- } else if ((verb == ACTION_LOOK) && (obj1._id == KITCHEN_SIGN) && _gm->_state.language) {
- if (_gm->_state.language == 2)
+ } else if ((verb == ACTION_LOOK) && (obj1._id == KITCHEN_SIGN) && _gm->_state._language) {
+ if (_gm->_state._language == 2)
_vm->renderMessage("Komisch! Auf einmal kannst du|das Schild lesen! Darauf steht:|\"Zutritt nur fr Personal\".");
obj1._description = "Darauf steht:|\"Zutritt nur fr Personal\".";
- if (_gm->_state.language == 1)
+ if (_gm->_state._language == 1)
return false;
- _gm->_state.language = 1;
- } else if ((verb == ACTION_LOOK) && (obj1._id == BATHROOM_SIGN) && _gm->_state.language) {
- if (_gm->_state.language == 2)
+ _gm->_state._language = 1;
+ } else if ((verb == ACTION_LOOK) && (obj1._id == BATHROOM_SIGN) && _gm->_state._language) {
+ if (_gm->_state._language == 2)
_vm->renderMessage("Komisch! Auf einmal kannst|du das Schild lesen!|Darauf steht:\"Toilette\".");
obj1._description = "Darauf steht:|\"Toilette\".";
- if (_gm->_state.language == 1)
+ if (_gm->_state._language == 1)
return false;
- _gm->_state.language = 1;
+ _gm->_state._language = 1;
} else if ((verb == ACTION_WALK) && (obj1._id == MEETUP_EXIT)) {
if (!((_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN)) &&
(_gm->_rooms[AIRLOCK]->getObject(5)->hasProperty(WORN)) &&
@@ -1590,12 +1591,12 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
_vm->removeMessage();
_vm->_menuBrightness = 0;
_vm->paletteBrightness();
- _gm->_state.timeStarting -= 125000; /* 2 Stunden */
- _gm->_state.timeAlarmSystem -= 125000;
- _gm->_state.eventTime = _vm->getDOSTicks() + 4000;
+ _gm->_state._timeStarting -= 7200000; // 2 hours
+ _gm->_state._timeAlarmSystem -= 7200000;
+ _gm->_state._eventTime = _vm->_system->getMillis() + 220000;
// TODO: implement event calling
// _gm->_state.event = &supernova;
- _gm->_state.alarmOn = (_gm->_state.timeAlarmSystem > _vm->getDOSTicks());
+ _gm->_state._alarmOn = (_gm->_state._timeAlarmSystem > _vm->_system->getMillis());
setSectionVisible(11, false);
setSectionVisible(1, false);
_vm->renderRoom(*this);
@@ -1790,13 +1791,13 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
_vm->removeMessage();
_vm->paletteFadeOut();
g_system->fillScreen(kColorBlack);
- _gm->_state.dream = false;
+ _gm->_state._dream = false;
// TODO:
// if (!load_game(-2)) error_temp();
_gm->loadTime();
_gm->_newRoom = true;
_gm->_rooms[CAVE]->getObject(1)->_exitRoom = MEETUP3;
- _gm->_state.dream = true;
+ _gm->_state._dream = true;
}
} else {
_gm->changeRoom(MEETUP2);
@@ -1901,9 +1902,9 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(3)); // Discman
_gm->changeRoom(CELL);
_gm->_newRoom = true;
- _gm->_state.benOverlay = 2;
+ _gm->_state._benOverlay = 2;
_gm->_newOverlay = true;
- _gm->_state.dream = true;
+ _gm->_state._dream = true;
} else
return false;
@@ -1911,76 +1912,76 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
}
void AxacussCell::onEntrance() {
- if (_gm->_state.dream) {
+ if (_gm->_state._dream) {
_vm->renderMessage("Du wachst auf und findest dich in|einem geschlossenen Raum wieder.");
- _gm->_state.timeStarting = _gm->_state.time - 500000;
- _gm->_state.timeAlarmSystem = _gm->_state.timeAlarm + _gm->_state.timeStarting;
- _gm->_state.alarmOn = (_gm->_state.timeAlarmSystem > _gm->_state.time);
- _gm->_state.powerOff = false;
- _gm->_state.dream = false;
+ _gm->_state._timeStarting = _gm->_state._time - 500000;
+ _gm->_state._timeAlarmSystem = _gm->_state._timeAlarm + _gm->_state._timeStarting;
+ _gm->_state._alarmOn = (_gm->_state._timeAlarmSystem > _gm->_state._time);
+ _gm->_state._powerOff = false;
+ _gm->_state._dream = false;
}
}
void AxacussCell::animation() {
- ++_gm->_state.timeRobot;
+ ++_gm->_state._timeRobot;
- if (_gm->_state.timeRobot == 299) {
+ if (_gm->_state._timeRobot == 299) {
_gm->drawImage(_gm->invertSection(31));
_gm->drawImage(28);
getObject(0)->_click = 255;
getObject(1)->setProperty(EXIT | OPENABLE | OPENED | CLOSED);
- } else if ((_gm->_state.timeRobot >= 301) && (_gm->_state.timeRobot <= 320)) {
- _gm->drawImage(_gm->invertSection(329 - _gm->_state.timeRobot));
- _gm->drawImage(328 - _gm->_state.timeRobot);
- } else if (_gm->_state.timeRobot == 321) {
+ } else if ((_gm->_state._timeRobot >= 301) && (_gm->_state._timeRobot <= 320)) {
+ _gm->drawImage(_gm->invertSection(329 - _gm->_state._timeRobot));
+ _gm->drawImage(328 - _gm->_state._timeRobot);
+ } else if (_gm->_state._timeRobot == 321) {
_gm->drawImage(31);
setSectionVisible(8, false);
getObject(0)->_click = 1;
getObject(1)->setProperty(EXIT | OPENABLE | CLOSED);
}
- if (_gm->_state.timeRobot == 599) {
+ if (_gm->_state._timeRobot == 599) {
_gm->drawImage(_gm->invertSection(31));
_gm->drawImage(8);
getObject(0)->_click = 255;
getObject(1)->setProperty(EXIT | OPENABLE | OPENED | CLOSED);
- } else if ((_gm->_state.timeRobot >= 601) && (_gm->_state.timeRobot <= 620)) {
- _gm->drawImage(_gm->_state.timeRobot - 593 + 128);
- _gm->drawImage(_gm->_state.timeRobot - 592);
- } else if (_gm->_state.timeRobot == 621) {
+ } else if ((_gm->_state._timeRobot >= 601) && (_gm->_state._timeRobot <= 620)) {
+ _gm->drawImage(_gm->_state._timeRobot - 593 + 128);
+ _gm->drawImage(_gm->_state._timeRobot - 592);
+ } else if (_gm->_state._timeRobot == 621) {
_gm->drawImage(31);
setSectionVisible(28, false);
getObject(0)->_click = 1;
getObject(1)->setProperty(EXIT | OPENABLE | CLOSED);
- } else if (_gm->_state.timeRobot == 700) {
- _gm->_state.timeRobot = 0;
- } else if (_gm->_state.timeRobot == 10002) {
+ } else if (_gm->_state._timeRobot == 700) {
+ _gm->_state._timeRobot = 0;
+ } else if (_gm->_state._timeRobot == 10002) {
_gm->drawImage(18 + 128);
_gm->drawImage(29);
_gm->drawImage(7);
getObject(2)->_click = 13;
- } else if (_gm->_state.timeRobot == 10003) {
+ } else if (_gm->_state._timeRobot == 10003) {
setSectionVisible(29, false);
_gm->drawImage(30);
getObject(8)->_click = 12;
getObject(7)->_click = 14;
_vm->playSound(kAudioUndef4);
- } else if (_gm->_state.timeRobot == 10010) {
- --_gm->_state.timeRobot;
+ } else if (_gm->_state._timeRobot == 10010) {
+ --_gm->_state._timeRobot;
}
- if (_gm->_state.timeRobot == 312) {
+ if (_gm->_state._timeRobot == 312) {
_gm->drawImage(7);
getObject(2)->_click = 13;
- } else if (_gm->_state.timeRobot == 610) {
+ } else if (_gm->_state._timeRobot == 610) {
setSectionVisible(7, false);
getObject(2)->_click = 255;
}
if ((isSectionVisible(6)) &&
- ((_gm->_state.timeRobot == 310) || (_gm->_state.timeRobot == 610))) {
+ ((_gm->_state._timeRobot == 310) || (_gm->_state._timeRobot == 610))) {
_vm->playSound(kAudioUndef3);
- _gm->_state.timeRobot = 10000;
+ _gm->_state._timeRobot = 10000;
}
_gm->setAnimationTimer(3);
@@ -2169,12 +2170,12 @@ bestechen:
if (_gm->dialog(2, nullptr, nullptr, 0) == 0) { // rows, dialog2
_gm->reply("Nein!", 1, 1 + 128);
setSectionVisible(kMaxSection - 2, false);
- if (_gm->_state.money == 0) {
+ if (_gm->_state._money == 0) {
_gm->removeSentence(2, 2);
_gm->removeSentence(3, 2);
} else {
- _dialog3[2] += Common::String::format("%d Xa.", _gm->_state.money - 200);
- _dialog3[3] += Common::String::format("%d Xa.", _gm->_state.money);
+ _dialog3[2] += Common::String::format("%d Xa.", _gm->_state._money - 200);
+ _dialog3[3] += Common::String::format("%d Xa.", _gm->_state._money);
}
switch (_gm->dialog(4, nullptr, nullptr, 2)) { // rows, dialog3
case 1:
@@ -2188,13 +2189,13 @@ bestechen:
_gm->shot(3, _gm->invertSection(3));
break;
case 3:
- if (_gm->_state.money >= 900) {
- sum = _gm->_state.money;
+ if (_gm->_state._money >= 900) {
+ sum = _gm->_state._money;
goto genug;
}
case 2:
- if (_gm->_state.money > 1100) {
- sum = _gm->_state.money - 200;
+ if (_gm->_state._money > 1100) {
+ sum = _gm->_state._money - 200;
goto genug;
}
_gm->reply("Das máte schon ein biáchen mehr sein.", 1, 1 + 128);
@@ -2316,12 +2317,12 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
_gm->drawImage(_gm->invertSection(obj1._id - DOOR1 + 1));
_vm->playSound(kAudioDoorClose);
if (obj1.hasProperty(OCCUPIED)) {
- _gm->_state.destination = 255;
+ _gm->_state._destination = 255;
obj1.setProperty(EXIT | OPENABLE | CLOSED | CAUGHT);
if (!_gm->_rooms[OFFICE_L1 + obj1._id - DOOR1]->isSectionVisible(4))
_gm->search(180);
else
- _gm->_state.eventTime = 0xffffffff;
+ _gm->_state._eventTime = 0xffffffff;
} else
obj1.setProperty(EXIT | OPENABLE | CLOSED);
} else if (((verb == ACTION_WALK) || ((verb == ACTION_OPEN) && !obj1.hasProperty(OPENED))) &&
@@ -2374,7 +2375,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
}
} else if ((verb == ACTION_LOOK) &&
(obj1._id >= DOOR1) && (obj1._id <= DOOR4)) {
- _gm->_state.nameSeen |= 1 << (obj1._id - DOOR1);
+ _gm->_state._nameSeen |= 1 << (obj1._id - DOOR1);
return false;
} else if ((verb == ACTION_WALK) &&
((obj1._id == PILLAR1) || (obj1._id == PILLAR2))) {
@@ -2601,9 +2602,9 @@ bool AxacussElevator::interact(Action verb, Object &obj1, Object &obj2) {
getObject(3)->resetProperty(EXIT);
getObject(3)->_click = 2;
_gm->drawImage(_gm->invertSection(1));
- if (!(_gm->_state.greatFlag & 0x4000)) {
+ if (!(_gm->_state._greatFlag & 0x4000)) {
_vm->playSound(kAudioGreat);
- _gm->_state.greatFlag |= 0x4000;
+ _gm->_state._greatFlag |= 0x4000;
}
}
} else if ((verb == ACTION_PRESS) && (obj1._id == BUTTON2)) {
@@ -2680,7 +2681,7 @@ bool AxacussSign::interact(Action verb, Object &obj1, Object &obj2) {
_gm->takeMoney(-180);
_gm->drawImage(2);
setSectionVisible(1, false);
- _gm->_state.eventTime = _vm->getDOSTicks() + 600;
+ _gm->_state._eventTime = _vm->_system->getMillis() + ticksToMsec(600);
// *event = &taxi;
return true;
}
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 51cc97f..b6a186e 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -221,33 +221,35 @@ void GameManager::initState() {
_timer1 = 0;
_animationTimer = 0;
- _state.time = 2840 * kMsecPerTick;
- _state.timeSleep = 0;
- _state.timeStarting = 50400000; // 2 pm -- Originally: systime() - 917650
- _state.timeAlarm = 25200000; // 7 am
- _state.timeAlarmSystem = _state.timeAlarm + _state.timeStarting;
- _state.eventTime = 0xffffffff;
- _state.shipEnergy = 2135;
- _state.landingModuleEnergy = 923;
- _state.greatFlag = 0;
- _state.timeRobot = 0;
- _state.money = 0;
- _state.coins = 0;
- _state.shoes = 0;
- _state.nameSeen = 0;
- _state.destination = 255;
- _state.benOverlay = 0;
- _state.language = 0;
- _state.corridorSearch = false;
- _state.alarmOn = false;
- _state.terminalStripConnected = false;
- _state.terminalStripWire = false;
- _state.cableConnected = false;
- _state.powerOff = false;
- _state.cockpitSeen = false;
- _state.airlockSeen = false;
- _state.holdSeen = false;
- _state.dream = false;
+ _state._time = ticksToMsec(2840);
+ _state._timeSleep = 0;
+ // NOTE: systime() calls int 1A, means it gets number of ticks since midnight.
+ // So, it doesn't matter if we overflow by substraction?
+ _state._timeStarting = _vm->_system->getMillis() - ticksToMsec(917650); // 2 pm
+ _state._timeAlarm = ticksToMsec(458808); // 7 am
+ _state._timeAlarmSystem = _state._timeAlarm + _state._timeStarting;
+ _state._eventTime = 0xffffffff;
+ _state._shipEnergy = 2135;
+ _state._landingModuleEnergy = 923;
+ _state._greatFlag = 0;
+ _state._timeRobot = 0;
+ _state._money = 0;
+ _state._coins = 0;
+ _state._shoes = 0;
+ _state._nameSeen = 0;
+ _state._destination = 255;
+ _state._benOverlay = 0;
+ _state._language = 0;
+ _state._corridorSearch = false;
+ _state._alarmOn = false;
+ _state._terminalStripConnected = false;
+ _state._terminalStripWire = false;
+ _state._cableConnected = false;
+ _state._powerOff = false;
+ _state._cockpitSeen = false;
+ _state._airlockSeen = false;
+ _state._holdSeen = false;
+ _state._dream = false;
}
void GameManager::initRooms() {
@@ -518,7 +520,7 @@ void GameManager::drawImage(int section) {
}
void GameManager::corridorOnEntrance() {
- if (_state.corridorSearch)
+ if (_state._corridorSearch)
busted(0);
}
@@ -534,11 +536,11 @@ void GameManager::startSearch() {
if ((_currentRoom >= _rooms[CORRIDOR1]) && (_currentRoom <= _rooms[BCORRIDOR]))
busted(0);
- _state.corridorSearch = true;
+ _state._corridorSearch = true;
}
void GameManager::search(int time) {
- _state.eventTime = _vm->getDOSTicks() + time;
+ _state._eventTime = _vm->_system->getMillis() + time;
// *event = &search_start;
}
@@ -631,12 +633,12 @@ void GameManager::taxi() {
}
void GameManager::outro() {
- _state.benOverlay = 3;
+ _state._benOverlay = 3;
// load_overlay();
// title = 2;
_vm->playSoundMod(49);
// title = 0;
- _state.benOverlay = 0;
+ _state._benOverlay = 0;
_vm->paletteFadeOut();
_vm->renderImage(55, 0);
_vm->paletteFadeIn();
@@ -647,11 +649,11 @@ void GameManager::outro() {
}
void GameManager::great(uint number) {
- if (number && (_state.greatFlag & (1 << number)))
+ if (number && (_state._greatFlag & (1 << number)))
return;
_vm->playSound(kAudioUndef7);
- _state.greatFlag |= 1 << number;
+ _state._greatFlag |= 1 << number;
}
bool GameManager::airless() {
@@ -689,18 +691,18 @@ int GameManager::dialog(int num, byte *rowLength[], const char **text[6], int nu
}
void GameManager::turnOff() {
- if (_state.powerOff)
+ if (_state._powerOff)
return;
- _state.powerOff = true;
+ _state._powerOff = true;
roomBrightness();
}
void GameManager::turnOn() {
- if (!_state.powerOff)
+ if (!_state._powerOff)
return;
- _state.powerOff = false;
+ _state._powerOff = false;
_vm->paletteBrightness();
Room *room = _rooms[SLEEP];
room->setSectionVisible(1, false);
@@ -814,15 +816,82 @@ void GameManager::mouseWait(int delay) {
// STUB
}
+static void dimColor(SupernovaEngine *vm, int color) {
+ color -= 16;
+ color *= 3;
+ // TODO: alters palette image data permanently (get system palette instead?)
+ vm->_currentImage->_palette[color + 0] = vm->_currentImage->_palette[color + 0] * 3 / 5;
+ vm->_currentImage->_palette[color + 1] = vm->_currentImage->_palette[color + 1] * 3 / 5;
+ vm->_currentImage->_palette[color + 2] = vm->_currentImage->_palette[color + 2] * 3 / 5;
+}
+
void GameManager::roomBrightness() {
- // STUB
+ const byte specialColors[2][18] = {
+ {0x42, 0x49, 0x55, 0x68, 0x50, 0x5d, 0x3c, 1},
+ {0x85, 0x91, 0x99, 0x92, 0x9b, 0x96, 0x9a, 0xa6,
+ 0xb0, 0xb4, 0xb5, 0xc2, 0xd1, 0xbe, 0xb6, 0xa8,
+ 0x6b, 1}
+ };
+ char sf;
+ int i;
+ if ((_currentRoom == _rooms[HOLD]) && (_state._benOverlay == 1)) {
+ if (_state._powerOff) {
+ for (int f = 16; f < 255; f++) {
+ i = 0;
+ do {
+ sf = specialColors[0][i] - 1;
+ i++;
+ } while (sf && (sf != f));
+ if (!sf)
+ dimColor(_vm, f);
+ }
+ }
+ if (!(_state._landingModuleEnergy && _rooms[LANDINGMODULE]->isSectionVisible(7))) {
+ i = 0;
+ while (sf = specialColors[0][i] - 1) {
+ dimColor(_vm, sf);
+ i++;
+ };
+ }
+ } else if ((_currentRoom == _rooms[LANDINGMODULE]) && (_state._benOverlay == 1)) {
+ if (!(_state._landingModuleEnergy && _rooms[LANDINGMODULE]->isSectionVisible(7))) {
+ for (int f = 16; f < 255; f++) {
+ i=0;
+ do {
+ sf = specialColors[1][i] - 1;
+ i++;
+ } while (sf && (sf != f));
+ if (!sf)
+ dimColor(_vm, f);
+ }
+ }
+ if (_state._powerOff) {
+ i=0;
+ while (sf = specialColors[1][i] - 1) {
+ dimColor(_vm, sf);
+ i++;
+ };
+ }
+ } else if ((_currentRoom == _rooms[CAVE]) && (_state._benOverlay == 1)) {
+ _vm->_brightness = 0;
+ } else if ((_currentRoom != _rooms[OUTSIDE]) &&
+ (_currentRoom < _rooms[ROCKS]) && (_state._benOverlay == 1)) {
+ if (_state._powerOff)
+ for (int f = 16; f < 255; f++)
+ dimColor(_vm, f);
+ } else if ((_currentRoom == _rooms[GUARD3]) && (_state._benOverlay == 2)) {
+ if (_state._powerOff)
+ _vm->_brightness = 0;
+ }
+
+ _vm->paletteBrightness();
}
void GameManager::loadTime() {
- _state.timeStarting += _state.time;
- if (_state.eventTime != 1)
- _state.eventTime += _state.time;
- _state.timeAlarmSystem = _state.timeAlarm + _state.timeStarting;
+ _state._timeStarting += _state._time;
+ if (_state._eventTime != 1)
+ _state._eventTime += _state._time;
+ _state._timeAlarmSystem = _state._timeAlarm + _state._timeStarting;
}
void GameManager::saveTime() {
@@ -843,8 +912,7 @@ void GameManager::errorTemp() {
}
void GameManager::wait2(int ticks) {
- // 1 tick = 1/18.2s
- uint end = g_system->getMillis() + (55 * ticks);
+ uint end = g_system->getMillis() + ticksToMsec(ticks);
while (g_system->getMillis() < end) {
_vm->updateEvents();
g_system->updateScreen();
@@ -853,12 +921,12 @@ void GameManager::wait2(int ticks) {
}
void GameManager::setAnimationTimer(int ticks) {
- _animationTimer = g_system->getMillis() + (55 * ticks);
+ _animationTimer = g_system->getMillis() + ticksToMsec(ticks);
}
void GameManager::handleTime() {
- _state.time = g_system->getMillis();
- if (_animationTimer <= _state.time)
+ _state._time = g_system->getMillis();
+ if (_animationTimer <= _state._time)
_animationTimer = 0;
}
@@ -998,7 +1066,7 @@ void GameManager::shot(int a, int b) {
}
void GameManager::takeMoney(int amount) {
- _state.money += amount;
+ _state._money += amount;
if (amount > 0)
great(0);
// TODO: kmaxobject - 1?
@@ -1007,7 +1075,7 @@ void GameManager::takeMoney(int amount) {
// strcpy(raumz[OFFICE_R1]->object[5].name,ltoa((long)_state.money));
// strcat(raumz[OFFICE_R1]->object[5].name," Xa");
- if (_state.money) {
+ if (_state._money) {
if (!_rooms[OFFICE_R1]->getObject(5)->hasProperty(CARRIED))
takeObject(*_rooms[OFFICE_R1]->getObject(5));
} else {
@@ -1134,13 +1202,13 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage("Du iát die Tablette und merkst,|daá sich irgendetwas verndert hat.");
great(0);
_inventory.remove(obj1);
- _state.language = 2;
+ _state._language = 2;
takeObject(*_rooms[ENTRANCE]->getObject(17));
}
} else if ((verb == ACTION_LOOK) && (obj1._id == PILL_HULL) &&
- (_state.language == 2)) {
+ (_state._language == 2)) {
_vm->renderMessage("Komisch! Auf einmal kannst du die Schrift lesen!|Darauf steht:\"Wenn Sie diese Schrift jetzt|lesen knnen, hat die Tablette gewirkt.\"");
- _state.language = 1;
+ _state._language = 1;
} else if ((verb == ACTION_OPEN) && (obj1._id == WALLET)) {
if (!_rooms[ROGER]->getObject(3)->hasProperty(CARRIED)) {
_vm->renderMessage("Das muát du erst nehmen.");
@@ -1175,8 +1243,8 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
"Es ist eine Uhr mit extra|lautem Wecker. "
"Sie hat einen|Knopf zum Verstellen der Alarmzeit.|"
"Uhrzeit: %s Alarmzeit: %s",
- timeToString(_state.time + _state.timeStarting).c_str(),
- timeToString(_state.timeAlarm).c_str()).c_str());
+ timeToString(_state._time + _state._timeStarting).c_str(),
+ timeToString(_state._timeAlarm).c_str()).c_str());
} else if ((verb == ACTION_PRESS) && (obj1._id == WATCH)) {
char *min;
int hours, minutes;
@@ -1185,6 +1253,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
_vm->saveScreen(88, 87, 144, 24);
_vm->renderBox(88, 87, 144, 24, kColorWhite35);
_vm->renderText("Neue Alarmzeit (hh:mm) :", 91, 90, kColorWhite99);
+ // TODO: Adjust for msec time instead of ticks
do {
_vm->renderBox(91, 99, 138, 9, kColorDarkBlue);
do {
@@ -1206,19 +1275,22 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
}
for (uint i = 0; i < strlen(t); i++)
- if ((t[i] < '0') || (t[i] > '9')) f = true;
+ if ((t[i] < '0') || (t[i] > '9'))
+ f = true;
for (uint i = 0; i < strlen(min); i++)
- if ((min[i] < '0') || (min[i] > '9')) f = true;
+ if ((min[i] < '0') || (min[i] > '9'))
+ f = true;
hours = atoi(t);
minutes = atoi(min);
- if ((hours > 23) || (minutes > 59)) f = true;
+ if ((hours > 23) || (minutes > 59))
+ f = true;
animationOn();
} while (f && (_key.keycode != Common::KEYCODE_ESCAPE));
_vm->restoreScreen();
if (_key.keycode != Common::KEYCODE_ESCAPE) {
- _state.timeAlarm = (hours * 60 + minutes) * 1092.3888 + 8;
- _state.timeAlarmSystem = _state.timeAlarm + _state.timeStarting;
- _state.alarmOn = (_state.timeAlarmSystem > _vm->getDOSTicks());
+ _state._timeAlarm = (hours * 60 + minutes) * 60 + 8;
+ _state._timeAlarmSystem = _state._timeAlarm + _state._timeStarting;
+ _state._alarmOn = (_state._timeAlarmSystem > _vm->_system->getMillis());
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, WIRE)) {
r = _rooms[CABIN_L3];
@@ -1231,8 +1303,8 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
r->getObject(8)->_name = "Leitung mit Lsterklemme";
r = _rooms[HOLD];
_inventory.remove(*r->getObject(2));
- _state.terminalStripConnected = true;
- _state.terminalStripWire = true;
+ _state._terminalStripConnected = true;
+ _state._terminalStripWire = true;
_vm->renderMessage("Ok.");
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, SPOOL)) {
@@ -1241,11 +1313,11 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
r->getObject(9)->_name = "Kabelrolle mit Lsterklemme";
r = _rooms[HOLD];
_inventory.remove(*r->getObject(2));
- _state.terminalStripConnected = true;
+ _state._terminalStripConnected = true;
_vm->renderMessage("Ok.");
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, WIRE, SPOOL)) {
r = _rooms[CABIN_L3];
- if (!_state.terminalStripConnected) {
+ if (!_state._terminalStripConnected) {
if (r->isSectionVisible(26))
_vm->renderMessage("Womit denn?");
else
@@ -1260,7 +1332,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
r->getObject(8)->_name = "langes Kabel mit Stecker";
r = _rooms[CABIN_L2];
_inventory.remove(*r->getObject(9));
- _state.cableConnected = true;
+ _state._cableConnected = true;
_vm->renderMessage("Ok.");
}
}
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 4ab3cf1..9e91ff3 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -29,33 +29,33 @@
namespace Supernova {
struct GameState {
- int32 time;
- int32 timeSleep;
- int32 timeStarting;
- int32 timeAlarm;
- int32 timeAlarmSystem;
- int32 eventTime;
- int32 shipEnergy;
- int32 landingModuleEnergy;
- uint16 greatFlag;
- int16 timeRobot;
- int16 money;
- byte coins;
- byte shoes;
- byte nameSeen;
- byte destination;
- byte benOverlay;
- byte language;
- bool corridorSearch;
- bool alarmOn;
- bool terminalStripConnected;
- bool terminalStripWire;
- bool cableConnected;
- bool powerOff;
- bool cockpitSeen;
- bool airlockSeen;
- bool holdSeen;
- bool dream;
+ int32 _time;
+ int32 _timeSleep;
+ int32 _timeStarting;
+ int32 _timeAlarm;
+ int32 _timeAlarmSystem;
+ int32 _eventTime;
+ int32 _shipEnergy;
+ int32 _landingModuleEnergy;
+ uint16 _greatFlag;
+ int16 _timeRobot;
+ int16 _money;
+ byte _coins;
+ byte _shoes;
+ byte _nameSeen;
+ byte _destination;
+ byte _benOverlay;
+ byte _language;
+ bool _corridorSearch;
+ bool _alarmOn;
+ bool _terminalStripConnected;
+ bool _terminalStripWire;
+ bool _cableConnected;
+ bool _powerOff;
+ bool _cockpitSeen;
+ bool _airlockSeen;
+ bool _holdSeen;
+ bool _dream;
};
class Inventory {
Commit: b0b682ad096e4694608d3686c74176a86642184d
https://github.com/scummvm/scummvm/commit/b0b682ad096e4694608d3686c74176a86642184d
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:42:32Z
Commit Message:
SUPERNOVA: Removes getDOSTicks()
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index c79748d..5dfabff 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -160,16 +160,6 @@ Common::Error SupernovaEngine::run() {
return Common::kNoError;
}
-// Emulates DOS int 1A/00
-int SupernovaEngine::getDOSTicks() {
- TimeDate systemTime;
- _system->getTimeAndDate(systemTime);
-
- return static_cast<int>((systemTime.tm_hour * 24 +
- systemTime.tm_min * 60 +
- systemTime.tm_sec) * 18.2065);
-}
-
void SupernovaEngine::updateEvents() {
_gm->handleTime();
if (_gm->_animationEnabled && _gm->_animationTimer == 0)
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index eef3c9d..271db0b 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -107,7 +107,6 @@ public:
int _textCursorY;
int _textColor;
- int getDOSTicks();
int textWidth(const char *text);
int textWidth(const uint16 key);
void initData();
Commit: 1e36c74e6b7c57ddacb028222509cef8ba0a0a47
https://github.com/scummvm/scummvm/commit/1e36c74e6b7c57ddacb028222509cef8ba0a0a47
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:42:32Z
Commit Message:
SUPERNOVA: Updates TODOs
Changed paths:
engines/supernova/msn_def.h
engines/supernova/supernova.cpp
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 93f4333..d609fe5 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -512,6 +512,7 @@ struct Object {
return false;
}
+ // TODO: convert name and description to String
const char *_name;
const char *_description;
ObjectID _id;
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 5dfabff..9a68079 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -267,6 +267,8 @@ void SupernovaEngine::playSound(AudioIndex sample) {
11931, Audio::FLAG_UNSIGNED | Audio::FLAG_LITTLE_ENDIAN, DisposeAfterUse::NO);
stopSound();
_mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, audioStream);
+
+ // TODO: Stall till sound was played
}
void SupernovaEngine::stopSound() {
@@ -544,9 +546,6 @@ void SupernovaEngine::paletteBrightness() {
}
void SupernovaEngine::paletteFadeOut() {
- // TODO: scene 0 (newspaper article in intro, mode 0x11)
- // needs to be handled differently
-
while (_brightness > 20) {
_menuBrightness = _brightness;
paletteBrightness();
Commit: cd01ca0ad3b32624e98cd40b218028ad366f4a83
https://github.com/scummvm/scummvm/commit/cd01ca0ad3b32624e98cd40b218028ad366f4a83
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:42:32Z
Commit Message:
SUPERNOVA: Converts special characters
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/rooms.h
engines/supernova/state.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 9e28c30..5434b8e 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -65,7 +65,7 @@ bool ShipCorridor::interact(Action verb, Object &obj1, Object &obj2) {
bool ShipHall::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_OPEN) && (obj1._id == KITCHEN_HATCH)) {
- _vm->renderMessage("In der Küche warst du schon|oft genug, im Moment hast|du keinen Appetit.");
+ _vm->renderMessage("In der K\201che warst du schon|oft genug, im Moment hast|du keinen Appetit.");
} else if ((verb == ACTION_USE) && Object::combine(obj1,obj2,KEYCARD2,SLEEP_SLOT)) {
if (_objectState[2].hasProperty(OPENED)) {
_objectState[2].disableProperty(OPENED);
@@ -109,7 +109,7 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
_gm->getInput();
} else if (_gm->_state._powerOff) {
// Energy depleted
- _vm->renderText("Energie erschöpft", 60, 95, kColorWhite99);
+ _vm->renderText("Energie ersch\224pft", 60, 95, kColorWhite99);
// Artificial coma interrupted
_vm->renderText("Tiefschlafprozess abgebrochen", 60, 115, kColorWhite99);
_gm->getInput();
@@ -168,9 +168,9 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
((obj1._id == CABINS) || (obj1._id == CABIN))) {
room = _gm->_rooms[AIRLOCK];
if (!(obj1._id == CABIN) || !isSectionVisible(5)) {
- _vm->renderMessage("Es würde wenig bringen,|sich in eine Schlafkammer zu legen,|die nicht eingeschaltet ist.");
+ _vm->renderMessage("Es w\201rde wenig bringen,|sich in eine Schlafkammer zu legen,|die nicht eingeschaltet ist.");
} else if (room->getObject(5)->hasProperty(WORN)) {
- _vm->renderMessage("Dazu mußt du erst den Raumanzug ausziehen.");
+ _vm->renderMessage("Dazu mu\341t du erst den Raumanzug ausziehen.");
} else {
_vm->paletteFadeOut();
_gm->drawImage(_gm->invertSection(5));
@@ -284,10 +284,10 @@ void ShipSleepCabin::animation() {
}
void ShipSleepCabin::onEntrance() {
if (_gm->_state._dream && (_gm->_rooms[CAVE]->getObject(1)->_exitRoom == MEETUP3)) {
- _vm->renderMessage("Du wachst mit brummendem Schädel auf|und merkst, daß du nur geträumt hast.");
+ _vm->renderMessage("Du wachst mit brummendem Sch\204del auf|und merkst, daß du nur getr\204umt hast.");
_gm->mouseWait(_gm->_timer1);
_vm->removeMessage();
- _vm->renderMessage("Beim Aufprall des Raumschiffs|mußt du mit dem Kopf aufgeschlagen|und bewußtlos geworden sein.");
+ _vm->renderMessage("Beim Aufprall des Raumschiffs|mu\341t du mit dem Kopf aufgeschlagen|und bewu\341tlos geworden sein.");
_gm->mouseWait(_gm->_timer1);
_vm->removeMessage();
_vm->renderMessage("Was steht dir jetzt wohl wirklich bevor?");
@@ -325,7 +325,7 @@ bool ShipCockpit::interact(Action verb, Object &obj1, Object &obj2) {
_gm->getInput();
_gm->_guiEnabled = true;
} else if ((verb == ACTION_USE) && (obj1._id == INSTRUMENTS))
- _vm->renderMessage("Vergiá nicht, du bist nur der|Schiffskoch und hast keine Ahnung,|wie man ein Raumschiff fliegt.");
+ _vm->renderMessage("Vergi\341 nicht, du bist nur der|Schiffskoch und hast keine Ahnung,|wie man ein Raumschiff fliegt.");
else
return false;
@@ -342,7 +342,7 @@ void ShipCockpit::animation() {
color = kColorLightYellow;
_gm->setAnimationTimer(10);
}
- _vm->renderText("Achtung: Triebwerke funktionsunfhig", 50, 145, color);
+ _vm->renderText("Achtung: Triebwerke funktionsunf\204hig", 50, 145, color);
} else {
if (isSectionVisible(21)) {
_gm->drawImage(_gm->invertSection(21));
@@ -354,7 +354,7 @@ void ShipCockpit::animation() {
}
if (_gm->_state._powerOff) {
if (!_gm->_guiEnabled) {
- _vm->renderText("Energievorrat erschpft", 97, 165, color);
+ _vm->renderText("Energievorrat ersch\224pft", 97, 165, color);
_vm->renderText("Notstromversorgung aktiv", 97, 175, color);
} else {
if (isSectionVisible(21))
@@ -367,7 +367,7 @@ void ShipCockpit::animation() {
void ShipCockpit::onEntrance() {
if (!hasSeen())
- _vm->renderMessage("Was?! Keiner im Cockpit!|Die sind wohl verrckt!");
+ _vm->renderMessage("Was?! Keiner im Cockpit!|Die sind wohl verr\201ckt!");
setRoomSeen(true);
}
@@ -489,7 +489,7 @@ bool ShipCabinL3::interact(Action verb, Object &obj1, Object &obj2) {
setSectionVisible(10, false);
getObject(10)->_click = 20;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, WIRE2))
- _vm->renderMessage("Schneid doch besser ein|lngeres Stck Kabel ab!");
+ _vm->renderMessage("Schneid doch besser ein|l\204ngeres St\201ck Kabel ab!");
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, WIRE)) {
r = _gm->_rooms[AIRLOCK];
if (!isSectionVisible(10) && !r->getObject(5)->hasProperty(WORN)) {
@@ -682,7 +682,7 @@ void ShipAirlock::onEntrance() {
}
bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
- static char beschr2[] = "Ein Stck Schrott.";
+ static char beschr2[] = "Ein St\201ck Schrott.";
Room *r;
if ((verb == ACTION_LOOK) && (obj1._id == SCRAP_LK) &&
@@ -692,7 +692,7 @@ bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
_gm->takeObject(*getObject(2));
} else if (((verb == ACTION_OPEN) || (verb == ACTION_CLOSE)) &&
(obj1._id == OUTERHATCH_TOP)) {
- _vm->renderMessage("Du muát erst hingehen.");
+ _vm->renderMessage("Du mu\341t erst hingehen.");
} else if ((verb == ACTION_CLOSE) && (obj1._id == LANDINGMOD_HATCH) &&
(isSectionVisible(4) || isSectionVisible(6)))
_vm->renderMessage("Das Kabel ist im Weg.");
@@ -700,7 +700,7 @@ bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, LANDINGMOD_HATCH)))
_vm->renderMessage("Das Kabel ist schon ganz|richtig an dieser Stelle.");
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, HOLD_WIRE)) {
- getObject(0)->_name = "Leitung mit Lsterklemme";
+ getObject(0)->_name = "Leitung mit L\201sterklemme";
_gm->_inventory.remove(*getObject(2));
_gm->_state._terminalStripConnected = true;
_gm->_state._terminalStripWire = true;
@@ -888,7 +888,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
if (!obj1.hasProperty(OPENED))
_vm->renderMessage("Das ist geschlossen.");
else if (!isSectionVisible(11))
- _vm->renderMessage("Das geht nicht.|Die Luke ist mindestens|5 Meter ber dem Boden.");
+ _vm->renderMessage("Das geht nicht.|Die Luke ist mindestens|5 Meter \201ber dem Boden.");
else {
obj1._exitRoom = ROCKS;
return false;
@@ -1166,15 +1166,15 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
break;
case 2:
if (_gm->_state._shoes == 1) {
- _gm->reply("In der Toilette gibt es|Schlieáfcher fr Schuhe.", 1, _gm->invertSection(1));
+ _gm->reply("In der Toilette gibt es|Schlie\341f\204cher f\201r Schuhe.", 1, _gm->invertSection(1));
_gm->_state._shoes = 2;
} else {
- _gm->reply("Wenn Sie das Lokal betreten|wollen, mssen Sie erst|ihre Schuhe ausziehen.", 1, _gm->invertSection(1));
+ _gm->reply("Wenn Sie das Lokal betreten|wollen, m\201ssen Sie erst|ihre Schuhe ausziehen.", 1, _gm->invertSection(1));
_gm->_state._shoes = 1;
}
break;
case 3:
- _gm->reply("Wollen Sie, daá ich Sie rauáschmeiáe?", 1, _gm->invertSection(1));
+ _gm->reply("Wollen Sie, da\341 ich Sie rau\341schmei\341e?", 1, _gm->invertSection(1));
}
} while (e != 4);
} else {
@@ -1200,9 +1200,9 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
if (!_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN)) {
if (_gm->_state._language) {
if (_gm->_state._shoes)
- _gm->reply("Sie mssen erst ihre Schuhe ausziehen, Sie Trottel!", 1, _gm->invertSection(1));
+ _gm->reply("Sie m\201ssen erst ihre Schuhe ausziehen, Sie Trottel!", 1, _gm->invertSection(1));
else
- _gm->reply("Was fllt ihnen ein!|Sie knnen doch ein Lokal|nicht mit Schuhen betreten!", 1, _gm->invertSection(1));
+ _gm->reply("Was f\204llt ihnen ein!|Sie k\224nnen doch ein Lokal|nicht mit Schuhen betreten!", 1, _gm->invertSection(1));
e = 0;
while ((e < 3) && (_shown[kMaxSection - 1] != 15)) {
switch (e = _gm->dialog(5, nullptr, nullptr, 1)) { // row1, dialog1
@@ -1216,7 +1216,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
_gm->removeSentence(0, 2);
break;
case 2:
- _gm->reply("In der Toilette gibt es|Schlieáfcher fr Schuhe.", 1, 1 + 128);
+ _gm->reply("In der Toilette gibt es|Schlie\341f\204cher f\201r Schuhe.", 1, 1 + 128);
_gm->_state._shoes = 2;
break;
case 3:
@@ -1224,7 +1224,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
_gm->wait2(2);
_gm->drawImage(4);
setSectionVisible(3, false);
- _gm->reply("Das wrde ich an ihrer|Stelle nicht versuchen!", 1, 1 + 128);
+ _gm->reply("Das w\201rde ich an ihrer|Stelle nicht versuchen!", 1, 1 + 128);
_gm->drawImage(3);
setSectionVisible(4, false);
_gm->wait2(2);
@@ -1257,7 +1257,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_WALK) && (obj1._id == ARSANO_BATHROOM)) {
if (_gm->_state._coins) {
if (_gm->_state._shoes == 2) {
- _vm->renderMessage("Du ziehst deine Schuhe|aus und legst sie in|eins der Schlieáfcher.");
+ _vm->renderMessage("Du ziehst deine Schuhe|aus und legst sie in|eins der Schlie\341f\204cher.");
_gm->_state._shoes = 3;
_gm->removeSentence(2, 2);
_gm->removeSentence(3, 2);
@@ -1273,7 +1273,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage("Du gehst seit sieben Jahren das|erste Mal wieder aufs Klo!");
_gm->mouseWait(_gm->_timer1);
_vm->removeMessage();
- _vm->renderMessage("In einem der Schlieáfcher,|die sich auch im Raum befinden,|findest du einige Mnzen.");
+ _vm->renderMessage("In einem der Schlie\341f\204cher,|die sich auch im Raum befinden,|findest du einige M\201nzen.");
_gm->takeObject(*getObject(16));
_gm->_state._coins = 5;
}
@@ -1296,8 +1296,8 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
}
} else if ((verb == ACTION_LOOK) && (obj1._id == KITCHEN_SIGN) && _gm->_state._language) {
if (_gm->_state._language == 2)
- _vm->renderMessage("Komisch! Auf einmal kannst du|das Schild lesen! Darauf steht:|\"Zutritt nur fr Personal\".");
- obj1._description = "Darauf steht:|\"Zutritt nur fr Personal\".";
+ _vm->renderMessage("Komisch! Auf einmal kannst du|das Schild lesen! Darauf steht:|\"Zutritt nur f\201r Personal\".");
+ obj1._description = "Darauf steht:|\"Zutritt nur f\201r Personal\".";
if (_gm->_state._language == 1)
return false;
_gm->_state._language = 1;
@@ -1321,7 +1321,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
}
return false;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, PORTER))
- _vm->renderMessage("Nicht so gewaltttig!");
+ _vm->renderMessage("Nicht so gewaltt\204tig!");
else
return false;
return true;
@@ -1529,7 +1529,7 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
_gm->great(0);
return false;
}
- _gm->reply("Hey, Witzkeks, laá die Brieftasche da liegen!", 2, 2 + 128);
+ _gm->reply("Hey, Witzkeks, la\341 die Brieftasche da liegen!", 2, 2 + 128);
} else if ((verb == ACTION_USE) && (obj1._id == CUP)) {
_vm->renderMessage("Das ist nicht deine.");
} else if ((verb == ACTION_TALK) && (obj1._id == ROGER_W)) {
@@ -1543,33 +1543,33 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
break;
case 1:
_gm->reply("Noch mindestens zwei Stunden.", 2, 2 + 128);
- _gm->reply("Haben Sie keine Idee, womit wir uns|bis dahin die Zeit vertreiben knnen?", 2, 2 + 128);
- _gm->say("Hmm ... im Moment fllt mir nichts ein, aber vielleicht|hat der Spieler des Adventures ja eine Idee.");
+ _gm->reply("Haben Sie keine Idee, womit wir uns|bis dahin die Zeit vertreiben k\224nnen?", 2, 2 + 128);
+ _gm->say("Hmm ... im Moment f\201llt mir nichts ein, aber vielleicht|hat der Spieler des Adventures ja eine Idee.");
break;
case 2:
- _gm->reply("Nein, Sie mssen sich irren.|Ich kenne Sie jedenfalls nicht.", 2, 2 + 128);
+ _gm->reply("Nein, Sie m\201ssen sich irren.|Ich kenne Sie jedenfalls nicht.", 2, 2 + 128);
_gm->say("Aber ihre Kleidung habe ich irgendwo schon mal gesehen.");
_gm->reply("Ja? Komisch.", 2, 2 + 128);
- _gm->say("Jetzt weiá ich's. Sie sind Roger W. !");
+ _gm->say("Jetzt wei\341 ich's. Sie sind Roger W. !");
_gm->reply("Pssst, nicht so laut, sonst will|gleich jeder ein Autogramm von mir.", 2, 2 + 128);
_gm->reply("Ich habe extra eine Maske auf, damit|ich nicht von jedem angelabert werde.", 2, 2 + 128);
- _gm->say("h ... ach so.");
- _gm->say("Wann kommt denn das nchste SQ-Abenteuer raus?");
- _gm->reply("SQ 127 máte in einem Monat erscheinen.", 2, 2 + 128);
+ _gm->say("\216h ... ach so.");
+ _gm->say("Wann kommt denn das n\204chste SQ-Abenteuer raus?");
+ _gm->reply("SQ 127 m\201\341te in einem Monat erscheinen.", 2, 2 + 128);
_gm->say("Was, Teil 127 ??");
_gm->say("Bei uns ist gerade Teil 8 erschienen.");
_gm->reply("Hmm ... von welchem Planeten sind Sie denn?", 2, 2 + 128);
_gm->say("Von der Erde.");
- _gm->reply("Erde? Nie gehrt.", 2, 2 + 128);
- _gm->reply("Wahrscheinlich irgendein Kaff, wo Neuerungen|erst hundert Jahre spter hingelangen.", 2, 2 + 128);
- _gm->say("h ... kann sein.");
- _gm->reply("Aber eins mssen Sie mir erklren!", 2, 2 + 128);
- _gm->reply("Wieso sehen Sie mir so verdammt hnlich, wenn|Sie nicht von Xenon stammen, wie ich?", 2, 2 + 128);
- _gm->say("Keine Ahnung. Bis jetzt dachte ich immer, Sie wren ein|von Programmierern auf der Erde erfundenes Computersprite.");
+ _gm->reply("Erde? Nie geh\224rt.", 2, 2 + 128);
+ _gm->reply("Wahrscheinlich irgendein Kaff, wo Neuerungen|erst hundert Jahre sp\204ter hingelangen.", 2, 2 + 128);
+ _gm->say("\216h ... kann sein.");
+ _gm->reply("Aber eins m\201ssen Sie mir erkl\204ren!", 2, 2 + 128);
+ _gm->reply("Wieso sehen Sie mir so verdammt \204hnlich, wenn|Sie nicht von Xenon stammen, wie ich?", 2, 2 + 128);
+ _gm->say("Keine Ahnung. Bis jetzt dachte ich immer, Sie w\201ren ein|von Programmierern auf der Erde erfundenes Computersprite.");
_gm->reply("Was? Lachhaft!", 2, 2 + 128);
- _gm->reply("Wie erklren Sie sich dann,|daá ich ihnen gegenbersitze?", 2, 2 + 128);
+ _gm->reply("Wie erkl\204ren Sie sich dann,|da\341 ich ihnen gegen\201bersitze?", 2, 2 + 128);
_gm->say("Ja, das ist in der Tat seltsam.");
- _gm->reply("Halt, jetzt weiá ich es. Sie sind von der Konkurrenz,|von \"Georgefilm Games\" und wollen mich verunsichern.", 2, 2 + 128);
+ _gm->reply("Halt, jetzt wei\341 ich es. Sie sind von der Konkurrenz,|von \"Georgefilm Games\" und wollen mich verunsichern.", 2, 2 + 128);
_gm->say("Nein, ich bin nur ein Ahnungsloser Koch von der Erde.");
_gm->reply("Na gut, ich glaube Ihnen. Lassen wir jetzt|dieses Thema, langsam wird es mir zu bunt!", 2, 2 + 128);
}
@@ -1580,13 +1580,13 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
_gm->great(0);
_gm->say("Eine Partie Schach! Das ist eine gute Idee.");
_gm->reply("Schach? Was ist das denn?", 2, 2 + 128);
- _gm->say("Schach ist ein interessantes Spiel.|Ich werde es Ihnen erklren.");
+ _gm->say("Schach ist ein interessantes Spiel.|Ich werde es Ihnen erkl\204ren.");
_vm->paletteFadeOut();
_gm->_inventory.remove(*_gm->_rooms[CABIN_R3]->getObject(0)); // Chess board
g_system->fillScreen(kColorBlack);
_vm->_menuBrightness = 255;
_vm->paletteBrightness();
- _vm->renderMessage("Knapp zwei Stunden spter ...");
+ _vm->renderMessage("Knapp zwei Stunden sp\204ter ...");
_gm->mouseWait(_gm->_timer1);
_vm->removeMessage();
_vm->_menuBrightness = 0;
@@ -1605,7 +1605,7 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
getObject(5)->_click = 6;
getObject(6)->_click = 7;
_vm->paletteFadeIn();
- _vm->renderMessage("Roger W. steht kurz vor dem Schachmatt|und grbelt nach einem Ausweg.");
+ _vm->renderMessage("Roger W. steht kurz vor dem Schachmatt|und gr\201belt nach einem Ausweg.");
_gm->mouseWait(_gm->_timer1);
_vm->removeMessage();
} else {
@@ -1727,7 +1727,7 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
if (!(found))
_gm->reply("Nein.", 1, 1 + 128);
} else {
- _gm->reply("Haben Sie zufllig meine Brieftasche gesehen?|Ich muá Sie irgendwo verloren haben.", 1, 1 + 128);
+ _gm->reply("Haben Sie zuf\204llig meine Brieftasche gesehen?|Ich mu\341 Sie irgendwo verloren haben.", 1, 1 + 128);
_gm->reply("Ohne die Brieftasche kann ich nicht|starten, weil meine Keycard darin ist.", 1, 1 + 128);
found = !_gm->dialog(2, nullptr, nullptr, 0); // row1, dialog1
_gm->_rooms[MEETUP2]->setSectionVisible(kMaxSection - 2, true);
@@ -1737,7 +1737,7 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(7));
_gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(8));
_gm->reply("Oh! Vielen Dank.", 1, 1 + 128);
- _gm->reply("Wo ist denn Ihr Raumschiff?|Soll ich Sie ein Stck mitnehmen?", 1, 1 + 128);
+ _gm->reply("Wo ist denn Ihr Raumschiff?|Soll ich Sie ein St\201ck mitnehmen?", 1, 1 + 128);
flight = _gm->dialog(2, nullptr, nullptr, 0); // row2, dialog2
if (flight) {
_gm->reply("Wo wollen Sie denn hin?", 1, 1 + 128);
@@ -1803,7 +1803,7 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
_gm->changeRoom(MEETUP2);
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KEYCARD_R, SPACESHIP))
- _vm->renderMessage("Das wrde ich jetzt nicht tun, schlieálich|steht Roger W. neben seinem Schiff.");
+ _vm->renderMessage("Das w\201rde ich jetzt nicht tun, schlie\341lich|steht Roger W. neben seinem Schiff.");
else
return false;
@@ -1858,24 +1858,24 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
_gm->reply("Wir kommen vom Planeten Axacuss und|sind aus dem gleichen Grund hier wie Sie,|nmlich zur Erforschung der Supernova.", 1, 1 + 128);
break;
case 1:
- _gm->reply("Sie knnen beruhigt sein, wir wollen Ihnen nur helfen.", 2, 2 + 128);
+ _gm->reply("Sie k\224nnen beruhigt sein, wir wollen Ihnen nur helfen.", 2, 2 + 128);
_gm->say("Und wieso hat der Typ im Raumanzug|eben auf mich geschossen?");
_gm->reply("Das war eine Schreckreaktion.", 2, 2 + 128);
- _gm->reply("Schlieálich ist es fr uns das erste Mal,|daá wir auf eine fremde Intelligenz treffen.", 2, 2 + 128);
- _gm->reply("Wie wir festgestellt haben, ist|Ihr Raumschiff vllig zerstrt.", 2, 2 + 128);
- _gm->reply("Wahrscheinlich knnen Sie nicht|mehr auf ihren Heimatplaneten zurck.", 2, 2 + 128);
+ _gm->reply("Schlie\341lich ist es f\201r uns das erste Mal,|da\341 wir auf eine fremde Intelligenz treffen.", 2, 2 + 128);
+ _gm->reply("Wie wir festgestellt haben, ist|Ihr Raumschiff v\224llig zerst\224rt.", 2, 2 + 128);
+ _gm->reply("Wahrscheinlich k\224nnen Sie nicht|mehr auf ihren Heimatplaneten zur\201ck.", 2, 2 + 128);
_gm->reply("Wir bieten Ihnen an, Sie|mit nach Axacuss zu nehmen.", 2, 2 + 128);
if (_gm->dialog(2, nullptr, nullptr, 0)) { // row3, dialog3
_gm->reply("Sind Sie sich da wirklich sicher?", 2, 2 + 128);
- _gm->say("Wenn ich es mir genau berlege,|fliege ich doch lieber mit.");
+ _gm->say("Wenn ich es mir genau \201berlege,|fliege ich doch lieber mit.");
}
- _gm->reply("Gut, wir nehmen Sie unter der|Bedingung mit, daá wir Sie jetzt|sofort in Tiefschlaf versetzen drfen.", 2, 2 + 128);
+ _gm->reply("Gut, wir nehmen Sie unter der|Bedingung mit, da\341 wir Sie jetzt|sofort in Tiefschlaf versetzen d\201rfen.", 2, 2 + 128);
_gm->reply("Diese Art des Reisens ist Ihnen|ja scheinbar nicht unbekannt.", 2, 2 + 128);
_gm->reply("Sie werden in vier Jahren nach der|Landung der \"Dexxa\" wieder aufgeweckt.", 2, 2 + 128);
_gm->reply("Sind Sie damit einverstanden?", 2, 2 + 128);
if (_gm->dialog(2, nullptr, nullptr, 0)) { // row3, dialog3
_gm->reply("Sind Sie sich da wirklich sicher?", 2, 2 + 128);
- _gm->say("Wenn ich es mir genau berlege,|fliege ich doch lieber mit.");
+ _gm->say("Wenn ich es mir genau \201berlege,|fliege ich doch lieber mit.");
}
_gm->reply("Gut, haben Sie noch irgendwelche Fragen?", 2, 2 + 128);
break;
@@ -1887,8 +1887,8 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
_gm->reply("Wir sprechen nicht ihre Sprache,|sondern Sie sprechen unsere.", 1, 1 + 128);
_gm->reply("Nach einer Gehirnanalyse konnten|wir Ihr Gehirn an unsere Sprache anpassen.", 1, 1 + 128);
_gm->say("Was? Sie haben in mein Gehirn eingegriffen?");
- _gm->reply("Keine Angst, wir haben sonst nichts verndert.", 1, 1 + 128);
- _gm->reply("Ohne diesen Eingriff wren|Sie verloren gewesen.", 1, 1 + 128);
+ _gm->reply("Keine Angst, wir haben sonst nichts ver\204ndert.", 1, 1 + 128);
+ _gm->reply("Ohne diesen Eingriff w\204ren|Sie verloren gewesen.", 1, 1 + 128);
}
_gm->removeSentence(2, 2);
} while (_shown[kMaxSection - 2] != 15);
@@ -1989,7 +1989,7 @@ void AxacussCell::animation() {
bool AxacussCell::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_PRESS) && (obj1._id == CELL_BUTTON))
- _vm->renderMessage("Du drckst den Knopf,|aber nichts passiert.");
+ _vm->renderMessage("Du dr\201ckst den Knopf,|aber nichts passiert.");
else if ((verb == ACTION_PULL) && (obj1._id == CELL_WIRE) &&
!isSectionVisible(2) &&
!isSectionVisible(3) &&
@@ -2076,7 +2076,7 @@ bool AxacussCell::interact(Action verb, Object &obj1, Object &obj2) {
_vm->playSound(kAudioGunShot);
_gm->death("Bei deinem Fluchtversuch hat|dich der Roboter erschossen.");
} else if ((verb == ACTION_USE) && (obj1._id == TRAY))
- _vm->renderMessage("Du iát etwas, aber|es schmeckt scheuálich.");
+ _vm->renderMessage("Du i\341t etwas, aber|es schmeckt scheu\341lich.");
else if ((verb == ACTION_TAKE) && (obj1._id == MAGNET)) {
if (isSectionVisible(6))
_gm->shock();
@@ -2198,7 +2198,7 @@ bestechen:
sum = _gm->_state._money - 200;
goto genug;
}
- _gm->reply("Das máte schon ein biáchen mehr sein.", 1, 1 + 128);
+ _gm->reply("Das m\201\341te schon ein bi\341chen mehr sein.", 1, 1 + 128);
}
}
}
@@ -2207,7 +2207,7 @@ bestechen:
return true;
genug:
- _gm->reply("Ok, dann machen Sie daá Sie wegkommen!", 1, 1 + 128);
+ _gm->reply("Ok, dann machen Sie da\341 Sie wegkommen!", 1, 1 + 128);
_gm->great(0);
_gm->changeRoom(ELEVATOR);
_gm->_newRoom = true;
@@ -2379,7 +2379,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
return false;
} else if ((verb == ACTION_WALK) &&
((obj1._id == PILLAR1) || (obj1._id == PILLAR2))) {
- _vm->renderMessage("Du stellst dich hinter die Sule.");
+ _vm->renderMessage("Du stellst dich hinter die S\204ule.");
_gm->_guiEnabled = true;
} else
return false;
@@ -2431,7 +2431,7 @@ bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
if (_gm->_key.keycode != Common::KEYCODE_ESCAPE) {
if (!input.equals("89814")) {
if (input.equals("41898"))
- _vm->renderMessage("Hmm, das haut nicht ganz hin,|aber irgendwie muá die Zahl|mit dem Code zusammenhngen.");
+ _vm->renderMessage("Hmm, das haut nicht ganz hin,|aber irgendwie mu\341 die Zahl|mit dem Code zusammenh\204ngen.");
else
_vm->renderMessage("Das war die falsche Kombination.");
} else {
@@ -2467,9 +2467,9 @@ bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderText("Sehr geehrter Dr. Hansi,", 10, 60, 4);
_vm->renderText("Ich muá Ihren Roboterexperten ein Lob aussprechen. Die", 10, 75, 4);
_vm->renderText("Imitation von Horst Hummel ist perfekt gelungen, wie ich", 10, 86, 4);
- _vm->renderText("heute bei der bertragung des Interviews feststellen", 10, 97, 4);
+ _vm->renderText("heute bei der \232bertragung des Interviews feststellen", 10, 97, 4);
_vm->renderText("konnte. Dem Aufschwung Ihrer Firma durch die Werbe-", 10, 108, 4);
- _vm->renderText("kampagne mit dem falschen Horst Hummel drfte ja jetzt", 10, 119, 4);
+ _vm->renderText("kampagne mit dem falschen Horst Hummel d\201rfte ja jetzt", 10, 119, 4);
_vm->renderText("nichts mehr im Wege stehen.", 10, 130, 4);
_vm->renderText("PS: Herzlichen zum Geburtstag!", 10, 147, 4);
_vm->renderText("Hochachtungsvoll", 200, 170, 4);
@@ -2627,7 +2627,7 @@ bool AxacussElevator::interact(Action verb, Object &obj1, Object &obj2) {
g_system->fillScreen(kColorBlack);
_vm->_menuBrightness = 255;
_vm->paletteBrightness();
- _vm->renderMessage("Nachdem du zwei Stunden im|Dschungel herumgeirrt bist,|findest du ein Gebude.");
+ _vm->renderMessage("Nachdem du zwei Stunden im|Dschungel herumgeirrt bist,|findest du ein Geb\204ude.");
_gm->mouseWait(_gm->_timer1);
_vm->removeMessage();
_vm->_menuBrightness = 0;
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index ffaf605..e8cbf38 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -94,7 +94,7 @@ public:
Object("Keycard", "Die Keycard fuer deine Schraenke.", KEYCARD,
TAKE | CARRIED | COMBINABLE, 255, 255, 0, NULLROOM, 0);
_objectState[1] =
- Object("Taschenmesser", "Es ist nicht mehr das sch�rfste.", KNIFE,
+ Object("Taschenmesser", "Es ist nicht mehr das sch\204rfste.", KNIFE,
TAKE | CARRIED | COMBINABLE, 255, 255, 0, NULLROOM, 0);
_objectState[2] =
Object("Armbanduhr", Object::defaultDescription, WATCH,
@@ -128,7 +128,7 @@ public:
_objectState[4] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | EXIT, 4, 10, 5, CABIN_R2, 14);
_objectState[5] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | EXIT | OPENED, 9, 3, 4, CABIN_R3, 9);
_objectState[6] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | CLOSED | EXIT, 12, 12, 0, AIRLOCK, 2);
- _objectState[7] = Object("Knopf", "Er geh�rt zu der gro�en Luke.", BUTTON, PRESS, 13, 13, 0, NULLROOM, 0);
+ _objectState[7] = Object("Knopf", "Er geh\224rt zu der gro�en Luke.", BUTTON, PRESS, 13, 13, 0, NULLROOM, 0);
_objectState[8] = Object("Leiter", Object::defaultDescription, NULLOBJECT, NULLTYPE, 14, 14, 0, NULLROOM, 0);
_objectState[9] = Object("Ausgang", Object::defaultDescription, NULLOBJECT, EXIT, 15, 15, 0, HALL, 22);
}
@@ -145,9 +145,9 @@ public:
_fileNumber = 15;
_shown[0] = true;
- _objectState[0] = Object("Luke", "Sie f�hrt ins Cockpit.", NULLOBJECT, OPENABLE | EXIT, 4, 5, 1, COCKPIT, 10);
- _objectState[1] = Object("Luke", "Sie f�hrt zur K�che.", KITCHEN_HATCH, OPENABLE | EXIT, 0, 0, 0, NULLROOM, 1);
- _objectState[2] = Object("Luke", "Sie f�hrt zu den Tiefschlafkammern.", NULLOBJECT, OPENABLE | CLOSED | EXIT, 1, 1, 2, SLEEP, 8);
+ _objectState[0] = Object("Luke", "Sie f\204hrt ins Cockpit.", NULLOBJECT, OPENABLE | EXIT, 4, 5, 1, COCKPIT, 10);
+ _objectState[1] = Object("Luke", "Sie f\204hrt zur K\201che.", KITCHEN_HATCH, OPENABLE | EXIT, 0, 0, 0, NULLROOM, 1);
+ _objectState[2] = Object("Luke", "Sie f\204hrt zu den Tiefschlafkammern.", NULLOBJECT, OPENABLE | CLOSED | EXIT, 1, 1, 2, SLEEP, 8);
_objectState[3] = Object("Schlitz", "Es ist ein Keycard-Leser.", SLEEP_SLOT, COMBINABLE, 2, 2, 0, NULLROOM, 0);
_objectState[4] = Object("Leiter", Object::defaultDescription, NULLOBJECT, NULLTYPE, 3, SLEEP, 0, NULLROOM, 0);
_objectState[5] = Object("Gang", Object::defaultDescription, NULLOBJECT, EXIT, 6, 6, 0, CORRIDOR, 19);
@@ -264,13 +264,13 @@ public:
_objectState[4] = Object("Schrank",Object::defaultDescription,SHELF_L1,OPENABLE | CLOSED,25,26,17);
_objectState[5] = Object("Pistole","Es ist keine Munition drin.",PISTOL,TAKE,39,39,20);
_objectState[6] = Object("Fach",Object::defaultDescription,SHELF_L2,OPENABLE | CLOSED,27,28,18);
- _objectState[7] = Object("B�cher","Lauter wissenschaftliche B�cher.",NULLOBJECT,UNNECESSARY,40,40,0);
+ _objectState[7] = Object("B\201cher","Lauter wissenschaftliche B\201cher.",NULLOBJECT,UNNECESSARY,40,40,0);
_objectState[8] = Object("Fach",Object::defaultDescription,SHELF_L3,OPENABLE | CLOSED,29,30,19);
_objectState[9] = Object("Kabelrolle","Da sind mindestens zwanzig Meter drauf.", SPOOL,TAKE | COMBINABLE,41,41,21);
_objectState[10] = Object("Fach",Object::defaultDescription,SHELF_L4,OPENABLE | CLOSED,43,44,22);
_objectState[11] = Object("Buch",Object::defaultDescription,BOOK2,TAKE,46,46,23);
- _objectState[12] = Object("Unterw�sche","Ich habe keine Lust, in|der Unterw�sche des|Commanders rumzuw�hlen.",NULLOBJECT,UNNECESSARY,34,34,0);
- _objectState[13] = Object("Unterw�sche","Ich habe keine Lust, in|der Unterw�sche des|Commanders rumzuw�hlen.",NULLOBJECT,UNNECESSARY,35,35,0);
+ _objectState[12] = Object("Unterw\204sche","Ich habe keine Lust, in|der Unterw\204sche des|Commanders rumzuw\201hlen.",NULLOBJECT,UNNECESSARY,34,34,0);
+ _objectState[13] = Object("Unterw\204sche","Ich habe keine Lust, in|der Unterw\204sche des|Commanders rumzuw\201hlen.",NULLOBJECT,UNNECESSARY,35,35,0);
_objectState[14] = Object("Kleider",Object::defaultDescription,NULLOBJECT,UNNECESSARY,36,36,0);
_objectState[15] = Object("Krimskram","Es ist nichts brauchbares dabei.",NULLOBJECT,UNNECESSARY,37,37,0);
_objectState[16] = Object("Krimskram","Es ist nichts brauchbares dabei.",NULLOBJECT,UNNECESSARY,38,38,0);
@@ -313,7 +313,7 @@ public:
_objectState[2] = Object("Box",Object::defaultDescription,NULLOBJECT,NULLTYPE,13,13,0);
_objectState[3] = Object("Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",NULLOBJECT,UNNECESSARY,14,14,0);
_objectState[4] = Object("Schallplatte","Die Platte ist von \"Big Boss\".",RECORD,TAKE | COMBINABLE,15,15,8 | 128);
- _objectState[5] = Object("Schallplattenst�nder","Du hast jetzt keine Zeit, in|der Plattensammlung rumzust�bern.",NULLOBJECT,UNNECESSARY,16,16,0);
+ _objectState[5] = Object("Schallplattenst\204nder","Du hast jetzt keine Zeit, in|der Plattensammlung rumzust\224bern.",NULLOBJECT,UNNECESSARY,16,16,0);
_objectState[6] = Object("Knopf",Object::defaultDescription,TURNTABLE_BUTTON,PRESS,22,22,0);
_objectState[7] = Object("Plattenspieler","Sieht aus, als k�me|er aus dem Museum.",TURNTABLE,UNNECESSARY | COMBINABLE,17,17,0);
_objectState[8] = Object("Leitung",Object::defaultDescription,WIRE,COMBINABLE,18,18,0);
@@ -342,7 +342,7 @@ public:
_shown[2] = true;
_objectState[0] = Object("Bild","Manche Leute haben schon|einen komischen Geschmack.",NULLOBJECT,UNNECESSARY,5,5,0);
- _objectState[1] = Object("Zeichenger�te","Auf dem Zettel sind lauter|unverst�ndliche Skizzen und Berechnungen.|(Jedenfalls f�r dich unverst�ndlich.)",NULLOBJECT,UNNECESSARY,6,6,0);
+ _objectState[1] = Object("Zeichenger\204te","Auf dem Zettel sind lauter|unverst\204ndliche Skizzen und Berechnungen.|(Jedenfalls f\201r dich unverst\204ndlich.)",NULLOBJECT,UNNECESSARY,6,6,0);
_objectState[2] = Object("Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",NULLOBJECT,UNNECESSARY,7,7,0);
_objectState[3] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
_objectState[4] = Object("Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
@@ -367,8 +367,8 @@ public:
_shown[4] = true;
_shown[5] = true;
- _objectState[0] = Object("Schachspiel","Es macht wohl Spa�, an|der Decke Schach zu spielen.",NULLOBJECT,UNNECESSARY,11,11,0);
- _objectState[1] = Object("Tennisschl�ger","Fliegt Boris Becker auch mit?",NULLOBJECT,UNNECESSARY,8,8,0);
+ _objectState[0] = Object("Schachspiel","Es macht wohl Spa\341, an|der Decke Schach zu spielen.",NULLOBJECT,UNNECESSARY,11,11,0);
+ _objectState[1] = Object("Tennisschl\204ger","Fliegt Boris Becker auch mit?",NULLOBJECT,UNNECESSARY,8,8,0);
_objectState[2] = Object("Tennisball","Toll!",NULLOBJECT,UNNECESSARY,9,9,0);
_objectState[3] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
_objectState[4] = Object("Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
@@ -409,16 +409,16 @@ public:
_objectState[3] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_K2,COMBINABLE,28,28,0);
_objectState[4] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_K3,COMBINABLE,29,29,0);
_objectState[5] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_K4,COMBINABLE,30,30,0);
- _objectState[6] = Object("Fach","Das ist eins deiner drei F�cher.",SHELF1,OPENABLE | CLOSED,14,18,9);
+ _objectState[6] = Object("Fach","Das ist eins deiner drei F\204cher.",SHELF1,OPENABLE | CLOSED,14,18,9);
_objectState[7] = Object("Alben","Deine Briefmarkensammlung.",NULLOBJECT,UNNECESSARY,14,14,0);
- _objectState[8] = Object("Fach","Das ist eins deiner drei F�cher.",SHELF2,OPENABLE | CLOSED,15,19,10);
- _objectState[9] = Object("Seil","Es ist ungef�hr 10 m lang und 4 cm dick.",ROPE,TAKE | COMBINABLE,15,15,12);
+ _objectState[8] = Object("Fach","Das ist eins deiner drei F\204cher.",SHELF2,OPENABLE | CLOSED,15,19,10);
+ _objectState[9] = Object("Seil","Es ist ungef\204hr 10 m lang und 4 cm dick.",ROPE,TAKE | COMBINABLE,15,15,12);
_objectState[10] = Object("Schrank","Das ist dein Schrank.",SHELF3,OPENABLE | CLOSED,16,17,11);
_objectState[11] = Object("Krimskram","Es ist nichts brauchbares dabei.",NULLOBJECT,UNNECESSARY,20,20,0);
_objectState[12] = Object("Kleider","Es sind Standard-Weltraum-Klamotten.",NULLOBJECT,UNNECESSARY,21,21,0);
_objectState[13] = Object("Unterw�sche",Object::defaultDescription,NULLOBJECT,UNNECESSARY,22,22,0);
- _objectState[14] = Object("Str�mpfe",Object::defaultDescription,NULLOBJECT,UNNECESSARY,23,23,0);
- _objectState[15] = Object("Fach","Das ist eins deiner drei F�cher.",SHELF4,OPENABLE | CLOSED,24,25,13);
+ _objectState[14] = Object("Str\201mpfe",Object::defaultDescription,NULLOBJECT,UNNECESSARY,23,23,0);
+ _objectState[15] = Object("Fach","Das ist eins deiner drei F\204cher.",SHELF4,OPENABLE | CLOSED,24,25,13);
_objectState[16] = Object("Buch","Es ist|\"Per Anhalter durch die Galaxis\"|von Douglas Adams.",BOOK,TAKE,26,26,14);
_objectState[17] = Object("Discman","Es ist eine \"Mad Monkeys\"-CD darin.",DISCMAN,TAKE | COMBINABLE,33,33,16);
_objectState[18] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | EXIT,3,3,15 | 128,CORRIDOR,5);
@@ -485,16 +485,16 @@ public:
_shown[0] = true;
_objectState[0] = Object("",Object::defaultDescription,HOLD_WIRE,COMBINABLE,255,255,0);
- _objectState[1] = Object("Schrott","Da ist eine L�sterklemme dran, die|noch ganz brauchbar aussieht.|Ich nehme sie mit.",SCRAP_LK,NULLTYPE,4,4,0);
- _objectState[2] = Object("L�sterklemme",Object::defaultDescription,TERMINALSTRIP,COMBINABLE,255,255,0);
- _objectState[3] = Object("Schrott","Junge, Junge! Die Explosion hat ein|ganz sch�nes Durcheinander angerichtet.",NULLOBJECT,NULLTYPE,5,5,0);
+ _objectState[1] = Object("Schrott","Da ist eine L\201sterklemme dran, die|noch ganz brauchbar aussieht.|Ich nehme sie mit.",SCRAP_LK,NULLTYPE,4,4,0);
+ _objectState[2] = Object("L\201sterklemme",Object::defaultDescription,TERMINALSTRIP,COMBINABLE,255,255,0);
+ _objectState[3] = Object("Schrott","Junge, Junge! Die Explosion hat ein|ganz sch\224nes Durcheinander angerichtet.",NULLOBJECT,NULLTYPE,5,5,0);
_objectState[4] = Object("Reaktor","Das war einmal der Reaktor.",NULLOBJECT,NULLTYPE,6,6,0);
- _objectState[5] = Object("D�se",Object::defaultDescription,NULLOBJECT,NULLTYPE,7,7,0);
- _objectState[6] = Object("blauer K�rbis","Keine Ahnung, was das ist.",NULLOBJECT,NULLTYPE,8,8,0);
+ _objectState[5] = Object("D\201se",Object::defaultDescription,NULLOBJECT,NULLTYPE,7,7,0);
+ _objectState[6] = Object("blauer K\201rbis","Keine Ahnung, was das ist.",NULLOBJECT,NULLTYPE,8,8,0);
_objectState[7] = Object("Luke",Object::defaultDescription,LANDINGMOD_OUTERHATCH,EXIT | OPENABLE,1,2,2,LANDINGMODULE,6);
- _objectState[8] = Object("Landef�hre","Sie war eigentlich f�r Bodenuntersuchungen|auf Arsano 3 gedacht.",NULLOBJECT,NULLTYPE,0,0,0);
+ _objectState[8] = Object("Landef\204hre","Sie war eigentlich f\201r Bodenuntersuchungen|auf Arsano 3 gedacht.",NULLOBJECT,NULLTYPE,0,0,0);
_objectState[9] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,AIRLOCK,22);
- _objectState[10] = Object("Luke","Sie f�hrt nach drau�en.",OUTERHATCH_TOP,EXIT | OPENABLE | OPENED,3,3,0,GENERATOR,8);
+ _objectState[10] = Object("Luke","Sie f\201hrt nach drau\341en.",OUTERHATCH_TOP,EXIT | OPENABLE | OPENED,3,3,0,GENERATOR,8);
_objectState[11] = Object("Generator","Er versorgt das Raumschiff mit Strom.",GENERATOR_TOP,EXIT,12,12,0,GENERATOR,8);
}
@@ -512,7 +512,7 @@ public:
_shown[0] = true;
_objectState[0] = Object("Steckdose",Object::defaultDescription,LANDINGMOD_SOCKET,COMBINABLE,1,1,0);
- _objectState[1] = Object("Knopf","Es ist ein Sicherheitsknopf.|Er kann nur mit einem spitzen|Gegenstand gedr�ckt werden.",LANDINGMOD_BUTTON,PRESS | COMBINABLE,2,2,0);
+ _objectState[1] = Object("Knopf","Es ist ein Sicherheitsknopf.|Er kann nur mit einem spitzen|Gegenstand gedr\201ckt werden.",LANDINGMOD_BUTTON,PRESS | COMBINABLE,2,2,0);
_objectState[2] = Object("Monitor",Object::defaultDescription,LANDINGMOD_MONITOR,NULLTYPE,3,3,0);
_objectState[3] = Object("Tastatur",Object::defaultDescription,KEYBOARD,NULLTYPE,4,4,0);
_objectState[4] = Object("",Object::defaultDescription,LANDINGMOD_WIRE,COMBINABLE,255,255,0);
@@ -538,16 +538,16 @@ public:
_objectState[0] = Object("langes Kabel mit Stecker",Object::defaultDescription,GENERATOR_WIRE,COMBINABLE,255,255,0);
_objectState[1] = Object("leere Kabelrolle",Object::defaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
- _objectState[2] = Object("Keycard","Hey, das ist die Keycard des Commanders!|Er mu� sie bei dem �berst�rzten|Aufbruch verloren haben.",KEYCARD2,COMBINABLE | TAKE,12,12,5 | 128);
+ _objectState[2] = Object("Keycard","Hey, das ist die Keycard des Commanders!|Er mu\341 sie bei dem \201berst\201rzten|Aufbruch verloren haben.",KEYCARD2,COMBINABLE | TAKE,12,12,5 | 128);
_objectState[3] = Object("Seil",Object::defaultDescription,GENERATOR_ROPE,COMBINABLE,255,255,0);
- _objectState[4] = Object("Luke","Sie f�hrt nach drau�en.",OUTERHATCH,EXIT | OPENABLE,1,2,1,OUTSIDE,22);
+ _objectState[4] = Object("Luke","Sie f\201hrt nach drau\341en.",OUTERHATCH,EXIT | OPENABLE,1,2,1,OUTSIDE,22);
_objectState[5] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,3,3,0);
_objectState[6] = Object("Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,4,4,0);
_objectState[7] = Object("Klappe",Object::defaultDescription,TRAP,OPENABLE,5,6,2);
_objectState[8] = Object("Leitung",Object::defaultDescription,NULLOBJECT,NULLTYPE,7,7,0);
- _objectState[9] = Object("Spannungmessger�t",Object::defaultDescription,VOLTMETER,NULLTYPE,9,9,0,NULLROOM,0);
+ _objectState[9] = Object("Spannungmessger\204t",Object::defaultDescription,VOLTMETER,NULLTYPE,9,9,0,NULLROOM,0);
_objectState[10] = Object("Klemme",Object::defaultDescription,CLIP,COMBINABLE,8,8,0);
- _objectState[11] = Object("Leitung","Sie f�hrt vom Generator zum Spannungmessger�t.",SHORT_WIRE,COMBINABLE,10,10,0);
+ _objectState[11] = Object("Leitung","Sie f\201hrt vom Generator zum Spannungmessger\204t.",SHORT_WIRE,COMBINABLE,10,10,0);
_objectState[12] = Object("Leiter",Object::defaultDescription,LADDER,EXIT,0,0,0,HOLD,1);
}
@@ -581,7 +581,7 @@ public:
_objectState[0] = Object("Seil",Object::defaultDescription,NULLOBJECT,UNNECESSARY | EXIT,0,0,0,GENERATOR,12);
_objectState[1] = Object("Stein",Object::defaultDescription,STONE,NULLTYPE,1,1,0);
_objectState[2] = Object("Stein",Object::defaultDescription,NULLOBJECT,NULLTYPE,2,2,0);
- _objectState[3] = Object("Loch","Es scheint eine Höhle zu sein.",NULLOBJECT,NULLTYPE,255,255,0,CAVE,1);
+ _objectState[3] = Object("Loch","Es scheint eine H\224hle zu sein.",NULLOBJECT,NULLTYPE,255,255,0,CAVE,1);
}
virtual void onEntrance();
@@ -609,7 +609,7 @@ public:
_fileNumber = 37;
_shown[0] = true;
- _objectState[0] = Object("Höhle",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
+ _objectState[0] = Object("H\224hle",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
_objectState[1] = Object("Schild","Diese Schrift kannst du nicht lesen.",MEETUP_SIGN,NULLTYPE,0,0,0);
_objectState[2] = Object("Eingang",Object::defaultDescription,DOOR,EXIT,1,1,0,ENTRANCE,7);
_objectState[3] = Object("Stern",Object::defaultDescription,STAR,NULLTYPE,2,2,0);
@@ -635,23 +635,23 @@ public:
_shown[0] = true;
_objectState[0] = Object("Portier","Du siehst doch selbst, wie er aussieht.",PORTER,TALK,0,0,0);
- _objectState[1] = Object("Tür",Object::defaultDescription,NULLOBJECT,EXIT | OPENABLE | CLOSED,1,1,0,NULLROOM,5);
+ _objectState[1] = Object("T\201r",Object::defaultDescription,NULLOBJECT,EXIT | OPENABLE | CLOSED,1,1,0,NULLROOM,5);
_objectState[2] = Object("Schild","Diese Schrift kannst du nicht lesen.",KITCHEN_SIGN,NULLTYPE,2,2,0);
_objectState[3] = Object("Kaugummi",Object::defaultDescription,SCHNUCK,TAKE,255,255,10+128);
- _objectState[4] = Object("Gummibärchen",Object::defaultDescription,SCHNUCK,TAKE,255,255,11+128);
+ _objectState[4] = Object("Gummib\204rchen",Object::defaultDescription,SCHNUCK,TAKE,255,255,11+128);
_objectState[5] = Object("Schokokugel",Object::defaultDescription,SCHNUCK,TAKE,255,255,12+128);
- _objectState[6] = Object("Überraschungsei",Object::defaultDescription,EGG,TAKE,255,255,13+128);
+ _objectState[6] = Object("\232berraschungsei",Object::defaultDescription,EGG,TAKE,255,255,13+128);
_objectState[7] = Object("Lakritz",Object::defaultDescription,SCHNUCK,TAKE,255,255,14+128);
- _objectState[8] = Object("Tablette","Die Plastikhülle zeigt einen|Mund mit einer Sprechblase. Was|darin steht, kannst du nicht lesen.",PILL,TAKE,255,255,0);
+ _objectState[8] = Object("Tablette","Die Plastikh\201lle zeigt einen|Mund mit einer Sprechblase. Was|darin steht, kannst du nicht lesen.",PILL,TAKE,255,255,0);
_objectState[9] = Object("Schlitz",Object::defaultDescription,CAR_SLOT,COMBINABLE,6,6,0);
_objectState[10] = Object("Automat","Sieht aus wie ein Kaugummiautomat.",NULLOBJECT,NULLTYPE,5,5,0);
- _objectState[11] = Object("Toilette","Die Toiletten sind denen|auf der Erde sehr ähnlich.",ARSANO_BATHROOM,NULLTYPE,255,255,0);
+ _objectState[11] = Object("Toilette","Die Toiletten sind denen|auf der Erde sehr \204hnlich.",ARSANO_BATHROOM,NULLTYPE,255,255,0);
_objectState[12] = Object("Knopf",Object::defaultDescription,BATHROOM_BUTTON,PRESS,3,3,0);
_objectState[13] = Object("Schild","Diese Schrift kannst du nicht lesen.",BATHROOM_SIGN,NULLTYPE,4,4,0);
_objectState[14] = Object("Treppe",Object::defaultDescription,STAIRCASE,EXIT,8,8,0,REST,3);
_objectState[15] = Object("Ausgang",Object::defaultDescription,MEETUP_EXIT,EXIT,255,255,0,MEETUP,22);
- _objectState[16] = Object("Münzen","Es sind seltsame|Köpfe darauf abgebildet.",COINS,TAKE|COMBINABLE,255,255,0);
- _objectState[17] = Object("Tablettenhülle","Darauf steht:\"Wenn Sie diese|Schrift jetzt lesen können,|hat die Tablette gewirkt.\"",PILL_HULL,TAKE,255,255,0);
+ _objectState[16] = Object("M\201nzen","Es sind seltsame|K\224pfe darauf abgebildet.",COINS,TAKE|COMBINABLE,255,255,0);
+ _objectState[17] = Object("Tablettenh\201lle","Darauf steht:\"Wenn Sie diese|Schrift jetzt lesen k\224nnen,|hat die Tablette gewirkt.\"",PILL_HULL,TAKE,255,255,0);
_dialog1[0] = "Wieso das denn nicht?";
_dialog1[1] = "Wo bin ich hier?";
@@ -660,9 +660,9 @@ public:
_dialog1[4] = "|";
_dialog2[0] = "Wo bin ich hier?";
- _dialog2[1] = "Schnes Wetter heute, nicht wahr?";
- _dialog2[2] = "Wrden Sie mich bitte durchlassen.";
- _dialog2[3] = "Hey Alter, laá mich durch!";
+ _dialog2[1] = "Sch\224nes Wetter heute, nicht wahr?";
+ _dialog2[2] = "W\201rden Sie mich bitte durchlassen.";
+ _dialog2[3] = "Hey Alter, la\341 mich durch!";
_dialog2[4] = "|";
_dialog3[0] = "Was haben Sie gesagt?";
@@ -716,12 +716,12 @@ public:
_objectState[2] = Object("Gekritzel","\"Mr Spock was here\"",NULLOBJECT,NULLTYPE,3,3,0);
_objectState[3] = Object("Brieftasche",Object::defaultDescription,WALLET,TAKE,1,1,4);
_objectState[4] = Object("Speisekarte","\"Heute empfehlen wir:|Fonua Opra mit Ulk.\"",NULLOBJECT,UNNECESSARY,2,2,0);
- _objectState[5] = Object("Tasse","Sie enthält eine grünliche Flüssigkeit.",CUP,UNNECESSARY,4,4,0);
+ _objectState[5] = Object("Tasse","Sie enth\204lt eine gr\201nliche Fl\201ssigkeit.",CUP,UNNECESSARY,4,4,0);
_objectState[6] = Object("Schachspiel",Object::defaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
_objectState[7] = Object("10-Buckazoid-Schein","Nicht gerade sehr viel Geld.",NULLOBJECT,TAKE|COMBINABLE,255,255,0);
_objectState[8] = Object("Keycard von Roger",Object::defaultDescription,KEYCARD_R,TAKE|COMBINABLE,255,255,0);
- _dialog1[0] = "Knnten Sie mir ein Gericht empfehlen?";
+ _dialog1[0] = "K\224nnten Sie mir ein Gericht empfehlen?";
_dialog1[1] = "Wie lange dauert es denn noch bis zur Supernova?";
_dialog1[2] = "Sie kommen mir irgendwie bekannt vor.";
_dialog1[3] = "|";
@@ -779,16 +779,16 @@ public:
_objectState[1] = Object("Raumschiff",Object::defaultDescription,SPACESHIP,COMBINABLE,255,255,0);
_objectState[2] = Object("Höhle",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
- _dialog1[0] = "Ach, Ihnen gehrt die. Ich habe sie eben im Sand gefunden.";
+ _dialog1[0] = "Ach, Ihnen geh\224rt die. Ich habe sie eben im Sand gefunden.";
_dialog1[1] = "Nein, tut mir leid.";
_dialog2[0] = "Nein, danke. Ich bleibe lieber hier.";
- _dialog2[1] = "Ja, das wre gut.";
+ _dialog2[1] = "Ja, das w\204re gut.";
_dialog3[0] = "Zur Erde.";
- _dialog3[1] = "Zum Prsident der Galaxis.";
+ _dialog3[1] = "Zum Pr\204sident der Galaxis.";
_dialog3[2] = "Nach Xenon.";
_dialog3[3] = "Mir egal, setzen Sie mich irgendwo ab!";
_dialog4[0] = "Ich habe gerade Ihre Brieftasche gefunden!";
- _dialog4[1] = "Sie lag da drben hinter einem Felsen.";
+ _dialog4[1] = "Sie lag da dr\201ben hinter einem Felsen.";
_dialog4[2] = "Ich wollte nur wissen, ob Sie die Brieftasche wiederhaben.";
}
@@ -814,7 +814,7 @@ public:
_objectState[0] = Object("Ufo","Der Eingang scheint offen zu sein.",UFO,EXIT,0,0,0,NULLROOM,3);
_objectState[1] = Object("Stern",Object::defaultDescription,STAR,NULLTYPE,1,1,0);
- _objectState[2] = Object("Höhle",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
+ _objectState[2] = Object("H\224hle",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
_dialog2[0] = "Wo bin ich hier?";
_dialog2[1] = "Was wollen Sie von mir?";
@@ -873,8 +873,8 @@ public:
_shown[31] = true;
_objectState[0] = Object("Knopf",Object::defaultDescription,CELL_BUTTON,PRESS,1,1,0);
- _objectState[1] = Object("Tür",Object::defaultDescription,CELL_DOOR,EXIT|OPENABLE|CLOSED,0,0,31+128,CORRIDOR4,1);
- _objectState[2] = Object("Tablett","Es ist irgendein Fraß und|etwas zu Trinken darauf.",TRAY,UNNECESSARY,255,255,0);
+ _objectState[1] = Object("T\201r",Object::defaultDescription,CELL_DOOR,EXIT|OPENABLE|CLOSED,0,0,31+128,CORRIDOR4,1);
+ _objectState[2] = Object("Tablett","Es ist irgendein Fra\341 und|etwas zu Trinken darauf.",TRAY,UNNECESSARY,255,255,0);
_objectState[3] = Object("Stange","Es scheint eine Lampe zu sein.",NULLOBJECT,COMBINABLE,3,3,0);
_objectState[4] = Object("Augen","Es ist nur ein Bild.",NULLOBJECT,NULLTYPE,4,4,0);
_objectState[5] = Object("Leitung",Object::defaultDescription,CELL_WIRE,COMBINABLE|TAKE,6,6,0);
@@ -1043,7 +1043,7 @@ public:
_objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,0,0,0,CORRIDOR2,10);
_objectState[1] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,1,1,0,GUARD,14);
- _objectState[2] = Object("Zellentür","Hier warst du eingesperrt.",DOOR,EXIT|OPENABLE|OPENED|CLOSED,7,7,0,CELL,16);
+ _objectState[2] = Object("Zellent\201r","Hier warst du eingesperrt.",DOOR,EXIT|OPENABLE|OPENED|CLOSED,7,7,0,CELL,16);
_objectState[3] = Object("Laptop",Object::defaultDescription,NEWSPAPER,TAKE,6,6,8);
_objectState[4] = Object("Armbanduhr",Object::defaultDescription,WATCH,TAKE|COMBINABLE,255,255,8);
_objectState[5] = Object("Tisch",Object::defaultDescription,TABLE,COMBINABLE,5,5,0);
@@ -1089,9 +1089,9 @@ public:
_objectState[0] = Object("Ausgang",Object::defaultDescription,DOOR,EXIT,2,2,0,NULLROOM,2);
_objectState[1] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR6,22);
- _dialog1[0] = "h ... nein, mein Name ist Mller.";
+ _dialog1[0] = "\216h ... nein, mein Name ist M\201ller.";
_dialog1[1] = "Oh, ich habe mich im Gang vertan.";
- _dialog2[0] = "Wrden Sie mich bitte zum Fahrstuhl lassen?";
+ _dialog2[0] = "W\201rden Sie mich bitte zum Fahrstuhl lassen?";
_dialog2[1] = "Ich gehe wieder.";
_dialog3[0] = "Dann gehe ich eben wieder.";
_dialog3[1] = "Ach, halten Sie's Maul, ich gehe trotzdem!";
@@ -1143,7 +1143,7 @@ public:
_objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR5,2);
_objectState[1] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR7,22);
- _objectState[2] = Object("Tür",Object::defaultDescription,DOOR,OPENABLE|CLOSED,255,255,0,CORRIDOR8,13);
+ _objectState[2] = Object("T\201r",Object::defaultDescription,DOOR,OPENABLE|CLOSED,255,255,0,CORRIDOR8,13);
}
virtual void onEntrance();
@@ -1226,7 +1226,7 @@ public:
_shown[27] = false;
_shown[28] = true;
- _objectState[0] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE,0,0,0,CORRIDOR6,10);
+ _objectState[0] = Object("T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE,0,0,0,CORRIDOR6,10);
_objectState[1] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,BCORRIDOR,22);
}
@@ -1271,7 +1271,7 @@ public:
_shown[28] = true;
_objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,BCORRIDOR,2);
- _objectState[1] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE,0,0,0,GUARD,10);
+ _objectState[1] = Object("T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE,0,0,0,GUARD,10);
}
virtual void onEntrance();
@@ -1289,16 +1289,16 @@ public:
_shown[2] = false;
_shown[3] = true;
- _objectState[0] = Object("Säule",Object::defaultDescription,PILLAR1,NULLTYPE,4,4,0);
- _objectState[1] = Object("Säule",Object::defaultDescription,PILLAR2,NULLTYPE,5,5,0);
+ _objectState[0] = Object("S\204ule",Object::defaultDescription,PILLAR1,NULLTYPE,4,4,0);
+ _objectState[1] = Object("S\204ule",Object::defaultDescription,PILLAR2,NULLTYPE,5,5,0);
_objectState[2] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,6,6,0,CORRIDOR8,2);
_objectState[3] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,7,7,0,CORRIDOR9,22);
- _objectState[4] = Object("Tür","Auf einem Schild an der Tür steht \"Dr. Alab Hansi\".",DOOR1,EXIT|OPENABLE|CLOSED|OCCUPIED,0,0,1,OFFICE_L1,6);
- _objectState[5] = Object("Tür","Auf einem Schild an der Tür steht \"Saval Lun\".",DOOR2,EXIT|OPENABLE|CLOSED|OCCUPIED,1,1,2,OFFICE_L2,16);
- _objectState[6] = Object("Tür","Auf einem Schild an der Tür steht \"Prof. Dr. Ugnul Tschabb\".",DOOR3,EXIT|OPENABLE|OPENED,2,2,3,OFFICE_R1,8);
- _objectState[7] = Object("Tür","Auf einem Schild an der Tür steht \"Alga Hurz Li\".",DOOR4,EXIT|OPENABLE|CLOSED|OCCUPIED,3,3,4,OFFICE_R2,18);
+ _objectState[4] = Object("T\201r","Auf einem Schild an der T\201r steht \"Dr. Alab Hansi\".",DOOR1,EXIT|OPENABLE|CLOSED|OCCUPIED,0,0,1,OFFICE_L1,6);
+ _objectState[5] = Object("T\201r","Auf einem Schild an der T\201r steht \"Saval Lun\".",DOOR2,EXIT|OPENABLE|CLOSED|OCCUPIED,1,1,2,OFFICE_L2,16);
+ _objectState[6] = Object("T\201r","Auf einem Schild an der T\201r steht \"Prof. Dr. Ugnul Tschabb\".",DOOR3,EXIT|OPENABLE|OPENED,2,2,3,OFFICE_R1,8);
+ _objectState[7] = Object("T\201r","Auf einem Schild an der T\201r steht \"Alga Hurz Li\".",DOOR4,EXIT|OPENABLE|CLOSED|OCCUPIED,3,3,4,OFFICE_R2,18);
- _dontEnter = "Diese Tr wrde ich lieber|nicht ffnen. Nach dem Schild zu|urteilen, ist jemand in dem Raum.";
+ _dontEnter = "Diese T\201r w\201rde ich lieber|nicht \224ffnen. Nach dem Schild zu|urteilen, ist jemand in dem Raum.";
}
virtual void onEntrance();
@@ -1318,9 +1318,9 @@ public:
_objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CORRIDOR4,21);
_objectState[1] = Object("Gang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR7,5);
- _objectState[2] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE,1,1,6,CORRIDOR9,3);
+ _objectState[2] = Object("T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE,1,1,6,CORRIDOR9,3);
// Originally GUARD was ObjectID..
- _objectState[3] = Object("Axacussaner","Du müßtest ihn irgendwie ablenken.",INSTRUMENTS,TALK,0,0,0);
+ _objectState[3] = Object("Axacussaner","Du m\201\341test ihn irgendwie ablenken.",INSTRUMENTS,TALK,0,0,0);
_objectState[4] = Object("Bild","Komisches Bild.",NULLOBJECT,NULLTYPE,2,2,0);
_objectState[5] = Object("Karte","Darauf steht: \"Generalkarte\".",MASTERKEYCARD,TAKE|COMBINABLE,255,255,1);
}
@@ -1337,9 +1337,9 @@ public:
_shown[0] = true;
_objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CORRIDOR1,22);
- _objectState[1] = Object("Tür",Object::defaultDescription,NULLOBJECT,EXIT|OPENABLE|CLOSED,0,0,0,NULLROOM,20);
- _objectState[2] = Object("Tür",Object::defaultDescription,NULLOBJECT,EXIT|OPENABLE|CLOSED,1,1,0,NULLROOM,15);
- _objectState[3] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE,2,2,11,OFFICE_L,0);
+ _objectState[1] = Object("T\201r",Object::defaultDescription,NULLOBJECT,EXIT|OPENABLE|CLOSED,0,0,0,NULLROOM,20);
+ _objectState[2] = Object("T\201r",Object::defaultDescription,NULLOBJECT,EXIT|OPENABLE|CLOSED,1,1,0,NULLROOM,15);
+ _objectState[3] = Object("T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE,2,2,11,OFFICE_L,0);
_objectState[4] = Object("Lampe",Object::defaultDescription,LAMP,COMBINABLE,3,3,0);
// Originally GUARD was ObjectID..
_objectState[5] = Object("Axacussaner",Object::defaultDescription,INSTRUMENTS,TALK,5,5,0);
@@ -1373,10 +1373,10 @@ public:
_shown[15] = false;
_shown[16] = true;
- _objectState[0] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,9,BCORRIDOR,9);
+ _objectState[0] = Object("T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,9,BCORRIDOR,9);
_objectState[1] = Object("Computer",Object::defaultDescription,COMPUTER,COMBINABLE,4,4,0);
_objectState[2] = Object("Geld","Es sind 500 Xa.",TICKETS,TAKE,255,255,0);
- _objectState[3] = Object("Schließfach","Es hat ein elektronisches Zahlenschloß.",LOCKER,OPENABLE|CLOSED,5,5,0);
+ _objectState[3] = Object("Schließfach","Es hat ein elektronisches Zahlenschlo\341.",LOCKER,OPENABLE|CLOSED,5,5,0);
_objectState[4] = Object("Brief",Object::defaultDescription,LETTER,UNNECESSARY,3,3,0);
}
@@ -1407,9 +1407,9 @@ public:
_shown[15] = false;
_shown[16] = true;
- _objectState[0] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,9,BCORRIDOR,9);
+ _objectState[0] = Object("T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,9,BCORRIDOR,9);
_objectState[1] = Object("Computer",Object::defaultDescription,COMPUTER,COMBINABLE,4,4,0);
- _objectState[2] = Object("Würfel","Sonderbar!",NULLOBJECT,NULLTYPE,0,0,0);
+ _objectState[2] = Object("W\201rfel","Sonderbar!",NULLOBJECT,NULLTYPE,0,0,0);
_objectState[3] = Object("Bild","Affenstark!",NULLOBJECT,NULLTYPE,1,1,0);
_objectState[4] = Object("Komisches Ding","Wundersam!",NULLOBJECT,UNNECESSARY,2,2,0);
}
@@ -1428,7 +1428,7 @@ public:
_shown[2] = false;
_shown[3] = true;
- _objectState[0] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,0,0,3,BCORRIDOR,5);
+ _objectState[0] = Object("T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,0,0,3,BCORRIDOR,5);
_objectState[1] = Object("Computer",Object::defaultDescription,COMPUTER,COMBINABLE,4,4,0);
_objectState[2] = Object("Bild","Es ist ein Axacussanerkopf auf dem Bild.",NULLOBJECT,UNNECESSARY,1,1,0);
_objectState[3] = Object("Bild","Es ist ein Axacussanerkopf auf dem Bild.",PAINTING,UNNECESSARY,2,2,0);
@@ -1450,7 +1450,7 @@ public:
_shown[2] = true;
_shown[3] = true;
- _objectState[0] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,0,0,3,BCORRIDOR,5);
+ _objectState[0] = Object("T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,0,0,3,BCORRIDOR,5);
_objectState[1] = Object("Computer",Object::defaultDescription,COMPUTER,COMBINABLE,4,4,0);
_objectState[2] = Object("Figur","Stark!",NULLOBJECT,UNNECESSARY,6,6,0);
_objectState[3] = Object("Pflanze","Sie ist den Pflanzen auf der Erde sehr ähnlich.",NULLOBJECT,UNNECESSARY,5,5,0);
@@ -1484,9 +1484,9 @@ public:
_shown[16] = false;
_shown[17] = true;
- _objectState[0] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,17,GUARD3,9);
+ _objectState[0] = Object("T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,17,GUARD3,9);
_objectState[1] = Object("Computer","Er funktioniert nicht.",COMPUTER,COMBINABLE,4,4,0);
- _objectState[2] = Object("Graffiti","Seltsamer Büroschmuck!",NULLOBJECT,NULLTYPE,7,7,0);
+ _objectState[2] = Object("Graffiti","Seltsamer B\201roschmuck!",NULLOBJECT,NULLTYPE,7,7,0);
_objectState[3] = Object("Geld","Es sind 350 Xa.",TICKETS,TAKE,8,8,0);
}
@@ -1505,7 +1505,7 @@ public:
_objectState[0] = Object("Knopf",Object::defaultDescription,BUTTON1,PRESS,0,0,0);
_objectState[1] = Object("Knopf",Object::defaultDescription,BUTTON2,PRESS,1,1,0);
_objectState[2] = Object("Ausgang",Object::defaultDescription,DOOR,EXIT,255,255,0,NULLROOM,22);
- _objectState[3] = Object("Dschungel","Lauter Bäume.",JUNGLE,NULLTYPE,255,255,0,STATION,2);
+ _objectState[3] = Object("Dschungel","Lauter B\204ume.",JUNGLE,NULLTYPE,255,255,0,STATION,2);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -1519,7 +1519,7 @@ public:
_fileNumber = 5;
_shown[0] = true;
_objectState[0] = Object("Schild",Object::defaultDescription,STATION_SIGN,NULLTYPE,0,0,0);
- _objectState[1] = Object("Tür",Object::defaultDescription,DOOR,EXIT|OPENABLE|CLOSED,1,1,0,NULLROOM,7);
+ _objectState[1] = Object("T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|CLOSED,1,1,0,NULLROOM,7);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index b6a186e..7cfd1b4 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1191,15 +1191,15 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_OPEN) && (obj1._id == EGG)) {
takeObject(obj1);
if (obj1.hasProperty(OPENED)) {
- _vm->renderMessage("Du hast es doch schon geffnet.");
+ _vm->renderMessage("Du hast es doch schon ge\224ffnet.");
} else {
takeObject(*_rooms[ENTRANCE]->getObject(8));
- _vm->renderMessage("In dem Ei ist eine Tablette|in einer Plastikhlle.");
+ _vm->renderMessage("In dem Ei ist eine Tablette|in einer Plastikh\201lle.");
obj1.setProperty(OPENED);
}
} else if ((verb == ACTION_USE) && (obj1._id == PILL)) {
if (isHelmetOff()) {
- _vm->renderMessage("Du iát die Tablette und merkst,|daá sich irgendetwas verndert hat.");
+ _vm->renderMessage("Du iát die Tablette und merkst,|da\341 sich irgendetwas ver\216ndert hat.");
great(0);
_inventory.remove(obj1);
_state._language = 2;
@@ -1207,11 +1207,11 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
}
} else if ((verb == ACTION_LOOK) && (obj1._id == PILL_HULL) &&
(_state._language == 2)) {
- _vm->renderMessage("Komisch! Auf einmal kannst du die Schrift lesen!|Darauf steht:\"Wenn Sie diese Schrift jetzt|lesen knnen, hat die Tablette gewirkt.\"");
+ _vm->renderMessage("Komisch! Auf einmal kannst du die Schrift lesen!|Darauf steht:\"Wenn Sie diese Schrift jetzt|lesen k\224nnen, hat die Tablette gewirkt.\"");
_state._language = 1;
} else if ((verb == ACTION_OPEN) && (obj1._id == WALLET)) {
if (!_rooms[ROGER]->getObject(3)->hasProperty(CARRIED)) {
- _vm->renderMessage("Das muát du erst nehmen.");
+ _vm->renderMessage("Das mu\341t du erst nehmen.");
} else if (_rooms[ROGER]->getObject(7)->hasProperty(CARRIED)) {
_vm->renderMessage("Sie ist leer.");
} else {
@@ -1300,7 +1300,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
else
return false;
} else {
- r->getObject(8)->_name = "Leitung mit Lsterklemme";
+ r->getObject(8)->_name = "Leitung mit L\201sterklemme";
r = _rooms[HOLD];
_inventory.remove(*r->getObject(2));
_state._terminalStripConnected = true;
@@ -1310,7 +1310,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, SPOOL)) {
r = _rooms[CABIN_L2];
takeObject(*r->getObject(9));
- r->getObject(9)->_name = "Kabelrolle mit Lsterklemme";
+ r->getObject(9)->_name = "Kabelrolle mit L\201sterklemme";
r = _rooms[HOLD];
_inventory.remove(*r->getObject(2));
_state._terminalStripConnected = true;
@@ -1350,9 +1350,9 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
if (obj1.hasProperty(WORN)) {
r = _rooms[AIRLOCK];
if (r->getObject(4)->hasProperty(WORN)) {
- _vm->renderMessage("Du muát erst den Helm abnehmen.");
+ _vm->renderMessage("Du mu\341t erst den Helm abnehmen.");
} else if (r->getObject(6)->hasProperty(WORN)) {
- _vm->renderMessage("Du muát erst den Versorgungsteil abnehmen.");
+ _vm->renderMessage("Du mu\341t erst den Versorgungsteil abnehmen.");
} else {
obj1.disableProperty(WORN);
_vm->renderMessage("Du ziehst den Raumanzug aus.");
@@ -1386,7 +1386,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
obj1.setProperty(WORN);
_vm->renderMessage("Du ziehst den Helm auf.");
} else {
- _vm->renderMessage("Du muát erst den Anzug anziehen.");
+ _vm->renderMessage("Du mu\341t erst den Anzug anziehen.");
}
}
}
@@ -1413,7 +1413,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
obj1.setProperty(WORN);
_vm->renderMessage("Du ziehst den Versorgungsteil an.");
} else {
- _vm->renderMessage("Du muát erst den Anzug anziehen.");
+ _vm->renderMessage("Du mu\341t erst den Anzug anziehen.");
}
}
}
@@ -1421,7 +1421,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
// *bathroom = current_room;
return false;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, WIRE, SOCKET))
- _vm->renderMessage("Die Leitung ist hier unntz.");
+ _vm->renderMessage("Die Leitung ist hier unn\201tz.");
else if ((verb == ACTION_LOOK) && (obj1._id == BOOK2)) {
_vm->renderMessage("Stark, das ist ja die Fortsetzung zum \"Anhalter\":|\"Das Restaurant am Ende des Universums\".");
mouseWait(_timer1);
@@ -1447,7 +1447,7 @@ void GameManager::handleInput() {
case ACTION_WALK:
if (_inputObject[0]->hasProperty(CARRIED)) {
// You already carry this.
- _vm->renderMessage("Das trgst du doch bei dir.");
+ _vm->renderMessage("Das tr\204gst du doch bei dir.");
} else if (!_inputObject[0]->hasProperty(EXIT)) {
// You're already there.
_vm->renderMessage("Du bist doch schon da.");
@@ -1477,7 +1477,7 @@ void GameManager::handleInput() {
case ACTION_OPEN:
if (!_inputObject[0]->hasProperty(OPENABLE)) {
// This can't be opened
- _vm->renderMessage("Das lát sich nicht ffnen.");
+ _vm->renderMessage("Das l\204\341t sich nicht \224ffnen.");
} else if (_inputObject[0]->hasProperty(OPENED)) {
// This is already opened.
_vm->renderMessage("Das ist schon offen.");
@@ -1499,7 +1499,7 @@ void GameManager::handleInput() {
(_inputObject[0]->hasProperty(CLOSED) &&
_inputObject[0]->hasProperty(OPENED))) {
// This can't be closed.
- _vm->renderMessage("Das lát sich nicht schlieáen.");
+ _vm->renderMessage("Das l\204\341t sich nicht schlie\341en.");
} else if (!_inputObject[0]->hasProperty(OPENED)) {
// This is already closed.
_vm->renderMessage("Das ist schon geschlossen.");
Commit: cec70a4cb4ce1f5883dfb21f5a61508552b71f82
https://github.com/scummvm/scummvm/commit/cec70a4cb4ce1f5883dfb21f5a61508552b71f82
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:46:53Z
Commit Message:
SUPERNOVA: Renames ObjectID 'SLOT'
Changed paths:
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
engines/supernova/rooms.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index d609fe5..a8c76a4 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -419,7 +419,7 @@ enum ObjectID {
PILLAR1,PILLAR2,DOOR1,DOOR2,DOOR3,DOOR4,
GUARDIAN,LAMP,
MASTERKEYCARD,PAINTING,MONEY,LOCKER,LETTER,
- JUNGLE,SLOT,STATION_SIGN,
+ JUNGLE,STATION_SLOT,STATION_SIGN,
TICKETS
};
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 5434b8e..dc30d40 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2676,7 +2676,7 @@ bool AxacussStation::interact(Action verb, Object &obj1, Object &obj2) {
}
bool AxacussSign::interact(Action verb, Object &obj1, Object &obj2) {
- if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT, MONEY) &&
+ if ((verb == ACTION_USE) && Object::combine(obj1, obj2, STATION_SLOT, MONEY) &&
isSectionVisible(1)) {
_gm->takeMoney(-180);
_gm->drawImage(2);
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index e8cbf38..dae6bac 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -1535,7 +1535,7 @@ public:
_shown[1] = true;
_objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,STATION,22);
- _objectState[1] = Object("Schlitz",Object::defaultDescription,SLOT,COMBINABLE,0,0,0);
+ _objectState[1] = Object("Schlitz",Object::defaultDescription,STATION_SLOT,COMBINABLE,0,0,0);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
Commit: 2c0518e0babfea3c2b656f58af98aa373d3bf684
https://github.com/scummvm/scummvm/commit/2c0518e0babfea3c2b656f58af98aa373d3bf684
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:47:01Z
Commit Message:
SUPERNOVA: Removes redundant loops around edit()
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/state.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index dc30d40..743a80b 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2423,10 +2423,8 @@ bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
!obj1.hasProperty(OPENED)) {
_vm->renderMessage("Welche Zahlenkombination willst|du eingeben?");
_vm->renderBox(160, 70, 70, 10, kColorDarkBlue);
- do
- _gm->edit(input, 161, 71, 10);
- while ((_gm->_key.keycode != Common::KEYCODE_ESCAPE) &&
- (_gm->_key.keycode != Common::KEYCODE_RETURN));
+ _gm->edit(input, 161, 71, 10);
+
_vm->removeMessage();
if (_gm->_key.keycode != Common::KEYCODE_ESCAPE) {
if (!input.equals("89814")) {
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 7cfd1b4..98230c2 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1256,10 +1256,8 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
// TODO: Adjust for msec time instead of ticks
do {
_vm->renderBox(91, 99, 138, 9, kColorDarkBlue);
- do {
- edit(input, 91, 100, 5);
- } while ((_key.keycode != Common::KEYCODE_RETURN) &&
- (_key.keycode != Common::KEYCODE_ESCAPE));
+ edit(input, 91, 100, 5);
+
f = false;
if (t[0] == ':') {
t[0] = 0;
Commit: b64248981b917f7772413b0dd1af46ff6fc78d89
https://github.com/scummvm/scummvm/commit/b64248981b917f7772413b0dd1af46ff6fc78d89
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:47:01Z
Commit Message:
SUPERNOVA: Fixes too large edit() field
Before edit() cleared the input on screen by overdrawing it from x to
the right side of the screen. This works fine for terminals but for
example setting the watches alarm time it does not.
The text font is 5x8 so overdrawing the max input length + 1 * 5 is
sufficient to clear the screen from our input and the cursor. Also if
the value ends up being too big it is clamped to the right side
of the screen.
Changed paths:
engines/supernova/msn_def.h
engines/supernova/state.cpp
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index a8c76a4..884b467 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -27,6 +27,8 @@ namespace Supernova {
const int kScreenWidth = 320;
const int kScreenHeight = 200;
+const int kFontWidth = 5;
+const int kFontHeight = 8;
const int kTextSpeed[] = {19, 14, 10, 7, 4};
const int kMsecPerTick = 55;
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 98230c2..28ba850 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -980,12 +980,14 @@ void GameManager::animationOn() {
void GameManager::edit(Common::String &input, int x, int y, uint length) {
bool isEditing = true;
uint cursorIndex = input.size();
+ int overdrawWidth = ((length + 1) * kFontWidth > kScreenWidth - x) ?
+ kScreenWidth - x : (length + 1) * kFontWidth;
while (isEditing) {
_vm->_textCursorX = x;
_vm->_textCursorY = y;
_vm->_textColor = COL_EDIT;
- _vm->renderBox(x, y - 1, 320 - x, 10, HGR_EDIT);
+ _vm->renderBox(x, y - 1, overdrawWidth, 9, HGR_EDIT);
for (uint i = 0; i < input.size(); ++i) {
// Draw char highlight depending on cursor position
if (i == cursorIndex) {
Commit: 53c086c34137831fde4126489a14b2010226abac
https://github.com/scummvm/scummvm/commit/53c086c34137831fde4126489a14b2010226abac
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:47:01Z
Commit Message:
SUPERNOVA: Fixes setting alarm time on watch
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 28ba850..ed0fe96 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1248,47 +1248,62 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
timeToString(_state._time + _state._timeStarting).c_str(),
timeToString(_state._timeAlarm).c_str()).c_str());
} else if ((verb == ACTION_PRESS) && (obj1._id == WATCH)) {
- char *min;
- int hours, minutes;
- bool f;
+ bool validInput = true;
+ int hours = 0;
+ int minutes = 0;
+
animationOff();
_vm->saveScreen(88, 87, 144, 24);
_vm->renderBox(88, 87, 144, 24, kColorWhite35);
_vm->renderText("Neue Alarmzeit (hh:mm) :", 91, 90, kColorWhite99);
// TODO: Adjust for msec time instead of ticks
do {
+ validInput = true;
+ input.clear();
_vm->renderBox(91, 99, 138, 9, kColorDarkBlue);
edit(input, 91, 100, 5);
- f = false;
- if (t[0] == ':') {
- t[0] = 0;
- min = &(t[1]);
- } else if (t[1] == ':') {
- t[1] = 0;
- min = &(t[2]);
- } else if (t[2] == ':') {
- t[2] = 0;
- min = &(t[3]);
- } else {
- f = true;
+ int seperator = -1;
+ for (int i = 0; i < input.size(); ++i) {
+ if (input[i] == ':') {
+ seperator = i;
+ break;
+ }
+ }
+ if ((seperator == -1) || (seperator > 2)) {
+ validInput = false;
+ continue;
}
- for (uint i = 0; i < strlen(t); i++)
- if ((t[i] < '0') || (t[i] > '9'))
- f = true;
- for (uint i = 0; i < strlen(min); i++)
- if ((min[i] < '0') || (min[i] > '9'))
- f = true;
- hours = atoi(t);
- minutes = atoi(min);
+ int decimalPlace = 1;
+ for (int i = 0; i < seperator; ++i) {
+ if (Common::isDigit(input[i])) {
+ hours = hours * decimalPlace + (input[i] - '0');
+ decimalPlace *= 10;
+ } else {
+ validInput = false;
+ break;
+ }
+ }
+ decimalPlace = 1;
+ for (int i = seperator + 1; i < input.size(); ++i) {
+ if (Common::isDigit(input[i])) {
+ minutes = minutes * decimalPlace + (input[i] - '0');
+ decimalPlace *= 10;
+ } else {
+ validInput = false;
+ break;
+ }
+ }
if ((hours > 23) || (minutes > 59))
- f = true;
+ validInput = false;
+
animationOn();
- } while (f && (_key.keycode != Common::KEYCODE_ESCAPE));
+ } while (!validInput && (_key.keycode != Common::KEYCODE_ESCAPE));
+
_vm->restoreScreen();
if (_key.keycode != Common::KEYCODE_ESCAPE) {
- _state._timeAlarm = (hours * 60 + minutes) * 60 + 8;
+ _state._timeAlarm = (hours * 60 + minutes) * 60 * 1000;
_state._timeAlarmSystem = _state._timeAlarm + _state._timeStarting;
_state._alarmOn = (_state._timeAlarmSystem > _vm->_system->getMillis());
}
Commit: 644a6835e5a3ee97a53abaeacdb05df99c90a0da
https://github.com/scummvm/scummvm/commit/644a6835e5a3ee97a53abaeacdb05df99c90a0da
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:47:01Z
Commit Message:
SUPERNOVA: Adjusts init time values
to the approximated ms per tick constant of 55ms.
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index ed0fe96..6fa600b 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -225,8 +225,8 @@ void GameManager::initState() {
_state._timeSleep = 0;
// NOTE: systime() calls int 1A, means it gets number of ticks since midnight.
// So, it doesn't matter if we overflow by substraction?
- _state._timeStarting = _vm->_system->getMillis() - ticksToMsec(917650); // 2 pm
- _state._timeAlarm = ticksToMsec(458808); // 7 am
+ _state._timeStarting = ticksToMsec(916364); // 2 pm
+ _state._timeAlarm = ticksToMsec(458182); // 7 am
_state._timeAlarmSystem = _state._timeAlarm + _state._timeStarting;
_state._eventTime = 0xffffffff;
_state._shipEnergy = 2135;
Commit: 604d421660bb7e580c864689c6f65d24bf8b4a9e
https://github.com/scummvm/scummvm/commit/604d421660bb7e580c864689c6f65d24bf8b4a9e
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:47:01Z
Commit Message:
SUPERNOVA: Changes parameter name of timeToString()
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 6fa600b..14d6df2 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -123,21 +123,21 @@ void GuiElement::setHighlight(bool isHighlighted) {
}
-static Common::String timeToString(int t) {
+static Common::String timeToString(int msec) {
char s[9] = " 0:00:00";
- t /= 1000;
- s[7] = t % 10 + '0';
- t /= 10;
- s[6] = t % 6 + '0';
- t /= 6;
- s[4] = t % 10 + '0';
- t /= 10;
- s[3] = t % 6 + '0';
- t /= 6;
- s[1] = t % 10 + '0';
- t /= 10;
- if (t)
- s[0] = t + '0';
+ msec /= 1000;
+ s[7] = msec % 10 + '0';
+ msec /= 10;
+ s[6] = msec % 6 + '0';
+ msec /= 6;
+ s[4] = msec % 10 + '0';
+ msec /= 10;
+ s[3] = msec % 6 + '0';
+ msec /= 6;
+ s[1] = msec % 10 + '0';
+ msec /= 10;
+ if (msec)
+ s[0] = msec + '0';
return Common::String(s);
}
Commit: 026bd79a6d434ac07fe006b58d3dcf27b97beafb
https://github.com/scummvm/scummvm/commit/026bd79a6d434ac07fe006b58d3dcf27b97beafb
Author: Joseph-Eugene Winzer (m999 at openmailbox.org)
Date: 2018-01-23T01:47:01Z
Commit Message:
SUPERNOVA: Removes redundant code
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 743a80b..a301d20 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -893,9 +893,6 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
obj1._exitRoom = ROCKS;
return false;
}
- } else if ((verb == ACTION_TAKE) && (obj1._id == KEYCARD2)) {
- obj1._name = "Keycard des Commanders";
- return false;
} else if ((verb == ACTION_TAKE) && (obj1._id == GENERATOR_WIRE))
_vm->renderMessage("Das Kabel ist schon ganz|richtig an dieser Stelle.");
else if ((verb == ACTION_PULL) && (obj1._id == SHORT_WIRE) &&
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index dae6bac..b66e816 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -538,7 +538,7 @@ public:
_objectState[0] = Object("langes Kabel mit Stecker",Object::defaultDescription,GENERATOR_WIRE,COMBINABLE,255,255,0);
_objectState[1] = Object("leere Kabelrolle",Object::defaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
- _objectState[2] = Object("Keycard","Hey, das ist die Keycard des Commanders!|Er mu\341 sie bei dem \201berst\201rzten|Aufbruch verloren haben.",KEYCARD2,COMBINABLE | TAKE,12,12,5 | 128);
+ _objectState[2] = Object("Keycard des Commanders","Hey, das ist die Keycard des Commanders!|Er mu\341 sie bei dem \201berst\201rzten|Aufbruch verloren haben.",KEYCARD2,COMBINABLE | TAKE,12,12,5 | 128);
_objectState[3] = Object("Seil",Object::defaultDescription,GENERATOR_ROPE,COMBINABLE,255,255,0);
_objectState[4] = Object("Luke","Sie f\201hrt nach drau\341en.",OUTERHATCH,EXIT | OPENABLE,1,2,1,OUTSIDE,22);
_objectState[5] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,3,3,0);
Commit: 316aeeabd597c4e0f241673ca000bc16b90771fb
https://github.com/scummvm/scummvm/commit/316aeeabd597c4e0f241673ca000bc16b90771fb
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T01:47:01Z
Commit Message:
SUPERNOVA: Converts Object name and description to Strings
Changed paths:
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
engines/supernova/state.cpp
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 884b467..cf85efc 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -514,9 +514,8 @@ struct Object {
return false;
}
- // TODO: convert name and description to String
- const char *_name;
- const char *_description;
+ Common::String _name;
+ Common::String _description;
ObjectID _id;
ObjectType _type;
byte _click;
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index a301d20..f5b0ffa 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -687,7 +687,7 @@ bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_LOOK) && (obj1._id == SCRAP_LK) &&
(obj1._description != beschr2)) {
- _vm->renderMessage(obj1._description);
+ _vm->renderMessage(obj1._description.c_str());
obj1._description = beschr2;
_gm->takeObject(*getObject(2));
} else if (((verb == ACTION_OPEN) || (verb == ACTION_CLOSE)) &&
@@ -746,7 +746,7 @@ void ShipHold::onEntrance() {
bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
Room *r;
if ((verb == ACTION_PRESS) && (obj1._id == LANDINGMOD_BUTTON))
- _vm->renderMessage(obj1._description);
+ _vm->renderMessage(obj1._description.c_str());
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, PEN, LANDINGMOD_BUTTON)) {
if (_gm->_state._landingModuleEnergy) {
r = _gm->_rooms[GENERATOR];
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 14d6df2..3ce044e 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -458,7 +458,7 @@ void GameManager::processInput() {
}
/* normal item */
else {
- for (int i = 0; (_currentRoom->getObject(i)->_name[0] != '\0') && (field == -1) && i < kMaxObject; i++) {
+ for (int i = 0; (_currentRoom->getObject(i)->_name.c_str()[0] != '\0') && (field == -1) && i < kMaxObject; i++) {
click = _currentRoom->getObject(i)->_click;
if (click != 255) {
MSNImageDecoder::ClickField *clickField = _vm->_currentImage->_clickField;
@@ -747,7 +747,7 @@ void GameManager::drawInventory() {
_guiInventory[i].width(),
_guiInventory[i].height(),
_guiInventory[i]._bgColor);
- _vm->renderText(_inventory.get(i + _inventoryScroll)->_name,
+ _vm->renderText(_inventory.get(i + _inventoryScroll)->_name.c_str(),
_guiInventory[i]._textPosition.x,
_guiInventory[i]._textPosition.y,
_guiInventory[i]._textColor);
@@ -1091,16 +1091,16 @@ void GameManager::drawStatus() {
_vm->renderText(guiStatusCommand_DE[index], 1, 141, kColorDarkGreen);
if (Object::isNullObject(_inputObject[0])) {
- _vm->renderText(_currentInputObject->_name);
+ _vm->renderText(_currentInputObject->_name.c_str());
} else {
- _vm->renderText(_inputObject[0]->_name);
+ _vm->renderText(_inputObject[0]->_name.c_str());
if (_inputVerb == ACTION_GIVE) {
_vm->renderText(" an ");
} else if (_inputVerb == ACTION_USE) {
_vm->renderText(" mit ");
}
- _vm->renderText(_currentInputObject->_name);
+ _vm->renderText(_currentInputObject->_name.c_str());
}
}
@@ -1238,7 +1238,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
drawMapExits();
_vm->renderMessage("Hmm, irgendwie komme|ich mir verarscht vor.");
} else if ((verb == ACTION_LOOK) && (obj1._id == KEYCARD2)) {
- _vm->renderMessage(obj1._description);
+ _vm->renderMessage(obj1._description.c_str());
obj1._description = "Es ist die Keycard des Commanders.";
} else if ((verb == ACTION_LOOK) && (obj1._id == WATCH)) {
_vm->renderMessage(Common::String::format(
@@ -1456,7 +1456,7 @@ void GameManager::handleInput() {
if (!validCommand) {
switch (_inputVerb) {
case ACTION_LOOK:
- _vm->renderMessage(_inputObject[0]->_description);
+ _vm->renderMessage(_inputObject[0]->_description.c_str());
break;
case ACTION_WALK:
Commit: 2545ffd07495deccf72109d80744089e403f04d2
https://github.com/scummvm/scummvm/commit/2545ffd07495deccf72109d80744089e403f04d2
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T01:47:01Z
Commit Message:
SUPERNOVA: Fixes overdraw of input
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 3ce044e..7f62852 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -980,8 +980,9 @@ void GameManager::animationOn() {
void GameManager::edit(Common::String &input, int x, int y, uint length) {
bool isEditing = true;
uint cursorIndex = input.size();
- int overdrawWidth = ((length + 1) * kFontWidth > kScreenWidth - x) ?
- kScreenWidth - x : (length + 1) * kFontWidth;
+ // NOTE: Pixels for char needed = kFontWidth + 2px left and right side bearing
+ int overdrawWidth = ((length + 1) * (kFontWidth + 2) > kScreenWidth - x) ?
+ kScreenWidth - x : (length + 1) * (kFontWidth + 2);
while (isEditing) {
_vm->_textCursorX = x;
Commit: c95efb1e3e3244dae53008699c3376021f2db578
https://github.com/scummvm/scummvm/commit/c95efb1e3e3244dae53008699c3376021f2db578
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T01:47:01Z
Commit Message:
SUPERNOVA: Refactoring
Renaming variables of GameState to avoid ambiguity.
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index f5b0ffa..00ddb6d 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -103,7 +103,7 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_guiEnabled = false;
setSectionVisible(4, false);
g_system->fillScreen(kColorDarkBlue);
- if (_gm->_state._time == 0) {
+ if (_gm->_state._arrivalDaysLeft == 0) {
// Destination reached
_vm->renderText("Flugziel erreicht", 60, 95, kColorWhite99);
_gm->getInput();
@@ -177,12 +177,12 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
_gm->drawImage(_gm->invertSection(4));
room = _gm->_rooms[GENERATOR];
if (room->isSectionVisible(9)) {
- energy = &_gm->_state._landingModuleEnergy;
+ energy = &_gm->_state._landingModuleEnergyDaysLeft;
} else {
- energy = &_gm->_state._shipEnergy;
+ energy = &_gm->_state._shipEnergyDaysLeft;
}
- if (_gm->_state._timeSleep > _gm->_state._time) {
- _gm->_state._timeSleep = _gm->_state._time;
+ if (_gm->_state._timeSleep > _gm->_state._arrivalDaysLeft) {
+ _gm->_state._timeSleep = _gm->_state._arrivalDaysLeft;
}
if (_gm->_state._timeSleep >= *energy) {
_gm->_state._timeSleep = *energy;
@@ -195,7 +195,7 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
room->setSectionVisible(10, false);
}
}
- if (_gm->_state._timeSleep == _gm->_state._time) {
+ if (_gm->_state._timeSleep == _gm->_state._arrivalDaysLeft) {
_gm->drawImage(3);
room = _gm->_rooms[COCKPIT];
room->setSectionVisible(23, true);
@@ -220,17 +220,17 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
room->setSectionVisible(11, true);
}
}
- _gm->_state._time -= _gm->_state._timeSleep;
+ _gm->_state._arrivalDaysLeft -= _gm->_state._timeSleep;
*energy -= _gm->_state._timeSleep;
- _gm->_state._timeStarting = _vm->_system->getMillis() - ticksToMsec(786520); // 12pm
+ _gm->_state._timeStarting = _gm->_state._time - ticksToMsec(786520); // 12pm
_gm->_state._timeAlarmSystem = _gm->_state._timeAlarm + _gm->_state._timeStarting;
- _gm->_state._alarmOn = (_gm->_state._timeAlarmSystem > _vm->_system->getMillis());
+ _gm->_state._alarmOn = (_gm->_state._timeAlarmSystem > _gm->_state._time);
if (!*energy) {
_gm->turnOff();
room = _gm->_rooms[GENERATOR];
room->setSectionVisible(4, room->isSectionVisible(2));
}
- if (_gm->_state._time == 0) {
+ if (_gm->_state._arrivalDaysLeft == 0) {
_gm->saveTime();
if (!_gm->saveGame(-2))
_gm->errorTemp();
@@ -239,7 +239,7 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
}
_gm->wait2(18);
_vm->paletteFadeIn();
- if (_gm->_state._time == 0) {
+ if (_gm->_state._arrivalDaysLeft == 0) {
_vm->playSound(kAudioCrash);
_gm->screenShake();
_gm->wait2(18);
@@ -255,7 +255,7 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
void ShipSleepCabin::animation() {
static char color;
- if (_gm->_state._powerOff && _gm->_state._time) {
+ if (_gm->_state._powerOff && _gm->_state._arrivalDaysLeft) {
if (_gm->_guiEnabled) {
if (isSectionVisible(1)) {
_gm->drawImage(2);
@@ -304,21 +304,21 @@ bool ShipCockpit::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_guiEnabled = false;
_vm->renderBox(0, 0, 320, 200, kColorBlack);
_vm->renderText("Geschwindigkeit: ", 50, 50, kColorLightYellow);
- if (_gm->_state._time)
+ if (_gm->_state._arrivalDaysLeft)
_vm->renderText("8000 hpm");
else
_vm->renderText("0 hpm");
_vm->renderText("Ziel: Arsano 3", 50, 70, kColorLightYellow);
_vm->renderText("Entfernung: ", 50, 90, kColorLightYellow);
- _vm->renderText(Common::String::format("%d", _gm->_state._time / ticksToMsec(400)).c_str());
+ _vm->renderText(Common::String::format("%d", _gm->_state._arrivalDaysLeft / ticksToMsec(400)).c_str());
_vm->renderText(",");
- c[0] = (_gm->_state._time / ticksToMsec(40)) % 10 + '0';
+ c[0] = (_gm->_state._arrivalDaysLeft / ticksToMsec(40)) % 10 + '0';
_vm->renderText(c);
- c[0] = (_gm->_state._time / ticksToMsec(4)) % 10 + '0';
+ c[0] = (_gm->_state._arrivalDaysLeft / ticksToMsec(4)) % 10 + '0';
_vm->renderText(c);
_vm->renderText(" Lichtjahre");
_vm->renderText("Dauer der Reise bei momentaner Geschwindigkeit:", 50, 110, kColorLightYellow);
- _vm->renderText(Common::String::format("%d", _gm->_state._time).c_str(),
+ _vm->renderText(Common::String::format("%d", _gm->_state._arrivalDaysLeft).c_str(),
50, 120, kColorLightYellow);
_vm->renderText(" Tage");
@@ -748,7 +748,7 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_PRESS) && (obj1._id == LANDINGMOD_BUTTON))
_vm->renderMessage(obj1._description.c_str());
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, PEN, LANDINGMOD_BUTTON)) {
- if (_gm->_state._landingModuleEnergy) {
+ if (_gm->_state._landingModuleEnergyDaysLeft) {
r = _gm->_rooms[GENERATOR];
if (isSectionVisible(7)) {
_gm->drawImage(_gm->invertSection(9));
@@ -907,7 +907,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
setSectionVisible(3, false);
setSectionVisible(4, false);
getObject(11)->_click = 10;
- if (_gm->_state._shipEnergy)
+ if (_gm->_state._shipEnergyDaysLeft)
_gm->turnOn();
else
_gm->drawImage(4);
@@ -939,7 +939,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
_gm->drawImage(9);
getObject(0)->_click = 16;
r = _gm->_rooms[LANDINGMODULE];
- if (_gm->_state._landingModuleEnergy && r->isSectionVisible(7))
+ if (_gm->_state._landingModuleEnergyDaysLeft && r->isSectionVisible(7))
_gm->turnOn();
else
_gm->drawImage(4);
@@ -1588,12 +1588,12 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
_vm->removeMessage();
_vm->_menuBrightness = 0;
_vm->paletteBrightness();
- _gm->_state._timeStarting -= 7200000; // 2 hours
- _gm->_state._timeAlarmSystem -= 7200000;
- _gm->_state._eventTime = _vm->_system->getMillis() + 220000;
+ _gm->_state._timeStarting -= ticksToMsec(125000); // 2 hours
+ _gm->_state._timeAlarmSystem -= ticksToMsec(125000);
+ _gm->_state._eventTime = _gm->_state._time + ticksToMsec(4000);
// TODO: implement event calling
// _gm->_state.event = &supernova;
- _gm->_state._alarmOn = (_gm->_state._timeAlarmSystem > _vm->_system->getMillis());
+ _gm->_state._alarmOn = (_gm->_state._timeAlarmSystem > _gm->_state._time);
setSectionVisible(11, false);
setSectionVisible(1, false);
_vm->renderRoom(*this);
@@ -1911,9 +1911,9 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
void AxacussCell::onEntrance() {
if (_gm->_state._dream) {
_vm->renderMessage("Du wachst auf und findest dich in|einem geschlossenen Raum wieder.");
- _gm->_state._timeStarting = _gm->_state._time - 500000;
+ _gm->_state._timeStarting = _gm->_state._arrivalDaysLeft - ticksToMsec(500000);
_gm->_state._timeAlarmSystem = _gm->_state._timeAlarm + _gm->_state._timeStarting;
- _gm->_state._alarmOn = (_gm->_state._timeAlarmSystem > _gm->_state._time);
+ _gm->_state._alarmOn = (_gm->_state._timeAlarmSystem > _gm->_state._arrivalDaysLeft);
_gm->_state._powerOff = false;
_gm->_state._dream = false;
}
@@ -2676,7 +2676,7 @@ bool AxacussSign::interact(Action verb, Object &obj1, Object &obj2) {
_gm->takeMoney(-180);
_gm->drawImage(2);
setSectionVisible(1, false);
- _gm->_state._eventTime = _vm->_system->getMillis() + ticksToMsec(600);
+ _gm->_state._eventTime = _gm->_state._time + ticksToMsec(600);
// *event = &taxi;
return true;
}
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 7f62852..d4611f2 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -221,16 +221,15 @@ void GameManager::initState() {
_timer1 = 0;
_animationTimer = 0;
- _state._time = ticksToMsec(2840);
+ _state._time = 0;
_state._timeSleep = 0;
- // NOTE: systime() calls int 1A, means it gets number of ticks since midnight.
- // So, it doesn't matter if we overflow by substraction?
_state._timeStarting = ticksToMsec(916364); // 2 pm
_state._timeAlarm = ticksToMsec(458182); // 7 am
_state._timeAlarmSystem = _state._timeAlarm + _state._timeStarting;
_state._eventTime = 0xffffffff;
- _state._shipEnergy = 2135;
- _state._landingModuleEnergy = 923;
+ _state._arrivalDaysLeft = 2840;
+ _state._shipEnergyDaysLeft = 2135;
+ _state._landingModuleEnergyDaysLeft = 923;
_state._greatFlag = 0;
_state._timeRobot = 0;
_state._money = 0;
@@ -540,7 +539,7 @@ void GameManager::startSearch() {
}
void GameManager::search(int time) {
- _state._eventTime = _vm->_system->getMillis() + time;
+ _state._eventTime = _state._time + time;
// *event = &search_start;
}
@@ -846,7 +845,7 @@ void GameManager::roomBrightness() {
dimColor(_vm, f);
}
}
- if (!(_state._landingModuleEnergy && _rooms[LANDINGMODULE]->isSectionVisible(7))) {
+ if (!(_state._landingModuleEnergyDaysLeft && _rooms[LANDINGMODULE]->isSectionVisible(7))) {
i = 0;
while (sf = specialColors[0][i] - 1) {
dimColor(_vm, sf);
@@ -854,7 +853,7 @@ void GameManager::roomBrightness() {
};
}
} else if ((_currentRoom == _rooms[LANDINGMODULE]) && (_state._benOverlay == 1)) {
- if (!(_state._landingModuleEnergy && _rooms[LANDINGMODULE]->isSectionVisible(7))) {
+ if (!(_state._landingModuleEnergyDaysLeft && _rooms[LANDINGMODULE]->isSectionVisible(7))) {
for (int f = 16; f < 255; f++) {
i=0;
do {
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 9e91ff3..affd9b6 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -35,8 +35,9 @@ struct GameState {
int32 _timeAlarm;
int32 _timeAlarmSystem;
int32 _eventTime;
- int32 _shipEnergy;
- int32 _landingModuleEnergy;
+ int32 _arrivalDaysLeft;
+ int32 _shipEnergyDaysLeft;
+ int32 _landingModuleEnergyDaysLeft;
uint16 _greatFlag;
int16 _timeRobot;
int16 _money;
Commit: 8c18b4432a350aa270ae7d833e3f4d3b49210c55
https://github.com/scummvm/scummvm/commit/8c18b4432a350aa270ae7d833e3f4d3b49210c55
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T01:47:01Z
Commit Message:
SUPERNOVA: Adds console command 'giveall'
Adds crucial items to the inventory. It eases debugging while loading of
savestates is not possible.
Changed paths:
engines/supernova/console.cpp
engines/supernova/console.h
diff --git a/engines/supernova/console.cpp b/engines/supernova/console.cpp
index 838189f..328c46c 100644
--- a/engines/supernova/console.cpp
+++ b/engines/supernova/console.cpp
@@ -23,6 +23,7 @@
#include "gui/debugger.h"
#include "supernova/supernova.h"
+#include "supernova/state.h"
#include "supernova/console.h"
namespace Supernova {
@@ -34,6 +35,7 @@ Console::Console(SupernovaEngine *vm, GameManager *gm)
registerCmd("music", WRAP_METHOD(Console, cmdMusic));
registerCmd("list", WRAP_METHOD(Console, cmdList));
registerCmd("inventory", WRAP_METHOD(Console, cmdInventory));
+ registerCmd("giveall", WRAP_METHOD(Console, cmdGiveAll));
_vm = vm;
_gm = gm;
@@ -90,4 +92,18 @@ bool Console::cmdInventory(int argc, const char **argv) {
return true;
}
+bool Console::cmdGiveAll(int argc, const char **argv) {
+ _gm->takeObject(*_gm->_rooms[INTRO]->getObject(0));
+ _gm->takeObject(*_gm->_rooms[INTRO]->getObject(1));
+ _gm->takeObject(*_gm->_rooms[INTRO]->getObject(2));
+ _gm->takeObject(*_gm->_rooms[GENERATOR]->getObject(2)); // Commander Keycard
+ _gm->takeObject(*_gm->_rooms[GENERATOR]->getObject(0)); // Power Cord with Plug
+ _gm->takeObject(*_gm->_rooms[CABIN_L1]->getObject(5)); // Pen
+ _gm->takeObject(*_gm->_rooms[CABIN_R3]->getObject(0)); // Chess Board
+ _gm->takeObject(*_gm->_rooms[CABIN_R3]->getObject(9)); // Rope
+ _gm->takeObject(*_gm->_rooms[AIRLOCK]->getObject(4)); // Helmet
+ _gm->takeObject(*_gm->_rooms[AIRLOCK]->getObject(5)); // Space Suit
+ _gm->takeObject(*_gm->_rooms[AIRLOCK]->getObject(6)); // Supply
+}
+
}
diff --git a/engines/supernova/console.h b/engines/supernova/console.h
index e78c3b5..74b40c2 100644
--- a/engines/supernova/console.h
+++ b/engines/supernova/console.h
@@ -44,6 +44,7 @@ public:
bool cmdMusic(int argc, const char **argv);
bool cmdList(int argc, const char **argv);
bool cmdInventory(int argc, const char **argv);
+ bool cmdGiveAll(int argc, const char **argv);
private:
SupernovaEngine *_vm;
GameManager *_gm;
Commit: ccbc1142e1c44d3d4e16caac7d8c9f2c89782f9d
https://github.com/scummvm/scummvm/commit/ccbc1142e1c44d3d4e16caac7d8c9f2c89782f9d
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T01:47:01Z
Commit Message:
SUPERNOVA: Refactoring
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 00ddb6d..1c599a3 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -95,7 +95,6 @@ bool ShipHall::interact(Action verb, Object &obj1, Object &obj2) {
}
bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
- int32 *energy;
Room *room;
Common::String input;
@@ -176,16 +175,17 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
_gm->drawImage(_gm->invertSection(5));
_gm->drawImage(_gm->invertSection(4));
room = _gm->_rooms[GENERATOR];
+ int32 *energyDaysLeft;
if (room->isSectionVisible(9)) {
- energy = &_gm->_state._landingModuleEnergyDaysLeft;
+ energyDaysLeft = &_gm->_state._landingModuleEnergyDaysLeft;
} else {
- energy = &_gm->_state._shipEnergyDaysLeft;
+ energyDaysLeft = &_gm->_state._shipEnergyDaysLeft;
}
if (_gm->_state._timeSleep > _gm->_state._arrivalDaysLeft) {
_gm->_state._timeSleep = _gm->_state._arrivalDaysLeft;
}
- if (_gm->_state._timeSleep >= *energy) {
- _gm->_state._timeSleep = *energy;
+ if (_gm->_state._timeSleep >= *energyDaysLeft) {
+ _gm->_state._timeSleep = *energyDaysLeft;
if (room->isSectionVisible(9)) {
room = _gm->_rooms[LANDINGMODULE]; // Monitors off
room->setSectionVisible(2, false);
@@ -221,11 +221,11 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
}
}
_gm->_state._arrivalDaysLeft -= _gm->_state._timeSleep;
- *energy -= _gm->_state._timeSleep;
+ *energyDaysLeft -= _gm->_state._timeSleep;
_gm->_state._timeStarting = _gm->_state._time - ticksToMsec(786520); // 12pm
_gm->_state._timeAlarmSystem = _gm->_state._timeAlarm + _gm->_state._timeStarting;
_gm->_state._alarmOn = (_gm->_state._timeAlarmSystem > _gm->_state._time);
- if (!*energy) {
+ if (*energyDaysLeft == 0) {
_gm->turnOff();
room = _gm->_rooms[GENERATOR];
room->setSectionVisible(4, room->isSectionVisible(2));
Commit: 3284fbc657700bd557d8f8023f9e6cc8bb173812
https://github.com/scummvm/scummvm/commit/3284fbc657700bd557d8f8023f9e6cc8bb173812
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T01:47:01Z
Commit Message:
SUPERNOVA: Fixes cockpit display
Cruising speed and distance were inaccurate.
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 1c599a3..65a4f17 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -310,11 +310,11 @@ bool ShipCockpit::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderText("0 hpm");
_vm->renderText("Ziel: Arsano 3", 50, 70, kColorLightYellow);
_vm->renderText("Entfernung: ", 50, 90, kColorLightYellow);
- _vm->renderText(Common::String::format("%d", _gm->_state._arrivalDaysLeft / ticksToMsec(400)).c_str());
+ _vm->renderText(Common::String::format("%d", _gm->_state._arrivalDaysLeft / 400).c_str());
_vm->renderText(",");
- c[0] = (_gm->_state._arrivalDaysLeft / ticksToMsec(40)) % 10 + '0';
+ c[0] = (_gm->_state._arrivalDaysLeft / 40) % 10 + '0';
_vm->renderText(c);
- c[0] = (_gm->_state._arrivalDaysLeft / ticksToMsec(4)) % 10 + '0';
+ c[0] = (_gm->_state._arrivalDaysLeft / 4) % 10 + '0';
_vm->renderText(c);
_vm->renderText(" Lichtjahre");
_vm->renderText("Dauer der Reise bei momentaner Geschwindigkeit:", 50, 110, kColorLightYellow);
Commit: 714b38dde4e016f5b474d6fc4846008b13579162
https://github.com/scummvm/scummvm/commit/714b38dde4e016f5b474d6fc4846008b13579162
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T01:47:01Z
Commit Message:
SUPERNOVA: Fixes dimming when ship energy low
roomBrightness() saw the greatest change by ripping out dimColors().
I compared the result with the original game and I cannot see any
difference by just reducing the palette brightness to 60%.
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index d4611f2..d236019 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -21,6 +21,7 @@
*/
#include "common/system.h"
+#include "graphics/palette.h"
#include "supernova/supernova.h"
#include "supernova/state.h"
@@ -690,24 +691,19 @@ int GameManager::dialog(int num, byte *rowLength[], const char **text[6], int nu
}
void GameManager::turnOff() {
- if (_state._powerOff)
- return;
-
_state._powerOff = true;
- roomBrightness();
-
}
+
void GameManager::turnOn() {
if (!_state._powerOff)
return;
_state._powerOff = false;
- _vm->paletteBrightness();
- Room *room = _rooms[SLEEP];
- room->setSectionVisible(1, false);
- room->setSectionVisible(2, false);
- room = _rooms[COCKPIT];
- room->setSectionVisible(22, false);
+ _vm->_brightness = 255;
+// _vm->paletteBrightness();
+ _rooms[SLEEP]->setSectionVisible(1, false);
+ _rooms[SLEEP]->setSectionVisible(2, false);
+ _rooms[COCKPIT]->setSectionVisible(22, false);
}
void GameManager::takeObject(Object &obj) {
@@ -815,70 +811,13 @@ void GameManager::mouseWait(int delay) {
// STUB
}
-static void dimColor(SupernovaEngine *vm, int color) {
- color -= 16;
- color *= 3;
- // TODO: alters palette image data permanently (get system palette instead?)
- vm->_currentImage->_palette[color + 0] = vm->_currentImage->_palette[color + 0] * 3 / 5;
- vm->_currentImage->_palette[color + 1] = vm->_currentImage->_palette[color + 1] * 3 / 5;
- vm->_currentImage->_palette[color + 2] = vm->_currentImage->_palette[color + 2] * 3 / 5;
-}
-
void GameManager::roomBrightness() {
- const byte specialColors[2][18] = {
- {0x42, 0x49, 0x55, 0x68, 0x50, 0x5d, 0x3c, 1},
- {0x85, 0x91, 0x99, 0x92, 0x9b, 0x96, 0x9a, 0xa6,
- 0xb0, 0xb4, 0xb5, 0xc2, 0xd1, 0xbe, 0xb6, 0xa8,
- 0x6b, 1}
- };
- char sf;
- int i;
- if ((_currentRoom == _rooms[HOLD]) && (_state._benOverlay == 1)) {
- if (_state._powerOff) {
- for (int f = 16; f < 255; f++) {
- i = 0;
- do {
- sf = specialColors[0][i] - 1;
- i++;
- } while (sf && (sf != f));
- if (!sf)
- dimColor(_vm, f);
- }
- }
- if (!(_state._landingModuleEnergyDaysLeft && _rooms[LANDINGMODULE]->isSectionVisible(7))) {
- i = 0;
- while (sf = specialColors[0][i] - 1) {
- dimColor(_vm, sf);
- i++;
- };
- }
- } else if ((_currentRoom == _rooms[LANDINGMODULE]) && (_state._benOverlay == 1)) {
- if (!(_state._landingModuleEnergyDaysLeft && _rooms[LANDINGMODULE]->isSectionVisible(7))) {
- for (int f = 16; f < 255; f++) {
- i=0;
- do {
- sf = specialColors[1][i] - 1;
- i++;
- } while (sf && (sf != f));
- if (!sf)
- dimColor(_vm, f);
- }
- }
- if (_state._powerOff) {
- i=0;
- while (sf = specialColors[1][i] - 1) {
- dimColor(_vm, sf);
- i++;
- };
- }
- } else if ((_currentRoom == _rooms[CAVE]) && (_state._benOverlay == 1)) {
- _vm->_brightness = 0;
- } else if ((_currentRoom != _rooms[OUTSIDE]) &&
- (_currentRoom < _rooms[ROCKS]) && (_state._benOverlay == 1)) {
+ if ((_currentRoom != _rooms[OUTSIDE]) && (_currentRoom < _rooms[ROCKS]) ) {
if (_state._powerOff)
- for (int f = 16; f < 255; f++)
- dimColor(_vm, f);
- } else if ((_currentRoom == _rooms[GUARD3]) && (_state._benOverlay == 2)) {
+ _vm->_brightness = 153;
+ } else if ((_currentRoom == _rooms[CAVE])) {
+ _vm->_brightness = 0;
+ } else if ((_currentRoom == _rooms[GUARD3])) {
if (_state._powerOff)
_vm->_brightness = 0;
}
@@ -1559,10 +1498,6 @@ void GameManager::executeRoom() {
drawCommandBox();
}
roomBrightness();
- if (_vm->_brightness == 0)
- _vm->paletteFadeIn();
- else
- _vm->paletteBrightness();
if (!_currentRoom->hasSeen())
_currentRoom->onEntrance();
}
Commit: b948a53f2ff69a2139e4377aa103f77de68d6c29
https://github.com/scummvm/scummvm/commit/b948a53f2ff69a2139e4377aa103f77de68d6c29
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T01:47:02Z
Commit Message:
SUPERNOVA: Substitutes static variables with privates
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 65a4f17..2e2dd5a 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -254,7 +254,6 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
}
void ShipSleepCabin::animation() {
- static char color;
if (_gm->_state._powerOff && _gm->_state._arrivalDaysLeft) {
if (_gm->_guiEnabled) {
if (isSectionVisible(1)) {
@@ -265,13 +264,13 @@ void ShipSleepCabin::animation() {
setSectionVisible(2, false);
}
} else {
- if (color == kColorLightRed) {
- color = kColorDarkBlue;
+ if (_color == kColorLightRed) {
+ _color = kColorDarkBlue;
} else {
- color = kColorLightRed;
+ _color = kColorLightRed;
}
- _vm->renderText("Achtung", 60, 75, color);
+ _vm->renderText("Achtung", 60, 75, _color);
}
} else if (isSectionVisible(5) && _gm->_guiEnabled) {
if (isSectionVisible(4))
@@ -332,17 +331,15 @@ bool ShipCockpit::interact(Action verb, Object &obj1, Object &obj2) {
return true;
}
void ShipCockpit::animation() {
- static byte color;
-
if (!_gm->_guiEnabled) {
- if (color) {
- color = kColorBlack;
+ if (_color) {
+ _color = kColorBlack;
_gm->setAnimationTimer(5);
} else {
- color = kColorLightYellow;
+ _color = kColorLightYellow;
_gm->setAnimationTimer(10);
}
- _vm->renderText("Achtung: Triebwerke funktionsunf\204hig", 50, 145, color);
+ _vm->renderText("Achtung: Triebwerke funktionsunf\204hig", 50, 145, _color);
} else {
if (isSectionVisible(21)) {
_gm->drawImage(_gm->invertSection(21));
@@ -354,8 +351,8 @@ void ShipCockpit::animation() {
}
if (_gm->_state._powerOff) {
if (!_gm->_guiEnabled) {
- _vm->renderText("Energievorrat ersch\224pft", 97, 165, color);
- _vm->renderText("Notstromversorgung aktiv", 97, 175, color);
+ _vm->renderText("Energievorrat ersch\224pft", 97, 165, _color);
+ _vm->renderText("Notstromversorgung aktiv", 97, 175, _color);
} else {
if (isSectionVisible(21))
_gm->drawImage(22);
@@ -682,13 +679,11 @@ void ShipAirlock::onEntrance() {
}
bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
- static char beschr2[] = "Ein St\201ck Schrott.";
- Room *r;
+ Room *room;
- if ((verb == ACTION_LOOK) && (obj1._id == SCRAP_LK) &&
- (obj1._description != beschr2)) {
+ if ((verb == ACTION_LOOK) && (obj1._id == SCRAP_LK) && (obj1._description != _descriptionScrap)) {
_vm->renderMessage(obj1._description.c_str());
- obj1._description = beschr2;
+ obj1._description = _descriptionScrap;
_gm->takeObject(*getObject(2));
} else if (((verb == ACTION_OPEN) || (verb == ACTION_CLOSE)) &&
(obj1._id == OUTERHATCH_TOP)) {
@@ -712,16 +707,16 @@ bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
_gm->drawImage(5);
getObject(0)->_name = "langes Kabel mit Stecker";
getObject(0)->_click = 10;
- r = _gm->_rooms[CABIN_L2];
+ room = _gm->_rooms[CABIN_L2];
_gm->_inventory.remove(*getObject(9));
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, GENERATOR_TOP)) {
if (isSectionVisible(5)) {
- r = _gm->_rooms[GENERATOR];
- r->getObject(0)->_click = 15;
- r->getObject(1)->_click = 13;
- r->setSectionVisible(6, false);
- r->setSectionVisible(8, false);
+ room = _gm->_rooms[GENERATOR];
+ room->getObject(0)->_click = 15;
+ room->getObject(1)->_click = 13;
+ room->setSectionVisible(6, false);
+ room->setSectionVisible(8, false);
_gm->drawImage(_gm->invertSection(5));
_gm->drawImage(6);
setSectionVisible(4, false);
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index b66e816..f19f9c3 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -181,6 +181,7 @@ public:
private:
Common::String _codeword_DE;
Common::String _codeword_EN;
+ byte _color;
};
class ShipCockpit : public Room {
@@ -201,6 +202,9 @@ public:
virtual bool interact(Action verb, Object &obj1, Object &obj2);
virtual void animation();
virtual void onEntrance();
+
+private:
+ byte _color;
};
class ShipCabinL1: public Room {
@@ -496,10 +500,15 @@ public:
_objectState[9] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,AIRLOCK,22);
_objectState[10] = Object("Luke","Sie f\201hrt nach drau\341en.",OUTERHATCH_TOP,EXIT | OPENABLE | OPENED,3,3,0,GENERATOR,8);
_objectState[11] = Object("Generator","Er versorgt das Raumschiff mit Strom.",GENERATOR_TOP,EXIT,12,12,0,GENERATOR,8);
+
+ _descriptionScrap = "Ein St\201ck Schrott.";
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
virtual void onEntrance();
+
+private:
+ Common::String _descriptionScrap;
};
class ShipLandingModule : public Room {
Commit: 63c62d25e11a82988efb11186309db1ef98b5903
https://github.com/scummvm/scummvm/commit/63c62d25e11a82988efb11186309db1ef98b5903
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T01:47:02Z
Commit Message:
SUPERNOVA: Adds explicitly invalid state for Objects
Changed paths:
engines/supernova/msn_def.h
engines/supernova/state.cpp
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index cf85efc..3b2bd49 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -382,7 +382,8 @@ enum RoomID {
};
enum ObjectID {
- NULLOBJECT,
+ INVALIDOBJECT = -1,
+ NULLOBJECT = 0,
KEYCARD,KNIFE,WATCH,
SOCKET,
BUTTON,HATCH1,
@@ -463,7 +464,7 @@ struct Object {
Object()
: _name("")
, _description(Object::defaultDescription)
- , _id(NULLOBJECT)
+ , _id(INVALIDOBJECT)
, _type(NULLTYPE)
, _click(0)
, _click2(0)
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index d236019..521f90b 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -458,7 +458,8 @@ void GameManager::processInput() {
}
/* normal item */
else {
- for (int i = 0; (_currentRoom->getObject(i)->_name.c_str()[0] != '\0') && (field == -1) && i < kMaxObject; i++) {
+ for (int i = 0; (_currentRoom->getObject(i)->_id != INVALIDOBJECT) &&
+ (field == -1) && i < kMaxObject; i++) {
click = _currentRoom->getObject(i)->_click;
if (click != 255) {
MSNImageDecoder::ClickField *clickField = _vm->_currentImage->_clickField;
Commit: d6d485dbae355e29c6119615c3f796fc7020cd60
https://github.com/scummvm/scummvm/commit/d6d485dbae355e29c6119615c3f796fc7020cd60
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T01:47:02Z
Commit Message:
SUPERNOVA: Fixes umlaut in object description
Changed paths:
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index f19f9c3..650fac9 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -420,7 +420,7 @@ public:
_objectState[10] = Object("Schrank","Das ist dein Schrank.",SHELF3,OPENABLE | CLOSED,16,17,11);
_objectState[11] = Object("Krimskram","Es ist nichts brauchbares dabei.",NULLOBJECT,UNNECESSARY,20,20,0);
_objectState[12] = Object("Kleider","Es sind Standard-Weltraum-Klamotten.",NULLOBJECT,UNNECESSARY,21,21,0);
- _objectState[13] = Object("Unterw�sche",Object::defaultDescription,NULLOBJECT,UNNECESSARY,22,22,0);
+ _objectState[13] = Object("Unterw\204sche",Object::defaultDescription,NULLOBJECT,UNNECESSARY,22,22,0);
_objectState[14] = Object("Str\201mpfe",Object::defaultDescription,NULLOBJECT,UNNECESSARY,23,23,0);
_objectState[15] = Object("Fach","Das ist eins deiner drei F\204cher.",SHELF4,OPENABLE | CLOSED,24,25,13);
_objectState[16] = Object("Buch","Es ist|\"Per Anhalter durch die Galaxis\"|von Douglas Adams.",BOOK,TAKE,26,26,14);
Commit: e15f281113d5b22e48ecef037f4737718ddd1c63
https://github.com/scummvm/scummvm/commit/e15f281113d5b22e48ecef037f4737718ddd1c63
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T01:47:02Z
Commit Message:
SUPERNOVA: Removes color macros
Changed paths:
engines/supernova/msn_def.h
engines/supernova/state.cpp
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 3b2bd49..88b59fa 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -82,7 +82,6 @@ struct AudioInfo {
int _offsetEnd;
};
-// Colors
const int kColorBlack = 0;
const int kColorWhite25 = 1;
const int kColorWhite35 = 2;
@@ -101,37 +100,6 @@ const int kColorLightYellow = 14;
const int kColorLightRed = 15;
const int kColorCursorTransparent = kColorWhite25;
-#define HGR_BEF kColorWhite25
-#define COL_BEF kColorDarkGreen
-#define HGR_BEF_HELL kColorWhite44
-#define COL_BEF_HELL kColorGreen
-
-#define HGR_INV kColorWhite25
-#define COL_INV kColorDarkRed
-#define HGR_INV_HELL kColorWhite35
-#define COL_INV_HELL kColorRed
-
-#define HGR_BEF_ANZ kColorWhite25
-#define COL_BEF_ANZ kColorDarkGreen
-
-#define HGR_AUSG kColorWhite25
-#define COL_AUSG kColorDarkRed
-
-#define HGR_MELD kColorWhite35
-#define COL_MELD kColorWhite99
-
-#define COL_LWIN kColorDarkRed
-#define HGR_LADEN kColorBlue
-#define COL_LADEN kColorWhite99
-#define HGR_LADEN2 kColorDarkBlue
-#define COL_LADEN2 kColorWhite63
-#define HGR_NAME kColorDarkBlue
-#define COL_NAME kColorLightRed
-
-#define HGR_EDIT kColorDarkBlue
-#define COL_EDIT kColorWhite99
-
-
const byte mouseNormal[64] = {
0xff,0x3f,0xff,0x1f,0xff,0x0f,0xff,0x07,
0xff,0x03,0xff,0x01,0xff,0x00,0x7f,0x00,
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 521f90b..6453f39 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -749,8 +749,8 @@ void GameManager::drawInventory() {
_guiInventory[i]._textColor);
}
- _vm->renderBox(272, 161, 7, 19, HGR_INV);
- _vm->renderBox(272, 181, 7, 19, HGR_INV);
+ _vm->renderBox(272, 161, 7, 19, kColorWhite25);
+ _vm->renderBox(272, 181, 7, 19, kColorWhite25);
}
uint16 GameManager::getKeyInput(bool blockForPrintChar) {
@@ -885,15 +885,15 @@ void GameManager::shock() {
void GameManager::showMenu() {
_vm->renderBox(0, 138, 320, 62, 0);
- _vm->renderBox(0, 140, 320, 9, HGR_BEF_ANZ);
+ _vm->renderBox(0, 140, 320, 9, kColorWhite25);
drawCommandBox();
- _vm->renderBox(281, 161, 39, 39, HGR_AUSG);
+ _vm->renderBox(281, 161, 39, 39, kColorWhite25);
drawInventory();
}
void GameManager::drawMapExits() {
// TODO: Preload _exitList on room entry instead on every call
- _vm->renderBox(281, 161, 39, 39, HGR_AUSG);
+ _vm->renderBox(281, 161, 39, 39, kColorWhite25);
for (int i = 0; i < 25; i++)
_exitList[i] = -1;
@@ -903,7 +903,7 @@ void GameManager::drawMapExits() {
_exitList[r] = i;
int x = 284 + 7 * (r % 5);
int y = 164 + 7 * (r / 5);
- _vm->renderBox(x, y, 5, 5, COL_AUSG);
+ _vm->renderBox(x, y, 5, 5, kColorDarkRed);
}
}
}
@@ -926,22 +926,22 @@ void GameManager::edit(Common::String &input, int x, int y, uint length) {
while (isEditing) {
_vm->_textCursorX = x;
_vm->_textCursorY = y;
- _vm->_textColor = COL_EDIT;
- _vm->renderBox(x, y - 1, overdrawWidth, 9, HGR_EDIT);
+ _vm->_textColor = kColorWhite99;
+ _vm->renderBox(x, y - 1, overdrawWidth, 9, kColorDarkBlue);
for (uint i = 0; i < input.size(); ++i) {
// Draw char highlight depending on cursor position
if (i == cursorIndex) {
- _vm->renderBox(_vm->_textCursorX, y - 1, _vm->textWidth(input[i]), 9, COL_EDIT);
- _vm->_textColor = HGR_EDIT;
+ _vm->renderBox(_vm->_textCursorX, y - 1, _vm->textWidth(input[i]), 9, kColorWhite99);
+ _vm->_textColor = kColorDarkBlue;
_vm->renderText(input[i]);
- _vm->_textColor = COL_EDIT;
+ _vm->_textColor = kColorWhite99;
} else {
_vm->renderText(input[i]);
}
}
if (cursorIndex == input.size()) {
- _vm->renderBox(_vm->_textCursorX + 1, y - 1, 6, 9, HGR_EDIT);
- _vm->renderBox(_vm->_textCursorX , y - 1, 1, 9, COL_EDIT);
+ _vm->renderBox(_vm->_textCursorX + 1, y - 1, 6, 9, kColorDarkBlue);
+ _vm->renderBox(_vm->_textCursorX , y - 1, 1, 9, kColorWhite99);
}
getKeyInput(true);
Commit: 72791ddbee78ce70e86463b2365158915caf4b30
https://github.com/scummvm/scummvm/commit/72791ddbee78ce70e86463b2365158915caf4b30
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T01:47:02Z
Commit Message:
SUPERNOVA: Adds structs for loading original save files
Changed paths:
A engines/supernova/saveload.h
diff --git a/engines/supernova/saveload.h b/engines/supernova/saveload.h
new file mode 100644
index 0000000..3f97d24
--- /dev/null
+++ b/engines/supernova/saveload.h
@@ -0,0 +1,68 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef SAVELOAD_H
+#define SAVELOAD_H
+
+namespace Supernova {
+
+const int kNumRoom0 = 1;
+const int kNumRoom1 = 16;
+const int kNumRoom2 = 9;
+const int kNumRoom3 = 21;
+
+struct OriginalObject {
+ char *_name;
+ char *_description;
+ byte _id;
+ int16 _type;
+ char _click;
+ char _click2;
+ char _section;
+ char _exitroom;
+ char _direction;
+};
+
+struct OriginalRoom {
+ char *_file;
+ byte _shown[40];
+ uint16 _funcptr[3];
+ OriginalObject _object[25];
+};
+
+struct OriginalGameSaveState {
+ uint16 _ptrCurrentRoom;
+ uint16 _inventory[30];
+ int16 _inventorySize;
+ int16 _inventoryScroll;
+ OriginalRoom _roomlist0[kNumRoom0];
+ OriginalRoom _roomlist1[kNumRoom1];
+ OriginalRoom _roomlist2[kNumRoom2];
+ OriginalRoom _roomlist3[kNumRoom3];
+};
+
+// TODO: Create a table with mapping of offsets to corresponding strings in
+// object definitions to keep save files valid. (msn.exe:0xD400..)
+
+}
+
+#endif // SAVELOAD_H
Commit: 18abc4702afb9617a8f392620d4846668faa679b
https://github.com/scummvm/scummvm/commit/18abc4702afb9617a8f392620d4846668faa679b
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T01:52:50Z
Commit Message:
SUPERNOVA: Implements Return To Launcher
Changed paths:
engines/supernova/state.cpp
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 6453f39..84f040d 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -351,7 +351,7 @@ void GameManager::processInput(Common::KeyState &state) {
case Common::KEYCODE_x:
if (state.flags & Common::KBD_ALT) {
// quit game
- _vm->_gameRunning = false;
+ _vm->quitGame();
}
break;
default:
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 9a68079..aa39608 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -104,7 +104,6 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)
, _imageIndex(0)
, _sectionIndex(0)
, _delay(33)
- , _gameRunning(true)
, _screenWidth(320)
, _screenHeight(200)
, _messageDisplayed(false)
@@ -143,7 +142,7 @@ Common::Error SupernovaEngine::run() {
CursorMan.replaceCursorPalette(initVGAPalette, 0, 16);
CursorMan.showMouse(true);
- while (_gameRunning) {
+ while (!shouldQuit()) {
uint32 start = _system->getMillis();
updateEvents();
_gm->executeRoom();
@@ -169,11 +168,6 @@ void SupernovaEngine::updateEvents() {
_gm->_keyPressed = false;
while (g_system->getEventManager()->pollEvent(_event)) {
switch (_event.type) {
- case Common::EVENT_QUIT:
- case Common::EVENT_RTL:
- _gameRunning = false;
- break;
-
case Common::EVENT_KEYDOWN:
_gm->_keyPressed = true;
if (_event.kbd.keycode == Common::KEYCODE_d &&
@@ -183,7 +177,6 @@ void SupernovaEngine::updateEvents() {
if (_event.kbd.keycode == Common::KEYCODE_x &&
(_event.kbd.flags & Common::KBD_CTRL)) {
// TODO: Draw exit box
- _gameRunning = false;
}
_gm->processInput(_event.kbd);
@@ -208,6 +201,15 @@ void SupernovaEngine::updateEvents() {
}
}
+bool SupernovaEngine::hasFeature(EngineFeature f) const {
+ switch (f) {
+ case kSupportsRTL:
+ return true;
+ default:
+ return false;
+ }
+}
+
void SupernovaEngine::initData() {
// Images
for (int i = 0; i < 44; ++i)
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 271db0b..56c4ad6 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -93,7 +93,6 @@ public:
} _soundSamples[kAudioNumSamples];
Common::MemoryReadStream *_soundMusic[2];
Common::Event _event;
- bool _gameRunning;
int _screenWidth;
int _screenHeight;
@@ -134,6 +133,8 @@ public:
void command_print();
Common::MemoryReadStream *convertToMod(const char *filename, int version = 1);
+
+ virtual bool hasFeature(EngineFeature f) const;
};
}
Commit: bc43ff820e309ce1f6d7b5748bf8d43647433c67
https://github.com/scummvm/scummvm/commit/bc43ff820e309ce1f6d7b5748bf8d43647433c67
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T01:52:59Z
Commit Message:
SUPERNOVA: Ignores mouse clicks while sound is playing
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index aa39608..941bfc8 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -186,6 +186,9 @@ void SupernovaEngine::updateEvents() {
// fallthrough
case Common::EVENT_RBUTTONUP:
// fallthrough
+ if (_mixer->isSoundHandleActive(_soundHandle) &&
+ (_gm->_currentRoom != _gm->_rooms[INTRO]))
+ return;
_gm->_mouseClicked = true;
case Common::EVENT_MOUSEMOVE:
_gm->_mouseClickType = _event.type;
@@ -269,8 +272,6 @@ void SupernovaEngine::playSound(AudioIndex sample) {
11931, Audio::FLAG_UNSIGNED | Audio::FLAG_LITTLE_ENDIAN, DisposeAfterUse::NO);
stopSound();
_mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, audioStream);
-
- // TODO: Stall till sound was played
}
void SupernovaEngine::stopSound() {
Commit: edef2792da5ca6f039a6d9ff7618cd9ad217f444
https://github.com/scummvm/scummvm/commit/edef2792da5ca6f039a6d9ff7618cd9ad217f444
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T01:52:59Z
Commit Message:
SUPERNOVA: Adds RoomID to Rooms
GameManager::airless() determined if the space suit could be taken off
by comparing the current room pointer to the allocated room objects.
This led to indeterministic behavior as sometimes airless() would
falsely return true as the dynamic allocation of the Room objects cannot
be expected to be in a certain order.
Implementing the corresponing RoomID to a Room objects solves this
problem.
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/rooms.h
engines/supernova/state.cpp
engines/supernova/state.h
engines/supernova/supernova.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 2e2dd5a..cfccd11 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -27,12 +27,11 @@
namespace Supernova {
-void StartingItems::onEntrance() {
- for (int i = 0; i < 3; ++i)
- _gm->_inventory.add(*getObject(i));
+void Intro::onEntrance() {
+}
+
+bool Intro::interact(Action verb, Object &obj1, Object &obj2) {
- setRoomSeen(true);
- _gm->changeRoom(CABIN_R3);
}
bool ShipCorridor::interact(Action verb, Object &obj1, Object &obj2) {
@@ -566,6 +565,13 @@ bool ShipCabinR3::interact(Action verb, Object &obj1, Object &obj2) {
return true;
}
+void ShipCabinR3::onEntrance() {
+ for (int i = 0; i < 3; ++i)
+ _gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(i));
+
+ setRoomSeen(true);
+}
+
bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) {
Room *r;
@@ -2367,7 +2373,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
}
} else if ((verb == ACTION_LOOK) &&
(obj1._id >= DOOR1) && (obj1._id <= DOOR4)) {
- _gm->_state._nameSeen |= 1 << (obj1._id - DOOR1);
+ _nameSeen |= 1 << (obj1._id - DOOR1);
return false;
} else if ((verb == ACTION_WALK) &&
((obj1._id == PILLAR1) || (obj1._id == PILLAR2))) {
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 650fac9..ae92f84 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -50,6 +50,9 @@ public:
int getFileNumber() const {
return _fileNumber;
}
+ RoomID getId() const {
+ return _id;
+ }
void setSectionVisible(uint section, bool visible) {
_shown[section] = visible;
@@ -72,6 +75,7 @@ protected:
int _fileNumber;
bool _shown[kMaxSection];
Object _objectState[kMaxObject];
+ RoomID _id;
SupernovaEngine *_vm;
GameManager *_gm;
@@ -80,14 +84,14 @@ private:
};
// Room 0
-class StartingItems : public Room {
+class Intro : public Room {
public:
- StartingItems(SupernovaEngine *vm, GameManager *gm) {
+ Intro(SupernovaEngine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
_fileNumber = -1;
-
+ _id = INTRO;
_shown[0] = false;
_objectState[0] =
@@ -105,6 +109,7 @@ public:
}
virtual void onEntrance();
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
};
// Spaceship
@@ -115,6 +120,7 @@ public:
_gm = gm;
_fileNumber = 17;
+ _id = CORRIDOR;
_shown[0] = true;
_shown[1] = false;
_shown[2] = false;
@@ -143,6 +149,7 @@ public:
_gm = gm;
_fileNumber = 15;
+ _id = HALL;
_shown[0] = true;
_objectState[0] = Object("Luke", "Sie f\204hrt ins Cockpit.", NULLOBJECT, OPENABLE | EXIT, 4, 5, 1, COCKPIT, 10);
@@ -163,6 +170,7 @@ public:
_gm = gm;
_fileNumber = 33;
+ _id = SLEEP;
_shown[0] = true;
_objectState[0] = Object("Luke", "Dies ist eine der Tiefschlafkammern.", CABINS, NULLTYPE, 0, 0, 0, NULLROOM, 0);
@@ -191,6 +199,7 @@ public:
_gm = gm;
_fileNumber = 9;
+ _id = COCKPIT;
_shown[0] = true;
_objectState[0] = Object("Instrumente", "Hmm, sieht ziemlich kompliziert aus.", INSTRUMENTS, NULLTYPE, 2, 2, 0, NULLROOM, 0);
@@ -214,6 +223,7 @@ public:
_gm = gm;
_fileNumber = 21;
+ _id = CABIN_L1;
_shown[0] = true;
_shown[1] = true;
_shown[2] = true;
@@ -243,6 +253,7 @@ public:
_gm = gm;
_fileNumber = 21;
+ _id = CABIN_L2;
_shown[0] = true;
_shown[1] = false;
_shown[2] = false;
@@ -298,6 +309,7 @@ public:
_gm = gm;
_fileNumber = 21;
+ _id = CABIN_L3;
_shown[0] = true;
_shown[1] = false;
_shown[2] = false;
@@ -341,6 +353,7 @@ public:
_gm = gm;
_fileNumber = 22;
+ _id = CABIN_R1;
_shown[0] = true;
_shown[1] = true;
_shown[2] = true;
@@ -364,6 +377,7 @@ public:
_gm = gm;
_fileNumber = 22;
+ _id = CABIN_R2;
_shown[0] = true;
_shown[1] = false;
_shown[2] = false;
@@ -390,6 +404,7 @@ public:
_gm = gm;
_fileNumber = 22;
+ _id = CABIN_R3;
_shown[0] = true;
_shown[1] = false;
_shown[2] = false;
@@ -434,6 +449,7 @@ public:
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
+ virtual void onEntrance();
};
class ShipCabinBathroom : public Room {
@@ -443,6 +459,7 @@ public:
_gm = gm;
_fileNumber = 23;
+ _id = BATHROOM;
_shown[0] = true;
_objectState[0] = Object("Klo","Ein Klo mit Saugmechanismus.",TOILET,NULLTYPE,0,0,0);
@@ -458,6 +475,7 @@ public:
_gm = gm;
_fileNumber = 34;
+ _id = AIRLOCK;
_shown[0] = true;
_shown[1] = false;
_shown[2] = false;
@@ -486,6 +504,7 @@ public:
_gm = gm;
_fileNumber = 24;
+ _id = HOLD;
_shown[0] = true;
_objectState[0] = Object("",Object::defaultDescription,HOLD_WIRE,COMBINABLE,255,255,0);
@@ -518,6 +537,7 @@ public:
_gm = gm;
_fileNumber = 25;
+ _id = LANDINGMODULE;
_shown[0] = true;
_objectState[0] = Object("Steckdose",Object::defaultDescription,LANDINGMOD_SOCKET,COMBINABLE,1,1,0);
@@ -538,6 +558,7 @@ public:
_gm = gm;
_fileNumber = 18;
+ _id = GENERATOR;
_shown[0] = true;
_shown[1] = false;
_shown[2] = false;
@@ -570,6 +591,7 @@ public:
_gm = gm;
_fileNumber = 4;
+ _id = OUTSIDE;
_shown[0] = true;
_objectState[0] = Object("Luke",Object::defaultDescription,NULLOBJECT,EXIT,0,0,0,GENERATOR,3);
@@ -603,6 +625,7 @@ public:
_gm = gm;
_fileNumber = 12;
+ _id = CAVE;
_shown[0] = false;
_objectState[0] = Object("Ausgang","Hier bist du gerade hergekommen.",NULLOBJECT,EXIT,255,255,0,ROCKS,22);
@@ -616,6 +639,7 @@ public:
_gm = gm;
_fileNumber = 37;
+ _id = MEETUP;
_shown[0] = true;
_objectState[0] = Object("H\224hle",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
@@ -641,6 +665,7 @@ public:
_gm = gm;
_fileNumber = 10;
+ _id = ENTRANCE;
_shown[0] = true;
_objectState[0] = Object("Portier","Du siehst doch selbst, wie er aussieht.",PORTER,TALK,0,0,0);
@@ -696,6 +721,7 @@ public:
_gm = gm;
_fileNumber = 28;
+ _id = REST;
_shown[0] = true;
_objectState[0] = Object("Treppe",Object::defaultDescription,NULLOBJECT,EXIT,0,0,0,ENTRANCE,17);
@@ -718,6 +744,7 @@ public:
_gm = gm;
_fileNumber = 29;
+ _id = ROGER;
_shown[0] = true;
_objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,REST,19);
@@ -754,6 +781,7 @@ public:
_gm = gm;
_fileNumber = 19;
+ _id = GLIDER;
_shown[0] = true;
_objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,MEETUP,15);
@@ -782,6 +810,7 @@ public:
_gm = gm;
_fileNumber = 38;
+ _id = MEETUP2;
_shown[0] = true;
_objectState[0] = Object("Roger W.",Object::defaultDescription,ROGER_W,TALK,255,255,0);
@@ -819,6 +848,7 @@ public:
_gm = gm;
_fileNumber = 39;
+ _id = MEETUP3;
_shown[0] = true;
_objectState[0] = Object("Ufo","Der Eingang scheint offen zu sein.",UFO,EXIT,0,0,0,NULLROOM,3);
@@ -848,6 +878,7 @@ public:
_gm = gm;
_fileNumber = 43;
+ _id = CELL;
_shown[0] = true;
_shown[1] = true;
_shown[2] = false;
@@ -904,6 +935,7 @@ public:
_gm = gm;
_fileNumber = 16;
+ _id = CORRIDOR1;
_shown[0] = true;
_shown[1] = false;
_shown[2] = false;
@@ -944,6 +976,7 @@ public:
_gm = gm;
_fileNumber = 16;
+ _id = CORRIDOR2;
_shown[0] = true;
_shown[1] = false;
_shown[2] = true;
@@ -984,7 +1017,7 @@ public:
_gm = gm;
_fileNumber = 16;
-
+ _id = CORRIDOR3;
_shown[0] = true;
_shown[1] = false;
_shown[2] = false;
@@ -1022,6 +1055,7 @@ public:
_gm = gm;
_fileNumber = 16;
+ _id = CORRIDOR4;
_shown[0] = true;
_shown[1] = true;
_shown[2] = true;
@@ -1069,6 +1103,7 @@ public:
_gm = gm;
_fileNumber = 16;
+ _id = CORRIDOR5;
_shown[0] = true;
_shown[1] = false;
_shown[2] = false;
@@ -1123,6 +1158,7 @@ public:
_gm = gm;
_fileNumber = 16;
+ _id = CORRIDOR6;
_shown[0] = true;
_shown[1] = false;
_shown[2] = false;
@@ -1165,6 +1201,7 @@ public:
_gm = gm;
_fileNumber = 16;
+ _id = CORRIDOR7;
_shown[0] = true;
_shown[1] = false;
_shown[2] = false;
@@ -1205,6 +1242,7 @@ public:
_gm = gm;
_fileNumber = 16;
+ _id = CORRIDOR8;
_shown[0] = true;
_shown[1] = true;
_shown[2] = false;
@@ -1249,6 +1287,7 @@ public:
_gm = gm;
_fileNumber = 16;
+ _id = CORRIDOR9;
_shown[0] = true;
_shown[1] = true;
_shown[2] = false;
@@ -1293,6 +1332,7 @@ public:
_gm = gm;
_fileNumber = 6;
+ _id = BCORRIDOR;
_shown[0] = true;
_shown[1] = false;
_shown[2] = false;
@@ -1315,6 +1355,7 @@ public:
private:
Common::String _dontEnter;
+ byte _nameSeen;
};
class AxacussIntersection : public Room {
public:
@@ -1323,6 +1364,7 @@ public:
_gm = gm;
_fileNumber = 40;
+ _id = GUARD;
_shown[0] = true;
_objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CORRIDOR4,21);
@@ -1343,6 +1385,7 @@ public:
_gm = gm;
_fileNumber = 42;
+ _id = GUARD3;
_shown[0] = true;
_objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CORRIDOR1,22);
@@ -1364,6 +1407,7 @@ public:
_gm = gm;
_fileNumber = 7;
+ _id = OFFICE_L1;
_shown[0] = true;
_shown[1] = false;
_shown[2] = true;
@@ -1398,6 +1442,7 @@ public:
_gm = gm;
_fileNumber = 7;
+ _id = OFFICE_L2;
_shown[0] = true;
_shown[1] = true;
_shown[2] = false;
@@ -1432,6 +1477,7 @@ public:
_gm = gm;
_fileNumber = 8;
+ _id = OFFICE_R1;
_shown[0] = true;
_shown[1] = true;
_shown[2] = false;
@@ -1454,6 +1500,7 @@ public:
_gm = gm;
_fileNumber = 8;
+ _id = OFFICE_R2;
_shown[0] = true;
_shown[1] = false;
_shown[2] = true;
@@ -1474,6 +1521,7 @@ public:
_gm = gm;
_fileNumber = 7;
+ _id = OFFICE_L;
_shown[0] = true;
_shown[1] = false;
_shown[2] = false;
@@ -1509,6 +1557,7 @@ public:
_gm = gm;
_fileNumber = 3;
+ _id = ELEVATOR;
_shown[0] = true;
_objectState[0] = Object("Knopf",Object::defaultDescription,BUTTON1,PRESS,0,0,0);
@@ -1526,6 +1575,7 @@ public:
_gm = gm;
_fileNumber = 5;
+ _id = STATION;
_shown[0] = true;
_objectState[0] = Object("Schild",Object::defaultDescription,STATION_SIGN,NULLTYPE,0,0,0);
_objectState[1] = Object("T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|CLOSED,1,1,0,NULLROOM,7);
@@ -1540,6 +1590,7 @@ public:
_gm = gm;
_fileNumber = 32;
+ _id = SIGN;
_shown[0] = true;
_shown[1] = true;
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 84f040d..5b5af20 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -236,7 +236,6 @@ void GameManager::initState() {
_state._money = 0;
_state._coins = 0;
_state._shoes = 0;
- _state._nameSeen = 0;
_state._destination = 255;
_state._benOverlay = 0;
_state._language = 0;
@@ -246,14 +245,11 @@ void GameManager::initState() {
_state._terminalStripWire = false;
_state._cableConnected = false;
_state._powerOff = false;
- _state._cockpitSeen = false;
- _state._airlockSeen = false;
- _state._holdSeen = false;
_state._dream = false;
}
void GameManager::initRooms() {
- _rooms[INTRO] = new StartingItems(_vm, this);
+ _rooms[INTRO] = new Intro(_vm, this);
_rooms[CORRIDOR] = new ShipCorridor(_vm, this);
_rooms[HALL] = new ShipHall(_vm, this);
_rooms[SLEEP] = new ShipSleepCabin(_vm, this);
@@ -534,7 +530,7 @@ void GameManager::telomat(int number) {
}
void GameManager::startSearch() {
- if ((_currentRoom >= _rooms[CORRIDOR1]) && (_currentRoom <= _rooms[BCORRIDOR]))
+ if ((_currentRoom->getId() >= CORRIDOR1) && (_currentRoom->getId() <= BCORRIDOR))
busted(0);
_state._corridorSearch = true;
@@ -553,8 +549,8 @@ void GameManager::busted(int i) {
if (i > 0)
drawImage(i);
if (i == 0) {
- if ((_currentRoom >= _rooms[OFFICE_L1]) && (_currentRoom <= _rooms[OFFICE_R2])) {
- if (_currentRoom < _rooms[OFFICE_R1])
+ if ((_currentRoom->getId() >= OFFICE_L1) && (_currentRoom->getId() <= OFFICE_R2)) {
+ if (_currentRoom->getId() < OFFICE_R1)
i = 10;
else
i = 5;
@@ -569,13 +565,13 @@ void GameManager::busted(int i) {
_vm->playSound(kAudioVoiceHalt);
drawImage(i);
wait2(5);
- if (_currentRoom == _rooms[OFFICE_L2])
+ if (_currentRoom->getId() == OFFICE_L2)
i = 13;
drawImage(i + 1);
wait2(3);
drawImage(i + 2);
shot(0, 0);
- } else if (_currentRoom == _rooms[BCORRIDOR]) {
+ } else if (_currentRoom->getId() == BCORRIDOR) {
drawImage(21);
} else {
if (_currentRoom->isSectionVisible(4))
@@ -594,9 +590,9 @@ void GameManager::busted(int i) {
}
void GameManager::guardReturned() {
- if (_currentRoom == _rooms[GUARD])
+ if (_currentRoom->getId() == GUARD)
busted(-1);
- else if ((_currentRoom == _rooms[CORRIDOR9]) && (_currentRoom->isSectionVisible(27)))
+ else if ((_currentRoom->getId() == CORRIDOR9) && (_currentRoom->isSectionVisible(27)))
busted(0);
_rooms[GUARD]->setSectionVisible(1, false);
@@ -611,7 +607,7 @@ void GameManager::guardReturned() {
}
void GameManager::taxi() {
- if (_currentRoom == _rooms[SIGN]) {
+ if (_currentRoom->getId() == SIGN) {
changeRoom(STATION);
}
@@ -658,12 +654,16 @@ void GameManager::great(uint number) {
}
bool GameManager::airless() {
- return (
- ((_currentRoom > _rooms[AIRLOCK]) && (_currentRoom < _rooms[CABIN_R1])) ||
- ((_currentRoom > _rooms[BATHROOM])&& (_currentRoom < _rooms[ENTRANCE])) ||
- ((_currentRoom == _rooms[AIRLOCK]) && (_currentRoom->getObject(1)->hasProperty(OPENED))) ||
- (_currentRoom >= _rooms[MEETUP2])
- );
+ return (_currentRoom->getId() == HOLD ||
+ _currentRoom->getId() == LANDINGMODULE ||
+ _currentRoom->getId() == GENERATOR ||
+ _currentRoom->getId() == OUTSIDE ||
+ _currentRoom->getId() == ROCKS ||
+ _currentRoom->getId() == CAVE ||
+ _currentRoom->getId() == MEETUP ||
+ _currentRoom->getId() == MEETUP2 ||
+ _currentRoom->getId() == MEETUP3 ||
+ (_currentRoom->getId() == AIRLOCK && _rooms[AIRLOCK]->getObject(1)->hasProperty(OPENED)));
}
void GameManager::shipStart() {
@@ -813,12 +813,12 @@ void GameManager::mouseWait(int delay) {
}
void GameManager::roomBrightness() {
- if ((_currentRoom != _rooms[OUTSIDE]) && (_currentRoom < _rooms[ROCKS]) ) {
+ if ((_currentRoom->getId() != OUTSIDE) && (_currentRoom->getId() < ROCKS) ) {
if (_state._powerOff)
_vm->_brightness = 153;
- } else if ((_currentRoom == _rooms[CAVE])) {
+ } else if ((_currentRoom->getId() == CAVE)) {
_vm->_brightness = 0;
- } else if ((_currentRoom == _rooms[GUARD3])) {
+ } else if ((_currentRoom->getId() == GUARD3)) {
if (_state._powerOff)
_vm->_brightness = 0;
}
@@ -1083,7 +1083,7 @@ void GameManager::death(const char *message) {
initState();
initGui();
_inventory.clear();
- changeRoom(INTRO);
+ changeRoom(CABIN_R3);
g_system->fillScreen(kColorBlack);
_vm->paletteFadeIn();
@@ -1293,7 +1293,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
}
} else if ((verb == ACTION_USE) && (obj1._id == SUIT)) {
takeObject(obj1);
- if ((_currentRoom >= _rooms[ENTRANCE]) && (_currentRoom <= _rooms[ROGER])) {
+ if ((_currentRoom->getId() >= ENTRANCE) && (_currentRoom->getId() <= ROGER)) {
if (obj1.hasProperty(WORN)) {
_vm->renderMessage("Die Luft hier ist atembar,|du ziehst den Anzug aus.");
_rooms[AIRLOCK]->getObject(4)->disableProperty(WORN);
@@ -1319,7 +1319,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
}
} else if ((verb == ACTION_USE) && (obj1._id == HELMET)) {
takeObject(obj1);
- if ((_currentRoom >= _rooms[ENTRANCE]) && (_currentRoom <= _rooms[ROGER])) {
+ if ((_currentRoom->getId() >= ENTRANCE) && (_currentRoom->getId() <= ROGER)) {
if (obj1.hasProperty(WORN)) {
_vm->renderMessage("Die Luft hier ist atembar,|du ziehst den Anzug aus.");
_rooms[AIRLOCK]->getObject(4)->disableProperty(WORN);
@@ -1347,7 +1347,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
}
} else if ((verb == ACTION_USE) && (obj1._id == LIFESUPPORT)) {
takeObject(obj1);
- if ((_currentRoom >= _rooms[ENTRANCE]) && (_currentRoom <= _rooms[ROGER])) {
+ if ((_currentRoom->getId() >= ENTRANCE) && (_currentRoom->getId() <= ROGER)) {
if (obj1.hasProperty(WORN)) {
_vm->renderMessage("Die Luft hier ist atembar,|du ziehst den Anzug aus.");
_rooms[AIRLOCK]->getObject(4)->disableProperty(WORN);
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index affd9b6..079e126 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -53,9 +53,6 @@ struct GameState {
bool _terminalStripWire;
bool _cableConnected;
bool _powerOff;
- bool _cockpitSeen;
- bool _airlockSeen;
- bool _holdSeen;
bool _dream;
};
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 941bfc8..ed40af9 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -185,11 +185,11 @@ void SupernovaEngine::updateEvents() {
case Common::EVENT_LBUTTONUP:
// fallthrough
case Common::EVENT_RBUTTONUP:
- // fallthrough
if (_mixer->isSoundHandleActive(_soundHandle) &&
- (_gm->_currentRoom != _gm->_rooms[INTRO]))
+ (_gm->_currentRoom->getId() == INTRO))
return;
_gm->_mouseClicked = true;
+ // fallthrough
case Common::EVENT_MOUSEMOVE:
_gm->_mouseClickType = _event.type;
_gm->_mouseX = _event.mouse.x;
Commit: 2b03a1f52ab0a97e094282654e903758a806c9c8
https://github.com/scummvm/scummvm/commit/2b03a1f52ab0a97e094282654e903758a806c9c8
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T01:52:59Z
Commit Message:
SUPERNOVA: Formatting
Changed paths:
engines/supernova/detection.cpp
diff --git a/engines/supernova/detection.cpp b/engines/supernova/detection.cpp
index e896ae6..1ac9ff9 100644
--- a/engines/supernova/detection.cpp
+++ b/engines/supernova/detection.cpp
@@ -22,41 +22,43 @@
#include "base/plugins.h"
#include "common/file.h"
+#include "common/savefile.h"
+#include "common/system.h"
#include "engines/advancedDetector.h"
#include "supernova/supernova.h"
static const PlainGameDescriptor supernovaGames[] = {
- {"msn1", "Mission Supernova 1"},
- {"msn2", "Mission Supernova 2"},
- {NULL, NULL}
+ {"msn1", "Mission Supernova 1"},
+ {"msn2", "Mission Supernova 2"},
+ {NULL, NULL}
};
namespace Supernova {
static const ADGameDescription gameDescriptions[] = {
- // Mission Supernova 1
- {
- "msn1",
- NULL,
- AD_ENTRY1s("msn.exe", "d11264516c529c7fc2ca81d8ba062d9e", 65536),
- Common::DE_DEU,
- Common::kPlatformDOS,
- ADGF_UNSTABLE,
- GUIO1(GUIO_NONE)
- },
+ // Mission Supernova 1
+ {
+ "msn1",
+ NULL,
+ AD_ENTRY1s("msn.exe", "d11264516c529c7fc2ca81d8ba062d9e", 65536),
+ Common::DE_DEU,
+ Common::kPlatformDOS,
+ ADGF_UNSTABLE,
+ GUIO1(GUIO_NONE)
+ },
- // Mission Supernova 2
- {
- "msn2",
- NULL,
- AD_ENTRY1s("ms2.exe", "e1b725393c3665f30efa96e2f46d589e", 82944),
- Common::DE_DEU,
- Common::kPlatformDOS,
- ADGF_UNSTABLE,
- GUIO1(GUIO_NONE)
- },
+ // Mission Supernova 2
+ {
+ "msn2",
+ NULL,
+ AD_ENTRY1s("ms2.exe", "e1b725393c3665f30efa96e2f46d589e", 82944),
+ Common::DE_DEU,
+ Common::kPlatformDOS,
+ ADGF_UNSTABLE,
+ GUIO1(GUIO_NONE)
+ },
- AD_TABLE_END_MARKER
+ AD_TABLE_END_MARKER
};
}
Commit: 1af00170b42a20e0c507ff288155d7fda5c5db37
https://github.com/scummvm/scummvm/commit/1af00170b42a20e0c507ff288155d7fda5c5db37
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T01:53:00Z
Commit Message:
SUPERNOVA: Extends MetaEngine for load/save support
Changed paths:
engines/supernova/detection.cpp
diff --git a/engines/supernova/detection.cpp b/engines/supernova/detection.cpp
index 1ac9ff9..3e1082c 100644
--- a/engines/supernova/detection.cpp
+++ b/engines/supernova/detection.cpp
@@ -78,21 +78,66 @@ public:
virtual bool hasFeature(MetaEngineFeature f) const;
virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const;
+ virtual SaveStateList listSaves(const char *target) const;
+ virtual void removeSaveState(const char *target, int slot) const;
+ virtual int getMaximumSaveSlot() const {
+ return 10;
+ }
};
bool SupernovaMetaEngine::hasFeature(MetaEngineFeature f) const {
- // STUB
- return false;
+ switch (f) {
+ case kSupportsLoadingDuringStartup:
+ // fallthrough
+ case kSupportsListSaves:
+ // fallthrough
+ case kSupportsDeleteSave:
+ return true;
+ default:
+ return false;
+ }
}
bool SupernovaMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
if (desc) {
*engine = new Supernova::SupernovaEngine(syst);
}
-
+
return desc != NULL;
}
+SaveStateList SupernovaMetaEngine::listSaves(const char *target) const {
+ Common::StringArray filenames;
+ Common::String pattern("msn_save.##");
+
+ filenames = g_system->getSavefileManager()->listSavefiles(pattern);
+
+ char saveFileDesc[128];
+ SaveStateList saveFileList;
+ for (Common::StringArray::const_iterator file = filenames.begin();
+ file != filenames.end(); ++file) {
+ int saveSlot = atoi(file->c_str() + file->size() - 2);
+ if (saveSlot >= 0 && saveSlot <= getMaximumSaveSlot()) {
+ Common::InSaveFile *savefile = g_system->getSavefileManager()->openForLoading(*file);
+ if (savefile) {
+ savefile->skip(2);
+ savefile->read(saveFileDesc, sizeof(saveFileDesc));
+ saveFileList.push_back(SaveStateDescriptor(saveSlot, saveFileDesc));
+
+ delete savefile;
+ }
+ }
+ }
+
+ Common::sort(saveFileList.begin(), saveFileList.end(), SaveStateDescriptorSlotComparator());
+ return saveFileList;
+}
+
+void SupernovaMetaEngine::removeSaveState(const char *target, int slot) const {
+ Common::String filename = Common::String::format("msn_save.%02d", slot);
+ g_system->getSavefileManager()->removeSavefile(filename);
+}
+
#if PLUGIN_ENABLED_DYNAMIC(SUPERNOVA)
REGISTER_PLUGIN_DYNAMIC(SUPERNOVA, PLUGIN_TYPE_ENGINE, SupernovaMetaEngine);
#else
Commit: 9b064e364f77fe114712c145fb094bc6fb0ea569
https://github.com/scummvm/scummvm/commit/9b064e364f77fe114712c145fb094bc6fb0ea569
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T01:53:00Z
Commit Message:
SUPERNOVA: Adds room id to objects
This commit helps especially during serialization of the inventory to
determine which room the object belongs to.
Changed paths:
engines/supernova/msn_def.h
engines/supernova/rooms.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 88b59fa..a84c28c 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -433,6 +433,7 @@ struct Object {
: _name("")
, _description(Object::defaultDescription)
, _id(INVALIDOBJECT)
+ , _roomId(NULLROOM)
, _type(NULLTYPE)
, _click(0)
, _click2(0)
@@ -440,11 +441,12 @@ struct Object {
, _exitRoom(NULLROOM)
, _direction(0)
{}
- Object(const char *name, const char *description, ObjectID id, ObjectType type,
+ Object(byte roomId, const char *name, const char *description, ObjectID id, ObjectType type,
byte click, byte click2, byte section = 0, RoomID exitRoom = NULLROOM, byte direction = 0)
: _name(name)
, _description(description)
, _id(id)
+ , _roomId(roomId)
, _type(type)
, _click(click)
, _click2(click2)
@@ -483,6 +485,7 @@ struct Object {
return false;
}
+ byte _roomId;
Common::String _name;
Common::String _description;
ObjectID _id;
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index ae92f84..b3956b8 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -95,16 +95,16 @@ public:
_shown[0] = false;
_objectState[0] =
- Object("Keycard", "Die Keycard fuer deine Schraenke.", KEYCARD,
+ Object(_id, "Keycard", "Die Keycard f\224r deine Schr\204nke.", KEYCARD,
TAKE | CARRIED | COMBINABLE, 255, 255, 0, NULLROOM, 0);
_objectState[1] =
- Object("Taschenmesser", "Es ist nicht mehr das sch\204rfste.", KNIFE,
+ Object(_id, "Taschenmesser", "Es ist nicht mehr das sch\204rfste.", KNIFE,
TAKE | CARRIED | COMBINABLE, 255, 255, 0, NULLROOM, 0);
_objectState[2] =
- Object("Armbanduhr", Object::defaultDescription, WATCH,
+ Object(_id, "Armbanduhr", Object::defaultDescription, WATCH,
TAKE | COMBINABLE | CARRIED, 255, 255, 8, NULLROOM, 0);
_objectState[3] =
- Object("Discman", "Es ist eine \"Mad Monkeys\"-CD darin.", DISCMAN,
+ Object(_id, "Discman", "Es ist eine \"Mad Monkeys\"-CD darin.", DISCMAN,
TAKE | COMBINABLE, 255, 255, 0, NULLROOM, 0);
}
@@ -127,16 +127,16 @@ public:
_shown[3] = false;
_shown[4] = true;
- _objectState[0] = Object("Luke", Object::defaultDescription, HATCH1, OPENABLE | EXIT, 0, 6, 1, CABIN_L1, 15);
- _objectState[1] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | EXIT, 1, 7, 2, CABIN_L2, 10);
- _objectState[2] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | EXIT, 2, 8, 3, CABIN_L3, 5);
- _objectState[3] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | EXIT, 5, 11, 6, CABIN_R1, 19);
- _objectState[4] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | EXIT, 4, 10, 5, CABIN_R2, 14);
- _objectState[5] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | EXIT | OPENED, 9, 3, 4, CABIN_R3, 9);
- _objectState[6] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | CLOSED | EXIT, 12, 12, 0, AIRLOCK, 2);
- _objectState[7] = Object("Knopf", "Er geh\224rt zu der gro�en Luke.", BUTTON, PRESS, 13, 13, 0, NULLROOM, 0);
- _objectState[8] = Object("Leiter", Object::defaultDescription, NULLOBJECT, NULLTYPE, 14, 14, 0, NULLROOM, 0);
- _objectState[9] = Object("Ausgang", Object::defaultDescription, NULLOBJECT, EXIT, 15, 15, 0, HALL, 22);
+ _objectState[0] = Object(_id, "Luke", Object::defaultDescription, HATCH1, OPENABLE | EXIT, 0, 6, 1, CABIN_L1, 15);
+ _objectState[1] = Object(_id, "Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | EXIT, 1, 7, 2, CABIN_L2, 10);
+ _objectState[2] = Object(_id, "Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | EXIT, 2, 8, 3, CABIN_L3, 5);
+ _objectState[3] = Object(_id, "Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | EXIT, 5, 11, 6, CABIN_R1, 19);
+ _objectState[4] = Object(_id, "Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | EXIT, 4, 10, 5, CABIN_R2, 14);
+ _objectState[5] = Object(_id, "Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | EXIT | OPENED, 9, 3, 4, CABIN_R3, 9);
+ _objectState[6] = Object(_id, "Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | CLOSED | EXIT, 12, 12, 0, AIRLOCK, 2);
+ _objectState[7] = Object(_id, "Knopf", "Er geh\224rt zu der gro\341en Luke.", BUTTON, PRESS, 13, 13, 0, NULLROOM, 0);
+ _objectState[8] = Object(_id, "Leiter", Object::defaultDescription, NULLOBJECT, NULLTYPE, 14, 14, 0, NULLROOM, 0);
+ _objectState[9] = Object(_id, "Ausgang", Object::defaultDescription, NULLOBJECT, EXIT, 15, 15, 0, HALL, 22);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -152,12 +152,12 @@ public:
_id = HALL;
_shown[0] = true;
- _objectState[0] = Object("Luke", "Sie f\204hrt ins Cockpit.", NULLOBJECT, OPENABLE | EXIT, 4, 5, 1, COCKPIT, 10);
- _objectState[1] = Object("Luke", "Sie f\204hrt zur K\201che.", KITCHEN_HATCH, OPENABLE | EXIT, 0, 0, 0, NULLROOM, 1);
- _objectState[2] = Object("Luke", "Sie f\204hrt zu den Tiefschlafkammern.", NULLOBJECT, OPENABLE | CLOSED | EXIT, 1, 1, 2, SLEEP, 8);
- _objectState[3] = Object("Schlitz", "Es ist ein Keycard-Leser.", SLEEP_SLOT, COMBINABLE, 2, 2, 0, NULLROOM, 0);
- _objectState[4] = Object("Leiter", Object::defaultDescription, NULLOBJECT, NULLTYPE, 3, SLEEP, 0, NULLROOM, 0);
- _objectState[5] = Object("Gang", Object::defaultDescription, NULLOBJECT, EXIT, 6, 6, 0, CORRIDOR, 19);
+ _objectState[0] = Object(_id, "Luke", "Sie f\204hrt ins Cockpit.", NULLOBJECT, OPENABLE | EXIT, 4, 5, 1, COCKPIT, 10);
+ _objectState[1] = Object(_id, "Luke", "Sie f\204hrt zur K\201che.", KITCHEN_HATCH, OPENABLE | EXIT, 0, 0, 0, NULLROOM, 1);
+ _objectState[2] = Object(_id, "Luke", "Sie f\204hrt zu den Tiefschlafkammern.", NULLOBJECT, OPENABLE | CLOSED | EXIT, 1, 1, 2, SLEEP, 8);
+ _objectState[3] = Object(_id, "Schlitz", "Es ist ein Keycard-Leser.", SLEEP_SLOT, COMBINABLE, 2, 2, 0, NULLROOM, 0);
+ _objectState[4] = Object(_id, "Leiter", Object::defaultDescription, NULLOBJECT, NULLTYPE, 3, SLEEP, 0, NULLROOM, 0);
+ _objectState[5] = Object(_id, "Gang", Object::defaultDescription, NULLOBJECT, EXIT, 6, 6, 0, CORRIDOR, 19);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -173,10 +173,10 @@ public:
_id = SLEEP;
_shown[0] = true;
- _objectState[0] = Object("Luke", "Dies ist eine der Tiefschlafkammern.", CABINS, NULLTYPE, 0, 0, 0, NULLROOM, 0);
- _objectState[1] = Object("Luke", "Dies ist eine der Tiefschlafkammern.", CABIN, NULLTYPE, 1, 1, 0, NULLROOM, 0);
- _objectState[2] = Object("Computer", Object::defaultDescription, COMPUTER, NULLTYPE, 2, 2, 0, NULLROOM, 0);
- _objectState[3] = Object("Ausgang", Object::defaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL, 22);
+ _objectState[0] = Object(_id, "Luke", "Dies ist eine der Tiefschlafkammern.", CABINS, NULLTYPE, 0, 0, 0, NULLROOM, 0);
+ _objectState[1] = Object(_id, "Luke", "Dies ist eine der Tiefschlafkammern.", CABIN, NULLTYPE, 1, 1, 0, NULLROOM, 0);
+ _objectState[2] = Object(_id, "Computer", Object::defaultDescription, COMPUTER, NULLTYPE, 2, 2, 0, NULLROOM, 0);
+ _objectState[3] = Object(_id, "Ausgang", Object::defaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL, 22);
_codeword_DE = "ZWEIUNDVIERZIG";
_codeword_EN = "FORTYTWO";
@@ -202,10 +202,10 @@ public:
_id = COCKPIT;
_shown[0] = true;
- _objectState[0] = Object("Instrumente", "Hmm, sieht ziemlich kompliziert aus.", INSTRUMENTS, NULLTYPE, 2, 2, 0, NULLROOM, 0);
- _objectState[1] = Object("Monitor", Object::defaultDescription, MONITOR, NULLTYPE, 0, 0, 0, NULLROOM, 0);
- _objectState[2] = Object("Monitor", "Dieser Monitor sagt dir nichts.", NULLOBJECT, TAKE, 1, 0, 0, NULLROOM, 0);
- _objectState[3] = Object("Ausgang", Object::defaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL, 22);
+ _objectState[0] = Object(_id, "Instrumente", "Hmm, sieht ziemlich kompliziert aus.", INSTRUMENTS, NULLTYPE, 2, 2, 0, NULLROOM, 0);
+ _objectState[1] = Object(_id, "Monitor", Object::defaultDescription, MONITOR, NULLTYPE, 0, 0, 0, NULLROOM, 0);
+ _objectState[2] = Object(_id, "Monitor", "Dieser Monitor sagt dir nichts.", NULLOBJECT, TAKE, 1, 0, 0, NULLROOM, 0);
+ _objectState[3] = Object(_id, "Ausgang", Object::defaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL, 22);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -231,18 +231,18 @@ public:
_shown[4] = true;
_shown[5] = true;
- _objectState[0] = Object("Bild", "Herb!", NULLOBJECT, UNNECESSARY, 5, 5, 0, NULLROOM, 0);
- _objectState[1] = Object("Bild", "Toll!", NULLOBJECT, UNNECESSARY, 6, 6, 0, NULLROOM, 0);
- _objectState[2] = Object("Bild", "Genial!", NULLOBJECT, UNNECESSARY, 7, 7, 0, NULLROOM, 0);
- _objectState[3] = Object("Magnete", "Damit werden Sachen auf|dem Tisch festgehalten.", NULLOBJECT, UNNECESSARY, 8, 8, 0, NULLROOM, 0);
- _objectState[4] = Object("Bild", "Es scheint noch nicht fertig zu sein.", NULLOBJECT, UNNECESSARY, 9, 9, 0);
- _objectState[5] = Object("Stift", "Ein Kugelschreiber.", PEN, TAKE | COMBINABLE, 10, 10, 5 | 128);
- _objectState[6] = Object("Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | OPENED | EXIT, 3, 3, 24 | 128, CORRIDOR, 9);
- _objectState[7] = Object("Schlitz", "Es ist ein Keycard-Leser.", NULLOBJECT, COMBINABLE, 0, 0, 0);
- _objectState[8] = Object("Schrank", Object::defaultDescription, NULLOBJECT, OPENABLE | CLOSED, 1, 1, 0);
- _objectState[9] = Object("Fach", Object::defaultDescription, NULLOBJECT, OPENABLE | CLOSED, 2, 2, 0);
- _objectState[10] = Object("Steckdose", Object::defaultDescription, SOCKET, COMBINABLE, 4, 4, 0);
- _objectState[11] = Object("Toilette", Object::defaultDescription, BATHROOM_DOOR, EXIT, 255, 255, 0, BATHROOM, 22);
+ _objectState[0] = Object(_id, "Bild", "Herb!", NULLOBJECT, UNNECESSARY, 5, 5, 0, NULLROOM, 0);
+ _objectState[1] = Object(_id, "Bild", "Toll!", NULLOBJECT, UNNECESSARY, 6, 6, 0, NULLROOM, 0);
+ _objectState[2] = Object(_id, "Bild", "Genial!", NULLOBJECT, UNNECESSARY, 7, 7, 0, NULLROOM, 0);
+ _objectState[3] = Object(_id, "Magnete", "Damit werden Sachen auf|dem Tisch festgehalten.", NULLOBJECT, UNNECESSARY, 8, 8, 0, NULLROOM, 0);
+ _objectState[4] = Object(_id, "Bild", "Es scheint noch nicht fertig zu sein.", NULLOBJECT, UNNECESSARY, 9, 9, 0);
+ _objectState[5] = Object(_id, "Stift", "Ein Kugelschreiber.", PEN, TAKE | COMBINABLE, 10, 10, 5 | 128);
+ _objectState[6] = Object(_id, "Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | OPENED | EXIT, 3, 3, 24 | 128, CORRIDOR, 9);
+ _objectState[7] = Object(_id, "Schlitz", "Es ist ein Keycard-Leser.", NULLOBJECT, COMBINABLE, 0, 0, 0);
+ _objectState[8] = Object(_id, "Schrank", Object::defaultDescription, NULLOBJECT, OPENABLE | CLOSED, 1, 1, 0);
+ _objectState[9] = Object(_id, "Fach", Object::defaultDescription, NULLOBJECT, OPENABLE | CLOSED, 2, 2, 0);
+ _objectState[10] = Object(_id, "Steckdose", Object::defaultDescription, SOCKET, COMBINABLE, 4, 4, 0);
+ _objectState[11] = Object(_id, "Toilette", Object::defaultDescription, BATHROOM_DOOR, EXIT, 255, 255, 0, BATHROOM, 22);
}
};
@@ -272,31 +272,31 @@ public:
_shown[15] = false;
_shown[16] = true;
- _objectState[0] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_KL1,COMBINABLE,31,31,0);
- _objectState[1] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_KL2,COMBINABLE,32,32,0);
- _objectState[2] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_KL3,COMBINABLE,33,33,0);
- _objectState[3] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_KL4,COMBINABLE,45,45,0);
- _objectState[4] = Object("Schrank",Object::defaultDescription,SHELF_L1,OPENABLE | CLOSED,25,26,17);
- _objectState[5] = Object("Pistole","Es ist keine Munition drin.",PISTOL,TAKE,39,39,20);
- _objectState[6] = Object("Fach",Object::defaultDescription,SHELF_L2,OPENABLE | CLOSED,27,28,18);
- _objectState[7] = Object("B\201cher","Lauter wissenschaftliche B\201cher.",NULLOBJECT,UNNECESSARY,40,40,0);
- _objectState[8] = Object("Fach",Object::defaultDescription,SHELF_L3,OPENABLE | CLOSED,29,30,19);
- _objectState[9] = Object("Kabelrolle","Da sind mindestens zwanzig Meter drauf.", SPOOL,TAKE | COMBINABLE,41,41,21);
- _objectState[10] = Object("Fach",Object::defaultDescription,SHELF_L4,OPENABLE | CLOSED,43,44,22);
- _objectState[11] = Object("Buch",Object::defaultDescription,BOOK2,TAKE,46,46,23);
- _objectState[12] = Object("Unterw\204sche","Ich habe keine Lust, in|der Unterw\204sche des|Commanders rumzuw\201hlen.",NULLOBJECT,UNNECESSARY,34,34,0);
- _objectState[13] = Object("Unterw\204sche","Ich habe keine Lust, in|der Unterw\204sche des|Commanders rumzuw\201hlen.",NULLOBJECT,UNNECESSARY,35,35,0);
- _objectState[14] = Object("Kleider",Object::defaultDescription,NULLOBJECT,UNNECESSARY,36,36,0);
- _objectState[15] = Object("Krimskram","Es ist nichts brauchbares dabei.",NULLOBJECT,UNNECESSARY,37,37,0);
- _objectState[16] = Object("Krimskram","Es ist nichts brauchbares dabei.",NULLOBJECT,UNNECESSARY,38,38,0);
- _objectState[17] = Object("Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",NULLOBJECT,UNNECESSARY,23,23,0);
- _objectState[18] = Object("Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
- _objectState[19] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,24 | 128,CORRIDOR,9);
- _objectState[20] = Object("Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
- _objectState[21] = Object("Schrank",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
- _objectState[22] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
- _objectState[23] = Object("Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
- _objectState[24] = Object("Ordner","Darauf steht \"Dienstanweisungen|zur Mission Supernova\".|Es steht nichts wichtiges drin.",NULLOBJECT,UNNECESSARY,49,49,0);
+ _objectState[0] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",SLOT_KL1,COMBINABLE,31,31,0);
+ _objectState[1] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",SLOT_KL2,COMBINABLE,32,32,0);
+ _objectState[2] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",SLOT_KL3,COMBINABLE,33,33,0);
+ _objectState[3] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",SLOT_KL4,COMBINABLE,45,45,0);
+ _objectState[4] = Object(_id, "Schrank",Object::defaultDescription,SHELF_L1,OPENABLE | CLOSED,25,26,17);
+ _objectState[5] = Object(_id, "Pistole","Es ist keine Munition drin.",PISTOL,TAKE,39,39,20);
+ _objectState[6] = Object(_id, "Fach",Object::defaultDescription,SHELF_L2,OPENABLE | CLOSED,27,28,18);
+ _objectState[7] = Object(_id, "B\201cher","Lauter wissenschaftliche B\201cher.",NULLOBJECT,UNNECESSARY,40,40,0);
+ _objectState[8] = Object(_id, "Fach",Object::defaultDescription,SHELF_L3,OPENABLE | CLOSED,29,30,19);
+ _objectState[9] = Object(_id, "Kabelrolle","Da sind mindestens zwanzig Meter drauf.", SPOOL,TAKE | COMBINABLE,41,41,21);
+ _objectState[10] = Object(_id, "Fach",Object::defaultDescription,SHELF_L4,OPENABLE | CLOSED,43,44,22);
+ _objectState[11] = Object(_id, "Buch",Object::defaultDescription,BOOK2,TAKE,46,46,23);
+ _objectState[12] = Object(_id, "Unterw\204sche","Ich habe keine Lust, in|der Unterw\204sche des|Commanders rumzuw\201hlen.",NULLOBJECT,UNNECESSARY,34,34,0);
+ _objectState[13] = Object(_id, "Unterw\204sche","Ich habe keine Lust, in|der Unterw\204sche des|Commanders rumzuw\201hlen.",NULLOBJECT,UNNECESSARY,35,35,0);
+ _objectState[14] = Object(_id, "Kleider",Object::defaultDescription,NULLOBJECT,UNNECESSARY,36,36,0);
+ _objectState[15] = Object(_id, "Krimskram","Es ist nichts brauchbares dabei.",NULLOBJECT,UNNECESSARY,37,37,0);
+ _objectState[16] = Object(_id, "Krimskram","Es ist nichts brauchbares dabei.",NULLOBJECT,UNNECESSARY,38,38,0);
+ _objectState[17] = Object(_id, "Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",NULLOBJECT,UNNECESSARY,23,23,0);
+ _objectState[18] = Object(_id, "Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
+ _objectState[19] = Object(_id, "Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,24 | 128,CORRIDOR,9);
+ _objectState[20] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
+ _objectState[21] = Object(_id, "Schrank",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
+ _objectState[22] = Object(_id, "Fach",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
+ _objectState[23] = Object(_id, "Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
+ _objectState[24] = Object(_id, "Ordner","Darauf steht \"Dienstanweisungen|zur Mission Supernova\".|Es steht nichts wichtiges drin.",NULLOBJECT,UNNECESSARY,49,49,0);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -324,23 +324,23 @@ public:
_shown[11] = false;
_shown[12] = true;
- _objectState[0] = Object("Poster","Ein Poster von \"Big Boss\".",NULLOBJECT,UNNECESSARY,11,11,0);
- _objectState[1] = Object("Poster","Ein Poster von \"Rock Desaster\".",NULLOBJECT,UNNECESSARY,12,12,0);
- _objectState[2] = Object("Box",Object::defaultDescription,NULLOBJECT,NULLTYPE,13,13,0);
- _objectState[3] = Object("Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",NULLOBJECT,UNNECESSARY,14,14,0);
- _objectState[4] = Object("Schallplatte","Die Platte ist von \"Big Boss\".",RECORD,TAKE | COMBINABLE,15,15,8 | 128);
- _objectState[5] = Object("Schallplattenst\204nder","Du hast jetzt keine Zeit, in|der Plattensammlung rumzust\224bern.",NULLOBJECT,UNNECESSARY,16,16,0);
- _objectState[6] = Object("Knopf",Object::defaultDescription,TURNTABLE_BUTTON,PRESS,22,22,0);
- _objectState[7] = Object("Plattenspieler","Sieht aus, als k�me|er aus dem Museum.",TURNTABLE,UNNECESSARY | COMBINABLE,17,17,0);
- _objectState[8] = Object("Leitung",Object::defaultDescription,WIRE,COMBINABLE,18,18,0);
- _objectState[9] = Object("Leitung",Object::defaultDescription,WIRE2,COMBINABLE,19,19,0);
- _objectState[10] = Object("Stecker",Object::defaultDescription,PLUG,COMBINABLE,20,20,0);
- _objectState[11] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,24 | 128,CORRIDOR,9);
- _objectState[12] = Object("Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
- _objectState[13] = Object("Schrank",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
- _objectState[14] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
- _objectState[15] = Object("Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
- _objectState[16] = Object("Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
+ _objectState[0] = Object(_id, "Poster","Ein Poster von \"Big Boss\".",NULLOBJECT,UNNECESSARY,11,11,0);
+ _objectState[1] = Object(_id, "Poster","Ein Poster von \"Rock Desaster\".",NULLOBJECT,UNNECESSARY,12,12,0);
+ _objectState[2] = Object(_id, "Box",Object::defaultDescription,NULLOBJECT,NULLTYPE,13,13,0);
+ _objectState[3] = Object(_id, "Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",NULLOBJECT,UNNECESSARY,14,14,0);
+ _objectState[4] = Object(_id, "Schallplatte","Die Platte ist von \"Big Boss\".",RECORD,TAKE | COMBINABLE,15,15,8 | 128);
+ _objectState[5] = Object(_id, "Schallplattenst\204nder","Du hast jetzt keine Zeit, in|der Plattensammlung rumzust\224bern.",NULLOBJECT,UNNECESSARY,16,16,0);
+ _objectState[6] = Object(_id, "Knopf",Object::defaultDescription,TURNTABLE_BUTTON,PRESS,22,22,0);
+ _objectState[7] = Object(_id, "Plattenspieler","Sieht aus, als k�me|er aus dem Museum.",TURNTABLE,UNNECESSARY | COMBINABLE,17,17,0);
+ _objectState[8] = Object(_id, "Leitung",Object::defaultDescription,WIRE,COMBINABLE,18,18,0);
+ _objectState[9] = Object(_id, "Leitung",Object::defaultDescription,WIRE2,COMBINABLE,19,19,0);
+ _objectState[10] = Object(_id, "Stecker",Object::defaultDescription,PLUG,COMBINABLE,20,20,0);
+ _objectState[11] = Object(_id, "Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,24 | 128,CORRIDOR,9);
+ _objectState[12] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
+ _objectState[13] = Object(_id, "Schrank",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
+ _objectState[14] = Object(_id, "Fach",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
+ _objectState[15] = Object(_id, "Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
+ _objectState[16] = Object(_id, "Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -358,15 +358,15 @@ public:
_shown[1] = true;
_shown[2] = true;
- _objectState[0] = Object("Bild","Manche Leute haben schon|einen komischen Geschmack.",NULLOBJECT,UNNECESSARY,5,5,0);
- _objectState[1] = Object("Zeichenger\204te","Auf dem Zettel sind lauter|unverst\204ndliche Skizzen und Berechnungen.|(Jedenfalls f\201r dich unverst\204ndlich.)",NULLOBJECT,UNNECESSARY,6,6,0);
- _objectState[2] = Object("Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",NULLOBJECT,UNNECESSARY,7,7,0);
- _objectState[3] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
- _objectState[4] = Object("Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
- _objectState[5] = Object("Schrank",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
- _objectState[6] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
- _objectState[7] = Object("Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
- _objectState[8] = Object("Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
+ _objectState[0] = Object(_id, "Bild","Manche Leute haben schon|einen komischen Geschmack.",NULLOBJECT,UNNECESSARY,5,5,0);
+ _objectState[1] = Object(_id, "Zeichenger\204te","Auf dem Zettel sind lauter|unverst\204ndliche Skizzen und Berechnungen.|(Jedenfalls f\201r dich unverst\204ndlich.)",NULLOBJECT,UNNECESSARY,6,6,0);
+ _objectState[2] = Object(_id, "Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",NULLOBJECT,UNNECESSARY,7,7,0);
+ _objectState[3] = Object(_id, "Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
+ _objectState[4] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
+ _objectState[5] = Object(_id, "Schrank",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
+ _objectState[6] = Object(_id, "Fach",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
+ _objectState[7] = Object(_id, "Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
+ _objectState[8] = Object(_id, "Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
}
};
@@ -385,15 +385,15 @@ public:
_shown[4] = true;
_shown[5] = true;
- _objectState[0] = Object("Schachspiel","Es macht wohl Spa\341, an|der Decke Schach zu spielen.",NULLOBJECT,UNNECESSARY,11,11,0);
- _objectState[1] = Object("Tennisschl\204ger","Fliegt Boris Becker auch mit?",NULLOBJECT,UNNECESSARY,8,8,0);
- _objectState[2] = Object("Tennisball","Toll!",NULLOBJECT,UNNECESSARY,9,9,0);
- _objectState[3] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
- _objectState[4] = Object("Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
- _objectState[5] = Object("Schrank",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
- _objectState[6] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
- _objectState[7] = Object("Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
- _objectState[8] = Object("Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
+ _objectState[0] = Object(_id, "Schachspiel","Es macht wohl Spa\341, an|der Decke Schach zu spielen.",NULLOBJECT,UNNECESSARY,11,11,0);
+ _objectState[1] = Object(_id, "Tennisschl\204ger","Fliegt Boris Becker auch mit?",NULLOBJECT,UNNECESSARY,8,8,0);
+ _objectState[2] = Object(_id, "Tennisball","Toll!",NULLOBJECT,UNNECESSARY,9,9,0);
+ _objectState[3] = Object(_id, "Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
+ _objectState[4] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
+ _objectState[5] = Object(_id, "Schrank",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
+ _objectState[6] = Object(_id, "Fach",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
+ _objectState[7] = Object(_id, "Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
+ _objectState[8] = Object(_id, "Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
}
};
@@ -422,30 +422,30 @@ public:
_shown[14] = false;
_shown[15] = true;
- _objectState[0] = Object("Schachspiel","Dein Magnetschachspiel. Schach war|schon immer deine Leidenschaft.",CHESS,TAKE | COMBINABLE,12,12,7 | 128);
- _objectState[1] = Object("Bett","Das ist dein Bett. Toll, nicht wahr?",NULLOBJECT,NULLTYPE,13,13,0);
- _objectState[2] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_K1,COMBINABLE,27,27,0);
- _objectState[3] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_K2,COMBINABLE,28,28,0);
- _objectState[4] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_K3,COMBINABLE,29,29,0);
- _objectState[5] = Object("Schlitz","Es ist ein Keycard-Leser.",SLOT_K4,COMBINABLE,30,30,0);
- _objectState[6] = Object("Fach","Das ist eins deiner drei F\204cher.",SHELF1,OPENABLE | CLOSED,14,18,9);
- _objectState[7] = Object("Alben","Deine Briefmarkensammlung.",NULLOBJECT,UNNECESSARY,14,14,0);
- _objectState[8] = Object("Fach","Das ist eins deiner drei F\204cher.",SHELF2,OPENABLE | CLOSED,15,19,10);
- _objectState[9] = Object("Seil","Es ist ungef\204hr 10 m lang und 4 cm dick.",ROPE,TAKE | COMBINABLE,15,15,12);
- _objectState[10] = Object("Schrank","Das ist dein Schrank.",SHELF3,OPENABLE | CLOSED,16,17,11);
- _objectState[11] = Object("Krimskram","Es ist nichts brauchbares dabei.",NULLOBJECT,UNNECESSARY,20,20,0);
- _objectState[12] = Object("Kleider","Es sind Standard-Weltraum-Klamotten.",NULLOBJECT,UNNECESSARY,21,21,0);
- _objectState[13] = Object("Unterw\204sche",Object::defaultDescription,NULLOBJECT,UNNECESSARY,22,22,0);
- _objectState[14] = Object("Str\201mpfe",Object::defaultDescription,NULLOBJECT,UNNECESSARY,23,23,0);
- _objectState[15] = Object("Fach","Das ist eins deiner drei F\204cher.",SHELF4,OPENABLE | CLOSED,24,25,13);
- _objectState[16] = Object("Buch","Es ist|\"Per Anhalter durch die Galaxis\"|von Douglas Adams.",BOOK,TAKE,26,26,14);
- _objectState[17] = Object("Discman","Es ist eine \"Mad Monkeys\"-CD darin.",DISCMAN,TAKE | COMBINABLE,33,33,16);
- _objectState[18] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | EXIT,3,3,15 | 128,CORRIDOR,5);
- _objectState[19] = Object("Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
- _objectState[20] = Object("Schrank",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
- _objectState[21] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
- _objectState[22] = Object("Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
- _objectState[23] = Object("Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
+ _objectState[0] = Object(_id, "Schachspiel","Dein Magnetschachspiel. Schach war|schon immer deine Leidenschaft.",CHESS,TAKE | COMBINABLE,12,12,7 | 128);
+ _objectState[1] = Object(_id, "Bett","Das ist dein Bett. Toll, nicht wahr?",NULLOBJECT,NULLTYPE,13,13,0);
+ _objectState[2] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",SLOT_K1,COMBINABLE,27,27,0);
+ _objectState[3] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",SLOT_K2,COMBINABLE,28,28,0);
+ _objectState[4] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",SLOT_K3,COMBINABLE,29,29,0);
+ _objectState[5] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",SLOT_K4,COMBINABLE,30,30,0);
+ _objectState[6] = Object(_id, "Fach","Das ist eins deiner drei F\204cher.",SHELF1,OPENABLE | CLOSED,14,18,9);
+ _objectState[7] = Object(_id, "Alben","Deine Briefmarkensammlung.",NULLOBJECT,UNNECESSARY,14,14,0);
+ _objectState[8] = Object(_id, "Fach","Das ist eins deiner drei F\204cher.",SHELF2,OPENABLE | CLOSED,15,19,10);
+ _objectState[9] = Object(_id, "Seil","Es ist ungef\204hr 10 m lang und 4 cm dick.",ROPE,TAKE | COMBINABLE,15,15,12);
+ _objectState[10] = Object(_id, "Schrank","Das ist dein Schrank.",SHELF3,OPENABLE | CLOSED,16,17,11);
+ _objectState[11] = Object(_id, "Krimskram","Es ist nichts brauchbares dabei.",NULLOBJECT,UNNECESSARY,20,20,0);
+ _objectState[12] = Object(_id, "Kleider","Es sind Standard-Weltraum-Klamotten.",NULLOBJECT,UNNECESSARY,21,21,0);
+ _objectState[13] = Object(_id, "Unterw\204sche",Object::defaultDescription,NULLOBJECT,UNNECESSARY,22,22,0);
+ _objectState[14] = Object(_id, "Str\201mpfe",Object::defaultDescription,NULLOBJECT,UNNECESSARY,23,23,0);
+ _objectState[15] = Object(_id, "Fach","Das ist eins deiner drei F\204cher.",SHELF4,OPENABLE | CLOSED,24,25,13);
+ _objectState[16] = Object(_id, "Buch","Es ist|\"Per Anhalter durch die Galaxis\"|von Douglas Adams.",BOOK,TAKE,26,26,14);
+ _objectState[17] = Object(_id, "Discman","Es ist eine \"Mad Monkeys\"-CD darin.",DISCMAN,TAKE | COMBINABLE,33,33,16);
+ _objectState[18] = Object(_id, "Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | EXIT,3,3,15 | 128,CORRIDOR,5);
+ _objectState[19] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
+ _objectState[20] = Object(_id, "Schrank",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
+ _objectState[21] = Object(_id, "Fach",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
+ _objectState[22] = Object(_id, "Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
+ _objectState[23] = Object(_id, "Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -462,9 +462,9 @@ public:
_id = BATHROOM;
_shown[0] = true;
- _objectState[0] = Object("Klo","Ein Klo mit Saugmechanismus.",TOILET,NULLTYPE,0,0,0);
- _objectState[1] = Object("Dusche",Object::defaultDescription,SHOWER,NULLTYPE,1,1,0);
- _objectState[2] = Object("Ausgang",Object::defaultDescription,BATHROOM_EXIT,EXIT,255,255,0,CABIN_R3,2);
+ _objectState[0] = Object(_id, "Klo","Ein Klo mit Saugmechanismus.",TOILET,NULLTYPE,0,0,0);
+ _objectState[1] = Object(_id, "Dusche",Object::defaultDescription,SHOWER,NULLTYPE,1,1,0);
+ _objectState[2] = Object(_id, "Ausgang",Object::defaultDescription,BATHROOM_EXIT,EXIT,255,255,0,CABIN_R3,2);
}
};
@@ -484,13 +484,13 @@ public:
_shown[5] = false;
_shown[6] = true;
- _objectState[0] = Object("Luke","Das ist eine Luke !!!",NULLOBJECT,EXIT | OPENABLE | OPENED | CLOSED,0,0,0,CORRIDOR,10);
- _objectState[1] = Object("Luke","Dies ist eine Luke !!!",NULLOBJECT,EXIT | OPENABLE | CLOSED,1,1,0,HOLD,14);
- _objectState[2] = Object("Knopf",Object::defaultDescription,BUTTON1,PRESS,2,2,0);
- _objectState[3] = Object("Knopf",Object::defaultDescription,BUTTON2,PRESS,3,3,0);
- _objectState[4] = Object("Helm","Es ist der Helm zum Raumanzug.",HELMET,TAKE,4,4,7);
- _objectState[5] = Object("Raumanzug","Der einzige Raumanzug, den die|anderen hiergelassen haben ...",SUIT,TAKE,5,5,8);
- _objectState[6] = Object("Versorgung","Es ist der Versorgungsteil zum Raumanzug.",LIFESUPPORT,TAKE,6,6,9);
+ _objectState[0] = Object(_id, "Luke","Das ist eine Luke !!!",NULLOBJECT,EXIT | OPENABLE | OPENED | CLOSED,0,0,0,CORRIDOR,10);
+ _objectState[1] = Object(_id, "Luke","Dies ist eine Luke !!!",NULLOBJECT,EXIT | OPENABLE | CLOSED,1,1,0,HOLD,14);
+ _objectState[2] = Object(_id, "Knopf",Object::defaultDescription,BUTTON1,PRESS,2,2,0);
+ _objectState[3] = Object(_id, "Knopf",Object::defaultDescription,BUTTON2,PRESS,3,3,0);
+ _objectState[4] = Object(_id, "Helm","Es ist der Helm zum Raumanzug.",HELMET,TAKE,4,4,7);
+ _objectState[5] = Object(_id, "Raumanzug","Der einzige Raumanzug, den die|anderen hiergelassen haben ...",SUIT,TAKE,5,5,8);
+ _objectState[6] = Object(_id, "Versorgung","Es ist der Versorgungsteil zum Raumanzug.",LIFESUPPORT,TAKE,6,6,9);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -507,18 +507,18 @@ public:
_id = HOLD;
_shown[0] = true;
- _objectState[0] = Object("",Object::defaultDescription,HOLD_WIRE,COMBINABLE,255,255,0);
- _objectState[1] = Object("Schrott","Da ist eine L\201sterklemme dran, die|noch ganz brauchbar aussieht.|Ich nehme sie mit.",SCRAP_LK,NULLTYPE,4,4,0);
- _objectState[2] = Object("L\201sterklemme",Object::defaultDescription,TERMINALSTRIP,COMBINABLE,255,255,0);
- _objectState[3] = Object("Schrott","Junge, Junge! Die Explosion hat ein|ganz sch\224nes Durcheinander angerichtet.",NULLOBJECT,NULLTYPE,5,5,0);
- _objectState[4] = Object("Reaktor","Das war einmal der Reaktor.",NULLOBJECT,NULLTYPE,6,6,0);
- _objectState[5] = Object("D\201se",Object::defaultDescription,NULLOBJECT,NULLTYPE,7,7,0);
- _objectState[6] = Object("blauer K\201rbis","Keine Ahnung, was das ist.",NULLOBJECT,NULLTYPE,8,8,0);
- _objectState[7] = Object("Luke",Object::defaultDescription,LANDINGMOD_OUTERHATCH,EXIT | OPENABLE,1,2,2,LANDINGMODULE,6);
- _objectState[8] = Object("Landef\204hre","Sie war eigentlich f\201r Bodenuntersuchungen|auf Arsano 3 gedacht.",NULLOBJECT,NULLTYPE,0,0,0);
- _objectState[9] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,AIRLOCK,22);
- _objectState[10] = Object("Luke","Sie f\201hrt nach drau\341en.",OUTERHATCH_TOP,EXIT | OPENABLE | OPENED,3,3,0,GENERATOR,8);
- _objectState[11] = Object("Generator","Er versorgt das Raumschiff mit Strom.",GENERATOR_TOP,EXIT,12,12,0,GENERATOR,8);
+ _objectState[0] = Object(_id, "",Object::defaultDescription,HOLD_WIRE,COMBINABLE,255,255,0);
+ _objectState[1] = Object(_id, "Schrott","Da ist eine L\201sterklemme dran, die|noch ganz brauchbar aussieht.|Ich nehme sie mit.",SCRAP_LK,NULLTYPE,4,4,0);
+ _objectState[2] = Object(_id, "L\201sterklemme",Object::defaultDescription,TERMINALSTRIP,COMBINABLE,255,255,0);
+ _objectState[3] = Object(_id, "Schrott","Junge, Junge! Die Explosion hat ein|ganz sch\224nes Durcheinander angerichtet.",NULLOBJECT,NULLTYPE,5,5,0);
+ _objectState[4] = Object(_id, "Reaktor","Das war einmal der Reaktor.",NULLOBJECT,NULLTYPE,6,6,0);
+ _objectState[5] = Object(_id, "D\201se",Object::defaultDescription,NULLOBJECT,NULLTYPE,7,7,0);
+ _objectState[6] = Object(_id, "blauer K\201rbis","Keine Ahnung, was das ist.",NULLOBJECT,NULLTYPE,8,8,0);
+ _objectState[7] = Object(_id, "Luke",Object::defaultDescription,LANDINGMOD_OUTERHATCH,EXIT | OPENABLE,1,2,2,LANDINGMODULE,6);
+ _objectState[8] = Object(_id, "Landef\204hre","Sie war eigentlich f\201r Bodenuntersuchungen|auf Arsano 3 gedacht.",NULLOBJECT,NULLTYPE,0,0,0);
+ _objectState[9] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,AIRLOCK,22);
+ _objectState[10] = Object(_id, "Luke","Sie f\201hrt nach drau\341en.",OUTERHATCH_TOP,EXIT | OPENABLE | OPENED,3,3,0,GENERATOR,8);
+ _objectState[11] = Object(_id, "Generator","Er versorgt das Raumschiff mit Strom.",GENERATOR_TOP,EXIT,12,12,0,GENERATOR,8);
_descriptionScrap = "Ein St\201ck Schrott.";
}
@@ -540,12 +540,12 @@ public:
_id = LANDINGMODULE;
_shown[0] = true;
- _objectState[0] = Object("Steckdose",Object::defaultDescription,LANDINGMOD_SOCKET,COMBINABLE,1,1,0);
- _objectState[1] = Object("Knopf","Es ist ein Sicherheitsknopf.|Er kann nur mit einem spitzen|Gegenstand gedr\201ckt werden.",LANDINGMOD_BUTTON,PRESS | COMBINABLE,2,2,0);
- _objectState[2] = Object("Monitor",Object::defaultDescription,LANDINGMOD_MONITOR,NULLTYPE,3,3,0);
- _objectState[3] = Object("Tastatur",Object::defaultDescription,KEYBOARD,NULLTYPE,4,4,0);
- _objectState[4] = Object("",Object::defaultDescription,LANDINGMOD_WIRE,COMBINABLE,255,255,0);
- _objectState[5] = Object("Luke",Object::defaultDescription,LANDINGMOD_HATCH,EXIT | OPENABLE | OPENED | COMBINABLE, 0,0,1 | 128,HOLD,10);
+ _objectState[0] = Object(_id, "Steckdose",Object::defaultDescription,LANDINGMOD_SOCKET,COMBINABLE,1,1,0);
+ _objectState[1] = Object(_id, "Knopf","Es ist ein Sicherheitsknopf.|Er kann nur mit einem spitzen|Gegenstand gedr\201ckt werden.",LANDINGMOD_BUTTON,PRESS | COMBINABLE,2,2,0);
+ _objectState[2] = Object(_id, "Monitor",Object::defaultDescription,LANDINGMOD_MONITOR,NULLTYPE,3,3,0);
+ _objectState[3] = Object(_id, "Tastatur",Object::defaultDescription,KEYBOARD,NULLTYPE,4,4,0);
+ _objectState[4] = Object(_id, "",Object::defaultDescription,LANDINGMOD_WIRE,COMBINABLE,255,255,0);
+ _objectState[5] = Object(_id, "Luke",Object::defaultDescription,LANDINGMOD_HATCH,EXIT | OPENABLE | OPENED | COMBINABLE, 0,0,1 | 128,HOLD,10);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -566,19 +566,19 @@ public:
_shown[4] = false;
_shown[5] = true;
- _objectState[0] = Object("langes Kabel mit Stecker",Object::defaultDescription,GENERATOR_WIRE,COMBINABLE,255,255,0);
- _objectState[1] = Object("leere Kabelrolle",Object::defaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
- _objectState[2] = Object("Keycard des Commanders","Hey, das ist die Keycard des Commanders!|Er mu\341 sie bei dem \201berst\201rzten|Aufbruch verloren haben.",KEYCARD2,COMBINABLE | TAKE,12,12,5 | 128);
- _objectState[3] = Object("Seil",Object::defaultDescription,GENERATOR_ROPE,COMBINABLE,255,255,0);
- _objectState[4] = Object("Luke","Sie f\201hrt nach drau\341en.",OUTERHATCH,EXIT | OPENABLE,1,2,1,OUTSIDE,22);
- _objectState[5] = Object("Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,3,3,0);
- _objectState[6] = Object("Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,4,4,0);
- _objectState[7] = Object("Klappe",Object::defaultDescription,TRAP,OPENABLE,5,6,2);
- _objectState[8] = Object("Leitung",Object::defaultDescription,NULLOBJECT,NULLTYPE,7,7,0);
- _objectState[9] = Object("Spannungmessger\204t",Object::defaultDescription,VOLTMETER,NULLTYPE,9,9,0,NULLROOM,0);
- _objectState[10] = Object("Klemme",Object::defaultDescription,CLIP,COMBINABLE,8,8,0);
- _objectState[11] = Object("Leitung","Sie f\201hrt vom Generator zum Spannungmessger\204t.",SHORT_WIRE,COMBINABLE,10,10,0);
- _objectState[12] = Object("Leiter",Object::defaultDescription,LADDER,EXIT,0,0,0,HOLD,1);
+ _objectState[0] = Object(_id, "langes Kabel mit Stecker",Object::defaultDescription,GENERATOR_WIRE,COMBINABLE,255,255,0);
+ _objectState[1] = Object(_id, "leere Kabelrolle",Object::defaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
+ _objectState[2] = Object(_id, "Keycard des Commanders","Hey, das ist die Keycard des Commanders!|Er mu\341 sie bei dem \201berst\201rzten|Aufbruch verloren haben.",KEYCARD2,COMBINABLE | TAKE,12,12,5 | 128);
+ _objectState[3] = Object(_id, "Seil",Object::defaultDescription,GENERATOR_ROPE,COMBINABLE,255,255,0);
+ _objectState[4] = Object(_id, "Luke","Sie f\201hrt nach drau\341en.",OUTERHATCH,EXIT | OPENABLE,1,2,1,OUTSIDE,22);
+ _objectState[5] = Object(_id, "Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,3,3,0);
+ _objectState[6] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,4,4,0);
+ _objectState[7] = Object(_id, "Klappe",Object::defaultDescription,TRAP,OPENABLE,5,6,2);
+ _objectState[8] = Object(_id, "Leitung",Object::defaultDescription,NULLOBJECT,NULLTYPE,7,7,0);
+ _objectState[9] = Object(_id, "Spannungmessger\204t",Object::defaultDescription,VOLTMETER,NULLTYPE,9,9,0,NULLROOM,0);
+ _objectState[10] = Object(_id, "Klemme",Object::defaultDescription,CLIP,COMBINABLE,8,8,0);
+ _objectState[11] = Object(_id, "Leitung","Sie f\201hrt vom Generator zum Spannungmessger\204t.",SHORT_WIRE,COMBINABLE,10,10,0);
+ _objectState[12] = Object(_id, "Leiter",Object::defaultDescription,LADDER,EXIT,0,0,0,HOLD,1);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -594,8 +594,8 @@ public:
_id = OUTSIDE;
_shown[0] = true;
- _objectState[0] = Object("Luke",Object::defaultDescription,NULLOBJECT,EXIT,0,0,0,GENERATOR,3);
- _objectState[1] = Object("Seil",Object::defaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
+ _objectState[0] = Object(_id, "Luke",Object::defaultDescription,NULLOBJECT,EXIT,0,0,0,GENERATOR,3);
+ _objectState[1] = Object(_id, "Seil",Object::defaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
}
};
@@ -609,10 +609,10 @@ public:
_fileNumber = 12;
_shown[0] = true;
- _objectState[0] = Object("Seil",Object::defaultDescription,NULLOBJECT,UNNECESSARY | EXIT,0,0,0,GENERATOR,12);
- _objectState[1] = Object("Stein",Object::defaultDescription,STONE,NULLTYPE,1,1,0);
- _objectState[2] = Object("Stein",Object::defaultDescription,NULLOBJECT,NULLTYPE,2,2,0);
- _objectState[3] = Object("Loch","Es scheint eine H\224hle zu sein.",NULLOBJECT,NULLTYPE,255,255,0,CAVE,1);
+ _objectState[0] = Object(_id, "Seil",Object::defaultDescription,NULLOBJECT,UNNECESSARY | EXIT,0,0,0,GENERATOR,12);
+ _objectState[1] = Object(_id, "Stein",Object::defaultDescription,STONE,NULLTYPE,1,1,0);
+ _objectState[2] = Object(_id, "Stein",Object::defaultDescription,NULLOBJECT,NULLTYPE,2,2,0);
+ _objectState[3] = Object(_id, "Loch","Es scheint eine H\224hle zu sein.",NULLOBJECT,NULLTYPE,255,255,0,CAVE,1);
}
virtual void onEntrance();
@@ -628,8 +628,8 @@ public:
_id = CAVE;
_shown[0] = false;
- _objectState[0] = Object("Ausgang","Hier bist du gerade hergekommen.",NULLOBJECT,EXIT,255,255,0,ROCKS,22);
- _objectState[1] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,MEETUP,2);
+ _objectState[0] = Object(_id, "Ausgang","Hier bist du gerade hergekommen.",NULLOBJECT,EXIT,255,255,0,ROCKS,22);
+ _objectState[1] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,MEETUP,2);
}
};
class ArsanoMeetup : public Room {
@@ -642,12 +642,12 @@ public:
_id = MEETUP;
_shown[0] = true;
- _objectState[0] = Object("H\224hle",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
- _objectState[1] = Object("Schild","Diese Schrift kannst du nicht lesen.",MEETUP_SIGN,NULLTYPE,0,0,0);
- _objectState[2] = Object("Eingang",Object::defaultDescription,DOOR,EXIT,1,1,0,ENTRANCE,7);
- _objectState[3] = Object("Stern",Object::defaultDescription,STAR,NULLTYPE,2,2,0);
- _objectState[4] = Object("Raumschiff",Object::defaultDescription,SPACESHIPS,COMBINABLE,3,3,0);
- _objectState[5] = Object("Raumschiff",Object::defaultDescription,SPACESHIP,COMBINABLE,4,4,0);
+ _objectState[0] = Object(_id, "H\224hle",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
+ _objectState[1] = Object(_id, "Schild","Diese Schrift kannst du nicht lesen.",MEETUP_SIGN,NULLTYPE,0,0,0);
+ _objectState[2] = Object(_id, "Eingang",Object::defaultDescription,DOOR,EXIT,1,1,0,ENTRANCE,7);
+ _objectState[3] = Object(_id, "Stern",Object::defaultDescription,STAR,NULLTYPE,2,2,0);
+ _objectState[4] = Object(_id, "Raumschiff",Object::defaultDescription,SPACESHIPS,COMBINABLE,3,3,0);
+ _objectState[5] = Object(_id, "Raumschiff",Object::defaultDescription,SPACESHIP,COMBINABLE,4,4,0);
}
virtual void onEntrance();
@@ -668,24 +668,24 @@ public:
_id = ENTRANCE;
_shown[0] = true;
- _objectState[0] = Object("Portier","Du siehst doch selbst, wie er aussieht.",PORTER,TALK,0,0,0);
- _objectState[1] = Object("T\201r",Object::defaultDescription,NULLOBJECT,EXIT | OPENABLE | CLOSED,1,1,0,NULLROOM,5);
- _objectState[2] = Object("Schild","Diese Schrift kannst du nicht lesen.",KITCHEN_SIGN,NULLTYPE,2,2,0);
- _objectState[3] = Object("Kaugummi",Object::defaultDescription,SCHNUCK,TAKE,255,255,10+128);
- _objectState[4] = Object("Gummib\204rchen",Object::defaultDescription,SCHNUCK,TAKE,255,255,11+128);
- _objectState[5] = Object("Schokokugel",Object::defaultDescription,SCHNUCK,TAKE,255,255,12+128);
- _objectState[6] = Object("\232berraschungsei",Object::defaultDescription,EGG,TAKE,255,255,13+128);
- _objectState[7] = Object("Lakritz",Object::defaultDescription,SCHNUCK,TAKE,255,255,14+128);
- _objectState[8] = Object("Tablette","Die Plastikh\201lle zeigt einen|Mund mit einer Sprechblase. Was|darin steht, kannst du nicht lesen.",PILL,TAKE,255,255,0);
- _objectState[9] = Object("Schlitz",Object::defaultDescription,CAR_SLOT,COMBINABLE,6,6,0);
- _objectState[10] = Object("Automat","Sieht aus wie ein Kaugummiautomat.",NULLOBJECT,NULLTYPE,5,5,0);
- _objectState[11] = Object("Toilette","Die Toiletten sind denen|auf der Erde sehr \204hnlich.",ARSANO_BATHROOM,NULLTYPE,255,255,0);
- _objectState[12] = Object("Knopf",Object::defaultDescription,BATHROOM_BUTTON,PRESS,3,3,0);
- _objectState[13] = Object("Schild","Diese Schrift kannst du nicht lesen.",BATHROOM_SIGN,NULLTYPE,4,4,0);
- _objectState[14] = Object("Treppe",Object::defaultDescription,STAIRCASE,EXIT,8,8,0,REST,3);
- _objectState[15] = Object("Ausgang",Object::defaultDescription,MEETUP_EXIT,EXIT,255,255,0,MEETUP,22);
- _objectState[16] = Object("M\201nzen","Es sind seltsame|K\224pfe darauf abgebildet.",COINS,TAKE|COMBINABLE,255,255,0);
- _objectState[17] = Object("Tablettenh\201lle","Darauf steht:\"Wenn Sie diese|Schrift jetzt lesen k\224nnen,|hat die Tablette gewirkt.\"",PILL_HULL,TAKE,255,255,0);
+ _objectState[0] = Object(_id, "Portier","Du siehst doch selbst, wie er aussieht.",PORTER,TALK,0,0,0);
+ _objectState[1] = Object(_id, "T\201r",Object::defaultDescription,NULLOBJECT,EXIT | OPENABLE | CLOSED,1,1,0,NULLROOM,5);
+ _objectState[2] = Object(_id, "Schild","Diese Schrift kannst du nicht lesen.",KITCHEN_SIGN,NULLTYPE,2,2,0);
+ _objectState[3] = Object(_id, "Kaugummi",Object::defaultDescription,SCHNUCK,TAKE,255,255,10+128);
+ _objectState[4] = Object(_id, "Gummib\204rchen",Object::defaultDescription,SCHNUCK,TAKE,255,255,11+128);
+ _objectState[5] = Object(_id, "Schokokugel",Object::defaultDescription,SCHNUCK,TAKE,255,255,12+128);
+ _objectState[6] = Object(_id, "\232berraschungsei",Object::defaultDescription,EGG,TAKE,255,255,13+128);
+ _objectState[7] = Object(_id, "Lakritz",Object::defaultDescription,SCHNUCK,TAKE,255,255,14+128);
+ _objectState[8] = Object(_id, "Tablette","Die Plastikh\201lle zeigt einen|Mund mit einer Sprechblase. Was|darin steht, kannst du nicht lesen.",PILL,TAKE,255,255,0);
+ _objectState[9] = Object(_id, "Schlitz",Object::defaultDescription,CAR_SLOT,COMBINABLE,6,6,0);
+ _objectState[10] = Object(_id, "Automat","Sieht aus wie ein Kaugummiautomat.",NULLOBJECT,NULLTYPE,5,5,0);
+ _objectState[11] = Object(_id, "Toilette","Die Toiletten sind denen|auf der Erde sehr \204hnlich.",ARSANO_BATHROOM,NULLTYPE,255,255,0);
+ _objectState[12] = Object(_id, "Knopf",Object::defaultDescription,BATHROOM_BUTTON,PRESS,3,3,0);
+ _objectState[13] = Object(_id, "Schild","Diese Schrift kannst du nicht lesen.",BATHROOM_SIGN,NULLTYPE,4,4,0);
+ _objectState[14] = Object(_id, "Treppe",Object::defaultDescription,STAIRCASE,EXIT,8,8,0,REST,3);
+ _objectState[15] = Object(_id, "Ausgang",Object::defaultDescription,MEETUP_EXIT,EXIT,255,255,0,MEETUP,22);
+ _objectState[16] = Object(_id, "M\201nzen","Es sind seltsame|K\224pfe darauf abgebildet.",COINS,TAKE|COMBINABLE,255,255,0);
+ _objectState[17] = Object(_id, "Tablettenh\201lle","Darauf steht:\"Wenn Sie diese|Schrift jetzt lesen k\224nnen,|hat die Tablette gewirkt.\"",PILL_HULL,TAKE,255,255,0);
_dialog1[0] = "Wieso das denn nicht?";
_dialog1[1] = "Wo bin ich hier?";
@@ -724,9 +724,9 @@ public:
_id = REST;
_shown[0] = true;
- _objectState[0] = Object("Treppe",Object::defaultDescription,NULLOBJECT,EXIT,0,0,0,ENTRANCE,17);
- _objectState[1] = Object("Stuhl",Object::defaultDescription,NULLOBJECT,EXIT,1,1,0,ROGER,2);
- _objectState[2] = Object("Schuhe","Wie ist der denn mit|Schuhen hier reingekommen?",NULLOBJECT,NULLTYPE,2,2,0);
+ _objectState[0] = Object(_id, "Treppe",Object::defaultDescription,NULLOBJECT,EXIT,0,0,0,ENTRANCE,17);
+ _objectState[1] = Object(_id, "Stuhl",Object::defaultDescription,NULLOBJECT,EXIT,1,1,0,ROGER,2);
+ _objectState[2] = Object(_id, "Schuhe","Wie ist der denn mit|Schuhen hier reingekommen?",NULLOBJECT,NULLTYPE,2,2,0);
_chewing = true;
}
@@ -747,15 +747,15 @@ public:
_id = ROGER;
_shown[0] = true;
- _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,REST,19);
- _objectState[1] = Object("Froschgesicht",Object::defaultDescription,ROGER_W,TALK,0,0,0);
- _objectState[2] = Object("Gekritzel","\"Mr Spock was here\"",NULLOBJECT,NULLTYPE,3,3,0);
- _objectState[3] = Object("Brieftasche",Object::defaultDescription,WALLET,TAKE,1,1,4);
- _objectState[4] = Object("Speisekarte","\"Heute empfehlen wir:|Fonua Opra mit Ulk.\"",NULLOBJECT,UNNECESSARY,2,2,0);
- _objectState[5] = Object("Tasse","Sie enth\204lt eine gr\201nliche Fl\201ssigkeit.",CUP,UNNECESSARY,4,4,0);
- _objectState[6] = Object("Schachspiel",Object::defaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
- _objectState[7] = Object("10-Buckazoid-Schein","Nicht gerade sehr viel Geld.",NULLOBJECT,TAKE|COMBINABLE,255,255,0);
- _objectState[8] = Object("Keycard von Roger",Object::defaultDescription,KEYCARD_R,TAKE|COMBINABLE,255,255,0);
+ _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,REST,19);
+ _objectState[1] = Object(_id, "Froschgesicht",Object::defaultDescription,ROGER_W,TALK,0,0,0);
+ _objectState[2] = Object(_id, "Gekritzel","\"Mr Spock was here\"",NULLOBJECT,NULLTYPE,3,3,0);
+ _objectState[3] = Object(_id, "Brieftasche",Object::defaultDescription,WALLET,TAKE,1,1,4);
+ _objectState[4] = Object(_id, "Speisekarte","\"Heute empfehlen wir:|Fonua Opra mit Ulk.\"",NULLOBJECT,UNNECESSARY,2,2,0);
+ _objectState[5] = Object(_id, "Tasse","Sie enth\204lt eine gr\201nliche Fl\201ssigkeit.",CUP,UNNECESSARY,4,4,0);
+ _objectState[6] = Object(_id, "Schachspiel",Object::defaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
+ _objectState[7] = Object(_id, "10-Buckazoid-Schein","Nicht gerade sehr viel Geld.",NULLOBJECT,TAKE|COMBINABLE,255,255,0);
+ _objectState[8] = Object(_id, "Keycard von Roger",Object::defaultDescription,KEYCARD_R,TAKE|COMBINABLE,255,255,0);
_dialog1[0] = "K\224nnten Sie mir ein Gericht empfehlen?";
_dialog1[1] = "Wie lange dauert es denn noch bis zur Supernova?";
@@ -784,17 +784,17 @@ public:
_id = GLIDER;
_shown[0] = true;
- _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,MEETUP,15);
- _objectState[1] = Object("Knopf",Object::defaultDescription,GLIDER_BUTTON1,PRESS,0,0,0);
- _objectState[2] = Object("Knopf",Object::defaultDescription,GLIDER_BUTTON2,PRESS,1,1,0);
- _objectState[3] = Object("Knopf",Object::defaultDescription,GLIDER_BUTTON3,PRESS,2,2,0);
- _objectState[4] = Object("Knopf",Object::defaultDescription,GLIDER_BUTTON4,PRESS,3,3,0);
- _objectState[5] = Object("Keycard von Roger",Object::defaultDescription,GLIDER_KEYCARD,TAKE|COMBINABLE,255,255,0);
- _objectState[6] = Object("Schlitz",Object::defaultDescription,GLIDER_SLOT,COMBINABLE,4,4,0);
- _objectState[7] = Object("Fach",Object::defaultDescription,NULLOBJECT,OPENABLE,5,6,6);
- _objectState[8] = Object("Tastatur",Object::defaultDescription,GLIDER_BUTTONS,NULLTYPE,7,7,0);
- _objectState[9] = Object("Anzeige","Hmm, seltsame Anzeigen.",GLIDER_DISPLAY,NULLTYPE,8,8,0);
- _objectState[10] = Object("Instrumente","Hmm, seltsame Anzeigen.",GLIDER_INSTRUMENTS,NULLTYPE,9,9,0);
+ _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,MEETUP,15);
+ _objectState[1] = Object(_id, "Knopf",Object::defaultDescription,GLIDER_BUTTON1,PRESS,0,0,0);
+ _objectState[2] = Object(_id, "Knopf",Object::defaultDescription,GLIDER_BUTTON2,PRESS,1,1,0);
+ _objectState[3] = Object(_id, "Knopf",Object::defaultDescription,GLIDER_BUTTON3,PRESS,2,2,0);
+ _objectState[4] = Object(_id, "Knopf",Object::defaultDescription,GLIDER_BUTTON4,PRESS,3,3,0);
+ _objectState[5] = Object(_id, "Keycard von Roger",Object::defaultDescription,GLIDER_KEYCARD,TAKE|COMBINABLE,255,255,0);
+ _objectState[6] = Object(_id, "Schlitz",Object::defaultDescription,GLIDER_SLOT,COMBINABLE,4,4,0);
+ _objectState[7] = Object(_id, "Fach",Object::defaultDescription,NULLOBJECT,OPENABLE,5,6,6);
+ _objectState[8] = Object(_id, "Tastatur",Object::defaultDescription,GLIDER_BUTTONS,NULLTYPE,7,7,0);
+ _objectState[9] = Object(_id, "Anzeige","Hmm, seltsame Anzeigen.",GLIDER_DISPLAY,NULLTYPE,8,8,0);
+ _objectState[10] = Object(_id, "Instrumente","Hmm, seltsame Anzeigen.",GLIDER_INSTRUMENTS,NULLTYPE,9,9,0);
}
virtual void animation();
@@ -813,9 +813,9 @@ public:
_id = MEETUP2;
_shown[0] = true;
- _objectState[0] = Object("Roger W.",Object::defaultDescription,ROGER_W,TALK,255,255,0);
- _objectState[1] = Object("Raumschiff",Object::defaultDescription,SPACESHIP,COMBINABLE,255,255,0);
- _objectState[2] = Object("Höhle",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
+ _objectState[0] = Object(_id, "Roger W.",Object::defaultDescription,ROGER_W,TALK,255,255,0);
+ _objectState[1] = Object(_id, "Raumschiff",Object::defaultDescription,SPACESHIP,COMBINABLE,255,255,0);
+ _objectState[2] = Object(_id, "Höhle",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
_dialog1[0] = "Ach, Ihnen geh\224rt die. Ich habe sie eben im Sand gefunden.";
_dialog1[1] = "Nein, tut mir leid.";
@@ -851,9 +851,9 @@ public:
_id = MEETUP3;
_shown[0] = true;
- _objectState[0] = Object("Ufo","Der Eingang scheint offen zu sein.",UFO,EXIT,0,0,0,NULLROOM,3);
- _objectState[1] = Object("Stern",Object::defaultDescription,STAR,NULLTYPE,1,1,0);
- _objectState[2] = Object("H\224hle",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
+ _objectState[0] = Object(_id, "Ufo","Der Eingang scheint offen zu sein.",UFO,EXIT,0,0,0,NULLROOM,3);
+ _objectState[1] = Object(_id, "Stern",Object::defaultDescription,STAR,NULLTYPE,1,1,0);
+ _objectState[2] = Object(_id, "H\224hle",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
_dialog2[0] = "Wo bin ich hier?";
_dialog2[1] = "Was wollen Sie von mir?";
@@ -912,16 +912,16 @@ public:
_shown[30] = false;
_shown[31] = true;
- _objectState[0] = Object("Knopf",Object::defaultDescription,CELL_BUTTON,PRESS,1,1,0);
- _objectState[1] = Object("T\201r",Object::defaultDescription,CELL_DOOR,EXIT|OPENABLE|CLOSED,0,0,31+128,CORRIDOR4,1);
- _objectState[2] = Object("Tablett","Es ist irgendein Fra\341 und|etwas zu Trinken darauf.",TRAY,UNNECESSARY,255,255,0);
- _objectState[3] = Object("Stange","Es scheint eine Lampe zu sein.",NULLOBJECT,COMBINABLE,3,3,0);
- _objectState[4] = Object("Augen","Es ist nur ein Bild.",NULLOBJECT,NULLTYPE,4,4,0);
- _objectState[5] = Object("Leitung",Object::defaultDescription,CELL_WIRE,COMBINABLE|TAKE,6,6,0);
- _objectState[6] = Object("Steckdose","Sieht etwas anders aus als auf der Erde.",SOCKET,COMBINABLE,5,5,0);
- _objectState[7] = Object("Metallblock","Er ist ziemlich schwer.",MAGNET,TAKE|COMBINABLE,255,255,30);
- _objectState[8] = Object("Roboter","Den hast du erledigt.",NULLOBJECT,NULLTYPE,255,255,0);
- _objectState[9] = Object("Tisch","Ein kleiner Metalltisch.",CELL_TABLE,COMBINABLE,2,2,0);
+ _objectState[0] = Object(_id, "Knopf",Object::defaultDescription,CELL_BUTTON,PRESS,1,1,0);
+ _objectState[1] = Object(_id, "T\201r",Object::defaultDescription,CELL_DOOR,EXIT|OPENABLE|CLOSED,0,0,31+128,CORRIDOR4,1);
+ _objectState[2] = Object(_id, "Tablett","Es ist irgendein Fra\341 und|etwas zu Trinken darauf.",TRAY,UNNECESSARY,255,255,0);
+ _objectState[3] = Object(_id, "Stange","Es scheint eine Lampe zu sein.",NULLOBJECT,COMBINABLE,3,3,0);
+ _objectState[4] = Object(_id, "Augen","Es ist nur ein Bild.",NULLOBJECT,NULLTYPE,4,4,0);
+ _objectState[5] = Object(_id, "Leitung",Object::defaultDescription,CELL_WIRE,COMBINABLE|TAKE,6,6,0);
+ _objectState[6] = Object(_id, "Steckdose","Sieht etwas anders aus als auf der Erde.",SOCKET,COMBINABLE,5,5,0);
+ _objectState[7] = Object(_id, "Metallblock","Er ist ziemlich schwer.",MAGNET,TAKE|COMBINABLE,255,255,30);
+ _objectState[8] = Object(_id, "Roboter","Den hast du erledigt.",NULLOBJECT,NULLTYPE,255,255,0);
+ _objectState[9] = Object(_id, "Tisch","Ein kleiner Metalltisch.",CELL_TABLE,COMBINABLE,2,2,0);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -963,8 +963,8 @@ public:
_shown[24] = false;
_shown[25] = true;
- _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,GUARD3,2);
- _objectState[1] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR2,22);
+ _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,GUARD3,2);
+ _objectState[1] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR2,22);
}
virtual void onEntrance();
@@ -1003,9 +1003,9 @@ public:
_shown[23] = false;
_shown[24] = true;
- _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR1,2);
- _objectState[1] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR3,22);
- _objectState[2] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,1,1,0,CORRIDOR4,14);
+ _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR1,2);
+ _objectState[1] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR3,22);
+ _objectState[2] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,1,1,0,CORRIDOR4,14);
}
virtual void onEntrance();
@@ -1043,7 +1043,7 @@ public:
_shown[22] = false;
_shown[23] = true;
- _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR2,2);
+ _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR2,2);
}
virtual void onEntrance();
@@ -1084,12 +1084,12 @@ public:
_shown[25] = false;
_shown[26] = true;
- _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,0,0,0,CORRIDOR2,10);
- _objectState[1] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,1,1,0,GUARD,14);
- _objectState[2] = Object("Zellent\201r","Hier warst du eingesperrt.",DOOR,EXIT|OPENABLE|OPENED|CLOSED,7,7,0,CELL,16);
- _objectState[3] = Object("Laptop",Object::defaultDescription,NEWSPAPER,TAKE,6,6,8);
- _objectState[4] = Object("Armbanduhr",Object::defaultDescription,WATCH,TAKE|COMBINABLE,255,255,8);
- _objectState[5] = Object("Tisch",Object::defaultDescription,TABLE,COMBINABLE,5,5,0);
+ _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,0,0,0,CORRIDOR2,10);
+ _objectState[1] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,1,1,0,GUARD,14);
+ _objectState[2] = Object(_id, "Zellent\201r","Hier warst du eingesperrt.",DOOR,EXIT|OPENABLE|OPENED|CLOSED,7,7,0,CELL,16);
+ _objectState[3] = Object(_id, "Laptop",Object::defaultDescription,NEWSPAPER,TAKE,6,6,8);
+ _objectState[4] = Object(_id, "Armbanduhr",Object::defaultDescription,WATCH,TAKE|COMBINABLE,255,255,8);
+ _objectState[5] = Object(_id, "Tisch",Object::defaultDescription,TABLE,COMBINABLE,5,5,0);
}
virtual void onEntrance();
@@ -1130,8 +1130,8 @@ public:
_shown[23] = true;
_shown[24] = true;
- _objectState[0] = Object("Ausgang",Object::defaultDescription,DOOR,EXIT,2,2,0,NULLROOM,2);
- _objectState[1] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR6,22);
+ _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,DOOR,EXIT,2,2,0,NULLROOM,2);
+ _objectState[1] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR6,22);
_dialog1[0] = "\216h ... nein, mein Name ist M\201ller.";
_dialog1[1] = "Oh, ich habe mich im Gang vertan.";
@@ -1186,9 +1186,9 @@ public:
_shown[24] = true;
_shown[25] = true;
- _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR5,2);
- _objectState[1] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR7,22);
- _objectState[2] = Object("T\201r",Object::defaultDescription,DOOR,OPENABLE|CLOSED,255,255,0,CORRIDOR8,13);
+ _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR5,2);
+ _objectState[1] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR7,22);
+ _objectState[2] = Object(_id, "T\201r",Object::defaultDescription,DOOR,OPENABLE|CLOSED,255,255,0,CORRIDOR8,13);
}
virtual void onEntrance();
@@ -1229,8 +1229,8 @@ public:
_shown[24] = true;
_shown[25] = true;
- _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR6,2);
- _objectState[1] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,GUARD,22);
+ _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR6,2);
+ _objectState[1] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,GUARD,22);
}
virtual void onEntrance();
@@ -1273,8 +1273,8 @@ public:
_shown[27] = false;
_shown[28] = true;
- _objectState[0] = Object("T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE,0,0,0,CORRIDOR6,10);
- _objectState[1] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,BCORRIDOR,22);
+ _objectState[0] = Object(_id, "T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE,0,0,0,CORRIDOR6,10);
+ _objectState[1] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,BCORRIDOR,22);
}
virtual void onEntrance();
@@ -1318,8 +1318,8 @@ public:
_shown[27] = false;
_shown[28] = true;
- _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,BCORRIDOR,2);
- _objectState[1] = Object("T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE,0,0,0,GUARD,10);
+ _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,BCORRIDOR,2);
+ _objectState[1] = Object(_id, "T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE,0,0,0,GUARD,10);
}
virtual void onEntrance();
@@ -1338,14 +1338,14 @@ public:
_shown[2] = false;
_shown[3] = true;
- _objectState[0] = Object("S\204ule",Object::defaultDescription,PILLAR1,NULLTYPE,4,4,0);
- _objectState[1] = Object("S\204ule",Object::defaultDescription,PILLAR2,NULLTYPE,5,5,0);
- _objectState[2] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,6,6,0,CORRIDOR8,2);
- _objectState[3] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,7,7,0,CORRIDOR9,22);
- _objectState[4] = Object("T\201r","Auf einem Schild an der T\201r steht \"Dr. Alab Hansi\".",DOOR1,EXIT|OPENABLE|CLOSED|OCCUPIED,0,0,1,OFFICE_L1,6);
- _objectState[5] = Object("T\201r","Auf einem Schild an der T\201r steht \"Saval Lun\".",DOOR2,EXIT|OPENABLE|CLOSED|OCCUPIED,1,1,2,OFFICE_L2,16);
- _objectState[6] = Object("T\201r","Auf einem Schild an der T\201r steht \"Prof. Dr. Ugnul Tschabb\".",DOOR3,EXIT|OPENABLE|OPENED,2,2,3,OFFICE_R1,8);
- _objectState[7] = Object("T\201r","Auf einem Schild an der T\201r steht \"Alga Hurz Li\".",DOOR4,EXIT|OPENABLE|CLOSED|OCCUPIED,3,3,4,OFFICE_R2,18);
+ _objectState[0] = Object(_id, "S\204ule",Object::defaultDescription,PILLAR1,NULLTYPE,4,4,0);
+ _objectState[1] = Object(_id, "S\204ule",Object::defaultDescription,PILLAR2,NULLTYPE,5,5,0);
+ _objectState[2] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,6,6,0,CORRIDOR8,2);
+ _objectState[3] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,7,7,0,CORRIDOR9,22);
+ _objectState[4] = Object(_id, "T\201r","Auf einem Schild an der T\201r steht \"Dr. Alab Hansi\".",DOOR1,EXIT|OPENABLE|CLOSED|OCCUPIED,0,0,1,OFFICE_L1,6);
+ _objectState[5] = Object(_id, "T\201r","Auf einem Schild an der T\201r steht \"Saval Lun\".",DOOR2,EXIT|OPENABLE|CLOSED|OCCUPIED,1,1,2,OFFICE_L2,16);
+ _objectState[6] = Object(_id, "T\201r","Auf einem Schild an der T\201r steht \"Prof. Dr. Ugnul Tschabb\".",DOOR3,EXIT|OPENABLE|OPENED,2,2,3,OFFICE_R1,8);
+ _objectState[7] = Object(_id, "T\201r","Auf einem Schild an der T\201r steht \"Alga Hurz Li\".",DOOR4,EXIT|OPENABLE|CLOSED|OCCUPIED,3,3,4,OFFICE_R2,18);
_dontEnter = "Diese T\201r w\201rde ich lieber|nicht \224ffnen. Nach dem Schild zu|urteilen, ist jemand in dem Raum.";
}
@@ -1367,13 +1367,13 @@ public:
_id = GUARD;
_shown[0] = true;
- _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CORRIDOR4,21);
- _objectState[1] = Object("Gang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR7,5);
- _objectState[2] = Object("T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE,1,1,6,CORRIDOR9,3);
+ _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CORRIDOR4,21);
+ _objectState[1] = Object(_id, "Gang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR7,5);
+ _objectState[2] = Object(_id, "T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE,1,1,6,CORRIDOR9,3);
// Originally GUARD was ObjectID..
- _objectState[3] = Object("Axacussaner","Du m\201\341test ihn irgendwie ablenken.",INSTRUMENTS,TALK,0,0,0);
- _objectState[4] = Object("Bild","Komisches Bild.",NULLOBJECT,NULLTYPE,2,2,0);
- _objectState[5] = Object("Karte","Darauf steht: \"Generalkarte\".",MASTERKEYCARD,TAKE|COMBINABLE,255,255,1);
+ _objectState[3] = Object(_id, "Axacussaner","Du m\201\341test ihn irgendwie ablenken.",INSTRUMENTS,TALK,0,0,0);
+ _objectState[4] = Object(_id, "Bild","Komisches Bild.",NULLOBJECT,NULLTYPE,2,2,0);
+ _objectState[5] = Object(_id, "Karte","Darauf steht: \"Generalkarte\".",MASTERKEYCARD,TAKE|COMBINABLE,255,255,1);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -1388,14 +1388,14 @@ public:
_id = GUARD3;
_shown[0] = true;
- _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CORRIDOR1,22);
- _objectState[1] = Object("T\201r",Object::defaultDescription,NULLOBJECT,EXIT|OPENABLE|CLOSED,0,0,0,NULLROOM,20);
- _objectState[2] = Object("T\201r",Object::defaultDescription,NULLOBJECT,EXIT|OPENABLE|CLOSED,1,1,0,NULLROOM,15);
- _objectState[3] = Object("T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE,2,2,11,OFFICE_L,0);
- _objectState[4] = Object("Lampe",Object::defaultDescription,LAMP,COMBINABLE,3,3,0);
+ _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CORRIDOR1,22);
+ _objectState[1] = Object(_id, "T\201r",Object::defaultDescription,NULLOBJECT,EXIT|OPENABLE|CLOSED,0,0,0,NULLROOM,20);
+ _objectState[2] = Object(_id, "T\201r",Object::defaultDescription,NULLOBJECT,EXIT|OPENABLE|CLOSED,1,1,0,NULLROOM,15);
+ _objectState[3] = Object(_id, "T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE,2,2,11,OFFICE_L,0);
+ _objectState[4] = Object(_id, "Lampe",Object::defaultDescription,LAMP,COMBINABLE,3,3,0);
// Originally GUARD was ObjectID..
- _objectState[5] = Object("Axacussaner",Object::defaultDescription,INSTRUMENTS,TALK,5,5,0);
- _objectState[6] = Object("Bild","Seltsam!",NULLOBJECT,NULLTYPE,4,4,0);
+ _objectState[5] = Object(_id, "Axacussaner",Object::defaultDescription,INSTRUMENTS,TALK,5,5,0);
+ _objectState[6] = Object(_id, "Bild","Seltsam!",NULLOBJECT,NULLTYPE,4,4,0);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -1426,11 +1426,11 @@ public:
_shown[15] = false;
_shown[16] = true;
- _objectState[0] = Object("T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,9,BCORRIDOR,9);
- _objectState[1] = Object("Computer",Object::defaultDescription,COMPUTER,COMBINABLE,4,4,0);
- _objectState[2] = Object("Geld","Es sind 500 Xa.",TICKETS,TAKE,255,255,0);
- _objectState[3] = Object("Schließfach","Es hat ein elektronisches Zahlenschlo\341.",LOCKER,OPENABLE|CLOSED,5,5,0);
- _objectState[4] = Object("Brief",Object::defaultDescription,LETTER,UNNECESSARY,3,3,0);
+ _objectState[0] = Object(_id, "T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,9,BCORRIDOR,9);
+ _objectState[1] = Object(_id, "Computer",Object::defaultDescription,COMPUTER,COMBINABLE,4,4,0);
+ _objectState[2] = Object(_id, "Geld","Es sind 500 Xa.",TICKETS,TAKE,255,255,0);
+ _objectState[3] = Object(_id, "Schließfach","Es hat ein elektronisches Zahlenschlo\341.",LOCKER,OPENABLE|CLOSED,5,5,0);
+ _objectState[4] = Object(_id, "Brief",Object::defaultDescription,LETTER,UNNECESSARY,3,3,0);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -1461,11 +1461,11 @@ public:
_shown[15] = false;
_shown[16] = true;
- _objectState[0] = Object("T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,9,BCORRIDOR,9);
- _objectState[1] = Object("Computer",Object::defaultDescription,COMPUTER,COMBINABLE,4,4,0);
- _objectState[2] = Object("W\201rfel","Sonderbar!",NULLOBJECT,NULLTYPE,0,0,0);
- _objectState[3] = Object("Bild","Affenstark!",NULLOBJECT,NULLTYPE,1,1,0);
- _objectState[4] = Object("Komisches Ding","Wundersam!",NULLOBJECT,UNNECESSARY,2,2,0);
+ _objectState[0] = Object(_id, "T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,9,BCORRIDOR,9);
+ _objectState[1] = Object(_id, "Computer",Object::defaultDescription,COMPUTER,COMBINABLE,4,4,0);
+ _objectState[2] = Object(_id, "W\201rfel","Sonderbar!",NULLOBJECT,NULLTYPE,0,0,0);
+ _objectState[3] = Object(_id, "Bild","Affenstark!",NULLOBJECT,NULLTYPE,1,1,0);
+ _objectState[4] = Object(_id, "Komisches Ding","Wundersam!",NULLOBJECT,UNNECESSARY,2,2,0);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -1483,12 +1483,12 @@ public:
_shown[2] = false;
_shown[3] = true;
- _objectState[0] = Object("T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,0,0,3,BCORRIDOR,5);
- _objectState[1] = Object("Computer",Object::defaultDescription,COMPUTER,COMBINABLE,4,4,0);
- _objectState[2] = Object("Bild","Es ist ein Axacussanerkopf auf dem Bild.",NULLOBJECT,UNNECESSARY,1,1,0);
- _objectState[3] = Object("Bild","Es ist ein Axacussanerkopf auf dem Bild.",PAINTING,UNNECESSARY,2,2,0);
- _objectState[4] = Object("Pflanze",Object::defaultDescription,NULLOBJECT,UNNECESSARY,3,3,0);
- _objectState[5] = Object("",Object::defaultDescription,MONEY,TAKE|COMBINABLE,255,255,0);
+ _objectState[0] = Object(_id, "T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,0,0,3,BCORRIDOR,5);
+ _objectState[1] = Object(_id, "Computer",Object::defaultDescription,COMPUTER,COMBINABLE,4,4,0);
+ _objectState[2] = Object(_id, "Bild","Es ist ein Axacussanerkopf auf dem Bild.",NULLOBJECT,UNNECESSARY,1,1,0);
+ _objectState[3] = Object(_id, "Bild","Es ist ein Axacussanerkopf auf dem Bild.",PAINTING,UNNECESSARY,2,2,0);
+ _objectState[4] = Object(_id, "Pflanze",Object::defaultDescription,NULLOBJECT,UNNECESSARY,3,3,0);
+ _objectState[5] = Object(_id, "",Object::defaultDescription,MONEY,TAKE|COMBINABLE,255,255,0);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -1506,10 +1506,10 @@ public:
_shown[2] = true;
_shown[3] = true;
- _objectState[0] = Object("T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,0,0,3,BCORRIDOR,5);
- _objectState[1] = Object("Computer",Object::defaultDescription,COMPUTER,COMBINABLE,4,4,0);
- _objectState[2] = Object("Figur","Stark!",NULLOBJECT,UNNECESSARY,6,6,0);
- _objectState[3] = Object("Pflanze","Sie ist den Pflanzen auf der Erde sehr ähnlich.",NULLOBJECT,UNNECESSARY,5,5,0);
+ _objectState[0] = Object(_id, "T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,0,0,3,BCORRIDOR,5);
+ _objectState[1] = Object(_id, "Computer",Object::defaultDescription,COMPUTER,COMBINABLE,4,4,0);
+ _objectState[2] = Object(_id, "Figur","Stark!",NULLOBJECT,UNNECESSARY,6,6,0);
+ _objectState[3] = Object(_id, "Pflanze","Sie ist den Pflanzen auf der Erde sehr ähnlich.",NULLOBJECT,UNNECESSARY,5,5,0);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -1541,10 +1541,10 @@ public:
_shown[16] = false;
_shown[17] = true;
- _objectState[0] = Object("T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,17,GUARD3,9);
- _objectState[1] = Object("Computer","Er funktioniert nicht.",COMPUTER,COMBINABLE,4,4,0);
- _objectState[2] = Object("Graffiti","Seltsamer B\201roschmuck!",NULLOBJECT,NULLTYPE,7,7,0);
- _objectState[3] = Object("Geld","Es sind 350 Xa.",TICKETS,TAKE,8,8,0);
+ _objectState[0] = Object(_id, "T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,17,GUARD3,9);
+ _objectState[1] = Object(_id, "Computer","Er funktioniert nicht.",COMPUTER,COMBINABLE,4,4,0);
+ _objectState[2] = Object(_id, "Graffiti","Seltsamer B\201roschmuck!",NULLOBJECT,NULLTYPE,7,7,0);
+ _objectState[3] = Object(_id, "Geld","Es sind 350 Xa.",TICKETS,TAKE,8,8,0);
}
virtual void onEntrance();
@@ -1560,10 +1560,10 @@ public:
_id = ELEVATOR;
_shown[0] = true;
- _objectState[0] = Object("Knopf",Object::defaultDescription,BUTTON1,PRESS,0,0,0);
- _objectState[1] = Object("Knopf",Object::defaultDescription,BUTTON2,PRESS,1,1,0);
- _objectState[2] = Object("Ausgang",Object::defaultDescription,DOOR,EXIT,255,255,0,NULLROOM,22);
- _objectState[3] = Object("Dschungel","Lauter B\204ume.",JUNGLE,NULLTYPE,255,255,0,STATION,2);
+ _objectState[0] = Object(_id, "Knopf",Object::defaultDescription,BUTTON1,PRESS,0,0,0);
+ _objectState[1] = Object(_id, "Knopf",Object::defaultDescription,BUTTON2,PRESS,1,1,0);
+ _objectState[2] = Object(_id, "Ausgang",Object::defaultDescription,DOOR,EXIT,255,255,0,NULLROOM,22);
+ _objectState[3] = Object(_id, "Dschungel","Lauter B\204ume.",JUNGLE,NULLTYPE,255,255,0,STATION,2);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -1577,8 +1577,8 @@ public:
_fileNumber = 5;
_id = STATION;
_shown[0] = true;
- _objectState[0] = Object("Schild",Object::defaultDescription,STATION_SIGN,NULLTYPE,0,0,0);
- _objectState[1] = Object("T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|CLOSED,1,1,0,NULLROOM,7);
+ _objectState[0] = Object(_id, "Schild",Object::defaultDescription,STATION_SIGN,NULLTYPE,0,0,0);
+ _objectState[1] = Object(_id, "T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|CLOSED,1,1,0,NULLROOM,7);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -1594,8 +1594,8 @@ public:
_shown[0] = true;
_shown[1] = true;
- _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,STATION,22);
- _objectState[1] = Object("Schlitz",Object::defaultDescription,STATION_SLOT,COMBINABLE,0,0,0);
+ _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,STATION,22);
+ _objectState[1] = Object(_id, "Schlitz",Object::defaultDescription,STATION_SLOT,COMBINABLE,0,0,0);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
Commit: ef14dfb7c301b4210770e95955b27e765b3353b2
https://github.com/scummvm/scummvm/commit/ef14dfb7c301b4210770e95955b27e765b3353b2
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T01:53:28Z
Commit Message:
SUPERNOVA: Adds engine pause
Changed paths:
engines/supernova/state.h
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 079e126..eb7c1e2 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -124,8 +124,9 @@ public:
bool _waitEvent;
bool _newRoom;
bool _newOverlay;
- int _timer1;
- int _animationTimer;
+ int32 _oldTime;
+ int32 _timer1;
+ int32 _animationTimer;
int _inventoryScroll;
int _exitList[25];
GuiElement _guiCommandButton[10];
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index ed40af9..e1abc00 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -20,13 +20,17 @@
*
*/
+#include "audio/mods/protracker.h"
#include "common/config-manager.h"
#include "common/debug.h"
#include "common/debug-channels.h"
+#include "common/endian.h"
#include "common/error.h"
#include "common/events.h"
#include "common/file.h"
#include "common/fs.h"
+#include "common/memstream.h"
+#include "common/savefile.h"
#include "common/str.h"
#include "common/system.h"
#include "engines/util.h"
@@ -34,9 +38,8 @@
#include "graphics/surface.h"
#include "graphics/screen.h"
#include "graphics/palette.h"
-#include "audio/mods/protracker.h"
-#include "common/memstream.h"
-#include "common/endian.h"
+#include "graphics/thumbnail.h"
+#include "gui/saveload.h"
#include "supernova/supernova.h"
#include "supernova/state.h"
@@ -213,6 +216,20 @@ bool SupernovaEngine::hasFeature(EngineFeature f) const {
}
}
+void SupernovaEngine::pauseEngineIntern(bool pause) {
+ _mixer->pauseAll(pause);
+ pauseTimer(pause);
+}
+
+void SupernovaEngine::pauseTimer(bool pause) {
+ if (pause) {
+ _timePaused = _gm->_state._time;
+ } else {
+ _gm->_state._time = _timePaused;
+ _gm->_oldTime = _system->getMillis();
+ }
+}
+
void SupernovaEngine::initData() {
// Images
for (int i = 0; i < 44; ++i)
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 56c4ad6..1a81e0f 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -100,12 +100,14 @@ public:
byte _sectionIndex;
byte _menuBrightness;
byte _brightness;
+ uint _timePaused;
uint _delay;
bool _messageDisplayed;
int _textCursorX;
int _textCursorY;
int _textColor;
+ void pauseTimer(bool pause);
int textWidth(const char *text);
int textWidth(const uint16 key);
void initData();
@@ -135,6 +137,7 @@ public:
Common::MemoryReadStream *convertToMod(const char *filename, int version = 1);
virtual bool hasFeature(EngineFeature f) const;
+ virtual void pauseEngineIntern(bool pause);
};
}
Commit: 3f68cda2d7889d21a764e39f1c8ce924609c919e
https://github.com/scummvm/scummvm/commit/3f68cda2d7889d21a764e39f1c8ce924609c919e
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T01:53:31Z
Commit Message:
SUPERNOVA: Implements de-/serialization
WIP. It is currently broken.
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/rooms.h
engines/supernova/state.cpp
engines/supernova/state.h
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index cfccd11..a767156 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -27,6 +27,72 @@
namespace Supernova {
+bool Room::serialize(Common::WriteStream *out) {
+ if (out->err())
+ return false;
+
+ out->writeByte(_id);
+ for (int i = 0; i < kMaxSection; ++i)
+ out->writeByte(_shown[i]);
+
+ int numObjects = 0;
+ while ((_objectState[numObjects]._id != INVALIDOBJECT) && (numObjects < kMaxObject))
+ ++numObjects;
+ out->writeByte(numObjects);
+
+ for (int i = 0; i < numObjects; ++i) {
+ out->writeSint16LE(_objectState[i]._name.size() + 1);
+ out->writeString(_objectState[i]._name.c_str());
+ out->writeSint16LE(_objectState[i]._description.size() + 1);
+ out->writeString(_objectState[i]._description.c_str());
+ out->writeByte(_objectState[i]._roomId);
+ out->writeByte(_objectState[i]._id);
+ out->writeSint16LE(_objectState[i]._type);
+ out->writeByte(_objectState[i]._click);
+ out->writeByte(_objectState[i]._click2);
+ out->writeByte(_objectState[i]._section);
+ out->writeByte(_objectState[i]._exitRoom);
+ out->writeByte(_objectState[i]._direction);
+ }
+
+ out->writeByte(_seen);
+
+ return !out->err();
+}
+
+bool Room::deserialize(Common::ReadStream *in) {
+ if (in->err())
+ return false;
+
+ in->readByte();
+ for (int i = 0; i < kMaxSection; ++i)
+ _shown[i] = in->readByte();
+
+ int numObjects = in->readByte();
+ int bufferSize = 0;
+ char stringBuffer[256];
+ for (int i = 0; i < numObjects; ++i) {
+ bufferSize = in->readSint16LE();
+ in->read(stringBuffer, bufferSize > 256 ? 256 : bufferSize);
+ _objectState[i]._name = stringBuffer;
+ bufferSize = in->readSint16LE();
+ in->read(stringBuffer, bufferSize > 256 ? 256 : bufferSize);
+ _objectState[i]._description = stringBuffer;
+ _objectState[i]._roomId = in->readByte();
+ _objectState[i]._id = static_cast<ObjectID>(in->readByte());
+ _objectState[i]._type = static_cast<ObjectType>(in->readSint16LE());
+ _objectState[i]._click = in->readByte();
+ _objectState[i]._click2 = in->readByte();
+ _objectState[i]._section = in->readByte();
+ _objectState[i]._exitRoom = static_cast<RoomID>(in->readByte());
+ _objectState[i]._direction = in->readByte();
+ }
+
+ _seen = in->readByte();
+
+ return !in->err();
+}
+
void Intro::onEntrance() {
}
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index b3956b8..a5895fa 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -70,6 +70,8 @@ public:
virtual bool interact(Action verb, Object &obj1, Object &obj2) {
return false;
}
+ virtual bool serialize(Common::WriteStream *out);
+ virtual bool deserialize(Common::ReadStream *in);
protected:
int _fileNumber;
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 5b5af20..5756034 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -22,11 +22,104 @@
#include "common/system.h"
#include "graphics/palette.h"
+#include "gui/message.h"
#include "supernova/supernova.h"
#include "supernova/state.h"
namespace Supernova {
+bool GameManager::serialize(Common::WriteStream *out) {
+ if (out->err())
+ return false;
+
+ // GameState
+ out->writeSint32LE(_state._time);
+ out->writeSint32LE(_state._timeSleep);
+ out->writeSint32LE(_state._timeAlarm);
+ out->writeSint32LE(_state._eventTime);
+ out->writeSint32LE(_state._arrivalDaysLeft);
+ out->writeSint32LE(_state._shipEnergyDaysLeft);
+ out->writeSint32LE(_state._landingModuleEnergyDaysLeft);
+ out->writeUint16LE(_state._greatFlag);
+ out->writeSint16LE(_state._timeRobot);
+ out->writeSint16LE(_state._money);
+ out->writeByte(_state._coins);
+ out->writeByte(_state._shoes);
+ out->writeByte(_state._destination);
+ out->writeByte(_state._language);
+ out->writeByte(_state._corridorSearch);
+ out->writeByte(_state._alarmOn);
+ out->writeByte(_state._terminalStripConnected);
+ out->writeByte(_state._terminalStripWire);
+ out->writeByte(_state._cableConnected);
+ out->writeByte(_state._powerOff);
+ out->writeByte(_state._dream);
+
+ // Inventory
+ out->writeSByte(_inventory.getSize());
+ out->writeSByte(_inventoryScroll);
+ for (int i = 0; i < _inventory.getSize(); ++i) {
+ Object *objectStateBegin = _rooms[_inventory.get(i)->_roomId]->getObject(0);
+ byte objectIndex = _inventory.get(i) - objectStateBegin;
+ out->writeByte(_inventory.get(i)->_roomId);
+ out->writeByte(objectIndex);
+ }
+
+ // Rooms
+ for (int i = 0; i < kRoomsNum; ++i) {
+ _rooms[i]->serialize(out);
+ }
+
+ return !out->err();
+}
+
+
+bool GameManager::deserialize(Common::ReadStream *in) {
+ if (in->err()) {
+ return false;
+ }
+
+ // GameState
+ _state._time = in->readSint32LE();
+ _state._timeSleep = in->readSint32LE();
+ _state._timeAlarm = in->readSint32LE();
+ _state._eventTime = in->readSint32LE();
+ _state._arrivalDaysLeft = in->readSint32LE();
+ _state._shipEnergyDaysLeft = in->readSint32LE();
+ _state._landingModuleEnergyDaysLeft = in->readSint32LE();
+ _state._greatFlag = in->readUint16LE();
+ _state._timeRobot = in->readSint16LE();
+ _state._money = in->readSint16LE();
+ _state._coins = in->readByte();
+ _state._shoes = in->readByte();
+ _state._destination = in->readByte();
+ _state._language = in->readByte();
+ _state._corridorSearch = in->readByte();
+ _state._alarmOn = in->readByte();
+ _state._terminalStripConnected = in->readByte();
+ _state._terminalStripWire = in->readByte();
+ _state._cableConnected = in->readByte();
+ _state._powerOff = in->readByte();
+ _state._dream = in->readByte();
+
+ // Inventory
+ int inventorySize = in->readSByte();
+ _inventoryScroll = in->readSByte();
+ _inventory.clear();
+ for (int i = 0; i < inventorySize; ++i) {
+ RoomID objectRoom = static_cast<RoomID>(in->readByte());
+ int objectIndex = in->readByte();
+ _inventory.add(*_rooms[objectRoom]->getObject(objectIndex));
+ }
+
+ // Rooms
+ for (int i = 0; i < kRoomsNum; ++i) {
+ _rooms[i]->deserialize(in);
+ }
+
+ return !in->err();
+}
+
Inventory::Inventory()
: _numObjects(0)
{}
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index eb7c1e2..0f6efc0 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -101,6 +101,8 @@ public:
void processInput(Common::KeyState &state);
void processInput();
void executeRoom();
+ bool serialize(Common::WriteStream *out);
+ bool deserialize(Common::ReadStream *in);
SupernovaEngine *_vm;
Common::KeyState _key;
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index e1abc00..f3678de 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -110,6 +110,8 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)
, _screenWidth(320)
, _screenHeight(200)
, _messageDisplayed(false)
+ , _allowLoadGame(true)
+ , _allowSaveGame(false)
{
// const Common::FSNode gameDataDir(ConfMan.get("path"));
// SearchMan.addSubDirectoryMatching(gameDataDir, "sound");
@@ -211,6 +213,10 @@ bool SupernovaEngine::hasFeature(EngineFeature f) const {
switch (f) {
case kSupportsRTL:
return true;
+ case kSupportsLoadingDuringRuntime:
+ return true;
+ case kSupportsSavingDuringRuntime:
+ return true;
default:
return false;
}
@@ -787,6 +793,79 @@ Common::MemoryReadStream *SupernovaEngine::convertToMod(const char *filename, in
return new Common::MemoryReadStream(buffer.getData(), buffer.size());
}
+bool SupernovaEngine::canLoadGameStateCurrently() {
+ return _allowLoadGame;
+}
+
+Common::Error SupernovaEngine::loadGameState(int slot) {
+ return (loadGame(slot) ? Common::kNoError : Common::kWritingFailed);
+}
+
+bool SupernovaEngine::canSaveGameStateCurrently() {
+ return _allowSaveGame;
+}
+
+Common::Error SupernovaEngine::saveGameState(int slot, const Common::String &desc) {
+ return (saveGame(slot, desc) ? Common::kNoError : Common::kWritingFailed);
+}
+
+bool SupernovaEngine::loadGame(int slot) {
+ GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser("Load game:", "Load:", false);
+ int loadGameSlot = dialog->runModalWithCurrentTarget();
+ delete dialog;
+
+ if (loadGameSlot < 0 || loadGameSlot > 10)
+ return false;
+
+ Common::String filename = Common::String::format("msn_save.%02d", loadGameSlot);
+// Common::InSaveFile *savefile = _saveFileMan->openForLoading(filename);
+ Common::InSaveFile *savefile = _saveFileMan->openRawFile(filename);
+ if (!savefile)
+ return false;
+
+ int descriptionSize = savefile->readSint16LE();
+ savefile->skip(descriptionSize);
+ savefile->skip(6);
+// Graphics::skipThumbnail(*savefile);
+ _gm->deserialize(savefile);
+
+ delete savefile;
+
+ return true;
+}
+
+bool SupernovaEngine::saveGame(int slot, const Common::String &description) {
+ GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser("Save game:", "Save", true);
+ int saveGameSlot = dialog->runModalWithCurrentTarget();
+ Common::String saveGameDescription = dialog->getResultString();
+ delete dialog;
+
+ if (saveGameSlot < 0 || saveGameSlot > 10)
+ return false;
+
+ Common::String filename = Common::String::format("msn_save.%02d", saveGameSlot);
+ Common::OutSaveFile *savefile = _saveFileMan->openForSaving(filename, false);
+ if (!savefile)
+ return false;
+
+ TimeDate currentDate;
+ _system->getTimeAndDate(currentDate);
+ uint32 saveDate = (currentDate.tm_mday & 0xFF) << 24 | ((currentDate.tm_mon + 1) & 0xFF) << 16 | ((currentDate.tm_year + 1900) & 0xFFFF);
+ uint16 saveTime = (currentDate.tm_hour & 0xFF) << 8 | ((currentDate.tm_min) & 0xFF);
+
+ savefile->writeSint16LE(saveGameDescription.size() + 1);
+ savefile->write(saveGameDescription.c_str(), saveGameDescription.size() + 1);
+ savefile->writeUint32LE(saveDate);
+ savefile->writeUint16LE(saveTime);
+// Graphics::saveThumbnail(*savefile);
+ _gm->serialize(savefile);
+
+ savefile->finalize();
+ delete savefile;
+
+ return true;
+}
+
ScreenBufferStack::ScreenBufferStack()
: _last(_buffer) {
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 1a81e0f..4327ba1 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -95,6 +95,8 @@ public:
Common::Event _event;
int _screenWidth;
int _screenHeight;
+ bool _allowLoadGame;
+ bool _allowSaveGame;
byte _imageIndex;
byte _sectionIndex;
@@ -133,9 +135,15 @@ public:
void renderBox(int x, int y, int width, int height, byte color);
void setColor63(byte value);
void command_print();
+ bool loadGame(int slot);
+ bool saveGame(int slot, const Common::String &description);
Common::MemoryReadStream *convertToMod(const char *filename, int version = 1);
+ virtual Common::Error loadGameState(int slot);
+ virtual bool canLoadGameStateCurrently();
+ virtual Common::Error saveGameState(int slot, const Common::String &desc);
+ virtual bool canSaveGameStateCurrently();
virtual bool hasFeature(EngineFeature f) const;
virtual void pauseEngineIntern(bool pause);
};
Commit: 82efa9dd65601d10ce9caaa7cbb384cf468c3f62
https://github.com/scummvm/scummvm/commit/82efa9dd65601d10ce9caaa7cbb384cf468c3f62
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:00:51Z
Commit Message:
SUPERNOVA: Simplifies timing code
Removing remnants of the original code like _timeAlarmSystem.
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index a767156..0ae152f 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -287,9 +287,8 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
}
_gm->_state._arrivalDaysLeft -= _gm->_state._timeSleep;
*energyDaysLeft -= _gm->_state._timeSleep;
- _gm->_state._timeStarting = _gm->_state._time - ticksToMsec(786520); // 12pm
- _gm->_state._timeAlarmSystem = _gm->_state._timeAlarm + _gm->_state._timeStarting;
- _gm->_state._alarmOn = (_gm->_state._timeAlarmSystem > _gm->_state._time);
+ _gm->_state._time = ticksToMsec(786520); // 12pm
+ _gm->_state._alarmOn = (_gm->_state._timeAlarm > _gm->_state._time);
if (*energyDaysLeft == 0) {
_gm->turnOff();
room = _gm->_rooms[GENERATOR];
@@ -1655,12 +1654,12 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
_vm->removeMessage();
_vm->_menuBrightness = 0;
_vm->paletteBrightness();
- _gm->_state._timeStarting -= ticksToMsec(125000); // 2 hours
- _gm->_state._timeAlarmSystem -= ticksToMsec(125000);
+ _gm->_state._time -= ticksToMsec(125000); // 2 hours
+ _gm->_state._timeAlarm -= ticksToMsec(125000);
_gm->_state._eventTime = _gm->_state._time + ticksToMsec(4000);
// TODO: implement event calling
// _gm->_state.event = &supernova;
- _gm->_state._alarmOn = (_gm->_state._timeAlarmSystem > _gm->_state._time);
+ _gm->_state._alarmOn = (_gm->_state._timeAlarm > _gm->_state._time);
setSectionVisible(11, false);
setSectionVisible(1, false);
_vm->renderRoom(*this);
@@ -1966,7 +1965,6 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(3)); // Discman
_gm->changeRoom(CELL);
_gm->_newRoom = true;
- _gm->_state._benOverlay = 2;
_gm->_newOverlay = true;
_gm->_state._dream = true;
} else
@@ -1978,9 +1976,8 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
void AxacussCell::onEntrance() {
if (_gm->_state._dream) {
_vm->renderMessage("Du wachst auf und findest dich in|einem geschlossenen Raum wieder.");
- _gm->_state._timeStarting = _gm->_state._arrivalDaysLeft - ticksToMsec(500000);
- _gm->_state._timeAlarmSystem = _gm->_state._timeAlarm + _gm->_state._timeStarting;
- _gm->_state._alarmOn = (_gm->_state._timeAlarmSystem > _gm->_state._arrivalDaysLeft);
+ _gm->_state._time = ticksToMsec(500000);
+ _gm->_state._alarmOn = (_gm->_state._timeAlarm > _gm->_state._time);
_gm->_state._powerOff = false;
_gm->_state._dream = false;
}
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 5756034..f5a6a17 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -312,14 +312,13 @@ void GameManager::initState() {
_animationEnabled = true;
_mouseField = -1;
_inventoryScroll = 0;
+ _oldTime = 0;
_timer1 = 0;
_animationTimer = 0;
- _state._time = 0;
+ _state._time = ticksToMsec(916364); // 2 pm
_state._timeSleep = 0;
- _state._timeStarting = ticksToMsec(916364); // 2 pm
_state._timeAlarm = ticksToMsec(458182); // 7 am
- _state._timeAlarmSystem = _state._timeAlarm + _state._timeStarting;
_state._eventTime = 0xffffffff;
_state._arrivalDaysLeft = 2840;
_state._shipEnergyDaysLeft = 2135;
@@ -330,7 +329,6 @@ void GameManager::initState() {
_state._coins = 0;
_state._shoes = 0;
_state._destination = 255;
- _state._benOverlay = 0;
_state._language = 0;
_state._corridorSearch = false;
_state._alarmOn = false;
@@ -723,19 +721,16 @@ void GameManager::taxi() {
}
void GameManager::outro() {
- _state._benOverlay = 3;
-// load_overlay();
// title = 2;
_vm->playSoundMod(49);
// title = 0;
- _state._benOverlay = 0;
_vm->paletteFadeOut();
_vm->renderImage(55, 0);
_vm->paletteFadeIn();
getInput();
_vm->paletteFadeOut();
// TODO: render info file
-// longjmp(termination,1);
+ // Exit
}
void GameManager::great(uint number) {
@@ -920,10 +915,7 @@ void GameManager::roomBrightness() {
}
void GameManager::loadTime() {
- _state._timeStarting += _state._time;
- if (_state._eventTime != 1)
- _state._eventTime += _state._time;
- _state._timeAlarmSystem = _state._timeAlarm + _state._timeStarting;
+ // STUB
}
void GameManager::saveTime() {
@@ -944,8 +936,8 @@ void GameManager::errorTemp() {
}
void GameManager::wait2(int ticks) {
- uint end = g_system->getMillis() + ticksToMsec(ticks);
- while (g_system->getMillis() < end) {
+ int32 end = _state._time + ticksToMsec(ticks);
+ while (_state._time < end) {
_vm->updateEvents();
g_system->updateScreen();
g_system->delayMillis(_vm->_delay);
@@ -953,22 +945,24 @@ void GameManager::wait2(int ticks) {
}
void GameManager::setAnimationTimer(int ticks) {
- _animationTimer = g_system->getMillis() + ticksToMsec(ticks);
+ _animationTimer = ticksToMsec(ticks);
}
void GameManager::handleTime() {
- _state._time = g_system->getMillis();
- if (_animationTimer <= _state._time)
+ int32 delta = g_system->getMillis() - _oldTime;
+ _state._time += delta;
+ if (_state._time > 86400000)
+ _state._time -= 86400000; // 24h wrap around
+ if (_animationTimer > delta)
+ _animationTimer -= delta;
+ else
_animationTimer = 0;
-}
-void GameManager::screenShake() {
- // STUB
+ _oldTime = g_system->getMillis();
}
-void GameManager::palette() {
+void GameManager::screenShake() {
// STUB
- // Adjust palette to brightness parameters and make it current
}
void GameManager::shock() {
@@ -1266,9 +1260,6 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
getInput();
_vm->renderRoom(*_currentRoom);
roomBrightness();
- palette();
- showMenu();
- drawMapExits();
_vm->renderMessage("Hmm, irgendwie komme|ich mir verarscht vor.");
} else if ((verb == ACTION_LOOK) && (obj1._id == KEYCARD2)) {
_vm->renderMessage(obj1._description.c_str());
@@ -1278,7 +1269,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
"Es ist eine Uhr mit extra|lautem Wecker. "
"Sie hat einen|Knopf zum Verstellen der Alarmzeit.|"
"Uhrzeit: %s Alarmzeit: %s",
- timeToString(_state._time + _state._timeStarting).c_str(),
+ timeToString(_state._time).c_str(),
timeToString(_state._timeAlarm).c_str()).c_str());
} else if ((verb == ACTION_PRESS) && (obj1._id == WATCH)) {
bool validInput = true;
@@ -1289,7 +1280,6 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
_vm->saveScreen(88, 87, 144, 24);
_vm->renderBox(88, 87, 144, 24, kColorWhite35);
_vm->renderText("Neue Alarmzeit (hh:mm) :", 91, 90, kColorWhite99);
- // TODO: Adjust for msec time instead of ticks
do {
validInput = true;
input.clear();
@@ -1337,8 +1327,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
_vm->restoreScreen();
if (_key.keycode != Common::KEYCODE_ESCAPE) {
_state._timeAlarm = (hours * 60 + minutes) * 60 * 1000;
- _state._timeAlarmSystem = _state._timeAlarm + _state._timeStarting;
- _state._alarmOn = (_state._timeAlarmSystem > _vm->_system->getMillis());
+ _state._alarmOn = (_state._timeAlarm > _state._time);
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, WIRE)) {
r = _rooms[CABIN_L3];
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 0f6efc0..e50ef3b 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -31,9 +31,7 @@ namespace Supernova {
struct GameState {
int32 _time;
int32 _timeSleep;
- int32 _timeStarting;
int32 _timeAlarm;
- int32 _timeAlarmSystem;
int32 _eventTime;
int32 _arrivalDaysLeft;
int32 _shipEnergyDaysLeft;
@@ -43,9 +41,7 @@ struct GameState {
int16 _money;
byte _coins;
byte _shoes;
- byte _nameSeen;
byte _destination;
- byte _benOverlay;
byte _language;
bool _corridorSearch;
bool _alarmOn;
Commit: 0ffd0059957795f70064654804edb8f2eb5e9e1b
https://github.com/scummvm/scummvm/commit/0ffd0059957795f70064654804edb8f2eb5e9e1b
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:00:59Z
Commit Message:
SUPERNOVA: Adds message prompt on exit
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index f5a6a17..5b3e736 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -438,7 +438,12 @@ void GameManager::processInput(Common::KeyState &state) {
case Common::KEYCODE_x:
if (state.flags & Common::KBD_ALT) {
// quit game
- _vm->quitGame();
+ GUI::MessageDialog *dialog = new GUI::MessageDialog("Quit Game?", "Quit", "Cancel");
+ if (dialog->runModal() == GUI::kMessageOK)
+ _vm->quitGame();
+ delete dialog;
+
+ // TODO: Add original quit game message prompt
}
break;
default:
Commit: de539134f9f50015049b2f64c8ec70864c98e7f2
https://github.com/scummvm/scummvm/commit/de539134f9f50015049b2f64c8ec70864c98e7f2
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:00:59Z
Commit Message:
SUPERNOVA: Removes comments
Changed paths:
engines/supernova/state.cpp
engines/supernova/supernova.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 5b3e736..0cf8441 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -564,8 +564,6 @@ void GameManager::processInput() {
} while ((click != 0) && (field == -1));
}
}
-// if ((_objectNumber == 1) && (_currentRoom->getObject(field) == _currentInputObject))
-// field = -1;
}
if (_mouseField != field) {
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index f3678de..524e214 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -158,7 +158,6 @@ Common::Error SupernovaEngine::run() {
_system->delayMillis(end);
}
- //deinit timer/sound/..
stopSound();
return Common::kNoError;
Commit: 7bd20ffbed1c251d05fbefc2f8d9b58c28fc8cf1
https://github.com/scummvm/scummvm/commit/7bd20ffbed1c251d05fbefc2f8d9b58c28fc8cf1
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:00:59Z
Commit Message:
SUPERNOVA: Adds constants
Changed paths:
engines/supernova/msn_def.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index a84c28c..5e90cec 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -56,7 +56,7 @@ enum AudioIndex {
kAudioGreat, // 44|0
kAudioCrash, // 45|0
kAudioVoiceHalt, // 46|0
- kAudioGunShot, // 46|2510
+ kAudioGunShot, // 46|2510
kAudioUndef2, // 46|4020
kAudioVoiceSupernova, // 47|0
kAudioVoiceYeah, // 47|24010
@@ -64,7 +64,7 @@ enum AudioIndex {
kAudioUndef4, // 48|2510
kAudioShock, // 48|10520
kAudioTurntable, // 48|13530
- kAudioUndef5, // 50|0
+ kAudioSiren, // 50|0
kAudioUndef6, // 50|12786
kAudioRocks, // 51|0
kAudioDeath, // 53|0
@@ -76,6 +76,11 @@ enum AudioIndex {
kAudioNumSamples
};
+enum MusicIndex {
+ kMusicIntro = 52,
+ kMusicOutro = 49
+};
+
struct AudioInfo {
int _filenumber;
int _offsetStart;
@@ -346,7 +351,7 @@ enum RoomID {
CELL,CORRIDOR1,CORRIDOR2,CORRIDOR3,CORRIDOR4,CORRIDOR5,CORRIDOR6,CORRIDOR7,CORRIDOR8,CORRIDOR9,
BCORRIDOR,GUARD,GUARD3,OFFICE_L1,OFFICE_L2,OFFICE_R1,OFFICE_R2,OFFICE_L,
- ELEVATOR,STATION,SIGN,NULLROOM
+ ELEVATOR,STATION,SIGN,OUTRO,NULLROOM
};
enum ObjectID {
Commit: 7b4e9a542444ac1e653442d0fe7c9cce4d7f4152
https://github.com/scummvm/scummvm/commit/7b4e9a542444ac1e653442d0fe7c9cce4d7f4152
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:00:59Z
Commit Message:
SUPERNOVA: Adds text speed variable
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 524e214..b0c3542 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -107,6 +107,7 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)
, _imageIndex(0)
, _sectionIndex(0)
, _delay(33)
+ , _textSpeed(kTextSpeed[2])
, _screenWidth(320)
, _screenHeight(200)
, _messageDisplayed(false)
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 4327ba1..2073c0f 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -105,6 +105,7 @@ public:
uint _timePaused;
uint _delay;
bool _messageDisplayed;
+ int _textSpeed;
int _textCursorX;
int _textCursorY;
int _textColor;
Commit: b3e23fef13bc1d8ffd0ee4dba3313147cfd8505e
https://github.com/scummvm/scummvm/commit/b3e23fef13bc1d8ffd0ee4dba3313147cfd8505e
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:00:59Z
Commit Message:
SUPERNOVA: Fixes mouse events during intro
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index b0c3542..d957f61 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -190,8 +190,7 @@ void SupernovaEngine::updateEvents() {
case Common::EVENT_LBUTTONUP:
// fallthrough
case Common::EVENT_RBUTTONUP:
- if (_mixer->isSoundHandleActive(_soundHandle) &&
- (_gm->_currentRoom->getId() == INTRO))
+ if (_mixer->isSoundHandleActive(_soundHandle))
return;
_gm->_mouseClicked = true;
// fallthrough
Commit: 6e33819217c0c2fac58c4a85cc64819c1295e43c
https://github.com/scummvm/scummvm/commit/6e33819217c0c2fac58c4a85cc64819c1295e43c
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:01:00Z
Commit Message:
SUPERNOVA: Changes increment size for fade in/out
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index d957f61..05e4883 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -571,10 +571,10 @@ void SupernovaEngine::paletteBrightness() {
}
void SupernovaEngine::paletteFadeOut() {
- while (_brightness > 20) {
+ while (_brightness > 10) {
_menuBrightness = _brightness;
paletteBrightness();
- _brightness -= 20;
+ _brightness -= 10;
_system->updateScreen();
_system->delayMillis(_delay);
}
@@ -585,13 +585,10 @@ void SupernovaEngine::paletteFadeOut() {
}
void SupernovaEngine::paletteFadeIn() {
- // TODO: scene 0 (newspaper article in intro, mode 0x11)
- // needs to be handled differently
-
- while (_brightness < 235) {
+ while (_brightness < 245) {
_menuBrightness = _brightness;
paletteBrightness();
- _brightness += 20;
+ _brightness += 10;
_system->updateScreen();
_system->delayMillis(_delay);
}
Commit: ea60d1513e60895d5604a61663a22093e3fc4194
https://github.com/scummvm/scummvm/commit/ea60d1513e60895d5604a61663a22093e3fc4194
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:01:00Z
Commit Message:
SUPERNOVA: Raises save game limit to 99
Changed paths:
engines/supernova/detection.cpp
engines/supernova/supernova.cpp
diff --git a/engines/supernova/detection.cpp b/engines/supernova/detection.cpp
index 3e1082c..5770871 100644
--- a/engines/supernova/detection.cpp
+++ b/engines/supernova/detection.cpp
@@ -81,7 +81,7 @@ public:
virtual SaveStateList listSaves(const char *target) const;
virtual void removeSaveState(const char *target, int slot) const;
virtual int getMaximumSaveSlot() const {
- return 10;
+ return 99;
}
};
@@ -108,7 +108,7 @@ bool SupernovaMetaEngine::createInstance(OSystem *syst, Engine **engine, const A
SaveStateList SupernovaMetaEngine::listSaves(const char *target) const {
Common::StringArray filenames;
- Common::String pattern("msn_save.##");
+ Common::String pattern("msn_save.###");
filenames = g_system->getSavefileManager()->listSavefiles(pattern);
@@ -134,7 +134,7 @@ SaveStateList SupernovaMetaEngine::listSaves(const char *target) const {
}
void SupernovaMetaEngine::removeSaveState(const char *target, int slot) const {
- Common::String filename = Common::String::format("msn_save.%02d", slot);
+ Common::String filename = Common::String::format("msn_save.%03d", slot);
g_system->getSavefileManager()->removeSavefile(filename);
}
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 05e4883..39f00e8 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -810,10 +810,10 @@ bool SupernovaEngine::loadGame(int slot) {
int loadGameSlot = dialog->runModalWithCurrentTarget();
delete dialog;
- if (loadGameSlot < 0 || loadGameSlot > 10)
+ if (loadGameSlot < 0)
return false;
- Common::String filename = Common::String::format("msn_save.%02d", loadGameSlot);
+ Common::String filename = Common::String::format("msn_save.%03d", loadGameSlot);
// Common::InSaveFile *savefile = _saveFileMan->openForLoading(filename);
Common::InSaveFile *savefile = _saveFileMan->openRawFile(filename);
if (!savefile)
@@ -836,10 +836,10 @@ bool SupernovaEngine::saveGame(int slot, const Common::String &description) {
Common::String saveGameDescription = dialog->getResultString();
delete dialog;
- if (saveGameSlot < 0 || saveGameSlot > 10)
+ if (saveGameSlot < 0)
return false;
- Common::String filename = Common::String::format("msn_save.%02d", saveGameSlot);
+ Common::String filename = Common::String::format("msn_save.%03d", saveGameSlot);
Common::OutSaveFile *savefile = _saveFileMan->openForSaving(filename, false);
if (!savefile)
return false;
Commit: a334a4730dca4ac0085c61c639bb30ba6b4fb9bb
https://github.com/scummvm/scummvm/commit/a334a4730dca4ac0085c61c639bb30ba6b4fb9bb
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:01:00Z
Commit Message:
SUPERNOVA: Fixes returned constant on load fail
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 39f00e8..19cec43 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -794,7 +794,7 @@ bool SupernovaEngine::canLoadGameStateCurrently() {
}
Common::Error SupernovaEngine::loadGameState(int slot) {
- return (loadGame(slot) ? Common::kNoError : Common::kWritingFailed);
+ return (loadGame(slot) ? Common::kNoError : Common::kReadingFailed);
}
bool SupernovaEngine::canSaveGameStateCurrently() {
Commit: 7f513ac1db35a3cc76d9193b01d89974066ddfb9
https://github.com/scummvm/scummvm/commit/7f513ac1db35a3cc76d9193b01d89974066ddfb9
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:01:00Z
Commit Message:
SUPERNOVA: Adds key input check function
This is temporary. Input is all over the place right now I feel, so it
will be reworked 'soon'.
Changed paths:
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 0cf8441..5fc764f 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -464,6 +464,14 @@ void GameManager::resetInputState() {
processInput();
}
+bool GameManager::keyPressed(Common::KeyCode keycode, bool equal) {
+ bool ret = _key.keycode == keycode;
+ _key.reset();
+
+ return equal ? ret : !ret;
+}
+
+
void GameManager::processInput() {
if (_mouseClickType == Common::EVENT_LBUTTONUP) {
_vm->removeMessage();
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index e50ef3b..72aad4c 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -24,6 +24,7 @@
#define STATE_H
#include "common/rect.h"
+#include "common/keyboard.h"
#include "supernova/rooms.h"
namespace Supernova {
@@ -146,6 +147,7 @@ public:
Common::EventType getMouseInput();
uint16 getKeyInput(bool blockForPrintChar = false);
void getInput();
+ bool keyPressed(Common::KeyCode keycode, bool equal);
void mouseInput3();
void mouseWait(int delay);
void wait2(int ticks);
Commit: 98ab5ee14236dea9b64488e860299c32392c8bfb
https://github.com/scummvm/scummvm/commit/98ab5ee14236dea9b64488e860299c32392c8bfb
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:01:00Z
Commit Message:
SUPERNOVA: Alters wait function to stall at least _delay ms
wait2() is used for updating events all over the code with a parameter
of 1, so to be sure there's at least one update it is wrapped in a
do-while now.
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 5fc764f..b37df19 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -948,11 +948,11 @@ void GameManager::errorTemp() {
void GameManager::wait2(int ticks) {
int32 end = _state._time + ticksToMsec(ticks);
- while (_state._time < end) {
+ do {
_vm->updateEvents();
g_system->updateScreen();
g_system->delayMillis(_vm->_delay);
- }
+ } while (_state._time < end);
}
void GameManager::setAnimationTimer(int ticks) {
Commit: 7ed2dea5e021387d5e43def1b0a779ae7883c071
https://github.com/scummvm/scummvm/commit/7ed2dea5e021387d5e43def1b0a779ae7883c071
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:01:00Z
Commit Message:
SUPERNOVA: Adds Intro before starting room
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 0ae152f..8ec0e4a 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -21,6 +21,8 @@
*/
#include "common/system.h"
+#include "graphics/palette.h"
+#include "graphics/cursorman.h"
#include "supernova/supernova.h"
#include "supernova/state.h"
@@ -94,10 +96,292 @@ bool Room::deserialize(Common::ReadStream *in) {
}
void Intro::onEntrance() {
+ _gm->_guiEnabled = false;
+ titleScreen();
+ cutscene();
+ leaveCutscene();
+}
+
+void Intro::titleScreen() {
+ // Newspaper
+ CursorMan.showMouse(false);
+ _vm->_brightness = 0;
+ _vm->paletteBrightness();
+ _vm->renderImage(1, 0);
+ _vm->paletteFadeIn();
+ _gm->getInput();
+ _vm->paletteFadeOut();
+
+ // Title Screen
+ _vm->renderImage(31, 0);
+ _vm->paletteFadeIn();
+ _gm->wait2(1);
+ _vm->playSound(kAudioVoiceSupernova);
+ while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
+ _gm->wait2(1);
+ titleFadeIn();
+ _vm->renderText("V2.02", 295, 190, kColorWhite44);
+ _vm->renderText("Teil 1:", 64, 120, kColorLightBlue);
+ _vm->renderText("Das Schicksal", 44, 132, kColorWhite99);
+ _vm->renderText("des Horst Hummel", 35, 142, kColorWhite99);
+ _gm->wait2(1);
+ CursorMan.showMouse(true);
+ _vm->playSoundMod(kMusicIntro);
+ _gm->getKeyInput();
+ _gm->_key.reset();
+ // TODO: render animated text
+ _vm->playSound(kAudioVoiceYeah);
+ while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle));
+ _vm->paletteFadeOut();
+}
+
+void Intro::titleFadeIn() {
+ byte titlePaletteColor[] = {0xfe, 0xeb};
+ byte titleNewColor[2][3] = {{255,255,255}, {199, 21, 21}};
+ byte newColors[2][3];
+
+ for (int brightness = 1; brightness <= 40; ++brightness) {
+ for (int colorIndex = 0; colorIndex < 2; ++colorIndex) {
+ for (int i = 0; i < 3; ++i) {
+ newColors[colorIndex][i] = (titleNewColor[colorIndex][i] * brightness) / 40;
+ }
+ }
+
+ _vm->_system->getPaletteManager()->setPalette(newColors[0], titlePaletteColor[0], 1);
+ _vm->_system->getPaletteManager()->setPalette(newColors[1], titlePaletteColor[1], 1);
+ _vm->_system->updateScreen();
+ _vm->_system->delayMillis(_vm->_delay);
+ }
+}
+
+void Intro::animate(int filenumber, int section1, int section2, int duration) {
+ while (duration) {
+ _vm->renderImage(filenumber, section1);
+ _gm->wait2(2);
+ _vm->renderImage(filenumber, section2);
+ _gm->wait2(2);
+ --duration;
+ }
+}
+
+void Intro::animate(int filenumber, int section1, int section2, int duration,
+ MessagePosition position, const char *text) {
+ _vm->renderMessage(text, position);
+ int delay = (Common::strnlen(text, 512) + 20) * (10 - duration) * _vm->_textSpeed / 400;
+ while (delay) {
+ if (section1)
+ _vm->renderImage(filenumber, section1);
+ _gm->wait2(2);
+ if (section2)
+ _vm->renderImage(filenumber, section2);
+ _gm->wait2(2);
+ --delay;
+ }
+ _vm->removeMessage();
}
-bool Intro::interact(Action verb, Object &obj1, Object &obj2) {
+void Intro::animate(int filenumber, int section1, int section2, int section3, int section4,
+ int duration, MessagePosition position, const char *text) {
+ _vm->renderMessage(text, position);
+ if (duration == 0)
+ duration = (Common::strnlen(text, 512) + 20) * _vm->_textSpeed / 40;
+ while(duration) {
+ _vm->renderImage(filenumber, section1);
+ _vm->renderImage(filenumber, section3);
+ _gm->wait2(2);
+ _vm->renderImage(filenumber, section2);
+ _vm->renderImage(filenumber, section4);
+ _gm->wait2(2);
+ duration--;
+ }
+ _vm->removeMessage();
+}
+
+void Intro::cutscene() {
+#define exitOnEscape(X) do { \
+ _gm->wait2(X); \
+ if (_gm->keyPressed(Common::KEYCODE_ESCAPE, true)) \
+ return; \
+} while (0);
+
+ _vm->_system->fillScreen(kColorBlack);
+ _vm->_menuBrightness = 255;
+ _vm->paletteBrightness();
+ animate(31, 0, 0, 0, kMessageNormal, "Zwei Tage nach dem Start|im Cockpit der \"Supernova\" ...");
+ _vm->_menuBrightness = 0;
+ _vm->paletteBrightness();
+ exitOnEscape(1);
+
+ _vm->renderImage(9, 0);
+ _vm->renderImage(9, 1);
+ _vm->renderImage(9, 9);
+ _vm->paletteFadeIn();
+ animate(9,11,10,6,kMessageRight,"Entferung von der Sonne: 1 500 000 km.|Gehen Sie auf 8000 hpm, Captain!");
+ _vm->renderImage(9, 3);
+ exitOnEscape(4);
+ _vm->renderImage(9, 4);
+ animate(9, 11,10,3); // test duration
+ _vm->removeMessage();
+ animate(9, 5,4,0,kMessageLeft,"Ok, Sir.");
+ _vm->renderImage(9, 3);
+ exitOnEscape(3);
+ _vm->renderImage(9, 2);
+ exitOnEscape(3);
+ _vm->renderImage(9, 7);
+ exitOnEscape(6);
+ _vm->renderImage(9, 6);
+ exitOnEscape(6);
+ animate(9, 0,0,0,kMessageLeft,"Geschwindigkeit:");
+ _vm->renderMessage("Zweitausend hpm", kMessageLeft);
+ exitOnEscape(28);
+ _vm->removeMessage();
+ _vm->renderMessage("Dreitausend", kMessageLeft);
+ exitOnEscape(28);
+ _vm->removeMessage();
+
+ const char *textCounting[4] =
+ {"Viertausend","F\201nftausend","Sechstausend","Siebentausend"};
+ _vm->renderImage(31, 0);
+ _vm->paletteBrightness();
+ for (int i = 0; i < 4; ++i){
+ _vm->renderMessage(textCounting[i], kMessageLeft);
+ for (int j = 0; j < 28; ++j) {
+ _vm->renderImage(31, (j % 3) + 1);
+ exitOnEscape(1);
+ }
+ _vm->removeMessage();
+ }
+ _vm->renderMessage("Achttau...", kMessageLeft);
+ _vm->renderImage(31, 6);
+ exitOnEscape(3);
+ _vm->renderImage(31, 3);
+ exitOnEscape(3);
+ _vm->renderImage(31, 4);
+ exitOnEscape(3);
+ _vm->renderImage(31, 5);
+ exitOnEscape(3);
+ _vm->renderImage(31, _gm->invertSection(5));
+ exitOnEscape(18);
+ _vm->removeMessage();
+
+ _vm->renderImage(9, 0);
+ _vm->renderImage(9, 1);
+ _vm->renderImage(9, 9);
+ _vm->paletteBrightness();
+ _vm->renderBox(0, 138, 320, 62, kColorBlack);
+ _vm->paletteBrightness();
+ animate(9, 11,10,0,kMessageRight,"Was war das?");
+ _vm->renderImage(9, 3);
+ exitOnEscape(3);
+ _vm->renderImage(9, 4);
+ animate(9, 5,4,0,kMessageLeft,"Keine Ahnung, Sir.");
+ animate(9, 0,0,0,kMessageCenter,"Ingenieur an Commander, bitte kommen!");
+ _vm->renderImage(9, 12);
+ exitOnEscape(2);
+ _vm->renderImage(9, 13);
+ exitOnEscape(2);
+ _vm->renderImage(9, 14);
+ animate(9, 19,20,0,kMessageRight,"Was ist los?");
+ animate(9, 0,0,0,kMessageCenter,"Wir haben einen Druckabfall im Hauptantriebssystem, Sir.|Einen Moment, ich schaue sofort nach, woran es liegt.");
+ exitOnEscape(20);
+ animate(9, 0,0,0,kMessageCenter,"Schei\341e, der Ionenantrieb ist explodiert!|Die Teile sind \201ber den ganzen|Maschinenraum verstreut.");
+ animate(9, 19,20,0,kMessageRight,"Ach, du meine G\201te!|Gibt es irgendeine M\224glichkeit,|den Schaden schnell zu beheben?");
+ animate(9, 0,0,0,kMessageCenter,"Nein, Sir. Es sieht schlecht aus.");
+ _vm->renderImage(9, 16);
+ exitOnEscape(3);
+ _vm->renderImage(9, 17);
+ animate(9, 19,20,18,17,0,kMessageRight,"Hmm, die Erde zu alarmieren, w\201rde zu lange dauern.");
+ animate(9, 19,20,18,17,0,kMessageRight,"Ich darf kein Risiko eingehen.|Captain, geben Sie sofort Alarm!");
+ animate(9, 5,4,0,kMessageLeft,"Ok, Sir.");
+ _vm->renderImage(9, 3);
+ exitOnEscape(3);
+ _vm->renderImage(9, 2);
+ exitOnEscape(3);
+ _vm->renderImage(9, 8);
+ exitOnEscape(6);
+ _vm->renderImage(9, 6);
+ _vm->playSound(kAudioSiren);
+
+ exitOnEscape(6);
+ _vm->renderImage(9, 3);
+ exitOnEscape(3);
+ _vm->renderImage(9, 4);
+ _vm->renderImage(9, 16);
+ exitOnEscape(3);
+ _vm->renderImage(9, 15);
+ animate(9, 19,20,0,kMessageRight,"Commander an alle! Achtung, Achtung!|Begeben Sie sich sofort zum Notraumschiff!");
+ animate(9, 19,20,0,kMessageRight,"Ich wiederhole:|Begeben Sie sich sofort zum Notraumschiff!");
+ exitOnEscape(10);
+ _vm->renderImage(9, 13);
+ exitOnEscape(2);
+ _vm->renderImage(9, 12);
+ exitOnEscape(2);
+ _vm->renderImage(9, 9);
+ animate(9, 11,10,0,kMessageRight,"Captain, bereiten Sie alles für den Start vor!|Wir m\201ssen zur\201ck zur Erde!");
+ animate(9, 5,4,0,kMessageLeft,"Ok, Sir.");
+ _vm->paletteFadeOut();
+
+ while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
+ exitOnEscape(1);
+
+ _vm->_system->fillScreen(kColorBlack);
+ _vm->_menuBrightness = 255;
+ _vm->paletteBrightness();
+ animate(9,0,0,0,kMessageNormal,"Eine Stunde sp\204ter ...");
+ _vm->_menuBrightness = 5;
+ _vm->paletteBrightness();
+
+ _vm->renderImage(31, 0);
+ _vm->paletteFadeIn();
+ animate(31, 0,0,0,kMessageNormal,"Die Besatzung hat die \"Supernova\" verlassen.");
+ animate(31, 0,0,0,kMessageNormal,"Das Schiff wird zwar in acht Jahren sein Ziel|erreichen, allerdings ohne Mannschaft.");
+ animate(31, 0,0,0,kMessageNormal,"Das ist das kl\204gliche Ende|der Mission Supernova.");
+ animate(31, 0,0,0,kMessageNormal,"Sie k\224nnen jetzt ihren Computer ausschalten.");
+ exitOnEscape(54);
+ animate(31, 0,0,0,kMessageNormal,"Halt!");
+ animate(31, 0,0,0,kMessageNormal,"Warten Sie!");
+ animate(31, 0,0,0,kMessageNormal,"Es regt sich etwas im Schiff.");
+
+ _vm->_brightness = 0;
+ _vm->paletteBrightness();
+ exitOnEscape(10);
+ _vm->playSound(kAudioUndef6);
+ while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
+ ;
+ exitOnEscape(10);
+ _vm->playSound(kAudioUndef6);
+ while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
+ ;
+ exitOnEscape(10);
+ _vm->playSound(kAudioUndef6);
+ while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
+ ;
+ exitOnEscape(30);
+ animate(22, 0,0,0,kMessageNormal,"Uuuuaaaahhhhh");
+ exitOnEscape(18);
+ animate(22, 0,0,0,kMessageNormal,"Huch, ich bin ja gefesselt!|Wo bin ich?");
+ animate(22, 0,0,0,kMessageNormal,"Ach so, das sind ja die Sicherheitsgurte.|Ich arbeite ja jetzt in diesem Raumschiff hier.");
+ animate(22, 0,0,0,kMessageNormal,"Was? Schon zwei Uhr! Wieso|hat mich denn noch keiner|aus dem Bett geschmissen?");
+ animate(22, 0,0,0,kMessageNormal,"Ich werde mal nachsehen.");
+ exitOnEscape(18);
+ animate(22, 0,0,0,kMessageNormal,"Autsch!");
+ animate(22, 0,0,0,kMessageNormal,"Schei\341etagenbett!");
+ exitOnEscape(18);
+ animate(22, 0,0,0,kMessageNormal,"Erst mal den Lichtschalter finden.");
+ animate(22, 0,0,0,kMessageNormal,"Hmm, gar nicht so einfach|bei Schwerelosigkeit.");
+ exitOnEscape(36);
+ animate(22, 0,0,0,kMessageNormal,"Ah, hier ist er.");
+ _vm->removeMessage();
+
+#undef exitOnEscape
+}
+
+void Intro::leaveCutscene() {
+ _vm->removeMessage();
+ _gm->changeRoom(CABIN_R3);
+ _gm->_guiEnabled = true;
+ _vm->_allowSaveGame = true;
}
bool ShipCorridor::interact(Action verb, Object &obj1, Object &obj2) {
@@ -634,6 +918,8 @@ void ShipCabinR3::onEntrance() {
for (int i = 0; i < 3; ++i)
_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(i));
+ _vm->paletteBrightness();
+ _vm->paletteFadeIn();
setRoomSeen(true);
}
@@ -2747,4 +3033,56 @@ bool AxacussSign::interact(Action verb, Object &obj1, Object &obj2) {
return false;
}
+void Outro::onEntrance() {
+
+}
+
+void Outro::animation() {
+
+}
+
+void Outro::animate(int filenumber, int section1, int section2, int duration) {
+ while (duration) {
+ _vm->renderImage(filenumber, section1);
+ _gm->wait2(2);
+ _vm->renderImage(filenumber, section2);
+ _gm->wait2(2);
+ --duration;
+ }
+}
+
+void Outro::animate(int filenumber, int section1, int section2, int duration,
+ MessagePosition position, const char *text) {
+ _vm->renderMessage(text, position);
+ int delay = (Common::strnlen(text, 512) + 20) * (10 - duration) * _vm->_textSpeed / 400;
+ while (delay) {
+ if (section1)
+ _vm->renderImage(filenumber, section1);
+ _gm->wait2(2);
+ if (section2)
+ _vm->renderImage(filenumber, section2);
+ _gm->wait2(2);
+ --delay;
+ }
+ _vm->removeMessage();
+}
+
+void Outro::animate(int filenumber, int section1, int section2, int section3, int section4,
+ int duration, MessagePosition position, const char *text) {
+ _vm->renderMessage(text, position);
+ if (duration == 0)
+ duration = (Common::strnlen(text, 512) + 20) * _vm->_textSpeed / 40;
+
+ while(duration) {
+ _vm->renderImage(filenumber, section1);
+ _vm->renderImage(filenumber, section3);
+ _gm->wait2(2);
+ _vm->renderImage(filenumber, section2);
+ _vm->renderImage(filenumber, section4);
+ _gm->wait2(2);
+ duration--;
+ }
+ _vm->removeMessage();
+}
+
}
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index a5895fa..0ffa6ee 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -108,10 +108,40 @@ public:
_objectState[3] =
Object(_id, "Discman", "Es ist eine \"Mad Monkeys\"-CD darin.", DISCMAN,
TAKE | COMBINABLE, 255, 255, 0, NULLROOM, 0);
+
+ _shouldExit = false;
+
+ introText = "^(C) 1994 Thomas und Steffen Dingel#"
+ "Story und Grafik:^ Thomas Dingel#"
+ "Programmierung:^ Steffen Dingel#"
+ "Musik:^ Bernd Hoffmann#"
+ "Getestet von ...#"
+ "^Matthias Neef#"
+ "^Sascha Otterbach#"
+ "^Thomas Mazzoni#"
+ "^Matthias Klein#"
+ "^Gerrit Rothmaier#"
+ "^Thomas Hassler#"
+ "^Rene Koch#"
+ "°";
}
virtual void onEntrance();
- virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+ void animate(int filenumber, int section1, int section2, int duration);
+ void animate(int filenumber, int section1, int section2, int duration, MessagePosition position,
+ const char *text);
+ void animate(int filenumber, int section1, int section2, int section3, int section4, int duration,
+ MessagePosition position, const char *text);
+
+ void titleScreen();
+ void titleFadeIn();
+ void cutscene();
+ void leaveCutscene();
+
+ bool _shouldExit;
+ Common::String introText;
};
// Spaceship
@@ -1603,5 +1633,43 @@ public:
virtual bool interact(Action verb, Object &obj1, Object &obj2);
};
+class Outro : public Room {
+ Outro(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = -1;
+ _id = OUTRO;
+ _shown[0] = false;
+
+ outroText = "^ E#N#D#E ...########"
+ "# ... des ersten Teils!########"
+ "#########"
+ "^Aber:#"
+ "Das Abenteuer geht weiter, ...##"
+ "... wenn Sie sich für 30,- DM registrieren lassen!##"
+ "(Falls Sie das nicht schon längst getan haben.)##"
+ "In^ Teil 2 - Der Doppelgänger^ erwarten Sie:##"
+ "Knifflige Puzzles,##"
+ "noch mehr Grafik und Sound,##"
+ "ein perfekt geplanter Museumseinbruch,##"
+ "das Virtual-Reality-Spiel \"Indiana Joe\"##"
+ "und vieles mehr!##"
+ "°";
+ }
+
+ virtual void onEntrance();
+ virtual void animation();
+
+private:
+ void animate(int filenumber, int section1, int section2, int duration);
+ void animate(int filenumber, int section1, int section2, int duration, MessagePosition position,
+ const char *text);
+ void animate(int filenumber, int section1, int section2, int section3, int section4, int duration,
+ MessagePosition position, const char *text);
+
+ Common::String outroText;
+};
+
}
#endif // ROOMS_H
Commit: 5f19833803c364586d5053ad81bdf9fbaebeb750
https://github.com/scummvm/scummvm/commit/5f19833803c364586d5053ad81bdf9fbaebeb750
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:01:00Z
Commit Message:
SUPERNOVA: Remvomes manual assigning of current room
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index b37df19..5909e5a 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -240,7 +240,7 @@ GameManager::GameManager(SupernovaEngine *vm) {
_vm = vm;
initRooms();
- _currentRoom = _rooms[SLEEP];
+ changeRoom(INTRO);
initState();
initGui();
}
Commit: 7cae6fde30ed39240cb3711440edcc86158ae77a
https://github.com/scummvm/scummvm/commit/7cae6fde30ed39240cb3711440edcc86158ae77a
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:07:37Z
Commit Message:
SUPERNOVA: Fixes number of rooms
Changed paths:
engines/supernova/msn_def.h
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 5e90cec..a532a2b 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -38,11 +38,11 @@ const int kMaxClickfieldZus = 80;
const int kMaxObject = 25;
const int kMaxCarry = 30;
-const int kRoomsChap0 = 1;
-const int kRoomsChap1 = 16;
-const int kRoomsChap2 = 9;
-const int kRoomsChap3 = 21;
-const int kRoomsNum = kRoomsChap0 + kRoomsChap1 + kRoomsChap2 + kRoomsChap3;
+//const int kRoomsChap0 = 1;
+//const int kRoomsChap1 = 16;
+//const int kRoomsChap2 = 9;
+//const int kRoomsChap3 = 21;
+//const int kRoomsNum = kRoomsChap0 + kRoomsChap1 + kRoomsChap2 + kRoomsChap3;
enum MessagePosition {
kMessageNormal,
@@ -345,13 +345,13 @@ enum Action {
enum RoomID {
INTRO,CORRIDOR,HALL,SLEEP,COCKPIT,AIRLOCK,
HOLD,LANDINGMODULE,GENERATOR,OUTSIDE,
- CABIN_R1,CABIN_R2,CABIN_R3,CABIN_L1,CABIN_L3,CABIN_L2,BATHROOM,
+ CABIN_R1,CABIN_R2,CABIN_R3,CABIN_L1,CABIN_L2,CABIN_L3,BATHROOM,
ROCKS,CAVE,MEETUP,ENTRANCE,REST,ROGER,GLIDER,MEETUP2,MEETUP3,
CELL,CORRIDOR1,CORRIDOR2,CORRIDOR3,CORRIDOR4,CORRIDOR5,CORRIDOR6,CORRIDOR7,CORRIDOR8,CORRIDOR9,
BCORRIDOR,GUARD,GUARD3,OFFICE_L1,OFFICE_L2,OFFICE_R1,OFFICE_R2,OFFICE_L,
- ELEVATOR,STATION,SIGN,OUTRO,NULLROOM
+ ELEVATOR,STATION,SIGN,OUTRO,NUMROOMS,NULLROOM
};
enum ObjectID {
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 5909e5a..94a2ef4 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -66,7 +66,7 @@ bool GameManager::serialize(Common::WriteStream *out) {
}
// Rooms
- for (int i = 0; i < kRoomsNum; ++i) {
+ for (int i = 0; i < NUMROOMS; ++i) {
_rooms[i]->serialize(out);
}
@@ -113,7 +113,7 @@ bool GameManager::deserialize(Common::ReadStream *in) {
}
// Rooms
- for (int i = 0; i < kRoomsNum; ++i) {
+ for (int i = 0; i < NUMROOMS; ++i) {
_rooms[i]->deserialize(in);
}
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 72aad4c..1ffa2d0 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -110,7 +110,7 @@ public:
int _mouseY;
int _mouseField;
Room *_currentRoom;
- Room *_rooms[kRoomsNum];
+ Room *_rooms[NUMROOMS];
Inventory _inventory;
GameState _state;
int _status;
Commit: 735e2a8301774827ac793ad4a773d30d569d9102
https://github.com/scummvm/scummvm/commit/735e2a8301774827ac793ad4a773d30d569d9102
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:07:46Z
Commit Message:
SUPERNOVA: Assigns room id of ShipOuterSpace
Changed paths:
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 0ffa6ee..73f364c 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -639,6 +639,7 @@ public:
_gm = gm;
_fileNumber = 12;
+ _id = OUTSIDE;
_shown[0] = true;
_objectState[0] = Object(_id, "Seil",Object::defaultDescription,NULLOBJECT,UNNECESSARY | EXIT,0,0,0,GENERATOR,12);
Commit: 68c52362e562863acbede225989842839be0e9d6
https://github.com/scummvm/scummvm/commit/68c52362e562863acbede225989842839be0e9d6
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:14:47Z
Commit Message:
SUPERNOVA: Adds Outro initialization
Changed paths:
engines/supernova/rooms.h
engines/supernova/state.cpp
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 73f364c..0ad7468 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -1635,6 +1635,7 @@ public:
};
class Outro : public Room {
+public:
Outro(SupernovaEngine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 94a2ef4..90b2ae3 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -299,6 +299,7 @@ void GameManager::destroyRooms() {
delete _rooms[ELEVATOR];
delete _rooms[STATION];
delete _rooms[SIGN];
+ delete _rooms[OUTRO];
}
@@ -389,6 +390,7 @@ void GameManager::initRooms() {
_rooms[ELEVATOR] = new AxacussElevator(_vm, this);
_rooms[STATION] = new AxacussStation(_vm, this);
_rooms[SIGN] = new AxacussSign(_vm, this);
+ _rooms[OUTRO] = new Outro(_vm, this);
}
void GameManager::initGui() {
Commit: 23f57ca83fac453afd9f04b619717cc9ddd03a75
https://github.com/scummvm/scummvm/commit/23f57ca83fac453afd9f04b619717cc9ddd03a75
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:14:56Z
Commit Message:
SUPERNOVA: Fixes de-/serialization of game state
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/state.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 8ec0e4a..ba6f653 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -33,27 +33,28 @@ bool Room::serialize(Common::WriteStream *out) {
if (out->err())
return false;
- out->writeByte(_id);
+ out->writeSint32LE(_id);
for (int i = 0; i < kMaxSection; ++i)
out->writeByte(_shown[i]);
int numObjects = 0;
while ((_objectState[numObjects]._id != INVALIDOBJECT) && (numObjects < kMaxObject))
++numObjects;
- out->writeByte(numObjects);
+ out->writeSint32LE(numObjects);
for (int i = 0; i < numObjects; ++i) {
- out->writeSint16LE(_objectState[i]._name.size() + 1);
- out->writeString(_objectState[i]._name.c_str());
- out->writeSint16LE(_objectState[i]._description.size() + 1);
- out->writeString(_objectState[i]._description.c_str());
+ out->writeUint32LE(_objectState[i]._name.size());
+ out->writeString(_objectState[i]._name);
+ out->writeUint32LE(_objectState[i]._description.size());
+ out->writeString(_objectState[i]._description);
+
out->writeByte(_objectState[i]._roomId);
- out->writeByte(_objectState[i]._id);
- out->writeSint16LE(_objectState[i]._type);
+ out->writeSint32LE(_objectState[i]._id);
+ out->writeSint32LE(_objectState[i]._type);
out->writeByte(_objectState[i]._click);
out->writeByte(_objectState[i]._click2);
out->writeByte(_objectState[i]._section);
- out->writeByte(_objectState[i]._exitRoom);
+ out->writeSint32LE(_objectState[i]._exitRoom);
out->writeByte(_objectState[i]._direction);
}
@@ -66,27 +67,37 @@ bool Room::deserialize(Common::ReadStream *in) {
if (in->err())
return false;
- in->readByte();
+ in->readSint32LE();
for (int i = 0; i < kMaxSection; ++i)
_shown[i] = in->readByte();
- int numObjects = in->readByte();
- int bufferSize = 0;
- char stringBuffer[256];
+ int numObjects = in->readSint32LE();
+ int stringLength = 0;
+ Common::SeekableReadStream *stream = NULL;
for (int i = 0; i < numObjects; ++i) {
- bufferSize = in->readSint16LE();
- in->read(stringBuffer, bufferSize > 256 ? 256 : bufferSize);
- _objectState[i]._name = stringBuffer;
- bufferSize = in->readSint16LE();
- in->read(stringBuffer, bufferSize > 256 ? 256 : bufferSize);
- _objectState[i]._description = stringBuffer;
+ stringLength = in->readUint32LE();
+ if (stringLength) {
+ stream = in->readStream(stringLength);
+ _objectState[i]._name = stream->readLine();
+ } else {
+ _objectState[i]._name = "";
+ }
+
+ stringLength = in->readUint32LE();
+ if (stringLength) {
+ stream = in->readStream(stringLength);
+ _objectState[i]._description = stream->readLine();
+ } else {
+ _objectState[i]._description = "";
+ }
+
_objectState[i]._roomId = in->readByte();
- _objectState[i]._id = static_cast<ObjectID>(in->readByte());
- _objectState[i]._type = static_cast<ObjectType>(in->readSint16LE());
+ _objectState[i]._id = static_cast<ObjectID>(in->readSint32LE());
+ _objectState[i]._type = static_cast<ObjectType>(in->readSint32LE());
_objectState[i]._click = in->readByte();
_objectState[i]._click2 = in->readByte();
_objectState[i]._section = in->readByte();
- _objectState[i]._exitRoom = static_cast<RoomID>(in->readByte());
+ _objectState[i]._exitRoom = static_cast<RoomID>(in->readSint32LE());
_objectState[i]._direction = in->readByte();
}
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 90b2ae3..8985f47 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -56,13 +56,13 @@ bool GameManager::serialize(Common::WriteStream *out) {
out->writeByte(_state._dream);
// Inventory
- out->writeSByte(_inventory.getSize());
- out->writeSByte(_inventoryScroll);
+ out->writeSint32LE(_inventory.getSize());
+ out->writeSint32LE(_inventoryScroll);
for (int i = 0; i < _inventory.getSize(); ++i) {
Object *objectStateBegin = _rooms[_inventory.get(i)->_roomId]->getObject(0);
byte objectIndex = _inventory.get(i) - objectStateBegin;
- out->writeByte(_inventory.get(i)->_roomId);
- out->writeByte(objectIndex);
+ out->writeSint32LE(_inventory.get(i)->_roomId);
+ out->writeSint32LE(objectIndex);
}
// Rooms
@@ -75,9 +75,8 @@ bool GameManager::serialize(Common::WriteStream *out) {
bool GameManager::deserialize(Common::ReadStream *in) {
- if (in->err()) {
+ if (in->err())
return false;
- }
// GameState
_state._time = in->readSint32LE();
@@ -103,12 +102,12 @@ bool GameManager::deserialize(Common::ReadStream *in) {
_state._dream = in->readByte();
// Inventory
- int inventorySize = in->readSByte();
- _inventoryScroll = in->readSByte();
+ int inventorySize = in->readSint32LE();
+ _inventoryScroll = in->readSint32LE();
_inventory.clear();
for (int i = 0; i < inventorySize; ++i) {
- RoomID objectRoom = static_cast<RoomID>(in->readByte());
- int objectIndex = in->readByte();
+ RoomID objectRoom = static_cast<RoomID>(in->readSint32LE());
+ int objectIndex = in->readSint32LE();
_inventory.add(*_rooms[objectRoom]->getObject(objectIndex));
}
Commit: 749fa6336e97ade41bfb846d35115ed2db7c4141
https://github.com/scummvm/scummvm/commit/749fa6336e97ade41bfb846d35115ed2db7c4141
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:14:56Z
Commit Message:
SUPERNOVA: Fixes save/load dialog
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 19cec43..6371f6c 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -806,23 +806,18 @@ Common::Error SupernovaEngine::saveGameState(int slot, const Common::String &des
}
bool SupernovaEngine::loadGame(int slot) {
- GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser("Load game:", "Load:", false);
- int loadGameSlot = dialog->runModalWithCurrentTarget();
- delete dialog;
-
- if (loadGameSlot < 0)
+ if (slot < 0)
return false;
- Common::String filename = Common::String::format("msn_save.%03d", loadGameSlot);
-// Common::InSaveFile *savefile = _saveFileMan->openForLoading(filename);
- Common::InSaveFile *savefile = _saveFileMan->openRawFile(filename);
+ Common::String filename = Common::String::format("msn_save.%03d", slot);
+ Common::InSaveFile *savefile = _saveFileMan->openForLoading(filename);
if (!savefile)
return false;
int descriptionSize = savefile->readSint16LE();
savefile->skip(descriptionSize);
savefile->skip(6);
-// Graphics::skipThumbnail(*savefile);
+ Graphics::skipThumbnail(*savefile);
_gm->deserialize(savefile);
delete savefile;
@@ -831,16 +826,11 @@ bool SupernovaEngine::loadGame(int slot) {
}
bool SupernovaEngine::saveGame(int slot, const Common::String &description) {
- GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser("Save game:", "Save", true);
- int saveGameSlot = dialog->runModalWithCurrentTarget();
- Common::String saveGameDescription = dialog->getResultString();
- delete dialog;
-
- if (saveGameSlot < 0)
+ if (slot < 0)
return false;
- Common::String filename = Common::String::format("msn_save.%03d", saveGameSlot);
- Common::OutSaveFile *savefile = _saveFileMan->openForSaving(filename, false);
+ Common::String filename = Common::String::format("msn_save.%03d", slot);
+ Common::OutSaveFile *savefile = _saveFileMan->openForSaving(filename);
if (!savefile)
return false;
@@ -849,11 +839,11 @@ bool SupernovaEngine::saveGame(int slot, const Common::String &description) {
uint32 saveDate = (currentDate.tm_mday & 0xFF) << 24 | ((currentDate.tm_mon + 1) & 0xFF) << 16 | ((currentDate.tm_year + 1900) & 0xFFFF);
uint16 saveTime = (currentDate.tm_hour & 0xFF) << 8 | ((currentDate.tm_min) & 0xFF);
- savefile->writeSint16LE(saveGameDescription.size() + 1);
- savefile->write(saveGameDescription.c_str(), saveGameDescription.size() + 1);
+ savefile->writeSint16LE(description.size() + 1);
+ savefile->write(description.c_str(), description.size() + 1);
savefile->writeUint32LE(saveDate);
savefile->writeUint16LE(saveTime);
-// Graphics::saveThumbnail(*savefile);
+ Graphics::saveThumbnail(*savefile);
_gm->serialize(savefile);
savefile->finalize();
Commit: 142e1743ced232e2f269615c93ce0bbc3974144e
https://github.com/scummvm/scummvm/commit/142e1743ced232e2f269615c93ce0bbc3974144e
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:25Z
Commit Message:
SUPERNOVA: Fixes playing vinyl in CabinL3
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/state.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index ba6f653..2c87b58 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -792,44 +792,28 @@ bool ShipCabinL3::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_PRESS) && (obj1._id == TURNTABLE_BUTTON)) {
if (!isSectionVisible(15)) {
_vm->renderMessage("Es ist doch gar keine Platte aufgelegt.");
- } else if (!isSectionVisible(10) &&
- !isSectionVisible(11) &&
- isSectionVisible(12)) {
- if (_gm->_soundDevice != 2) {
- _gm->drawImage(14);
- setSectionVisible(15, false);
- for (int i = 3; i; i--) {
- _vm->playSound(kAudioTurntable);
- if (_gm->_soundDevice) {
- do {
- if (isSectionVisible(13)) {
- _gm->drawImage(14);
- setSectionVisible(13, false);
- } else {
- _gm->drawImage(13);
- setSectionVisible(14, false);
- }
- _gm->wait2(3);
- } while (_gm->_status);
+ } else if (!isSectionVisible(10) && !isSectionVisible(11) && isSectionVisible(12)) {
+ _gm->drawImage(14);
+ setSectionVisible(15, false);
+ for (int i = 3; i; i--) {
+ _vm->playSound(kAudioTurntable);
+ while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle)) {
+ if (isSectionVisible(13)) {
+ _gm->drawImage(14);
+ setSectionVisible(13, false);
} else {
- _gm->wait2(1);
+ _gm->drawImage(13);
+ setSectionVisible(14, false);
}
- }
- } else {
- for (int i = 10; i; i--) {
- _gm->drawImage(14);
- _gm->wait2(3);
- _gm->drawImage(13);
_gm->wait2(3);
}
}
- _gm->drawImage(15);
- setSectionVisible(14, false);
- setSectionVisible(13, false);
- _vm->renderMessage("Die Platte scheint einen Sprung zu haben.");
}
- } else if ((verb == ACTION_TAKE) && (obj1._id == RECORD) &&
- (obj1._click != 15)) {
+ _gm->drawImage(15);
+ setSectionVisible(14, false);
+ setSectionVisible(13, false);
+ _vm->renderMessage("Die Platte scheint einen Sprung zu haben.");
+ } else if ((verb == ACTION_TAKE) && (obj1._id == RECORD) && (obj1._click != 15)) {
_gm->drawImage(9);
setSectionVisible(13, false);
setSectionVisible(14, false);
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 1ffa2d0..5d93961 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -113,7 +113,6 @@ public:
Room *_rooms[NUMROOMS];
Inventory _inventory;
GameState _state;
- int _status;
bool _processInput;
bool _guiEnabled;
bool _animationEnabled;
Commit: 02290c32b68ecf6bc39ee5f7149051463c5bd626
https://github.com/scummvm/scummvm/commit/02290c32b68ecf6bc39ee5f7149051463c5bd626
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:30Z
Commit Message:
SUPERNOVA: Allows saving by default
When saving is not apropriate, for example during cutscenes, explicitly
disable it.
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/supernova.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 2c87b58..1bd5610 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -108,6 +108,7 @@ bool Room::deserialize(Common::ReadStream *in) {
void Intro::onEntrance() {
_gm->_guiEnabled = false;
+ _vm->_allowSaveGame = false;
titleScreen();
cutscene();
leaveCutscene();
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 6371f6c..5128a1c 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -112,7 +112,7 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)
, _screenHeight(200)
, _messageDisplayed(false)
, _allowLoadGame(true)
- , _allowSaveGame(false)
+ , _allowSaveGame(true)
{
// const Common::FSNode gameDataDir(ConfMan.get("path"));
// SearchMan.addSubDirectoryMatching(gameDataDir, "sound");
Commit: 577ec1c56dcf8c884234942b252d952c54e16c8b
https://github.com/scummvm/scummvm/commit/577ec1c56dcf8c884234942b252d952c54e16c8b
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:31Z
Commit Message:
SUPERNOVA: Fix missing return value for cmdGiveAll debug command
Changed paths:
engines/supernova/console.cpp
diff --git a/engines/supernova/console.cpp b/engines/supernova/console.cpp
index 328c46c..29c30b6 100644
--- a/engines/supernova/console.cpp
+++ b/engines/supernova/console.cpp
@@ -104,6 +104,7 @@ bool Console::cmdGiveAll(int argc, const char **argv) {
_gm->takeObject(*_gm->_rooms[AIRLOCK]->getObject(4)); // Helmet
_gm->takeObject(*_gm->_rooms[AIRLOCK]->getObject(5)); // Space Suit
_gm->takeObject(*_gm->_rooms[AIRLOCK]->getObject(6)); // Supply
+ return true;
}
}
Commit: 5bdfb6f13a6f507ec7ff94305a6ac1b8f256c292
https://github.com/scummvm/scummvm/commit/5bdfb6f13a6f507ec7ff94305a6ac1b8f256c292
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:31Z
Commit Message:
SUPERNOVA: Removes saveload.h
This header file contained info on the data structres of the original
game. The engine reimplementation is too different now to easily provide
compatibility for the original save files though.
Changed paths:
R engines/supernova/saveload.h
diff --git a/engines/supernova/saveload.h b/engines/supernova/saveload.h
deleted file mode 100644
index 3f97d24..0000000
--- a/engines/supernova/saveload.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef SAVELOAD_H
-#define SAVELOAD_H
-
-namespace Supernova {
-
-const int kNumRoom0 = 1;
-const int kNumRoom1 = 16;
-const int kNumRoom2 = 9;
-const int kNumRoom3 = 21;
-
-struct OriginalObject {
- char *_name;
- char *_description;
- byte _id;
- int16 _type;
- char _click;
- char _click2;
- char _section;
- char _exitroom;
- char _direction;
-};
-
-struct OriginalRoom {
- char *_file;
- byte _shown[40];
- uint16 _funcptr[3];
- OriginalObject _object[25];
-};
-
-struct OriginalGameSaveState {
- uint16 _ptrCurrentRoom;
- uint16 _inventory[30];
- int16 _inventorySize;
- int16 _inventoryScroll;
- OriginalRoom _roomlist0[kNumRoom0];
- OriginalRoom _roomlist1[kNumRoom1];
- OriginalRoom _roomlist2[kNumRoom2];
- OriginalRoom _roomlist3[kNumRoom3];
-};
-
-// TODO: Create a table with mapping of offsets to corresponding strings in
-// object definitions to keep save files valid. (msn.exe:0xD400..)
-
-}
-
-#endif // SAVELOAD_H
Commit: 9f3f9f47ad313a3e9b2d71560f8f98df93b54b07
https://github.com/scummvm/scummvm/commit/9f3f9f47ad313a3e9b2d71560f8f98df93b54b07
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:31Z
Commit Message:
SUPERNOVA: Limits inventory scroll
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 8985f47..88957a7 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -500,7 +500,8 @@ void GameManager::processInput() {
if (_inventoryScroll >= 2)
_inventoryScroll -= 2;
} else if (_mouseField == 769) {
- _inventoryScroll += 2;
+ if (_inventoryScroll < _inventory.getSize() - ARRAYSIZE(_guiInventory))
+ _inventoryScroll += 2;
}
} else if (_mouseClickType == Common::EVENT_RBUTTONUP) {
_vm->removeMessage();
Commit: 3814f33826bbcb7ecb345865c2932eb638d7122c
https://github.com/scummvm/scummvm/commit/3814f33826bbcb7ecb345865c2932eb638d7122c
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:31Z
Commit Message:
SUPERNOVA: Scrolls inventory when taking an object
Signed-off-by: Joseph-Eugene Winzer <joewinzer at googlemail.com>
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 88957a7..04853ca 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -817,6 +817,10 @@ void GameManager::takeObject(Object &obj) {
obj.setProperty(CARRIED);
obj._click = obj._click2 = 255;
_inventory.add(obj);
+ if (_inventory.getSize() > _inventoryScroll + 8) {
+ _inventoryScroll = _inventory.getSize() - 8;
+ _inventoryScroll += _inventoryScroll % 2;
+ }
}
void GameManager::drawCommandBox() {
Commit: 03414f789a022ef6f665a2cece026250d963e30a
https://github.com/scummvm/scummvm/commit/03414f789a022ef6f665a2cece026250d963e30a
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:31Z
Commit Message:
SUPERNOVA: Implements inventory arrows
Changed paths:
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 04853ca..fa351a0 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -414,6 +414,14 @@ void GameManager::initGui() {
_guiInventory[i].setSize(inventoryX, inventoryY, inventoryX + 135, inventoryY + 9);
_guiInventory[i].setColor(kColorWhite25, kColorDarkRed, kColorWhite35, kColorRed);
}
+ _guiInventoryArrow[0].setSize(272, 161, 279, 180);
+ _guiInventoryArrow[0].setColor(kColorWhite25, kColorDarkRed, kColorWhite35, kColorRed);
+ _guiInventoryArrow[0].setText("\x82");
+ _guiInventoryArrow[0].setTextPosition(273, 166);
+ _guiInventoryArrow[1].setSize(272, 181, 279, 200);
+ _guiInventoryArrow[1].setColor(kColorWhite25, kColorDarkRed, kColorWhite35, kColorRed);
+ _guiInventoryArrow[1].setText("\x83");
+ _guiInventoryArrow[1].setTextPosition(273, 186);
}
@@ -578,7 +586,7 @@ void GameManager::processInput() {
if (_mouseField != field) {
if (_mouseField >= 768) {
- inventory_arrow(_mouseField - 768, false);
+ _guiInventoryArrow[_mouseField - 768].setHighlight(false);
} else if (_mouseField >= 512) {
_guiInventory[_mouseField - 512].setHighlight(false);
} else if (_mouseField >= 256) {
@@ -589,7 +597,7 @@ void GameManager::processInput() {
_mouseField = field;
if (_mouseField >= 768) {
- inventory_arrow(_mouseField - 768, true);
+ _guiInventoryArrow[_mouseField - 768].setHighlight(true);
} else if (_mouseField >= 512) {
_guiInventory[_mouseField - 512].setHighlight(true);
_currentInputObject = _inventory.get(_mouseField - 512 + _inventoryScroll);
@@ -837,10 +845,6 @@ void GameManager::drawCommandBox() {
}
}
-void GameManager::inventory_arrow(int num, bool brightness) {
- // STUB
-}
-
void GameManager::drawInventory() {
for (int i = 0; i < ARRAYSIZE(_guiInventory); ++i) {
_vm->renderBox(_guiInventory[i].left,
@@ -854,8 +858,30 @@ void GameManager::drawInventory() {
_guiInventory[i]._textColor);
}
- _vm->renderBox(272, 161, 7, 19, kColorWhite25);
- _vm->renderBox(272, 181, 7, 19, kColorWhite25);
+ _vm->renderBox(_guiInventoryArrow[0].left,
+ _guiInventoryArrow[0].top,
+ _guiInventoryArrow[0].width(),
+ _guiInventoryArrow[0].height(),
+ _guiInventoryArrow[0]._bgColor);
+ _vm->renderBox(_guiInventoryArrow[1].left,
+ _guiInventoryArrow[1].top,
+ _guiInventoryArrow[1].width(),
+ _guiInventoryArrow[1].height(),
+ _guiInventoryArrow[1]._bgColor);
+ if (_inventory.getSize() > ARRAYSIZE(_guiInventory)) {
+ if (_inventoryScroll != 0) {
+ _vm->renderText(_guiInventoryArrow[0]._text,
+ _guiInventoryArrow[0]._textPosition.x,
+ _guiInventoryArrow[0]._textPosition.y,
+ _guiInventoryArrow[0]._textColor);
+ }
+ if (_inventoryScroll + ARRAYSIZE(_guiInventory) < _inventory.getSize()) {
+ _vm->renderText(_guiInventoryArrow[1]._text,
+ _guiInventoryArrow[1]._textPosition.x,
+ _guiInventoryArrow[1]._textPosition.y,
+ _guiInventoryArrow[1]._textColor);
+ }
+ }
}
uint16 GameManager::getKeyInput(bool blockForPrintChar) {
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 5d93961..251ed2b 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -129,6 +129,7 @@ public:
int _exitList[25];
GuiElement _guiCommandButton[10];
GuiElement _guiInventory[8];
+ GuiElement _guiInventoryArrow[2];
// 0 PC Speaker | 1 SoundBlaster | 2 No Sound
int _soundDevice;
@@ -170,7 +171,6 @@ public:
void drawMapExits();
void drawStatus();
void drawCommandBox();
- void inventory_arrow(int num, bool brightness);
void drawInventory();
void drawImage(int section);
void changeRoom(RoomID id);
Commit: 7da494427dfb18e05205dcc38150fb96aafa5061
https://github.com/scummvm/scummvm/commit/7da494427dfb18e05205dcc38150fb96aafa5061
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:31Z
Commit Message:
SUPERNOVA: Adds current room to save file
and restores player location to it on load.
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index fa351a0..b562ead 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -66,6 +66,7 @@ bool GameManager::serialize(Common::WriteStream *out) {
}
// Rooms
+ out->writeByte(_currentRoom->getId());
for (int i = 0; i < NUMROOMS; ++i) {
_rooms[i]->serialize(out);
}
@@ -112,6 +113,7 @@ bool GameManager::deserialize(Common::ReadStream *in) {
}
// Rooms
+ _currentRoom = _rooms[static_cast<RoomID>(in->readByte())];
for (int i = 0; i < NUMROOMS; ++i) {
_rooms[i]->deserialize(in);
}
Commit: 945dc9f46fd1744653d88955a2bcbd2f48ca7827
https://github.com/scummvm/scummvm/commit/945dc9f46fd1744653d88955a2bcbd2f48ca7827
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:31Z
Commit Message:
SUPERNOVA: Fixes rendering and logic for cable
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 1bd5610..a88eb6f 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -1068,8 +1068,8 @@ bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
room = _gm->_rooms[GENERATOR];
room->getObject(0)->_click = 15;
room->getObject(1)->_click = 13;
- room->setSectionVisible(6, false);
- room->setSectionVisible(8, false);
+ room->setSectionVisible(6, true);
+ room->setSectionVisible(8, true);
_gm->drawImage(_gm->invertSection(5));
_gm->drawImage(6);
setSectionVisible(4, false);
@@ -1164,22 +1164,21 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
_gm->drawImage(5);
getObject(4)->_name = "langes Kabel mit Stecker";
getObject(4)->_click = 6;
- r = _gm->_rooms[CABIN_L2];
- _gm->_inventory.remove(*r->getObject(9));
+ _gm->_inventory.remove(*_gm->_rooms[CABIN_L2]->getObject(9));
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, LANDINGMOD_HATCH)) {
if (getObject(5)->hasProperty(OPENED)) {
r = _gm->_rooms[HOLD];
if (isSectionVisible(5)) {
- _gm->_rooms[HOLD]->setSectionVisible(5, false);
+ r->setSectionVisible(5, true);
r->getObject(0)->_click = 10;
-
- } else
+ } else {
r->getObject(0)->_click = 9;
- _gm->_rooms[HOLD]->setSectionVisible(4, false);
+ }
+ r->setSectionVisible(4, true);
r->getObject(0)->_name = getObject(4)->_name;
- _gm->drawImage(_gm->invertSection(4));
_gm->drawImage(_gm->invertSection(5));
+ _gm->drawImage(_gm->invertSection(4));
setSectionVisible(11, false);
_gm->drawImage(6);
getObject(4)->_click = 7;
Commit: ba7729a7674e5c363f221b7529fe970d43a648cc
https://github.com/scummvm/scummvm/commit/ba7729a7674e5c363f221b7529fe970d43a648cc
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:31Z
Commit Message:
SUPERNOVA: Restores brightness if power on
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index b562ead..3df96f2 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -949,6 +949,8 @@ void GameManager::roomBrightness() {
if ((_currentRoom->getId() != OUTSIDE) && (_currentRoom->getId() < ROCKS) ) {
if (_state._powerOff)
_vm->_brightness = 153;
+ else
+ _vm->_brightness = 255;
} else if ((_currentRoom->getId() == CAVE)) {
_vm->_brightness = 0;
} else if ((_currentRoom->getId() == GUARD3)) {
Commit: e45d94b0653e58cfe597794dbdd9954beeca0cbb
https://github.com/scummvm/scummvm/commit/e45d94b0653e58cfe597794dbdd9954beeca0cbb
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:31Z
Commit Message:
SUPERNOVA: Implements screen shake
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 3df96f2..57a0edf 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1010,6 +1010,14 @@ void GameManager::handleTime() {
void GameManager::screenShake() {
// STUB
+ for (int i = 0; i < 12; ++i) {
+ _vm->_system->setShakePos(4);
+ wait2(1);
+ _vm->_system->setShakePos(-4);
+ wait2(1);
+ }
+
+ _vm->_system->setShakePos(0);
}
void GameManager::shock() {
Commit: aef0e122c7082a4811675146e33fff4e02e08ee7
https://github.com/scummvm/scummvm/commit/aef0e122c7082a4811675146e33fff4e02e08ee7
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:31Z
Commit Message:
SUPERNOVA: Restores brightness when leaving the cave
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 57a0edf..06d1c76 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -951,9 +951,11 @@ void GameManager::roomBrightness() {
_vm->_brightness = 153;
else
_vm->_brightness = 255;
- } else if ((_currentRoom->getId() == CAVE)) {
+ } else if (_currentRoom->getId() == CAVE) {
_vm->_brightness = 0;
- } else if ((_currentRoom->getId() == GUARD3)) {
+ } else if (_currentRoom->getId() == MEETUP) {
+ _vm->_brightness = 255;
+ } else if (_currentRoom->getId() == GUARD3) {
if (_state._powerOff)
_vm->_brightness = 0;
}
Commit: a4470edb290573d4e87736212a47299b3681eb01
https://github.com/scummvm/scummvm/commit/a4470edb290573d4e87736212a47299b3681eb01
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:31Z
Commit Message:
SUPERNOVA: Fix exiting intro cutscene using Escape
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 06d1c76..860cbe8 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -476,6 +476,7 @@ void GameManager::resetInputState() {
}
bool GameManager::keyPressed(Common::KeyCode keycode, bool equal) {
+ _vm->updateEvents();
bool ret = _key.keycode == keycode;
_key.reset();
Commit: ed7fa6f7d79933dc5cec6b7d4f2bc4080378ecc1
https://github.com/scummvm/scummvm/commit/ed7fa6f7d79933dc5cec6b7d4f2bc4080378ecc1
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:31Z
Commit Message:
SUPERNOVA: Improve save state handling
The saved game files now start with a header and version which allows
to do some sanity check and will allow to change the format in the
future if needed.
Also the MetaEngine can now be queried for the meta infos of a save
state.
Changed paths:
engines/supernova/detection.cpp
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/detection.cpp b/engines/supernova/detection.cpp
index 5770871..b587dbb 100644
--- a/engines/supernova/detection.cpp
+++ b/engines/supernova/detection.cpp
@@ -24,6 +24,7 @@
#include "common/file.h"
#include "common/savefile.h"
#include "common/system.h"
+#include "graphics/thumbnail.h"
#include "engines/advancedDetector.h"
#include "supernova/supernova.h"
@@ -83,6 +84,7 @@ public:
virtual int getMaximumSaveSlot() const {
return 99;
}
+ virtual SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const;
};
bool SupernovaMetaEngine::hasFeature(MetaEngineFeature f) const {
@@ -92,6 +94,13 @@ bool SupernovaMetaEngine::hasFeature(MetaEngineFeature f) const {
case kSupportsListSaves:
// fallthrough
case kSupportsDeleteSave:
+ // fallthrough
+ case kSavesSupportMetaInfo:
+ // fallthrough
+ case kSavesSupportThumbnail:
+ // fallthrough
+ case kSavesSupportCreationDate:
+ // fallthrough
return true;
default:
return false;
@@ -120,10 +129,17 @@ SaveStateList SupernovaMetaEngine::listSaves(const char *target) const {
if (saveSlot >= 0 && saveSlot <= getMaximumSaveSlot()) {
Common::InSaveFile *savefile = g_system->getSavefileManager()->openForLoading(*file);
if (savefile) {
- savefile->skip(2);
- savefile->read(saveFileDesc, sizeof(saveFileDesc));
- saveFileList.push_back(SaveStateDescriptor(saveSlot, saveFileDesc));
-
+ uint saveHeader = savefile->readUint32LE();
+ if (saveHeader == SAVEGAME_HEADER) {
+ byte saveVersion = savefile->readByte();
+ if (saveVersion <= SAVEGAME_VERSION) {
+ int saveFileDescSize = savefile->readSint16LE();
+ char* saveFileDesc = new char[saveFileDescSize];
+ savefile->read(saveFileDesc, saveFileDescSize);
+ saveFileList.push_back(SaveStateDescriptor(saveSlot, saveFileDesc));
+ delete [] saveFileDesc;
+ }
+ }
delete savefile;
}
}
@@ -138,6 +154,54 @@ void SupernovaMetaEngine::removeSaveState(const char *target, int slot) const {
g_system->getSavefileManager()->removeSavefile(filename);
}
+SaveStateDescriptor SupernovaMetaEngine::querySaveMetaInfos(const char *target, int slot) const {
+ Common::String fileName = Common::String::format("msn_save.%03d", slot);
+ Common::InSaveFile *savefile = g_system->getSavefileManager()->openForLoading(fileName);
+
+ if (savefile) {
+ uint saveHeader = savefile->readUint32LE();
+ if (saveHeader != SAVEGAME_HEADER) {
+ delete savefile;
+ return SaveStateDescriptor();
+ }
+ byte saveVersion = savefile->readByte();
+ if (saveVersion > SAVEGAME_VERSION){
+ delete savefile;
+ return SaveStateDescriptor();
+ }
+
+ int descriptionSize = savefile->readSint16LE();
+ char* description = new char[descriptionSize];
+ savefile->read(description, descriptionSize);
+ SaveStateDescriptor desc(slot, description);
+ delete [] description;
+
+ uint32 saveDate = savefile->readUint32LE();
+ int day = (saveDate >> 24) & 0xFF;
+ int month = (saveDate >> 16) & 0xFF;
+ int year = saveDate & 0xFFFF;
+ desc.setSaveDate(year, month, day);
+
+ uint16 saveTime = savefile->readUint16LE();
+ int hour = (saveTime >> 8) & 0xFF;
+ int minutes = saveTime & 0xFF;
+ desc.setSaveTime(hour, minutes);
+
+
+ if (Graphics::checkThumbnailHeader(*savefile)) {
+ Graphics::Surface *const thumbnail = Graphics::loadThumbnail(*savefile);
+ desc.setThumbnail(thumbnail);
+ }
+
+ delete savefile;
+
+ return desc;
+ }
+
+ return SaveStateDescriptor();
+}
+
+
#if PLUGIN_ENABLED_DYNAMIC(SUPERNOVA)
REGISTER_PLUGIN_DYNAMIC(SUPERNOVA, PLUGIN_TYPE_ENGINE, SupernovaMetaEngine);
#else
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 5128a1c..17033da 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -814,6 +814,20 @@ bool SupernovaEngine::loadGame(int slot) {
if (!savefile)
return false;
+ uint saveHeader = savefile->readUint32LE();
+ if (saveHeader != SAVEGAME_HEADER) {
+ warning("No header found in '%s'", filename.c_str());
+ delete savefile;
+ return Common::kUnknownError;
+ }
+
+ byte saveVersion = savefile->readByte();
+ if (saveVersion > SAVEGAME_VERSION) {
+ warning("Save game version %i not supported", saveVersion);
+ delete savefile;
+ return Common::kUnknownError;
+ }
+
int descriptionSize = savefile->readSint16LE();
savefile->skip(descriptionSize);
savefile->skip(6);
@@ -833,6 +847,9 @@ bool SupernovaEngine::saveGame(int slot, const Common::String &description) {
Common::OutSaveFile *savefile = _saveFileMan->openForSaving(filename);
if (!savefile)
return false;
+
+ savefile->writeUint32LE(SAVEGAME_HEADER);
+ savefile->writeByte(SAVEGAME_VERSION);
TimeDate currentDate;
_system->getTimeAndDate(currentDate);
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 2073c0f..df9108e 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -42,6 +42,10 @@
namespace Supernova {
+#define SAVEGAME_HEADER MKTAG('M','S','N','1')
+#define SAVEGAME_VERSION 1
+
+
struct ScreenBuffer {
ScreenBuffer()
: _x(0)
Commit: 1cdede12ac1ee2edbf5651684e5b9c1b2f826a3d
https://github.com/scummvm/scummvm/commit/1cdede12ac1ee2edbf5651684e5b9c1b2f826a3d
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:32Z
Commit Message:
SUPERNOVA: Properly handle loading saved game from launcher
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 17033da..ad5d8af 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -148,6 +148,12 @@ Common::Error SupernovaEngine::run() {
CursorMan.replaceCursorPalette(initVGAPalette, 0, 16);
CursorMan.showMouse(true);
+ int saveSlot = ConfMan.getInt("save_slot");
+ if (saveSlot >= 0) {
+ if (loadGameState(saveSlot).getCode() != Common::kNoError)
+ error("Failed to load save game from slot %i", saveSlot);
+ }
+
while (!shouldQuit()) {
uint32 start = _system->getMillis();
updateEvents();
Commit: 275daa81c34e3ccf36457a69d6af0c7e672ada94
https://github.com/scummvm/scummvm/commit/275daa81c34e3ccf36457a69d6af0c7e672ada94
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:32Z
Commit Message:
SUPERNOVA: Disable loading during intro cutscene
Loading during the intro is not currently working and is not
trivial to implement. So disable it for now.
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index a88eb6f..484f1ca 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -109,6 +109,7 @@ bool Room::deserialize(Common::ReadStream *in) {
void Intro::onEntrance() {
_gm->_guiEnabled = false;
_vm->_allowSaveGame = false;
+ _vm->_allowLoadGame = false;
titleScreen();
cutscene();
leaveCutscene();
@@ -394,6 +395,7 @@ void Intro::leaveCutscene() {
_gm->changeRoom(CABIN_R3);
_gm->_guiEnabled = true;
_vm->_allowSaveGame = true;
+ _vm->_allowLoadGame = true;
}
bool ShipCorridor::interact(Action verb, Object &obj1, Object &obj2) {
Commit: 696fcb6bb98a2e527ebba8c70548930fe3a6cb31
https://github.com/scummvm/scummvm/commit/696fcb6bb98a2e527ebba8c70548930fe3a6cb31
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:32Z
Commit Message:
SUPERNOVA: Add saving/loading of playtime
Changed paths:
engines/supernova/detection.cpp
engines/supernova/supernova.cpp
diff --git a/engines/supernova/detection.cpp b/engines/supernova/detection.cpp
index b587dbb..bf7d6bf 100644
--- a/engines/supernova/detection.cpp
+++ b/engines/supernova/detection.cpp
@@ -101,6 +101,7 @@ bool SupernovaMetaEngine::hasFeature(MetaEngineFeature f) const {
// fallthrough
case kSavesSupportCreationDate:
// fallthrough
+ case kSavesSupportPlayTime:
return true;
default:
return false;
@@ -187,6 +188,8 @@ SaveStateDescriptor SupernovaMetaEngine::querySaveMetaInfos(const char *target,
int minutes = saveTime & 0xFF;
desc.setSaveTime(hour, minutes);
+ uint32 playTime =savefile->readUint32LE();
+ desc.setPlayTime(playTime * 1000);
if (Graphics::checkThumbnailHeader(*savefile)) {
Graphics::Surface *const thumbnail = Graphics::loadThumbnail(*savefile);
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index ad5d8af..9526481 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -148,6 +148,8 @@ Common::Error SupernovaEngine::run() {
CursorMan.replaceCursorPalette(initVGAPalette, 0, 16);
CursorMan.showMouse(true);
+ setTotalPlayTime(0);
+
int saveSlot = ConfMan.getInt("save_slot");
if (saveSlot >= 0) {
if (loadGameState(saveSlot).getCode() != Common::kNoError)
@@ -837,6 +839,7 @@ bool SupernovaEngine::loadGame(int slot) {
int descriptionSize = savefile->readSint16LE();
savefile->skip(descriptionSize);
savefile->skip(6);
+ setTotalPlayTime(savefile->readUint32LE() * 1000);
Graphics::skipThumbnail(*savefile);
_gm->deserialize(savefile);
@@ -866,6 +869,7 @@ bool SupernovaEngine::saveGame(int slot, const Common::String &description) {
savefile->write(description.c_str(), description.size() + 1);
savefile->writeUint32LE(saveDate);
savefile->writeUint16LE(saveTime);
+ savefile->writeUint32LE(getTotalPlayTime() / 1000);
Graphics::saveThumbnail(*savefile);
_gm->serialize(savefile);
Commit: 86795f0fa2c60d322bececf133762b85ef44a23e
https://github.com/scummvm/scummvm/commit/86795f0fa2c60d322bececf133762b85ef44a23e
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:32Z
Commit Message:
SUPERNOVA: Fix clicks at start and end of audio samples
The sound samples start with a 6 bytes header (including the size of
the sample coded on a little endian 16 bits uint on bytes 2 and 3)
and end with 4 bytes set to null. Those were passed to the raw stream,
which resulted in the audible clicks.
Note that we could use the information from the header to load the
sound samples instead of keeping around an array of offset and size.
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 9526481..e421d6f 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -249,6 +249,11 @@ void SupernovaEngine::initData() {
_images[i].init(i);
// Sound
+ // Note:
+ // - samples start with a header of 6 bytes: 01 SS SS 00 AD 00
+ // where SS SS (LE uint16) is the size of the sound sample + 2
+ // - samples end with a footer of 4 bytes: 00 00
+ // Skip those in the buffer
Common::File file;
for (int i = 0; i < kAudioNumSamples; ++i) {
@@ -258,12 +263,12 @@ void SupernovaEngine::initData() {
if (audioInfo[i]._offsetEnd == -1) {
file.seek(0, SEEK_END);
- _soundSamples[i]._length = file.pos() - audioInfo[i]._offsetStart;
+ _soundSamples[i]._length = file.pos() - audioInfo[i]._offsetStart - 10;
} else {
- _soundSamples[i]._length = audioInfo[i]._offsetEnd - audioInfo[i]._offsetStart;
+ _soundSamples[i]._length = audioInfo[i]._offsetEnd - audioInfo[i]._offsetStart - 10;
}
_soundSamples[i]._buffer = new byte[_soundSamples[i]._length];
- file.seek(audioInfo[i]._offsetStart);
+ file.seek(audioInfo[i]._offsetStart + 6);
file.read(_soundSamples[i]._buffer, _soundSamples[i]._length);
file.close();
}
Commit: e6fea1bd86831f51603c3610649e1691e52f98b9
https://github.com/scummvm/scummvm/commit/e6fea1bd86831f51603c3610649e1691e52f98b9
Author: D G Turner (digitall at scummvm.org)
Date: 2018-01-23T02:15:32Z
Commit Message:
SUPERNOVA: Fix GCC Unused Variable Warnings.
Changed paths:
engines/supernova/detection.cpp
engines/supernova/state.cpp
diff --git a/engines/supernova/detection.cpp b/engines/supernova/detection.cpp
index bf7d6bf..577fc74 100644
--- a/engines/supernova/detection.cpp
+++ b/engines/supernova/detection.cpp
@@ -122,7 +122,6 @@ SaveStateList SupernovaMetaEngine::listSaves(const char *target) const {
filenames = g_system->getSavefileManager()->listSavefiles(pattern);
- char saveFileDesc[128];
SaveStateList saveFileList;
for (Common::StringArray::const_iterator file = filenames.begin();
file != filenames.end(); ++file) {
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 860cbe8..28e35e3 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1256,7 +1256,6 @@ bool GameManager::isHelmetOff() {
bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
Room *r;
- char t[150];
Common::String input;
if ((verb == ACTION_USE) && (obj1._id == SCHNUCK)) {
Commit: ea955675db26106dfc22aaf5a9721c056437ddfc
https://github.com/scummvm/scummvm/commit/ea955675db26106dfc22aaf5a9721c056437ddfc
Author: D G Turner (digitall at scummvm.org)
Date: 2018-01-23T02:15:32Z
Commit Message:
SUPERNOVA: Fix GCC Warning for Malformed Narrowing Conversions in C++11.
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index e421d6f..73ce543 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -400,7 +400,9 @@ void SupernovaEngine::renderRoom(Room &room) {
}
int SupernovaEngine::textWidth(const uint16 key) {
- const char text[2] = {key & 0xFF, 0};
+ char text[2];
+ text[0] = key & 0xFF;
+ text[1] = 0;
return textWidth(text);
}
@@ -545,7 +547,9 @@ void SupernovaEngine::renderText(const char *text, int x, int y, byte color) {
}
void SupernovaEngine::renderText(const uint16 character, int x, int y, byte color) {
- char text[2] = {character & 0xFF, 0};
+ char text[2];
+ text[0] = character & 0xFF;
+ text[1] = 0;
renderText(text, x, y, color);
}
@@ -554,7 +558,9 @@ void SupernovaEngine::renderText(const char *text) {
}
void SupernovaEngine::renderText(const uint16 character) {
- char text[2] = {character & 0xFF, 0};
+ char text[2];
+ text[0] = character & 0xFF;
+ text[1] = 0;
renderText(text, _textCursorX, _textCursorY, _textColor);
}
Commit: 2e79e243929dd7f2c3db83e79c673dee573c4875
https://github.com/scummvm/scummvm/commit/2e79e243929dd7f2c3db83e79c673dee573c4875
Author: D G Turner (digitall at scummvm.org)
Date: 2018-01-23T02:15:32Z
Commit Message:
SUPERNOVA: Fix GCC Signed vs. Unsigned Comparison Warnings.
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 28e35e3..52b7aaa 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1065,7 +1065,7 @@ void GameManager::edit(Common::String &input, int x, int y, uint length) {
bool isEditing = true;
uint cursorIndex = input.size();
// NOTE: Pixels for char needed = kFontWidth + 2px left and right side bearing
- int overdrawWidth = ((length + 1) * (kFontWidth + 2) > kScreenWidth - x) ?
+ int overdrawWidth = ((int)((length + 1) * (kFontWidth + 2)) > (kScreenWidth - x)) ?
kScreenWidth - x : (length + 1) * (kFontWidth + 2);
while (isEditing) {
@@ -1344,7 +1344,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
edit(input, 91, 100, 5);
int seperator = -1;
- for (int i = 0; i < input.size(); ++i) {
+ for (uint i = 0; i < input.size(); ++i) {
if (input[i] == ':') {
seperator = i;
break;
@@ -1366,7 +1366,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
}
}
decimalPlace = 1;
- for (int i = seperator + 1; i < input.size(); ++i) {
+ for (uint i = seperator + 1; i < input.size(); ++i) {
if (Common::isDigit(input[i])) {
minutes = minutes * decimalPlace + (input[i] - '0');
decimalPlace *= 10;
Commit: 4c9fc3cdbc0ff8a90a9af267fc63e8cf92e0f671
https://github.com/scummvm/scummvm/commit/4c9fc3cdbc0ff8a90a9af267fc63e8cf92e0f671
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:32Z
Commit Message:
SUPERNOVA: Fix compilation using MSVC9, silent some CppCheck warnings
Changed paths:
engines/supernova/graphics.cpp
engines/supernova/rooms.cpp
engines/supernova/state.cpp
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index df3b706..657f27d 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -32,9 +32,13 @@
namespace Supernova {
-MSNImageDecoder::MSNImageDecoder()
- : _palette(NULL)
- , _encodedImage(NULL) {
+MSNImageDecoder::MSNImageDecoder() {
+ _palette = nullptr;
+ _encodedImage = nullptr;
+ _filenumber = -1;
+ _pitch = 0;
+ _numSections = 0;
+ _numClickFields = 0;
}
MSNImageDecoder::~MSNImageDecoder() {
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 484f1ca..3835932 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -72,10 +72,9 @@ bool Room::deserialize(Common::ReadStream *in) {
_shown[i] = in->readByte();
int numObjects = in->readSint32LE();
- int stringLength = 0;
Common::SeekableReadStream *stream = NULL;
for (int i = 0; i < numObjects; ++i) {
- stringLength = in->readUint32LE();
+ int stringLength = in->readUint32LE();
if (stringLength) {
stream = in->readStream(stringLength);
_objectState[i]._name = stream->readLine();
@@ -659,9 +658,9 @@ void ShipSleepCabin::onEntrance() {
bool ShipCockpit::interact(Action verb, Object &obj1, Object &obj2) {
// TODO: distance and remaining time not accurate
- char c[2] = {0};
if ((verb == ACTION_LOOK) && (obj1._id == MONITOR)) {
+ char c[2] = {0, 0};
_gm->_guiEnabled = false;
_vm->renderBox(0, 0, 320, 200, kColorBlack);
_vm->renderText("Geschwindigkeit: ", 50, 50, kColorLightYellow);
@@ -2059,14 +2058,13 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
byte zeilen3[4] = {1, 1, 1, 1};
byte zeilen4[2] = {2, 1};
- bool found, flight;
-
if (((verb == ACTION_WALK) &&
((obj1._id == SPACESHIP) || (obj1._id == ROGER_W))) ||
((verb == ACTION_TALK) && (obj1._id == ROGER_W))) {
_gm->changeRoom(INTRO);
_vm->renderImage(30, 0);
_vm->paletteBrightness();
+ bool found;
if (_gm->_rooms[MEETUP2]->isSectionVisible(kMaxSection - 2)) {
_gm->reply("Was wollen Sie denn schon wieder?", 1, 1 + 128);
found = !_gm->dialog(2, nullptr, nullptr, 0); // row4, dialog4
@@ -2084,7 +2082,7 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(8));
_gm->reply("Oh! Vielen Dank.", 1, 1 + 128);
_gm->reply("Wo ist denn Ihr Raumschiff?|Soll ich Sie ein St\201ck mitnehmen?", 1, 1 + 128);
- flight = _gm->dialog(2, nullptr, nullptr, 0); // row2, dialog2
+ bool flight = _gm->dialog(2, nullptr, nullptr, 0); // row2, dialog2
if (flight) {
_gm->reply("Wo wollen Sie denn hin?", 1, 1 + 128);
_gm->dialog(4, nullptr, nullptr, 0); // row3, dialog3
@@ -2196,9 +2194,9 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
_gm->wait2(10);
_gm->reply("Ja, sieht so aus.", 1, 1 + 128);
- int i;
do {
- switch (i = _gm->dialog(4, nullptr, nullptr, 2)) { // row2, dialog2
+ int i = _gm->dialog(4, nullptr, nullptr, 2); // row2, dialog2
+ switch (i) {
case 0:
_gm->reply("Sie befinden sich im Raumschiff \"Dexxa\".", 1, 1 + 128);
_gm->reply("Wir kommen vom Planeten Axacuss und|sind aus dem gleichen Grund hier wie Sie,|nmlich zur Erforschung der Supernova.", 1, 1 + 128);
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 52b7aaa..6a586df 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -170,15 +170,16 @@ Object *Inventory::get(ObjectID id) const {
GuiElement::GuiElement()
- : _text("")
- , _isHighlighted(false)
+ : _isHighlighted(false)
, _bgColorNormal(kColorWhite25)
, _bgColorHighlighted(kColorWhite44)
, _bgColor(kColorWhite25)
, _textColorNormal(kColorGreen)
, _textColorHighlighted(kColorLightGreen)
, _textColor(kColorGreen)
-{}
+{
+ _text[0] = '\0';
+}
void GuiElement::setText(const char *text) {
strncpy(_text, text, sizeof(_text));
Commit: d1bdfd2bde41732e9c2eaf374ff88b56727c9013
https://github.com/scummvm/scummvm/commit/d1bdfd2bde41732e9c2eaf374ff88b56727c9013
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:32Z
Commit Message:
SUPERNOVA: Clean indentations
Changed paths:
engines/supernova/graphics.cpp
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
engines/supernova/state.cpp
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index 657f27d..70f0590 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -33,8 +33,8 @@
namespace Supernova {
MSNImageDecoder::MSNImageDecoder() {
- _palette = nullptr;
- _encodedImage = nullptr;
+ _palette = nullptr;
+ _encodedImage = nullptr;
_filenumber = -1;
_pitch = 0;
_numSections = 0;
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index a532a2b..a02df72 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -106,210 +106,210 @@ const int kColorLightRed = 15;
const int kColorCursorTransparent = kColorWhite25;
const byte mouseNormal[64] = {
- 0xff,0x3f,0xff,0x1f,0xff,0x0f,0xff,0x07,
- 0xff,0x03,0xff,0x01,0xff,0x00,0x7f,0x00,
- 0x3f,0x00,0x1f,0x00,0x0f,0x00,0x0f,0x00,
- 0xff,0x00,0x7f,0x18,0x7f,0x38,0x7f,0xfc,
-
- 0x00,0x00,0x00,0x40,0x00,0x60,0x00,0x70,
- 0x00,0x78,0x00,0x7c,0x00,0x7e,0x00,0x7f,
- 0x80,0x7f,0xc0,0x7f,0xe0,0x7f,0x00,0x7e,
- 0x00,0x66,0x00,0x43,0x00,0x03,0x00,0x00
+ 0xff,0x3f,0xff,0x1f,0xff,0x0f,0xff,0x07,
+ 0xff,0x03,0xff,0x01,0xff,0x00,0x7f,0x00,
+ 0x3f,0x00,0x1f,0x00,0x0f,0x00,0x0f,0x00,
+ 0xff,0x00,0x7f,0x18,0x7f,0x38,0x7f,0xfc,
+
+ 0x00,0x00,0x00,0x40,0x00,0x60,0x00,0x70,
+ 0x00,0x78,0x00,0x7c,0x00,0x7e,0x00,0x7f,
+ 0x80,0x7f,0xc0,0x7f,0xe0,0x7f,0x00,0x7e,
+ 0x00,0x66,0x00,0x43,0x00,0x03,0x00,0x00
};
const byte mouseWait[64] = {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,
- 0x01,0x80,0x01,0x80,0x11,0x88,0x31,0x8c,
- 0x31,0x8c,0x11,0x88,0x01,0x80,0x01,0x80,
- 0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
-
- 0x00,0x00,0xfe,0x7f,0xf4,0x2f,0xf4,0x2f,
- 0x14,0x28,0x24,0x24,0x44,0x22,0x84,0x21,
- 0x84,0x21,0xc4,0x23,0xe4,0x27,0x74,0x2e,
- 0x34,0x2c,0x14,0x28,0xfe,0x7f,0x00,0x00
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,
+ 0x01,0x80,0x01,0x80,0x11,0x88,0x31,0x8c,
+ 0x31,0x8c,0x11,0x88,0x01,0x80,0x01,0x80,
+ 0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0xfe,0x7f,0xf4,0x2f,0xf4,0x2f,
+ 0x14,0x28,0x24,0x24,0x44,0x22,0x84,0x21,
+ 0x84,0x21,0xc4,0x23,0xe4,0x27,0x74,0x2e,
+ 0x34,0x2c,0x14,0x28,0xfe,0x7f,0x00,0x00
};
const byte font[][5] = {
- {0x00,0x00,0x00,0xff,0x00},
- {0x5f,0xff,0x00,0x00,0x00},
- {0x03,0x00,0x03,0xff,0x00},
- {0x14,0x7f,0x14,0x7f,0x14},
- {0x24,0x2a,0x7f,0x2a,0x12},
- {0x61,0x10,0x08,0x04,0x43},
- {0x38,0x4e,0x59,0x26,0x50},
- {0x03,0xff,0x00,0x00,0x00},
- {0x3e,0x41,0xff,0x00,0x00},
- {0x41,0x3e,0xff,0x00,0x00},
- {0x10,0x54,0x38,0x54,0x10},
- {0x10,0x10,0x7c,0x10,0x10},
- {0x80,0x40,0xff,0x00,0x00},
- {0x10,0x10,0x10,0x10,0x10},
- {0x40,0xff,0x00,0x00,0x00},
- {0x60,0x10,0x08,0x04,0x03},
-
- {0x3e,0x41,0x41,0x41,0x3e}, /* digits */
- {0x04,0x02,0x7f,0xff,0x00},
- {0x42,0x61,0x51,0x49,0x46},
- {0x22,0x41,0x49,0x49,0x36},
- {0x18,0x14,0x12,0x7f,0x10},
- {0x27,0x45,0x45,0x45,0x39},
- {0x3e,0x49,0x49,0x49,0x32},
- {0x01,0x61,0x19,0x07,0x01},
- {0x36,0x49,0x49,0x49,0x36},
- {0x26,0x49,0x49,0x49,0x3e},
-
- {0x44,0xff,0x00,0x00,0x00},
- {0x80,0x44,0xff,0x00,0x00},
- {0x10,0x28,0x44,0xff,0x00},
- {0x28,0x28,0x28,0x28,0x28},
- {0x44,0x28,0x10,0xff,0x00},
- {0x02,0x01,0x51,0x09,0x06},
- {0x3e,0x41,0x5d,0x5d,0x1e},
-
- {0x7c,0x12,0x11,0x12,0x7c}, /* uppercase letters*/
- {0x7f,0x49,0x49,0x49,0x36},
- {0x3e,0x41,0x41,0x41,0x22},
- {0x7f,0x41,0x41,0x22,0x1c},
- {0x7f,0x49,0x49,0x49,0xff},
- {0x7f,0x09,0x09,0x09,0xff},
- {0x3e,0x41,0x41,0x49,0x3a},
- {0x7f,0x08,0x08,0x08,0x7f},
- {0x41,0x7f,0x41,0xff,0x00},
- {0x20,0x40,0x40,0x3f,0xff},
- {0x7f,0x08,0x14,0x22,0x41},
- {0x7f,0x40,0x40,0x40,0xff},
- {0x7f,0x02,0x04,0x02,0x7f},
- {0x7f,0x02,0x0c,0x10,0x7f},
- {0x3e,0x41,0x41,0x41,0x3e},
- {0x7f,0x09,0x09,0x09,0x06},
- {0x3e,0x41,0x51,0x21,0x5e},
- {0x7f,0x09,0x19,0x29,0x46},
- {0x26,0x49,0x49,0x49,0x32},
- {0x01,0x01,0x7f,0x01,0x01},
- {0x3f,0x40,0x40,0x40,0x3f},
- {0x07,0x18,0x60,0x18,0x07},
- {0x1f,0x60,0x18,0x60,0x1f},
- {0x63,0x14,0x08,0x14,0x63},
- {0x03,0x04,0x78,0x04,0x03},
- {0x61,0x51,0x49,0x45,0x43},
-
- {0x7f,0x41,0x41,0xff,0x00},
- {0x03,0x04,0x08,0x10,0x60},
- {0x41,0x41,0x7f,0xff,0x00},
- {0x02,0x01,0x02,0xff,0x00},
- {0x80,0x80,0x80,0x80,0x80},
- {0x01,0x02,0xff,0x00,0x00},
-
- {0x38,0x44,0x44,0x44,0x7c}, /* lowercase letters */
- {0x7f,0x44,0x44,0x44,0x38},
- {0x38,0x44,0x44,0x44,0x44},
- {0x38,0x44,0x44,0x44,0x7f},
- {0x38,0x54,0x54,0x54,0x58},
- {0x04,0x7e,0x05,0x01,0xff},
- {0x98,0xa4,0xa4,0xa4,0x7c},
- {0x7f,0x04,0x04,0x04,0x78},
- {0x7d,0xff,0x00,0x00,0x00},
- {0x80,0x80,0x7d,0xff,0x00},
- {0x7f,0x10,0x28,0x44,0xff},
- {0x7f,0xff,0x00,0x00,0x00},
- {0x7c,0x04,0x7c,0x04,0x78},
- {0x7c,0x04,0x04,0x04,0x78},
- {0x38,0x44,0x44,0x44,0x38},
- {0xfc,0x24,0x24,0x24,0x18},
- {0x18,0x24,0x24,0x24,0xfc},
- {0x7c,0x08,0x04,0x04,0xff},
- {0x48,0x54,0x54,0x54,0x24},
- {0x04,0x3e,0x44,0x40,0xff},
- {0x7c,0x40,0x40,0x40,0x3c},
- {0x0c,0x30,0x40,0x30,0x0c},
- {0x3c,0x40,0x3c,0x40,0x3c},
- {0x44,0x28,0x10,0x28,0x44},
- {0x9c,0xa0,0xa0,0xa0,0x7c},
- {0x44,0x64,0x54,0x4c,0x44},
-
- {0x08,0x36,0x41,0xff,0x00},
- {0x77,0xff,0x00,0x00,0x00},
- {0x41,0x36,0x08,0xff,0x00},
- {0x02,0x01,0x02,0x01,0xff},
- {0xff,0x00,0x00,0x00,0x00},
-
- {0xfe,0x49,0x49,0x4e,0x30}, /* sharp S */
-
- {0x7c,0x41,0x40,0x41,0x3c}, /* umlauts */
-
- {0x04,0x06,0x7f,0x06,0x04}, /* arrows */
- {0x20,0x60,0xfe,0x60,0x20},
-
- {0x38,0x45,0x44,0x45,0x7c}, /* umlauts */
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0x79,0x14,0x12,0x14,0x79},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0x38,0x45,0x44,0x45,0x38},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0xff,0x00,0x00,0x00,0x00},
- {0x3d,0x42,0x42,0x42,0x3d},
- {0x3d,0x40,0x40,0x40,0x3d},
+ {0x00,0x00,0x00,0xff,0x00},
+ {0x5f,0xff,0x00,0x00,0x00},
+ {0x03,0x00,0x03,0xff,0x00},
+ {0x14,0x7f,0x14,0x7f,0x14},
+ {0x24,0x2a,0x7f,0x2a,0x12},
+ {0x61,0x10,0x08,0x04,0x43},
+ {0x38,0x4e,0x59,0x26,0x50},
+ {0x03,0xff,0x00,0x00,0x00},
+ {0x3e,0x41,0xff,0x00,0x00},
+ {0x41,0x3e,0xff,0x00,0x00},
+ {0x10,0x54,0x38,0x54,0x10},
+ {0x10,0x10,0x7c,0x10,0x10},
+ {0x80,0x40,0xff,0x00,0x00},
+ {0x10,0x10,0x10,0x10,0x10},
+ {0x40,0xff,0x00,0x00,0x00},
+ {0x60,0x10,0x08,0x04,0x03},
+
+ {0x3e,0x41,0x41,0x41,0x3e}, /* digits */
+ {0x04,0x02,0x7f,0xff,0x00},
+ {0x42,0x61,0x51,0x49,0x46},
+ {0x22,0x41,0x49,0x49,0x36},
+ {0x18,0x14,0x12,0x7f,0x10},
+ {0x27,0x45,0x45,0x45,0x39},
+ {0x3e,0x49,0x49,0x49,0x32},
+ {0x01,0x61,0x19,0x07,0x01},
+ {0x36,0x49,0x49,0x49,0x36},
+ {0x26,0x49,0x49,0x49,0x3e},
+
+ {0x44,0xff,0x00,0x00,0x00},
+ {0x80,0x44,0xff,0x00,0x00},
+ {0x10,0x28,0x44,0xff,0x00},
+ {0x28,0x28,0x28,0x28,0x28},
+ {0x44,0x28,0x10,0xff,0x00},
+ {0x02,0x01,0x51,0x09,0x06},
+ {0x3e,0x41,0x5d,0x5d,0x1e},
+
+ {0x7c,0x12,0x11,0x12,0x7c}, /* uppercase letters*/
+ {0x7f,0x49,0x49,0x49,0x36},
+ {0x3e,0x41,0x41,0x41,0x22},
+ {0x7f,0x41,0x41,0x22,0x1c},
+ {0x7f,0x49,0x49,0x49,0xff},
+ {0x7f,0x09,0x09,0x09,0xff},
+ {0x3e,0x41,0x41,0x49,0x3a},
+ {0x7f,0x08,0x08,0x08,0x7f},
+ {0x41,0x7f,0x41,0xff,0x00},
+ {0x20,0x40,0x40,0x3f,0xff},
+ {0x7f,0x08,0x14,0x22,0x41},
+ {0x7f,0x40,0x40,0x40,0xff},
+ {0x7f,0x02,0x04,0x02,0x7f},
+ {0x7f,0x02,0x0c,0x10,0x7f},
+ {0x3e,0x41,0x41,0x41,0x3e},
+ {0x7f,0x09,0x09,0x09,0x06},
+ {0x3e,0x41,0x51,0x21,0x5e},
+ {0x7f,0x09,0x19,0x29,0x46},
+ {0x26,0x49,0x49,0x49,0x32},
+ {0x01,0x01,0x7f,0x01,0x01},
+ {0x3f,0x40,0x40,0x40,0x3f},
+ {0x07,0x18,0x60,0x18,0x07},
+ {0x1f,0x60,0x18,0x60,0x1f},
+ {0x63,0x14,0x08,0x14,0x63},
+ {0x03,0x04,0x78,0x04,0x03},
+ {0x61,0x51,0x49,0x45,0x43},
+
+ {0x7f,0x41,0x41,0xff,0x00},
+ {0x03,0x04,0x08,0x10,0x60},
+ {0x41,0x41,0x7f,0xff,0x00},
+ {0x02,0x01,0x02,0xff,0x00},
+ {0x80,0x80,0x80,0x80,0x80},
+ {0x01,0x02,0xff,0x00,0x00},
+
+ {0x38,0x44,0x44,0x44,0x7c}, /* lowercase letters */
+ {0x7f,0x44,0x44,0x44,0x38},
+ {0x38,0x44,0x44,0x44,0x44},
+ {0x38,0x44,0x44,0x44,0x7f},
+ {0x38,0x54,0x54,0x54,0x58},
+ {0x04,0x7e,0x05,0x01,0xff},
+ {0x98,0xa4,0xa4,0xa4,0x7c},
+ {0x7f,0x04,0x04,0x04,0x78},
+ {0x7d,0xff,0x00,0x00,0x00},
+ {0x80,0x80,0x7d,0xff,0x00},
+ {0x7f,0x10,0x28,0x44,0xff},
+ {0x7f,0xff,0x00,0x00,0x00},
+ {0x7c,0x04,0x7c,0x04,0x78},
+ {0x7c,0x04,0x04,0x04,0x78},
+ {0x38,0x44,0x44,0x44,0x38},
+ {0xfc,0x24,0x24,0x24,0x18},
+ {0x18,0x24,0x24,0x24,0xfc},
+ {0x7c,0x08,0x04,0x04,0xff},
+ {0x48,0x54,0x54,0x54,0x24},
+ {0x04,0x3e,0x44,0x40,0xff},
+ {0x7c,0x40,0x40,0x40,0x3c},
+ {0x0c,0x30,0x40,0x30,0x0c},
+ {0x3c,0x40,0x3c,0x40,0x3c},
+ {0x44,0x28,0x10,0x28,0x44},
+ {0x9c,0xa0,0xa0,0xa0,0x7c},
+ {0x44,0x64,0x54,0x4c,0x44},
+
+ {0x08,0x36,0x41,0xff,0x00},
+ {0x77,0xff,0x00,0x00,0x00},
+ {0x41,0x36,0x08,0xff,0x00},
+ {0x02,0x01,0x02,0x01,0xff},
+ {0xff,0x00,0x00,0x00,0x00},
+
+ {0xfe,0x49,0x49,0x4e,0x30}, /* sharp S */
+
+ {0x7c,0x41,0x40,0x41,0x3c}, /* umlauts */
+
+ {0x04,0x06,0x7f,0x06,0x04}, /* arrows */
+ {0x20,0x60,0xfe,0x60,0x20},
+
+ {0x38,0x45,0x44,0x45,0x7c}, /* umlauts */
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0x79,0x14,0x12,0x14,0x79},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0x38,0x45,0x44,0x45,0x38},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0xff,0x00,0x00,0x00,0x00},
+ {0x3d,0x42,0x42,0x42,0x3d},
+ {0x3d,0x40,0x40,0x40,0x3d},
};
// Default palette
const byte initVGAPalette[768] = {
- 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x58, 0x58, 0x58, 0x70, 0x70, 0x70, 0xfc, 0xfc, 0xfc, 0x00, 0xd0, 0x00,
- 0x00, 0xfc, 0x00, 0xd8, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xb0, 0xa0, 0xa0, 0xa0,
- 0x50, 0xc8, 0xfc, 0x28, 0xfc, 0x28, 0xf0, 0xf0, 0x00, 0xfc, 0x28, 0x28, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14,
- 0x20, 0x20, 0x20, 0x2c, 0x2c, 0x2c, 0x38, 0x38, 0x38, 0x44, 0x44, 0x44, 0x50, 0x50, 0x50, 0x60, 0x60, 0x60,
- 0x70, 0x70, 0x70, 0x80, 0x80, 0x80, 0x90, 0x90, 0x90, 0xa0, 0xa0, 0xa0, 0xb4, 0xb4, 0xb4, 0xc8, 0xc8, 0xc8,
- 0xe0, 0xe0, 0xe0, 0xfc, 0xfc, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00, 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc,
- 0xfc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc, 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00,
- 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc, 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x00,
- 0x00, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00, 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc,
- 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c, 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc,
- 0xfc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc, 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c,
- 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc, 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0x7c,
- 0x7c, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c, 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc,
- 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4, 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc,
- 0xfc, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc, 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4,
- 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc, 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0xb4,
- 0xb4, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4, 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc,
- 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70,
- 0x70, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70, 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x00, 0x00, 0x70, 0x1c, 0x00,
- 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70, 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x00,
- 0x00, 0x70, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70,
- 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38, 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70,
- 0x70, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70, 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38,
- 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70, 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x38,
- 0x38, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38, 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70,
- 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50, 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70,
- 0x70, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70, 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50,
- 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70, 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x50,
- 0x50, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50, 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70,
- 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x00, 0x00, 0x40, 0x10, 0x00, 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40,
- 0x40, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40, 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00,
- 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40, 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x00,
- 0x00, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00, 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40,
- 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20, 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40,
- 0x40, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40, 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20,
- 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40, 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x20,
- 0x20, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20, 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40,
- 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c, 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40,
- 0x40, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40, 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c,
- 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40, 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x2c,
- 0x2c, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c, 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40,
- 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x58, 0x58, 0x58, 0x70, 0x70, 0x70, 0xfc, 0xfc, 0xfc, 0x00, 0xd0, 0x00,
+ 0x00, 0xfc, 0x00, 0xd8, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xb0, 0xa0, 0xa0, 0xa0,
+ 0x50, 0xc8, 0xfc, 0x28, 0xfc, 0x28, 0xf0, 0xf0, 0x00, 0xfc, 0x28, 0x28, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14,
+ 0x20, 0x20, 0x20, 0x2c, 0x2c, 0x2c, 0x38, 0x38, 0x38, 0x44, 0x44, 0x44, 0x50, 0x50, 0x50, 0x60, 0x60, 0x60,
+ 0x70, 0x70, 0x70, 0x80, 0x80, 0x80, 0x90, 0x90, 0x90, 0xa0, 0xa0, 0xa0, 0xb4, 0xb4, 0xb4, 0xc8, 0xc8, 0xc8,
+ 0xe0, 0xe0, 0xe0, 0xfc, 0xfc, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00, 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc,
+ 0xfc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc, 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00,
+ 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc, 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x00,
+ 0x00, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00, 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc,
+ 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c, 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc,
+ 0xfc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc, 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c,
+ 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc, 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0x7c,
+ 0x7c, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c, 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc,
+ 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4, 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc,
+ 0xfc, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc, 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4,
+ 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc, 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0xb4,
+ 0xb4, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4, 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc,
+ 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70,
+ 0x70, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70, 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x00, 0x00, 0x70, 0x1c, 0x00,
+ 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70, 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x00,
+ 0x00, 0x70, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70,
+ 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38, 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70,
+ 0x70, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70, 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38,
+ 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70, 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x38,
+ 0x38, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38, 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70,
+ 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50, 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70,
+ 0x70, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70, 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50,
+ 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70, 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x50,
+ 0x50, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50, 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70,
+ 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x00, 0x00, 0x40, 0x10, 0x00, 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40,
+ 0x40, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40, 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00,
+ 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40, 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x00,
+ 0x00, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00, 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40,
+ 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20, 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40,
+ 0x40, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40, 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20,
+ 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40, 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x20,
+ 0x20, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20, 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40,
+ 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c, 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40,
+ 0x40, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40, 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c,
+ 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40, 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x2c,
+ 0x2c, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c, 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40,
+ 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
enum ObjectType {
@@ -405,16 +405,16 @@ static const char *const broken_DE = "Hmm, er scheint kaputt zu sein.";
static const char *const broken_EN = "Hmm, it seems to be broken.";
static const char *const guiCommand_DE[] = {
- "Gehe",
- "Schau",
- "Nimm",
- "\231ffne",
- "Schlie\341e",
- "Dr\201cke",
- "Ziehe",
- "Benutze",
- "Rede",
- "Gib"
+ "Gehe",
+ "Schau",
+ "Nimm",
+ "\231ffne",
+ "Schlie\341e",
+ "Dr\201cke",
+ "Ziehe",
+ "Benutze",
+ "Rede",
+ "Gib"
};
static const char *const guiStatusCommand_DE[10] =
@@ -435,29 +435,29 @@ struct Object {
static const Object nullObject;
Object()
- : _name("")
- , _description(Object::defaultDescription)
- , _id(INVALIDOBJECT)
- , _roomId(NULLROOM)
- , _type(NULLTYPE)
- , _click(0)
- , _click2(0)
- , _section(0)
- , _exitRoom(NULLROOM)
- , _direction(0)
+ : _name("")
+ , _description(Object::defaultDescription)
+ , _id(INVALIDOBJECT)
+ , _roomId(NULLROOM)
+ , _type(NULLTYPE)
+ , _click(0)
+ , _click2(0)
+ , _section(0)
+ , _exitRoom(NULLROOM)
+ , _direction(0)
{}
Object(byte roomId, const char *name, const char *description, ObjectID id, ObjectType type,
byte click, byte click2, byte section = 0, RoomID exitRoom = NULLROOM, byte direction = 0)
- : _name(name)
- , _description(description)
- , _id(id)
- , _roomId(roomId)
- , _type(type)
- , _click(click)
- , _click2(click2)
- , _section(section)
- , _exitRoom(exitRoom)
- , _direction(direction)
+ : _name(name)
+ , _description(description)
+ , _id(id)
+ , _roomId(roomId)
+ , _type(type)
+ , _click(click)
+ , _click2(click2)
+ , _section(section)
+ , _exitRoom(exitRoom)
+ , _direction(direction)
{}
static void setObjectNull(Object *&obj) {
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 3835932..4214a11 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -214,7 +214,7 @@ void Intro::cutscene() {
#define exitOnEscape(X) do { \
_gm->wait2(X); \
if (_gm->keyPressed(Common::KEYCODE_ESCAPE, true)) \
- return; \
+ return; \
} while (0);
_vm->_system->fillScreen(kColorBlack);
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 6a586df..4c54cbe 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -122,7 +122,7 @@ bool GameManager::deserialize(Common::ReadStream *in) {
}
Inventory::Inventory()
- : _numObjects(0)
+ : _numObjects(0)
{}
// TODO: Update Inventory surface for scrolling
@@ -170,13 +170,13 @@ Object *Inventory::get(ObjectID id) const {
GuiElement::GuiElement()
- : _isHighlighted(false)
- , _bgColorNormal(kColorWhite25)
- , _bgColorHighlighted(kColorWhite44)
- , _bgColor(kColorWhite25)
- , _textColorNormal(kColorGreen)
- , _textColorHighlighted(kColorLightGreen)
- , _textColor(kColorGreen)
+ : _isHighlighted(false)
+ , _bgColorNormal(kColorWhite25)
+ , _bgColorHighlighted(kColorWhite44)
+ , _bgColor(kColorWhite25)
+ , _textColorNormal(kColorGreen)
+ , _textColorHighlighted(kColorLightGreen)
+ , _textColor(kColorGreen)
{
_text[0] = '\0';
}
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 73ce543..3b703cf 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -47,26 +47,26 @@
namespace Supernova {
const AudioInfo audioInfo[kAudioNumSamples] = {
- {44, 0, -1},
- {45, 0, -1},
- {46, 0, 2510},
- {46, 2510, 4020},
- {46, 4020, -1},
- {47, 0, 24010},
- {47, 24010, -1},
- {48, 0, 2510},
- {48, 2510, 10520},
- {48, 10520, 13530},
- {48, 13530, -1},
- {50, 0, 12786},
- {50, 12786, -1},
- {51, 0, -1},
- {53, 0, -1},
- {54, 0, 8010},
- {54, 8010, 24020},
- {54, 24020, 30030},
- {54, 30030, 31040},
- {54, 31040, -1}
+ {44, 0, -1},
+ {45, 0, -1},
+ {46, 0, 2510},
+ {46, 2510, 4020},
+ {46, 4020, -1},
+ {47, 0, 24010},
+ {47, 24010, -1},
+ {48, 0, 2510},
+ {48, 2510, 10520},
+ {48, 10520, 13530},
+ {48, 13530, -1},
+ {50, 0, 12786},
+ {50, 12786, -1},
+ {51, 0, -1},
+ {53, 0, -1},
+ {54, 0, 8010},
+ {54, 8010, 24020},
+ {54, 24020, 30030},
+ {54, 30030, 31040},
+ {54, 31040, -1}
};
const char *const Object::defaultDescription = "Es ist nichts Besonderes daran.";
@@ -98,21 +98,21 @@ ObjectType &operator^=(ObjectType &a, ObjectType b) {
}
SupernovaEngine::SupernovaEngine(OSystem *syst)
- : Engine(syst)
- , _console(NULL)
- , _gm(NULL)
- , _currentImage(_images)
- , _brightness(255)
- , _menuBrightness(255)
- , _imageIndex(0)
- , _sectionIndex(0)
- , _delay(33)
- , _textSpeed(kTextSpeed[2])
- , _screenWidth(320)
- , _screenHeight(200)
- , _messageDisplayed(false)
- , _allowLoadGame(true)
- , _allowSaveGame(true)
+ : Engine(syst)
+ , _console(NULL)
+ , _gm(NULL)
+ , _currentImage(_images)
+ , _brightness(255)
+ , _menuBrightness(255)
+ , _imageIndex(0)
+ , _sectionIndex(0)
+ , _delay(33)
+ , _textSpeed(kTextSpeed[2])
+ , _screenWidth(320)
+ , _screenHeight(200)
+ , _messageDisplayed(false)
+ , _allowLoadGame(true)
+ , _allowSaveGame(true)
{
// const Common::FSNode gameDataDir(ConfMan.get("path"));
// SearchMan.addSubDirectoryMatching(gameDataDir, "sound");
@@ -892,7 +892,7 @@ bool SupernovaEngine::saveGame(int slot, const Common::String &description) {
ScreenBufferStack::ScreenBufferStack()
- : _last(_buffer) {
+ : _last(_buffer) {
}
void ScreenBufferStack::push(int x, int y, int width, int height, int pitch) {
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index df9108e..91dc5a1 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -48,12 +48,12 @@ namespace Supernova {
struct ScreenBuffer {
ScreenBuffer()
- : _x(0)
- , _y(0)
- , _width(0)
- , _height(0)
- , _pitch(0)
- , _pixels(NULL)
+ : _x(0)
+ , _y(0)
+ , _width(0)
+ , _height(0)
+ , _pitch(0)
+ , _pixels(NULL)
{}
byte *_pixels;
Commit: 65d30cf720db9d3395ca5d3fa002a228c0549a80
https://github.com/scummvm/scummvm/commit/65d30cf720db9d3395ca5d3fa002a228c0549a80
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:32Z
Commit Message:
SUPERNOVA: Plug memory leak in MOD music streams
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 3b703cf..7fb95c5 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -805,7 +805,7 @@ Common::MemoryReadStream *SupernovaEngine::convertToMod(const char *filename, in
while ((nb = msnFile.read(buf, 4096)) > 0)
buffer.write(buf, nb);
- return new Common::MemoryReadStream(buffer.getData(), buffer.size());
+ return new Common::MemoryReadStream(buffer.getData(), buffer.size(), DisposeAfterUse::YES);
}
bool SupernovaEngine::canLoadGameStateCurrently() {
Commit: f9310e11d8c01c20e32251678a7046e8c2e7b131
https://github.com/scummvm/scummvm/commit/f9310e11d8c01c20e32251678a7046e8c2e7b131
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:32Z
Commit Message:
SUPERNOVA: Add tool skeleton to generate engine data file
The tool is only a skeleton at this point. Most of the logic is there
but it is missing the data to write the German strings and it is missing
the logic to write the translated strings. This means that currently the
only data written are bitmap images.
Changed paths:
A devtools/create_supernova/create_supernova.cpp
A devtools/create_supernova/create_supernova.h
A devtools/create_supernova/file.cpp
A devtools/create_supernova/file.h
A devtools/create_supernova/gametext.h
A devtools/create_supernova/module.mk
diff --git a/devtools/create_supernova/create_supernova.cpp b/devtools/create_supernova/create_supernova.cpp
new file mode 100644
index 0000000..0d4ebe2
--- /dev/null
+++ b/devtools/create_supernova/create_supernova.cpp
@@ -0,0 +1,193 @@
+#include "create_supernova.h"
+#include "gametext.h"
+#include "file.h"
+
+// HACK to allow building with the SDL backend on MinGW
+// see bug #1800764 "TOOLS: MinGW tools building broken"
+#ifdef main
+#undef main
+#endif // main
+
+// List of languages to look for. To add new languages you only need to change the array below
+// and add the supporting files:
+// - 640x480 bitmap picture for the newpaper named 'img1-##.pbm' and 'img2-##.pbm'
+// in pbm binary format (you can use gimp to generate those)
+// - strings in a po file named 'strings-##.po' that uses CP850 encoding
+
+const char *lang[] = {
+ "en",
+ NULL
+};
+
+void writeImage(File& outputFile, const char *name, const char* language) {
+ File imgFile;
+ char fileName[16];
+ sprintf(fileName, "%s-%s.pbm", name, language);
+ if (!imgFile.open(fileName, kFileReadMode)) {
+ printf("Cannot find image '%s' for language '%s'. This image will be skipped.\n", name, language);
+ return;
+ }
+
+ char str[256];
+
+ // Read header (and check we have a binary PBM file)
+ imgFile.readString(str, 256);
+ if (strcmp(str, "P4") != 0) {
+ imgFile.close();
+ printf("File '%s' doesn't seem to be a binary pbm file! This image will be skipped.\n", fileName);
+ return;
+ }
+
+ // Skip comments and then read and check size
+ do {
+ imgFile.readString(str, 256);
+ } while (str[0] == '#');
+ int w = 0, h = 0;
+ if (sscanf(str, "%d %d", &w, &h) != 2 || w != 640 || h != 480) {
+ imgFile.close();
+ printf("Binary pbm file '%s' doesn't have the expected size (expected: 640x480, read: %dx%d). This image will be skipped.\n", fileName, w, h);
+ return;
+ }
+
+ // Write block header in output file (4 bytes).
+ // We convert the image name to upper case.
+ for (int i = 0 ; i < 4 ; ++i) {
+ if (name[i] >= 97 && name[i] <= 122)
+ outputFile.writeByte(name[i] - 32);
+ else
+ outputFile.writeByte(name[i]);
+ }
+ // And write the language code on 4 bytes as well (padded with 0 if needed).
+ int languageLength = strlen(language);
+ for (int i = 0 ; i < 4 ; ++i) {
+ if (i < languageLength)
+ outputFile.writeByte(language[i]);
+ else
+ outputFile.writeByte(0);
+ }
+
+ // Write block size (640*480 / 8)
+ outputFile.writeLong(38400);
+
+ // Write all the bytes. We should have 38400 bytes (640 * 480 / 8)
+ // However we need to invert the bits has the engine expects 1 for the background and 0 for the text (black)
+ // but pbm uses 0 for white and 1 for black.
+ for (int i = 0 ; i < 38400 ; ++i) {
+ byte b = imgFile.readByte();
+ outputFile.writeByte(~b);
+ }
+
+ imgFile.close();
+}
+
+void writeGermanStrings(File& outputFile) {
+ // Write header and language
+ outputFile.write("TEXT", 4);
+ outputFile.write("de\0\0", 4);
+
+ // Reserve the size for the block size, but we will write it at the end once we know what it is.
+ uint32 blockSizePos = outputFile.pos();
+ uint32 blockSize = 0;
+ outputFile.writeLong(blockSize);
+
+ // Write all the strings
+ const char **s = &gameText[0];
+ while (*s) {
+ outputFile.writeString(*s);
+ blockSize += strlen(*s) + 1;
+ ++s;
+ }
+
+ // Now write the block size and then go back to the end of the file.
+ outputFile.seek(blockSizePos, SEEK_SET);
+ outputFile.writeLong(blockSize);
+ outputFile.seek(0, SEEK_END);
+}
+
+void writeStrings(File& outputFile, const char* language) {
+ File poFile;
+ char fileName[16];
+ sprintf(fileName, "strings-%s.po", language);
+ if (!poFile.open(fileName, kFileReadMode)) {
+ printf("Cannot find strings file for language '%s'.\n", language);
+ return;
+ }
+
+ // Write block header
+ outputFile.write("TEXT", 4);
+
+ // And write the language code on 4 bytes as well (padded with 0 if needed).
+ int languageLength = strlen(language);
+ for (int i = 0 ; i < 4 ; ++i) {
+ if (i < languageLength)
+ outputFile.writeByte(language[i]);
+ else
+ outputFile.writeByte(0);
+ }
+
+ // Reserve the size for the block size, but we will write it at the end once we know what it is.
+ uint32 blockSizePos = outputFile.pos();
+ uint32 blockSize = 0;
+ outputFile.writeLong(blockSize);
+
+
+
+ // TODO: read all the strings
+ // build german - translated map
+ // Then iterate on gameText and for each (german) string look for the corresponding translated string
+ // and write it (or write "" if not found).
+ // Doing so also count the number of byte written.
+ // Then finally go back to block size pos and write the block size.
+ // And go back to end of file.
+
+
+
+ poFile.close();
+
+ // Now write the block size and then go back to the end of the file.
+ outputFile.seek(blockSizePos, SEEK_SET);
+ outputFile.writeLong(blockSize);
+ outputFile.seek(0, SEEK_END);
+}
+
+
+/**
+ * Main method
+ */
+int main(int argc, char *argv[]) {
+ File outputFile;
+ if (!outputFile.open("supernova.dat", kFileWriteMode)) {
+ printf("Cannot create file 'supernova.dat' in current directory.\n");
+ exit(0);
+ }
+
+ // The generated file is of the form:
+ // 3 bytes: 'MSN'
+ // 1 byte: version
+ // -- data blocks
+ // 4 bytes: header 'IMG1' and 'IMG2' for newspaper images (for file 1 and file 2 respectively),
+ // 'TEXT' for strings
+ // 4 bytes: language code ('en\0', 'de\0'- see common/language.cpp)
+ // 4 bytes: block size n (uint32)
+ // n bytes: data
+ // ---
+
+ // Header
+ outputFile.write("MSN", 3);
+ outputFile.writeByte(VERSION);
+
+ // German strings
+ writeGermanStrings(outputFile);
+
+ // Other languages
+ const char **l = &lang[0];
+ while(*l) {
+ writeImage(outputFile, "img1", *l);
+ writeImage(outputFile, "img2", *l);
+ writeStrings(outputFile, *l);
+ ++l;
+ }
+
+ outputFile.close();
+ return 0;
+}
diff --git a/devtools/create_supernova/create_supernova.h b/devtools/create_supernova/create_supernova.h
new file mode 100644
index 0000000..7447a7e
--- /dev/null
+++ b/devtools/create_supernova/create_supernova.h
@@ -0,0 +1,33 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * This is a utility for generating a data file for the supernova engine.
+ * It contains strings extracted from the original executable as well
+ * as translations and is required for the engine to work properly.
+ */
+
+#ifndef CREATE_SUPERNOVA_H
+#define CREATE_SUPERNOVA_H
+
+#define VERSION 1
+
+
+
+#endif // CREATE_SUPERNOVA_H
diff --git a/devtools/create_supernova/file.cpp b/devtools/create_supernova/file.cpp
new file mode 100644
index 0000000..5fb842a
--- /dev/null
+++ b/devtools/create_supernova/file.cpp
@@ -0,0 +1,72 @@
+#include "file.h"
+
+bool File::open(const char *filename, AccessMode mode) {
+ f = fopen(filename, (mode == kFileReadMode) ? "rb" : "wb");
+ return (f != NULL);
+}
+
+void File::close() {
+ fclose(f);
+ f = NULL;
+}
+
+int File::seek(int32 offset, int whence) {
+ return fseek(f, offset, whence);
+}
+
+long File::read(void *buffer, int len) {
+ return fread(buffer, 1, len, f);
+}
+void File::write(const void *buffer, int len) {
+ fwrite(buffer, 1, len, f);
+}
+
+byte File::readByte() {
+ byte v;
+ read(&v, sizeof(byte));
+ return v;
+}
+
+uint16 File::readWord() {
+ uint16 v;
+ read(&v, sizeof(uint16));
+ return FROM_LE_16(v);
+}
+
+uint32 File::readLong() {
+ uint32 v;
+ read(&v, sizeof(uint32));
+ return FROM_LE_32(v);
+}
+
+void File::readString(char* string, int bufferLength) {
+ int i = 0;
+ while (i < bufferLength - 1 && fread(string + i, 1, 1, f) == 1) {
+ if (string[i] == '\n' || string[i] == 0)
+ break;
+ ++ i;
+ }
+ string[i] = 0;
+}
+
+void File::writeByte(byte v) {
+ write(&v, sizeof(byte));
+}
+
+void File::writeWord(uint16 v) {
+ uint16 vTemp = TO_LE_16(v);
+ write(&vTemp, sizeof(uint16));
+}
+
+void File::writeLong(uint32 v) {
+ uint32 vTemp = TO_LE_32(v);
+ write(&vTemp, sizeof(uint32));
+}
+
+void File::writeString(const char *s) {
+ write(s, strlen(s) + 1);
+}
+
+uint32 File::pos() {
+ return ftell(f);
+}
diff --git a/devtools/create_supernova/file.h b/devtools/create_supernova/file.h
new file mode 100644
index 0000000..dd33e41
--- /dev/null
+++ b/devtools/create_supernova/file.h
@@ -0,0 +1,59 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * This is a utility for generating a data file for the supernova engine.
+ * It contains strings extracted from the original executable as well
+ * as translations and is required for the engine to work properly.
+ */
+
+#ifndef FILE_H
+#define FILE_H
+
+// Disable symbol overrides so that we can use system headers.
+#define FORBIDDEN_SYMBOL_ALLOW_ALL
+#include "common/endian.h"
+
+enum AccessMode {
+ kFileReadMode = 1,
+ kFileWriteMode = 2
+};
+
+class File {
+private:
+ FILE *f;
+public:
+ bool open(const char *filename, AccessMode mode = kFileReadMode);
+ void close();
+ int seek(int32 offset, int whence = SEEK_SET);
+ uint32 pos();
+ long read(void *buffer, int len);
+ void write(const void *buffer, int len);
+
+ byte readByte();
+ uint16 readWord();
+ uint32 readLong();
+ void readString(char*, int bufferLength);
+ void writeByte(byte v);
+ void writeWord(uint16 v);
+ void writeLong(uint32 v);
+ void writeString(const char *s);
+};
+
+#endif // FILE_H
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
new file mode 100644
index 0000000..a055260
--- /dev/null
+++ b/devtools/create_supernova/gametext.h
@@ -0,0 +1,271 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * This is a utility for generating a data file for the supernova engine.
+ * It contains strings extracted from the original executable as well
+ * as translations and is required for the engine to work properly.
+ */
+
+#ifndef GAMETEXT_H
+#define GAMETEXT_H
+
+#include <stddef.h>
+
+// This file contains the strings in German and is encoded using CP850 encoding.
+// Other language should be provided as po files also using the CP850 encoding.
+
+// TODO: add the strings from the engine here, add an Id string in comment.
+// And in the engine add a StringId enum with all the Ids = index in this array.
+
+const char *gameText[] = {
+ // 0
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 5
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 10
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 15
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 20
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 25
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 30
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 35
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 40
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 45
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 50
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 55
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 60
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 65
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 70
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 75
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 80
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 85
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 90
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 95
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 100
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 105
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 110
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 115
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 120
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 125
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 130
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 135
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 140
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 145
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 150
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 155
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 160
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 165
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 170
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 175
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 180
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ // 185
+ "", //
+ "", //
+ "", //
+ "", //
+ "", //
+ NULL
+};
+
+
+
+#endif // GAMETEXT_H
diff --git a/devtools/create_supernova/module.mk b/devtools/create_supernova/module.mk
new file mode 100644
index 0000000..9591233
--- /dev/null
+++ b/devtools/create_supernova/module.mk
@@ -0,0 +1,11 @@
+MODULE := devtools/create_supernova
+
+MODULE_OBJS := \
+ file.o \
+ create_supernova.o
+
+# Set the name of the executable
+TOOL_EXECUTABLE := create_supernova
+
+# Include common rules
+include $(srcdir)/rules.mk
Commit: 5efa5a8a05eeb80ef0b60fefe24257da3095b7af
https://github.com/scummvm/scummvm/commit/5efa5a8a05eeb80ef0b60fefe24257da3095b7af
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:32Z
Commit Message:
SUPERNOVA: Add bitmap files for the first newspaper English translation
The pbm file is the source file for the create_supernova tool. The xcf
file is the gimp image that was used to create it and is also added in
case we need to modify it.
Changed paths:
A devtools/create_supernova/img1-en.pbm
A devtools/create_supernova/img1-en.xcf
diff --git a/devtools/create_supernova/img1-en.pbm b/devtools/create_supernova/img1-en.pbm
new file mode 100644
index 0000000..f1a7694
Binary files /dev/null and b/devtools/create_supernova/img1-en.pbm differ
diff --git a/devtools/create_supernova/img1-en.xcf b/devtools/create_supernova/img1-en.xcf
new file mode 100644
index 0000000..3231a06
Binary files /dev/null and b/devtools/create_supernova/img1-en.xcf differ
Commit: b2384152ce624f0644783c33d93386928df598b6
https://github.com/scummvm/scummvm/commit/b2384152ce624f0644783c33d93386928df598b6
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:32Z
Commit Message:
SUPERNOVA: Add parsing of po file in create_supernova
This means the tool is now complete and can add translations to the
supernova engine data file.
Changed paths:
A devtools/create_supernova/po_parser.cpp
A devtools/create_supernova/po_parser.h
devtools/create_supernova/create_supernova.cpp
devtools/create_supernova/module.mk
diff --git a/devtools/create_supernova/create_supernova.cpp b/devtools/create_supernova/create_supernova.cpp
index 0d4ebe2..bf04004 100644
--- a/devtools/create_supernova/create_supernova.cpp
+++ b/devtools/create_supernova/create_supernova.cpp
@@ -1,6 +1,7 @@
#include "create_supernova.h"
#include "gametext.h"
#include "file.h"
+#include "po_parser.h"
// HACK to allow building with the SDL backend on MinGW
// see bug #1800764 "TOOLS: MinGW tools building broken"
@@ -105,10 +106,10 @@ void writeGermanStrings(File& outputFile) {
}
void writeStrings(File& outputFile, const char* language) {
- File poFile;
char fileName[16];
sprintf(fileName, "strings-%s.po", language);
- if (!poFile.open(fileName, kFileReadMode)) {
+ PoMessageList* poList = parsePoFile(fileName);
+ if (!poList) {
printf("Cannot find strings file for language '%s'.\n", language);
return;
}
@@ -130,19 +131,21 @@ void writeStrings(File& outputFile, const char* language) {
uint32 blockSize = 0;
outputFile.writeLong(blockSize);
-
-
- // TODO: read all the strings
- // build german - translated map
- // Then iterate on gameText and for each (german) string look for the corresponding translated string
- // and write it (or write "" if not found).
- // Doing so also count the number of byte written.
- // Then finally go back to block size pos and write the block size.
- // And go back to end of file.
-
-
-
- poFile.close();
+ // Write all the strings.
+ // If a string is not translated we use the German one.
+ const char **s = &gameText[0];
+ while (*s) {
+ const char* translation = poList->findTranslation(*s);
+ if (translation) {
+ outputFile.writeString(translation);
+ blockSize += strlen(translation) + 1;
+ } else {
+ outputFile.writeString(*s);
+ blockSize += strlen(*s) + 1;
+ }
+ ++s;
+ }
+ delete poList;
// Now write the block size and then go back to the end of the file.
outputFile.seek(blockSizePos, SEEK_SET);
diff --git a/devtools/create_supernova/module.mk b/devtools/create_supernova/module.mk
index 9591233..806ccca 100644
--- a/devtools/create_supernova/module.mk
+++ b/devtools/create_supernova/module.mk
@@ -2,6 +2,7 @@ MODULE := devtools/create_supernova
MODULE_OBJS := \
file.o \
+ po_parser.o \
create_supernova.o
# Set the name of the executable
diff --git a/devtools/create_supernova/po_parser.cpp b/devtools/create_supernova/po_parser.cpp
new file mode 100644
index 0000000..f4a9b96
--- /dev/null
+++ b/devtools/create_supernova/po_parser.cpp
@@ -0,0 +1,221 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "po_parser.h"
+
+PoMessageList::PoMessageList() : _list(NULL), _size(0), _allocated(0) {
+}
+
+PoMessageList::~PoMessageList() {
+ for (int i = 0; i < _size; ++i)
+ delete _list[i];
+ delete[] _list;
+}
+
+int PoMessageList::compareString(const char* left, const char* right) {
+ if (left == NULL && right == NULL)
+ return 0;
+ if (left == NULL)
+ return -1;
+ if (right == NULL)
+ return 1;
+ return strcmp(left, right);
+}
+
+int PoMessageList::compareMessage(const char *msgLeft, const char *contextLeft, const char *msgRight, const char *contextRight) {
+ int compare = compareString(msgLeft, msgRight);
+ if (compare != 0)
+ return compare;
+ return compareString(contextLeft, contextRight);
+}
+
+void PoMessageList::insert(const char *translation, const char *msg, const char *context) {
+ if (msg == NULL || *msg == '\0' || translation == NULL || *translation == '\0')
+ return;
+
+ // binary-search for the insertion index
+ int leftIndex = 0;
+ int rightIndex = _size - 1;
+ while (rightIndex >= leftIndex) {
+ int midIndex = (leftIndex + rightIndex) / 2;
+ int compareResult = compareMessage(msg, context, _list[midIndex]->msgid, _list[midIndex]->msgctxt);
+ if (compareResult == 0)
+ return; // The message is already in this list
+ else if (compareResult < 0)
+ rightIndex = midIndex - 1;
+ else
+ leftIndex = midIndex + 1;
+ }
+ // We now have rightIndex = leftIndex - 1 and we need to insert the new message
+ // between the two (i.a. at leftIndex).
+ if (_size + 1 > _allocated) {
+ _allocated += 100;
+ PoMessage **newList = new PoMessage*[_allocated];
+ for (int i = 0; i < leftIndex; ++i)
+ newList[i] = _list[i];
+ for (int i = leftIndex; i < _size; ++i)
+ newList[i + 1] = _list[i];
+ delete[] _list;
+ _list = newList;
+ } else {
+ for (int i = _size - 1; i >= leftIndex; --i)
+ _list[i + 1] = _list[i];
+ }
+ _list[leftIndex] = new PoMessage(translation, msg, context);
+ ++_size;
+}
+
+const char *PoMessageList::findTranslation(const char *msg, const char *context) {
+ if (msg == NULL || *msg == '\0')
+ NULL;
+
+ // binary-search for the message
+ int leftIndex = 0;
+ int rightIndex = _size - 1;
+ while (rightIndex >= leftIndex) {
+ int midIndex = (leftIndex + rightIndex) / 2;
+ int compareResult = compareMessage(msg, context, _list[midIndex]->msgid, _list[midIndex]->msgctxt);
+ if (compareResult == 0)
+ return _list[midIndex]->msgstr;
+ else if (compareResult < 0)
+ rightIndex = midIndex - 1;
+ else
+ leftIndex = midIndex + 1;
+ }
+ return NULL;
+}
+
+PoMessageList *parsePoFile(const char *file) {
+ FILE *inFile = fopen(file, "r");
+ if (!inFile)
+ return NULL;
+
+ char msgidBuf[1024], msgctxtBuf[1024], msgstrBuf[1024];
+ char line[1024], *currentBuf = msgstrBuf;
+
+ PoMessageList *list = new PoMessageList();
+
+ // Initialize the message attributes.
+ bool fuzzy = false;
+ bool fuzzy_next = false;
+
+ // Parse the file line by line.
+ // The msgstr is always the last line of an entry (i.e. msgid and msgctxt always
+ // precede the corresponding msgstr).
+ msgidBuf[0] = msgstrBuf[0] = msgctxtBuf[0] = '\0';
+ while (!feof(inFile) && fgets(line, 1024, inFile)) {
+ if (line[0] == '#' && line[1] == ',') {
+ // Handle message attributes.
+ if (strstr(line, "fuzzy")) {
+ fuzzy_next = true;
+ continue;
+ }
+ }
+ // Skip empty and comment line
+ if (*line == '\n' || *line == '#')
+ continue;
+ if (strncmp(line, "msgid", 5) == 0) {
+ if (currentBuf == msgstrBuf) {
+ // add previous entry
+ if (*msgstrBuf != '\0' && !fuzzy)
+ list->insert(msgstrBuf, msgidBuf, msgctxtBuf);
+ msgidBuf[0] = msgstrBuf[0] = msgctxtBuf[0] = '\0';
+
+ // Reset the attribute flags.
+ fuzzy = fuzzy_next;
+ fuzzy_next = false;
+ }
+ strcpy(msgidBuf, stripLine(line));
+ currentBuf = msgidBuf;
+ } else if (strncmp(line, "msgctxt", 7) == 0) {
+ if (currentBuf == msgstrBuf) {
+ // add previous entry
+ if (*msgstrBuf != '\0' && !fuzzy)
+ list->insert(msgstrBuf, msgidBuf, msgctxtBuf);
+ msgidBuf[0] = msgstrBuf[0] = msgctxtBuf[0] = '\0';
+
+ // Reset the attribute flags
+ fuzzy = fuzzy_next;
+ fuzzy_next = false;
+ }
+ strcpy(msgctxtBuf, stripLine(line));
+ currentBuf = msgctxtBuf;
+ } else if (strncmp(line, "msgstr", 6) == 0) {
+ strcpy(msgstrBuf, stripLine(line));
+ currentBuf = msgstrBuf;
+ } else {
+ // concatenate the string at the end of the current buffer
+ if (currentBuf)
+ strcat(currentBuf, stripLine(line));
+ }
+ }
+ if (currentBuf == msgstrBuf) {
+ // add last entry
+ if (*msgstrBuf != '\0' && !fuzzy)
+ list->insert(msgstrBuf, msgidBuf, msgctxtBuf);
+ }
+
+ fclose(inFile);
+ return list;
+}
+
+char *stripLine(char *const line) {
+ // This function modifies line in place and return it.
+ // Keep only the text between the first two unprotected quotes.
+ // It also look for literal special characters (e.g. preceded by '\n', '\\', '\"', '\'', '\t')
+ // and replace them by the special character so that strcmp() can match them at run time.
+ // Look for the first quote
+ char const *src = line;
+ while (*src != '\0' && *src++ != '"') {}
+ // shift characters until we reach the end of the string or an unprotected quote
+ char *dst = line;
+ while (*src != '\0' && *src != '"') {
+ char c = *src++;
+ if (c == '\\') {
+ switch (c = *src++) {
+ case 'n': c = '\n'; break;
+ case 't': c = '\t'; break;
+ case '\"': c = '\"'; break;
+ case '\'': c = '\''; break;
+ case '\\': c = '\\'; break;
+ default:
+ // Just skip
+ fprintf(stderr, "Unsupported special character \"\\%c\" in string. Please contact ScummVM developers.\n", c);
+ continue;
+ }
+ }
+ *dst++ = c;
+ }
+ *dst = '\0';
+ return line;
+}
+
+char *parseLine(const char *line, const char *field) {
+ // This function allocate and return a new char*.
+ // It will return a NULL pointer if the field is not found.
+ // It is used to parse the header of the po files to find the language name
+ // and the charset.
+ const char *str = strstr(line, field);
+ if (str == NULL)
+ return NULL;
+ str += strlen(field);
+ // Skip spaces
+ while (*str != '\0' && isspace(*str)) {
+ ++str;
+ }
+ // Find string length (stop at the first '\n')
+ int len = 0;
+ while (str[len] != '\0' && str[len] != '\n') {
+ ++len;
+ }
+ if (len == 0)
+ return NULL;
+ // Create result string
+ char *result = new char[len + 1];
+ strncpy(result, str, len);
+ result[len] = '\0';
+ return result;
+}
+
diff --git a/devtools/create_supernova/po_parser.h b/devtools/create_supernova/po_parser.h
new file mode 100644
index 0000000..7c358e3
--- /dev/null
+++ b/devtools/create_supernova/po_parser.h
@@ -0,0 +1,78 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * This is a utility for generating a data file for the supernova engine.
+ * It contains strings extracted from the original executable as well
+ * as translations and is required for the engine to work properly.
+ */
+
+#ifndef PO_PARSER_H
+#define PO_PARSER_H
+
+struct PoMessage {
+ char *msgstr;
+ char *msgid;
+ char *msgctxt;
+
+ PoMessage(const char *translation, const char *message, const char *context = NULL) :
+ msgstr(NULL), msgid(NULL), msgctxt(NULL)
+ {
+ if (translation != NULL && *translation != '\0') {
+ msgstr = new char[1 + strlen(translation)];
+ strcpy(msgstr, translation);
+ }
+ if (message != NULL && *message != '\0') {
+ msgid = new char[1 + strlen(message)];
+ strcpy(msgid, message);
+ }
+ if (context != NULL && *context != '\0') {
+ msgctxt = new char[1 + strlen(context)];
+ strcpy(msgctxt, context);
+ }
+ }
+ ~PoMessage() {
+ delete[] msgstr;
+ delete[] msgid;
+ delete[] msgctxt;
+ }
+};
+
+class PoMessageList {
+public:
+ PoMessageList();
+ ~PoMessageList();
+
+ void insert(const char *translation, const char *msg, const char *context = NULL);
+ const char *findTranslation(const char *msg, const char *context = NULL);
+
+private:
+ int compareString(const char *left, const char *right);
+ int compareMessage(const char *msgLeft, const char *contextLeft, const char *msgRight, const char *contextRight);
+
+ PoMessage **_list;
+ int _size;
+ int _allocated;
+};
+
+PoMessageList *parsePoFile(const char *file);
+char *stripLine(char *);
+char *parseLine(const char *line, const char *field);
+
+#endif /* PO_PARSER_H */
Commit: 4e374cc9be1a7d9051b5f0620538befb0c2f843c
https://github.com/scummvm/scummvm/commit/4e374cc9be1a7d9051b5f0620538befb0c2f843c
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:33Z
Commit Message:
SUPERNOVA: Add some German strings to the create_supernova tool
Changed paths:
devtools/create_supernova/gametext.h
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index a055260..5183dfd 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -36,55 +36,55 @@
const char *gameText[] = {
// 0
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Gehe", // kCommandGo
+ "Schau", // kCommandLook
+ "Nimm", // kCommandTake
+ "\231ffne", // kCommandOpen
+ "Schlie\341e", // kCommandClose
// 5
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Dr\201cke", // kCommandPress
+ "Ziehe", // kCommandPull
+ "Benutze", // kCommandUse
+ "Rede", // kCommandTalk
+ "Gib", // kCommandGive
// 10
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Gehe zu ", // kStatusCommandGo
+ "Schau ", // kStatusCommandLook
+ "Nimm ", // kStatusCommandTake
+ "\231ffne ", // kStatusCommandOpen
+ "Schlie\341e ", // kStatusCommandClose
// 15
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Dr\201cke ", // kStatusCommandPress
+ "Ziehe ", // kStatusCommandPull
+ "Benutze ", // kStatusCommandUse
+ "Rede mit ", // kStatusCommandTalk
+ "Gib ", // kStatusCommandGive
// 20
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Hmm, er scheint kaputt zu sein.", // kBroken
+ "^(C) 1994 Thomas und Steffen Dingel#", // kIntro1
+ "Story und Grafik:^ Thomas Dingel#", // kIntro2
+ "Programmierung:^ Steffen Dingel#", // kIntro3
+ "Musik:^ Bernd Hoffmann#", // kIntro4
// 25
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Getestet von ...#", // kIntro5
+ "^Matthias Neef#", // kIntro6
+ "^Sascha Otterbach#", // kIntro7
+ "^Thomas Mazzoni#", // kIntro8
+ "^Matthias Klein#", // kIntro9
// 30
- "", //
- "", //
- "", //
- "", //
- "", //
+ "^Gerrit Rothmaier#", // kIntro10
+ "^Thomas Hassler#", // kIntro11
+ "^Rene Koch#", // kIntro12
+ "°", // kIntro13
+ "Keycard", // kKeycard
// 35
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Die Keycard f\224r deine Schr\204nke.", // kKeycardDesc
+ "Taschenmesser", // kKnife
+ "Es ist nicht mehr das sch\204rfste.", // kKnifeDesc
+ "Armbanduhr", // kWatch
+ "Discman", // kDiscman
// 40
- "", //
+ "Es ist eine \"Mad Monkeys\"-CD darin.", // kDiscmanDesc
"", //
"", //
"", //
Commit: a13086ad25b573e7b6f580f7ed38c4c37f6a9d17
https://github.com/scummvm/scummvm/commit/a13086ad25b573e7b6f580f7ed38c4c37f6a9d17
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:33Z
Commit Message:
SUPERNOVA: Add partial English translation to the create_supernova tool
Changed paths:
A devtools/create_supernova/strings-en.po
diff --git a/devtools/create_supernova/strings-en.po b/devtools/create_supernova/strings-en.po
new file mode 100644
index 0000000..b2be1cc
--- /dev/null
+++ b/devtools/create_supernova/strings-en.po
@@ -0,0 +1,2897 @@
+# Mission Supernova Translation.
+# Copyright (C) YEAR ScummVM Team
+# This file is distributed under the same license as the ScummVM package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Mission Supernova 1.0\n"
+"Report-Msgid-Bugs-To: scummvm-devel at lists.scummvm.org\n"
+"POT-Creation-Date: 2017-07-21 23:49+0100\n"
+"PO-Revision-Date: 2017-09-03 15:57+0000\n"
+"Last-Translator: Thierry Crozat <criezy at scummvm.org>\n"
+"Language-Team: none\n"
+"Language: en\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CP850\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.9\n"
+
+#. I18N: Go
+#: ../../msn/msn.c:1610
+msgid "Gehe"
+msgstr "Go"
+
+#. I18N: Look
+#: ../../msn/msn.c:1612
+msgid "Schau"
+msgstr "Look"
+
+#. I18N: Take
+#: ../../msn/msn.c:1614
+msgid "Nimm"
+msgstr "Take"
+
+#. I18N: Open
+#: ../../msn/msn.c:1616
+msgid "ffne"
+msgstr "Open"
+
+#. I18N: Close
+#: ../../msn/msn.c:1618
+msgid "Schlieáe"
+msgstr "Close"
+
+#. I18N: Press
+#: ../../msn/msn.c:1620
+msgid "Drcke"
+msgstr "Press"
+
+#. I18N: Pull
+#: ../../msn/msn.c:1622
+msgid "Ziehe"
+msgstr "Pull"
+
+#. I18N: Use
+#: ../../msn/msn.c:1624
+msgid "Benutze"
+msgstr "Use"
+
+#. I18N: Talk
+#: ../../msn/msn.c:1626
+msgid "Rede"
+msgstr "Talk"
+
+#. I18N: Give
+#: ../../msn/msn.c:1628
+msgid "Gib"
+msgstr "Give"
+
+#. I18N: End of conversation
+#: ../../msn/msn.c:2204
+msgid "Gesprch beenden"
+msgstr "End of conversation"
+
+#. I18N: Go to
+#: ../../msn/msn.c:2334
+msgid "Gehe zu "
+msgstr "Go to "
+
+#. I18N: Look at
+#: ../../msn/msn.c:2336
+msgid "Schau "
+msgstr "Look at "
+
+#. I18N: Take
+#: ../../msn/msn.c:2338
+msgid "Nimm "
+msgstr "Take "
+
+#. I18N: Open
+#: ../../msn/msn.c:2340
+msgid "ffne "
+msgstr "Open "
+
+#. I18N: Close
+#: ../../msn/msn.c:2342
+msgid "Schlieáe "
+msgstr "Close "
+
+#. I18N: Press
+#: ../../msn/msn.c:2344
+msgid "Drcke "
+msgstr "Press "
+
+#. I18N: Pull
+#: ../../msn/msn.c:2346
+msgid "Ziehe "
+msgstr "Pull "
+
+#. I18N: Use
+#: ../../msn/msn.c:2348
+msgid "Benutze "
+msgstr "Use "
+
+#. I18N: Talk to
+#: ../../msn/msn.c:2350
+msgid "Rede mit "
+msgstr "Talk to "
+
+#. I18N: Give
+#: ../../msn/msn.c:2352
+msgid "Gib "
+msgstr "Give "
+
+#: ../../msn/msn.c:2368
+msgid " an "
+msgstr " to "
+
+#: ../../msn/msn.c:2371
+msgid " mit "
+msgstr " with "
+
+#. I18N: Load
+#: ../../msn/msn.c:2880
+msgid "Laden"
+msgstr "Load"
+
+#. I18N: Save
+#: ../../msn/msn.c:2883
+msgid "Speichern"
+msgstr "Save"
+
+#. I18N: Back
+#: ../../msn/msn.c:2886
+msgid "Zurck"
+msgstr "Back"
+
+#. I18N: Restart
+#: ../../msn/msn.c:2889
+msgid "Neustart"
+msgstr "Restart"
+
+#. I18N: Help
+#: ../../msn/msn.c:3163
+msgid "F1 Hilfe"
+msgstr "F1 Help"
+
+#. I18N: Instructions
+#: ../../msn/msn.c:3165
+msgid "F2 Anleitung"
+msgstr "F2 Instructions"
+
+#. I18N: Program information
+#: ../../msn/msn.c:3167
+msgid "F3 Programminformationen"
+msgstr "F3 Program information"
+
+#. I18N: Text Speed
+#: ../../msn/msn.c:3169
+msgid "F4 Textgeschwindigkeit"
+msgstr "F4 Text speed"
+
+#. I18N: Load / Save
+#: ../../msn/msn.c:3171
+msgid "F5 Laden / Speichern"
+msgstr "F5 Load / Save"
+
+#. I18N: Skip intro
+#: ../../msn/msn.c:3173
+msgid "ESC Vorspann berspringen"
+msgstr "ESC Skip intro"
+
+#. I18N: Exit program
+#: ../../msn/msn.c:3175
+msgid "Alt-X Programm abbrechen"
+msgstr "Alt-X Exit program"
+
+#. I18N: Text Speed
+#: ../../msn/msn.c:3219
+msgid "Textgeschwindigkeit:"
+msgstr "Text speed:"
+
+#. I18N: Leave game?
+#: ../../msn/msn.c:3267
+msgid "Spiel abbrechen?"
+msgstr "Leave game?"
+
+#: ../../msn/msn.c:3270
+msgid "Ja"
+msgstr "Yes"
+
+#: ../../msn/msn.c:3271
+msgid "Nein"
+msgstr "No"
+
+#. I18N: You already carry this.
+#: ../../msn/msn.c:3341
+msgid "Das trgst du doch bei dir."
+msgstr "You already carry this."
+
+#. I18N: You're already there.
+#: ../../msn/msn.c:3344
+msgid "Du bist doch schon da."
+msgstr "You are already there."
+
+#. I18N: This is closed
+#: ../../msn/msn.c:3347 ../../msn/msn_r1.c:683
+msgid "Das ist geschlossen."
+msgstr "This is closed."
+
+#. I18N: You already have that
+#: ../../msn/msn.c:3357
+msgid "Das hast du doch schon."
+msgstr "You already have that."
+
+#. I18N: You do not need that.
+#: ../../msn/msn.c:3360
+msgid "Das brauchst du nicht."
+msgstr "You do not need that."
+
+#. I18N: You can't take that.
+#: ../../msn/msn.c:3363
+msgid "Das kannst du nicht nehmen."
+msgstr "You can't take that."
+
+#. I18N: This can't be opened
+#: ../../msn/msn.c:3370
+msgid "Das lát sich nicht ffnen."
+msgstr "This cannot be opened."
+
+#. I18N: This is already opened.
+#: ../../msn/msn.c:3373
+msgid "Das ist schon offen."
+msgstr "This is already opened."
+
+#. I18N: This is locked.
+#: ../../msn/msn.c:3376
+msgid "Das ist verschlossen."
+msgstr "This is locked."
+
+#. I18N: This can't be closed.
+#: ../../msn/msn.c:3393
+msgid "Das lát sich nicht schlieáen."
+msgstr "This cannot be closed."
+
+#. I18N: This is already closed.
+#: ../../msn/msn.c:3396 ../../msn/msn_r1.c:829
+msgid "Das ist schon geschlossen."
+msgstr "This is already closed."
+
+#. I18N: Better keep it!
+#: ../../msn/msn.c:3412
+msgid "Behalt es lieber!"
+msgstr "Better keep it!"
+
+#. I18N: This is not possible.
+#: ../../msn/msn.c:3418
+msgid "Das geht nicht."
+msgstr "This is not possible."
+
+#: ../../msn/msn_mod.c:573
+msgid "^(C) 1994 Thomas und Steffen Dingel#"
+msgstr "^(C) 1994 Thomas and Steffen Dingel#"
+
+#: ../../msn/msn_mod.c:574
+msgid "Story und Grafik:^ Thomas Dingel#"
+msgstr "Story and Graphics:^ Thomas Dingel#"
+
+#: ../../msn/msn_mod.c:575
+msgid "Programmierung:^ Steffen Dingel#"
+msgstr "Programming:^ Steffen Dingel#"
+
+#: ../../msn/msn_mod.c:576
+msgid "Musik:^ Bernd Hoffmann#"
+msgstr "Music:^ Bernd Hoffmann#"
+
+#: ../../msn/msn_mod.c:577
+msgid "Getestet von ...#"
+msgstr "Tested by ...#"
+
+#: ../../msn/msn_mod.c:587
+msgid "^ E#N#D#E ...########"
+msgstr "^ T#H#E E#N#D ...########"
+
+#: ../../msn/msn_mod.c:588
+msgid "# ... des ersten Teils!########"
+msgstr "# ... of the first part!########"
+
+#: ../../msn/msn_mod.c:590
+msgid "^Aber:#"
+msgstr "^But:#"
+
+#: ../../msn/msn_mod.c:591
+msgid "Das Abenteuer geht weiter, ...##"
+msgstr "The adventure continues ...##"
+
+#: ../../msn/msn_mod.c:592
+msgid "... wenn Sie sich fr 30,- DM registrieren lassen!##"
+msgstr "... if you register for 30, - DM!##"
+
+#: ../../msn/msn_mod.c:593
+msgid "(Falls Sie das nicht schon lngst getan haben.)##"
+msgstr "(If you have not already done so.)##"
+
+#: ../../msn/msn_mod.c:594
+msgid "In^ Teil 2 - Der Doppelgnger^ erwarten Sie:##"
+msgstr "In^ Part 2 - The Doppelganger^ you can expect:##"
+
+#: ../../msn/msn_mod.c:595
+msgid "Knifflige Puzzles,##"
+msgstr "tricky puzzles,##"
+
+#: ../../msn/msn_mod.c:596
+msgid "noch mehr Grafik und Sound,##"
+msgstr "even more graphics and sound,##"
+
+#: ../../msn/msn_mod.c:597
+msgid "ein perfekt geplanter Museumseinbruch,##"
+msgstr "a perfectly planned museum burglary,##"
+
+#: ../../msn/msn_mod.c:598
+msgid "das Virtual-Reality-Spiel \"Indiana Joe\"##"
+msgstr "the virtual reality game \"Indiana Joe\"##"
+
+#: ../../msn/msn_mod.c:599
+msgid "und vieles mehr!##"
+msgstr "and much more!##"
+
+#. I18N: There's nothing special about it
+#: ../../msn/msn_r0.c:25
+msgid "Es ist nichts Besonderes daran."
+msgstr "There's nothing special about it."
+
+#. I18N: You first have to take it
+#: ../../msn/msn_r0.c:27 ../../msn/msn_r0.c:230
+msgid "Das muát du erst nehmen."
+msgstr "You first have to take it."
+
+#. I18N: Hello
+#: ../../msn/msn_r0.c:32
+msgid "Hallo!"
+msgstr "Hello!"
+
+#. I18N: Good day!
+#: ../../msn/msn_r0.c:34
+msgid "Guten Tag!"
+msgstr "Good day!"
+
+#. I18N: It's me, Horst Hummel
+#: ../../msn/msn_r0.c:36
+msgid "Ich bin's, Horst Hummel."
+msgstr "It's me, Horst Hummel."
+
+#: ../../msn/msn_r0.c:147
+msgid "Ok."
+msgstr "OK."
+
+#: ../../msn/msn_r0.c:166
+msgid "Irgendwie ist ein Raumhelm|beim Essen unpraktisch."
+msgstr "Somehow, a space helmet is|impractical when eating."
+
+#: ../../msn/msn_r0.c:182 ../../msn/msn_r0.c:192
+msgid "Schmeckt ganz gut."
+msgstr "Tastes good."
+
+#: ../../msn/msn_r0.c:194
+msgid "Da war irgendetwas drin,|aber jetzt hast du es|mit runtergeschluckt."
+msgstr "There was something in it, but now you swallowed it."
+
+#: ../../msn/msn_r0.c:202
+msgid "Du hast es doch schon geffnet."
+msgstr "You've already opened it."
+
+#: ../../msn/msn_r0.c:206
+msgid "In dem Ei ist eine Tablette|in einer Plastikhlle."
+msgstr "The egg contains a tablet|in a plastic sleeve."
+
+#: ../../msn/msn_r0.c:214
+msgid "Du iát die Tablette und merkst,|daá sich irgendetwas verndert hat."
+msgstr "You eat the tablet and realize|that something has changed."
+
+#: ../../msn/msn_r0.c:224
+msgid ""
+"Komisch! Auf einmal kannst du die Schrift lesen!|Darauf steht:\"Wenn Sie "
+"diese Schrift jetzt|lesen knnen, hat die Tablette gewirkt.\""
+msgstr ""
+"Funny! Now you can read the inscription! It says, \"If you can read this "
+"text now, the tablet has worked.\""
+
+#: ../../msn/msn_r0.c:232
+msgid "Sie ist leer."
+msgstr "It is empty."
+
+#: ../../msn/msn_r0.c:235
+msgid "Du findest 10 Buckazoids und eine Keycard."
+msgstr "You find 10 buckazoids and a keycard."
+
+#: ../../msn/msn_r0.c:242
+msgid "Es ist eine Art elektronische Zeitung."
+msgstr "This is a kind of electronic newspaper."
+
+#: ../../msn/msn_r0.c:245
+msgid "Halt, hier ist ein interessanter Artikel."
+msgstr "Here, this article looks interesting."
+
+#: ../../msn/msn_r0.c:268
+msgid "Hmm, irgendwie komme|ich mir verarscht vor."
+msgstr ""
+
+#: ../../msn/msn_r0.c:273
+msgid "Es ist die Keycard des Commanders."
+msgstr "This is the keycard of the Commander."
+
+#: ../../msn/msn_r0.c:277
+msgid ""
+"Es ist eine Uhr mit extra|lautem Wecker. Sie hat einen|Knopf zum Verstellen "
+"der Alarmzeit.|Uhrzeit: "
+msgstr ""
+"This is a clock with a very loud alarm. It has a button|for adjusting the "
+"alarm time.|Time: "
+
+#: ../../msn/msn_r0.c:279
+msgid " Alarmzeit: "
+msgstr " Alarm time: "
+
+#: ../../msn/msn_r0.c:291
+msgid "Neue Alarmzeit (hh:mm) :"
+msgstr "New alarm time (hh:mm):"
+
+#: ../../msn/msn_r0.c:332 ../../msn/msn_r1.c:486 ../../msn/msn_r1.c:595
+msgid "Leitung mit Lsterklemme"
+msgstr "Cable with terminal strip"
+
+#: ../../msn/msn_r0.c:344
+msgid "Kabelrolle mit Lsterklemme"
+msgstr "Cable reel with terminal strip"
+
+#: ../../msn/msn_r0.c:355 ../../msn/msn_r1.c:495 ../../msn/msn_r1.c:604
+msgid "Womit denn?"
+msgstr "With what?"
+
+#: ../../msn/msn_r0.c:366 ../../msn/msn_r1.c:499 ../../msn/msn_r1.c:608
+#: ../../msn/msn_r1_r.c:115
+msgid "langes Kabel mit Stecker"
+msgstr "long cable with plug"
+
+#: ../../msn/msn_r0.c:381 ../../msn/msn_r0.c:418 ../../msn/msn_r0.c:454
+msgid "Die Luft hier ist atembar,|du ziehst den Anzug aus."
+msgstr "The air here is breathable,|you take off your suit."
+
+#: ../../msn/msn_r0.c:387 ../../msn/msn_r0.c:424 ../../msn/msn_r0.c:460
+msgid "Hier drinnen brauchtst du deinen Anzug nicht."
+msgstr "Inside you do not need your suit."
+
+#: ../../msn/msn_r0.c:395
+msgid "Du muát erst den Helm abnehmen."
+msgstr "You must take off your helmet first."
+
+#: ../../msn/msn_r0.c:397
+msgid "Du muát erst den Versorgungsteil abnehmen."
+msgstr "You must take off your supply first."
+
+#: ../../msn/msn_r0.c:401
+msgid "Du ziehst den Raumanzug aus."
+msgstr "Your take off your space suit."
+
+#: ../../msn/msn_r0.c:407
+msgid "Du ziehst den Raumanzug an."
+msgstr "You put on your space suit."
+
+#: ../../msn/msn_r0.c:431
+msgid "Den Helm httest du|besser angelassen!"
+msgstr "You should have kept your helmet on!"
+
+#: ../../msn/msn_r0.c:441
+msgid "Du ziehst den Helm auf."
+msgstr "You take off your helmet."
+
+#: ../../msn/msn_r0.c:443 ../../msn/msn_r0.c:479
+msgid "Du muát erst den Anzug anziehen."
+msgstr "You must wear the suit first."
+
+#: ../../msn/msn_r0.c:467
+msgid "Den Versorungsteil httest du|besser nicht abgenommen!"
+msgstr "You should have not taken off your supply!"
+
+#: ../../msn/msn_r0.c:469
+msgid "Du nimmst den Versorgungsteil ab."
+msgstr "You take off your supply."
+
+#: ../../msn/msn_r0.c:477
+msgid "Du ziehst den Versorgungsteil an."
+msgstr "You put on your supply."
+
+#: ../../msn/msn_r0.c:489
+msgid "Die Leitung ist hier unntz."
+msgstr "The cable is useless here."
+
+#: ../../msn/msn_r0.c:492
+msgid ""
+"Stark, das ist ja die Fortsetzung zum \"Anhalter\":|\"Das Restaurant am Ende "
+"des Universums\"."
+msgstr ""
+"Great, this is the sequel to the \"Hitchhiker\":|\"The Restaurant at the End "
+"of the Universe\"."
+
+#: ../../msn/msn_r0.c:495
+msgid ""
+"Moment mal, es ist ein Lesezeichen drin,|auf dem \"Zweiundvierzig\" steht."
+msgstr "Wait a minute, there is a bookmark in it|that says \"Forty-two\"."
+
+#: ../../msn/msn_r0.c:507
+msgid "Du httest besser vorher|den Stecker rausgezogen."
+msgstr "You should have pulled|the plug before."
+
+#: ../../msn/msn_r0.c:567
+msgid "Deine Armbanduhr piepst,|die Alarmzeit ist erreicht."
+msgstr "Your watch beeps,|this is the alarm."
+
+#: ../../msn/msn_r0.c:803 ../../msn/msn_r1_r.c:117
+msgid "Keycard"
+msgstr "keycard"
+
+#: ../../msn/msn_r0.c:803
+msgid "Die Keycard fr deine Schrnke."
+msgstr "The keycard for your locker."
+
+#: ../../msn/msn_r0.c:805
+msgid "Taschenmesser"
+msgstr "pocket knife"
+
+#: ../../msn/msn_r0.c:805
+msgid "Es ist nicht mehr das schrfste."
+msgstr "It is quite blunt."
+
+#: ../../msn/msn_r0.c:807 ../../msn/msn_r3.c:1531
+msgid "Armbanduhr"
+msgstr "watch"
+
+#: ../../msn/msn_r0.c:808 ../../msn/msn_r1_r.c:199
+msgid "Discman"
+msgstr "Discman"
+
+#: ../../msn/msn_r0.c:808 ../../msn/msn_r1_r.c:199
+msgid "Es ist eine \"Mad Monkeys\"-CD darin."
+msgstr "There is a \"Mad Monkeys\" CD in it."
+
+#: ../../msn/msn_r1.c:58
+msgid ""
+"In der Kche warst du schon|oft genug, im Moment hast|du keinen Appetit."
+msgstr "You have been often enough|in the kitchen and you are|no longer hungry."
+
+#. I18N: FORTYTWO
+#: ../../msn/msn_r1.c:91
+msgid "ZWEIUNDVIERZIG"
+msgstr "FORTY-TWO"
+
+#. I18N: Destination reached
+#: ../../msn/msn_r1.c:104
+msgid "Flugziel erreicht"
+msgstr "Destination reached"
+
+#. I18N: Energy depleted
+#: ../../msn/msn_r1.c:110
+msgid "Energie erschpft"
+msgstr "Energy depleted"
+
+#. I18N: Artificial coma interrupted
+#: ../../msn/msn_r1.c:112
+msgid "Tiefschlafprozess abgebrochen"
+msgstr "Artificial coma interrupted"
+
+#: ../../msn/msn_r1.c:120 ../../msn/msn_r1.c:156
+msgid "Bitte legen Sie sich in die angezeigte Schlafkammer."
+msgstr "Please lay down in the indicated stasis pod."
+
+#: ../../msn/msn_r1.c:125
+msgid "Bitte Passwort eingeben:"
+msgstr "Please enter your password:"
+
+#: ../../msn/msn_r1.c:135 ../../msn/msn_r3.c:1175
+msgid "Falsches Passwort"
+msgstr "Password incorrect"
+
+#: ../../msn/msn_r1.c:141
+msgid "Schlafdauer in Tagen:"
+msgstr "Sleep duration in days:"
+
+#: ../../msn/msn_r1.c:172
+msgid ""
+"Es wrde wenig bringen,|sich in eine Schlafkammer zu legen,|die nicht "
+"eingeschaltet ist."
+msgstr ""
+"Going into a stasis pod|that is not switched on|is not going to achieve "
+"anything."
+
+#: ../../msn/msn_r1.c:174
+msgid "Dazu muát du erst den Raumanzug ausziehen."
+msgstr "To do this you have to take off the space suit first."
+
+#: ../../msn/msn_r1.c:248 ../../msn/msn_s.c:210
+msgid "Was war das?"
+msgstr "What was that?"
+
+#: ../../msn/msn_r1.c:266
+msgid "Achtung"
+msgstr "Danger"
+
+#: ../../msn/msn_r1.c:289
+msgid ""
+"Du wachst mit brummendem Schdel auf|und merkst, daá du nur getrumt hast."
+msgstr ""
+"You wake up with a buzzing sensation in your head|and realise that it was "
+"only a dream."
+
+#: ../../msn/msn_r1.c:292
+msgid ""
+"Beim Aufprall des Raumschiffs|muát du mit dem Kopf aufgeschlagen|und "
+"bewuátlos geworden sein."
+msgstr ""
+"During the space ship impact|you must have hit your head|and lost "
+"consciousness."
+
+#: ../../msn/msn_r1.c:295
+msgid "Was steht dir jetzt wohl wirklich bevor?"
+msgstr ""
+
+#: ../../msn/msn_r1.c:307
+msgid "Geschwindigkeit: "
+msgstr "Speed: "
+
+#: ../../msn/msn_r1.c:308
+#, fuzzy
+msgid "8000 hpm"
+msgstr "8000 hpm"
+
+#: ../../msn/msn_r1.c:309
+#, fuzzy
+msgid "0 hpm"
+msgstr "0 hpm"
+
+#: ../../msn/msn_r1.c:310
+msgid "Ziel: Arsano 3"
+msgstr "Destination: Arsano 3"
+
+#: ../../msn/msn_r1.c:311
+msgid "Entfernung: "
+msgstr "Distance: "
+
+#: ../../msn/msn_r1.c:318
+msgid " Lichtjahre"
+msgstr " light years"
+
+#: ../../msn/msn_r1.c:319
+msgid "Dauer der Reise bei momentaner Geschwindigkeit:"
+msgstr "Duration of trip at current speed:"
+
+#: ../../msn/msn_r1.c:321
+msgid " Tage"
+msgstr " days"
+
+#: ../../msn/msn_r1.c:330
+msgid ""
+"Vergiá nicht, du bist nur der|Schiffskoch und hast keine Ahnung,|wie man ein "
+"Raumschiff fliegt."
+msgstr ""
+"Do not forget, you're only the|ship's cook and have no idea|how to fly a "
+"spaceship."
+
+#: ../../msn/msn_r1.c:344
+msgid "Achtung: Triebwerke funktionsunfhig"
+msgstr "Warning: Engine malfunction"
+
+#: ../../msn/msn_r1.c:357
+msgid "Energievorrat erschpft"
+msgstr "Energy supply exhausted"
+
+#: ../../msn/msn_r1.c:358
+msgid "Notstromversorgung aktiv"
+msgstr "Emergency energy supply active"
+
+#: ../../msn/msn_r1.c:447
+msgid "Zu niedriger Luftdruck soll ungesund sein."
+msgstr "Air pressure too low is unhealthy."
+
+#: ../../msn/msn_r1.c:454
+msgid "Er zeigt Null an."
+msgstr "It indicates zero."
+
+#: ../../msn/msn_r1.c:455
+msgid "Er zeigt Normaldruck an."
+msgstr "It indicates normal pressure."
+
+#: ../../msn/msn_r1.c:464
+msgid "Ein Stck Schrott."
+msgstr "Some scrap metal."
+
+#: ../../msn/msn_r1.c:476
+msgid "Du muát erst hingehen."
+msgstr "You must go there first."
+
+#: ../../msn/msn_r1.c:480 ../../msn/msn_r1.c:639 ../../msn/msn_r1.c:728
+msgid "Das Kabel ist im Weg."
+msgstr "The cable is in the way."
+
+#: ../../msn/msn_r1.c:483 ../../msn/msn_r1.c:642 ../../msn/msn_r1.c:698
+msgid "Das Kabel ist schon ganz|richtig an dieser Stelle."
+msgstr "The cable is already in the right place."
+
+#: ../../msn/msn_r1.c:519
+msgid "Die Leitung ist zu kurz."
+msgstr "The line is too short."
+
+#: ../../msn/msn_r1.c:567
+msgid "Es ist nicht spitz genug."
+msgstr "It is not sharp enough."
+
+#: ../../msn/msn_r1.c:570
+msgid "Du wirst aus den Anzeigen nicht schlau."
+msgstr "You cannot make sense of it."
+
+#: ../../msn/msn_r1.c:572
+msgid "Laá lieber die Finger davon!"
+msgstr "You better keep your hands off!"
+
+#: ../../msn/msn_r1.c:591
+msgid "An dem Kabel ist doch gar kein Stecker."
+msgstr "There is no plug on the cable."
+
+#: ../../msn/msn_r1.c:635
+msgid "Du solltest die Luke vielleicht erst ffnen."
+msgstr "You should open the hatch first."
+
+#: ../../msn/msn_r1.c:668
+msgid "Das Seil ist im Weg."
+msgstr "The cable is in the way."
+
+#: ../../msn/msn_r1.c:685
+msgid "Das geht nicht.|Die Luke ist mindestens|5 Meter ber dem Boden."
+msgstr "That will not do.|The hatch is at least|5 meters above the ground."
+
+#: ../../msn/msn_r1.c:694
+msgid "Keycard des Commanders"
+msgstr "Keycard of the Commander"
+
+#: ../../msn/msn_r1.c:766
+#, fuzzy
+msgid "Was ntzt dir der Anschluá|ohne eine Stromquelle?!"
+msgstr "The connection is useless without a power source!"
+
+#: ../../msn/msn_r1.c:770
+msgid "Die Spannung ist auf Null abgesunken."
+msgstr "The voltage has dropped to zero."
+
+#: ../../msn/msn_r1.c:771
+msgid "Es zeigt volle Spannung an."
+msgstr "It displays full voltage."
+
+#: ../../msn/msn_r1.c:782
+msgid "Du muát die Luke erst ffnen."
+msgstr "You must open the hatch first."
+
+#: ../../msn/msn_r1.c:801
+#, fuzzy
+msgid "Das Seil ist hier schon ganz richtig."
+msgstr "The cable is already at the right place."
+
+#: ../../msn/msn_r1.c:806
+msgid "Das Kabel ist zu kurz."
+msgstr "The cable is too short."
+
+#: ../../msn/msn_r1.c:913
+msgid "Du hast die Platte schon aufgelegt."
+msgstr "You already put the record on."
+
+#: ../../msn/msn_r1.c:925
+msgid "Es ist doch gar keine Platte aufgelegt."
+msgstr "You haven't put a record on yet."
+
+#: ../../msn/msn_r1.c:960
+msgid "Die Platte scheint einen Sprung zu haben."
+msgstr "The record seems to be scratched."
+
+#: ../../msn/msn_r1.c:981
+msgid "Schneid doch besser ein|lngeres Stck Kabel ab!"
+msgstr "You should cut a longer|piece of cable!"
+
+#: ../../msn/msn_r1.c:1003
+msgid "Leitung mit Stecker"
+msgstr "Cable with plug"
+
+#: ../../msn/msn_r1.c:1008 ../../msn/msn_r3.c:74
+msgid "Das ist befestigt."
+msgstr "This is fixed."
+
+#: ../../msn/msn_r1.c:1084
+msgid "Du hast jetzt besseres zu tun."
+msgstr "You have better things to do now."
+
+#: ../../msn/msn_r1.c:1086
+msgid "Wenn du unbedingt aufs Klo|willst, spiel doch Larry 1."
+msgstr "If you absolutely want to go|to the loo, play Larry 1."
+
+#: ../../msn/msn_r1.c:1097
+msgid "Was?! Keiner im Cockpit!|Die sind wohl verrckt!"
+msgstr "What?! No one in the cockpit!|They're crazy!"
+
+#: ../../msn/msn_r1.c:1105
+msgid "Komisch, es ist nur|noch ein Raumanzug da."
+msgstr "Funny, there's only|one spacesuit."
+
+#: ../../msn/msn_r1.c:1113
+msgid ""
+"Was ist denn das fr ein Chaos?|Und auáerdem fehlt das Notraumschiff!|Jetzt "
+"wird mir einiges klar.|Die anderen sind geflchtet,|und ich habe es verpennt."
+msgstr ""
+"What is that chaos? And also|the escape ship is missing!|Now I understand. "
+"The others|have escaped, and they left|me behind."
+
+#: ../../msn/msn_r1_r.c:16 ../../msn/msn_r1_r.c:17 ../../msn/msn_r1_r.c:18
+#: ../../msn/msn_r1_r.c:19 ../../msn/msn_r1_r.c:20 ../../msn/msn_r1_r.c:21
+#: ../../msn/msn_r1_r.c:22 ../../msn/msn_r1_r.c:31 ../../msn/msn_r1_r.c:32
+#: ../../msn/msn_r1_r.c:34 ../../msn/msn_r1_r.c:44 ../../msn/msn_r1_r.c:45
+#: ../../msn/msn_r1_r.c:63 ../../msn/msn_r1_r.c:65 ../../msn/msn_r1_r.c:89
+#: ../../msn/msn_r1_r.c:93 ../../msn/msn_r1_r.c:108 ../../msn/msn_r1_r.c:120
+#: ../../msn/msn_r1_r.c:122 ../../msn/msn_r1_r.c:136 ../../msn/msn_r1_r.c:150
+#: ../../msn/msn_r1_r.c:165 ../../msn/msn_r1_r.c:201 ../../msn/msn_r1_r.c:219
+#: ../../msn/msn_r1_r.c:245 ../../msn/msn_r1_r.c:279
+msgid "Luke"
+msgstr "Hatch"
+
+#: ../../msn/msn_r1_r.c:23 ../../msn/msn_r1_r.c:67 ../../msn/msn_r1_r.c:68
+#: ../../msn/msn_r1_r.c:103 ../../msn/msn_r1_r.c:239 ../../msn/msn_r2.c:1256
+#: ../../msn/msn_r2.c:1293 ../../msn/msn_r2.c:1294 ../../msn/msn_r2.c:1295
+#: ../../msn/msn_r2.c:1296 ../../msn/msn_r3.c:1483 ../../msn/msn_r3.c:1681
+#: ../../msn/msn_r3.c:1682
+msgid "Knopf"
+msgstr "Button"
+
+#: ../../msn/msn_r1_r.c:23
+msgid "Er gehrt zu der groáen Luke."
+msgstr "It belongs to the large hatch."
+
+#: ../../msn/msn_r1_r.c:24 ../../msn/msn_r1_r.c:37 ../../msn/msn_r1_r.c:130
+msgid "Leiter"
+msgstr "Ladder"
+
+#: ../../msn/msn_r1_r.c:25 ../../msn/msn_r1_r.c:47 ../../msn/msn_r1_r.c:57
+#: ../../msn/msn_r1_r.c:92 ../../msn/msn_r1_r.c:293 ../../msn/msn_r2.c:1221
+#: ../../msn/msn_r2.c:1223 ../../msn/msn_r2.c:1259 ../../msn/msn_r2.c:1277
+#: ../../msn/msn_r2.c:1292 ../../msn/msn_r3.c:1502 ../../msn/msn_r3.c:1503
+#: ../../msn/msn_r3.c:1510 ../../msn/msn_r3.c:1511 ../../msn/msn_r3.c:1512
+#: ../../msn/msn_r3.c:1519 ../../msn/msn_r3.c:1526 ../../msn/msn_r3.c:1527
+#: ../../msn/msn_r3.c:1539 ../../msn/msn_r3.c:1540 ../../msn/msn_r3.c:1547
+#: ../../msn/msn_r3.c:1548 ../../msn/msn_r3.c:1556 ../../msn/msn_r3.c:1557
+#: ../../msn/msn_r3.c:1565 ../../msn/msn_r3.c:1572 ../../msn/msn_r3.c:1582
+#: ../../msn/msn_r3.c:1583 ../../msn/msn_r3.c:1598 ../../msn/msn_r3.c:1612
+#: ../../msn/msn_r3.c:1683 ../../msn/msn_r3.c:1699
+msgid "Ausgang"
+msgstr "Exit"
+
+#: ../../msn/msn_r1_r.c:31
+msgid "Sie fhrt ins Cockpit."
+msgstr "It leads into the cockpit."
+
+#: ../../msn/msn_r1_r.c:32
+msgid "Sie fhrt zur Kche."
+msgstr "It leads to the kitchen."
+
+#: ../../msn/msn_r1_r.c:34
+msgid "Sie fhrt zu den Tiefschlafkammern."
+msgstr "It leads to the stasis pods."
+
+#: ../../msn/msn_r1_r.c:36 ../../msn/msn_r1_r.c:123 ../../msn/msn_r1_r.c:151
+#: ../../msn/msn_r1_r.c:166 ../../msn/msn_r1_r.c:179 ../../msn/msn_r1_r.c:180
+#: ../../msn/msn_r1_r.c:181 ../../msn/msn_r1_r.c:182 ../../msn/msn_r1_r.c:202
+#: ../../msn/msn_r1_r.c:220 ../../msn/msn_r1_r.c:246 ../../msn/msn_r1_r.c:256
+#: ../../msn/msn_r1_r.c:257 ../../msn/msn_r1_r.c:258 ../../msn/msn_r1_r.c:259
+#: ../../msn/msn_r1_r.c:280 ../../msn/msn_r2.c:1252 ../../msn/msn_r2.c:1298
+#: ../../msn/msn_r3.c:1700
+msgid "Schlitz"
+msgstr "Slot"
+
+#: ../../msn/msn_r1_r.c:36 ../../msn/msn_r1_r.c:123 ../../msn/msn_r1_r.c:151
+#: ../../msn/msn_r1_r.c:166 ../../msn/msn_r1_r.c:179 ../../msn/msn_r1_r.c:180
+#: ../../msn/msn_r1_r.c:181 ../../msn/msn_r1_r.c:182 ../../msn/msn_r1_r.c:202
+#: ../../msn/msn_r1_r.c:220 ../../msn/msn_r1_r.c:246 ../../msn/msn_r1_r.c:256
+#: ../../msn/msn_r1_r.c:257 ../../msn/msn_r1_r.c:258 ../../msn/msn_r1_r.c:259
+#: ../../msn/msn_r1_r.c:280
+msgid "Es ist ein Keycard-Leser."
+msgstr "It is a keycard reader."
+
+#: ../../msn/msn_r1_r.c:38 ../../msn/msn_r3.c:1599
+msgid "Gang"
+msgstr "Corridor"
+
+#: ../../msn/msn_r1_r.c:44 ../../msn/msn_r1_r.c:45
+msgid "Dies ist eine der Tiefschlafkammern."
+msgstr "This is one of the stasis pods."
+
+#: ../../msn/msn_r1_r.c:46 ../../msn/msn_r3.c:1626 ../../msn/msn_r3.c:1638
+#: ../../msn/msn_r3.c:1649 ../../msn/msn_r3.c:1661 ../../msn/msn_r3.c:1672
+msgid "Computer"
+msgstr "Computer"
+
+#: ../../msn/msn_r1_r.c:53 ../../msn/msn_r2.c:1302
+msgid "Instrumente"
+msgstr "Instruments"
+
+#: ../../msn/msn_r1_r.c:53
+msgid "Hmm, sieht ziemlich kompliziert aus."
+msgstr "Hmm, this looks pretty complicated."
+
+#: ../../msn/msn_r1_r.c:55 ../../msn/msn_r1_r.c:56 ../../msn/msn_r1_r.c:105
+msgid "Monitor"
+msgstr "Monitor"
+
+#: ../../msn/msn_r1_r.c:56
+msgid "Dieser Monitor sagt dir nichts."
+msgstr "There is nothing on this monitor."
+
+#: ../../msn/msn_r1_r.c:63
+msgid "Das ist eine Luke !!!"
+msgstr "This is a hatch !!!"
+
+#: ../../msn/msn_r1_r.c:65
+msgid "Dies ist eine Luke !!!"
+msgstr "This is a hatch !!!"
+
+#: ../../msn/msn_r1_r.c:69
+msgid "Helm"
+msgstr "Helmet"
+
+#: ../../msn/msn_r1_r.c:69
+msgid "Es ist der Helm zum Raumanzug."
+msgstr "This is the helmet for the spacesuit."
+
+#: ../../msn/msn_r1_r.c:70
+msgid "Raumanzug"
+msgstr "Spacesuit"
+
+#: ../../msn/msn_r1_r.c:70
+msgid "Der einzige Raumanzug, den die|anderen hiergelassen haben ..."
+msgstr "The only space suit the others have left ..."
+
+#: ../../msn/msn_r1_r.c:72
+#, fuzzy
+msgid "Versorgung"
+msgstr "Supply"
+
+#: ../../msn/msn_r1_r.c:72
+msgid "Es ist der Versorgungsteil zum Raumanzug."
+msgstr "It is the supply for the spacesuit."
+
+#: ../../msn/msn_r1_r.c:74
+msgid "Druckmesser"
+msgstr "Manometer"
+
+#: ../../msn/msn_r1_r.c:81 ../../msn/msn_r1_r.c:84
+msgid "Schrott"
+msgstr "Scrap"
+
+#: ../../msn/msn_r1_r.c:81
+msgid ""
+"Da ist eine Lsterklemme dran, die|noch ganz brauchbar aussieht.|Ich nehme "
+"sie mit."
+msgstr ""
+"There is a terminal strip on it|that looks quite useful.|I will take it with "
+"me."
+
+#: ../../msn/msn_r1_r.c:83
+msgid "Lsterklemme"
+msgstr "Terminal strip"
+
+#: ../../msn/msn_r1_r.c:84
+#, fuzzy
+msgid ""
+"Junge, Junge! Die Explosion hat ein|ganz schnes Durcheinander angerichtet."
+msgstr "Boy, oh boy! The explosion wreaked|quite some havoc."
+
+#: ../../msn/msn_r1_r.c:86
+msgid "Reaktor"
+msgstr "Reactor"
+
+#: ../../msn/msn_r1_r.c:86
+msgid "Das war einmal der Reaktor."
+msgstr "This was a reactor once."
+
+#: ../../msn/msn_r1_r.c:87
+msgid "Dse"
+msgstr ""
+
+#: ../../msn/msn_r1_r.c:88
+msgid "blauer Krbis"
+msgstr "blue pumpkin"
+
+#: ../../msn/msn_r1_r.c:88
+msgid "Keine Ahnung, was das ist."
+msgstr "No idea what this is."
+
+#: ../../msn/msn_r1_r.c:90
+msgid "Landefhre"
+msgstr "Landing module"
+
+#: ../../msn/msn_r1_r.c:90
+#, fuzzy
+msgid "Sie war eigentlich fr Bodenuntersuchungen|auf Arsano 3 gedacht."
+msgstr "It was supposed to be used for soil|investigation on Arsano 3."
+
+#: ../../msn/msn_r1_r.c:93 ../../msn/msn_r1_r.c:120
+msgid "Sie fhrt nach drauáen."
+msgstr "It leads outside."
+
+#: ../../msn/msn_r1_r.c:95
+msgid "Generator"
+msgstr "Generator"
+
+#: ../../msn/msn_r1_r.c:95
+msgid "Er versorgt das Raumschiff mit Strom."
+msgstr "It supplies power to the spaceship."
+
+#: ../../msn/msn_r1_r.c:102 ../../msn/msn_r1_r.c:154 ../../msn/msn_r1_r.c:169
+#: ../../msn/msn_r1_r.c:205 ../../msn/msn_r1_r.c:223 ../../msn/msn_r1_r.c:249
+#: ../../msn/msn_r1_r.c:283 ../../msn/msn_r3.c:1490
+msgid "Steckdose"
+msgstr "Socket"
+
+#: ../../msn/msn_r1_r.c:103
+msgid ""
+"Es ist ein Sicherheitsknopf.|Er kann nur mit einem spitzen|Gegenstand "
+"gedrckt werden."
+msgstr "It's a safety button.|It can only be pressed|with a pointed object."
+
+#: ../../msn/msn_r1_r.c:106 ../../msn/msn_r2.c:1300
+msgid "Tastatur"
+msgstr "Keyboard"
+
+#: ../../msn/msn_r1_r.c:116
+msgid "leere Kabelrolle"
+msgstr "Empty cable reel"
+
+#: ../../msn/msn_r1_r.c:117
+msgid ""
+"Hey, das ist die Keycard des Commanders!|Er muá sie bei dem berstrzten|"
+"Aufbruch verloren haben."
+msgstr ""
+"Hey, that's the commander's keycard!|He must have lost it in the "
+"rushed|departure."
+
+#: ../../msn/msn_r1_r.c:119 ../../msn/msn_r1_r.c:137 ../../msn/msn_r1_r.c:188
+#: ../../msn/msn_r2.c:1212
+msgid "Seil"
+msgstr "Rope"
+
+#: ../../msn/msn_r1_r.c:124
+msgid "Klappe"
+msgstr "Hatch"
+
+#: ../../msn/msn_r1_r.c:125 ../../msn/msn_r1_r.c:128 ../../msn/msn_r1_r.c:242
+#: ../../msn/msn_r1_r.c:243 ../../msn/msn_r3.c:1489
+msgid "Leitung"
+msgstr "Cable"
+
+#: ../../msn/msn_r1_r.c:126
+msgid "Spannungmessgert"
+msgstr "Voltmeter"
+
+#: ../../msn/msn_r1_r.c:127
+msgid "Klemme"
+msgstr "Clamp"
+
+#: ../../msn/msn_r1_r.c:128
+msgid "Sie fhrt vom Generator zum Spannungmessgert."
+msgstr "It goes from the generator to the voltage meter."
+
+#: ../../msn/msn_r1_r.c:143 ../../msn/msn_r1_r.c:212 ../../msn/msn_r1_r.c:213
+#: ../../msn/msn_r1_r.c:214 ../../msn/msn_r1_r.c:217 ../../msn/msn_r3.c:1603
+#: ../../msn/msn_r3.c:1618 ../../msn/msn_r3.c:1640 ../../msn/msn_r3.c:1650
+#: ../../msn/msn_r3.c:1651
+msgid "Bild"
+msgstr "Image"
+
+#: ../../msn/msn_r1_r.c:143
+msgid "Manche Leute haben schon|einen komischen Geschmack."
+msgstr "Some people have funny tastes."
+
+#: ../../msn/msn_r1_r.c:145
+msgid "Zeichengerte"
+msgstr "Drawing instruments"
+
+#: ../../msn/msn_r1_r.c:146
+msgid ""
+"Auf dem Zettel sind lauter|unverstndliche Skizzen und Berechnungen.|"
+"(Jedenfalls fr dich unverstndlich.)"
+msgstr ""
+"There are incomprehensible sketches|and calculations on that note.|(In any "
+"case, it's incomprehensible to you.)"
+
+#: ../../msn/msn_r1_r.c:148 ../../msn/msn_r1_r.c:215 ../../msn/msn_r1_r.c:233
+#: ../../msn/msn_r1_r.c:276
+msgid "Magnete"
+msgstr "Magnets"
+
+#: ../../msn/msn_r1_r.c:148 ../../msn/msn_r1_r.c:215 ../../msn/msn_r1_r.c:233
+#: ../../msn/msn_r1_r.c:276
+#, fuzzy
+msgid "Damit werden Sachen auf|dem Tisch festgehalten."
+msgstr "This keeps things|on the board."
+
+#: ../../msn/msn_r1_r.c:152 ../../msn/msn_r1_r.c:167 ../../msn/msn_r1_r.c:190
+#: ../../msn/msn_r1_r.c:203 ../../msn/msn_r1_r.c:221 ../../msn/msn_r1_r.c:247
+#: ../../msn/msn_r1_r.c:260 ../../msn/msn_r1_r.c:281
+msgid "Schrank"
+msgstr "Cabinet"
+
+#: ../../msn/msn_r1_r.c:153 ../../msn/msn_r1_r.c:168 ../../msn/msn_r1_r.c:183
+#: ../../msn/msn_r1_r.c:186 ../../msn/msn_r1_r.c:195 ../../msn/msn_r1_r.c:204
+#: ../../msn/msn_r1_r.c:222 ../../msn/msn_r1_r.c:248 ../../msn/msn_r1_r.c:262
+#: ../../msn/msn_r1_r.c:264 ../../msn/msn_r1_r.c:267 ../../msn/msn_r1_r.c:282
+#: ../../msn/msn_r2.c:1299
+#, fuzzy
+msgid "Fach"
+msgstr "Compartment"
+
+#: ../../msn/msn_r1_r.c:155 ../../msn/msn_r1_r.c:170 ../../msn/msn_r1_r.c:206
+#: ../../msn/msn_r1_r.c:224 ../../msn/msn_r1_r.c:250 ../../msn/msn_r1_r.c:278
+#: ../../msn/msn_r2.c:1254
+msgid "Toilette"
+msgstr "Toilet"
+
+#: ../../msn/msn_r1_r.c:161 ../../msn/msn_r1_r.c:176 ../../msn/msn_r2.c:1283
+msgid "Schachspiel"
+msgstr "Game of chess"
+
+#: ../../msn/msn_r1_r.c:161
+#, fuzzy
+msgid "Es macht wohl Spaá, an|der Decke Schach zu spielen."
+msgstr "I guess it's fun to play|chess on the ceiling."
+
+#: ../../msn/msn_r1_r.c:163
+msgid "Tennisschlger"
+msgstr "Tennis racquets"
+
+#: ../../msn/msn_r1_r.c:163
+#, fuzzy
+msgid "Fliegt Boris Becker auch mit?"
+msgstr "Is Boris Becker part of the crew?"
+
+#: ../../msn/msn_r1_r.c:164
+msgid "Tennisball"
+msgstr "Tennis ball"
+
+#: ../../msn/msn_r1_r.c:164 ../../msn/msn_r1_r.c:213
+msgid "Toll!"
+msgstr "Awesome!"
+
+#: ../../msn/msn_r1_r.c:176
+msgid "Dein Magnetschachspiel. Schach war|schon immer deine Leidenschaft."
+msgstr "Your magnetic chess game. Chess|has always been your passion."
+
+#: ../../msn/msn_r1_r.c:178
+msgid "Bett"
+msgstr "Bed"
+
+#: ../../msn/msn_r1_r.c:178
+msgid "Das ist dein Bett. Toll, nicht wahr?"
+msgstr "This is your bed. Great, isn't it?"
+
+#: ../../msn/msn_r1_r.c:183 ../../msn/msn_r1_r.c:186 ../../msn/msn_r1_r.c:195
+#, fuzzy
+msgid "Das ist eins deiner drei Fcher."
+msgstr "It's one of your three compartments."
+
+#: ../../msn/msn_r1_r.c:185
+msgid "Alben"
+msgstr "Albums"
+
+#: ../../msn/msn_r1_r.c:185
+msgid "Deine Briefmarkensammlung."
+msgstr "Your stamp collection."
+
+#: ../../msn/msn_r1_r.c:188
+msgid "Es ist ungefhr 10 m lang und 4 cm dick."
+msgstr "It is about 10 m long and 4 cm thick."
+
+#: ../../msn/msn_r1_r.c:190
+msgid "Das ist dein Schrank."
+msgstr "This is your cabinet."
+
+#: ../../msn/msn_r1_r.c:191 ../../msn/msn_r1_r.c:274 ../../msn/msn_r1_r.c:275
+#, fuzzy
+msgid "Krimskram"
+msgstr "Junk"
+
+#: ../../msn/msn_r1_r.c:191 ../../msn/msn_r1_r.c:274 ../../msn/msn_r1_r.c:275
+#, fuzzy
+msgid "Es ist nichts brauchbares dabei."
+msgstr "There is nothing useful in there."
+
+#: ../../msn/msn_r1_r.c:192 ../../msn/msn_r1_r.c:273
+msgid "Kleider"
+msgstr "Clothes"
+
+#: ../../msn/msn_r1_r.c:192
+msgid "Es sind Standard-Weltraum-Klamotten."
+msgstr "They are standard space gear."
+
+#: ../../msn/msn_r1_r.c:193 ../../msn/msn_r1_r.c:269 ../../msn/msn_r1_r.c:271
+msgid "Unterwsche"
+msgstr "Underwear"
+
+#: ../../msn/msn_r1_r.c:194
+#, fuzzy
+msgid "Strmpfe"
+msgstr "Socks"
+
+#: ../../msn/msn_r1_r.c:197 ../../msn/msn_r1_r.c:268
+msgid "Buch"
+msgstr "Book"
+
+#: ../../msn/msn_r1_r.c:197
+msgid "Es ist|\"Per Anhalter durch die Galaxis\"|von Douglas Adams."
+msgstr "This is|\"The Hitchhiker's Guide to the Galaxy\"|by Douglas Adams."
+
+#: ../../msn/msn_r1_r.c:212
+#, fuzzy
+msgid "Herb!"
+msgstr "Austere!"
+
+#: ../../msn/msn_r1_r.c:214
+msgid "Genial!"
+msgstr "Brilliant!"
+
+#: ../../msn/msn_r1_r.c:217
+msgid "Es scheint noch nicht fertig zu sein."
+msgstr "It doesn't seem ready yet."
+
+#: ../../msn/msn_r1_r.c:218
+msgid "Stift"
+msgstr "Pen"
+
+#: ../../msn/msn_r1_r.c:218
+msgid "Ein Kugelschreiber."
+msgstr "A ballpoint pen."
+
+#: ../../msn/msn_r1_r.c:230 ../../msn/msn_r1_r.c:231
+msgid "Poster"
+msgstr "Poster"
+
+#: ../../msn/msn_r1_r.c:230
+#, fuzzy
+msgid "Ein Poster von \"Big Boss\"."
+msgstr "A poster from \"Big Boss\""
+
+#: ../../msn/msn_r1_r.c:231
+#, fuzzy
+msgid "Ein Poster von \"Rock Desaster\"."
+msgstr "A poster for \"Rock Disaster\"."
+
+#: ../../msn/msn_r1_r.c:232
+#, fuzzy
+msgid "Box"
+msgstr "Speaker"
+
+#: ../../msn/msn_r1_r.c:235
+msgid "Schallplatte"
+msgstr "Record"
+
+#: ../../msn/msn_r1_r.c:235
+#, fuzzy
+msgid "Die Platte ist von \"Big Boss\"."
+msgstr "This record is from \"Big Boss\"."
+
+#: ../../msn/msn_r1_r.c:237
+msgid "Schallplattenstnder"
+msgstr "Record stand"
+
+#: ../../msn/msn_r1_r.c:237
+msgid "Du hast jetzt keine Zeit, in|der Plattensammlung rumzustbern."
+msgstr "You don't have time to rummage|around the record collection now."
+
+#: ../../msn/msn_r1_r.c:240
+msgid "Plattenspieler"
+msgstr "Record player"
+
+#: ../../msn/msn_r1_r.c:240
+msgid "Sieht aus, als kme|er aus dem Museum."
+msgstr "Looks like something from a museum."
+
+#: ../../msn/msn_r1_r.c:244
+#, fuzzy
+msgid "Stecker"
+msgstr "Male plug"
+
+#: ../../msn/msn_r1_r.c:261
+msgid "Pistole"
+msgstr "Gun"
+
+#: ../../msn/msn_r1_r.c:261
+msgid "Es ist keine Munition drin."
+msgstr "There is no ammunition in it."
+
+#: ../../msn/msn_r1_r.c:263
+msgid "Bcher"
+msgstr "Books"
+
+#: ../../msn/msn_r1_r.c:263
+msgid "Lauter wissenschaftliche Bcher."
+msgstr "All scientific books."
+
+#: ../../msn/msn_r1_r.c:265
+msgid "Kabelrolle"
+msgstr "Cable reel"
+
+#: ../../msn/msn_r1_r.c:265
+msgid "Da sind mindestens zwanzig Meter drauf."
+msgstr "There is at least 20 meters of cable on it."
+
+#: ../../msn/msn_r1_r.c:269 ../../msn/msn_r1_r.c:271
+msgid "Ich habe keine Lust, in|der Unterwsche des|Commanders rumzuwhlen."
+msgstr "I don't feel like digging around|in the commander's underwear."
+
+#: ../../msn/msn_r1_r.c:284
+msgid "Ordner"
+msgstr "Folders"
+
+#: ../../msn/msn_r1_r.c:284
+msgid ""
+"Darauf steht \"Dienstanweisungen|zur Mission Supernova\".|Es steht nichts "
+"wichtiges drin."
+msgstr ""
+"It says,\"Instructions for the Mission Supernova.\"|There is nothing "
+"important in it."
+
+#: ../../msn/msn_r1_r.c:291
+msgid "Klo"
+msgstr "Loo"
+
+#: ../../msn/msn_r1_r.c:291
+#, fuzzy
+msgid "Ein Klo mit Saugmechanismus."
+msgstr "A toilet with suction mechanism."
+
+#: ../../msn/msn_r1_r.c:292
+msgid "Dusche"
+msgstr "Shower"
+
+#: ../../msn/msn_r2.c:57
+#, fuzzy
+msgid "Die Raumschiffe sind alle verschlossen."
+msgstr "The spaceships are all locked."
+
+#: ../../msn/msn_r2.c:64 ../../msn/msn_r2.c:1098
+msgid "Unsinn!"
+msgstr "Nonsense!"
+
+#: ../../msn/msn_r2.c:91
+msgid ""
+"Komisch! Auf einmal kannst du|das Schild lesen! Darauf steht:|\"Treffpunkt "
+"Galactica\"."
+msgstr "Funny! You can read the sign now! It says \"Galactica meeting point\"."
+
+#: ../../msn/msn_r2.c:92
+msgid "Darauf steht:|\"Treffpunkt Galactica\"."
+msgstr "It says:|\"Galactica meeting point\"."
+
+#: ../../msn/msn_r2.c:144
+#, fuzzy
+msgid "Wieso das denn nicht?"
+msgstr "Why the hell not?"
+
+#: ../../msn/msn_r2.c:145 ../../msn/msn_r2.c:154 ../../msn/msn_r2.c:1082
+msgid "Wo bin ich hier?"
+msgstr "Where am I here?"
+
+#: ../../msn/msn_r2.c:146 ../../msn/msn_r2.c:183
+msgid "Wo soll ich die Schuhe ablegen?"
+msgstr "Where should I put my shoes?"
+
+#: ../../msn/msn_r2.c:147
+msgid "Schwachsinn! Ich gehe jetzt nach oben!"
+msgstr "Bullshit! I'm going upstairs now!"
+
+#: ../../msn/msn_r2.c:155
+msgid "Schnes Wetter heute, nicht wahr?"
+msgstr "Nice weather today, isn't it?"
+
+#: ../../msn/msn_r2.c:156
+msgid "Wrden Sie mich bitte durchlassen."
+msgstr "Would you please let me through?"
+
+#: ../../msn/msn_r2.c:157
+msgid "Hey Alter, laá mich durch!"
+msgstr "Hey, dude, let me through!"
+
+#: ../../msn/msn_r2.c:164
+msgid "Was haben Sie gesagt?"
+msgstr "What did you say?"
+
+#: ../../msn/msn_r2.c:165
+msgid "Sprechen Sie bitte etwas deutlicher!"
+msgstr "Please speak more clearly!"
+
+#: ../../msn/msn_r2.c:174
+msgid "Durch deinen Helm kannst|du nicht sprechen."
+msgstr "You can't talk with your helmet on."
+
+#: ../../msn/msn_r2.c:189 ../../msn/msn_r2.c:251
+msgid "Was, das wissen Sie nicht?"
+msgstr "What, you don't know that?"
+
+#: ../../msn/msn_r2.c:190 ../../msn/msn_r2.c:252
+msgid "Sie befinden sich im Restaurant|\"Treffpunkt Galactica\"."
+msgstr "You are in the restaurant|\"Galactica meeting point\"."
+
+#: ../../msn/msn_r2.c:191 ../../msn/msn_r2.c:253
+msgid ""
+"Wir sind bei den interessantesten|Ereignissen in der Galaxis|immer zur "
+"Stelle."
+msgstr ""
+
+#: ../../msn/msn_r2.c:194
+msgid "Wenn Sie meinen."
+msgstr ""
+
+#: ../../msn/msn_r2.c:199 ../../msn/msn_r2.c:256
+msgid "In der Toilette gibt es|Schlieáfcher fr Schuhe."
+msgstr ""
+
+#: ../../msn/msn_r2.c:204
+msgid ""
+"Wenn Sie das Lokal betreten|wollen, mssen Sie erst|ihre Schuhe ausziehen."
+msgstr ""
+
+#: ../../msn/msn_r2.c:208
+msgid "Wollen Sie, daá ich Sie rauáschmeiáe?"
+msgstr ""
+
+#: ../../msn/msn_r2.c:216 ../../msn/msn_r2.c:274
+msgid "Hhius otgfh Dgfdrkjlh Fokj gf."
+msgstr ""
+
+#: ../../msn/msn_r2.c:230 ../../msn/msn_s.c:289
+msgid "Halt!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:232
+msgid "Uhwdejkt!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:241
+msgid "Sie mssen erst ihre Schuhe ausziehen, Sie Trottel!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:243
+msgid ""
+"Was fllt ihnen ein!|Sie knnen doch ein Lokal|nicht mit Schuhen betreten!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:249
+msgid "Fragen Sie nicht so doof!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:262
+msgid "Das wrde ich an ihrer|Stelle nicht versuchen!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:300
+msgid "Du ziehst deine Schuhe|aus und legst sie in|eins der Schlieáfcher."
+msgstr ""
+
+#: ../../msn/msn_r2.c:307
+msgid "Du ziehst deine Schuhe wieder an."
+msgstr ""
+
+#: ../../msn/msn_r2.c:311
+msgid ""
+"Du durchsuchst die Klos nach|anderen brauchbaren Sachen,|findest aber nichts."
+msgstr ""
+
+#: ../../msn/msn_r2.c:316
+msgid "Bevor du aufs Klo gehst,|solltest du besser deinen|Raumanzug ausziehen."
+msgstr ""
+
+#: ../../msn/msn_r2.c:319
+msgid "Du gehst seit sieben Jahren das|erste Mal wieder aufs Klo!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:322
+msgid ""
+"In einem der Schlieáfcher,|die sich auch im Raum befinden,|findest du "
+"einige Mnzen."
+msgstr ""
+
+#: ../../msn/msn_r2.c:332
+msgid "Mach doch zuerst das Fach leer!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:340
+msgid "Mnze"
+msgstr ""
+
+#: ../../msn/msn_r2.c:353
+msgid ""
+"Komisch! Auf einmal kannst du|das Schild lesen! Darauf steht:|\"Zutritt nur "
+"fr Personal\"."
+msgstr ""
+
+#: ../../msn/msn_r2.c:361
+msgid ""
+"Komisch! Auf einmal kannst|du das Schild lesen!|Darauf steht:\"Toilette\"."
+msgstr ""
+
+#: ../../msn/msn_r2.c:362
+msgid "Darauf steht:|\"Toilette\"."
+msgstr ""
+
+#: ../../msn/msn_r2.c:372
+msgid "Du ziehst den Raumanzug wieder an."
+msgstr ""
+
+#: ../../msn/msn_r2.c:382 ../../msn/msn_r3.c:488 ../../msn/msn_r3.c:540
+msgid "Nicht so gewaltttig!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:603
+msgid ""
+"Du hast das komische Gefhl,|daá drauáen etwas passiert,|und eilst zum "
+"Restaurant."
+msgstr ""
+
+#: ../../msn/msn_r2.c:617
+msgid "Da! Die Supernova!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:630
+msgid "Zwei Minuten spter ..."
+msgstr ""
+
+#: ../../msn/msn_r2.c:638
+msgid "Hey, was machen Sie in meinem Raumschiff?!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:641
+msgid "Geben Sie mir sofort meine Brieftasche wieder!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:644
+msgid "Versuchen Sie das ja nicht nochmal!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:647
+msgid "Und jetzt raus mit Ihnen!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:660
+msgid "Zehn Minuten spter ..."
+msgstr ""
+
+#: ../../msn/msn_r2.c:690
+msgid "Knnten Sie mir ein Gericht empfehlen?"
+msgstr ""
+
+#: ../../msn/msn_r2.c:691
+msgid "Wie lange dauert es denn noch bis zur Supernova?"
+msgstr ""
+
+#: ../../msn/msn_r2.c:692
+msgid "Sie kommen mir irgendwie bekannt vor."
+msgstr ""
+
+#: ../../msn/msn_r2.c:704
+msgid "Hey, Witzkeks, laá die Brieftasche da liegen!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:708
+msgid "Das ist nicht deine."
+msgstr ""
+
+#: ../../msn/msn_r2.c:713
+msgid "Roger ist im Moment nicht ansprechbar."
+msgstr ""
+
+#: ../../msn/msn_r2.c:718
+msgid "Bestellen Sie lieber nichts!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:719
+msgid ""
+"Ich habe vor zwei Stunden mein Essen|bestellt und immer noch nichts bekommen."
+msgstr ""
+
+#: ../../msn/msn_r2.c:721
+msgid "Noch mindestens zwei Stunden."
+msgstr ""
+
+#: ../../msn/msn_r2.c:722
+msgid ""
+"Haben Sie keine Idee, womit wir uns|bis dahin die Zeit vertreiben knnen?"
+msgstr ""
+
+#: ../../msn/msn_r2.c:723
+msgid ""
+"Hmm ... im Moment fllt mir nichts ein, aber vielleicht|hat der Spieler des "
+"Adventures ja eine Idee."
+msgstr ""
+
+#: ../../msn/msn_r2.c:725
+msgid "Nein, Sie mssen sich irren.|Ich kenne Sie jedenfalls nicht."
+msgstr ""
+
+#: ../../msn/msn_r2.c:726
+msgid "Aber ihre Kleidung habe ich irgendwo schon mal gesehen."
+msgstr ""
+
+#: ../../msn/msn_r2.c:727
+msgid "Ja? Komisch."
+msgstr ""
+
+#: ../../msn/msn_r2.c:728
+msgid "Jetzt weiá ich's. Sie sind Roger W. !"
+msgstr ""
+
+#: ../../msn/msn_r2.c:729
+msgid "Pssst, nicht so laut, sonst will|gleich jeder ein Autogramm von mir."
+msgstr ""
+
+#: ../../msn/msn_r2.c:730
+msgid ""
+"Ich habe extra eine Maske auf, damit|ich nicht von jedem angelabert werde."
+msgstr ""
+
+#: ../../msn/msn_r2.c:731
+msgid "h ... ach so."
+msgstr ""
+
+#: ../../msn/msn_r2.c:732
+msgid "Wann kommt denn das nchste SQ-Abenteuer raus?"
+msgstr ""
+
+#: ../../msn/msn_r2.c:733
+msgid "SQ 127 máte in einem Monat erscheinen."
+msgstr ""
+
+#: ../../msn/msn_r2.c:734
+msgid "Was, Teil 127 ??"
+msgstr ""
+
+#: ../../msn/msn_r2.c:735
+msgid "Bei uns ist gerade Teil 8 erschienen."
+msgstr ""
+
+#: ../../msn/msn_r2.c:736
+msgid "Hmm ... von welchem Planeten sind Sie denn?"
+msgstr ""
+
+#: ../../msn/msn_r2.c:737
+msgid "Von der Erde."
+msgstr ""
+
+#: ../../msn/msn_r2.c:738
+msgid "Erde? Nie gehrt."
+msgstr ""
+
+#: ../../msn/msn_r2.c:739
+msgid ""
+"Wahrscheinlich irgendein Kaff, wo Neuerungen|erst hundert Jahre spter "
+"hingelangen."
+msgstr ""
+
+#: ../../msn/msn_r2.c:740
+msgid "h ... kann sein."
+msgstr ""
+
+#: ../../msn/msn_r2.c:741
+msgid "Aber eins mssen Sie mir erklren!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:742
+msgid ""
+"Wieso sehen Sie mir so verdammt hnlich, wenn|Sie nicht von Xenon stammen, "
+"wie ich?"
+msgstr ""
+
+#: ../../msn/msn_r2.c:743
+msgid ""
+"Keine Ahnung. Bis jetzt dachte ich immer, Sie wren ein|von Programmierern "
+"auf der Erde erfundenes Computersprite."
+msgstr ""
+
+#: ../../msn/msn_r2.c:744
+msgid "Was? Lachhaft!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:745
+msgid "Wie erklren Sie sich dann,|daá ich ihnen gegenbersitze?"
+msgstr ""
+
+#: ../../msn/msn_r2.c:746
+msgid "Ja, das ist in der Tat seltsam."
+msgstr ""
+
+#: ../../msn/msn_r2.c:747
+msgid ""
+"Halt, jetzt weiá ich es. Sie sind von der Konkurrenz,|von \"Georgefilm Games"
+"\" und wollen mich verunsichern."
+msgstr ""
+
+#: ../../msn/msn_r2.c:748
+msgid "Nein, ich bin nur ein Ahnungsloser Koch von der Erde."
+msgstr ""
+
+#: ../../msn/msn_r2.c:749
+msgid ""
+"Na gut, ich glaube Ihnen. Lassen wir jetzt|dieses Thema, langsam wird es mir "
+"zu bunt!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:761
+msgid "Eine Partie Schach! Das ist eine gute Idee."
+msgstr ""
+
+#: ../../msn/msn_r2.c:762
+msgid "Schach? Was ist das denn?"
+msgstr ""
+
+#: ../../msn/msn_r2.c:763
+msgid "Schach ist ein interessantes Spiel.|Ich werde es Ihnen erklren."
+msgstr ""
+
+#: ../../msn/msn_r2.c:769
+msgid "Knapp zwei Stunden spter ..."
+msgstr ""
+
+#: ../../msn/msn_r2.c:787
+msgid "Roger W. steht kurz vor dem Schachmatt|und grbelt nach einem Ausweg."
+msgstr ""
+
+#: ../../msn/msn_r2.c:831
+msgid "Darf ich hier Platz nehmen?"
+msgstr ""
+
+#: ../../msn/msn_r2.c:832
+msgid "Klar!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:892
+msgid "Du tippst auf den Tasten herum,|aber es passiert nichts."
+msgstr ""
+
+#: ../../msn/msn_r2.c:917
+msgid "Ach, Ihnen gehrt die. Ich habe sie eben im Sand gefunden."
+msgstr ""
+
+#: ../../msn/msn_r2.c:918
+msgid "Nein, tut mir leid."
+msgstr ""
+
+#: ../../msn/msn_r2.c:924
+msgid "Nein, danke. Ich bleibe lieber hier."
+msgstr ""
+
+#: ../../msn/msn_r2.c:925
+msgid "Ja, das wre gut."
+msgstr ""
+
+#: ../../msn/msn_r2.c:931
+msgid "Zur Erde."
+msgstr ""
+
+#: ../../msn/msn_r2.c:932
+msgid "Zum Prsident der Galaxis."
+msgstr ""
+
+#: ../../msn/msn_r2.c:933
+msgid "Nach Xenon."
+msgstr ""
+
+#: ../../msn/msn_r2.c:934
+msgid "Mir egal, setzen Sie mich irgendwo ab!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:940
+msgid "Ich habe gerade Ihre Brieftasche gefunden!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:941
+msgid "Sie lag da drben hinter einem Felsen."
+msgstr ""
+
+#: ../../msn/msn_r2.c:942
+msgid "Ich wollte nur wissen, ob Sie die Brieftasche wiederhaben."
+msgstr ""
+
+#: ../../msn/msn_r2.c:959
+msgid "Was wollen Sie denn schon wieder?"
+msgstr ""
+
+#: ../../msn/msn_r2.c:965
+msgid ""
+"Haben Sie zufllig meine Brieftasche gesehen?|Ich muá Sie irgendwo verloren "
+"haben."
+msgstr ""
+
+#: ../../msn/msn_r2.c:966
+msgid ""
+"Ohne die Brieftasche kann ich nicht|starten, weil meine Keycard darin ist."
+msgstr ""
+
+#: ../../msn/msn_r2.c:975
+msgid "Oh! Vielen Dank."
+msgstr ""
+
+#: ../../msn/msn_r2.c:976
+msgid "Wo ist denn Ihr Raumschiff?|Soll ich Sie ein Stck mitnehmen?"
+msgstr ""
+
+#: ../../msn/msn_r2.c:979
+msgid "Wo wollen Sie denn hin?"
+msgstr ""
+
+#: ../../msn/msn_r2.c:981
+msgid "Ok, steigen Sie ein!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:983
+msgid "Wie Sie wollen."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1030
+msgid "Huch, du lebst ja noch!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1057
+msgid ""
+"Das wrde ich jetzt nicht tun, schlieálich|steht Roger W. neben seinem "
+"Schiff."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1069
+msgid "Alle Raumschiffe haben|den Planeten verlassen."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1071
+msgid "Alle Raumschiffe haben den Planeten|verlassen, bis auf eins ..."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1083
+msgid "Was wollen Sie von mir?"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1084
+msgid "Hilfe!!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1085
+msgid "Warum sprechen Sie meine Sprache?"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1091
+msgid "Ja, ich bin einverstanden."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1092
+msgid "Nein, lieber bleibe ich hier, als mit Ihnen zu fliegen."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1141
+msgid "Ich glaube, er wacht auf."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1143
+msgid "Ja, sieht so aus."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1148
+msgid "Sie befinden sich im Raumschiff \"Dexxa\"."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1149
+msgid ""
+"Wir kommen vom Planeten Axacuss und|sind aus dem gleichen Grund hier wie "
+"Sie,|nmlich zur Erforschung der Supernova."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1151
+msgid "Sie knnen beruhigt sein, wir wollen Ihnen nur helfen."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1152
+msgid "Und wieso hat der Typ im Raumanzug|eben auf mich geschossen?"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1153
+msgid "Das war eine Schreckreaktion."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1154
+msgid ""
+"Schlieálich ist es fr uns das erste Mal,|daá wir auf eine fremde "
+"Intelligenz treffen."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1155
+msgid "Wie wir festgestellt haben, ist|Ihr Raumschiff vllig zerstrt."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1156
+msgid "Wahrscheinlich knnen Sie nicht|mehr auf ihren Heimatplaneten zurck."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1157
+msgid "Wir bieten Ihnen an, Sie|mit nach Axacuss zu nehmen."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1160 ../../msn/msn_r2.c:1169
+msgid "Sind Sie sich da wirklich sicher?"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1161 ../../msn/msn_r2.c:1170
+msgid "Wenn ich es mir genau berlege,|fliege ich doch lieber mit."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1163
+msgid ""
+"Gut, wir nehmen Sie unter der|Bedingung mit, daá wir Sie jetzt|sofort in "
+"Tiefschlaf versetzen drfen."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1164
+msgid "Diese Art des Reisens ist Ihnen|ja scheinbar nicht unbekannt."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1165
+msgid ""
+"Sie werden in vier Jahren nach der|Landung der \"Dexxa\" wieder aufgeweckt."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1166
+msgid "Sind Sie damit einverstanden?"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1172
+msgid "Gut, haben Sie noch irgendwelche Fragen?"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1174
+msgid "Keine Panik!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1175
+msgid "Wir tun Ihnen nichts."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1177
+msgid "Wir sprechen nicht ihre Sprache,|sondern Sie sprechen unsere."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1178
+msgid ""
+"Nach einer Gehirnanalyse konnten|wir Ihr Gehirn an unsere Sprache anpassen."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1179
+msgid "Was? Sie haben in mein Gehirn eingegriffen?"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1180
+msgid "Keine Angst, wir haben sonst nichts verndert."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1181
+msgid "Ohne diesen Eingriff wren|Sie verloren gewesen."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1186
+msgid "Ich habe keine weiteren Fragen mehr."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1187
+msgid "Gut, dann versetzen wir Sie jetzt in Tiefschlaf."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1188
+msgid "Gute Nacht!"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1213 ../../msn/msn_r2.c:1214
+msgid "Stein"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1215
+msgid "Loch"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1215
+msgid "Es scheint eine Hhle zu sein."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1221
+msgid "Hier bist du gerade hergekommen."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1229 ../../msn/msn_r2.c:1310 ../../msn/msn_r2.c:1319
+msgid "Hhle"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1230 ../../msn/msn_r2.c:1243 ../../msn/msn_r2.c:1257
+#: ../../msn/msn_r3.c:1691
+msgid "Schild"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1230 ../../msn/msn_r2.c:1243 ../../msn/msn_r2.c:1257
+msgid "Diese Schrift kannst du nicht lesen."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1231
+msgid "Eingang"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1232 ../../msn/msn_r2.c:1318
+msgid "Stern"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1233 ../../msn/msn_r2.c:1234 ../../msn/msn_r2.c:1309
+msgid "Raumschiff"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1240
+msgid "Portier"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1240
+msgid "Du siehst doch selbst, wie er aussieht."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1242 ../../msn/msn_r3.c:1484 ../../msn/msn_r3.c:1549
+#: ../../msn/msn_r3.c:1564 ../../msn/msn_r3.c:1573 ../../msn/msn_r3.c:1584
+#: ../../msn/msn_r3.c:1586 ../../msn/msn_r3.c:1588 ../../msn/msn_r3.c:1590
+#: ../../msn/msn_r3.c:1600 ../../msn/msn_r3.c:1613 ../../msn/msn_r3.c:1614
+#: ../../msn/msn_r3.c:1615 ../../msn/msn_r3.c:1625 ../../msn/msn_r3.c:1637
+#: ../../msn/msn_r3.c:1648 ../../msn/msn_r3.c:1660 ../../msn/msn_r3.c:1671
+#: ../../msn/msn_r3.c:1692
+msgid "Tr"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1245
+msgid "Kaugummi"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1246
+msgid "Gummibrchen"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1247
+msgid "Schokokugel"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1248
+msgid "berraschungsei"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1249
+msgid "Lakritz"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1250
+msgid "Tablette"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1250
+msgid ""
+"Die Plastikhlle zeigt einen|Mund mit einer Sprechblase. Was|darin steht, "
+"kannst du nicht lesen."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1253
+msgid "Automat"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1253
+msgid "Sieht aus wie ein Kaugummiautomat."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1254
+msgid "Die Toiletten sind denen|auf der Erde sehr hnlich."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1258 ../../msn/msn_r2.c:1269
+msgid "Treppe"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1260
+msgid "Mnzen"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1260
+msgid "Es sind seltsame|Kpfe darauf abgebildet."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1262
+msgid "Tablettenhlle"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1262
+msgid ""
+"Darauf steht:\"Wenn Sie diese|Schrift jetzt lesen knnen,|hat die Tablette "
+"gewirkt.\""
+msgstr ""
+
+#: ../../msn/msn_r2.c:1270
+msgid "Stuhl"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1271
+msgid "Schuhe"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1271
+msgid "Wie ist der denn mit|Schuhen hier reingekommen?"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1278
+msgid "Froschgesicht"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1279
+msgid "Gekritzel"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1279
+msgid "\"Mr Spock was here\""
+msgstr ""
+
+#: ../../msn/msn_r2.c:1280
+msgid "Brieftasche"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1281
+msgid "Speisekarte"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1281
+msgid "\"Heute empfehlen wir:|Fonua Opra mit Ulk.\""
+msgstr ""
+
+#: ../../msn/msn_r2.c:1282
+msgid "Tasse"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1282
+msgid "Sie enthlt eine grnliche Flssigkeit."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1284
+msgid "10-Buckazoid-Schein"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1284
+msgid "Nicht gerade sehr viel Geld."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1286 ../../msn/msn_r2.c:1297
+msgid "Keycard von Roger"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1301
+msgid "Anzeige"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1301 ../../msn/msn_r2.c:1302
+msgid "Hmm, seltsame Anzeigen."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1308
+msgid "Roger W."
+msgstr ""
+
+#: ../../msn/msn_r2.c:1317
+msgid "Ufo"
+msgstr ""
+
+#: ../../msn/msn_r2.c:1317
+msgid "Der Eingang scheint offen zu sein."
+msgstr ""
+
+#: ../../msn/msn_r3.c:26
+msgid "Du drckst den Knopf,|aber nichts passiert."
+msgstr ""
+
+#: ../../msn/msn_r3.c:87
+msgid "Bei deinem Fluchtversuch hat|dich der Roboter erschossen."
+msgstr ""
+
+#: ../../msn/msn_r3.c:90
+msgid "Du iát etwas, aber|es schmeckt scheuálich."
+msgstr ""
+
+#: ../../msn/msn_r3.c:170
+msgid "Du wachst auf und findest dich in|einem geschlossenen Raum wieder."
+msgstr ""
+
+#: ../../msn/msn_r3.c:229
+msgid "h ... nein, mein Name ist Mller."
+msgstr ""
+
+#: ../../msn/msn_r3.c:230
+msgid "Oh, ich habe mich im Gang vertan."
+msgstr ""
+
+#: ../../msn/msn_r3.c:236
+msgid "Wrden Sie mich bitte zum Fahrstuhl lassen?"
+msgstr ""
+
+#: ../../msn/msn_r3.c:237
+msgid "Ich gehe wieder."
+msgstr ""
+
+#: ../../msn/msn_r3.c:242
+msgid "Dann gehe ich eben wieder."
+msgstr ""
+
+#: ../../msn/msn_r3.c:243
+msgid "Ach, halten Sie's Maul, ich gehe trotzdem!"
+msgstr ""
+
+#: ../../msn/msn_r3.c:244 ../../msn/msn_r3.c:245
+msgid "Wenn Sie mich durchlassen gebe ich Ihnen "
+msgstr ""
+
+#: ../../msn/msn_r3.c:257
+msgid "Sie schon wieder?"
+msgstr ""
+
+#: ../../msn/msn_r3.c:263
+msgid "Halt! Sie sind doch dieser Hummel.|Bleiben Sie sofort stehen!"
+msgstr ""
+
+#: ../../msn/msn_r3.c:265
+msgid "Sehr witzig!"
+msgstr ""
+
+#: ../../msn/msn_r3.c:268
+msgid "Kann auch sein, auf jeden Fall|sind Sie der Nicht-Axacussaner."
+msgstr ""
+
+#: ../../msn/msn_r3.c:272
+msgid "Nein!"
+msgstr ""
+
+#: ../../msn/msn_r3.c:285 ../../msn/msn_r3.c:286
+msgid " Xa."
+msgstr ""
+
+#: ../../msn/msn_r3.c:311
+msgid "Das máte schon ein biáchen mehr sein."
+msgstr ""
+
+#: ../../msn/msn_r3.c:325
+msgid "Ok, dann machen Sie daá Sie wegkommen!"
+msgstr ""
+
+#: ../../msn/msn_r3.c:431
+msgid "Der Axacussaner hat dich erwischt."
+msgstr ""
+
+#: ../../msn/msn_r3.c:548
+msgid ""
+"Diese Tr wrde ich lieber|nicht ffnen. Nach dem Schild zu|urteilen, ist "
+"jemand in dem Raum."
+msgstr ""
+
+#: ../../msn/msn_r3.c:643
+msgid "Du stellst dich hinter die Sule."
+msgstr ""
+
+#: ../../msn/msn_r3.c:657
+msgid "Hmm, er scheint kaputt zu sein."
+msgstr ""
+
+#: ../../msn/msn_r3.c:658
+msgid "Hmm, it seems to be broken."
+msgstr ""
+
+#: ../../msn/msn_r3.c:697
+msgid "Welche Zahlenkombination willst|du eingeben?"
+msgstr ""
+
+#: ../../msn/msn_r3.c:709
+msgid ""
+"Hmm, das haut nicht ganz hin,|aber irgendwie muá die Zahl|mit dem Code "
+"zusammenhngen."
+msgstr ""
+
+#: ../../msn/msn_r3.c:711
+msgid "Das war die falsche Kombination."
+msgstr ""
+
+#: ../../msn/msn_r3.c:749
+msgid "Streng geheim"
+msgstr ""
+
+#: ../../msn/msn_r3.c:750
+msgid "418-98"
+msgstr ""
+
+#: ../../msn/msn_r3.c:751
+msgid "Sehr geehrter Dr. Hansi,"
+msgstr ""
+
+#: ../../msn/msn_r3.c:752
+msgid "Ich muá Ihren Roboterexperten ein Lob aussprechen. Die"
+msgstr ""
+
+#: ../../msn/msn_r3.c:753
+msgid "Imitation von Horst Hummel ist perfekt gelungen, wie ich"
+msgstr ""
+
+#: ../../msn/msn_r3.c:754
+msgid "heute bei der bertragung des Interviews feststellen"
+msgstr ""
+
+#: ../../msn/msn_r3.c:755
+msgid "konnte. Dem Aufschwung Ihrer Firma durch die Werbe-"
+msgstr ""
+
+#: ../../msn/msn_r3.c:756
+msgid "kampagne mit dem falschen Horst Hummel drfte ja jetzt"
+msgstr ""
+
+#: ../../msn/msn_r3.c:757
+msgid "nichts mehr im Wege stehen."
+msgstr ""
+
+#: ../../msn/msn_r3.c:758
+msgid "PS: Herzlichen zum Geburtstag!"
+msgstr ""
+
+#: ../../msn/msn_r3.c:759
+msgid "Hochachtungsvoll"
+msgstr ""
+
+#: ../../msn/msn_r3.c:760
+msgid "Commander Sumoti"
+msgstr ""
+
+#: ../../msn/msn_r3.c:767
+msgid "Nicht zu fassen!"
+msgstr ""
+
+#: ../../msn/msn_r3.c:839
+msgid "Hey, hinter dem Bild ist Geld|versteckt. Ich nehme es mit."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1048
+msgid "DR. ALAB HANSI"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1048
+msgid "ALAB HANSI"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1049
+msgid "SAVAL LUN"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1049 ../../msn/msn_r3.c:1051
+msgid "x"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1050
+msgid "PROF. DR. UGNUL TSCHABB"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1050
+msgid "UGNUL TSCHABB"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1051
+msgid "ALGA HURZ LI"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1055
+msgid "Alab Hansi"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1055
+msgid "Saval Lun"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1055
+msgid "Ugnul Tschabb"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1055
+msgid "Alga Hurz Li"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1061
+msgid "Guten Tag, hier ist Horst Hummel."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1063
+msgid "Es ist sehr wichtig."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1069
+msgid "Vom Mars."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1070
+msgid "Vom Klo."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1071
+msgid "Das werde ich kaum erzhlen."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1080
+msgid "1 Bromanager"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1081
+msgid "2 Telomat"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1082
+msgid "3 ProText"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1083
+msgid "4 Calculata"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1084
+msgid "Bitte whlen"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1092
+msgid "Geben Sie den gewnschten Namen ein:"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1093
+msgid "(Vor- und Nachname)"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1107
+msgid "Name unbekannt"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1113
+msgid "Verbindung unmglich"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1117
+msgid "Verbindung wird hergestellt"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1123
+msgid " am Apparat."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1129
+msgid "Hier ist "
+msgstr ""
+
+#: ../../msn/msn_r3.c:1131
+msgid ". Knnen Sie mal gerade kommen?"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1138
+msgid "Huch, Sie hren sich aber|nicht gut an. Ich komme sofort."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1149
+msgid "Horst Hummel! Von wo rufen Sie an?"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1155
+msgid "Hmm, keine Antwort."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1168
+msgid "Passwort:"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1219
+msgid "Was war das fr ein Gerusch?"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1221 ../../msn/msn_s.c:312
+msgid "Ich werde mal nachsehen."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1309
+msgid "Jetzt verschwinden Sie endlich!"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1310
+msgid "Huch, ich habe mich vertan."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1372
+msgid ""
+"Nachdem du zwei Stunden im|Dschungel herumgeirrt bist,|findest du ein "
+"Gebude."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1485
+msgid "Tablett"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1485
+msgid "Es ist irgendein Fraá und|etwas zu Trinken darauf."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1487
+msgid "Stange"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1487
+msgid "Es scheint eine Lampe zu sein."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1488
+msgid "Augen"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1488
+msgid "Es ist nur ein Bild."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1490
+msgid "Sieht etwas anders aus als auf der Erde."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1492
+msgid "Metallblock"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1492
+msgid "Er ist ziemlich schwer."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1494
+msgid "Roboter"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1494
+msgid "Den hast du erledigt."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1495 ../../msn/msn_r3.c:1532
+msgid "Tisch"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1495
+msgid "Ein kleiner Metalltisch."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1528
+msgid "Zellentr"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1528
+msgid "Hier warst du eingesperrt."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1530
+msgid "Laptop"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1580 ../../msn/msn_r3.c:1581
+msgid "Sule"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1584
+msgid "Auf einem Schild an der Tr steht \"Dr. Alab Hansi\"."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1586
+msgid "Auf einem Schild an der Tr steht \"Saval Lun\"."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1588
+msgid "Auf einem Schild an der Tr steht \"Prof. Dr. Ugnul Tschabb\"."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1590
+msgid "Auf einem Schild an der Tr steht \"Alga Hurz Li\"."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1601 ../../msn/msn_r3.c:1617
+msgid "Axacussaner"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1601
+msgid "Du mátest ihn irgendwie ablenken."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1603
+msgid "Komisches Bild."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1604
+msgid "Karte"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1604
+msgid "Darauf steht: \"Generalkarte\"."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1616
+msgid "Lampe"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1618
+msgid "Seltsam!"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1627 ../../msn/msn_r3.c:1674
+msgid "Geld"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1627
+msgid "Es sind 500 Xa."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1628
+msgid "Schlieáfach"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1628
+msgid "Es hat ein elektronisches Zahlenschloá."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1630
+msgid "Brief"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1639
+msgid "Wrfel"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1639
+msgid "Sonderbar!"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1640
+msgid "Affenstark!"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1641
+msgid "Komisches Ding"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1641
+msgid "Wundersam!"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1650 ../../msn/msn_r3.c:1651
+msgid "Es ist ein Axacussanerkopf auf dem Bild."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1652 ../../msn/msn_r3.c:1663
+msgid "Pflanze"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1662
+msgid "Figur"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1662
+msgid "Stark!"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1663
+msgid "Sie ist den Pflanzen auf der Erde sehr hnlich."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1672
+msgid "Er funktioniert nicht."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1673
+msgid "Graffiti"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1673
+msgid "Seltsamer Broschmuck!"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1674
+msgid "Es sind 350 Xa."
+msgstr ""
+
+#: ../../msn/msn_r3.c:1684
+msgid "Dschungel"
+msgstr ""
+
+#: ../../msn/msn_r3.c:1684
+msgid "Lauter Bume."
+msgstr ""
+
+#: ../../msn/msn_s.c:84
+msgid "Teil 1:"
+msgstr ""
+
+#: ../../msn/msn_s.c:85
+msgid "Das Schicksal"
+msgstr ""
+
+#: ../../msn/msn_s.c:86
+msgid "des Horst Hummel"
+msgstr ""
+
+#: ../../msn/msn_s.c:131
+msgid "Viertausend"
+msgstr ""
+
+#: ../../msn/msn_s.c:131
+msgid "Fnftausend"
+msgstr ""
+
+#: ../../msn/msn_s.c:131
+msgid "Sechstausend"
+msgstr ""
+
+#: ../../msn/msn_s.c:131
+msgid "Siebentausend"
+msgstr ""
+
+#: ../../msn/msn_s.c:144
+msgid "Zwei Tage nach dem Start|im Cockpit der \"Supernova\" ..."
+msgstr ""
+
+#: ../../msn/msn_s.c:153
+msgid "Entferung von der Sonne: 1 500 000 km.|Gehen Sie auf 8000 hpm, Captain!"
+msgstr ""
+
+#: ../../msn/msn_s.c:168
+msgid "Geschwindigkeit:"
+msgstr ""
+
+#: ../../msn/msn_s.c:169
+msgid "Zweitausend hpm"
+msgstr ""
+
+#: ../../msn/msn_s.c:172
+msgid "Dreitausend"
+msgstr ""
+
+#: ../../msn/msn_s.c:189
+msgid "Achttau..."
+msgstr ""
+
+#: ../../msn/msn_s.c:214
+msgid "Keine Ahnung, Sir."
+msgstr ""
+
+#: ../../msn/msn_s.c:215
+msgid "Ingenieur an Commander, bitte kommen!"
+msgstr ""
+
+#: ../../msn/msn_s.c:221
+msgid "Was ist los?"
+msgstr ""
+
+#: ../../msn/msn_s.c:222
+msgid ""
+"Wir haben einen Druckabfall im Hauptantriebssystem, Sir.|Einen Moment, ich "
+"schaue sofort nach, woran es liegt."
+msgstr ""
+
+#: ../../msn/msn_s.c:224
+msgid ""
+"Scheiáe, der Ionenantrieb ist explodiert!|Die Teile sind ber den ganzen|"
+"Maschinenraum verstreut."
+msgstr ""
+
+#: ../../msn/msn_s.c:225
+msgid ""
+"Ach, du meine Gte!|Gibt es irgendeine Mglichkeit,|den Schaden schnell zu "
+"beheben?"
+msgstr ""
+
+#: ../../msn/msn_s.c:226
+msgid "Nein, Sir. Es sieht schlecht aus."
+msgstr ""
+
+#: ../../msn/msn_s.c:230
+msgid "Hmm, die Erde zu alarmieren, wrde zu lange dauern."
+msgstr ""
+
+#: ../../msn/msn_s.c:231
+msgid "Ich darf kein Risiko eingehen.|Captain, geben Sie sofort Alarm!"
+msgstr ""
+
+#: ../../msn/msn_s.c:232 ../../msn/msn_s.c:264
+msgid "Ok, Sir."
+msgstr ""
+
+#: ../../msn/msn_s.c:255
+msgid ""
+"Commander an alle! Achtung, Achtung!|Begeben Sie sich sofort zum "
+"Notraumschiff!"
+msgstr ""
+
+#: ../../msn/msn_s.c:256
+msgid "Ich wiederhole:|Begeben Sie sich sofort zum Notraumschiff!"
+msgstr ""
+
+#: ../../msn/msn_s.c:263
+msgid ""
+"Captain, bereiten Sie alles fr den Start vor!|Wir mssen zurck zur Erde!"
+msgstr ""
+
+#: ../../msn/msn_s.c:277
+msgid "Eine Stunde spter ..."
+msgstr ""
+
+#: ../../msn/msn_s.c:284
+msgid "Die Besatzung hat die \"Supernova\" verlassen."
+msgstr ""
+
+#: ../../msn/msn_s.c:285
+msgid ""
+"Das Schiff wird zwar in acht Jahren sein Ziel|erreichen, allerdings ohne "
+"Mannschaft."
+msgstr ""
+
+#: ../../msn/msn_s.c:286
+msgid "Das ist das klgliche Ende|der Mission Supernova."
+msgstr ""
+
+#: ../../msn/msn_s.c:287
+msgid "Sie knnen jetzt ihren Computer ausschalten."
+msgstr ""
+
+#: ../../msn/msn_s.c:290
+msgid "Warten Sie!"
+msgstr ""
+
+#: ../../msn/msn_s.c:291
+msgid "Es regt sich etwas im Schiff."
+msgstr ""
+
+#: ../../msn/msn_s.c:307
+msgid "Uuuuaaaahhhhh"
+msgstr ""
+
+#: ../../msn/msn_s.c:309
+msgid "Huch, ich bin ja gefesselt!|Wo bin ich?"
+msgstr ""
+
+#: ../../msn/msn_s.c:310
+msgid ""
+"Ach so, das sind ja die Sicherheitsgurte.|Ich arbeite ja jetzt in diesem "
+"Raumschiff hier."
+msgstr ""
+
+#: ../../msn/msn_s.c:311
+msgid ""
+"Was? Schon zwei Uhr! Wieso|hat mich denn noch keiner|aus dem Bett "
+"geschmissen?"
+msgstr ""
+
+#: ../../msn/msn_s.c:314
+msgid "Autsch!"
+msgstr ""
+
+#: ../../msn/msn_s.c:315
+msgid "Scheiáetagenbett!"
+msgstr ""
+
+#: ../../msn/msn_s.c:317
+msgid "Erst mal den Lichtschalter finden."
+msgstr ""
+
+#: ../../msn/msn_s.c:318
+msgid "Hmm, gar nicht so einfach|bei Schwerelosigkeit."
+msgstr ""
+
+#: ../../msn/msn_s.c:320
+msgid "Ah, hier ist er."
+msgstr ""
Commit: 0f4d364e63bbc1cb2a14917245a4e8d0abe82150
https://github.com/scummvm/scummvm/commit/0f4d364e63bbc1cb2a14917245a4e8d0abe82150
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:33Z
Commit Message:
SUPERNOVA: Add getting translated images from the engine data file
Changed paths:
engines/supernova/graphics.cpp
engines/supernova/graphics.h
engines/supernova/supernova.h
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index 70f0590..87485e0 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -24,11 +24,13 @@
#include "common/file.h"
#include "common/stream.h"
#include "common/system.h"
+#include "common/config-manager.h"
#include "graphics/palette.h"
#include "graphics/surface.h"
#include "graphics.h"
#include "msn_def.h"
+#include "supernova.h"
namespace Supernova {
@@ -57,6 +59,48 @@ bool MSNImageDecoder::init(int filenumber) {
return true;
}
+bool MSNImageDecoder::loadFromEngineDataFile() {
+ Common::String name;
+ if (_filenumber == 1)
+ name = "IMG1";
+ else if (_filenumber == 2)
+ name = "IMG2";
+ else
+ return false;
+
+ Common::String cur_lang = ConfMan.get("language");
+
+ // Note: we don't print any warning or errors here if we cannot find the file
+ // or the format is not as expected. We will get those warning when reading the
+ // strings anyway (actually the engine will even refuse to start).
+ Common::File f;
+ if (!f.open(SUPERNOVA_DAT))
+ return false;
+
+ char id[5], lang[5];
+ id[4] = lang[4] = '\0';
+ f.read(id, 3);
+ if (strncmp(id, "MSN", 3) != 0)
+ return false;
+ int version = f.readByte();
+ if (version != SUPERNOVA_DAT_VERSION)
+ return false;
+
+ while (!f.eos()) {
+ f.read(id, 4);
+ f.read(lang, 4);
+ uint32 size = f.readUint32LE();
+ if (f.eos())
+ break;
+ if (name == id && cur_lang == lang) {
+ return f.read(_encodedImage, size) == size;
+ } else
+ f.skip(size);
+ }
+
+ return false;
+}
+
bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
destroy();
@@ -113,30 +157,35 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
_clickField[i].next = stream.readByte();
}
- byte zwCodes[256] = {0};
- byte numRepeat = stream.readByte();
- byte numZw = stream.readByte();
- stream.read(zwCodes, numZw);
- numZw += numRepeat;
-
- byte input = 0;
- uint i = 0;
-
- while (stream.read(&input, 1)) {
- if (input < numRepeat) {
- ++input;
- byte value = stream.readByte();
- for (--value; input > 0; --input) {
- _encodedImage[i++] = value;
+ // Newspaper images may be in the engine data file. So first try to read
+ // it from there.
+ if (!loadFromEngineDataFile()) {
+ // Load the image from the stream
+ byte zwCodes[256] = {0};
+ byte numRepeat = stream.readByte();
+ byte numZw = stream.readByte();
+ stream.read(zwCodes, numZw);
+ numZw += numRepeat;
+
+ byte input = 0;
+ uint i = 0;
+
+ while (stream.read(&input, 1)) {
+ if (input < numRepeat) {
+ ++input;
+ byte value = stream.readByte();
+ for (--value; input > 0; --input) {
+ _encodedImage[i++] = value;
+ }
+ } else if (input < numZw) {
+ input = zwCodes[input - numRepeat];
+ --input;
+ _encodedImage[i++] = input;
+ _encodedImage[i++] = input;
+ } else {
+ input -= pal_diff;
+ _encodedImage[i++] = input;
}
- } else if (input < numZw) {
- input = zwCodes[input - numRepeat];
- --input;
- _encodedImage[i++] = input;
- _encodedImage[i++] = input;
- } else {
- input -= pal_diff;
- _encodedImage[i++] = input;
}
}
diff --git a/engines/supernova/graphics.h b/engines/supernova/graphics.h
index c04afba..a77ea20 100644
--- a/engines/supernova/graphics.h
+++ b/engines/supernova/graphics.h
@@ -79,6 +79,7 @@ public:
} _clickField[kMaxClickFields];
private:
+ bool loadFromEngineDataFile();
bool loadSections();
};
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 91dc5a1..a1a682d 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -45,6 +45,9 @@ namespace Supernova {
#define SAVEGAME_HEADER MKTAG('M','S','N','1')
#define SAVEGAME_VERSION 1
+#define SUPERNOVA_DAT "supernova.dat"
+#define SUPERNOVA_DAT_VERSION 1
+
struct ScreenBuffer {
ScreenBuffer()
Commit: d76b44ee57c5a5db6d825af16e82bf778ba0d30b
https://github.com/scummvm/scummvm/commit/d76b44ee57c5a5db6d825af16e82bf778ba0d30b
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:33Z
Commit Message:
SUPERNOVA: Add detection entry for English translation
Changed paths:
engines/supernova/detection.cpp
diff --git a/engines/supernova/detection.cpp b/engines/supernova/detection.cpp
index 577fc74..17db24a 100644
--- a/engines/supernova/detection.cpp
+++ b/engines/supernova/detection.cpp
@@ -47,6 +47,15 @@ static const ADGameDescription gameDescriptions[] = {
ADGF_UNSTABLE,
GUIO1(GUIO_NONE)
},
+ {
+ "msn1",
+ NULL,
+ AD_ENTRY1s("msn.exe", "d11264516c529c7fc2ca81d8ba062d9e", 65536),
+ Common::EN_ANY,
+ Common::kPlatformDOS,
+ ADGF_UNSTABLE,
+ GUIO1(GUIO_NONE)
+ },
// Mission Supernova 2
{
Commit: 184b3a166217ba5c0ea3eddd3e01798d8e752417
https://github.com/scummvm/scummvm/commit/184b3a166217ba5c0ea3eddd3e01798d8e752417
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:33Z
Commit Message:
SUPERNOVA: Load strings from the supernova.dat file
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 7fb95c5..67c6fdd 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -33,6 +33,7 @@
#include "common/savefile.h"
#include "common/str.h"
#include "common/system.h"
+#include "common/translation.h"
#include "engines/util.h"
#include "graphics/cursorman.h"
#include "graphics/surface.h"
@@ -138,6 +139,11 @@ SupernovaEngine::~SupernovaEngine() {
Common::Error SupernovaEngine::run() {
initGraphics(_screenWidth, _screenHeight);
+
+ Common::Error status = loadGameStrings();
+ if (status.getCode() != Common::kNoError)
+ return status;
+
_gm = new GameManager(this);
_console = new Console(this, _gm);
@@ -243,6 +249,65 @@ void SupernovaEngine::pauseTimer(bool pause) {
}
}
+Common::Error SupernovaEngine::loadGameStrings() {
+ Common::String cur_lang = ConfMan.get("language");
+ Common::String string_id("TEXT");
+
+ // Note: we don't print any warning or errors here if we cannot find the file
+ // or the format is not as expected. We will get those warning when reading the
+ // strings anyway (actually the engine will even refuse to start).
+ Common::File f;
+ if (!f.open(SUPERNOVA_DAT)) {
+ Common::String msg = Common::String::format(_("Unable to locate the '%s' engine data file."), SUPERNOVA_DAT);
+ GUIErrorMessage(msg);
+ return Common::kReadingFailed;
+ }
+
+ // Validate the data file header
+ char id[5], lang[5];
+ id[4] = lang[4] = '\0';
+ f.read(id, 3);
+ if (strncmp(id, "MSN", 3) != 0) {
+ Common::String msg = Common::String::format(_("The '%s' engine data file is corrupt."), SUPERNOVA_DAT);
+ GUIErrorMessage(msg);
+ return Common::kReadingFailed;
+ }
+
+ int version = f.readByte();
+ if (version != SUPERNOVA_DAT_VERSION) {
+ Common::String msg = Common::String::format(
+ _("Incorrect version of the '%s' engine data file found. Expected %d but got %d."),
+ SUPERNOVA_DAT, SUPERNOVA_DAT_VERSION, version);
+ GUIErrorMessage(msg);
+ return Common::kReadingFailed;
+ }
+
+ while (!f.eos()) {
+ f.read(id, 4);
+ f.read(lang, 4);
+ uint32 size = f.readUint32LE();
+ if (f.eos())
+ break;
+ if (string_id == id && cur_lang == lang) {
+ while (size > 0) {
+ Common::String s;
+ char ch;
+ while ((ch = (char)f.readByte()) != '\0')
+ s += ch;
+ _gameStrings.push_back(s);
+ size -= s.size() + 1;
+ }
+ return Common::kNoError;
+ } else
+ f.skip(size);
+ }
+
+ Common::Language l = Common::parseLanguage(cur_lang);
+ Common::String msg = Common::String::format(_("Unable to locate the text for %s language in '%s' engine data file."), Common::getLanguageDescription(l), SUPERNOVA_DAT);
+ GUIErrorMessage(msg);
+ return Common::kReadingFailed;
+}
+
void SupernovaEngine::initData() {
// Images
for (int i = 0; i < 44; ++i)
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index a1a682d..356cfe4 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -104,6 +104,8 @@ public:
int _screenHeight;
bool _allowLoadGame;
bool _allowSaveGame;
+ Common::StringArray _gameStrings;
+ Common::String _nullString;
byte _imageIndex;
byte _sectionIndex;
@@ -120,6 +122,7 @@ public:
void pauseTimer(bool pause);
int textWidth(const char *text);
int textWidth(const uint16 key);
+ Common::Error loadGameStrings();
void initData();
void initPalette();
void paletteFadeIn();
@@ -146,6 +149,12 @@ public:
bool loadGame(int slot);
bool saveGame(int slot, const Common::String &description);
+ const Common::String &getGameString(int idx) const {
+ if (idx < 0 || idx >= _gameStrings.size())
+ return _nullString;
+ return _gameStrings[idx];
+ }
+
Common::MemoryReadStream *convertToMod(const char *filename, int version = 1);
virtual Common::Error loadGameState(int slot);
Commit: 6fc065922268c6dfb83fac6ded31dca076822754
https://github.com/scummvm/scummvm/commit/6fc065922268c6dfb83fac6ded31dca076822754
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:33Z
Commit Message:
SUPERNOVA: Start using strings from the engine data file
This means that now all that remains to be done to play in English
is to move all the strings to the engine data file and to translate
them.
Changed paths:
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
engines/supernova/state.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index a02df72..403ba14 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -400,27 +400,27 @@ enum ObjectID {
TICKETS
};
+enum StringID {
+ kCommandGo = 0, kCommandLook, kCommandTake, kCommandOpen, kCommandClose,
+ kCommandPress, kCommandPull, kCommandUse, kCommandTalk, kCommandGive,
+ kStatusCommandGo, kStatusCommandLook, kStatusCommandTake, kStatusCommandOpen, kStatusCommandClose,
+ kStatusCommandPress, kStatusCommandPull, kStatusCommandUse, kStatusCommandTalk, kStatusCommandGive,
+ kBroken, kIntro1, kIntro2, kIntro3, kIntro4,
+ kIntro5, kIntro6, kIntro7, kIntro8, kIntro9,
+ kIntro10, kIntro11, kIntro12, kIntro13, kKeycard,
+ kKeycardDesc, kKnife, kKnifeDesc, kWatch, kDiscman,
+ kDiscmanDesc
+};
-static const char *const broken_DE = "Hmm, er scheint kaputt zu sein.";
-static const char *const broken_EN = "Hmm, it seems to be broken.";
-
-static const char *const guiCommand_DE[] = {
- "Gehe",
- "Schau",
- "Nimm",
- "\231ffne",
- "Schlie\341e",
- "Dr\201cke",
- "Ziehe",
- "Benutze",
- "Rede",
- "Gib"
+static StringID guiCommands[] = {
+ kCommandGo, kCommandLook, kCommandTake, kCommandOpen, kCommandClose,
+ kCommandPress, kCommandPull, kCommandUse, kCommandTalk, kCommandGive
};
-static const char *const guiStatusCommand_DE[10] =
-{"Gehe zu ","Schau ","Nimm ","\231ffne ","Schlie\341e ","Dr\201cke ","Ziehe ","Benutze ","Rede mit ","Gib "};
-static const char *const guiStatusCommand_EN[10] =
-{"Go to ", "Look at ", "Take ", "Open ", "Close ", "Press ", "Pull ", "Use ", "Talk to ", "Give "};
+static StringID guiStatusCommands[] = {
+ kStatusCommandGo, kStatusCommandLook, kStatusCommandTake, kStatusCommandOpen, kStatusCommandClose,
+ kStatusCommandPress, kStatusCommandPull, kStatusCommandUse, kStatusCommandTalk, kStatusCommandGive
+};
ObjectType operator|(ObjectType a, ObjectType b);
ObjectType operator&(ObjectType a, ObjectType b);
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 4214a11..f4a3084 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2757,7 +2757,7 @@ bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
_vm->playSound(kAudioUndef2);
} else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
if (isSectionVisible(4))
- _vm->renderMessage(broken_DE);
+ _vm->renderMessage(kBroken);
else
_gm->telomat(0);
} else if (((verb == ACTION_OPEN) || (verb == ACTION_USE)) &&
@@ -2840,7 +2840,7 @@ bool AxacussOffice2::interact(Action verb, Object &obj1, Object &obj2) {
_vm->playSound(kAudioUndef2);
} else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
if (isSectionVisible(4))
- _vm->renderMessage(broken_DE);
+ _vm->renderMessage(kBroken);
else
_gm->telomat(1);
} else
@@ -2865,7 +2865,7 @@ bool AxacussOffice3::interact(Action verb, Object &obj1, Object &obj2) {
_vm->playSound(kAudioUndef2);
} else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
if (isSectionVisible(4))
- _vm->renderMessage(broken_DE);
+ _vm->renderMessage(kBroken);
else
_gm->telomat(2);
} else if ((verb == ACTION_LOOK) && (obj1._id == PAINTING)) {
@@ -2894,7 +2894,7 @@ bool AxacussOffice4::interact(Action verb, Object &obj1, Object &obj2) {
_vm->playSound(kAudioUndef2);
} else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
if (isSectionVisible(4))
- _vm->renderMessage(broken_DE);
+ _vm->renderMessage(kBroken);
else
_gm->telomat(3);
} else
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 4c54cbe..cbb740f 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -398,14 +398,15 @@ void GameManager::initRooms() {
void GameManager::initGui() {
int commandButtonX = 0;
for (int i = 0; i < ARRAYSIZE(_guiCommandButton); ++i) {
+ const Common::String &text = _vm->getGameString(guiCommands[i]);
int width;
if (i < 9)
- width = _vm->textWidth(guiCommand_DE[i]) + 2;
+ width = _vm->textWidth(text) + 2;
else
width = 320 - commandButtonX;
_guiCommandButton[i].setSize(commandButtonX, 150, commandButtonX + width, 159);
- _guiCommandButton[i].setText(guiCommand_DE[i]);
+ _guiCommandButton[i].setText(text.c_str());
_guiCommandButton[i].setColor(kColorWhite25, kColorDarkGreen, kColorWhite44, kColorGreen);
commandButtonX += width + 2;
}
@@ -1174,7 +1175,7 @@ void GameManager::takeMoney(int amount) {
void GameManager::drawStatus() {
int index = static_cast<int>(_inputVerb);
_vm->renderBox(0, 140, 320, 9, kColorWhite25);
- _vm->renderText(guiStatusCommand_DE[index], 1, 141, kColorDarkGreen);
+ _vm->renderText(_vm->getGameString(guiStatusCommands[index]), 1, 141, kColorDarkGreen);
if (Object::isNullObject(_inputObject[0])) {
_vm->renderText(_currentInputObject->_name.c_str());
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 356cfe4..cc6cfbb 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -154,6 +154,26 @@ public:
return _nullString;
return _gameStrings[idx];
}
+ int textWidth(const Common::String &text) {
+ if (text.empty())
+ return 0;
+ return textWidth(text.c_str());
+ }
+ void renderMessage(StringID stringId, MessagePosition position = kMessageNormal) {
+ renderMessage(getGameString(stringId), position);
+ }
+ void renderMessage(const Common::String &text, MessagePosition position = kMessageNormal) {
+ if (!text.empty())
+ renderMessage(text.c_str(), position);
+ }
+ void renderText(const Common::String &text, int x, int y, byte color) {
+ if (!text.empty())
+ renderText(text.c_str(), x, y, color);
+ }
+ void renderText(const Common::String &text) {
+ if (!text.empty())
+ renderText(text.c_str());
+ }
Common::MemoryReadStream *convertToMod(const char *filename, int version = 1);
Commit: be08dd3c57f8017346abae1659395d7d395d1440
https://github.com/scummvm/scummvm/commit/be08dd3c57f8017346abae1659395d7d395d1440
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:33Z
Commit Message:
SUPERNOVA: Add POTFILES to get translated text for the GUI
Changed paths:
A engines/supernova/POTFILES
diff --git a/engines/supernova/POTFILES b/engines/supernova/POTFILES
new file mode 100644
index 0000000..80d6dee
--- /dev/null
+++ b/engines/supernova/POTFILES
@@ -0,0 +1,2 @@
+engines/supernova/supernova.cpp
+
Commit: 7722fe99cde7ad38a79e8a95d1bf342cd7075a0b
https://github.com/scummvm/scummvm/commit/7722fe99cde7ad38a79e8a95d1bf342cd7075a0b
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:33Z
Commit Message:
SUPERNOVA: Move object name and description strings to engine data file
Changed paths:
devtools/create_supernova/gametext.h
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
engines/supernova/rooms.h
engines/supernova/state.cpp
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index 5183dfd..83867d2 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -36,233 +36,414 @@
const char *gameText[] = {
// 0
- "Gehe", // kCommandGo
- "Schau", // kCommandLook
- "Nimm", // kCommandTake
- "\231ffne", // kCommandOpen
- "Schlie\341e", // kCommandClose
+ "Gehe", // kStringCommandGo
+ "Schau", // kStringCommandLook
+ "Nimm", // kStringCommandTake
+ "\231ffne", // kStringCommandOpen
+ "Schlie\341e", // kStringCommandClose
// 5
- "Dr\201cke", // kCommandPress
- "Ziehe", // kCommandPull
- "Benutze", // kCommandUse
- "Rede", // kCommandTalk
- "Gib", // kCommandGive
+ "Dr\201cke", // kStringCommandPress
+ "Ziehe", // kStringCommandPull
+ "Benutze", // kStringCommandUse
+ "Rede", // kStringCommandTalk
+ "Gib", // kStringCommandGive
// 10
- "Gehe zu ", // kStatusCommandGo
- "Schau ", // kStatusCommandLook
- "Nimm ", // kStatusCommandTake
- "\231ffne ", // kStatusCommandOpen
- "Schlie\341e ", // kStatusCommandClose
+ "Gehe zu ", // kStringStatusCommandGo
+ "Schau ", // kStringStatusCommandLook
+ "Nimm ", // kStringStatusCommandTake
+ "\231ffne ", // kStringStatusCommandOpen
+ "Schlie\341e ", // kStringStatusCommandClose
// 15
- "Dr\201cke ", // kStatusCommandPress
- "Ziehe ", // kStatusCommandPull
- "Benutze ", // kStatusCommandUse
- "Rede mit ", // kStatusCommandTalk
- "Gib ", // kStatusCommandGive
+ "Dr\201cke ", // kStringStatusCommandPress
+ "Ziehe ", // kStringStatusCommandPull
+ "Benutze ", // kStringStatusCommandUse
+ "Rede mit ", // kStringStatusCommandTalk
+ "Gib ", // kStringStatusCommandGive
// 20
- "Hmm, er scheint kaputt zu sein.", // kBroken
- "^(C) 1994 Thomas und Steffen Dingel#", // kIntro1
- "Story und Grafik:^ Thomas Dingel#", // kIntro2
- "Programmierung:^ Steffen Dingel#", // kIntro3
- "Musik:^ Bernd Hoffmann#", // kIntro4
+ "V2.02", // kStringTitleVersion
+ "Teil 1:", // kStringTitle1
+ "Das Schicksal", // kStringTitle2
+ "des Horst Hummel", // kStringTitle3
+ "^(C) 1994 Thomas und Steffen Dingel#", // kStringIntro1
// 25
- "Getestet von ...#", // kIntro5
- "^Matthias Neef#", // kIntro6
- "^Sascha Otterbach#", // kIntro7
- "^Thomas Mazzoni#", // kIntro8
- "^Matthias Klein#", // kIntro9
+ "Story und Grafik:^ Thomas Dingel#", // kStringIntro2
+ "Programmierung:^ Steffen Dingel#", // kStringIntro3
+ "Musik:^ Bernd Hoffmann#", // kStringIntro4
+ "Getestet von ...#", // kStringIntro5
+ "^Matthias Neef#", // kStringIntro6
// 30
- "^Gerrit Rothmaier#", // kIntro10
- "^Thomas Hassler#", // kIntro11
- "^Rene Koch#", // kIntro12
- "°", // kIntro13
- "Keycard", // kKeycard
+ "^Sascha Otterbach#", // kStringIntro7
+ "^Thomas Mazzoni#", // kStringIntro8
+ "^Matthias Klein#", // kStringIntro9
+ "^Gerrit Rothmaier#", // kStringIntro10
+ "^Thomas Hassler#", // kStringIntro11
// 35
- "Die Keycard f\224r deine Schr\204nke.", // kKeycardDesc
- "Taschenmesser", // kKnife
- "Es ist nicht mehr das sch\204rfste.", // kKnifeDesc
- "Armbanduhr", // kWatch
- "Discman", // kDiscman
+ "^Rene Koch#", // kStringIntro12
+ "\233", // kStringIntro13
+ "Hmm, er scheint kaputt zu sein.", // kStringBroken
+ "Es ist nichts Besonderes daran.", // kStringDefaultDescription
+ "Das mußt du erst nehmen.", // kStringTakeMessage
// 40
- "Es ist eine \"Mad Monkeys\"-CD darin.", // kDiscmanDesc
- "", //
- "", //
- "", //
- "", //
+ "Keycard", // kStringKeycard
+ "Die Keycard f\224r deine Schr\204nke.", // kStringKeycardDescription
+ "Taschenmesser", // kStringKnife
+ "Es ist nicht mehr das sch\204rfste.", // kStringKnifeDescription
+ "Armbanduhr", // kStringWatch
// 45
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Discman", // kStringDiscman
+ "Es ist eine \"Mad Monkeys\"-CD darin.", // kStringDiscmanDescription
+ "Luke", // kStringHatch
+ "Knopf", // kStringButton
+ "Er geh\224rt zu der gro\341en Luke.", // kStringHatchButtonDescription
// 50
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Leiter", // kStringLadder
+ "Ausgang", // kStringExit
+ "Sie f\204hrt ins Cockpit.", // kStringCockpitHatchDescription
+ "Sie f\204hrt zur K\201che.", // kStringKitchenHatchDescription
+ "Sie f\204hrt zu den Tiefschlafkammern.", // kStringStasisHatchDescription
// 55
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Dies ist eine der Tiefschlafkammern.", // kStringStasisHatchDescription2
+ "Schlitz", // kStringSlot
+ "Es ist ein Keycard-Leser.", // kStringSlotDescription
+ "Gang", // kStringCorridor
+ "Computer", // kStringComputer
// 60
- "", //
- "", //
- "", //
- "", //
- "", //
+ "ZWEIUNDVIERZIG", // kStringComputerPassword
+ "Instrumente", // kStringInstruments
+ "Hmm, sieht ziemlich kompliziert aus.", // kStringInstrumentsDescription1
+ "Monitor", // kStringMonitor
+ "Dieser Monitor sagt dir nichts.", // kStringMonitorDescription
// 65
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Bild", // kStringImage
+ "Herb!", // kStringGenericDescription1
+ "Toll!", // kStringGenericDescription2
+ "Genial!", // kStringGenericDescription3
+ "Es scheint noch nicht fertig zu sein.", // kStringGenericDescription4
// 70
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Magnete", // kStringMagnete
+ "Damit werden Sachen auf|dem Tisch festgehalten.", // kStringMagneteDescription
+ "Stift", // kStringPen
+ "Ein Kugelschreiber.", // kStringPenDescription
+ "Schrank", // kStringShelf
// 75
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Fach", // kStringCompartment
+ "Steckdose", // kStringSocket
+ "Toilette", // kStringToilet
+ "Pistole", // kStringPistol
+ "Es ist keine Munition drin.", // kStringPistolDescription
// 80
- "", //
- "", //
- "", //
- "", //
- "", //
+ "B\201cher", // kStringBooks
+ "Lauter wissenschaftliche B\201cher.", // kStringBooksDescription
+ "Kabelrolle", // kStringSpool
+ "Da sind mindestens zwanzig Meter drauf.", // kStringSpoolDescription
+ "Buch", // kStringBook
// 85
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Unterw\204sche", // kStringUnderwear
+ "Ich habe keine Lust, in|der Unterw\204sche des|Commanders rumzuw\201hlen.", // kStringUnderwearDescription
+ "Kleider", // kStringClothes
+ "Krimskram", // kStringJunk
+ "Es ist nichts brauchbares dabei.", // kStringJunkDescription
// 90
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Ordner", // kStringFolders
+ "Darauf steht \"Dienstanweisungen|zur Mission Supernova\".|Es steht nichts wichtiges drin.", // kStringFoldersDescription
+ "Poster", // kStringPoster
+ "Ein Poster von \"Big Boss\".", // kStringPosterDescription1
+ "Ein Poster von \"Rock Desaster\".", // kStringPosterDescription2
// 95
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Box", // kStringSpeaker
+ "Schallplatte", // kStringRecord
+ "Die Platte ist von \"Big Boss\".", // kStringRecordDescription
+ "Schallplattenst\204nder", // kStringRecordStand
+ "Du hast jetzt keine Zeit, in|der Plattensammlung rumzust\224bern.", // kStringRecordStandDescription
// 100
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Plattenspieler", // kStringTurntable
+ "Sieht aus, als k\204me|er aus dem Museum.", // kStringTurntableDescription
+ "Leitung", // kStringWire
+ "Stecker", // kStringPlug
+ "Manche Leute haben schon|einen komischen Geschmack.", // kStringImageDescription1
// 105
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Zeichenger\204te", // kStringDrawingInstruments
+ "Auf dem Zettel sind lauter|unverst\204ndliche Skizzen und Berechnungen.|(Jedenfalls f\201r dich unverst\204ndlich.)", // kStringDrawingInstrumentsDescription
+ "Schachspiel", // kStringChessGame
+ "Es macht wohl Spa\341, an|der Decke Schach zu spielen.", // kStringChessGameDescription1
+ "Tennisschl\204ger", // kStringTennisRacket
// 110
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Fliegt Boris Becker auch mit?", // kStringTennisRacketDescription
+ "Tennisball", // kStringTennisBall
+ "Dein Magnetschachspiel. Schach war|schon immer deine Leidenschaft.", // kStringChessGameDescription2
+ "Bett", // kStringBed
+ "Das ist dein Bett. Toll, nicht wahr?", // kStringBedDescription
// 115
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Das ist eins deiner drei F\204cher.", // kStringCompartmentDescription
+ "Alben", // kStringAlbums
+ "Deine Briefmarkensammlung.", // kStringAlbumsDescription
+ "Seil", // kStringRope
+ "Es ist ungef\204hr 10 m lang und 4 cm dick.", // kStringRopeDescription
// 120
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Das ist dein Schrank.", // kStringShelfDescription
+ "Es sind Standard-Weltraum-Klamotten.", // kStringClothesDescription
+ "Str\201mpfe", // kStringSocks
+ "Es ist|\"Per Anhalter durch die Galaxis\"|von Douglas Adams.", // kStringBookHitchhiker
+ "Klo", // kStringBathroom
// 125
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Ein Klo mit Saugmechanismus.", // kStringBathroomDescription
+ "Dusche", // kStringShower
+ "Das ist eine Luke !!!", // kStringHatchDescription1
+ "Dies ist eine Luke !!!", // kStringHatchDescription2
+ "Helm", // kStringHelmet
// 130
+ "Es ist der Helm zum Raumanzug.", // kStringHelmetDescription
+ "Raumanzug", // kStringSuit
+ "Der einzige Raumanzug, den die|anderen hiergelassen haben ...", // kStringSuitDescription
+ "Versorgung", // kStringLifeSupport
+ "Es ist der Versorgungsteil zum Raumanzug.", // kStringLifeSupportDescription
+ // 135
+ "Schrott", // kStringScrap
+ "Da ist eine L\201sterklemme dran, die|noch ganz brauchbar aussieht.|Ich nehme sie mit.", // kStringScrapDescription1
+ "L\201sterklemme", // kStringTerminalStrip
+ "Junge, Junge! Die Explosion hat ein|ganz sch\224nes Durcheinander angerichtet.", // kStringScrapDescription2
+ "Reaktor", // kStringReactor
+ // 140
+ "Das war einmal der Reaktor.", // kStringReactorDescription
+ "D\201se", // kStringNozzle
+ "blauer K\201rbis", // kStringPumpkin
+ "Keine Ahnung, was das ist.", // kStringPumpkinDescription
+ "Landef\204hre", // kStringLandingModule
+ // 145
+ "Sie war eigentlich f\201r Bodenuntersuchungen|auf Arsano 3 gedacht.", // kStringLandingModuleDescription
+ "Sie f\201hrt nach drau\341en.", // kStringHatchDescription3
+ "Generator", // kStringGenerator
+ "Er versorgt das Raumschiff mit Strom.", // kStringGeneratorDescription
+ "Ein St\201ck Schrott.", // kStringScrapDescription3
+ // 150
+ "Es ist ein Sicherheitsknopf.|Er kann nur mit einem spitzen|Gegenstand gedr\201ckt werden.", // kSafetyButtonDescription
+ "Tastatur", // kStringKeyboard
+ "langes Kabel mit Stecker", // kStringGeneratorWire
+ "leere Kabelrolle", // kStringEmptySpool
+ "Keycard des Commanders", // kStringKeycard2
+ // 155
+ "Hey, das ist die Keycard des Commanders!|Er mu\341 sie bei dem \201berst\201rzten|Aufbruch verloren haben.", // kStringKeycard2Description
+ "Klappe", // kStringTrap
+ "Spannungmessger\204t", // kStringVoltmeter
+ "Klemme", // kStringClip
+ "Sie f\201hrt vom Generator zum Spannungmessger\204t.", // kStringWireDescription
+ // 160
+ "Stein", // kStringStone
+ "Loch", // kStringCaveOpening
+ "Es scheint eine H\224hle zu sein.", // kStringCaveOpeningDescription
+ "Hier bist du gerade hergekommen.", // kStringExitDescription
+ "H\224hle", // kStringCave
+ // 165
+ "Schild", // kStringSign
+ "Diese Schrift kannst du nicht lesen.", // kStringSignDescription
+ "Eingang", // kStringEntrance
+ "Stern", // kStringStar
+ "Raumschiff", // kStringSpaceshift
+ // 170
+ "Portier", // kStringPorter
+ "Du siehst doch selbst, wie er aussieht.", // kStringPorterDescription
+ "T\201r", // kStringDoor
+ "Kaugummi", // kStringChewingGum
+ "Gummib\204rchen", // kStringGummyBears
+ // 175
+ "Schokokugel", // kStringChocolateBall
+ "\232berraschungsei", // kStringEgg
+ "Lakritz", // kStringLiquorice
+ "Tablette", // kStringPill
+ "Die Plastikh\201lle zeigt einen|Mund mit einer Sprechblase. Was|darin steht, kannst du nicht lesen.", // kStringPillDescription
+ // 180
+ "Automat", // kStringVendingMachine
+ "Sieht aus wie ein Kaugummiautomat.", // kStringVendingMachineDescription
+ "Die Toiletten sind denen|auf der Erde sehr \204hnlich.", // kStringToiletDescription
+ "Treppe", // kStringStaircase
+ "M\201nzen", // kStringCoins
+ // 185
+ "Es sind seltsame|K\224pfe darauf abgebildet.", // kStringCoinsDescription
+ "Tablettenh\201lle", // kStringTabletPackage
+ "Darauf steht:\"Wenn Sie diese|Schrift jetzt lesen k\224nnen,|hat die Tablette gewirkt.\"", // kStringTabletPackageDescription
+ "Stuhl", // kStringChair
+ "Schuhe", // kStringShoes
+ // 190
+ "Wie ist der denn mit|Schuhen hier reingekommen?", // kStringShoesDescription
+ "Froschgesicht", // kStringFrogFace
+ "Gekritzel", // kStringScrible
+ "\"Mr Spock was here\"", // kStringScribleDescription
+ "Brieftasche", // kStringWallet
+ // 195
+ "Speisekarte", // kStringMenu
+ "\"Heute empfehlen wir:|Fonua Opra mit Ulk.\"", // kStringMenuDescription
+ "Tasse", // kStringCup
+ "Sie enth\204lt eine gr\201nliche Fl\201ssigkeit.", // kStringCupDescription
+ "10-Buckazoid-Schein", // kStringBill
+ // 200
+ "Nicht gerade sehr viel Geld.", // kStringBillDescription
+ "Keycard von Roger", // kStringKeycard3
+ "Anzeige", // kStringAnnouncement
+ "Hmm, seltsame Anzeigen.", // kStringAnnouncementDescription
+ "Roger W.", // kStringRoger
+ // 205
+ "Ufo", // kStringUfo
+ "Der Eingang scheint offen zu sein.", // kStringUfoDescription
+ "Tablett", // kStringTray
+ "Es ist irgendein Fra\341 und|etwas zu Trinken darauf.", // kStringTrayDescription
+ "Stange", // kStringLamp
+ // 210
+ "Es scheint eine Lampe zu sein.", // kStringLampDescription
+ "Augen", // kStringEyes
+ "Es ist nur ein Bild.", // kStringEyesDescription
+ "Sieht etwas anders aus als auf der Erde.", // kStringSocketDescription
+ "Metallblock", // kStringMetalBlock
+ // 215
+ "Er ist ziemlich schwer.", // kStringMetalBlockDescription
+ "Roboter", // kStringRobot
+ "Den hast du erledigt.", // kStringRobotDescription
+ "Tisch", // kStringTable
+ "Ein kleiner Metalltisch.", // kStringTableDescription
+ // 220
+ "Zellent\201r", // kStringCellDoor
+ "Hier warst du eingesperrt.", // kStringCellDoorDescription
+ "Laptop", // kStringLaptop
+ "Armbanduhr", // kStringWristwatch
+ "S\204ule", // kStringPillar
+ // 225
+ "Auf einem Schild an der T\201r steht \"Dr. Alab Hansi\".", // kStringDoorDescription1
+ "Auf einem Schild an der T\201r steht \"Saval Lun\".", // kStringDoorDescription2
+ "Auf einem Schild an der T\201r steht \"Prof. Dr. Ugnul Tschabb\".", // kStringDoorDescription3
+ "Auf einem Schild an der T\201r steht \"Alga Hurz Li\".", // kStringDoorDescription4
+ "Diese T\201r w\201rde ich lieber|nicht \224ffnen. Nach dem Schild zu|urteilen, ist jemand in dem Raum.", // kStringDontEnter
+ // 230
+ "Axacussaner", // kStringAxacussan
+ "Du m\201\341test ihn irgendwie ablenken.", // kStringAxacussanDescription
+ "Komisches Bild.", // kStringImageDescription2
+ "Karte", // kStringMastercard
+ "Darauf steht: \"Generalkarte\".", // kStringMastercardDescription
+ // 235
+ "Lampe", // kStringLamp2
+ "Seltsam!", // kStringGenericDescription5
+ "Geld", // kStringMoney
+ "Es sind 500 Xa.", // kStringMoneyDescription1
+ "Schließfach", // kStringLocker
+ // 240
+ "Es hat ein elektronisches Zahlenschlo\341.", // kStringLockerDescription
+ "Brief", // kStringLetter
+ "W\201rfel", // kStringCube
+ "Sonderbar!", // kStringGenericDescription6
+ "Affenstark!", // kStringGenericDescription7
+ // 245
+ "Komisches Ding", // kStringStrangeThing
+ "Wundersam", // kStringGenericDescription8
+ "Es ist ein Axacussanerkopf auf dem Bild.", // kStringImageDescription3
+ "Pflanze", // kStringPlant
+ "Figur", // kStringStatue
+ // 250
+ "Stark!", // kStringStatueDescription
+ "Sie ist den Pflanzen auf der Erde sehr ähnlich.", // kStringPlantDescription
+ "Er funktioniert nicht.", // kStringComputerDescription
+ "Graffiti", // kStringGraffiti
+ "Seltsamer B\201roschmuck!", // kStringGraffitiDescription
+ // 255
+ "Es sind 350 Xa.", // kStringMoneyDescription2
+ "Dschungel", // kStringJungle
+ "Lauter B\204ume.", // kStringJungleDescription
+ "^ E#N#D#E ...########", // kStringOutro1
+ "# ... des ersten Teils!########", // kStringOutro2
+ // 260
+ "#########", // kStringOutro3
+ "^Aber:#", // kStringOutro4
+ "Das Abenteuer geht weiter, ...##", // kStringOutro5
+ "... wenn Sie sich für 30,- DM registrieren lassen!##", // kStringOutro6
+ "(Falls Sie das nicht schon längst getan haben.)##", // kStringOutro7
+ // 265
+ "In^ Teil 2 - Der Doppelgänger^ erwarten Sie:##", // kStringOutro8
+ "Knifflige Puzzles,##", // kStringOutro9
+ "noch mehr Grafik und Sound,##", // kStringOutro10
+ "ein perfekt geplanter Museumseinbruch,##", // kStringOutro11
+ "das Virtual-Reality-Spiel \"Indiana Joe\"##", // kStringOutro12
+ // 270
+ "und vieles mehr!##", // kStringOutro13
+ "\233", // kStringOutro14
+ "Leitung mit Stecker", // kStringWireAndPlug
+ "Leitung mit L\201sterklemme", // kStringWireAndClip
+ "langes Kabel mit Stecker", // kStringWireAndPlug2
+ // 275
+ "Darauf steht:|\"Treffpunkt Galactica\".", // kStringSignDescription2
+ "M\201nze", // kStringCoin
+ "Darauf steht:|\"Zutritt nur f\201r Personal\".", // kStringDoorDescription5
+ "Darauf steht:|\"Toilette\".", // kStringDoorDescription6
+ "Es ist die Keycard des Commanders.", // kStringKeycard2Description2
+ // 280
+ "Kabelrolle mit L\201sterklemme", // kSringSpoolAndClip
"", //
"", //
"", //
"", //
- "", //
- // 135
+ // 285
"", //
"", //
"", //
"", //
"", //
- // 140
+ // 290
"", //
"", //
"", //
"", //
"", //
- // 145
+ // 295
"", //
"", //
"", //
"", //
"", //
- // 150
+ // 300
"", //
"", //
"", //
"", //
"", //
- // 155
+ // 305
"", //
"", //
"", //
"", //
"", //
- // 160
+ // 310
"", //
"", //
"", //
"", //
"", //
- // 165
+ // 315
"", //
"", //
"", //
"", //
"", //
- // 170
+ // 320
"", //
"", //
"", //
"", //
"", //
- // 175
+ // 325
"", //
"", //
"", //
"", //
"", //
- // 180
+ // 330
"", //
"", //
"", //
"", //
"", //
- // 185
+ // 335
"", //
"", //
"", //
"", //
"", //
+
NULL
};
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 403ba14..84c0864 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -401,25 +401,80 @@ enum ObjectID {
};
enum StringID {
- kCommandGo = 0, kCommandLook, kCommandTake, kCommandOpen, kCommandClose,
- kCommandPress, kCommandPull, kCommandUse, kCommandTalk, kCommandGive,
- kStatusCommandGo, kStatusCommandLook, kStatusCommandTake, kStatusCommandOpen, kStatusCommandClose,
- kStatusCommandPress, kStatusCommandPull, kStatusCommandUse, kStatusCommandTalk, kStatusCommandGive,
- kBroken, kIntro1, kIntro2, kIntro3, kIntro4,
- kIntro5, kIntro6, kIntro7, kIntro8, kIntro9,
- kIntro10, kIntro11, kIntro12, kIntro13, kKeycard,
- kKeycardDesc, kKnife, kKnifeDesc, kWatch, kDiscman,
- kDiscmanDesc
+ kNoString = -1,
+ // 0
+ kStringCommandGo = 0, kStringCommandLook, kStringCommandTake, kStringCommandOpen, kStringCommandClose,
+ kStringCommandPress, kStringCommandPull, kStringCommandUse, kStringCommandTalk, kStringCommandGive,
+ kStringStatusCommandGo, kStringStatusCommandLook, kStringStatusCommandTake, kStringStatusCommandOpen, kStringStatusCommandClose,
+ kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk, kStringStatusCommandGive,
+ kStringTitleVersion, kStringTitle1, kStringTitle2, kStringTitle3, kStringIntro1,
+ kStringIntro2, kStringIntro3, kStringIntro4, kStringIntro5, kStringIntro6,
+ kStringIntro7, kStringIntro8, kStringIntro9, kStringIntro10, kStringIntro11,
+ kStringIntro12, kStringIntro13, kStringBroken, kStringDefaultDescription, kStringTakeMessage,
+ kStringKeycard, kStringKeycardDescription, kStringKnife, kStringKnifeDescription, kStringWatch,
+ kStringDiscman, kStringDiscmanDescription, kStringHatch, kStringButton, kStringHatchButtonDescription,
+ // 50
+ kStringLadder, kStringExit, kStringCockpitHatchDescription, kStringKitchenHatchDescription, kStringStasisHatchDescription,
+ kStringStasisHatchDescription2, kStringSlot, kStringSlotDescription, kStringCorridor, kStringComputer,
+ kStringComputerPassword, kStringInstruments, kStringInstrumentsDescription1, kStringMonitor, kStringMonitorDescription,
+ kStringImage, kStringGenericDescription1, kStringGenericDescription2, kStringGenericDescription3, kStringGenericDescription4,
+ kStringMagnete, kStringMagneteDescription, kStringPen, kStringPenDescription, kStringShelf,
+ kStringCompartment, kStringSocket, kStringToilet, kStringPistol, kStringPistolDescription,
+ kStringBooks, kStringBooksDescription, kStringSpool, kStringSpoolDescription, kStringBook,
+ kStringUnderwear, kStringUnderwearDescription, kStringClothes, kStringJunk, kStringJunkDescription,
+ kStringFolders, kStringFoldersDescription, kStringPoster, kStringPosterDescription1, kStringPosterDescription2,
+ kStringSpeaker, kStringRecord, kStringRecordDescription, kStringRecordStand, kStringRecordStandDescription,
+ // 100
+ kStringTurntable, kStringTurntableDescription, kStringWire, kStringPlug, kStringImageDescription1,
+ kStringDrawingInstruments, kStringDrawingInstrumentsDescription, kStringChessGame, kStringChessGameDescription1, kStringTennisRacket,
+ kStringTennisRacketDescription, kStringTennisBall, kStringChessGameDescription2, kStringBed, kStringBedDescription,
+ kStringCompartmentDescription, kStringAlbums, kStringAlbumsDescription, kStringRope, kStringRopeDescription,
+ kStringShelfDescription, kStringClothesDescription, kStringSocks, kStringBookHitchhiker, kStringBathroom,
+ kStringBathroomDescription, kStringShower, kStringHatchDescription1, kStringHatchDescription2, kStringHelmet,
+ kStringHelmetDescription, kStringSuit, kStringSuitDescription, kStringLifeSupport, kStringLifeSupportDescription,
+ kStringScrap, kStringScrapDescription1, kStringTerminalStrip, kStringScrapDescription2, kStringReactor,
+ kStringReactorDescription, kStringNozzle, kStringPumpkin, kStringPumpkinDescription, kStringLandingModule,
+ kStringLandingModuleDescription, kStringHatchDescription3, kStringGenerator, kStringGeneratorDescription, kStringScrapDescription3,
+ // 150
+ kSafetyButtonDescription, kStringKeyboard, kStringGeneratorWire, kStringEmptySpool, kStringKeycard2,
+ kStringKeycard2Description, kStringTrap, kStringVoltmeter, kStringClip, kStringWireDescription,
+ kStringStone, kStringCaveOpening, kStringCaveOpeningDescription, kStringExitDescription, kStringCave,
+ kStringSign, kStringSignDescription, kStringEntrance, kStringStar, kStringSpaceshift,
+ kStringPorter, kStringPorterDescription, kStringDoor, kStringChewingGum, kStringGummyBears,
+ kStringChocolateBall, kStringEgg, kStringLiquorice, kStringPill, kStringPillDescription,
+ kStringVendingMachine, kStringVendingMachineDescription, kStringToiletDescription, kStringStaircase, kStringCoins,
+ kStringCoinsDescription, kStringTabletPackage, kStringTabletPackageDescription, kStringChair, kStringShoes,
+ kStringShoesDescription, kStringFrogFace, kStringScrible, kStringScribleDescription, kStringWallet,
+ kStringMenu, kStringMenuDescription, kStringCup, kStringCupDescription, kStringBill,
+ // 200
+ kStringBillDescription, kStringKeycard3, kStringAnnouncement, kStringAnnouncementDescription, kStringRoger,
+ kStringUfo, kStringUfoDescription, kStringTray, kStringTrayDescription, kStringLamp,
+ kStringLampDescription, kStringEyes, kStringEyesDescription, kStringSocketDescription, kStringMetalBlock,
+ kStringMetalBlockDescription, kStringRobot, kStringRobotDescription, kStringTable, kStringTableDescription,
+ kStringCellDoor, kStringCellDoorDescription, kStringLaptop, kStringWristwatch, kStringPillar,
+ kStringDoorDescription1, kStringDoorDescription2, kStringDoorDescription3, kStringDoorDescription4, kStringDontEnter,
+ kStringAxacussan, kStringAxacussanDescription, kStringImageDescription2, kStringMastercard, kStringMastercardDescription,
+ kStringLamp2, kStringGenericDescription5, kStringMoney, kStringMoneyDescription1, kStringLocker,
+ kStringLockerDescription, kStringLetter, kStringCube, kStringGenericDescription6, kStringGenericDescription7,
+ kStringStrangeThing, kStringGenericDescription8, kStringImageDescription3, kStringPlant, kStringStatue,
+ // 250
+ kStringStatueDescription, kStringPlantDescription, kStringComputerDescription, kStringGraffiti, kStringGraffitiDescription,
+ kStringMoneyDescription2, kStringJungle, kStringJungleDescription, kStringOutro1, kStringOutro2,
+ kStringOutro3, kStringOutro4, kStringOutro5, kStringOutro6, kStringOutro7,
+ kStringOutro8, kStringOutro9, kStringOutro10, kStringOutro11, kStringOutro12,
+ kStringOutro13, kStringOutro14, kStringWireAndPlug, kStringWireAndClip, kStringWireAndPlug2,
+ kStringSignDescription2, kStringCoin, kStringDoorDescription5, kStringDoorDescription6, kStringKeycard2Description2,
+ kSringSpoolAndClip
};
static StringID guiCommands[] = {
- kCommandGo, kCommandLook, kCommandTake, kCommandOpen, kCommandClose,
- kCommandPress, kCommandPull, kCommandUse, kCommandTalk, kCommandGive
+ kStringCommandGo, kStringCommandLook, kStringCommandTake, kStringCommandOpen, kStringCommandClose,
+ kStringCommandPress, kStringCommandPull, kStringCommandUse, kStringCommandTalk, kStringCommandGive
};
static StringID guiStatusCommands[] = {
- kStatusCommandGo, kStatusCommandLook, kStatusCommandTake, kStatusCommandOpen, kStatusCommandClose,
- kStatusCommandPress, kStatusCommandPull, kStatusCommandUse, kStatusCommandTalk, kStatusCommandGive
+ kStringStatusCommandGo, kStringStatusCommandLook, kStringStatusCommandTake, kStringStatusCommandOpen, kStringStatusCommandClose,
+ kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk, kStringStatusCommandGive
};
ObjectType operator|(ObjectType a, ObjectType b);
@@ -430,13 +485,11 @@ ObjectType &operator&=(ObjectType &a, ObjectType b);
ObjectType &operator^=(ObjectType &a, ObjectType b);
struct Object {
- static const char *const defaultDescription;
- static const char *const takeMessage;
static const Object nullObject;
Object()
- : _name("")
- , _description(Object::defaultDescription)
+ : _name(kNoString)
+ , _description(kStringDefaultDescription)
, _id(INVALIDOBJECT)
, _roomId(NULLROOM)
, _type(NULLTYPE)
@@ -446,7 +499,7 @@ struct Object {
, _exitRoom(NULLROOM)
, _direction(0)
{}
- Object(byte roomId, const char *name, const char *description, ObjectID id, ObjectType type,
+ Object(byte roomId, StringID name, StringID description, ObjectID id, ObjectType type,
byte click, byte click2, byte section = 0, RoomID exitRoom = NULLROOM, byte direction = 0)
: _name(name)
, _description(description)
@@ -491,8 +544,8 @@ struct Object {
}
byte _roomId;
- Common::String _name;
- Common::String _description;
+ StringID _name;
+ StringID _description;
ObjectID _id;
ObjectType _type;
byte _click;
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index f4a3084..b326840 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -43,11 +43,8 @@ bool Room::serialize(Common::WriteStream *out) {
out->writeSint32LE(numObjects);
for (int i = 0; i < numObjects; ++i) {
- out->writeUint32LE(_objectState[i]._name.size());
- out->writeString(_objectState[i]._name);
- out->writeUint32LE(_objectState[i]._description.size());
- out->writeString(_objectState[i]._description);
-
+ out->writeSint32LE(_objectState[i]._name);
+ out->writeSint32LE(_objectState[i]._description);
out->writeByte(_objectState[i]._roomId);
out->writeSint32LE(_objectState[i]._id);
out->writeSint32LE(_objectState[i]._type);
@@ -72,24 +69,9 @@ bool Room::deserialize(Common::ReadStream *in) {
_shown[i] = in->readByte();
int numObjects = in->readSint32LE();
- Common::SeekableReadStream *stream = NULL;
for (int i = 0; i < numObjects; ++i) {
- int stringLength = in->readUint32LE();
- if (stringLength) {
- stream = in->readStream(stringLength);
- _objectState[i]._name = stream->readLine();
- } else {
- _objectState[i]._name = "";
- }
-
- stringLength = in->readUint32LE();
- if (stringLength) {
- stream = in->readStream(stringLength);
- _objectState[i]._description = stream->readLine();
- } else {
- _objectState[i]._description = "";
- }
-
+ _objectState[i]._name = static_cast<StringID>(in->readSint32LE());
+ _objectState[i]._description = static_cast<StringID>(in->readSint32LE());
_objectState[i]._roomId = in->readByte();
_objectState[i]._id = static_cast<ObjectID>(in->readSint32LE());
_objectState[i]._type = static_cast<ObjectType>(in->readSint32LE());
@@ -105,6 +87,45 @@ bool Room::deserialize(Common::ReadStream *in) {
return !in->err();
}
+Intro::Intro(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = -1;
+ _id = INTRO;
+ _shown[0] = false;
+
+ _objectState[0] =
+ Object(_id, kStringKeycard, kStringKeycardDescription, KEYCARD,
+ TAKE | CARRIED | COMBINABLE, 255, 255, 0, NULLROOM, 0);
+ _objectState[1] =
+ Object(_id, kStringKnife, kStringKnifeDescription, KNIFE,
+ TAKE | CARRIED | COMBINABLE, 255, 255, 0, NULLROOM, 0);
+ _objectState[2] =
+ Object(_id, kStringWatch, kStringDefaultDescription, WATCH,
+ TAKE | COMBINABLE | CARRIED, 255, 255, 8, NULLROOM, 0);
+ _objectState[3] =
+ Object(_id, kStringDiscman, kStringDiscmanDescription, DISCMAN,
+ TAKE | COMBINABLE, 255, 255, 0, NULLROOM, 0);
+
+ _shouldExit = false;
+
+ introText =
+ _vm->getGameString(kStringIntro1) +
+ _vm->getGameString(kStringIntro2) +
+ _vm->getGameString(kStringIntro3) +
+ _vm->getGameString(kStringIntro4) +
+ _vm->getGameString(kStringIntro5) +
+ _vm->getGameString(kStringIntro6) +
+ _vm->getGameString(kStringIntro7) +
+ _vm->getGameString(kStringIntro8) +
+ _vm->getGameString(kStringIntro9) +
+ _vm->getGameString(kStringIntro10) +
+ _vm->getGameString(kStringIntro11) +
+ _vm->getGameString(kStringIntro12) +
+ _vm->getGameString(kStringIntro13);
+}
+
void Intro::onEntrance() {
_gm->_guiEnabled = false;
_vm->_allowSaveGame = false;
@@ -132,10 +153,10 @@ void Intro::titleScreen() {
while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
_gm->wait2(1);
titleFadeIn();
- _vm->renderText("V2.02", 295, 190, kColorWhite44);
- _vm->renderText("Teil 1:", 64, 120, kColorLightBlue);
- _vm->renderText("Das Schicksal", 44, 132, kColorWhite99);
- _vm->renderText("des Horst Hummel", 35, 142, kColorWhite99);
+ _vm->renderText(kStringTitleVersion, 295, 190, kColorWhite44);
+ _vm->renderText(kStringTitle1, 64, 120, kColorLightBlue);
+ _vm->renderText(kStringTitle2, 44, 132, kColorWhite99);
+ _vm->renderText(kStringTitle3, 35, 142, kColorWhite99);
_gm->wait2(1);
CursorMan.showMouse(true);
_vm->playSoundMod(kMusicIntro);
@@ -488,7 +509,7 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
input.toUppercase();
if (_gm->_key.keycode != Common::KEYCODE_ESCAPE) {
- if (input == _codeword_DE) {
+ if (input == _vm->getGameString(kStringComputerPassword)) {
_gm->great(6);
g_system->fillScreen(kColorDarkBlue);
_vm->renderText("Schlafdauer in Tagen:", 30, 85, kColorWhite99);
@@ -846,7 +867,7 @@ bool ShipCabinL3::interact(Action verb, Object &obj1, Object &obj2) {
if (isSectionVisible(10) && isSectionVisible(11)) {
_gm->drawImage(_gm->invertSection(10));
_gm->drawImage(_gm->invertSection(11));
- getObject(8)->_name = "Leitung mit Stecker";
+ getObject(8)->_name = kStringWireAndPlug;
_gm->takeObject(*getObject(8));
getObject(9)->_click = 255;
getObject(10)->_click = 255;
@@ -1035,9 +1056,9 @@ void ShipAirlock::onEntrance() {
bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
Room *room;
- if ((verb == ACTION_LOOK) && (obj1._id == SCRAP_LK) && (obj1._description != _descriptionScrap)) {
- _vm->renderMessage(obj1._description.c_str());
- obj1._description = _descriptionScrap;
+ if ((verb == ACTION_LOOK) && (obj1._id == SCRAP_LK) && (obj1._description != kStringScrapDescription3)) {
+ _vm->renderMessage(obj1._description);
+ obj1._description = kStringScrapDescription3;
_gm->takeObject(*getObject(2));
} else if (((verb == ACTION_OPEN) || (verb == ACTION_CLOSE)) &&
(obj1._id == OUTERHATCH_TOP)) {
@@ -1049,7 +1070,7 @@ bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, LANDINGMOD_HATCH)))
_vm->renderMessage("Das Kabel ist schon ganz|richtig an dieser Stelle.");
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, HOLD_WIRE)) {
- getObject(0)->_name = "Leitung mit L\201sterklemme";
+ getObject(0)->_name = kStringWireAndClip;
_gm->_inventory.remove(*getObject(2));
_gm->_state._terminalStripConnected = true;
_gm->_state._terminalStripWire = true;
@@ -1059,7 +1080,7 @@ bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage("Womit denn?");
else {
_gm->drawImage(5);
- getObject(0)->_name = "langes Kabel mit Stecker";
+ getObject(0)->_name = kStringWireAndPlug2;
getObject(0)->_click = 10;
room = _gm->_rooms[CABIN_L2];
_gm->_inventory.remove(*getObject(9));
@@ -1095,7 +1116,7 @@ void ShipHold::onEntrance() {
bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
Room *r;
if ((verb == ACTION_PRESS) && (obj1._id == LANDINGMOD_BUTTON))
- _vm->renderMessage(obj1._description.c_str());
+ _vm->renderMessage(obj1._description);
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, PEN, LANDINGMOD_BUTTON)) {
if (_gm->_state._landingModuleEnergyDaysLeft) {
r = _gm->_rooms[GENERATOR];
@@ -1153,7 +1174,7 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage("An dem Kabel ist doch gar kein Stecker.");
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, TERMINALSTRIP)) {
_gm->drawImage(11);
- getObject(4)->_name = "Leitung mit L\201sterklemme";
+ getObject(4)->_name = kStringWireAndClip;
r = _gm->_rooms[HOLD];
_gm->_inventory.remove(*r->getObject(2));
_gm->_state._terminalStripConnected = true;
@@ -1163,7 +1184,7 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage("Womit denn?");
else {
_gm->drawImage(5);
- getObject(4)->_name = "langes Kabel mit Stecker";
+ getObject(4)->_name = kStringWireAndPlug2;
getObject(4)->_click = 6;
_gm->_inventory.remove(*_gm->_rooms[CABIN_L2]->getObject(9));
}
@@ -1429,7 +1450,7 @@ bool ArsanoMeetup::interact(Action verb, Object &obj1, Object &obj2) {
if (_gm->_state._language == 2)
_vm->renderMessage("Komisch! Auf einmal kannst du|das Schild lesen! Darauf steht:|\"Treffpunkt Galactica\".");
- obj1._description = "Darauf steht:|\"Treffpunkt Galactica\".";
+ obj1._description = kStringSignDescription2;
if (_gm->_state._language == 1)
return false;
@@ -1632,7 +1653,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
getObject(8 - _gm->_state._coins)->_click = 7;
--_gm->_state._coins;
if (_gm->_state._coins == 1) {
- getObject(16)->_name = "M\201nze";
+ getObject(16)->_name = kStringCoin;
}
if (_gm->_state._coins == 0) {
_gm->_inventory.remove(*getObject(16));
@@ -1642,14 +1663,14 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_LOOK) && (obj1._id == KITCHEN_SIGN) && _gm->_state._language) {
if (_gm->_state._language == 2)
_vm->renderMessage("Komisch! Auf einmal kannst du|das Schild lesen! Darauf steht:|\"Zutritt nur f\201r Personal\".");
- obj1._description = "Darauf steht:|\"Zutritt nur f\201r Personal\".";
+ obj1._description = kStringDoorDescription5;
if (_gm->_state._language == 1)
return false;
_gm->_state._language = 1;
} else if ((verb == ACTION_LOOK) && (obj1._id == BATHROOM_SIGN) && _gm->_state._language) {
if (_gm->_state._language == 2)
_vm->renderMessage("Komisch! Auf einmal kannst|du das Schild lesen!|Darauf steht:\"Toilette\".");
- obj1._description = "Darauf steht:|\"Toilette\".";
+ obj1._description = kStringDoorDescription6;
if (_gm->_state._language == 1)
return false;
_gm->_state._language = 1;
@@ -2670,11 +2691,11 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
} else if (((verb == ACTION_WALK) || ((verb == ACTION_OPEN) && !obj1.hasProperty(OPENED))) &&
(obj1._id >= DOOR1) && (obj1._id <= DOOR4) &&
obj1.hasProperty(OCCUPIED)) {
- _vm->renderMessage(_dontEnter.c_str());
+ _vm->renderMessage(kStringDontEnter);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR1) &&
!getObject(4)->hasProperty(OPENED)) {
if (getObject(4)->hasProperty(OCCUPIED))
- _vm->renderMessage(_dontEnter.c_str());
+ _vm->renderMessage(kStringDontEnter);
else {
_gm->drawImage(1);
_vm->playSound(kAudioDoorOpen);
@@ -2685,7 +2706,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR2) &&
!getObject(5)->hasProperty(OPENED)) {
if (getObject(5)->hasProperty(OCCUPIED)) {
- _vm->renderMessage(_dontEnter.c_str());
+ _vm->renderMessage(kStringDontEnter);
} else {
_gm->drawImage(2);
_vm->playSound(kAudioDoorOpen);
@@ -2696,7 +2717,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR3) &&
!getObject(6)->hasProperty(OPENED)) {
if (getObject(6)->hasProperty(OCCUPIED)) {
- _vm->renderMessage(_dontEnter.c_str());
+ _vm->renderMessage(kStringDontEnter);
} else {
_gm->drawImage(3);
_vm->playSound(kAudioDoorOpen);
@@ -2707,7 +2728,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR4) &&
!getObject(7)->hasProperty(OPENED)) {
if (getObject(7)->hasProperty(OCCUPIED)) {
- _vm->renderMessage(_dontEnter.c_str());
+ _vm->renderMessage(kStringDontEnter);
} else {
_gm->drawImage(4);
_vm->playSound(kAudioDoorOpen);
@@ -2757,7 +2778,7 @@ bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
_vm->playSound(kAudioUndef2);
} else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
if (isSectionVisible(4))
- _vm->renderMessage(kBroken);
+ _vm->renderMessage(kStringBroken);
else
_gm->telomat(0);
} else if (((verb == ACTION_OPEN) || (verb == ACTION_USE)) &&
@@ -2840,7 +2861,7 @@ bool AxacussOffice2::interact(Action verb, Object &obj1, Object &obj2) {
_vm->playSound(kAudioUndef2);
} else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
if (isSectionVisible(4))
- _vm->renderMessage(kBroken);
+ _vm->renderMessage(kStringBroken);
else
_gm->telomat(1);
} else
@@ -2865,7 +2886,7 @@ bool AxacussOffice3::interact(Action verb, Object &obj1, Object &obj2) {
_vm->playSound(kAudioUndef2);
} else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
if (isSectionVisible(4))
- _vm->renderMessage(kBroken);
+ _vm->renderMessage(kStringBroken);
else
_gm->telomat(2);
} else if ((verb == ACTION_LOOK) && (obj1._id == PAINTING)) {
@@ -2894,7 +2915,7 @@ bool AxacussOffice4::interact(Action verb, Object &obj1, Object &obj2) {
_vm->playSound(kAudioUndef2);
} else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
if (isSectionVisible(4))
- _vm->renderMessage(kBroken);
+ _vm->renderMessage(kStringBroken);
else
_gm->telomat(3);
} else
@@ -3028,6 +3049,31 @@ bool AxacussSign::interact(Action verb, Object &obj1, Object &obj2) {
return false;
}
+Outro::Outro(SupernovaEngine *vm, GameManager *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = -1;
+ _id = OUTRO;
+ _shown[0] = false;
+
+ outroText =
+ _vm->getGameString(kStringOutro1) +
+ _vm->getGameString(kStringOutro2) +
+ _vm->getGameString(kStringOutro3) +
+ _vm->getGameString(kStringOutro4) +
+ _vm->getGameString(kStringOutro5) +
+ _vm->getGameString(kStringOutro6) +
+ _vm->getGameString(kStringOutro7) +
+ _vm->getGameString(kStringOutro8) +
+ _vm->getGameString(kStringOutro9) +
+ _vm->getGameString(kStringOutro10) +
+ _vm->getGameString(kStringOutro11) +
+ _vm->getGameString(kStringOutro12) +
+ _vm->getGameString(kStringOutro13) +
+ _vm->getGameString(kStringOutro14);
+}
+
void Outro::onEntrance() {
}
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 0ad7468..9b8b4e2 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -88,44 +88,7 @@ private:
// Room 0
class Intro : public Room {
public:
- Intro(SupernovaEngine *vm, GameManager *gm) {
- _vm = vm;
- _gm = gm;
-
- _fileNumber = -1;
- _id = INTRO;
- _shown[0] = false;
-
- _objectState[0] =
- Object(_id, "Keycard", "Die Keycard f\224r deine Schr\204nke.", KEYCARD,
- TAKE | CARRIED | COMBINABLE, 255, 255, 0, NULLROOM, 0);
- _objectState[1] =
- Object(_id, "Taschenmesser", "Es ist nicht mehr das sch\204rfste.", KNIFE,
- TAKE | CARRIED | COMBINABLE, 255, 255, 0, NULLROOM, 0);
- _objectState[2] =
- Object(_id, "Armbanduhr", Object::defaultDescription, WATCH,
- TAKE | COMBINABLE | CARRIED, 255, 255, 8, NULLROOM, 0);
- _objectState[3] =
- Object(_id, "Discman", "Es ist eine \"Mad Monkeys\"-CD darin.", DISCMAN,
- TAKE | COMBINABLE, 255, 255, 0, NULLROOM, 0);
-
- _shouldExit = false;
-
- introText = "^(C) 1994 Thomas und Steffen Dingel#"
- "Story und Grafik:^ Thomas Dingel#"
- "Programmierung:^ Steffen Dingel#"
- "Musik:^ Bernd Hoffmann#"
- "Getestet von ...#"
- "^Matthias Neef#"
- "^Sascha Otterbach#"
- "^Thomas Mazzoni#"
- "^Matthias Klein#"
- "^Gerrit Rothmaier#"
- "^Thomas Hassler#"
- "^Rene Koch#"
- "°";
- }
-
+ Intro(SupernovaEngine *vm, GameManager *gm);
virtual void onEntrance();
private:
@@ -159,16 +122,16 @@ public:
_shown[3] = false;
_shown[4] = true;
- _objectState[0] = Object(_id, "Luke", Object::defaultDescription, HATCH1, OPENABLE | EXIT, 0, 6, 1, CABIN_L1, 15);
- _objectState[1] = Object(_id, "Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | EXIT, 1, 7, 2, CABIN_L2, 10);
- _objectState[2] = Object(_id, "Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | EXIT, 2, 8, 3, CABIN_L3, 5);
- _objectState[3] = Object(_id, "Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | EXIT, 5, 11, 6, CABIN_R1, 19);
- _objectState[4] = Object(_id, "Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | EXIT, 4, 10, 5, CABIN_R2, 14);
- _objectState[5] = Object(_id, "Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | EXIT | OPENED, 9, 3, 4, CABIN_R3, 9);
- _objectState[6] = Object(_id, "Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | CLOSED | EXIT, 12, 12, 0, AIRLOCK, 2);
- _objectState[7] = Object(_id, "Knopf", "Er geh\224rt zu der gro\341en Luke.", BUTTON, PRESS, 13, 13, 0, NULLROOM, 0);
- _objectState[8] = Object(_id, "Leiter", Object::defaultDescription, NULLOBJECT, NULLTYPE, 14, 14, 0, NULLROOM, 0);
- _objectState[9] = Object(_id, "Ausgang", Object::defaultDescription, NULLOBJECT, EXIT, 15, 15, 0, HALL, 22);
+ _objectState[0] = Object(_id, kStringHatch, kStringDefaultDescription, HATCH1, OPENABLE | EXIT, 0, 6, 1, CABIN_L1, 15);
+ _objectState[1] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | EXIT, 1, 7, 2, CABIN_L2, 10);
+ _objectState[2] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | EXIT, 2, 8, 3, CABIN_L3, 5);
+ _objectState[3] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | EXIT, 5, 11, 6, CABIN_R1, 19);
+ _objectState[4] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | EXIT, 4, 10, 5, CABIN_R2, 14);
+ _objectState[5] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | EXIT | OPENED, 9, 3, 4, CABIN_R3, 9);
+ _objectState[6] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | CLOSED | EXIT, 12, 12, 0, AIRLOCK, 2);
+ _objectState[7] = Object(_id, kStringButton, kStringHatchButtonDescription, BUTTON, PRESS, 13, 13, 0, NULLROOM, 0);
+ _objectState[8] = Object(_id, kStringLadder, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 14, 14, 0, NULLROOM, 0);
+ _objectState[9] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 15, 15, 0, HALL, 22);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -184,12 +147,12 @@ public:
_id = HALL;
_shown[0] = true;
- _objectState[0] = Object(_id, "Luke", "Sie f\204hrt ins Cockpit.", NULLOBJECT, OPENABLE | EXIT, 4, 5, 1, COCKPIT, 10);
- _objectState[1] = Object(_id, "Luke", "Sie f\204hrt zur K\201che.", KITCHEN_HATCH, OPENABLE | EXIT, 0, 0, 0, NULLROOM, 1);
- _objectState[2] = Object(_id, "Luke", "Sie f\204hrt zu den Tiefschlafkammern.", NULLOBJECT, OPENABLE | CLOSED | EXIT, 1, 1, 2, SLEEP, 8);
- _objectState[3] = Object(_id, "Schlitz", "Es ist ein Keycard-Leser.", SLEEP_SLOT, COMBINABLE, 2, 2, 0, NULLROOM, 0);
- _objectState[4] = Object(_id, "Leiter", Object::defaultDescription, NULLOBJECT, NULLTYPE, 3, SLEEP, 0, NULLROOM, 0);
- _objectState[5] = Object(_id, "Gang", Object::defaultDescription, NULLOBJECT, EXIT, 6, 6, 0, CORRIDOR, 19);
+ _objectState[0] = Object(_id, kStringHatch, kStringCockpitHatchDescription, NULLOBJECT, OPENABLE | EXIT, 4, 5, 1, COCKPIT, 10);
+ _objectState[1] = Object(_id, kStringHatch, kStringKitchenHatchDescription, KITCHEN_HATCH, OPENABLE | EXIT, 0, 0, 0, NULLROOM, 1);
+ _objectState[2] = Object(_id, kStringHatch, kStringStasisHatchDescription, NULLOBJECT, OPENABLE | CLOSED | EXIT, 1, 1, 2, SLEEP, 8);
+ _objectState[3] = Object(_id, kStringSlot, kStringSlotDescription, SLEEP_SLOT, COMBINABLE, 2, 2, 0, NULLROOM, 0);
+ _objectState[4] = Object(_id, kStringLadder, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 3, SLEEP, 0, NULLROOM, 0);
+ _objectState[5] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 6, 6, 0, CORRIDOR, 19);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -205,13 +168,10 @@ public:
_id = SLEEP;
_shown[0] = true;
- _objectState[0] = Object(_id, "Luke", "Dies ist eine der Tiefschlafkammern.", CABINS, NULLTYPE, 0, 0, 0, NULLROOM, 0);
- _objectState[1] = Object(_id, "Luke", "Dies ist eine der Tiefschlafkammern.", CABIN, NULLTYPE, 1, 1, 0, NULLROOM, 0);
- _objectState[2] = Object(_id, "Computer", Object::defaultDescription, COMPUTER, NULLTYPE, 2, 2, 0, NULLROOM, 0);
- _objectState[3] = Object(_id, "Ausgang", Object::defaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL, 22);
-
- _codeword_DE = "ZWEIUNDVIERZIG";
- _codeword_EN = "FORTYTWO";
+ _objectState[0] = Object(_id, kStringHatch, kStringStasisHatchDescription2, CABINS, NULLTYPE, 0, 0, 0, NULLROOM, 0);
+ _objectState[1] = Object(_id, kStringHatch, kStringStasisHatchDescription2, CABIN, NULLTYPE, 1, 1, 0, NULLROOM, 0);
+ _objectState[2] = Object(_id, kStringComputer, kStringDefaultDescription, COMPUTER, NULLTYPE, 2, 2, 0, NULLROOM, 0);
+ _objectState[3] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL, 22);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -219,8 +179,6 @@ public:
virtual void onEntrance();
private:
- Common::String _codeword_DE;
- Common::String _codeword_EN;
byte _color;
};
@@ -234,10 +192,10 @@ public:
_id = COCKPIT;
_shown[0] = true;
- _objectState[0] = Object(_id, "Instrumente", "Hmm, sieht ziemlich kompliziert aus.", INSTRUMENTS, NULLTYPE, 2, 2, 0, NULLROOM, 0);
- _objectState[1] = Object(_id, "Monitor", Object::defaultDescription, MONITOR, NULLTYPE, 0, 0, 0, NULLROOM, 0);
- _objectState[2] = Object(_id, "Monitor", "Dieser Monitor sagt dir nichts.", NULLOBJECT, TAKE, 1, 0, 0, NULLROOM, 0);
- _objectState[3] = Object(_id, "Ausgang", Object::defaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL, 22);
+ _objectState[0] = Object(_id, kStringInstruments, kStringInstrumentsDescription1, INSTRUMENTS, NULLTYPE, 2, 2, 0, NULLROOM, 0);
+ _objectState[1] = Object(_id, kStringMonitor, kStringDefaultDescription, MONITOR, NULLTYPE, 0, 0, 0, NULLROOM, 0);
+ _objectState[2] = Object(_id, kStringMonitor, kStringMonitorDescription, NULLOBJECT, TAKE, 1, 0, 0, NULLROOM, 0);
+ _objectState[3] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL, 22);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -263,18 +221,18 @@ public:
_shown[4] = true;
_shown[5] = true;
- _objectState[0] = Object(_id, "Bild", "Herb!", NULLOBJECT, UNNECESSARY, 5, 5, 0, NULLROOM, 0);
- _objectState[1] = Object(_id, "Bild", "Toll!", NULLOBJECT, UNNECESSARY, 6, 6, 0, NULLROOM, 0);
- _objectState[2] = Object(_id, "Bild", "Genial!", NULLOBJECT, UNNECESSARY, 7, 7, 0, NULLROOM, 0);
- _objectState[3] = Object(_id, "Magnete", "Damit werden Sachen auf|dem Tisch festgehalten.", NULLOBJECT, UNNECESSARY, 8, 8, 0, NULLROOM, 0);
- _objectState[4] = Object(_id, "Bild", "Es scheint noch nicht fertig zu sein.", NULLOBJECT, UNNECESSARY, 9, 9, 0);
- _objectState[5] = Object(_id, "Stift", "Ein Kugelschreiber.", PEN, TAKE | COMBINABLE, 10, 10, 5 | 128);
- _objectState[6] = Object(_id, "Luke", Object::defaultDescription, NULLOBJECT, OPENABLE | OPENED | EXIT, 3, 3, 24 | 128, CORRIDOR, 9);
- _objectState[7] = Object(_id, "Schlitz", "Es ist ein Keycard-Leser.", NULLOBJECT, COMBINABLE, 0, 0, 0);
- _objectState[8] = Object(_id, "Schrank", Object::defaultDescription, NULLOBJECT, OPENABLE | CLOSED, 1, 1, 0);
- _objectState[9] = Object(_id, "Fach", Object::defaultDescription, NULLOBJECT, OPENABLE | CLOSED, 2, 2, 0);
- _objectState[10] = Object(_id, "Steckdose", Object::defaultDescription, SOCKET, COMBINABLE, 4, 4, 0);
- _objectState[11] = Object(_id, "Toilette", Object::defaultDescription, BATHROOM_DOOR, EXIT, 255, 255, 0, BATHROOM, 22);
+ _objectState[0] = Object(_id, kStringImage, kStringGenericDescription1, NULLOBJECT, UNNECESSARY, 5, 5, 0, NULLROOM, 0);
+ _objectState[1] = Object(_id, kStringImage, kStringGenericDescription2, NULLOBJECT, UNNECESSARY, 6, 6, 0, NULLROOM, 0);
+ _objectState[2] = Object(_id, kStringImage, kStringGenericDescription3, NULLOBJECT, UNNECESSARY, 7, 7, 0, NULLROOM, 0);
+ _objectState[3] = Object(_id, kStringMagnete, kStringMagneteDescription, NULLOBJECT, UNNECESSARY, 8, 8, 0, NULLROOM, 0);
+ _objectState[4] = Object(_id, kStringImage, kStringGenericDescription4, NULLOBJECT, UNNECESSARY, 9, 9, 0);
+ _objectState[5] = Object(_id, kStringPen, kStringPenDescription, PEN, TAKE | COMBINABLE, 10, 10, 5 | 128);
+ _objectState[6] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | OPENED | EXIT, 3, 3, 24 | 128, CORRIDOR, 9);
+ _objectState[7] = Object(_id, kStringSlot, kStringSlotDescription, NULLOBJECT, COMBINABLE, 0, 0, 0);
+ _objectState[8] = Object(_id, kStringShelf, kStringDefaultDescription, NULLOBJECT, OPENABLE | CLOSED, 1, 1, 0);
+ _objectState[9] = Object(_id, kStringCompartment, kStringDefaultDescription, NULLOBJECT, OPENABLE | CLOSED, 2, 2, 0);
+ _objectState[10] = Object(_id, kStringSocket, kStringDefaultDescription, SOCKET, COMBINABLE, 4, 4, 0);
+ _objectState[11] = Object(_id, kStringToilet, kStringDefaultDescription, BATHROOM_DOOR, EXIT, 255, 255, 0, BATHROOM, 22);
}
};
@@ -304,31 +262,31 @@ public:
_shown[15] = false;
_shown[16] = true;
- _objectState[0] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",SLOT_KL1,COMBINABLE,31,31,0);
- _objectState[1] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",SLOT_KL2,COMBINABLE,32,32,0);
- _objectState[2] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",SLOT_KL3,COMBINABLE,33,33,0);
- _objectState[3] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",SLOT_KL4,COMBINABLE,45,45,0);
- _objectState[4] = Object(_id, "Schrank",Object::defaultDescription,SHELF_L1,OPENABLE | CLOSED,25,26,17);
- _objectState[5] = Object(_id, "Pistole","Es ist keine Munition drin.",PISTOL,TAKE,39,39,20);
- _objectState[6] = Object(_id, "Fach",Object::defaultDescription,SHELF_L2,OPENABLE | CLOSED,27,28,18);
- _objectState[7] = Object(_id, "B\201cher","Lauter wissenschaftliche B\201cher.",NULLOBJECT,UNNECESSARY,40,40,0);
- _objectState[8] = Object(_id, "Fach",Object::defaultDescription,SHELF_L3,OPENABLE | CLOSED,29,30,19);
- _objectState[9] = Object(_id, "Kabelrolle","Da sind mindestens zwanzig Meter drauf.", SPOOL,TAKE | COMBINABLE,41,41,21);
- _objectState[10] = Object(_id, "Fach",Object::defaultDescription,SHELF_L4,OPENABLE | CLOSED,43,44,22);
- _objectState[11] = Object(_id, "Buch",Object::defaultDescription,BOOK2,TAKE,46,46,23);
- _objectState[12] = Object(_id, "Unterw\204sche","Ich habe keine Lust, in|der Unterw\204sche des|Commanders rumzuw\201hlen.",NULLOBJECT,UNNECESSARY,34,34,0);
- _objectState[13] = Object(_id, "Unterw\204sche","Ich habe keine Lust, in|der Unterw\204sche des|Commanders rumzuw\201hlen.",NULLOBJECT,UNNECESSARY,35,35,0);
- _objectState[14] = Object(_id, "Kleider",Object::defaultDescription,NULLOBJECT,UNNECESSARY,36,36,0);
- _objectState[15] = Object(_id, "Krimskram","Es ist nichts brauchbares dabei.",NULLOBJECT,UNNECESSARY,37,37,0);
- _objectState[16] = Object(_id, "Krimskram","Es ist nichts brauchbares dabei.",NULLOBJECT,UNNECESSARY,38,38,0);
- _objectState[17] = Object(_id, "Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",NULLOBJECT,UNNECESSARY,23,23,0);
- _objectState[18] = Object(_id, "Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
- _objectState[19] = Object(_id, "Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,24 | 128,CORRIDOR,9);
- _objectState[20] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
- _objectState[21] = Object(_id, "Schrank",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
- _objectState[22] = Object(_id, "Fach",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
- _objectState[23] = Object(_id, "Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
- _objectState[24] = Object(_id, "Ordner","Darauf steht \"Dienstanweisungen|zur Mission Supernova\".|Es steht nichts wichtiges drin.",NULLOBJECT,UNNECESSARY,49,49,0);
+ _objectState[0] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_KL1,COMBINABLE,31,31,0);
+ _objectState[1] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_KL2,COMBINABLE,32,32,0);
+ _objectState[2] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_KL3,COMBINABLE,33,33,0);
+ _objectState[3] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_KL4,COMBINABLE,45,45,0);
+ _objectState[4] = Object(_id, kStringShelf,kStringDefaultDescription,SHELF_L1,OPENABLE | CLOSED,25,26,17);
+ _objectState[5] = Object(_id, kStringPistol,kStringPistolDescription,PISTOL,TAKE,39,39,20);
+ _objectState[6] = Object(_id, kStringCompartment,kStringDefaultDescription,SHELF_L2,OPENABLE | CLOSED,27,28,18);
+ _objectState[7] = Object(_id, kStringBooks,kStringBooksDescription,NULLOBJECT,UNNECESSARY,40,40,0);
+ _objectState[8] = Object(_id, kStringCompartment,kStringDefaultDescription,SHELF_L3,OPENABLE | CLOSED,29,30,19);
+ _objectState[9] = Object(_id, kStringSpool,kStringSpoolDescription, SPOOL,TAKE | COMBINABLE,41,41,21);
+ _objectState[10] = Object(_id, kStringCompartment,kStringDefaultDescription,SHELF_L4,OPENABLE | CLOSED,43,44,22);
+ _objectState[11] = Object(_id, kStringBook,kStringDefaultDescription,BOOK2,TAKE,46,46,23);
+ _objectState[12] = Object(_id, kStringUnderwear,kStringUnderwearDescription,NULLOBJECT,UNNECESSARY,34,34,0);
+ _objectState[13] = Object(_id, kStringUnderwear,kStringUnderwearDescription,NULLOBJECT,UNNECESSARY,35,35,0);
+ _objectState[14] = Object(_id, kStringClothes,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,36,36,0);
+ _objectState[15] = Object(_id, kStringJunk,kStringJunkDescription,NULLOBJECT,UNNECESSARY,37,37,0);
+ _objectState[16] = Object(_id, kStringJunk,kStringJunkDescription,NULLOBJECT,UNNECESSARY,38,38,0);
+ _objectState[17] = Object(_id, kStringMagnete,kStringMagneteDescription,NULLOBJECT,UNNECESSARY,23,23,0);
+ _objectState[18] = Object(_id, kStringToilet,kStringDefaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
+ _objectState[19] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,24 | 128,CORRIDOR,9);
+ _objectState[20] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
+ _objectState[21] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
+ _objectState[22] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
+ _objectState[23] = Object(_id, kStringSocket,kStringDefaultDescription,SOCKET,COMBINABLE,4,4,0);
+ _objectState[24] = Object(_id, kStringFolders,kStringFoldersDescription,NULLOBJECT,UNNECESSARY,49,49,0);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -356,23 +314,23 @@ public:
_shown[11] = false;
_shown[12] = true;
- _objectState[0] = Object(_id, "Poster","Ein Poster von \"Big Boss\".",NULLOBJECT,UNNECESSARY,11,11,0);
- _objectState[1] = Object(_id, "Poster","Ein Poster von \"Rock Desaster\".",NULLOBJECT,UNNECESSARY,12,12,0);
- _objectState[2] = Object(_id, "Box",Object::defaultDescription,NULLOBJECT,NULLTYPE,13,13,0);
- _objectState[3] = Object(_id, "Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",NULLOBJECT,UNNECESSARY,14,14,0);
- _objectState[4] = Object(_id, "Schallplatte","Die Platte ist von \"Big Boss\".",RECORD,TAKE | COMBINABLE,15,15,8 | 128);
- _objectState[5] = Object(_id, "Schallplattenst\204nder","Du hast jetzt keine Zeit, in|der Plattensammlung rumzust\224bern.",NULLOBJECT,UNNECESSARY,16,16,0);
- _objectState[6] = Object(_id, "Knopf",Object::defaultDescription,TURNTABLE_BUTTON,PRESS,22,22,0);
- _objectState[7] = Object(_id, "Plattenspieler","Sieht aus, als k�me|er aus dem Museum.",TURNTABLE,UNNECESSARY | COMBINABLE,17,17,0);
- _objectState[8] = Object(_id, "Leitung",Object::defaultDescription,WIRE,COMBINABLE,18,18,0);
- _objectState[9] = Object(_id, "Leitung",Object::defaultDescription,WIRE2,COMBINABLE,19,19,0);
- _objectState[10] = Object(_id, "Stecker",Object::defaultDescription,PLUG,COMBINABLE,20,20,0);
- _objectState[11] = Object(_id, "Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,24 | 128,CORRIDOR,9);
- _objectState[12] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
- _objectState[13] = Object(_id, "Schrank",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
- _objectState[14] = Object(_id, "Fach",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
- _objectState[15] = Object(_id, "Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
- _objectState[16] = Object(_id, "Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
+ _objectState[0] = Object(_id, kStringPoster,kStringPosterDescription1,NULLOBJECT,UNNECESSARY,11,11,0);
+ _objectState[1] = Object(_id, kStringPoster,kStringPosterDescription2,NULLOBJECT,UNNECESSARY,12,12,0);
+ _objectState[2] = Object(_id, kStringSpeaker,kStringDefaultDescription,NULLOBJECT,NULLTYPE,13,13,0);
+ _objectState[3] = Object(_id, kStringMagnete,kStringMagneteDescription,NULLOBJECT,UNNECESSARY,14,14,0);
+ _objectState[4] = Object(_id, kStringRecord,kStringRecordDescription,RECORD,TAKE | COMBINABLE,15,15,8 | 128);
+ _objectState[5] = Object(_id, kStringRecordStand,kStringRecordStandDescription,NULLOBJECT,UNNECESSARY,16,16,0);
+ _objectState[6] = Object(_id, kStringButton,kStringDefaultDescription,TURNTABLE_BUTTON,PRESS,22,22,0);
+ _objectState[7] = Object(_id, kStringTurntable,kStringTurntableDescription,TURNTABLE,UNNECESSARY | COMBINABLE,17,17,0);
+ _objectState[8] = Object(_id, kStringWire,kStringDefaultDescription,WIRE,COMBINABLE,18,18,0);
+ _objectState[9] = Object(_id, kStringWire,kStringDefaultDescription,WIRE2,COMBINABLE,19,19,0);
+ _objectState[10] = Object(_id, kStringPlug,kStringDefaultDescription,PLUG,COMBINABLE,20,20,0);
+ _objectState[11] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,24 | 128,CORRIDOR,9);
+ _objectState[12] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
+ _objectState[13] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
+ _objectState[14] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
+ _objectState[15] = Object(_id, kStringSocket,kStringDefaultDescription,SOCKET,COMBINABLE,4,4,0);
+ _objectState[16] = Object(_id, kStringToilet,kStringDefaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -390,15 +348,15 @@ public:
_shown[1] = true;
_shown[2] = true;
- _objectState[0] = Object(_id, "Bild","Manche Leute haben schon|einen komischen Geschmack.",NULLOBJECT,UNNECESSARY,5,5,0);
- _objectState[1] = Object(_id, "Zeichenger\204te","Auf dem Zettel sind lauter|unverst\204ndliche Skizzen und Berechnungen.|(Jedenfalls f\201r dich unverst\204ndlich.)",NULLOBJECT,UNNECESSARY,6,6,0);
- _objectState[2] = Object(_id, "Magnete","Damit werden Sachen auf|dem Tisch festgehalten.",NULLOBJECT,UNNECESSARY,7,7,0);
- _objectState[3] = Object(_id, "Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
- _objectState[4] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
- _objectState[5] = Object(_id, "Schrank",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
- _objectState[6] = Object(_id, "Fach",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
- _objectState[7] = Object(_id, "Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
- _objectState[8] = Object(_id, "Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
+ _objectState[0] = Object(_id, kStringImage,kStringImageDescription1,NULLOBJECT,UNNECESSARY,5,5,0);
+ _objectState[1] = Object(_id, kStringDrawingInstruments,kStringDrawingInstrumentsDescription,NULLOBJECT,UNNECESSARY,6,6,0);
+ _objectState[2] = Object(_id, kStringMagnete,kStringMagneteDescription,NULLOBJECT,UNNECESSARY,7,7,0);
+ _objectState[3] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
+ _objectState[4] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
+ _objectState[5] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
+ _objectState[6] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
+ _objectState[7] = Object(_id, kStringSocket,kStringDefaultDescription,SOCKET,COMBINABLE,4,4,0);
+ _objectState[8] = Object(_id, kStringToilet,kStringDefaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
}
};
@@ -417,15 +375,15 @@ public:
_shown[4] = true;
_shown[5] = true;
- _objectState[0] = Object(_id, "Schachspiel","Es macht wohl Spa\341, an|der Decke Schach zu spielen.",NULLOBJECT,UNNECESSARY,11,11,0);
- _objectState[1] = Object(_id, "Tennisschl\204ger","Fliegt Boris Becker auch mit?",NULLOBJECT,UNNECESSARY,8,8,0);
- _objectState[2] = Object(_id, "Tennisball","Toll!",NULLOBJECT,UNNECESSARY,9,9,0);
- _objectState[3] = Object(_id, "Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
- _objectState[4] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
- _objectState[5] = Object(_id, "Schrank",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
- _objectState[6] = Object(_id, "Fach",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
- _objectState[7] = Object(_id, "Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
- _objectState[8] = Object(_id, "Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
+ _objectState[0] = Object(_id, kStringChessGame,kStringChessGameDescription1,NULLOBJECT,UNNECESSARY,11,11,0);
+ _objectState[1] = Object(_id, kStringTennisRacket,kStringTennisRacketDescription,NULLOBJECT,UNNECESSARY,8,8,0);
+ _objectState[2] = Object(_id, kStringTennisBall,kStringGenericDescription2,NULLOBJECT,UNNECESSARY,9,9,0);
+ _objectState[3] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
+ _objectState[4] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
+ _objectState[5] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
+ _objectState[6] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
+ _objectState[7] = Object(_id, kStringSocket,kStringDefaultDescription,SOCKET,COMBINABLE,4,4,0);
+ _objectState[8] = Object(_id, kStringToilet,kStringDefaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
}
};
@@ -454,30 +412,30 @@ public:
_shown[14] = false;
_shown[15] = true;
- _objectState[0] = Object(_id, "Schachspiel","Dein Magnetschachspiel. Schach war|schon immer deine Leidenschaft.",CHESS,TAKE | COMBINABLE,12,12,7 | 128);
- _objectState[1] = Object(_id, "Bett","Das ist dein Bett. Toll, nicht wahr?",NULLOBJECT,NULLTYPE,13,13,0);
- _objectState[2] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",SLOT_K1,COMBINABLE,27,27,0);
- _objectState[3] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",SLOT_K2,COMBINABLE,28,28,0);
- _objectState[4] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",SLOT_K3,COMBINABLE,29,29,0);
- _objectState[5] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",SLOT_K4,COMBINABLE,30,30,0);
- _objectState[6] = Object(_id, "Fach","Das ist eins deiner drei F\204cher.",SHELF1,OPENABLE | CLOSED,14,18,9);
- _objectState[7] = Object(_id, "Alben","Deine Briefmarkensammlung.",NULLOBJECT,UNNECESSARY,14,14,0);
- _objectState[8] = Object(_id, "Fach","Das ist eins deiner drei F\204cher.",SHELF2,OPENABLE | CLOSED,15,19,10);
- _objectState[9] = Object(_id, "Seil","Es ist ungef\204hr 10 m lang und 4 cm dick.",ROPE,TAKE | COMBINABLE,15,15,12);
- _objectState[10] = Object(_id, "Schrank","Das ist dein Schrank.",SHELF3,OPENABLE | CLOSED,16,17,11);
- _objectState[11] = Object(_id, "Krimskram","Es ist nichts brauchbares dabei.",NULLOBJECT,UNNECESSARY,20,20,0);
- _objectState[12] = Object(_id, "Kleider","Es sind Standard-Weltraum-Klamotten.",NULLOBJECT,UNNECESSARY,21,21,0);
- _objectState[13] = Object(_id, "Unterw\204sche",Object::defaultDescription,NULLOBJECT,UNNECESSARY,22,22,0);
- _objectState[14] = Object(_id, "Str\201mpfe",Object::defaultDescription,NULLOBJECT,UNNECESSARY,23,23,0);
- _objectState[15] = Object(_id, "Fach","Das ist eins deiner drei F\204cher.",SHELF4,OPENABLE | CLOSED,24,25,13);
- _objectState[16] = Object(_id, "Buch","Es ist|\"Per Anhalter durch die Galaxis\"|von Douglas Adams.",BOOK,TAKE,26,26,14);
- _objectState[17] = Object(_id, "Discman","Es ist eine \"Mad Monkeys\"-CD darin.",DISCMAN,TAKE | COMBINABLE,33,33,16);
- _objectState[18] = Object(_id, "Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | EXIT,3,3,15 | 128,CORRIDOR,5);
- _objectState[19] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,0,0,0);
- _objectState[20] = Object(_id, "Schrank",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
- _objectState[21] = Object(_id, "Fach",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
- _objectState[22] = Object(_id, "Steckdose",Object::defaultDescription,SOCKET,COMBINABLE,4,4,0);
- _objectState[23] = Object(_id, "Toilette",Object::defaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
+ _objectState[0] = Object(_id, kStringChessGame,kStringChessGameDescription2,CHESS,TAKE | COMBINABLE,12,12,7 | 128);
+ _objectState[1] = Object(_id, kStringBed,kStringBedDescription,NULLOBJECT,NULLTYPE,13,13,0);
+ _objectState[2] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_K1,COMBINABLE,27,27,0);
+ _objectState[3] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_K2,COMBINABLE,28,28,0);
+ _objectState[4] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_K3,COMBINABLE,29,29,0);
+ _objectState[5] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_K4,COMBINABLE,30,30,0);
+ _objectState[6] = Object(_id, kStringCompartment,kStringCompartmentDescription,SHELF1,OPENABLE | CLOSED,14,18,9);
+ _objectState[7] = Object(_id, kStringAlbums,kStringAlbumsDescription,NULLOBJECT,UNNECESSARY,14,14,0);
+ _objectState[8] = Object(_id, kStringCompartment,kStringCompartmentDescription,SHELF2,OPENABLE | CLOSED,15,19,10);
+ _objectState[9] = Object(_id, kStringRope,kStringRopeDescription,ROPE,TAKE | COMBINABLE,15,15,12);
+ _objectState[10] = Object(_id, kStringShelf,kStringShelfDescription,SHELF3,OPENABLE | CLOSED,16,17,11);
+ _objectState[11] = Object(_id, kStringJunk,kStringJunkDescription,NULLOBJECT,UNNECESSARY,20,20,0);
+ _objectState[12] = Object(_id, kStringClothes,kStringClothesDescription,NULLOBJECT,UNNECESSARY,21,21,0);
+ _objectState[13] = Object(_id, kStringUnderwear,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,22,22,0);
+ _objectState[14] = Object(_id, kStringSocks,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,23,23,0);
+ _objectState[15] = Object(_id, kStringCompartment,kStringCompartmentDescription,SHELF4,OPENABLE | CLOSED,24,25,13);
+ _objectState[16] = Object(_id, kStringBook,kStringBookHitchhiker,BOOK,TAKE,26,26,14);
+ _objectState[17] = Object(_id, kStringDiscman,kStringDiscmanDescription,DISCMAN,TAKE | COMBINABLE,33,33,16);
+ _objectState[18] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | EXIT,3,3,15 | 128,CORRIDOR,5);
+ _objectState[19] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
+ _objectState[20] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
+ _objectState[21] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
+ _objectState[22] = Object(_id, kStringSocket,kStringDefaultDescription,SOCKET,COMBINABLE,4,4,0);
+ _objectState[23] = Object(_id, kStringToilet,kStringDefaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -494,9 +452,9 @@ public:
_id = BATHROOM;
_shown[0] = true;
- _objectState[0] = Object(_id, "Klo","Ein Klo mit Saugmechanismus.",TOILET,NULLTYPE,0,0,0);
- _objectState[1] = Object(_id, "Dusche",Object::defaultDescription,SHOWER,NULLTYPE,1,1,0);
- _objectState[2] = Object(_id, "Ausgang",Object::defaultDescription,BATHROOM_EXIT,EXIT,255,255,0,CABIN_R3,2);
+ _objectState[0] = Object(_id, kStringBathroom,kStringBathroomDescription,TOILET,NULLTYPE,0,0,0);
+ _objectState[1] = Object(_id, kStringShower,kStringDefaultDescription,SHOWER,NULLTYPE,1,1,0);
+ _objectState[2] = Object(_id, kStringExit,kStringDefaultDescription,BATHROOM_EXIT,EXIT,255,255,0,CABIN_R3,2);
}
};
@@ -516,13 +474,13 @@ public:
_shown[5] = false;
_shown[6] = true;
- _objectState[0] = Object(_id, "Luke","Das ist eine Luke !!!",NULLOBJECT,EXIT | OPENABLE | OPENED | CLOSED,0,0,0,CORRIDOR,10);
- _objectState[1] = Object(_id, "Luke","Dies ist eine Luke !!!",NULLOBJECT,EXIT | OPENABLE | CLOSED,1,1,0,HOLD,14);
- _objectState[2] = Object(_id, "Knopf",Object::defaultDescription,BUTTON1,PRESS,2,2,0);
- _objectState[3] = Object(_id, "Knopf",Object::defaultDescription,BUTTON2,PRESS,3,3,0);
- _objectState[4] = Object(_id, "Helm","Es ist der Helm zum Raumanzug.",HELMET,TAKE,4,4,7);
- _objectState[5] = Object(_id, "Raumanzug","Der einzige Raumanzug, den die|anderen hiergelassen haben ...",SUIT,TAKE,5,5,8);
- _objectState[6] = Object(_id, "Versorgung","Es ist der Versorgungsteil zum Raumanzug.",LIFESUPPORT,TAKE,6,6,9);
+ _objectState[0] = Object(_id, kStringHatch,kStringHatchDescription1,NULLOBJECT,EXIT | OPENABLE | OPENED | CLOSED,0,0,0,CORRIDOR,10);
+ _objectState[1] = Object(_id, kStringHatch,kStringHatchDescription2,NULLOBJECT,EXIT | OPENABLE | CLOSED,1,1,0,HOLD,14);
+ _objectState[2] = Object(_id, kStringButton,kStringDefaultDescription,BUTTON1,PRESS,2,2,0);
+ _objectState[3] = Object(_id, kStringButton,kStringDefaultDescription,BUTTON2,PRESS,3,3,0);
+ _objectState[4] = Object(_id, kStringHelmet,kStringHelmetDescription,HELMET,TAKE,4,4,7);
+ _objectState[5] = Object(_id, kStringSuit,kStringSuitDescription,SUIT,TAKE,5,5,8);
+ _objectState[6] = Object(_id, kStringLifeSupport,kStringLifeSupportDescription,LIFESUPPORT,TAKE,6,6,9);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -539,27 +497,22 @@ public:
_id = HOLD;
_shown[0] = true;
- _objectState[0] = Object(_id, "",Object::defaultDescription,HOLD_WIRE,COMBINABLE,255,255,0);
- _objectState[1] = Object(_id, "Schrott","Da ist eine L\201sterklemme dran, die|noch ganz brauchbar aussieht.|Ich nehme sie mit.",SCRAP_LK,NULLTYPE,4,4,0);
- _objectState[2] = Object(_id, "L\201sterklemme",Object::defaultDescription,TERMINALSTRIP,COMBINABLE,255,255,0);
- _objectState[3] = Object(_id, "Schrott","Junge, Junge! Die Explosion hat ein|ganz sch\224nes Durcheinander angerichtet.",NULLOBJECT,NULLTYPE,5,5,0);
- _objectState[4] = Object(_id, "Reaktor","Das war einmal der Reaktor.",NULLOBJECT,NULLTYPE,6,6,0);
- _objectState[5] = Object(_id, "D\201se",Object::defaultDescription,NULLOBJECT,NULLTYPE,7,7,0);
- _objectState[6] = Object(_id, "blauer K\201rbis","Keine Ahnung, was das ist.",NULLOBJECT,NULLTYPE,8,8,0);
- _objectState[7] = Object(_id, "Luke",Object::defaultDescription,LANDINGMOD_OUTERHATCH,EXIT | OPENABLE,1,2,2,LANDINGMODULE,6);
- _objectState[8] = Object(_id, "Landef\204hre","Sie war eigentlich f\201r Bodenuntersuchungen|auf Arsano 3 gedacht.",NULLOBJECT,NULLTYPE,0,0,0);
- _objectState[9] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,AIRLOCK,22);
- _objectState[10] = Object(_id, "Luke","Sie f\201hrt nach drau\341en.",OUTERHATCH_TOP,EXIT | OPENABLE | OPENED,3,3,0,GENERATOR,8);
- _objectState[11] = Object(_id, "Generator","Er versorgt das Raumschiff mit Strom.",GENERATOR_TOP,EXIT,12,12,0,GENERATOR,8);
-
- _descriptionScrap = "Ein St\201ck Schrott.";
+ _objectState[0] = Object(_id, kNoString,kStringDefaultDescription,HOLD_WIRE,COMBINABLE,255,255,0);
+ _objectState[1] = Object(_id, kStringScrap,kStringScrapDescription1,SCRAP_LK,NULLTYPE,4,4,0);
+ _objectState[2] = Object(_id, kStringTerminalStrip,kStringDefaultDescription,TERMINALSTRIP,COMBINABLE,255,255,0);
+ _objectState[3] = Object(_id, kStringScrap,kStringScrapDescription2,NULLOBJECT,NULLTYPE,5,5,0);
+ _objectState[4] = Object(_id, kStringReactor,kStringReactorDescription,NULLOBJECT,NULLTYPE,6,6,0);
+ _objectState[5] = Object(_id, kStringNozzle,kStringDefaultDescription,NULLOBJECT,NULLTYPE,7,7,0);
+ _objectState[6] = Object(_id, kStringPumpkin,kStringPumpkinDescription,NULLOBJECT,NULLTYPE,8,8,0);
+ _objectState[7] = Object(_id, kStringHatch,kStringDefaultDescription,LANDINGMOD_OUTERHATCH,EXIT | OPENABLE,1,2,2,LANDINGMODULE,6);
+ _objectState[8] = Object(_id, kStringLandingModule,kStringLandingModuleDescription,NULLOBJECT,NULLTYPE,0,0,0);
+ _objectState[9] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,AIRLOCK,22);
+ _objectState[10] = Object(_id, kStringHatch,kStringHatchDescription3,OUTERHATCH_TOP,EXIT | OPENABLE | OPENED,3,3,0,GENERATOR,8);
+ _objectState[11] = Object(_id, kStringGenerator,kStringGeneratorDescription,GENERATOR_TOP,EXIT,12,12,0,GENERATOR,8);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
virtual void onEntrance();
-
-private:
- Common::String _descriptionScrap;
};
class ShipLandingModule : public Room {
@@ -572,12 +525,12 @@ public:
_id = LANDINGMODULE;
_shown[0] = true;
- _objectState[0] = Object(_id, "Steckdose",Object::defaultDescription,LANDINGMOD_SOCKET,COMBINABLE,1,1,0);
- _objectState[1] = Object(_id, "Knopf","Es ist ein Sicherheitsknopf.|Er kann nur mit einem spitzen|Gegenstand gedr\201ckt werden.",LANDINGMOD_BUTTON,PRESS | COMBINABLE,2,2,0);
- _objectState[2] = Object(_id, "Monitor",Object::defaultDescription,LANDINGMOD_MONITOR,NULLTYPE,3,3,0);
- _objectState[3] = Object(_id, "Tastatur",Object::defaultDescription,KEYBOARD,NULLTYPE,4,4,0);
- _objectState[4] = Object(_id, "",Object::defaultDescription,LANDINGMOD_WIRE,COMBINABLE,255,255,0);
- _objectState[5] = Object(_id, "Luke",Object::defaultDescription,LANDINGMOD_HATCH,EXIT | OPENABLE | OPENED | COMBINABLE, 0,0,1 | 128,HOLD,10);
+ _objectState[0] = Object(_id, kStringSocket,kStringDefaultDescription,LANDINGMOD_SOCKET,COMBINABLE,1,1,0);
+ _objectState[1] = Object(_id, kStringButton,kSafetyButtonDescription,LANDINGMOD_BUTTON,PRESS | COMBINABLE,2,2,0);
+ _objectState[2] = Object(_id, kStringMonitor,kStringDefaultDescription,LANDINGMOD_MONITOR,NULLTYPE,3,3,0);
+ _objectState[3] = Object(_id, kStringKeyboard,kStringDefaultDescription,KEYBOARD,NULLTYPE,4,4,0);
+ _objectState[4] = Object(_id, kNoString,kStringDefaultDescription,LANDINGMOD_WIRE,COMBINABLE,255,255,0);
+ _objectState[5] = Object(_id, kStringHatch,kStringDefaultDescription,LANDINGMOD_HATCH,EXIT | OPENABLE | OPENED | COMBINABLE, 0,0,1 | 128,HOLD,10);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -598,19 +551,19 @@ public:
_shown[4] = false;
_shown[5] = true;
- _objectState[0] = Object(_id, "langes Kabel mit Stecker",Object::defaultDescription,GENERATOR_WIRE,COMBINABLE,255,255,0);
- _objectState[1] = Object(_id, "leere Kabelrolle",Object::defaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
- _objectState[2] = Object(_id, "Keycard des Commanders","Hey, das ist die Keycard des Commanders!|Er mu\341 sie bei dem \201berst\201rzten|Aufbruch verloren haben.",KEYCARD2,COMBINABLE | TAKE,12,12,5 | 128);
- _objectState[3] = Object(_id, "Seil",Object::defaultDescription,GENERATOR_ROPE,COMBINABLE,255,255,0);
- _objectState[4] = Object(_id, "Luke","Sie f\201hrt nach drau\341en.",OUTERHATCH,EXIT | OPENABLE,1,2,1,OUTSIDE,22);
- _objectState[5] = Object(_id, "Luke",Object::defaultDescription,NULLOBJECT,OPENABLE | CLOSED,3,3,0);
- _objectState[6] = Object(_id, "Schlitz","Es ist ein Keycard-Leser.",NULLOBJECT,COMBINABLE,4,4,0);
- _objectState[7] = Object(_id, "Klappe",Object::defaultDescription,TRAP,OPENABLE,5,6,2);
- _objectState[8] = Object(_id, "Leitung",Object::defaultDescription,NULLOBJECT,NULLTYPE,7,7,0);
- _objectState[9] = Object(_id, "Spannungmessger\204t",Object::defaultDescription,VOLTMETER,NULLTYPE,9,9,0,NULLROOM,0);
- _objectState[10] = Object(_id, "Klemme",Object::defaultDescription,CLIP,COMBINABLE,8,8,0);
- _objectState[11] = Object(_id, "Leitung","Sie f\201hrt vom Generator zum Spannungmessger\204t.",SHORT_WIRE,COMBINABLE,10,10,0);
- _objectState[12] = Object(_id, "Leiter",Object::defaultDescription,LADDER,EXIT,0,0,0,HOLD,1);
+ _objectState[0] = Object(_id, kStringGeneratorWire,kStringDefaultDescription,GENERATOR_WIRE,COMBINABLE,255,255,0);
+ _objectState[1] = Object(_id, kStringEmptySpool,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
+ _objectState[2] = Object(_id, kStringKeycard2,kStringKeycard2Description,KEYCARD2,COMBINABLE | TAKE,12,12,5 | 128);
+ _objectState[3] = Object(_id, kStringRope,kStringDefaultDescription,GENERATOR_ROPE,COMBINABLE,255,255,0);
+ _objectState[4] = Object(_id, kStringHatch,kStringHatchDescription3,OUTERHATCH,EXIT | OPENABLE,1,2,1,OUTSIDE,22);
+ _objectState[5] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,3,3,0);
+ _objectState[6] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,4,4,0);
+ _objectState[7] = Object(_id, kStringTrap,kStringDefaultDescription,TRAP,OPENABLE,5,6,2);
+ _objectState[8] = Object(_id, kStringWire,kStringDefaultDescription,NULLOBJECT,NULLTYPE,7,7,0);
+ _objectState[9] = Object(_id, kStringVoltmeter,kStringDefaultDescription,VOLTMETER,NULLTYPE,9,9,0,NULLROOM,0);
+ _objectState[10] = Object(_id, kStringClip,kStringDefaultDescription,CLIP,COMBINABLE,8,8,0);
+ _objectState[11] = Object(_id, kStringWire,kStringWireDescription,SHORT_WIRE,COMBINABLE,10,10,0);
+ _objectState[12] = Object(_id, kStringLadder,kStringDefaultDescription,LADDER,EXIT,0,0,0,HOLD,1);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -626,8 +579,8 @@ public:
_id = OUTSIDE;
_shown[0] = true;
- _objectState[0] = Object(_id, "Luke",Object::defaultDescription,NULLOBJECT,EXIT,0,0,0,GENERATOR,3);
- _objectState[1] = Object(_id, "Seil",Object::defaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
+ _objectState[0] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,EXIT,0,0,0,GENERATOR,3);
+ _objectState[1] = Object(_id, kStringRope,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
}
};
@@ -642,10 +595,10 @@ public:
_id = OUTSIDE;
_shown[0] = true;
- _objectState[0] = Object(_id, "Seil",Object::defaultDescription,NULLOBJECT,UNNECESSARY | EXIT,0,0,0,GENERATOR,12);
- _objectState[1] = Object(_id, "Stein",Object::defaultDescription,STONE,NULLTYPE,1,1,0);
- _objectState[2] = Object(_id, "Stein",Object::defaultDescription,NULLOBJECT,NULLTYPE,2,2,0);
- _objectState[3] = Object(_id, "Loch","Es scheint eine H\224hle zu sein.",NULLOBJECT,NULLTYPE,255,255,0,CAVE,1);
+ _objectState[0] = Object(_id, kStringRope,kStringDefaultDescription,NULLOBJECT,UNNECESSARY | EXIT,0,0,0,GENERATOR,12);
+ _objectState[1] = Object(_id, kStringStone,kStringDefaultDescription,STONE,NULLTYPE,1,1,0);
+ _objectState[2] = Object(_id, kStringStone,kStringDefaultDescription,NULLOBJECT,NULLTYPE,2,2,0);
+ _objectState[3] = Object(_id, kStringCaveOpening,kStringCaveOpeningDescription,NULLOBJECT,NULLTYPE,255,255,0,CAVE,1);
}
virtual void onEntrance();
@@ -661,8 +614,8 @@ public:
_id = CAVE;
_shown[0] = false;
- _objectState[0] = Object(_id, "Ausgang","Hier bist du gerade hergekommen.",NULLOBJECT,EXIT,255,255,0,ROCKS,22);
- _objectState[1] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,MEETUP,2);
+ _objectState[0] = Object(_id, kStringExit,kStringExitDescription,NULLOBJECT,EXIT,255,255,0,ROCKS,22);
+ _objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,MEETUP,2);
}
};
class ArsanoMeetup : public Room {
@@ -675,12 +628,12 @@ public:
_id = MEETUP;
_shown[0] = true;
- _objectState[0] = Object(_id, "H\224hle",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
- _objectState[1] = Object(_id, "Schild","Diese Schrift kannst du nicht lesen.",MEETUP_SIGN,NULLTYPE,0,0,0);
- _objectState[2] = Object(_id, "Eingang",Object::defaultDescription,DOOR,EXIT,1,1,0,ENTRANCE,7);
- _objectState[3] = Object(_id, "Stern",Object::defaultDescription,STAR,NULLTYPE,2,2,0);
- _objectState[4] = Object(_id, "Raumschiff",Object::defaultDescription,SPACESHIPS,COMBINABLE,3,3,0);
- _objectState[5] = Object(_id, "Raumschiff",Object::defaultDescription,SPACESHIP,COMBINABLE,4,4,0);
+ _objectState[0] = Object(_id, kStringCave,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
+ _objectState[1] = Object(_id, kStringSign,kStringSignDescription,MEETUP_SIGN,NULLTYPE,0,0,0);
+ _objectState[2] = Object(_id, kStringEntrance,kStringDefaultDescription,DOOR,EXIT,1,1,0,ENTRANCE,7);
+ _objectState[3] = Object(_id, kStringStar,kStringDefaultDescription,STAR,NULLTYPE,2,2,0);
+ _objectState[4] = Object(_id, kStringSpaceshift,kStringDefaultDescription,SPACESHIPS,COMBINABLE,3,3,0);
+ _objectState[5] = Object(_id, kStringSpaceshift,kStringDefaultDescription,SPACESHIP,COMBINABLE,4,4,0);
}
virtual void onEntrance();
@@ -701,24 +654,24 @@ public:
_id = ENTRANCE;
_shown[0] = true;
- _objectState[0] = Object(_id, "Portier","Du siehst doch selbst, wie er aussieht.",PORTER,TALK,0,0,0);
- _objectState[1] = Object(_id, "T\201r",Object::defaultDescription,NULLOBJECT,EXIT | OPENABLE | CLOSED,1,1,0,NULLROOM,5);
- _objectState[2] = Object(_id, "Schild","Diese Schrift kannst du nicht lesen.",KITCHEN_SIGN,NULLTYPE,2,2,0);
- _objectState[3] = Object(_id, "Kaugummi",Object::defaultDescription,SCHNUCK,TAKE,255,255,10+128);
- _objectState[4] = Object(_id, "Gummib\204rchen",Object::defaultDescription,SCHNUCK,TAKE,255,255,11+128);
- _objectState[5] = Object(_id, "Schokokugel",Object::defaultDescription,SCHNUCK,TAKE,255,255,12+128);
- _objectState[6] = Object(_id, "\232berraschungsei",Object::defaultDescription,EGG,TAKE,255,255,13+128);
- _objectState[7] = Object(_id, "Lakritz",Object::defaultDescription,SCHNUCK,TAKE,255,255,14+128);
- _objectState[8] = Object(_id, "Tablette","Die Plastikh\201lle zeigt einen|Mund mit einer Sprechblase. Was|darin steht, kannst du nicht lesen.",PILL,TAKE,255,255,0);
- _objectState[9] = Object(_id, "Schlitz",Object::defaultDescription,CAR_SLOT,COMBINABLE,6,6,0);
- _objectState[10] = Object(_id, "Automat","Sieht aus wie ein Kaugummiautomat.",NULLOBJECT,NULLTYPE,5,5,0);
- _objectState[11] = Object(_id, "Toilette","Die Toiletten sind denen|auf der Erde sehr \204hnlich.",ARSANO_BATHROOM,NULLTYPE,255,255,0);
- _objectState[12] = Object(_id, "Knopf",Object::defaultDescription,BATHROOM_BUTTON,PRESS,3,3,0);
- _objectState[13] = Object(_id, "Schild","Diese Schrift kannst du nicht lesen.",BATHROOM_SIGN,NULLTYPE,4,4,0);
- _objectState[14] = Object(_id, "Treppe",Object::defaultDescription,STAIRCASE,EXIT,8,8,0,REST,3);
- _objectState[15] = Object(_id, "Ausgang",Object::defaultDescription,MEETUP_EXIT,EXIT,255,255,0,MEETUP,22);
- _objectState[16] = Object(_id, "M\201nzen","Es sind seltsame|K\224pfe darauf abgebildet.",COINS,TAKE|COMBINABLE,255,255,0);
- _objectState[17] = Object(_id, "Tablettenh\201lle","Darauf steht:\"Wenn Sie diese|Schrift jetzt lesen k\224nnen,|hat die Tablette gewirkt.\"",PILL_HULL,TAKE,255,255,0);
+ _objectState[0] = Object(_id, kStringPorter,kStringPorterDescription,PORTER,TALK,0,0,0);
+ _objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,NULLOBJECT,EXIT | OPENABLE | CLOSED,1,1,0,NULLROOM,5);
+ _objectState[2] = Object(_id, kStringSign,kStringSignDescription,KITCHEN_SIGN,NULLTYPE,2,2,0);
+ _objectState[3] = Object(_id, kStringChewingGum,kStringDefaultDescription,SCHNUCK,TAKE,255,255,10+128);
+ _objectState[4] = Object(_id, kStringGummyBears,kStringDefaultDescription,SCHNUCK,TAKE,255,255,11+128);
+ _objectState[5] = Object(_id, kStringChocolateBall,kStringDefaultDescription,SCHNUCK,TAKE,255,255,12+128);
+ _objectState[6] = Object(_id, kStringEgg,kStringDefaultDescription,EGG,TAKE,255,255,13+128);
+ _objectState[7] = Object(_id, kStringLiquorice,kStringDefaultDescription,SCHNUCK,TAKE,255,255,14+128);
+ _objectState[8] = Object(_id, kStringPill,kStringPillDescription,PILL,TAKE,255,255,0);
+ _objectState[9] = Object(_id, kStringSlot,kStringDefaultDescription,CAR_SLOT,COMBINABLE,6,6,0);
+ _objectState[10] = Object(_id, kStringVendingMachine,kStringVendingMachineDescription,NULLOBJECT,NULLTYPE,5,5,0);
+ _objectState[11] = Object(_id, kStringToilet,kStringToiletDescription,ARSANO_BATHROOM,NULLTYPE,255,255,0);
+ _objectState[12] = Object(_id, kStringButton,kStringDefaultDescription,BATHROOM_BUTTON,PRESS,3,3,0);
+ _objectState[13] = Object(_id, kStringSign,kStringSignDescription,BATHROOM_SIGN,NULLTYPE,4,4,0);
+ _objectState[14] = Object(_id, kStringStaircase,kStringDefaultDescription,STAIRCASE,EXIT,8,8,0,REST,3);
+ _objectState[15] = Object(_id, kStringExit,kStringDefaultDescription,MEETUP_EXIT,EXIT,255,255,0,MEETUP,22);
+ _objectState[16] = Object(_id, kStringCoins,kStringCoinsDescription,COINS,TAKE|COMBINABLE,255,255,0);
+ _objectState[17] = Object(_id, kStringTabletPackage,kStringTabletPackageDescription,PILL_HULL,TAKE,255,255,0);
_dialog1[0] = "Wieso das denn nicht?";
_dialog1[1] = "Wo bin ich hier?";
@@ -757,9 +710,9 @@ public:
_id = REST;
_shown[0] = true;
- _objectState[0] = Object(_id, "Treppe",Object::defaultDescription,NULLOBJECT,EXIT,0,0,0,ENTRANCE,17);
- _objectState[1] = Object(_id, "Stuhl",Object::defaultDescription,NULLOBJECT,EXIT,1,1,0,ROGER,2);
- _objectState[2] = Object(_id, "Schuhe","Wie ist der denn mit|Schuhen hier reingekommen?",NULLOBJECT,NULLTYPE,2,2,0);
+ _objectState[0] = Object(_id, kStringStaircase,kStringDefaultDescription,NULLOBJECT,EXIT,0,0,0,ENTRANCE,17);
+ _objectState[1] = Object(_id, kStringChair,kStringDefaultDescription,NULLOBJECT,EXIT,1,1,0,ROGER,2);
+ _objectState[2] = Object(_id, kStringShoes,kStringShoesDescription,NULLOBJECT,NULLTYPE,2,2,0);
_chewing = true;
}
@@ -780,15 +733,15 @@ public:
_id = ROGER;
_shown[0] = true;
- _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,REST,19);
- _objectState[1] = Object(_id, "Froschgesicht",Object::defaultDescription,ROGER_W,TALK,0,0,0);
- _objectState[2] = Object(_id, "Gekritzel","\"Mr Spock was here\"",NULLOBJECT,NULLTYPE,3,3,0);
- _objectState[3] = Object(_id, "Brieftasche",Object::defaultDescription,WALLET,TAKE,1,1,4);
- _objectState[4] = Object(_id, "Speisekarte","\"Heute empfehlen wir:|Fonua Opra mit Ulk.\"",NULLOBJECT,UNNECESSARY,2,2,0);
- _objectState[5] = Object(_id, "Tasse","Sie enth\204lt eine gr\201nliche Fl\201ssigkeit.",CUP,UNNECESSARY,4,4,0);
- _objectState[6] = Object(_id, "Schachspiel",Object::defaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
- _objectState[7] = Object(_id, "10-Buckazoid-Schein","Nicht gerade sehr viel Geld.",NULLOBJECT,TAKE|COMBINABLE,255,255,0);
- _objectState[8] = Object(_id, "Keycard von Roger",Object::defaultDescription,KEYCARD_R,TAKE|COMBINABLE,255,255,0);
+ _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,REST,19);
+ _objectState[1] = Object(_id, kStringFrogFace,kStringDefaultDescription,ROGER_W,TALK,0,0,0);
+ _objectState[2] = Object(_id, kStringScrible,kStringScribleDescription,NULLOBJECT,NULLTYPE,3,3,0);
+ _objectState[3] = Object(_id, kStringWallet,kStringDefaultDescription,WALLET,TAKE,1,1,4);
+ _objectState[4] = Object(_id, kStringMenu,kStringMenuDescription,NULLOBJECT,UNNECESSARY,2,2,0);
+ _objectState[5] = Object(_id, kStringCup,kStringCupDescription,CUP,UNNECESSARY,4,4,0);
+ _objectState[6] = Object(_id, kStringChessGame,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
+ _objectState[7] = Object(_id, kStringBill,kStringBillDescription,NULLOBJECT,TAKE|COMBINABLE,255,255,0);
+ _objectState[8] = Object(_id, kStringKeycard3,kStringDefaultDescription,KEYCARD_R,TAKE|COMBINABLE,255,255,0);
_dialog1[0] = "K\224nnten Sie mir ein Gericht empfehlen?";
_dialog1[1] = "Wie lange dauert es denn noch bis zur Supernova?";
@@ -817,17 +770,17 @@ public:
_id = GLIDER;
_shown[0] = true;
- _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,MEETUP,15);
- _objectState[1] = Object(_id, "Knopf",Object::defaultDescription,GLIDER_BUTTON1,PRESS,0,0,0);
- _objectState[2] = Object(_id, "Knopf",Object::defaultDescription,GLIDER_BUTTON2,PRESS,1,1,0);
- _objectState[3] = Object(_id, "Knopf",Object::defaultDescription,GLIDER_BUTTON3,PRESS,2,2,0);
- _objectState[4] = Object(_id, "Knopf",Object::defaultDescription,GLIDER_BUTTON4,PRESS,3,3,0);
- _objectState[5] = Object(_id, "Keycard von Roger",Object::defaultDescription,GLIDER_KEYCARD,TAKE|COMBINABLE,255,255,0);
- _objectState[6] = Object(_id, "Schlitz",Object::defaultDescription,GLIDER_SLOT,COMBINABLE,4,4,0);
- _objectState[7] = Object(_id, "Fach",Object::defaultDescription,NULLOBJECT,OPENABLE,5,6,6);
- _objectState[8] = Object(_id, "Tastatur",Object::defaultDescription,GLIDER_BUTTONS,NULLTYPE,7,7,0);
- _objectState[9] = Object(_id, "Anzeige","Hmm, seltsame Anzeigen.",GLIDER_DISPLAY,NULLTYPE,8,8,0);
- _objectState[10] = Object(_id, "Instrumente","Hmm, seltsame Anzeigen.",GLIDER_INSTRUMENTS,NULLTYPE,9,9,0);
+ _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,MEETUP,15);
+ _objectState[1] = Object(_id, kStringButton,kStringDefaultDescription,GLIDER_BUTTON1,PRESS,0,0,0);
+ _objectState[2] = Object(_id, kStringButton,kStringDefaultDescription,GLIDER_BUTTON2,PRESS,1,1,0);
+ _objectState[3] = Object(_id, kStringButton,kStringDefaultDescription,GLIDER_BUTTON3,PRESS,2,2,0);
+ _objectState[4] = Object(_id, kStringButton,kStringDefaultDescription,GLIDER_BUTTON4,PRESS,3,3,0);
+ _objectState[5] = Object(_id, kStringKeycard,kStringDefaultDescription,GLIDER_KEYCARD,TAKE|COMBINABLE,255,255,0);
+ _objectState[6] = Object(_id, kStringSlot,kStringDefaultDescription,GLIDER_SLOT,COMBINABLE,4,4,0);
+ _objectState[7] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE,5,6,6);
+ _objectState[8] = Object(_id, kStringKeyboard,kStringDefaultDescription,GLIDER_BUTTONS,NULLTYPE,7,7,0);
+ _objectState[9] = Object(_id, kStringAnnouncement,kStringAnnouncementDescription,GLIDER_DISPLAY,NULLTYPE,8,8,0);
+ _objectState[10] = Object(_id, kStringInstruments,kStringAnnouncementDescription,GLIDER_INSTRUMENTS,NULLTYPE,9,9,0);
}
virtual void animation();
@@ -846,9 +799,9 @@ public:
_id = MEETUP2;
_shown[0] = true;
- _objectState[0] = Object(_id, "Roger W.",Object::defaultDescription,ROGER_W,TALK,255,255,0);
- _objectState[1] = Object(_id, "Raumschiff",Object::defaultDescription,SPACESHIP,COMBINABLE,255,255,0);
- _objectState[2] = Object(_id, "Höhle",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
+ _objectState[0] = Object(_id, kStringRoger,kStringDefaultDescription,ROGER_W,TALK,255,255,0);
+ _objectState[1] = Object(_id, kStringSpaceshift,kStringDefaultDescription,SPACESHIP,COMBINABLE,255,255,0);
+ _objectState[2] = Object(_id, kStringCave,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
_dialog1[0] = "Ach, Ihnen geh\224rt die. Ich habe sie eben im Sand gefunden.";
_dialog1[1] = "Nein, tut mir leid.";
@@ -884,9 +837,9 @@ public:
_id = MEETUP3;
_shown[0] = true;
- _objectState[0] = Object(_id, "Ufo","Der Eingang scheint offen zu sein.",UFO,EXIT,0,0,0,NULLROOM,3);
- _objectState[1] = Object(_id, "Stern",Object::defaultDescription,STAR,NULLTYPE,1,1,0);
- _objectState[2] = Object(_id, "H\224hle",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
+ _objectState[0] = Object(_id, kStringUfo,kStringUfoDescription,UFO,EXIT,0,0,0,NULLROOM,3);
+ _objectState[1] = Object(_id, kStringStar,kStringDefaultDescription,STAR,NULLTYPE,1,1,0);
+ _objectState[2] = Object(_id, kStringCave,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
_dialog2[0] = "Wo bin ich hier?";
_dialog2[1] = "Was wollen Sie von mir?";
@@ -945,16 +898,16 @@ public:
_shown[30] = false;
_shown[31] = true;
- _objectState[0] = Object(_id, "Knopf",Object::defaultDescription,CELL_BUTTON,PRESS,1,1,0);
- _objectState[1] = Object(_id, "T\201r",Object::defaultDescription,CELL_DOOR,EXIT|OPENABLE|CLOSED,0,0,31+128,CORRIDOR4,1);
- _objectState[2] = Object(_id, "Tablett","Es ist irgendein Fra\341 und|etwas zu Trinken darauf.",TRAY,UNNECESSARY,255,255,0);
- _objectState[3] = Object(_id, "Stange","Es scheint eine Lampe zu sein.",NULLOBJECT,COMBINABLE,3,3,0);
- _objectState[4] = Object(_id, "Augen","Es ist nur ein Bild.",NULLOBJECT,NULLTYPE,4,4,0);
- _objectState[5] = Object(_id, "Leitung",Object::defaultDescription,CELL_WIRE,COMBINABLE|TAKE,6,6,0);
- _objectState[6] = Object(_id, "Steckdose","Sieht etwas anders aus als auf der Erde.",SOCKET,COMBINABLE,5,5,0);
- _objectState[7] = Object(_id, "Metallblock","Er ist ziemlich schwer.",MAGNET,TAKE|COMBINABLE,255,255,30);
- _objectState[8] = Object(_id, "Roboter","Den hast du erledigt.",NULLOBJECT,NULLTYPE,255,255,0);
- _objectState[9] = Object(_id, "Tisch","Ein kleiner Metalltisch.",CELL_TABLE,COMBINABLE,2,2,0);
+ _objectState[0] = Object(_id, kStringButton,kStringDefaultDescription,CELL_BUTTON,PRESS,1,1,0);
+ _objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,CELL_DOOR,EXIT|OPENABLE|CLOSED,0,0,31+128,CORRIDOR4,1);
+ _objectState[2] = Object(_id, kStringTray,kStringTrayDescription,TRAY,UNNECESSARY,255,255,0);
+ _objectState[3] = Object(_id, kStringLamp,kStringLampDescription,NULLOBJECT,COMBINABLE,3,3,0);
+ _objectState[4] = Object(_id, kStringEyes,kStringEyesDescription,NULLOBJECT,NULLTYPE,4,4,0);
+ _objectState[5] = Object(_id, kStringWire,kStringDefaultDescription,CELL_WIRE,COMBINABLE|TAKE,6,6,0);
+ _objectState[6] = Object(_id, kStringSocket,kStringSocketDescription,SOCKET,COMBINABLE,5,5,0);
+ _objectState[7] = Object(_id, kStringMetalBlock,kStringMetalBlockDescription,MAGNET,TAKE|COMBINABLE,255,255,30);
+ _objectState[8] = Object(_id, kStringRobot,kStringRobotDescription,NULLOBJECT,NULLTYPE,255,255,0);
+ _objectState[9] = Object(_id, kStringTable,kStringTableDescription,CELL_TABLE,COMBINABLE,2,2,0);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -996,8 +949,8 @@ public:
_shown[24] = false;
_shown[25] = true;
- _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,GUARD3,2);
- _objectState[1] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR2,22);
+ _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,GUARD3,2);
+ _objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR2,22);
}
virtual void onEntrance();
@@ -1036,9 +989,9 @@ public:
_shown[23] = false;
_shown[24] = true;
- _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR1,2);
- _objectState[1] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR3,22);
- _objectState[2] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,1,1,0,CORRIDOR4,14);
+ _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR1,2);
+ _objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR3,22);
+ _objectState[2] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,1,1,0,CORRIDOR4,14);
}
virtual void onEntrance();
@@ -1076,7 +1029,7 @@ public:
_shown[22] = false;
_shown[23] = true;
- _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR2,2);
+ _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR2,2);
}
virtual void onEntrance();
@@ -1117,12 +1070,12 @@ public:
_shown[25] = false;
_shown[26] = true;
- _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,0,0,0,CORRIDOR2,10);
- _objectState[1] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,1,1,0,GUARD,14);
- _objectState[2] = Object(_id, "Zellent\201r","Hier warst du eingesperrt.",DOOR,EXIT|OPENABLE|OPENED|CLOSED,7,7,0,CELL,16);
- _objectState[3] = Object(_id, "Laptop",Object::defaultDescription,NEWSPAPER,TAKE,6,6,8);
- _objectState[4] = Object(_id, "Armbanduhr",Object::defaultDescription,WATCH,TAKE|COMBINABLE,255,255,8);
- _objectState[5] = Object(_id, "Tisch",Object::defaultDescription,TABLE,COMBINABLE,5,5,0);
+ _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,0,0,0,CORRIDOR2,10);
+ _objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,1,1,0,GUARD,14);
+ _objectState[2] = Object(_id, kStringCellDoor,kStringCellDoorDescription,DOOR,EXIT|OPENABLE|OPENED|CLOSED,7,7,0,CELL,16);
+ _objectState[3] = Object(_id, kStringLaptop,kStringDefaultDescription,NEWSPAPER,TAKE,6,6,8);
+ _objectState[4] = Object(_id, kStringWristwatch,kStringDefaultDescription,WATCH,TAKE|COMBINABLE,255,255,8);
+ _objectState[5] = Object(_id, kStringTable,kStringDefaultDescription,TABLE,COMBINABLE,5,5,0);
}
virtual void onEntrance();
@@ -1163,8 +1116,8 @@ public:
_shown[23] = true;
_shown[24] = true;
- _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,DOOR,EXIT,2,2,0,NULLROOM,2);
- _objectState[1] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR6,22);
+ _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,DOOR,EXIT,2,2,0,NULLROOM,2);
+ _objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR6,22);
_dialog1[0] = "\216h ... nein, mein Name ist M\201ller.";
_dialog1[1] = "Oh, ich habe mich im Gang vertan.";
@@ -1219,9 +1172,9 @@ public:
_shown[24] = true;
_shown[25] = true;
- _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR5,2);
- _objectState[1] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR7,22);
- _objectState[2] = Object(_id, "T\201r",Object::defaultDescription,DOOR,OPENABLE|CLOSED,255,255,0,CORRIDOR8,13);
+ _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR5,2);
+ _objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR7,22);
+ _objectState[2] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,OPENABLE|CLOSED,255,255,0,CORRIDOR8,13);
}
virtual void onEntrance();
@@ -1262,8 +1215,8 @@ public:
_shown[24] = true;
_shown[25] = true;
- _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR6,2);
- _objectState[1] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,GUARD,22);
+ _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR6,2);
+ _objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,GUARD,22);
}
virtual void onEntrance();
@@ -1306,8 +1259,8 @@ public:
_shown[27] = false;
_shown[28] = true;
- _objectState[0] = Object(_id, "T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE,0,0,0,CORRIDOR6,10);
- _objectState[1] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,BCORRIDOR,22);
+ _objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE,0,0,0,CORRIDOR6,10);
+ _objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,BCORRIDOR,22);
}
virtual void onEntrance();
@@ -1351,8 +1304,8 @@ public:
_shown[27] = false;
_shown[28] = true;
- _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,2,2,0,BCORRIDOR,2);
- _objectState[1] = Object(_id, "T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE,0,0,0,GUARD,10);
+ _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,BCORRIDOR,2);
+ _objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE,0,0,0,GUARD,10);
}
virtual void onEntrance();
@@ -1371,23 +1324,20 @@ public:
_shown[2] = false;
_shown[3] = true;
- _objectState[0] = Object(_id, "S\204ule",Object::defaultDescription,PILLAR1,NULLTYPE,4,4,0);
- _objectState[1] = Object(_id, "S\204ule",Object::defaultDescription,PILLAR2,NULLTYPE,5,5,0);
- _objectState[2] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,6,6,0,CORRIDOR8,2);
- _objectState[3] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,7,7,0,CORRIDOR9,22);
- _objectState[4] = Object(_id, "T\201r","Auf einem Schild an der T\201r steht \"Dr. Alab Hansi\".",DOOR1,EXIT|OPENABLE|CLOSED|OCCUPIED,0,0,1,OFFICE_L1,6);
- _objectState[5] = Object(_id, "T\201r","Auf einem Schild an der T\201r steht \"Saval Lun\".",DOOR2,EXIT|OPENABLE|CLOSED|OCCUPIED,1,1,2,OFFICE_L2,16);
- _objectState[6] = Object(_id, "T\201r","Auf einem Schild an der T\201r steht \"Prof. Dr. Ugnul Tschabb\".",DOOR3,EXIT|OPENABLE|OPENED,2,2,3,OFFICE_R1,8);
- _objectState[7] = Object(_id, "T\201r","Auf einem Schild an der T\201r steht \"Alga Hurz Li\".",DOOR4,EXIT|OPENABLE|CLOSED|OCCUPIED,3,3,4,OFFICE_R2,18);
-
- _dontEnter = "Diese T\201r w\201rde ich lieber|nicht \224ffnen. Nach dem Schild zu|urteilen, ist jemand in dem Raum.";
+ _objectState[0] = Object(_id, kStringPillar,kStringDefaultDescription,PILLAR1,NULLTYPE,4,4,0);
+ _objectState[1] = Object(_id, kStringPillar,kStringDefaultDescription,PILLAR2,NULLTYPE,5,5,0);
+ _objectState[2] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,6,6,0,CORRIDOR8,2);
+ _objectState[3] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,7,7,0,CORRIDOR9,22);
+ _objectState[4] = Object(_id, kStringDoor,kStringDoorDescription1,DOOR1,EXIT|OPENABLE|CLOSED|OCCUPIED,0,0,1,OFFICE_L1,6);
+ _objectState[5] = Object(_id, kStringDoor,kStringDoorDescription2,DOOR2,EXIT|OPENABLE|CLOSED|OCCUPIED,1,1,2,OFFICE_L2,16);
+ _objectState[6] = Object(_id, kStringDoor,kStringDoorDescription3,DOOR3,EXIT|OPENABLE|OPENED,2,2,3,OFFICE_R1,8);
+ _objectState[7] = Object(_id, kStringDoor,kStringDoorDescription4,DOOR4,EXIT|OPENABLE|CLOSED|OCCUPIED,3,3,4,OFFICE_R2,18);
}
virtual void onEntrance();
virtual bool interact(Action verb, Object &obj1, Object &obj2);
private:
- Common::String _dontEnter;
byte _nameSeen;
};
class AxacussIntersection : public Room {
@@ -1400,13 +1350,13 @@ public:
_id = GUARD;
_shown[0] = true;
- _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CORRIDOR4,21);
- _objectState[1] = Object(_id, "Gang",Object::defaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR7,5);
- _objectState[2] = Object(_id, "T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE,1,1,6,CORRIDOR9,3);
+ _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,CORRIDOR4,21);
+ _objectState[1] = Object(_id, kStringCorridor,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR7,5);
+ _objectState[2] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE,1,1,6,CORRIDOR9,3);
// Originally GUARD was ObjectID..
- _objectState[3] = Object(_id, "Axacussaner","Du m\201\341test ihn irgendwie ablenken.",INSTRUMENTS,TALK,0,0,0);
- _objectState[4] = Object(_id, "Bild","Komisches Bild.",NULLOBJECT,NULLTYPE,2,2,0);
- _objectState[5] = Object(_id, "Karte","Darauf steht: \"Generalkarte\".",MASTERKEYCARD,TAKE|COMBINABLE,255,255,1);
+ _objectState[3] = Object(_id, kStringAxacussan,kStringAxacussanDescription,INSTRUMENTS,TALK,0,0,0);
+ _objectState[4] = Object(_id, kStringImage,kStringImageDescription2,NULLOBJECT,NULLTYPE,2,2,0);
+ _objectState[5] = Object(_id, kStringMastercard,kStringMastercardDescription,MASTERKEYCARD,TAKE|COMBINABLE,255,255,1);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -1421,14 +1371,14 @@ public:
_id = GUARD3;
_shown[0] = true;
- _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CORRIDOR1,22);
- _objectState[1] = Object(_id, "T\201r",Object::defaultDescription,NULLOBJECT,EXIT|OPENABLE|CLOSED,0,0,0,NULLROOM,20);
- _objectState[2] = Object(_id, "T\201r",Object::defaultDescription,NULLOBJECT,EXIT|OPENABLE|CLOSED,1,1,0,NULLROOM,15);
- _objectState[3] = Object(_id, "T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE,2,2,11,OFFICE_L,0);
- _objectState[4] = Object(_id, "Lampe",Object::defaultDescription,LAMP,COMBINABLE,3,3,0);
+ _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,CORRIDOR1,22);
+ _objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,NULLOBJECT,EXIT|OPENABLE|CLOSED,0,0,0,NULLROOM,20);
+ _objectState[2] = Object(_id, kStringDoor,kStringDefaultDescription,NULLOBJECT,EXIT|OPENABLE|CLOSED,1,1,0,NULLROOM,15);
+ _objectState[3] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE,2,2,11,OFFICE_L,0);
+ _objectState[4] = Object(_id, kStringLamp2,kStringDefaultDescription,LAMP,COMBINABLE,3,3,0);
// Originally GUARD was ObjectID..
- _objectState[5] = Object(_id, "Axacussaner",Object::defaultDescription,INSTRUMENTS,TALK,5,5,0);
- _objectState[6] = Object(_id, "Bild","Seltsam!",NULLOBJECT,NULLTYPE,4,4,0);
+ _objectState[5] = Object(_id, kStringAxacussan,kStringDefaultDescription,INSTRUMENTS,TALK,5,5,0);
+ _objectState[6] = Object(_id, kStringImage,kStringGenericDescription5,NULLOBJECT,NULLTYPE,4,4,0);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -1459,11 +1409,11 @@ public:
_shown[15] = false;
_shown[16] = true;
- _objectState[0] = Object(_id, "T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,9,BCORRIDOR,9);
- _objectState[1] = Object(_id, "Computer",Object::defaultDescription,COMPUTER,COMBINABLE,4,4,0);
- _objectState[2] = Object(_id, "Geld","Es sind 500 Xa.",TICKETS,TAKE,255,255,0);
- _objectState[3] = Object(_id, "Schließfach","Es hat ein elektronisches Zahlenschlo\341.",LOCKER,OPENABLE|CLOSED,5,5,0);
- _objectState[4] = Object(_id, "Brief",Object::defaultDescription,LETTER,UNNECESSARY,3,3,0);
+ _objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,9,BCORRIDOR,9);
+ _objectState[1] = Object(_id, kStringComputer,kStringDefaultDescription,COMPUTER,COMBINABLE,4,4,0);
+ _objectState[2] = Object(_id, kStringMoney,kStringMoneyDescription1,TICKETS,TAKE,255,255,0);
+ _objectState[3] = Object(_id, kStringLocker,kStringLockerDescription,LOCKER,OPENABLE|CLOSED,5,5,0);
+ _objectState[4] = Object(_id, kStringLetter,kStringDefaultDescription,LETTER,UNNECESSARY,3,3,0);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -1494,11 +1444,11 @@ public:
_shown[15] = false;
_shown[16] = true;
- _objectState[0] = Object(_id, "T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,9,BCORRIDOR,9);
- _objectState[1] = Object(_id, "Computer",Object::defaultDescription,COMPUTER,COMBINABLE,4,4,0);
- _objectState[2] = Object(_id, "W\201rfel","Sonderbar!",NULLOBJECT,NULLTYPE,0,0,0);
- _objectState[3] = Object(_id, "Bild","Affenstark!",NULLOBJECT,NULLTYPE,1,1,0);
- _objectState[4] = Object(_id, "Komisches Ding","Wundersam!",NULLOBJECT,UNNECESSARY,2,2,0);
+ _objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,9,BCORRIDOR,9);
+ _objectState[1] = Object(_id, kStringComputer,kStringDefaultDescription,COMPUTER,COMBINABLE,4,4,0);
+ _objectState[2] = Object(_id, kStringCube,kStringGenericDescription6,NULLOBJECT,NULLTYPE,0,0,0);
+ _objectState[3] = Object(_id, kStringImage,kStringGenericDescription7,NULLOBJECT,NULLTYPE,1,1,0);
+ _objectState[4] = Object(_id, kStringStrangeThing,kStringGenericDescription8,NULLOBJECT,UNNECESSARY,2,2,0);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -1516,12 +1466,12 @@ public:
_shown[2] = false;
_shown[3] = true;
- _objectState[0] = Object(_id, "T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,0,0,3,BCORRIDOR,5);
- _objectState[1] = Object(_id, "Computer",Object::defaultDescription,COMPUTER,COMBINABLE,4,4,0);
- _objectState[2] = Object(_id, "Bild","Es ist ein Axacussanerkopf auf dem Bild.",NULLOBJECT,UNNECESSARY,1,1,0);
- _objectState[3] = Object(_id, "Bild","Es ist ein Axacussanerkopf auf dem Bild.",PAINTING,UNNECESSARY,2,2,0);
- _objectState[4] = Object(_id, "Pflanze",Object::defaultDescription,NULLOBJECT,UNNECESSARY,3,3,0);
- _objectState[5] = Object(_id, "",Object::defaultDescription,MONEY,TAKE|COMBINABLE,255,255,0);
+ _objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,0,0,3,BCORRIDOR,5);
+ _objectState[1] = Object(_id, kStringComputer,kStringDefaultDescription,COMPUTER,COMBINABLE,4,4,0);
+ _objectState[2] = Object(_id, kStringImage,kStringImageDescription2,NULLOBJECT,UNNECESSARY,1,1,0);
+ _objectState[3] = Object(_id, kStringImage,kStringImageDescription2,PAINTING,UNNECESSARY,2,2,0);
+ _objectState[4] = Object(_id, kStringPlant,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,3,3,0);
+ _objectState[5] = Object(_id, kNoString,kStringDefaultDescription,MONEY,TAKE|COMBINABLE,255,255,0);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -1539,10 +1489,10 @@ public:
_shown[2] = true;
_shown[3] = true;
- _objectState[0] = Object(_id, "T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,0,0,3,BCORRIDOR,5);
- _objectState[1] = Object(_id, "Computer",Object::defaultDescription,COMPUTER,COMBINABLE,4,4,0);
- _objectState[2] = Object(_id, "Figur","Stark!",NULLOBJECT,UNNECESSARY,6,6,0);
- _objectState[3] = Object(_id, "Pflanze","Sie ist den Pflanzen auf der Erde sehr ähnlich.",NULLOBJECT,UNNECESSARY,5,5,0);
+ _objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,0,0,3,BCORRIDOR,5);
+ _objectState[1] = Object(_id, kStringComputer,kStringDefaultDescription,COMPUTER,COMBINABLE,4,4,0);
+ _objectState[2] = Object(_id, kStringStatue,kStringStatueDescription,NULLOBJECT,UNNECESSARY,6,6,0);
+ _objectState[3] = Object(_id, kStringPlant,kStringPlantDescription,NULLOBJECT,UNNECESSARY,5,5,0);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -1574,10 +1524,10 @@ public:
_shown[16] = false;
_shown[17] = true;
- _objectState[0] = Object(_id, "T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,17,GUARD3,9);
- _objectState[1] = Object(_id, "Computer","Er funktioniert nicht.",COMPUTER,COMBINABLE,4,4,0);
- _objectState[2] = Object(_id, "Graffiti","Seltsamer B\201roschmuck!",NULLOBJECT,NULLTYPE,7,7,0);
- _objectState[3] = Object(_id, "Geld","Es sind 350 Xa.",TICKETS,TAKE,8,8,0);
+ _objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,17,GUARD3,9);
+ _objectState[1] = Object(_id, kStringComputer,kStringComputerDescription,COMPUTER,COMBINABLE,4,4,0);
+ _objectState[2] = Object(_id, kStringGraffiti,kStringGraffitiDescription,NULLOBJECT,NULLTYPE,7,7,0);
+ _objectState[3] = Object(_id, kStringMoney,kStringMoneyDescription2,TICKETS,TAKE,8,8,0);
}
virtual void onEntrance();
@@ -1593,10 +1543,10 @@ public:
_id = ELEVATOR;
_shown[0] = true;
- _objectState[0] = Object(_id, "Knopf",Object::defaultDescription,BUTTON1,PRESS,0,0,0);
- _objectState[1] = Object(_id, "Knopf",Object::defaultDescription,BUTTON2,PRESS,1,1,0);
- _objectState[2] = Object(_id, "Ausgang",Object::defaultDescription,DOOR,EXIT,255,255,0,NULLROOM,22);
- _objectState[3] = Object(_id, "Dschungel","Lauter B\204ume.",JUNGLE,NULLTYPE,255,255,0,STATION,2);
+ _objectState[0] = Object(_id, kStringButton,kStringDefaultDescription,BUTTON1,PRESS,0,0,0);
+ _objectState[1] = Object(_id, kStringButton,kStringDefaultDescription,BUTTON2,PRESS,1,1,0);
+ _objectState[2] = Object(_id, kStringExit,kStringDefaultDescription,DOOR,EXIT,255,255,0,NULLROOM,22);
+ _objectState[3] = Object(_id, kStringJungle,kStringJungleDescription,JUNGLE,NULLTYPE,255,255,0,STATION,2);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -1610,8 +1560,8 @@ public:
_fileNumber = 5;
_id = STATION;
_shown[0] = true;
- _objectState[0] = Object(_id, "Schild",Object::defaultDescription,STATION_SIGN,NULLTYPE,0,0,0);
- _objectState[1] = Object(_id, "T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|CLOSED,1,1,0,NULLROOM,7);
+ _objectState[0] = Object(_id, kStringSign,kStringDefaultDescription,STATION_SIGN,NULLTYPE,0,0,0);
+ _objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|CLOSED,1,1,0,NULLROOM,7);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -1627,8 +1577,8 @@ public:
_shown[0] = true;
_shown[1] = true;
- _objectState[0] = Object(_id, "Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,STATION,22);
- _objectState[1] = Object(_id, "Schlitz",Object::defaultDescription,STATION_SLOT,COMBINABLE,0,0,0);
+ _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,STATION,22);
+ _objectState[1] = Object(_id, kStringSlot,kStringDefaultDescription,STATION_SLOT,COMBINABLE,0,0,0);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -1636,29 +1586,7 @@ public:
class Outro : public Room {
public:
- Outro(SupernovaEngine *vm, GameManager *gm) {
- _vm = vm;
- _gm = gm;
-
- _fileNumber = -1;
- _id = OUTRO;
- _shown[0] = false;
-
- outroText = "^ E#N#D#E ...########"
- "# ... des ersten Teils!########"
- "#########"
- "^Aber:#"
- "Das Abenteuer geht weiter, ...##"
- "... wenn Sie sich für 30,- DM registrieren lassen!##"
- "(Falls Sie das nicht schon längst getan haben.)##"
- "In^ Teil 2 - Der Doppelgänger^ erwarten Sie:##"
- "Knifflige Puzzles,##"
- "noch mehr Grafik und Sound,##"
- "ein perfekt geplanter Museumseinbruch,##"
- "das Virtual-Reality-Spiel \"Indiana Joe\"##"
- "und vieles mehr!##"
- "°";
- }
+ Outro(SupernovaEngine *vm, GameManager *gm);
virtual void onEntrance();
virtual void animation();
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index cbb740f..6fa20aa 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -857,7 +857,7 @@ void GameManager::drawInventory() {
_guiInventory[i].width(),
_guiInventory[i].height(),
_guiInventory[i]._bgColor);
- _vm->renderText(_inventory.get(i + _inventoryScroll)->_name.c_str(),
+ _vm->renderText(_inventory.get(i + _inventoryScroll)->_name,
_guiInventory[i]._textPosition.x,
_guiInventory[i]._textPosition.y,
_guiInventory[i]._textColor);
@@ -1178,16 +1178,16 @@ void GameManager::drawStatus() {
_vm->renderText(_vm->getGameString(guiStatusCommands[index]), 1, 141, kColorDarkGreen);
if (Object::isNullObject(_inputObject[0])) {
- _vm->renderText(_currentInputObject->_name.c_str());
+ _vm->renderText(_currentInputObject->_name);
} else {
- _vm->renderText(_inputObject[0]->_name.c_str());
+ _vm->renderText(_inputObject[0]->_name);
if (_inputVerb == ACTION_GIVE) {
_vm->renderText(" an ");
} else if (_inputVerb == ACTION_USE) {
_vm->renderText(" mit ");
}
- _vm->renderText(_currentInputObject->_name.c_str());
+ _vm->renderText(_currentInputObject->_name);
}
}
@@ -1321,8 +1321,8 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
roomBrightness();
_vm->renderMessage("Hmm, irgendwie komme|ich mir verarscht vor.");
} else if ((verb == ACTION_LOOK) && (obj1._id == KEYCARD2)) {
- _vm->renderMessage(obj1._description.c_str());
- obj1._description = "Es ist die Keycard des Commanders.";
+ _vm->renderMessage(obj1._description);
+ obj1._description = kStringKeycard2Description2;
} else if ((verb == ACTION_LOOK) && (obj1._id == WATCH)) {
_vm->renderMessage(Common::String::format(
"Es ist eine Uhr mit extra|lautem Wecker. "
@@ -1392,11 +1392,11 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
r = _rooms[CABIN_L3];
if (!r->getObject(8)->hasProperty(CARRIED)) {
if (r->isSectionVisible(26))
- _vm->renderMessage(Object::takeMessage);
+ _vm->renderMessage(kStringTakeMessage);
else
return false;
} else {
- r->getObject(8)->_name = "Leitung mit L\201sterklemme";
+ r->getObject(8)->_name = kStringWireAndClip;
r = _rooms[HOLD];
_inventory.remove(*r->getObject(2));
_state._terminalStripConnected = true;
@@ -1406,7 +1406,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, SPOOL)) {
r = _rooms[CABIN_L2];
takeObject(*r->getObject(9));
- r->getObject(9)->_name = "Kabelrolle mit L\201sterklemme";
+ r->getObject(9)->_name = kSringSpoolAndClip;
r = _rooms[HOLD];
_inventory.remove(*r->getObject(2));
_state._terminalStripConnected = true;
@@ -1420,12 +1420,12 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
return false;
} else {
if (!r->getObject(8)->hasProperty(CARRIED)) {
- _vm->renderMessage(Object::takeMessage);
+ _vm->renderMessage(kStringTakeMessage);
} else {
r = _rooms[CABIN_L2];
takeObject(*r->getObject(9));
r = _rooms[CABIN_L3];
- r->getObject(8)->_name = "langes Kabel mit Stecker";
+ r->getObject(8)->_name = kStringGeneratorWire;
r = _rooms[CABIN_L2];
_inventory.remove(*r->getObject(9));
_state._cableConnected = true;
@@ -1537,7 +1537,7 @@ void GameManager::handleInput() {
if (!validCommand) {
switch (_inputVerb) {
case ACTION_LOOK:
- _vm->renderMessage(_inputObject[0]->_description.c_str());
+ _vm->renderMessage(_inputObject[0]->_description);
break;
case ACTION_WALK:
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 67c6fdd..4124703 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -70,8 +70,6 @@ const AudioInfo audioInfo[kAudioNumSamples] = {
{54, 31040, -1}
};
-const char *const Object::defaultDescription = "Es ist nichts Besonderes daran.";
-const char *const Object::takeMessage = "Das mußt du erst nehmen.";
const Object Object::nullObject = Object();
ObjectType operator|(ObjectType a, ObjectType b) {
@@ -906,7 +904,8 @@ bool SupernovaEngine::loadGame(int slot) {
}
byte saveVersion = savefile->readByte();
- if (saveVersion > SAVEGAME_VERSION) {
+ // Save version 1 was used during development and is no longer supported
+ if (saveVersion > SAVEGAME_VERSION || saveVersion == 1) {
warning("Save game version %i not supported", saveVersion);
delete savefile;
return Common::kUnknownError;
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index cc6cfbb..756c846 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -43,7 +43,7 @@
namespace Supernova {
#define SAVEGAME_HEADER MKTAG('M','S','N','1')
-#define SAVEGAME_VERSION 1
+#define SAVEGAME_VERSION 2
#define SUPERNOVA_DAT "supernova.dat"
#define SUPERNOVA_DAT_VERSION 1
@@ -166,10 +166,16 @@ public:
if (!text.empty())
renderMessage(text.c_str(), position);
}
+ void renderText(StringID stringId, int x, int y, byte color) {
+ renderText(getGameString(stringId), x, y, color);
+ }
void renderText(const Common::String &text, int x, int y, byte color) {
if (!text.empty())
renderText(text.c_str(), x, y, color);
}
+ void renderText(StringID stringId) {
+ renderText(getGameString(stringId));
+ }
void renderText(const Common::String &text) {
if (!text.empty())
renderText(text.c_str());
Commit: 6cadee9d19f1a1e8b9c95291e0675241c9d3f92e
https://github.com/scummvm/scummvm/commit/6cadee9d19f1a1e8b9c95291e0675241c9d3f92e
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:33Z
Commit Message:
SUPERNOVA: Update English translation
Changed paths:
devtools/create_supernova/strings-en.po
diff --git a/devtools/create_supernova/strings-en.po b/devtools/create_supernova/strings-en.po
index b2be1cc..30dc4fe 100644
--- a/devtools/create_supernova/strings-en.po
+++ b/devtools/create_supernova/strings-en.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Mission Supernova 1.0\n"
"Report-Msgid-Bugs-To: scummvm-devel at lists.scummvm.org\n"
"POT-Creation-Date: 2017-07-21 23:49+0100\n"
-"PO-Revision-Date: 2017-09-03 15:57+0000\n"
+"PO-Revision-Date: 2017-09-29 19:51+0000\n"
"Last-Translator: Thierry Crozat <criezy at scummvm.org>\n"
"Language-Team: none\n"
"Language: en\n"
@@ -2287,7 +2287,7 @@ msgstr ""
#: ../../msn/msn_r3.c:657
msgid "Hmm, er scheint kaputt zu sein."
-msgstr ""
+msgstr "Hmm, it seems to be broken."
#: ../../msn/msn_r3.c:658
msgid "Hmm, it seems to be broken."
Commit: 095679c4f2e2c284c9e2f5f40bd1b0b9fa1417c7
https://github.com/scummvm/scummvm/commit/095679c4f2e2c284c9e2f5f40bd1b0b9fa1417c7
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:33Z
Commit Message:
SUPERNOVA: Move intro cutscene strings to engine data file
Changed paths:
devtools/create_supernova/gametext.h
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
engines/supernova/rooms.h
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index 83867d2..99cdb1d 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -373,56 +373,56 @@ const char *gameText[] = {
"Es ist die Keycard des Commanders.", // kStringKeycard2Description2
// 280
"Kabelrolle mit L\201sterklemme", // kSringSpoolAndClip
- "", //
- "", //
- "", //
- "", //
+ "Zwei Tage nach dem Start|im Cockpit der \"Supernova\" ...", // kStringIntroCutscene1
+ "Entferung von der Sonne: 1 500 000 km.|Gehen Sie auf 8000 hpm, Captain!", // kStringIntroCutscene2
+ "Ok, Sir.", // kStringIntroCutscene3
+ "Geschwindigkeit:", // kStringIntroCutscene4
// 285
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Zweitausend hpm", // kStringIntroCutscene5
+ "Dreitausend", // kStringIntroCutscene6
+ "Viertausend", // kStringIntroCutscene7
+ "F\201nftausend", // kStringIntroCutscene8
+ "Sechstausend", // kStringIntroCutscene9
// 290
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Siebentausend", // kStringIntroCutscene10
+ "Achttau...", // kStringIntroCutscene11
+ "Was war das?", // kStringIntroCutscene12
+ "Keine Ahnung, Sir.", // kStringIntroCutscene13
+ "Ingenieur an Commander, bitte kommen!", // kStringIntroCutscene14
// 295
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Was ist los?", // kStringIntroCutscene15
+ "Wir haben einen Druckabfall im Hauptantriebssystem, Sir.|Einen Moment, ich schaue sofort nach, woran es liegt.", // kStringIntroCutscene16
+ "Schei\341e, der Ionenantrieb ist explodiert!|Die Teile sind \201ber den ganzen|Maschinenraum verstreut.", // kStringIntroCutscene17
+ "Ach, du meine G\201te!|Gibt es irgendeine M\224glichkeit,|den Schaden schnell zu beheben?", // kStringIntroCutscene18
+ "Nein, Sir. Es sieht schlecht aus.", // kStringIntroCutscene19
// 300
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Hmm, die Erde zu alarmieren, w\201rde zu lange dauern.", // kStringIntroCutscene20
+ "Ich darf kein Risiko eingehen.|Captain, geben Sie sofort Alarm!", // kStringIntroCutscene21
+ "Commander an alle! Achtung, Achtung!|Begeben Sie sich sofort zum Notraumschiff!", // kStringIntroCutscene22
+ "Ich wiederhole:|Begeben Sie sich sofort zum Notraumschiff!", // kStringIntroCutscene23
+ "Captain, bereiten Sie alles für den Start vor!|Wir m\201ssen zur\201ck zur Erde!", // kStringIntroCutscene24
// 305
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Eine Stunde sp\204ter ...", // kStringIntroCutscene25
+ "Die Besatzung hat die \"Supernova\" verlassen.", // kStringIntroCutscene26
+ "Das Schiff wird zwar in acht Jahren sein Ziel|erreichen, allerdings ohne Mannschaft.", // kStringIntroCutscene27
+ "Das ist das kl\204gliche Ende|der Mission Supernova.", // kStringIntroCutscene28
+ "Sie k\224nnen jetzt ihren Computer ausschalten.", // kStringIntroCutscene29
// 310
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Halt!", // kStringIntroCutscene30
+ "Warten Sie!", // kStringIntroCutscene31
+ "Es regt sich etwas im Schiff.", // kStringIntroCutscene32
+ "Uuuuaaaahhhhh", // kStringIntroCutscene33
+ "Huch, ich bin ja gefesselt!|Wo bin ich?", // kStringIntroCutscene34
// 315
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Ach so, das sind ja die Sicherheitsgurte.|Ich arbeite ja jetzt in diesem Raumschiff hier.", // kStringIntroCutscene35
+ "Was? Schon zwei Uhr! Wieso|hat mich denn noch keiner|aus dem Bett geschmissen?", // kStringIntroCutscene36
+ "Ich werde mal nachsehen.", // kStringIntroCutscene37
+ "Autsch!", // kStringIntroCutscene38
+ "Schei\341etagenbett!", // kStringIntroCutscene39
// 320
- "", //
- "", //
- "", //
+ "Erst mal den Lichtschalter finden.", // kStringIntroCutscene40
+ "Hmm, gar nicht so einfach|bei Schwerelosigkeit.", // kStringIntroCutscene41
+ "Ah, hier ist er.", // kStringIntroCutscene42
"", //
"", //
// 325
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 84c0864..ad51db3 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -464,7 +464,16 @@ enum StringID {
kStringOutro8, kStringOutro9, kStringOutro10, kStringOutro11, kStringOutro12,
kStringOutro13, kStringOutro14, kStringWireAndPlug, kStringWireAndClip, kStringWireAndPlug2,
kStringSignDescription2, kStringCoin, kStringDoorDescription5, kStringDoorDescription6, kStringKeycard2Description2,
- kSringSpoolAndClip
+ kSringSpoolAndClip, kStringIntroCutscene1, kStringIntroCutscene2, kStringIntroCutscene3, kStringIntroCutscene4,
+ kStringIntroCutscene5, kStringIntroCutscene6, kStringIntroCutscene7, kStringIntroCutscene8, kStringIntroCutscene9,
+ kStringIntroCutscene10, kStringIntroCutscene11, kStringIntroCutscene12, kStringIntroCutscene13, kStringIntroCutscene14,
+ kStringIntroCutscene15, kStringIntroCutscene16, kStringIntroCutscene17, kStringIntroCutscene18, kStringIntroCutscene19,
+ // 300
+ kStringIntroCutscene20, kStringIntroCutscene21, kStringIntroCutscene22, kStringIntroCutscene23, kStringIntroCutscene24,
+ kStringIntroCutscene25, kStringIntroCutscene26, kStringIntroCutscene27, kStringIntroCutscene28, kStringIntroCutscene29,
+ kStringIntroCutscene30, kStringIntroCutscene31, kStringIntroCutscene32, kStringIntroCutscene33, kStringIntroCutscene34,
+ kStringIntroCutscene35, kStringIntroCutscene36, kStringIntroCutscene37, kStringIntroCutscene38, kStringIntroCutscene39,
+ kStringIntroCutscene40, kStringIntroCutscene41, kStringIntroCutscene42
};
static StringID guiCommands[] = {
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index b326840..fde692e 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -198,9 +198,10 @@ void Intro::animate(int filenumber, int section1, int section2, int duration) {
}
void Intro::animate(int filenumber, int section1, int section2, int duration,
- MessagePosition position, const char *text) {
+ MessagePosition position, StringID textId) {
+ const Common::String& text = _vm->getGameString(textId);
_vm->renderMessage(text, position);
- int delay = (Common::strnlen(text, 512) + 20) * (10 - duration) * _vm->_textSpeed / 400;
+ int delay = (MIN(text.size(), (uint)512) + 20) * (10 - duration) * _vm->_textSpeed / 400;
while (delay) {
if (section1)
_vm->renderImage(filenumber, section1);
@@ -214,10 +215,11 @@ void Intro::animate(int filenumber, int section1, int section2, int duration,
}
void Intro::animate(int filenumber, int section1, int section2, int section3, int section4,
- int duration, MessagePosition position, const char *text) {
+ int duration, MessagePosition position, StringID textId) {
+ const Common::String& text = _vm->getGameString(textId);
_vm->renderMessage(text, position);
if (duration == 0)
- duration = (Common::strnlen(text, 512) + 20) * _vm->_textSpeed / 40;
+ duration = (MIN(text.size(), (uint)512) + 20) * _vm->_textSpeed / 40;
while(duration) {
_vm->renderImage(filenumber, section1);
@@ -241,7 +243,7 @@ void Intro::cutscene() {
_vm->_system->fillScreen(kColorBlack);
_vm->_menuBrightness = 255;
_vm->paletteBrightness();
- animate(31, 0, 0, 0, kMessageNormal, "Zwei Tage nach dem Start|im Cockpit der \"Supernova\" ...");
+ animate(31, 0, 0, 0, kMessageNormal, kStringIntroCutscene1);
_vm->_menuBrightness = 0;
_vm->paletteBrightness();
exitOnEscape(1);
@@ -250,13 +252,13 @@ void Intro::cutscene() {
_vm->renderImage(9, 1);
_vm->renderImage(9, 9);
_vm->paletteFadeIn();
- animate(9,11,10,6,kMessageRight,"Entferung von der Sonne: 1 500 000 km.|Gehen Sie auf 8000 hpm, Captain!");
+ animate(9,11,10,6,kMessageRight,kStringIntroCutscene2);
_vm->renderImage(9, 3);
exitOnEscape(4);
_vm->renderImage(9, 4);
animate(9, 11,10,3); // test duration
_vm->removeMessage();
- animate(9, 5,4,0,kMessageLeft,"Ok, Sir.");
+ animate(9, 5,4,0,kMessageLeft,kStringIntroCutscene3);
_vm->renderImage(9, 3);
exitOnEscape(3);
_vm->renderImage(9, 2);
@@ -265,16 +267,16 @@ void Intro::cutscene() {
exitOnEscape(6);
_vm->renderImage(9, 6);
exitOnEscape(6);
- animate(9, 0,0,0,kMessageLeft,"Geschwindigkeit:");
- _vm->renderMessage("Zweitausend hpm", kMessageLeft);
+ animate(9, 0,0,0,kMessageLeft,kStringIntroCutscene4);
+ _vm->renderMessage(kStringIntroCutscene5, kMessageLeft);
exitOnEscape(28);
_vm->removeMessage();
- _vm->renderMessage("Dreitausend", kMessageLeft);
+ _vm->renderMessage(kStringIntroCutscene6, kMessageLeft);
exitOnEscape(28);
_vm->removeMessage();
- const char *textCounting[4] =
- {"Viertausend","F\201nftausend","Sechstausend","Siebentausend"};
+ StringID textCounting[4] =
+ {kStringIntroCutscene7,kStringIntroCutscene8,kStringIntroCutscene9,kStringIntroCutscene10};
_vm->renderImage(31, 0);
_vm->paletteBrightness();
for (int i = 0; i < 4; ++i){
@@ -285,7 +287,7 @@ void Intro::cutscene() {
}
_vm->removeMessage();
}
- _vm->renderMessage("Achttau...", kMessageLeft);
+ _vm->renderMessage(kStringIntroCutscene11, kMessageLeft);
_vm->renderImage(31, 6);
exitOnEscape(3);
_vm->renderImage(31, 3);
@@ -304,29 +306,29 @@ void Intro::cutscene() {
_vm->paletteBrightness();
_vm->renderBox(0, 138, 320, 62, kColorBlack);
_vm->paletteBrightness();
- animate(9, 11,10,0,kMessageRight,"Was war das?");
+ animate(9, 11,10,0,kMessageRight,kStringIntroCutscene12);
_vm->renderImage(9, 3);
exitOnEscape(3);
_vm->renderImage(9, 4);
- animate(9, 5,4,0,kMessageLeft,"Keine Ahnung, Sir.");
- animate(9, 0,0,0,kMessageCenter,"Ingenieur an Commander, bitte kommen!");
+ animate(9, 5,4,0,kMessageLeft,kStringIntroCutscene13);
+ animate(9, 0,0,0,kMessageCenter,kStringIntroCutscene14);
_vm->renderImage(9, 12);
exitOnEscape(2);
_vm->renderImage(9, 13);
exitOnEscape(2);
_vm->renderImage(9, 14);
- animate(9, 19,20,0,kMessageRight,"Was ist los?");
- animate(9, 0,0,0,kMessageCenter,"Wir haben einen Druckabfall im Hauptantriebssystem, Sir.|Einen Moment, ich schaue sofort nach, woran es liegt.");
+ animate(9, 19,20,0,kMessageRight,kStringIntroCutscene15);
+ animate(9, 0,0,0,kMessageCenter,kStringIntroCutscene16);
exitOnEscape(20);
- animate(9, 0,0,0,kMessageCenter,"Schei\341e, der Ionenantrieb ist explodiert!|Die Teile sind \201ber den ganzen|Maschinenraum verstreut.");
- animate(9, 19,20,0,kMessageRight,"Ach, du meine G\201te!|Gibt es irgendeine M\224glichkeit,|den Schaden schnell zu beheben?");
- animate(9, 0,0,0,kMessageCenter,"Nein, Sir. Es sieht schlecht aus.");
+ animate(9, 0,0,0,kMessageCenter,kStringIntroCutscene17);
+ animate(9, 19,20,0,kMessageRight,kStringIntroCutscene18);
+ animate(9, 0,0,0,kMessageCenter,kStringIntroCutscene19);
_vm->renderImage(9, 16);
exitOnEscape(3);
_vm->renderImage(9, 17);
- animate(9, 19,20,18,17,0,kMessageRight,"Hmm, die Erde zu alarmieren, w\201rde zu lange dauern.");
- animate(9, 19,20,18,17,0,kMessageRight,"Ich darf kein Risiko eingehen.|Captain, geben Sie sofort Alarm!");
- animate(9, 5,4,0,kMessageLeft,"Ok, Sir.");
+ animate(9, 19,20,18,17,0,kMessageRight,kStringIntroCutscene20);
+ animate(9, 19,20,18,17,0,kMessageRight,kStringIntroCutscene21);
+ animate(9, 5,4,0,kMessageLeft,kStringIntroCutscene3);
_vm->renderImage(9, 3);
exitOnEscape(3);
_vm->renderImage(9, 2);
@@ -343,16 +345,16 @@ void Intro::cutscene() {
_vm->renderImage(9, 16);
exitOnEscape(3);
_vm->renderImage(9, 15);
- animate(9, 19,20,0,kMessageRight,"Commander an alle! Achtung, Achtung!|Begeben Sie sich sofort zum Notraumschiff!");
- animate(9, 19,20,0,kMessageRight,"Ich wiederhole:|Begeben Sie sich sofort zum Notraumschiff!");
+ animate(9, 19,20,0,kMessageRight,kStringIntroCutscene22);
+ animate(9, 19,20,0,kMessageRight,kStringIntroCutscene23);
exitOnEscape(10);
_vm->renderImage(9, 13);
exitOnEscape(2);
_vm->renderImage(9, 12);
exitOnEscape(2);
_vm->renderImage(9, 9);
- animate(9, 11,10,0,kMessageRight,"Captain, bereiten Sie alles für den Start vor!|Wir m\201ssen zur\201ck zur Erde!");
- animate(9, 5,4,0,kMessageLeft,"Ok, Sir.");
+ animate(9, 11,10,0,kMessageRight,kStringIntroCutscene24);
+ animate(9, 5,4,0,kMessageLeft,kStringIntroCutscene3);
_vm->paletteFadeOut();
while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
@@ -361,20 +363,20 @@ void Intro::cutscene() {
_vm->_system->fillScreen(kColorBlack);
_vm->_menuBrightness = 255;
_vm->paletteBrightness();
- animate(9,0,0,0,kMessageNormal,"Eine Stunde sp\204ter ...");
+ animate(9,0,0,0,kMessageNormal,kStringIntroCutscene25);
_vm->_menuBrightness = 5;
_vm->paletteBrightness();
_vm->renderImage(31, 0);
_vm->paletteFadeIn();
- animate(31, 0,0,0,kMessageNormal,"Die Besatzung hat die \"Supernova\" verlassen.");
- animate(31, 0,0,0,kMessageNormal,"Das Schiff wird zwar in acht Jahren sein Ziel|erreichen, allerdings ohne Mannschaft.");
- animate(31, 0,0,0,kMessageNormal,"Das ist das kl\204gliche Ende|der Mission Supernova.");
- animate(31, 0,0,0,kMessageNormal,"Sie k\224nnen jetzt ihren Computer ausschalten.");
+ animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene26);
+ animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene27);
+ animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene28);
+ animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene29);
exitOnEscape(54);
- animate(31, 0,0,0,kMessageNormal,"Halt!");
- animate(31, 0,0,0,kMessageNormal,"Warten Sie!");
- animate(31, 0,0,0,kMessageNormal,"Es regt sich etwas im Schiff.");
+ animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene30);
+ animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene31);
+ animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene32);
_vm->_brightness = 0;
_vm->paletteBrightness();
@@ -391,20 +393,20 @@ void Intro::cutscene() {
while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
;
exitOnEscape(30);
- animate(22, 0,0,0,kMessageNormal,"Uuuuaaaahhhhh");
+ animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene33);
exitOnEscape(18);
- animate(22, 0,0,0,kMessageNormal,"Huch, ich bin ja gefesselt!|Wo bin ich?");
- animate(22, 0,0,0,kMessageNormal,"Ach so, das sind ja die Sicherheitsgurte.|Ich arbeite ja jetzt in diesem Raumschiff hier.");
- animate(22, 0,0,0,kMessageNormal,"Was? Schon zwei Uhr! Wieso|hat mich denn noch keiner|aus dem Bett geschmissen?");
- animate(22, 0,0,0,kMessageNormal,"Ich werde mal nachsehen.");
+ animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene34);
+ animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene35);
+ animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene36);
+ animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene37);
exitOnEscape(18);
- animate(22, 0,0,0,kMessageNormal,"Autsch!");
- animate(22, 0,0,0,kMessageNormal,"Schei\341etagenbett!");
+ animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene38);
+ animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene39);
exitOnEscape(18);
- animate(22, 0,0,0,kMessageNormal,"Erst mal den Lichtschalter finden.");
- animate(22, 0,0,0,kMessageNormal,"Hmm, gar nicht so einfach|bei Schwerelosigkeit.");
+ animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene40);
+ animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene41);
exitOnEscape(36);
- animate(22, 0,0,0,kMessageNormal,"Ah, hier ist er.");
+ animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene42);
_vm->removeMessage();
#undef exitOnEscape
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 9b8b4e2..11d36b1 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -94,9 +94,9 @@ public:
private:
void animate(int filenumber, int section1, int section2, int duration);
void animate(int filenumber, int section1, int section2, int duration, MessagePosition position,
- const char *text);
+ StringID text);
void animate(int filenumber, int section1, int section2, int section3, int section4, int duration,
- MessagePosition position, const char *text);
+ MessagePosition position, StringID text);
void titleScreen();
void titleFadeIn();
Commit: 69d7b919657ba954f6f8c3dc505f4baf02d1421d
https://github.com/scummvm/scummvm/commit/69d7b919657ba954f6f8c3dc505f4baf02d1421d
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:33Z
Commit Message:
SUPERNOVA: Improve interactivity of title screen and intro cutscene
We can now press the mouse button to leave the title screen instead
of having to press a key. Since the mouse cursor was visible, not
being able to press the mouse button was strange. Especially as it
was possible to use the mouse button earlier in the title screen.
Also we can now use the mouse button or any key other than escape
during the cutscene to move to the next sentence. And the code is
more reactive to pressing the Escape key (we don't need to wait
for the current annimation to finish) to exit the cutscene.
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/rooms.h
engines/supernova/state.cpp
engines/supernova/state.h
engines/supernova/supernova.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index fde692e..6aefe80 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -160,8 +160,7 @@ void Intro::titleScreen() {
_gm->wait2(1);
CursorMan.showMouse(true);
_vm->playSoundMod(kMusicIntro);
- _gm->getKeyInput();
- _gm->_key.reset();
+ _gm->getInput();
// TODO: render animated text
_vm->playSound(kAudioVoiceYeah);
while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle));
@@ -187,35 +186,48 @@ void Intro::titleFadeIn() {
}
}
-void Intro::animate(int filenumber, int section1, int section2, int duration) {
+bool Intro::animate(int filenumber, int section1, int section2, int duration) {
+ Common::KeyCode key = Common::KEYCODE_INVALID;
while (duration) {
_vm->renderImage(filenumber, section1);
- _gm->wait2(2);
+ if (_gm->waitOnInput(2, key))
+ return key != Common::KEYCODE_ESCAPE;
_vm->renderImage(filenumber, section2);
- _gm->wait2(2);
+ if (_gm->waitOnInput(2, key))
+ return key != Common::KEYCODE_ESCAPE;
--duration;
}
+ return true;
}
-void Intro::animate(int filenumber, int section1, int section2, int duration,
+bool Intro::animate(int filenumber, int section1, int section2, int duration,
MessagePosition position, StringID textId) {
+ Common::KeyCode key = Common::KEYCODE_INVALID;
const Common::String& text = _vm->getGameString(textId);
_vm->renderMessage(text, position);
int delay = (MIN(text.size(), (uint)512) + 20) * (10 - duration) * _vm->_textSpeed / 400;
while (delay) {
if (section1)
_vm->renderImage(filenumber, section1);
- _gm->wait2(2);
+ if (_gm->waitOnInput(2, key)) {
+ _vm->removeMessage();
+ return key != Common::KEYCODE_ESCAPE;
+ }
if (section2)
_vm->renderImage(filenumber, section2);
- _gm->wait2(2);
+ if (_gm->waitOnInput(2, key)) {
+ _vm->removeMessage();
+ return key != Common::KEYCODE_ESCAPE;
+ }
--delay;
}
_vm->removeMessage();
+ return true;
}
-void Intro::animate(int filenumber, int section1, int section2, int section3, int section4,
+bool Intro::animate(int filenumber, int section1, int section2, int section3, int section4,
int duration, MessagePosition position, StringID textId) {
+ Common::KeyCode key = Common::KEYCODE_INVALID;
const Common::String& text = _vm->getGameString(textId);
_vm->renderMessage(text, position);
if (duration == 0)
@@ -224,26 +236,34 @@ void Intro::animate(int filenumber, int section1, int section2, int section3, in
while(duration) {
_vm->renderImage(filenumber, section1);
_vm->renderImage(filenumber, section3);
- _gm->wait2(2);
+ if (_gm->waitOnInput(2, key)) {
+ _vm->removeMessage();
+ return key != Common::KEYCODE_ESCAPE;
+ }
_vm->renderImage(filenumber, section2);
_vm->renderImage(filenumber, section4);
- _gm->wait2(2);
+ if (_gm->waitOnInput(2, key)) {
+ _vm->removeMessage();
+ return key != Common::KEYCODE_ESCAPE;
+ }
duration--;
}
_vm->removeMessage();
+ return true;
}
void Intro::cutscene() {
#define exitOnEscape(X) do { \
- _gm->wait2(X); \
- if (_gm->keyPressed(Common::KEYCODE_ESCAPE, true)) \
+ Common::KeyCode key = Common::KEYCODE_INVALID; \
+ if (_gm->waitOnInput(X, key) && key == Common::KEYCODE_ESCAPE) \
return; \
} while (0);
_vm->_system->fillScreen(kColorBlack);
_vm->_menuBrightness = 255;
_vm->paletteBrightness();
- animate(31, 0, 0, 0, kMessageNormal, kStringIntroCutscene1);
+ if (!animate(31, 0, 0, 0, kMessageNormal, kStringIntroCutscene1))
+ return;
_vm->_menuBrightness = 0;
_vm->paletteBrightness();
exitOnEscape(1);
@@ -252,13 +272,18 @@ void Intro::cutscene() {
_vm->renderImage(9, 1);
_vm->renderImage(9, 9);
_vm->paletteFadeIn();
- animate(9,11,10,6,kMessageRight,kStringIntroCutscene2);
+ if (!animate(9,11,10,6,kMessageRight,kStringIntroCutscene2))
+ return;
_vm->renderImage(9, 3);
exitOnEscape(4);
_vm->renderImage(9, 4);
- animate(9, 11,10,3); // test duration
+ if (!animate(9, 11,10,3)) {// test duration
+ _vm->removeMessage();
+ return;
+ }
_vm->removeMessage();
- animate(9, 5,4,0,kMessageLeft,kStringIntroCutscene3);
+ if (!animate(9, 5,4,0,kMessageLeft,kStringIntroCutscene3))
+ return;
_vm->renderImage(9, 3);
exitOnEscape(3);
_vm->renderImage(9, 2);
@@ -267,7 +292,8 @@ void Intro::cutscene() {
exitOnEscape(6);
_vm->renderImage(9, 6);
exitOnEscape(6);
- animate(9, 0,0,0,kMessageLeft,kStringIntroCutscene4);
+ if (!animate(9, 0,0,0,kMessageLeft,kStringIntroCutscene4))
+ return;
_vm->renderMessage(kStringIntroCutscene5, kMessageLeft);
exitOnEscape(28);
_vm->removeMessage();
@@ -283,7 +309,12 @@ void Intro::cutscene() {
_vm->renderMessage(textCounting[i], kMessageLeft);
for (int j = 0; j < 28; ++j) {
_vm->renderImage(31, (j % 3) + 1);
- exitOnEscape(1);
+ Common::KeyCode key = Common::KEYCODE_INVALID;
+ if (_gm->waitOnInput(1, key)) {
+ if (key == Common::KEYCODE_ESCAPE)
+ return;
+ break;
+ }
}
_vm->removeMessage();
}
@@ -306,29 +337,40 @@ void Intro::cutscene() {
_vm->paletteBrightness();
_vm->renderBox(0, 138, 320, 62, kColorBlack);
_vm->paletteBrightness();
- animate(9, 11,10,0,kMessageRight,kStringIntroCutscene12);
+ if (!animate(9, 11,10,0,kMessageRight,kStringIntroCutscene12))
+ return;
_vm->renderImage(9, 3);
exitOnEscape(3);
_vm->renderImage(9, 4);
- animate(9, 5,4,0,kMessageLeft,kStringIntroCutscene13);
- animate(9, 0,0,0,kMessageCenter,kStringIntroCutscene14);
+ if (!animate(9, 5,4,0,kMessageLeft,kStringIntroCutscene13))
+ return;
+ if (!animate(9, 0,0,0,kMessageCenter,kStringIntroCutscene14))
+ return;
_vm->renderImage(9, 12);
exitOnEscape(2);
_vm->renderImage(9, 13);
exitOnEscape(2);
_vm->renderImage(9, 14);
- animate(9, 19,20,0,kMessageRight,kStringIntroCutscene15);
- animate(9, 0,0,0,kMessageCenter,kStringIntroCutscene16);
+ if (!animate(9, 19,20,0,kMessageRight,kStringIntroCutscene15))
+ return;
+ if (!animate(9, 0,0,0,kMessageCenter,kStringIntroCutscene16))
+ return;
exitOnEscape(20);
- animate(9, 0,0,0,kMessageCenter,kStringIntroCutscene17);
- animate(9, 19,20,0,kMessageRight,kStringIntroCutscene18);
- animate(9, 0,0,0,kMessageCenter,kStringIntroCutscene19);
+ if (!animate(9, 0,0,0,kMessageCenter,kStringIntroCutscene17))
+ return;
+ if (!animate(9, 19,20,0,kMessageRight,kStringIntroCutscene18))
+ return;
+ if (!animate(9, 0,0,0,kMessageCenter,kStringIntroCutscene19))
+ return;
_vm->renderImage(9, 16);
exitOnEscape(3);
_vm->renderImage(9, 17);
- animate(9, 19,20,18,17,0,kMessageRight,kStringIntroCutscene20);
- animate(9, 19,20,18,17,0,kMessageRight,kStringIntroCutscene21);
- animate(9, 5,4,0,kMessageLeft,kStringIntroCutscene3);
+ if (!animate(9, 19,20,18,17,0,kMessageRight,kStringIntroCutscene20))
+ return;
+ if (!animate(9, 19,20,18,17,0,kMessageRight,kStringIntroCutscene21))
+ return;
+ if (!animate(9, 5,4,0,kMessageLeft,kStringIntroCutscene3))
+ return;
_vm->renderImage(9, 3);
exitOnEscape(3);
_vm->renderImage(9, 2);
@@ -345,16 +387,20 @@ void Intro::cutscene() {
_vm->renderImage(9, 16);
exitOnEscape(3);
_vm->renderImage(9, 15);
- animate(9, 19,20,0,kMessageRight,kStringIntroCutscene22);
- animate(9, 19,20,0,kMessageRight,kStringIntroCutscene23);
+ if (!animate(9, 19,20,0,kMessageRight,kStringIntroCutscene22))
+ return;
+ if (!animate(9, 19,20,0,kMessageRight,kStringIntroCutscene23))
+ return;
exitOnEscape(10);
_vm->renderImage(9, 13);
exitOnEscape(2);
_vm->renderImage(9, 12);
exitOnEscape(2);
_vm->renderImage(9, 9);
- animate(9, 11,10,0,kMessageRight,kStringIntroCutscene24);
- animate(9, 5,4,0,kMessageLeft,kStringIntroCutscene3);
+ if (!animate(9, 11,10,0,kMessageRight,kStringIntroCutscene24))
+ return;
+ if (!animate(9, 5,4,0,kMessageLeft,kStringIntroCutscene3))
+ return;
_vm->paletteFadeOut();
while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
@@ -363,20 +409,28 @@ void Intro::cutscene() {
_vm->_system->fillScreen(kColorBlack);
_vm->_menuBrightness = 255;
_vm->paletteBrightness();
- animate(9,0,0,0,kMessageNormal,kStringIntroCutscene25);
+ if (!animate(9,0,0,0,kMessageNormal,kStringIntroCutscene25))
+ return;
_vm->_menuBrightness = 5;
_vm->paletteBrightness();
_vm->renderImage(31, 0);
_vm->paletteFadeIn();
- animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene26);
- animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene27);
- animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene28);
- animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene29);
+ if (!animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene26))
+ return;
+ if (!animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene27))
+ return;
+ if (!animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene28))
+ return;
+ if (!animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene29))
+ return;
exitOnEscape(54);
- animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene30);
- animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene31);
- animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene32);
+ if (!animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene30))
+ return;
+ if (!animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene31))
+ return;
+ if (!animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene32))
+ return;
_vm->_brightness = 0;
_vm->paletteBrightness();
@@ -393,18 +447,27 @@ void Intro::cutscene() {
while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
;
exitOnEscape(30);
- animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene33);
+ if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene33))
+ return;
exitOnEscape(18);
- animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene34);
- animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene35);
- animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene36);
- animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene37);
+ if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene34))
+ return;
+ if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene35))
+ return;
+ if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene36))
+ return;
+ if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene37))
+ return;
exitOnEscape(18);
- animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene38);
- animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene39);
+ if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene38))
+ return;
+ if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene39))
+ return;
exitOnEscape(18);
- animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene40);
- animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene41);
+ if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene40))
+ return;
+ if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene41))
+ return;
exitOnEscape(36);
animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene42);
_vm->removeMessage();
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 11d36b1..7e8890b 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -92,10 +92,10 @@ public:
virtual void onEntrance();
private:
- void animate(int filenumber, int section1, int section2, int duration);
- void animate(int filenumber, int section1, int section2, int duration, MessagePosition position,
+ bool animate(int filenumber, int section1, int section2, int duration);
+ bool animate(int filenumber, int section1, int section2, int duration, MessagePosition position,
StringID text);
- void animate(int filenumber, int section1, int section2, int section3, int section4, int duration,
+ bool animate(int filenumber, int section1, int section2, int section3, int section4, int duration,
MessagePosition position, StringID text);
void titleScreen();
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 6fa20aa..a817f02 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -477,15 +477,6 @@ void GameManager::resetInputState() {
processInput();
}
-bool GameManager::keyPressed(Common::KeyCode keycode, bool equal) {
- _vm->updateEvents();
- bool ret = _key.keycode == keycode;
- _key.reset();
-
- return equal ? ret : !ret;
-}
-
-
void GameManager::processInput() {
if (_mouseClickType == Common::EVENT_LBUTTONUP) {
_vm->removeMessage();
@@ -990,10 +981,27 @@ void GameManager::errorTemp() {
void GameManager::wait2(int ticks) {
int32 end = _state._time + ticksToMsec(ticks);
do {
+ g_system->delayMillis(_vm->_delay);
_vm->updateEvents();
g_system->updateScreen();
+ } while (_state._time < end);
+}
+
+bool GameManager::waitOnInput(int ticks, Common::KeyCode &keycode) {
+ keycode = Common::KEYCODE_INVALID;
+ int32 end = _state._time + ticksToMsec(ticks);
+ do {
g_system->delayMillis(_vm->_delay);
+ _vm->updateEvents();
+ g_system->updateScreen();
+ if (_keyPressed) {
+ keycode = _key.keycode;
+ _key.reset();
+ return true;
+ } else if (_mouseClicked)
+ return true;
} while (_state._time < end);
+ return false;
}
void GameManager::setAnimationTimer(int ticks) {
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 251ed2b..bfadd82 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -147,10 +147,10 @@ public:
Common::EventType getMouseInput();
uint16 getKeyInput(bool blockForPrintChar = false);
void getInput();
- bool keyPressed(Common::KeyCode keycode, bool equal);
void mouseInput3();
void mouseWait(int delay);
void wait2(int ticks);
+ bool waitOnInput(int ticks, Common::KeyCode &keycode);
void turnOff();
void turnOn();
void screenShake();
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 4124703..31ca468 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -202,7 +202,7 @@ void SupernovaEngine::updateEvents() {
case Common::EVENT_LBUTTONUP:
// fallthrough
case Common::EVENT_RBUTTONUP:
- if (_mixer->isSoundHandleActive(_soundHandle))
+ if (_gm->_currentRoom->getId() != INTRO && _mixer->isSoundHandleActive(_soundHandle))
return;
_gm->_mouseClicked = true;
// fallthrough
Commit: 1229195b215f315256ac58634c0c868bd7ced5a2
https://github.com/scummvm/scummvm/commit/1229195b215f315256ac58634c0c868bd7ced5a2
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:33Z
Commit Message:
SUPERNOVA: Fix unicode characters in game strings
The non-ASCII characters should be coded using the octal value in
the CP850 encoding.
Changed paths:
devtools/create_supernova/gametext.h
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index 99cdb1d..110506c 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -82,7 +82,7 @@ const char *gameText[] = {
"\233", // kStringIntro13
"Hmm, er scheint kaputt zu sein.", // kStringBroken
"Es ist nichts Besonderes daran.", // kStringDefaultDescription
- "Das mußt du erst nehmen.", // kStringTakeMessage
+ "Das mu\341t du erst nehmen.", // kStringTakeMessage
// 40
"Keycard", // kStringKeycard
"Die Keycard f\224r deine Schr\204nke.", // kStringKeycardDescription
@@ -322,7 +322,7 @@ const char *gameText[] = {
"Seltsam!", // kStringGenericDescription5
"Geld", // kStringMoney
"Es sind 500 Xa.", // kStringMoneyDescription1
- "Schließfach", // kStringLocker
+ "Schlie\341fach", // kStringLocker
// 240
"Es hat ein elektronisches Zahlenschlo\341.", // kStringLockerDescription
"Brief", // kStringLetter
@@ -337,7 +337,7 @@ const char *gameText[] = {
"Figur", // kStringStatue
// 250
"Stark!", // kStringStatueDescription
- "Sie ist den Pflanzen auf der Erde sehr ähnlich.", // kStringPlantDescription
+ "Sie ist den Pflanzen auf der Erde sehr \204hnlich.", // kStringPlantDescription
"Er funktioniert nicht.", // kStringComputerDescription
"Graffiti", // kStringGraffiti
"Seltsamer B\201roschmuck!", // kStringGraffitiDescription
@@ -351,10 +351,10 @@ const char *gameText[] = {
"#########", // kStringOutro3
"^Aber:#", // kStringOutro4
"Das Abenteuer geht weiter, ...##", // kStringOutro5
- "... wenn Sie sich für 30,- DM registrieren lassen!##", // kStringOutro6
- "(Falls Sie das nicht schon längst getan haben.)##", // kStringOutro7
+ "... wenn Sie sich f\201r 30,- DM registrieren lassen!##", // kStringOutro6
+ "(Falls Sie das nicht schon l\204ngst getan haben.)##", // kStringOutro7
// 265
- "In^ Teil 2 - Der Doppelgänger^ erwarten Sie:##", // kStringOutro8
+ "In^ Teil 2 - Der Doppelg\204nger^ erwarten Sie:##", // kStringOutro8
"Knifflige Puzzles,##", // kStringOutro9
"noch mehr Grafik und Sound,##", // kStringOutro10
"ein perfekt geplanter Museumseinbruch,##", // kStringOutro11
@@ -400,7 +400,7 @@ const char *gameText[] = {
"Ich darf kein Risiko eingehen.|Captain, geben Sie sofort Alarm!", // kStringIntroCutscene21
"Commander an alle! Achtung, Achtung!|Begeben Sie sich sofort zum Notraumschiff!", // kStringIntroCutscene22
"Ich wiederhole:|Begeben Sie sich sofort zum Notraumschiff!", // kStringIntroCutscene23
- "Captain, bereiten Sie alles für den Start vor!|Wir m\201ssen zur\201ck zur Erde!", // kStringIntroCutscene24
+ "Captain, bereiten Sie alles f\201r den Start vor!|Wir m\201ssen zur\201ck zur Erde!", // kStringIntroCutscene24
// 305
"Eine Stunde sp\204ter ...", // kStringIntroCutscene25
"Die Besatzung hat die \"Supernova\" verlassen.", // kStringIntroCutscene26
Commit: 7c4d4e1647d3908bc8f67979bc632d3862d4af2b
https://github.com/scummvm/scummvm/commit/7c4d4e1647d3908bc8f67979bc632d3862d4af2b
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:34Z
Commit Message:
SUPERNOVA: Update English translation
Now the title screen and intro cutscene are translated!
Changed paths:
devtools/create_supernova/strings-en.po
diff --git a/devtools/create_supernova/strings-en.po b/devtools/create_supernova/strings-en.po
index 30dc4fe..ae4eec7 100644
--- a/devtools/create_supernova/strings-en.po
+++ b/devtools/create_supernova/strings-en.po
@@ -8,12 +8,12 @@ msgstr ""
"Project-Id-Version: Mission Supernova 1.0\n"
"Report-Msgid-Bugs-To: scummvm-devel at lists.scummvm.org\n"
"POT-Creation-Date: 2017-07-21 23:49+0100\n"
-"PO-Revision-Date: 2017-09-29 19:51+0000\n"
+"PO-Revision-Date: 2017-10-10 22:14+0000\n"
"Last-Translator: Thierry Crozat <criezy at scummvm.org>\n"
"Language-Team: none\n"
"Language: en\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=CP850\n"
+"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 2.9\n"
@@ -416,7 +416,7 @@ msgstr "Here, this article looks interesting."
#: ../../msn/msn_r0.c:268
msgid "Hmm, irgendwie komme|ich mir verarscht vor."
-msgstr ""
+msgstr "Hmm, somehow|I feel tricked."
#: ../../msn/msn_r0.c:273
msgid "Es ist die Keycard des Commanders."
@@ -641,12 +641,10 @@ msgid "Geschwindigkeit: "
msgstr "Speed: "
#: ../../msn/msn_r1.c:308
-#, fuzzy
msgid "8000 hpm"
msgstr "8000 hpm"
#: ../../msn/msn_r1.c:309
-#, fuzzy
msgid "0 hpm"
msgstr "0 hpm"
@@ -755,9 +753,8 @@ msgid "Keycard des Commanders"
msgstr "Keycard of the Commander"
#: ../../msn/msn_r1.c:766
-#, fuzzy
msgid "Was ntzt dir der Anschluá|ohne eine Stromquelle?!"
-msgstr "The connection is useless without a power source!"
+msgstr "What good would come from connecting it|without a power source?!"
#: ../../msn/msn_r1.c:770
msgid "Die Spannung ist auf Null abgesunken."
@@ -772,9 +769,8 @@ msgid "Du mu
msgstr "You must open the hatch first."
#: ../../msn/msn_r1.c:801
-#, fuzzy
msgid "Das Seil ist hier schon ganz richtig."
-msgstr "The cable is already at the right place."
+msgstr "The cable is in the right place."
#: ../../msn/msn_r1.c:806
msgid "Das Kabel ist zu kurz."
@@ -955,9 +951,8 @@ msgid "Der einzige Raumanzug, den die|anderen hiergelassen haben ..."
msgstr "The only space suit the others have left ..."
#: ../../msn/msn_r1_r.c:72
-#, fuzzy
msgid "Versorgung"
-msgstr "Supply"
+msgstr "Oxygen Supply"
#: ../../msn/msn_r1_r.c:72
msgid "Es ist der Versorgungsteil zum Raumanzug."
@@ -984,10 +979,9 @@ msgid "L
msgstr "Terminal strip"
#: ../../msn/msn_r1_r.c:84
-#, fuzzy
msgid ""
"Junge, Junge! Die Explosion hat ein|ganz schnes Durcheinander angerichtet."
-msgstr "Boy, oh boy! The explosion wreaked|quite some havoc."
+msgstr "Boy, oh boy! The explosion created|quite a mess."
#: ../../msn/msn_r1_r.c:86
msgid "Reaktor"
@@ -999,7 +993,7 @@ msgstr "This was a reactor once."
#: ../../msn/msn_r1_r.c:87
msgid "Dse"
-msgstr ""
+msgstr "Thruster"
#: ../../msn/msn_r1_r.c:88
msgid "blauer Krbis"
@@ -1014,9 +1008,8 @@ msgid "Landef
msgstr "Landing module"
#: ../../msn/msn_r1_r.c:90
-#, fuzzy
msgid "Sie war eigentlich fr Bodenuntersuchungen|auf Arsano 3 gedacht."
-msgstr "It was supposed to be used for soil|investigation on Arsano 3."
+msgstr "It was supposed to be used for soil analysis|on Arsano 3."
#: ../../msn/msn_r1_r.c:93 ../../msn/msn_r1_r.c:120
msgid "Sie fhrt nach drauáen."
@@ -1114,9 +1107,8 @@ msgstr "Magnets"
#: ../../msn/msn_r1_r.c:148 ../../msn/msn_r1_r.c:215 ../../msn/msn_r1_r.c:233
#: ../../msn/msn_r1_r.c:276
-#, fuzzy
msgid "Damit werden Sachen auf|dem Tisch festgehalten."
-msgstr "This keeps things|on the board."
+msgstr "This keeps things|on the table."
#: ../../msn/msn_r1_r.c:152 ../../msn/msn_r1_r.c:167 ../../msn/msn_r1_r.c:190
#: ../../msn/msn_r1_r.c:203 ../../msn/msn_r1_r.c:221 ../../msn/msn_r1_r.c:247
@@ -1129,9 +1121,8 @@ msgstr "Cabinet"
#: ../../msn/msn_r1_r.c:222 ../../msn/msn_r1_r.c:248 ../../msn/msn_r1_r.c:262
#: ../../msn/msn_r1_r.c:264 ../../msn/msn_r1_r.c:267 ../../msn/msn_r1_r.c:282
#: ../../msn/msn_r2.c:1299
-#, fuzzy
msgid "Fach"
-msgstr "Compartment"
+msgstr "Storage compartment"
#: ../../msn/msn_r1_r.c:155 ../../msn/msn_r1_r.c:170 ../../msn/msn_r1_r.c:206
#: ../../msn/msn_r1_r.c:224 ../../msn/msn_r1_r.c:250 ../../msn/msn_r1_r.c:278
@@ -1153,7 +1144,6 @@ msgid "Tennisschl
msgstr "Tennis racquets"
#: ../../msn/msn_r1_r.c:163
-#, fuzzy
msgid "Fliegt Boris Becker auch mit?"
msgstr "Is Boris Becker part of the crew?"
@@ -1178,9 +1168,8 @@ msgid "Das ist dein Bett. Toll, nicht wahr?"
msgstr "This is your bed. Great, isn't it?"
#: ../../msn/msn_r1_r.c:183 ../../msn/msn_r1_r.c:186 ../../msn/msn_r1_r.c:195
-#, fuzzy
msgid "Das ist eins deiner drei Fcher."
-msgstr "It's one of your three compartments."
+msgstr "It's one of your three storage compartments."
#: ../../msn/msn_r1_r.c:185
msgid "Alben"
@@ -1199,12 +1188,10 @@ msgid "Das ist dein Schrank."
msgstr "This is your cabinet."
#: ../../msn/msn_r1_r.c:191 ../../msn/msn_r1_r.c:274 ../../msn/msn_r1_r.c:275
-#, fuzzy
msgid "Krimskram"
msgstr "Junk"
#: ../../msn/msn_r1_r.c:191 ../../msn/msn_r1_r.c:274 ../../msn/msn_r1_r.c:275
-#, fuzzy
msgid "Es ist nichts brauchbares dabei."
msgstr "There is nothing useful in there."
@@ -1221,7 +1208,6 @@ msgid "Unterw
msgstr "Underwear"
#: ../../msn/msn_r1_r.c:194
-#, fuzzy
msgid "Strmpfe"
msgstr "Socks"
@@ -1234,7 +1220,6 @@ msgid "Es ist|\"Per Anhalter durch die Galaxis\"|von Douglas Adams."
msgstr "This is|\"The Hitchhiker's Guide to the Galaxy\"|by Douglas Adams."
#: ../../msn/msn_r1_r.c:212
-#, fuzzy
msgid "Herb!"
msgstr "Austere!"
@@ -1259,17 +1244,14 @@ msgid "Poster"
msgstr "Poster"
#: ../../msn/msn_r1_r.c:230
-#, fuzzy
msgid "Ein Poster von \"Big Boss\"."
-msgstr "A poster from \"Big Boss\""
+msgstr "A poster from \"Big Boss\"."
#: ../../msn/msn_r1_r.c:231
-#, fuzzy
msgid "Ein Poster von \"Rock Desaster\"."
msgstr "A poster for \"Rock Disaster\"."
#: ../../msn/msn_r1_r.c:232
-#, fuzzy
msgid "Box"
msgstr "Speaker"
@@ -1278,9 +1260,8 @@ msgid "Schallplatte"
msgstr "Record"
#: ../../msn/msn_r1_r.c:235
-#, fuzzy
msgid "Die Platte ist von \"Big Boss\"."
-msgstr "This record is from \"Big Boss\"."
+msgstr "This record is the soundtrack from \"Big Boss\"."
#: ../../msn/msn_r1_r.c:237
msgid "Schallplattenstnder"
@@ -1299,7 +1280,6 @@ msgid "Sieht aus, als k
msgstr "Looks like something from a museum."
#: ../../msn/msn_r1_r.c:244
-#, fuzzy
msgid "Stecker"
msgstr "Male plug"
@@ -1348,7 +1328,6 @@ msgid "Klo"
msgstr "Loo"
#: ../../msn/msn_r1_r.c:291
-#, fuzzy
msgid "Ein Klo mit Saugmechanismus."
msgstr "A toilet with suction mechanism."
@@ -1357,7 +1336,6 @@ msgid "Dusche"
msgstr "Shower"
#: ../../msn/msn_r2.c:57
-#, fuzzy
msgid "Die Raumschiffe sind alle verschlossen."
msgstr "The spaceships are all locked."
@@ -1376,7 +1354,6 @@ msgid "Darauf steht:|\"Treffpunkt Galactica\"."
msgstr "It says:|\"Galactica meeting point\"."
#: ../../msn/msn_r2.c:144
-#, fuzzy
msgid "Wieso das denn nicht?"
msgstr "Why the hell not?"
@@ -1428,45 +1405,47 @@ msgstr "You are in the restaurant|\"Galactica meeting point\"."
msgid ""
"Wir sind bei den interessantesten|Ereignissen in der Galaxis|immer zur "
"Stelle."
-msgstr ""
+msgstr "We are always there when|interesting things happen|in the galaxy."
#: ../../msn/msn_r2.c:194
msgid "Wenn Sie meinen."
-msgstr ""
+msgstr "If you say so."
#: ../../msn/msn_r2.c:199 ../../msn/msn_r2.c:256
msgid "In der Toilette gibt es|Schlieáfcher fr Schuhe."
-msgstr ""
+msgstr "There are lockers for shoes|in the restroom."
#: ../../msn/msn_r2.c:204
msgid ""
"Wenn Sie das Lokal betreten|wollen, mssen Sie erst|ihre Schuhe ausziehen."
msgstr ""
+"If you want to enter the restaurant,|you have to take off your shoes first."
#: ../../msn/msn_r2.c:208
msgid "Wollen Sie, daá ich Sie rauáschmeiáe?"
-msgstr ""
+msgstr "You want me to kick you out?"
#: ../../msn/msn_r2.c:216 ../../msn/msn_r2.c:274
msgid "Hhius otgfh Dgfdrkjlh Fokj gf."
-msgstr ""
+msgstr "Hhius otgfh Dgfdrkjlh Fokj gf."
#: ../../msn/msn_r2.c:230 ../../msn/msn_s.c:289
msgid "Halt!"
-msgstr ""
+msgstr "Halt!"
#: ../../msn/msn_r2.c:232
msgid "Uhwdejkt!"
-msgstr ""
+msgstr "Uhwdejkt!"
#: ../../msn/msn_r2.c:241
msgid "Sie mssen erst ihre Schuhe ausziehen, Sie Trottel!"
-msgstr ""
+msgstr "You have to take off your shoes first, idiot!"
#: ../../msn/msn_r2.c:243
msgid ""
"Was fllt ihnen ein!|Sie knnen doch ein Lokal|nicht mit Schuhen betreten!"
msgstr ""
+"What are you thinking!|You cannot enter a restaurant|with your shoes on!"
#: ../../msn/msn_r2.c:249
msgid "Fragen Sie nicht so doof!"
@@ -2715,183 +2694,188 @@ msgstr ""
#: ../../msn/msn_s.c:84
msgid "Teil 1:"
-msgstr ""
+msgstr "Part 1:"
#: ../../msn/msn_s.c:85
msgid "Das Schicksal"
-msgstr ""
+msgstr "The fate of"
#: ../../msn/msn_s.c:86
msgid "des Horst Hummel"
-msgstr ""
+msgstr "Horst Hummel"
#: ../../msn/msn_s.c:131
msgid "Viertausend"
-msgstr ""
+msgstr "Four thousand"
#: ../../msn/msn_s.c:131
msgid "Fnftausend"
-msgstr ""
+msgstr "Five thousand"
#: ../../msn/msn_s.c:131
msgid "Sechstausend"
-msgstr ""
+msgstr "Six thousand"
#: ../../msn/msn_s.c:131
msgid "Siebentausend"
-msgstr ""
+msgstr "Seven thousand"
#: ../../msn/msn_s.c:144
msgid "Zwei Tage nach dem Start|im Cockpit der \"Supernova\" ..."
-msgstr ""
+msgstr "Two days after take-off|in the cockpit of the \"Supernova\"..."
#: ../../msn/msn_s.c:153
msgid "Entferung von der Sonne: 1 500 000 km.|Gehen Sie auf 8000 hpm, Captain!"
-msgstr ""
+msgstr "Distance from the sun: 1 500 000 km.|Go to 8000 hpm, Captain!"
#: ../../msn/msn_s.c:168
msgid "Geschwindigkeit:"
-msgstr ""
+msgstr "Speed:"
#: ../../msn/msn_s.c:169
msgid "Zweitausend hpm"
-msgstr ""
+msgstr "Two thousand hpm"
#: ../../msn/msn_s.c:172
msgid "Dreitausend"
-msgstr ""
+msgstr "Three thousand"
#: ../../msn/msn_s.c:189
msgid "Achttau..."
-msgstr ""
+msgstr "Eight thous..."
#: ../../msn/msn_s.c:214
msgid "Keine Ahnung, Sir."
-msgstr ""
+msgstr "I have no idea, Sir."
#: ../../msn/msn_s.c:215
msgid "Ingenieur an Commander, bitte kommen!"
-msgstr ""
+msgstr "Engineer to Commander, come in!"
#: ../../msn/msn_s.c:221
msgid "Was ist los?"
-msgstr ""
+msgstr "What's going on?"
#: ../../msn/msn_s.c:222
msgid ""
"Wir haben einen Druckabfall im Hauptantriebssystem, Sir.|Einen Moment, ich "
"schaue sofort nach, woran es liegt."
msgstr ""
+"We have a pressure drop in the main propulsion system, sir.|Wait a minute, "
+"I'll have a look."
#: ../../msn/msn_s.c:224
msgid ""
"Scheiáe, der Ionenantrieb ist explodiert!|Die Teile sind ber den ganzen|"
"Maschinenraum verstreut."
-msgstr ""
+msgstr "Shit, the Ion drive blew up!|The parts are all over the engine room."
#: ../../msn/msn_s.c:225
msgid ""
"Ach, du meine Gte!|Gibt es irgendeine Mglichkeit,|den Schaden schnell zu "
"beheben?"
-msgstr ""
+msgstr "Oh, my God!|Any way to fix the damage quickly?"
#: ../../msn/msn_s.c:226
msgid "Nein, Sir. Es sieht schlecht aus."
-msgstr ""
+msgstr "No, sir. It looks bad."
#: ../../msn/msn_s.c:230
msgid "Hmm, die Erde zu alarmieren, wrde zu lange dauern."
-msgstr ""
+msgstr "Hmm, alerting Earth would take too long."
#: ../../msn/msn_s.c:231
msgid "Ich darf kein Risiko eingehen.|Captain, geben Sie sofort Alarm!"
-msgstr ""
+msgstr "I can't take any chances.|Captain, sound the alarm!"
#: ../../msn/msn_s.c:232 ../../msn/msn_s.c:264
msgid "Ok, Sir."
-msgstr ""
+msgstr "Ok, Sir."
#: ../../msn/msn_s.c:255
msgid ""
"Commander an alle! Achtung, Achtung!|Begeben Sie sich sofort zum "
"Notraumschiff!"
msgstr ""
+"Commander to all! Attention, attention! Attention!|Get to the emergency ship "
+"immediately!"
#: ../../msn/msn_s.c:256
msgid "Ich wiederhole:|Begeben Sie sich sofort zum Notraumschiff!"
-msgstr ""
+msgstr "I repeat,|proceed immediately to the emergency spaceship!"
#: ../../msn/msn_s.c:263
msgid ""
"Captain, bereiten Sie alles fr den Start vor!|Wir mssen zurck zur Erde!"
msgstr ""
+"Captain, get everything ready for departure!|We have to get back to Earth!"
#: ../../msn/msn_s.c:277
msgid "Eine Stunde spter ..."
-msgstr ""
+msgstr "An hour later..."
#: ../../msn/msn_s.c:284
msgid "Die Besatzung hat die \"Supernova\" verlassen."
-msgstr ""
+msgstr "The crew has left the \"Supernova\"."
#: ../../msn/msn_s.c:285
msgid ""
"Das Schiff wird zwar in acht Jahren sein Ziel|erreichen, allerdings ohne "
"Mannschaft."
-msgstr ""
+msgstr "The ship will reach its destination in eight years,|but without a crew."
#: ../../msn/msn_s.c:286
msgid "Das ist das klgliche Ende|der Mission Supernova."
-msgstr ""
+msgstr "This is the pitiful end|of the Supernova mission."
#: ../../msn/msn_s.c:287
msgid "Sie knnen jetzt ihren Computer ausschalten."
-msgstr ""
+msgstr "You can now turn off your computer."
#: ../../msn/msn_s.c:290
msgid "Warten Sie!"
-msgstr ""
+msgstr "Wait, wait!"
#: ../../msn/msn_s.c:291
msgid "Es regt sich etwas im Schiff."
-msgstr ""
+msgstr "There's something stirring in the ship."
#: ../../msn/msn_s.c:307
msgid "Uuuuaaaahhhhh"
-msgstr ""
+msgstr "Uuuuaaaahhhhh"
#: ../../msn/msn_s.c:309
msgid "Huch, ich bin ja gefesselt!|Wo bin ich?"
-msgstr ""
+msgstr "Argh, I'm tied up!|Where am I?"
#: ../../msn/msn_s.c:310
msgid ""
"Ach so, das sind ja die Sicherheitsgurte.|Ich arbeite ja jetzt in diesem "
"Raumschiff hier."
-msgstr ""
+msgstr "Ah yes, these are the seat belts.|I work in this spaceship now."
#: ../../msn/msn_s.c:311
msgid ""
"Was? Schon zwei Uhr! Wieso|hat mich denn noch keiner|aus dem Bett "
"geschmissen?"
-msgstr ""
+msgstr "What? It's 2:00 already!|How come no one has kicked me|out of bed yet?"
#: ../../msn/msn_s.c:314
msgid "Autsch!"
-msgstr ""
+msgstr "Ouch!"
#: ../../msn/msn_s.c:315
msgid "Scheiáetagenbett!"
-msgstr ""
+msgstr "Shitty bunk bed!"
#: ../../msn/msn_s.c:317
msgid "Erst mal den Lichtschalter finden."
-msgstr ""
+msgstr "First, find the light switch."
#: ../../msn/msn_s.c:318
msgid "Hmm, gar nicht so einfach|bei Schwerelosigkeit."
-msgstr ""
+msgstr "Hmm, not so easy|in weightlessness."
#: ../../msn/msn_s.c:320
msgid "Ah, hier ist er."
-msgstr ""
+msgstr "Ah, here it is."
Commit: c3241c7c4215c1ef8fa9305b2663a92bf2868834
https://github.com/scummvm/scummvm/commit/c3241c7c4215c1ef8fa9305b2663a92bf2868834
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:34Z
Commit Message:
SUPERNOVA: Improve translated title display
The title is displayed on three lines aligned on their center,
but the code provides the left coordinate for each line so we
need to compute it based on the translated line length.
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 6aefe80..eb48371 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -154,9 +154,12 @@ void Intro::titleScreen() {
_gm->wait2(1);
titleFadeIn();
_vm->renderText(kStringTitleVersion, 295, 190, kColorWhite44);
- _vm->renderText(kStringTitle1, 64, 120, kColorLightBlue);
- _vm->renderText(kStringTitle2, 44, 132, kColorWhite99);
- _vm->renderText(kStringTitle3, 35, 142, kColorWhite99);
+ const Common::String& title1 = _vm->getGameString(kStringTitle1);
+ const Common::String& title2 = _vm->getGameString(kStringTitle2);
+ const Common::String& title3 = _vm->getGameString(kStringTitle3);
+ _vm->renderText(title1, 78 - _vm->textWidth(title1)/2, 120, kColorLightBlue);
+ _vm->renderText(title2, 78 - _vm->textWidth(title2)/2, 132, kColorWhite99);
+ _vm->renderText(title3, 78 - _vm->textWidth(title3)/2, 142, kColorWhite99);
_gm->wait2(1);
CursorMan.showMouse(true);
_vm->playSoundMod(kMusicIntro);
Commit: f0d139d5192324f903ef49dd0d958d95af284122
https://github.com/scummvm/scummvm/commit/f0d139d5192324f903ef49dd0d958d95af284122
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:34Z
Commit Message:
SUPERNOVA: Fix some warnings
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 31ca468..fc011b2 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -900,7 +900,7 @@ bool SupernovaEngine::loadGame(int slot) {
if (saveHeader != SAVEGAME_HEADER) {
warning("No header found in '%s'", filename.c_str());
delete savefile;
- return Common::kUnknownError;
+ return false; //Common::kUnknownError
}
byte saveVersion = savefile->readByte();
@@ -908,7 +908,7 @@ bool SupernovaEngine::loadGame(int slot) {
if (saveVersion > SAVEGAME_VERSION || saveVersion == 1) {
warning("Save game version %i not supported", saveVersion);
delete savefile;
- return Common::kUnknownError;
+ return false; //Common::kUnknownError;
}
int descriptionSize = savefile->readSint16LE();
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 756c846..70df62f 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -150,7 +150,7 @@ public:
bool saveGame(int slot, const Common::String &description);
const Common::String &getGameString(int idx) const {
- if (idx < 0 || idx >= _gameStrings.size())
+ if (idx < 0 || idx >= (int)_gameStrings.size())
return _nullString;
return _gameStrings[idx];
}
Commit: 9bf0a656a6b22cb1228277586164e105a13a8df8
https://github.com/scummvm/scummvm/commit/9bf0a656a6b22cb1228277586164e105a13a8df8
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:34Z
Commit Message:
SUPERNOVA: Change _shown to an array of bytes in order to handle extra values used by dialogs, fix ArsanoMeetup2::onEntrance by using a shown variable
Changed paths:
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
engines/supernova/rooms.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index ad51db3..3cd7dd2 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -44,6 +44,9 @@ const int kMaxCarry = 30;
//const int kRoomsChap3 = 21;
//const int kRoomsNum = kRoomsChap0 + kRoomsChap1 + kRoomsChap2 + kRoomsChap3;
+const byte kShownFalse = 0;
+const byte kShownTrue = 1;
+
enum MessagePosition {
kMessageNormal,
kMessageLeft,
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index eb48371..790d201 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -93,7 +93,7 @@ Intro::Intro(SupernovaEngine *vm, GameManager *gm) {
_fileNumber = -1;
_id = INTRO;
- _shown[0] = false;
+ _shown[0] = kShownFalse;
_objectState[0] =
Object(_id, kStringKeycard, kStringKeycardDescription, KEYCARD,
@@ -1712,7 +1712,9 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_state._coins = 5;
}
}
- _shown[kMaxSection - 5] = true;
+ // This shown object is an abuse in the original engine as it's not a real shown variable
+ // It's an internal (boolean) status
+ _shown[kMaxSection - 5] = kShownTrue;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COINS, CAR_SLOT)) {
if ((_gm->_state._coins < 5) && (getObject(7 - _gm->_state._coins)->_click == 7))
_vm->renderMessage("Mach doch zuerst das Fach leer!");
@@ -1922,10 +1924,11 @@ void ArsanoRemaining::animation() {
}
void ArsanoRoger::onEntrance() {
- if (!_shown[kMaxSection - 2]) {
+ // This is not a normal shown variable, it's a dialog
+ if (_shown[kMaxSection - 2] = 0) {
_gm->say("Darf ich hier Platz nehmen?");
_gm->reply("Klar!", 2, 2 + 128);
- _shown[kMaxSection - 2] = true;
+ _shown[kMaxSection - 2] = 1;
}
}
@@ -2128,17 +2131,18 @@ bool ArsanoGlider::interact(Action verb, Object &obj1, Object &obj2) {
}
void ArsanoMeetup2::onEntrance() {
- switch (!_gm->_guiEnabled) {
+ // We use 1, 2, 3 because those are dialog status and not "real" _shown
+ switch (_shown[kMaxSection - 1]) {
case 1:
_gm->shipStart();
break;
case 2:
- _vm->renderMessage("Alle Raumschiffe haben|den Planeten verlassen.");
+ _vm->renderMessage("Alle Raumschiffe haben|den Planeten verlassen."); // All spaceships have left the planet
break;
case 3:
- _vm->renderMessage("Alle Raumschiffe haben den Planeten|verlassen, bis auf eins ...");
+ _vm->renderMessage("Alle Raumschiffe haben den Planeten|verlassen, bis auf eins ..."); // All spaceships have left the planet, except one ...
}
- _gm->_guiEnabled = true;
+ _shown[kMaxSection - 1] = 0;
}
bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
@@ -3123,7 +3127,7 @@ Outro::Outro(SupernovaEngine *vm, GameManager *gm) {
_fileNumber = -1;
_id = OUTRO;
- _shown[0] = false;
+ _shown[0] = kShownFalse;
outroText =
_vm->getGameString(kStringOutro1) +
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 7e8890b..626dc97 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -37,7 +37,7 @@ public:
Room() {
_seen = false;
for (int i = 0; i < kMaxSection; ++i)
- _shown[i] = false;
+ _shown[i] = kShownFalse;
}
bool hasSeen() {
@@ -55,10 +55,11 @@ public:
}
void setSectionVisible(uint section, bool visible) {
- _shown[section] = visible;
+ _shown[section] = visible ? kShownTrue : kShownFalse;
}
+
bool isSectionVisible(uint index) const {
- return _shown[index];
+ return _shown[index] == kShownTrue;
}
Object *getObject(uint index) {
return &_objectState[index];
@@ -75,7 +76,7 @@ public:
protected:
int _fileNumber;
- bool _shown[kMaxSection];
+ byte _shown[kMaxSection];
Object _objectState[kMaxObject];
RoomID _id;
SupernovaEngine *_vm;
@@ -116,11 +117,11 @@ public:
_fileNumber = 17;
_id = CORRIDOR;
- _shown[0] = true;
- _shown[1] = false;
- _shown[2] = false;
- _shown[3] = false;
- _shown[4] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownFalse;
+ _shown[2] = kShownFalse;
+ _shown[3] = kShownFalse;
+ _shown[4] = kShownTrue;
_objectState[0] = Object(_id, kStringHatch, kStringDefaultDescription, HATCH1, OPENABLE | EXIT, 0, 6, 1, CABIN_L1, 15);
_objectState[1] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | EXIT, 1, 7, 2, CABIN_L2, 10);
@@ -145,7 +146,7 @@ public:
_fileNumber = 15;
_id = HALL;
- _shown[0] = true;
+ _shown[0] = kShownTrue;
_objectState[0] = Object(_id, kStringHatch, kStringCockpitHatchDescription, NULLOBJECT, OPENABLE | EXIT, 4, 5, 1, COCKPIT, 10);
_objectState[1] = Object(_id, kStringHatch, kStringKitchenHatchDescription, KITCHEN_HATCH, OPENABLE | EXIT, 0, 0, 0, NULLROOM, 1);
@@ -166,7 +167,7 @@ public:
_fileNumber = 33;
_id = SLEEP;
- _shown[0] = true;
+ _shown[0] = kShownTrue;
_objectState[0] = Object(_id, kStringHatch, kStringStasisHatchDescription2, CABINS, NULLTYPE, 0, 0, 0, NULLROOM, 0);
_objectState[1] = Object(_id, kStringHatch, kStringStasisHatchDescription2, CABIN, NULLTYPE, 1, 1, 0, NULLROOM, 0);
@@ -190,7 +191,7 @@ public:
_fileNumber = 9;
_id = COCKPIT;
- _shown[0] = true;
+ _shown[0] = kShownTrue;
_objectState[0] = Object(_id, kStringInstruments, kStringInstrumentsDescription1, INSTRUMENTS, NULLTYPE, 2, 2, 0, NULLROOM, 0);
_objectState[1] = Object(_id, kStringMonitor, kStringDefaultDescription, MONITOR, NULLTYPE, 0, 0, 0, NULLROOM, 0);
@@ -214,12 +215,12 @@ public:
_fileNumber = 21;
_id = CABIN_L1;
- _shown[0] = true;
- _shown[1] = true;
- _shown[2] = true;
- _shown[3] = true;
- _shown[4] = true;
- _shown[5] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
+ _shown[2] = kShownTrue;
+ _shown[3] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[5] = kShownTrue;
_objectState[0] = Object(_id, kStringImage, kStringGenericDescription1, NULLOBJECT, UNNECESSARY, 5, 5, 0, NULLROOM, 0);
_objectState[1] = Object(_id, kStringImage, kStringGenericDescription2, NULLOBJECT, UNNECESSARY, 6, 6, 0, NULLROOM, 0);
@@ -244,23 +245,23 @@ public:
_fileNumber = 21;
_id = CABIN_L2;
- _shown[0] = true;
- _shown[1] = false;
- _shown[2] = false;
- _shown[3] = false;
- _shown[4] = false;
- _shown[5] = false;
- _shown[6] = false;
- _shown[7] = false;
- _shown[8] = false;
- _shown[9] = false;
- _shown[10] = false;
- _shown[11] = false;
- _shown[12] = false;
- _shown[13] = false;
- _shown[14] = false;
- _shown[15] = false;
- _shown[16] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownFalse;
+ _shown[2] = kShownFalse;
+ _shown[3] = kShownFalse;
+ _shown[4] = kShownFalse;
+ _shown[5] = kShownFalse;
+ _shown[6] = kShownFalse;
+ _shown[7] = kShownFalse;
+ _shown[8] = kShownFalse;
+ _shown[9] = kShownFalse;
+ _shown[10] = kShownFalse;
+ _shown[11] = kShownFalse;
+ _shown[12] = kShownFalse;
+ _shown[13] = kShownFalse;
+ _shown[14] = kShownFalse;
+ _shown[15] = kShownFalse;
+ _shown[16] = kShownTrue;
_objectState[0] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_KL1,COMBINABLE,31,31,0);
_objectState[1] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_KL2,COMBINABLE,32,32,0);
@@ -300,19 +301,19 @@ public:
_fileNumber = 21;
_id = CABIN_L3;
- _shown[0] = true;
- _shown[1] = false;
- _shown[2] = false;
- _shown[3] = false;
- _shown[4] = false;
- _shown[5] = false;
- _shown[6] = true;
- _shown[7] = true;
- _shown[8] = true;
- _shown[9] = true;
- _shown[10] = false;
- _shown[11] = false;
- _shown[12] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownFalse;
+ _shown[2] = kShownFalse;
+ _shown[3] = kShownFalse;
+ _shown[4] = kShownFalse;
+ _shown[5] = kShownFalse;
+ _shown[6] = kShownTrue;
+ _shown[7] = kShownTrue;
+ _shown[8] = kShownTrue;
+ _shown[9] = kShownTrue;
+ _shown[10] = kShownFalse;
+ _shown[11] = kShownFalse;
+ _shown[12] = kShownTrue;
_objectState[0] = Object(_id, kStringPoster,kStringPosterDescription1,NULLOBJECT,UNNECESSARY,11,11,0);
_objectState[1] = Object(_id, kStringPoster,kStringPosterDescription2,NULLOBJECT,UNNECESSARY,12,12,0);
@@ -344,9 +345,9 @@ public:
_fileNumber = 22;
_id = CABIN_R1;
- _shown[0] = true;
- _shown[1] = true;
- _shown[2] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
+ _shown[2] = kShownTrue;
_objectState[0] = Object(_id, kStringImage,kStringImageDescription1,NULLOBJECT,UNNECESSARY,5,5,0);
_objectState[1] = Object(_id, kStringDrawingInstruments,kStringDrawingInstrumentsDescription,NULLOBJECT,UNNECESSARY,6,6,0);
@@ -368,12 +369,12 @@ public:
_fileNumber = 22;
_id = CABIN_R2;
- _shown[0] = true;
- _shown[1] = false;
- _shown[2] = false;
- _shown[3] = true;
- _shown[4] = true;
- _shown[5] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownFalse;
+ _shown[2] = kShownFalse;
+ _shown[3] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[5] = kShownTrue;
_objectState[0] = Object(_id, kStringChessGame,kStringChessGameDescription1,NULLOBJECT,UNNECESSARY,11,11,0);
_objectState[1] = Object(_id, kStringTennisRacket,kStringTennisRacketDescription,NULLOBJECT,UNNECESSARY,8,8,0);
@@ -395,22 +396,22 @@ public:
_fileNumber = 22;
_id = CABIN_R3;
- _shown[0] = true;
- _shown[1] = false;
- _shown[2] = false;
- _shown[3] = false;
- _shown[4] = false;
- _shown[5] = false;
- _shown[6] = false;
- _shown[7] = true;
- _shown[8] = true;
- _shown[9] = false;
- _shown[10] = false;
- _shown[11] = false;
- _shown[12] = false;
- _shown[13] = false;
- _shown[14] = false;
- _shown[15] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownFalse;
+ _shown[2] = kShownFalse;
+ _shown[3] = kShownFalse;
+ _shown[4] = kShownFalse;
+ _shown[5] = kShownFalse;
+ _shown[6] = kShownFalse;
+ _shown[7] = kShownTrue;
+ _shown[8] = kShownTrue;
+ _shown[9] = kShownFalse;
+ _shown[10] = kShownFalse;
+ _shown[11] = kShownFalse;
+ _shown[12] = kShownFalse;
+ _shown[13] = kShownFalse;
+ _shown[14] = kShownFalse;
+ _shown[15] = kShownTrue;
_objectState[0] = Object(_id, kStringChessGame,kStringChessGameDescription2,CHESS,TAKE | COMBINABLE,12,12,7 | 128);
_objectState[1] = Object(_id, kStringBed,kStringBedDescription,NULLOBJECT,NULLTYPE,13,13,0);
@@ -450,7 +451,7 @@ public:
_fileNumber = 23;
_id = BATHROOM;
- _shown[0] = true;
+ _shown[0] = kShownTrue;
_objectState[0] = Object(_id, kStringBathroom,kStringBathroomDescription,TOILET,NULLTYPE,0,0,0);
_objectState[1] = Object(_id, kStringShower,kStringDefaultDescription,SHOWER,NULLTYPE,1,1,0);
@@ -466,13 +467,13 @@ public:
_fileNumber = 34;
_id = AIRLOCK;
- _shown[0] = true;
- _shown[1] = false;
- _shown[2] = false;
- _shown[3] = false;
- _shown[4] = false;
- _shown[5] = false;
- _shown[6] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownFalse;
+ _shown[2] = kShownFalse;
+ _shown[3] = kShownFalse;
+ _shown[4] = kShownFalse;
+ _shown[5] = kShownFalse;
+ _shown[6] = kShownTrue;
_objectState[0] = Object(_id, kStringHatch,kStringHatchDescription1,NULLOBJECT,EXIT | OPENABLE | OPENED | CLOSED,0,0,0,CORRIDOR,10);
_objectState[1] = Object(_id, kStringHatch,kStringHatchDescription2,NULLOBJECT,EXIT | OPENABLE | CLOSED,1,1,0,HOLD,14);
@@ -495,7 +496,7 @@ public:
_fileNumber = 24;
_id = HOLD;
- _shown[0] = true;
+ _shown[0] = kShownTrue;
_objectState[0] = Object(_id, kNoString,kStringDefaultDescription,HOLD_WIRE,COMBINABLE,255,255,0);
_objectState[1] = Object(_id, kStringScrap,kStringScrapDescription1,SCRAP_LK,NULLTYPE,4,4,0);
@@ -523,7 +524,7 @@ public:
_fileNumber = 25;
_id = LANDINGMODULE;
- _shown[0] = true;
+ _shown[0] = kShownTrue;
_objectState[0] = Object(_id, kStringSocket,kStringDefaultDescription,LANDINGMOD_SOCKET,COMBINABLE,1,1,0);
_objectState[1] = Object(_id, kStringButton,kSafetyButtonDescription,LANDINGMOD_BUTTON,PRESS | COMBINABLE,2,2,0);
@@ -544,12 +545,12 @@ public:
_fileNumber = 18;
_id = GENERATOR;
- _shown[0] = true;
- _shown[1] = false;
- _shown[2] = false;
- _shown[3] = false;
- _shown[4] = false;
- _shown[5] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownFalse;
+ _shown[2] = kShownFalse;
+ _shown[3] = kShownFalse;
+ _shown[4] = kShownFalse;
+ _shown[5] = kShownTrue;
_objectState[0] = Object(_id, kStringGeneratorWire,kStringDefaultDescription,GENERATOR_WIRE,COMBINABLE,255,255,0);
_objectState[1] = Object(_id, kStringEmptySpool,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
@@ -577,7 +578,7 @@ public:
_fileNumber = 4;
_id = OUTSIDE;
- _shown[0] = true;
+ _shown[0] = kShownTrue;
_objectState[0] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,EXIT,0,0,0,GENERATOR,3);
_objectState[1] = Object(_id, kStringRope,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
@@ -593,7 +594,7 @@ public:
_fileNumber = 12;
_id = OUTSIDE;
- _shown[0] = true;
+ _shown[0] = kShownTrue;
_objectState[0] = Object(_id, kStringRope,kStringDefaultDescription,NULLOBJECT,UNNECESSARY | EXIT,0,0,0,GENERATOR,12);
_objectState[1] = Object(_id, kStringStone,kStringDefaultDescription,STONE,NULLTYPE,1,1,0);
@@ -612,7 +613,7 @@ public:
_fileNumber = 12;
_id = CAVE;
- _shown[0] = false;
+ _shown[0] = kShownFalse;
_objectState[0] = Object(_id, kStringExit,kStringExitDescription,NULLOBJECT,EXIT,255,255,0,ROCKS,22);
_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,MEETUP,2);
@@ -626,7 +627,7 @@ public:
_fileNumber = 37;
_id = MEETUP;
- _shown[0] = true;
+ _shown[0] = kShownTrue;
_objectState[0] = Object(_id, kStringCave,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
_objectState[1] = Object(_id, kStringSign,kStringSignDescription,MEETUP_SIGN,NULLTYPE,0,0,0);
@@ -652,7 +653,7 @@ public:
_fileNumber = 10;
_id = ENTRANCE;
- _shown[0] = true;
+ _shown[0] = kShownTrue;
_objectState[0] = Object(_id, kStringPorter,kStringPorterDescription,PORTER,TALK,0,0,0);
_objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,NULLOBJECT,EXIT | OPENABLE | CLOSED,1,1,0,NULLROOM,5);
@@ -708,13 +709,13 @@ public:
_fileNumber = 28;
_id = REST;
- _shown[0] = true;
+ _shown[0] = kShownTrue;
_objectState[0] = Object(_id, kStringStaircase,kStringDefaultDescription,NULLOBJECT,EXIT,0,0,0,ENTRANCE,17);
_objectState[1] = Object(_id, kStringChair,kStringDefaultDescription,NULLOBJECT,EXIT,1,1,0,ROGER,2);
_objectState[2] = Object(_id, kStringShoes,kStringShoesDescription,NULLOBJECT,NULLTYPE,2,2,0);
- _chewing = true;
+ _chewing = kShownTrue;
}
virtual void animation();
@@ -731,7 +732,7 @@ public:
_fileNumber = 29;
_id = ROGER;
- _shown[0] = true;
+ _shown[0] = kShownTrue;
_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,REST,19);
_objectState[1] = Object(_id, kStringFrogFace,kStringDefaultDescription,ROGER_W,TALK,0,0,0);
@@ -768,7 +769,7 @@ public:
_fileNumber = 19;
_id = GLIDER;
- _shown[0] = true;
+ _shown[0] = kShownTrue;
_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,MEETUP,15);
_objectState[1] = Object(_id, kStringButton,kStringDefaultDescription,GLIDER_BUTTON1,PRESS,0,0,0);
@@ -797,7 +798,7 @@ public:
_fileNumber = 38;
_id = MEETUP2;
- _shown[0] = true;
+ _shown[0] = kShownTrue;
_objectState[0] = Object(_id, kStringRoger,kStringDefaultDescription,ROGER_W,TALK,255,255,0);
_objectState[1] = Object(_id, kStringSpaceshift,kStringDefaultDescription,SPACESHIP,COMBINABLE,255,255,0);
@@ -835,7 +836,7 @@ public:
_fileNumber = 39;
_id = MEETUP3;
- _shown[0] = true;
+ _shown[0] = kShownTrue;
_objectState[0] = Object(_id, kStringUfo,kStringUfoDescription,UFO,EXIT,0,0,0,NULLROOM,3);
_objectState[1] = Object(_id, kStringStar,kStringDefaultDescription,STAR,NULLTYPE,1,1,0);
@@ -865,38 +866,38 @@ public:
_fileNumber = 43;
_id = CELL;
- _shown[0] = true;
- _shown[1] = true;
- _shown[2] = false;
- _shown[3] = false;
- _shown[4] = false;
- _shown[5] = false;
- _shown[6] = false;
- _shown[7] = false;
- _shown[8] = false;
- _shown[9] = false;
- _shown[10] = false;
- _shown[11] = false;
- _shown[12] = false;
- _shown[13] = false;
- _shown[14] = false;
- _shown[15] = false;
- _shown[16] = false;
- _shown[17] = false;
- _shown[18] = false;
- _shown[19] = false;
- _shown[20] = false;
- _shown[21] = false;
- _shown[22] = false;
- _shown[23] = false;
- _shown[24] = false;
- _shown[25] = false;
- _shown[26] = false;
- _shown[27] = false;
- _shown[28] = false;
- _shown[29] = false;
- _shown[30] = false;
- _shown[31] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
+ _shown[2] = kShownFalse;
+ _shown[3] = kShownFalse;
+ _shown[4] = kShownFalse;
+ _shown[5] = kShownFalse;
+ _shown[6] = kShownFalse;
+ _shown[7] = kShownFalse;
+ _shown[8] = kShownFalse;
+ _shown[9] = kShownFalse;
+ _shown[10] = kShownFalse;
+ _shown[11] = kShownFalse;
+ _shown[12] = kShownFalse;
+ _shown[13] = kShownFalse;
+ _shown[14] = kShownFalse;
+ _shown[15] = kShownFalse;
+ _shown[16] = kShownFalse;
+ _shown[17] = kShownFalse;
+ _shown[18] = kShownFalse;
+ _shown[19] = kShownFalse;
+ _shown[20] = kShownFalse;
+ _shown[21] = kShownFalse;
+ _shown[22] = kShownFalse;
+ _shown[23] = kShownFalse;
+ _shown[24] = kShownFalse;
+ _shown[25] = kShownFalse;
+ _shown[26] = kShownFalse;
+ _shown[27] = kShownFalse;
+ _shown[28] = kShownFalse;
+ _shown[29] = kShownFalse;
+ _shown[30] = kShownFalse;
+ _shown[31] = kShownTrue;
_objectState[0] = Object(_id, kStringButton,kStringDefaultDescription,CELL_BUTTON,PRESS,1,1,0);
_objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,CELL_DOOR,EXIT|OPENABLE|CLOSED,0,0,31+128,CORRIDOR4,1);
@@ -922,32 +923,32 @@ public:
_fileNumber = 16;
_id = CORRIDOR1;
- _shown[0] = true;
- _shown[1] = false;
- _shown[2] = false;
- _shown[3] = true;
- _shown[4] = true;
- _shown[5] = true;
- _shown[6] = false;
- _shown[7] = false;
- _shown[8] = false;
- _shown[9] = false;
- _shown[10] = false;
- _shown[11] = false;
- _shown[12] = false;
- _shown[13] = true;
- _shown[14] = false;
- _shown[15] = false;
- _shown[16] = false;
- _shown[17] = false;
- _shown[18] = false;
- _shown[19] = false;
- _shown[20] = false;
- _shown[21] = true;
- _shown[22] = false;
- _shown[23] = true;
- _shown[24] = false;
- _shown[25] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownFalse;
+ _shown[2] = kShownFalse;
+ _shown[3] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[5] = kShownTrue;
+ _shown[6] = kShownFalse;
+ _shown[7] = kShownFalse;
+ _shown[8] = kShownFalse;
+ _shown[9] = kShownFalse;
+ _shown[10] = kShownFalse;
+ _shown[11] = kShownFalse;
+ _shown[12] = kShownFalse;
+ _shown[13] = kShownTrue;
+ _shown[14] = kShownFalse;
+ _shown[15] = kShownFalse;
+ _shown[16] = kShownFalse;
+ _shown[17] = kShownFalse;
+ _shown[18] = kShownFalse;
+ _shown[19] = kShownFalse;
+ _shown[20] = kShownFalse;
+ _shown[21] = kShownTrue;
+ _shown[22] = kShownFalse;
+ _shown[23] = kShownTrue;
+ _shown[24] = kShownFalse;
+ _shown[25] = kShownTrue;
_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,GUARD3,2);
_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR2,22);
@@ -963,31 +964,31 @@ public:
_fileNumber = 16;
_id = CORRIDOR2;
- _shown[0] = true;
- _shown[1] = false;
- _shown[2] = true;
- _shown[3] = true;
- _shown[4] = true;
- _shown[5] = true;
- _shown[6] = false;
- _shown[7] = false;
- _shown[8] = false;
- _shown[9] = false;
- _shown[10] = false;
- _shown[11] = false;
- _shown[12] = false;
- _shown[13] = false;
- _shown[14] = false;
- _shown[15] = false;
- _shown[16] = false;
- _shown[17] = true;
- _shown[18] = false;
- _shown[19] = false;
- _shown[20] = false;
- _shown[21] = true;
- _shown[22] = false;
- _shown[23] = false;
- _shown[24] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownFalse;
+ _shown[2] = kShownTrue;
+ _shown[3] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[5] = kShownTrue;
+ _shown[6] = kShownFalse;
+ _shown[7] = kShownFalse;
+ _shown[8] = kShownFalse;
+ _shown[9] = kShownFalse;
+ _shown[10] = kShownFalse;
+ _shown[11] = kShownFalse;
+ _shown[12] = kShownFalse;
+ _shown[13] = kShownFalse;
+ _shown[14] = kShownFalse;
+ _shown[15] = kShownFalse;
+ _shown[16] = kShownFalse;
+ _shown[17] = kShownTrue;
+ _shown[18] = kShownFalse;
+ _shown[19] = kShownFalse;
+ _shown[20] = kShownFalse;
+ _shown[21] = kShownTrue;
+ _shown[22] = kShownFalse;
+ _shown[23] = kShownFalse;
+ _shown[24] = kShownTrue;
_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR1,2);
_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR3,22);
@@ -1004,30 +1005,30 @@ public:
_fileNumber = 16;
_id = CORRIDOR3;
- _shown[0] = true;
- _shown[1] = false;
- _shown[2] = false;
- _shown[3] = true;
- _shown[4] = false;
- _shown[5] = true;
- _shown[6] = false;
- _shown[7] = false;
- _shown[8] = false;
- _shown[9] = false;
- _shown[10] = false;
- _shown[11] = false;
- _shown[12] = false;
- _shown[13] = false;
- _shown[14] = false;
- _shown[15] = false;
- _shown[16] = false;
- _shown[17] = false;
- _shown[18] = false;
- _shown[19] = true;
- _shown[20] = false;
- _shown[21] = false;
- _shown[22] = false;
- _shown[23] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownFalse;
+ _shown[2] = kShownFalse;
+ _shown[3] = kShownTrue;
+ _shown[4] = kShownFalse;
+ _shown[5] = kShownTrue;
+ _shown[6] = kShownFalse;
+ _shown[7] = kShownFalse;
+ _shown[8] = kShownFalse;
+ _shown[9] = kShownFalse;
+ _shown[10] = kShownFalse;
+ _shown[11] = kShownFalse;
+ _shown[12] = kShownFalse;
+ _shown[13] = kShownFalse;
+ _shown[14] = kShownFalse;
+ _shown[15] = kShownFalse;
+ _shown[16] = kShownFalse;
+ _shown[17] = kShownFalse;
+ _shown[18] = kShownFalse;
+ _shown[19] = kShownTrue;
+ _shown[20] = kShownFalse;
+ _shown[21] = kShownFalse;
+ _shown[22] = kShownFalse;
+ _shown[23] = kShownTrue;
_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR2,2);
}
@@ -1042,33 +1043,33 @@ public:
_fileNumber = 16;
_id = CORRIDOR4;
- _shown[0] = true;
- _shown[1] = true;
- _shown[2] = true;
- _shown[3] = false;
- _shown[4] = false;
- _shown[5] = false;
- _shown[6] = false;
- _shown[7] = false;
- _shown[8] = true;
- _shown[9] = true;
- _shown[10] = false;
- _shown[11] = true;
- _shown[12] = false;
- _shown[13] = false;
- _shown[14] = false;
- _shown[15] = true;
- _shown[16] = false;
- _shown[17] = false;
- _shown[18] = true;
- _shown[19] = false;
- _shown[20] = true;
- _shown[21] = false;
- _shown[22] = false;
- _shown[23] = false;
- _shown[24] = false;
- _shown[25] = false;
- _shown[26] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
+ _shown[2] = kShownTrue;
+ _shown[3] = kShownFalse;
+ _shown[4] = kShownFalse;
+ _shown[5] = kShownFalse;
+ _shown[6] = kShownFalse;
+ _shown[7] = kShownFalse;
+ _shown[8] = kShownTrue;
+ _shown[9] = kShownTrue;
+ _shown[10] = kShownFalse;
+ _shown[11] = kShownTrue;
+ _shown[12] = kShownFalse;
+ _shown[13] = kShownFalse;
+ _shown[14] = kShownFalse;
+ _shown[15] = kShownTrue;
+ _shown[16] = kShownFalse;
+ _shown[17] = kShownFalse;
+ _shown[18] = kShownTrue;
+ _shown[19] = kShownFalse;
+ _shown[20] = kShownTrue;
+ _shown[21] = kShownFalse;
+ _shown[22] = kShownFalse;
+ _shown[23] = kShownFalse;
+ _shown[24] = kShownFalse;
+ _shown[25] = kShownFalse;
+ _shown[26] = kShownTrue;
_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,0,0,0,CORRIDOR2,10);
_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,1,1,0,GUARD,14);
@@ -1090,31 +1091,31 @@ public:
_fileNumber = 16;
_id = CORRIDOR5;
- _shown[0] = true;
- _shown[1] = false;
- _shown[2] = false;
- _shown[3] = true;
- _shown[4] = true;
- _shown[5] = true;
- _shown[6] = false;
- _shown[7] = false;
- _shown[8] = false;
- _shown[9] = false;
- _shown[10] = false;
- _shown[11] = false;
- _shown[12] = true;
- _shown[13] = false;
- _shown[14] = false;
- _shown[15] = false;
- _shown[16] = false;
- _shown[17] = false;
- _shown[18] = false;
- _shown[19] = false;
- _shown[20] = false;
- _shown[21] = false;
- _shown[22] = true;
- _shown[23] = true;
- _shown[24] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownFalse;
+ _shown[2] = kShownFalse;
+ _shown[3] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[5] = kShownTrue;
+ _shown[6] = kShownFalse;
+ _shown[7] = kShownFalse;
+ _shown[8] = kShownFalse;
+ _shown[9] = kShownFalse;
+ _shown[10] = kShownFalse;
+ _shown[11] = kShownFalse;
+ _shown[12] = kShownTrue;
+ _shown[13] = kShownFalse;
+ _shown[14] = kShownFalse;
+ _shown[15] = kShownFalse;
+ _shown[16] = kShownFalse;
+ _shown[17] = kShownFalse;
+ _shown[18] = kShownFalse;
+ _shown[19] = kShownFalse;
+ _shown[20] = kShownFalse;
+ _shown[21] = kShownFalse;
+ _shown[22] = kShownTrue;
+ _shown[23] = kShownTrue;
+ _shown[24] = kShownTrue;
_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,DOOR,EXIT,2,2,0,NULLROOM,2);
_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR6,22);
@@ -1145,32 +1146,32 @@ public:
_fileNumber = 16;
_id = CORRIDOR6;
- _shown[0] = true;
- _shown[1] = false;
- _shown[2] = false;
- _shown[3] = true;
- _shown[4] = true;
- _shown[5] = true;
- _shown[6] = true;
- _shown[7] = false;
- _shown[8] = false;
- _shown[9] = false;
- _shown[10] = false;
- _shown[11] = false;
- _shown[12] = false;
- _shown[13] = false;
- _shown[14] = false;
- _shown[15] = false;
- _shown[16] = false;
- _shown[17] = false;
- _shown[18] = false;
- _shown[19] = false;
- _shown[20] = false;
- _shown[21] = false;
- _shown[22] = true;
- _shown[23] = false;
- _shown[24] = true;
- _shown[25] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownFalse;
+ _shown[2] = kShownFalse;
+ _shown[3] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[5] = kShownTrue;
+ _shown[6] = kShownTrue;
+ _shown[7] = kShownFalse;
+ _shown[8] = kShownFalse;
+ _shown[9] = kShownFalse;
+ _shown[10] = kShownFalse;
+ _shown[11] = kShownFalse;
+ _shown[12] = kShownFalse;
+ _shown[13] = kShownFalse;
+ _shown[14] = kShownFalse;
+ _shown[15] = kShownFalse;
+ _shown[16] = kShownFalse;
+ _shown[17] = kShownFalse;
+ _shown[18] = kShownFalse;
+ _shown[19] = kShownFalse;
+ _shown[20] = kShownFalse;
+ _shown[21] = kShownFalse;
+ _shown[22] = kShownTrue;
+ _shown[23] = kShownFalse;
+ _shown[24] = kShownTrue;
+ _shown[25] = kShownTrue;
_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR5,2);
_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR7,22);
@@ -1188,32 +1189,32 @@ public:
_fileNumber = 16;
_id = CORRIDOR7;
- _shown[0] = true;
- _shown[1] = false;
- _shown[2] = false;
- _shown[3] = true;
- _shown[4] = true;
- _shown[5] = true;
- _shown[6] = false;
- _shown[7] = false;
- _shown[8] = false;
- _shown[9] = false;
- _shown[10] = true;
- _shown[11] = false;
- _shown[12] = false;
- _shown[13] = false;
- _shown[14] = false;
- _shown[15] = false;
- _shown[16] = false;
- _shown[17] = false;
- _shown[18] = false;
- _shown[19] = false;
- _shown[20] = false;
- _shown[21] = true;
- _shown[22] = false;
- _shown[23] = false;
- _shown[24] = true;
- _shown[25] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownFalse;
+ _shown[2] = kShownFalse;
+ _shown[3] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[5] = kShownTrue;
+ _shown[6] = kShownFalse;
+ _shown[7] = kShownFalse;
+ _shown[8] = kShownFalse;
+ _shown[9] = kShownFalse;
+ _shown[10] = kShownTrue;
+ _shown[11] = kShownFalse;
+ _shown[12] = kShownFalse;
+ _shown[13] = kShownFalse;
+ _shown[14] = kShownFalse;
+ _shown[15] = kShownFalse;
+ _shown[16] = kShownFalse;
+ _shown[17] = kShownFalse;
+ _shown[18] = kShownFalse;
+ _shown[19] = kShownFalse;
+ _shown[20] = kShownFalse;
+ _shown[21] = kShownTrue;
+ _shown[22] = kShownFalse;
+ _shown[23] = kShownFalse;
+ _shown[24] = kShownTrue;
+ _shown[25] = kShownTrue;
_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR6,2);
_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,GUARD,22);
@@ -1229,35 +1230,35 @@ public:
_fileNumber = 16;
_id = CORRIDOR8;
- _shown[0] = true;
- _shown[1] = true;
- _shown[2] = false;
- _shown[3] = false;
- _shown[4] = true;
- _shown[5] = false;
- _shown[6] = false;
- _shown[7] = false;
- _shown[8] = false;
- _shown[9] = false;
- _shown[10] = false;
- _shown[11] = false;
- _shown[12] = false;
- _shown[13] = false;
- _shown[14] = false;
- _shown[15] = true;
- _shown[16] = false;
- _shown[17] = false;
- _shown[18] = false;
- _shown[19] = false;
- _shown[20] = true;
- _shown[21] = false;
- _shown[22] = true;
- _shown[23] = false;
- _shown[24] = false;
- _shown[25] = false;
- _shown[26] = false;
- _shown[27] = false;
- _shown[28] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
+ _shown[2] = kShownFalse;
+ _shown[3] = kShownFalse;
+ _shown[4] = kShownTrue;
+ _shown[5] = kShownFalse;
+ _shown[6] = kShownFalse;
+ _shown[7] = kShownFalse;
+ _shown[8] = kShownFalse;
+ _shown[9] = kShownFalse;
+ _shown[10] = kShownFalse;
+ _shown[11] = kShownFalse;
+ _shown[12] = kShownFalse;
+ _shown[13] = kShownFalse;
+ _shown[14] = kShownFalse;
+ _shown[15] = kShownTrue;
+ _shown[16] = kShownFalse;
+ _shown[17] = kShownFalse;
+ _shown[18] = kShownFalse;
+ _shown[19] = kShownFalse;
+ _shown[20] = kShownTrue;
+ _shown[21] = kShownFalse;
+ _shown[22] = kShownTrue;
+ _shown[23] = kShownFalse;
+ _shown[24] = kShownFalse;
+ _shown[25] = kShownFalse;
+ _shown[26] = kShownFalse;
+ _shown[27] = kShownFalse;
+ _shown[28] = kShownTrue;
_objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE,0,0,0,CORRIDOR6,10);
_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,BCORRIDOR,22);
@@ -1274,35 +1275,35 @@ public:
_fileNumber = 16;
_id = CORRIDOR9;
- _shown[0] = true;
- _shown[1] = true;
- _shown[2] = false;
- _shown[3] = true;
- _shown[4] = false;
- _shown[5] = false;
- _shown[6] = false;
- _shown[7] = false;
- _shown[8] = false;
- _shown[9] = false;
- _shown[10] = false;
- _shown[11] = false;
- _shown[12] = false;
- _shown[13] = false;
- _shown[14] = true;
- _shown[15] = false;
- _shown[16] = false;
- _shown[17] = false;
- _shown[18] = false;
- _shown[19] = true;
- _shown[20] = false;
- _shown[21] = false;
- _shown[22] = false;
- _shown[23] = true;
- _shown[24] = false;
- _shown[25] = false;
- _shown[26] = false;
- _shown[27] = false;
- _shown[28] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
+ _shown[2] = kShownFalse;
+ _shown[3] = kShownTrue;
+ _shown[4] = kShownFalse;
+ _shown[5] = kShownFalse;
+ _shown[6] = kShownFalse;
+ _shown[7] = kShownFalse;
+ _shown[8] = kShownFalse;
+ _shown[9] = kShownFalse;
+ _shown[10] = kShownFalse;
+ _shown[11] = kShownFalse;
+ _shown[12] = kShownFalse;
+ _shown[13] = kShownFalse;
+ _shown[14] = kShownTrue;
+ _shown[15] = kShownFalse;
+ _shown[16] = kShownFalse;
+ _shown[17] = kShownFalse;
+ _shown[18] = kShownFalse;
+ _shown[19] = kShownTrue;
+ _shown[20] = kShownFalse;
+ _shown[21] = kShownFalse;
+ _shown[22] = kShownFalse;
+ _shown[23] = kShownTrue;
+ _shown[24] = kShownFalse;
+ _shown[25] = kShownFalse;
+ _shown[26] = kShownFalse;
+ _shown[27] = kShownFalse;
+ _shown[28] = kShownTrue;
_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,BCORRIDOR,2);
_objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE,0,0,0,GUARD,10);
@@ -1319,10 +1320,10 @@ public:
_fileNumber = 6;
_id = BCORRIDOR;
- _shown[0] = true;
- _shown[1] = false;
- _shown[2] = false;
- _shown[3] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownFalse;
+ _shown[2] = kShownFalse;
+ _shown[3] = kShownTrue;
_objectState[0] = Object(_id, kStringPillar,kStringDefaultDescription,PILLAR1,NULLTYPE,4,4,0);
_objectState[1] = Object(_id, kStringPillar,kStringDefaultDescription,PILLAR2,NULLTYPE,5,5,0);
@@ -1348,7 +1349,7 @@ public:
_fileNumber = 40;
_id = GUARD;
- _shown[0] = true;
+ _shown[0] = kShownTrue;
_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,CORRIDOR4,21);
_objectState[1] = Object(_id, kStringCorridor,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR7,5);
@@ -1369,7 +1370,7 @@ public:
_fileNumber = 42;
_id = GUARD3;
- _shown[0] = true;
+ _shown[0] = kShownTrue;
_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,CORRIDOR1,22);
_objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,NULLOBJECT,EXIT|OPENABLE|CLOSED,0,0,0,NULLROOM,20);
@@ -1391,23 +1392,23 @@ public:
_fileNumber = 7;
_id = OFFICE_L1;
- _shown[0] = true;
- _shown[1] = false;
- _shown[2] = true;
- _shown[3] = false;
- _shown[4] = false;
- _shown[5] = false;
- _shown[6] = false;
- _shown[7] = true;
- _shown[8] = false;
- _shown[9] = true;
- _shown[10] = false;
- _shown[11] = false;
- _shown[12] = false;
- _shown[13] = false;
- _shown[14] = false;
- _shown[15] = false;
- _shown[16] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownFalse;
+ _shown[2] = kShownTrue;
+ _shown[3] = kShownFalse;
+ _shown[4] = kShownFalse;
+ _shown[5] = kShownFalse;
+ _shown[6] = kShownFalse;
+ _shown[7] = kShownTrue;
+ _shown[8] = kShownFalse;
+ _shown[9] = kShownTrue;
+ _shown[10] = kShownFalse;
+ _shown[11] = kShownFalse;
+ _shown[12] = kShownFalse;
+ _shown[13] = kShownFalse;
+ _shown[14] = kShownFalse;
+ _shown[15] = kShownFalse;
+ _shown[16] = kShownTrue;
_objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,9,BCORRIDOR,9);
_objectState[1] = Object(_id, kStringComputer,kStringDefaultDescription,COMPUTER,COMBINABLE,4,4,0);
@@ -1426,23 +1427,23 @@ public:
_fileNumber = 7;
_id = OFFICE_L2;
- _shown[0] = true;
- _shown[1] = true;
- _shown[2] = false;
- _shown[3] = false;
- _shown[4] = false;
- _shown[5] = false;
- _shown[6] = false;
- _shown[7] = false;
- _shown[8] = false;
- _shown[9] = true;
- _shown[10] = false;
- _shown[11] = false;
- _shown[12] = false;
- _shown[13] = false;
- _shown[14] = false;
- _shown[15] = false;
- _shown[16] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
+ _shown[2] = kShownFalse;
+ _shown[3] = kShownFalse;
+ _shown[4] = kShownFalse;
+ _shown[5] = kShownFalse;
+ _shown[6] = kShownFalse;
+ _shown[7] = kShownFalse;
+ _shown[8] = kShownFalse;
+ _shown[9] = kShownTrue;
+ _shown[10] = kShownFalse;
+ _shown[11] = kShownFalse;
+ _shown[12] = kShownFalse;
+ _shown[13] = kShownFalse;
+ _shown[14] = kShownFalse;
+ _shown[15] = kShownFalse;
+ _shown[16] = kShownTrue;
_objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,9,BCORRIDOR,9);
_objectState[1] = Object(_id, kStringComputer,kStringDefaultDescription,COMPUTER,COMBINABLE,4,4,0);
@@ -1461,10 +1462,10 @@ public:
_fileNumber = 8;
_id = OFFICE_R1;
- _shown[0] = true;
- _shown[1] = true;
- _shown[2] = false;
- _shown[3] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
+ _shown[2] = kShownFalse;
+ _shown[3] = kShownTrue;
_objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,0,0,3,BCORRIDOR,5);
_objectState[1] = Object(_id, kStringComputer,kStringDefaultDescription,COMPUTER,COMBINABLE,4,4,0);
@@ -1484,10 +1485,10 @@ public:
_fileNumber = 8;
_id = OFFICE_R2;
- _shown[0] = true;
- _shown[1] = false;
- _shown[2] = true;
- _shown[3] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownFalse;
+ _shown[2] = kShownTrue;
+ _shown[3] = kShownTrue;
_objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,0,0,3,BCORRIDOR,5);
_objectState[1] = Object(_id, kStringComputer,kStringDefaultDescription,COMPUTER,COMBINABLE,4,4,0);
@@ -1505,24 +1506,24 @@ public:
_fileNumber = 7;
_id = OFFICE_L;
- _shown[0] = true;
- _shown[1] = false;
- _shown[2] = false;
- _shown[3] = true;
- _shown[4] = false;
- _shown[5] = true;
- _shown[6] = false;
- _shown[7] = false;
- _shown[8] = false;
- _shown[9] = false;
- _shown[10] = false;
- _shown[11] = false;
- _shown[12] = false;
- _shown[13] = false;
- _shown[14] = false;
- _shown[15] = false;
- _shown[16] = false;
- _shown[17] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownFalse;
+ _shown[2] = kShownFalse;
+ _shown[3] = kShownTrue;
+ _shown[4] = kShownFalse;
+ _shown[5] = kShownTrue;
+ _shown[6] = kShownFalse;
+ _shown[7] = kShownFalse;
+ _shown[8] = kShownFalse;
+ _shown[9] = kShownFalse;
+ _shown[10] = kShownFalse;
+ _shown[11] = kShownFalse;
+ _shown[12] = kShownFalse;
+ _shown[13] = kShownFalse;
+ _shown[14] = kShownFalse;
+ _shown[15] = kShownFalse;
+ _shown[16] = kShownFalse;
+ _shown[17] = kShownTrue;
_objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,17,GUARD3,9);
_objectState[1] = Object(_id, kStringComputer,kStringComputerDescription,COMPUTER,COMBINABLE,4,4,0);
@@ -1541,7 +1542,7 @@ public:
_fileNumber = 3;
_id = ELEVATOR;
- _shown[0] = true;
+ _shown[0] = kShownTrue;
_objectState[0] = Object(_id, kStringButton,kStringDefaultDescription,BUTTON1,PRESS,0,0,0);
_objectState[1] = Object(_id, kStringButton,kStringDefaultDescription,BUTTON2,PRESS,1,1,0);
@@ -1559,7 +1560,7 @@ public:
_fileNumber = 5;
_id = STATION;
- _shown[0] = true;
+ _shown[0] = kShownTrue;
_objectState[0] = Object(_id, kStringSign,kStringDefaultDescription,STATION_SIGN,NULLTYPE,0,0,0);
_objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|CLOSED,1,1,0,NULLROOM,7);
}
@@ -1574,8 +1575,8 @@ public:
_fileNumber = 32;
_id = SIGN;
- _shown[0] = true;
- _shown[1] = true;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,STATION,22);
_objectState[1] = Object(_id, kStringSlot,kStringDefaultDescription,STATION_SLOT,COMBINABLE,0,0,0);
Commit: 46bdb304dd35035e42a81b371f222fc050c51896
https://github.com/scummvm/scummvm/commit/46bdb304dd35035e42a81b371f222fc050c51896
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:34Z
Commit Message:
SUPERNOVA: Remove useless defines
Changed paths:
engines/supernova/msn_def.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 3cd7dd2..93755fe 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -33,8 +33,6 @@ const int kTextSpeed[] = {19, 14, 10, 7, 4};
const int kMsecPerTick = 55;
const int kMaxSection = 40;
-const int kMaxSectionZus = 50;
-const int kMaxClickfieldZus = 80;
const int kMaxObject = 25;
const int kMaxCarry = 30;
Commit: 7485a459090fccaabad8132c37f513516849abb6
https://github.com/scummvm/scummvm/commit/7485a459090fccaabad8132c37f513516849abb6
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:34Z
Commit Message:
SUPERNOVA: Remove useless 2nd initialization of _shown to false
Changed paths:
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 626dc97..6e570ef 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -118,9 +118,6 @@ public:
_fileNumber = 17;
_id = CORRIDOR;
_shown[0] = kShownTrue;
- _shown[1] = kShownFalse;
- _shown[2] = kShownFalse;
- _shown[3] = kShownFalse;
_shown[4] = kShownTrue;
_objectState[0] = Object(_id, kStringHatch, kStringDefaultDescription, HATCH1, OPENABLE | EXIT, 0, 6, 1, CABIN_L1, 15);
@@ -246,21 +243,6 @@ public:
_fileNumber = 21;
_id = CABIN_L2;
_shown[0] = kShownTrue;
- _shown[1] = kShownFalse;
- _shown[2] = kShownFalse;
- _shown[3] = kShownFalse;
- _shown[4] = kShownFalse;
- _shown[5] = kShownFalse;
- _shown[6] = kShownFalse;
- _shown[7] = kShownFalse;
- _shown[8] = kShownFalse;
- _shown[9] = kShownFalse;
- _shown[10] = kShownFalse;
- _shown[11] = kShownFalse;
- _shown[12] = kShownFalse;
- _shown[13] = kShownFalse;
- _shown[14] = kShownFalse;
- _shown[15] = kShownFalse;
_shown[16] = kShownTrue;
_objectState[0] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_KL1,COMBINABLE,31,31,0);
@@ -302,17 +284,10 @@ public:
_fileNumber = 21;
_id = CABIN_L3;
_shown[0] = kShownTrue;
- _shown[1] = kShownFalse;
- _shown[2] = kShownFalse;
- _shown[3] = kShownFalse;
- _shown[4] = kShownFalse;
- _shown[5] = kShownFalse;
_shown[6] = kShownTrue;
_shown[7] = kShownTrue;
_shown[8] = kShownTrue;
_shown[9] = kShownTrue;
- _shown[10] = kShownFalse;
- _shown[11] = kShownFalse;
_shown[12] = kShownTrue;
_objectState[0] = Object(_id, kStringPoster,kStringPosterDescription1,NULLOBJECT,UNNECESSARY,11,11,0);
@@ -370,8 +345,6 @@ public:
_fileNumber = 22;
_id = CABIN_R2;
_shown[0] = kShownTrue;
- _shown[1] = kShownFalse;
- _shown[2] = kShownFalse;
_shown[3] = kShownTrue;
_shown[4] = kShownTrue;
_shown[5] = kShownTrue;
@@ -397,20 +370,8 @@ public:
_fileNumber = 22;
_id = CABIN_R3;
_shown[0] = kShownTrue;
- _shown[1] = kShownFalse;
- _shown[2] = kShownFalse;
- _shown[3] = kShownFalse;
- _shown[4] = kShownFalse;
- _shown[5] = kShownFalse;
- _shown[6] = kShownFalse;
_shown[7] = kShownTrue;
_shown[8] = kShownTrue;
- _shown[9] = kShownFalse;
- _shown[10] = kShownFalse;
- _shown[11] = kShownFalse;
- _shown[12] = kShownFalse;
- _shown[13] = kShownFalse;
- _shown[14] = kShownFalse;
_shown[15] = kShownTrue;
_objectState[0] = Object(_id, kStringChessGame,kStringChessGameDescription2,CHESS,TAKE | COMBINABLE,12,12,7 | 128);
@@ -468,11 +429,6 @@ public:
_fileNumber = 34;
_id = AIRLOCK;
_shown[0] = kShownTrue;
- _shown[1] = kShownFalse;
- _shown[2] = kShownFalse;
- _shown[3] = kShownFalse;
- _shown[4] = kShownFalse;
- _shown[5] = kShownFalse;
_shown[6] = kShownTrue;
_objectState[0] = Object(_id, kStringHatch,kStringHatchDescription1,NULLOBJECT,EXIT | OPENABLE | OPENED | CLOSED,0,0,0,CORRIDOR,10);
@@ -546,10 +502,6 @@ public:
_fileNumber = 18;
_id = GENERATOR;
_shown[0] = kShownTrue;
- _shown[1] = kShownFalse;
- _shown[2] = kShownFalse;
- _shown[3] = kShownFalse;
- _shown[4] = kShownFalse;
_shown[5] = kShownTrue;
_objectState[0] = Object(_id, kStringGeneratorWire,kStringDefaultDescription,GENERATOR_WIRE,COMBINABLE,255,255,0);
@@ -613,7 +565,6 @@ public:
_fileNumber = 12;
_id = CAVE;
- _shown[0] = kShownFalse;
_objectState[0] = Object(_id, kStringExit,kStringExitDescription,NULLOBJECT,EXIT,255,255,0,ROCKS,22);
_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,MEETUP,2);
@@ -868,35 +819,6 @@ public:
_id = CELL;
_shown[0] = kShownTrue;
_shown[1] = kShownTrue;
- _shown[2] = kShownFalse;
- _shown[3] = kShownFalse;
- _shown[4] = kShownFalse;
- _shown[5] = kShownFalse;
- _shown[6] = kShownFalse;
- _shown[7] = kShownFalse;
- _shown[8] = kShownFalse;
- _shown[9] = kShownFalse;
- _shown[10] = kShownFalse;
- _shown[11] = kShownFalse;
- _shown[12] = kShownFalse;
- _shown[13] = kShownFalse;
- _shown[14] = kShownFalse;
- _shown[15] = kShownFalse;
- _shown[16] = kShownFalse;
- _shown[17] = kShownFalse;
- _shown[18] = kShownFalse;
- _shown[19] = kShownFalse;
- _shown[20] = kShownFalse;
- _shown[21] = kShownFalse;
- _shown[22] = kShownFalse;
- _shown[23] = kShownFalse;
- _shown[24] = kShownFalse;
- _shown[25] = kShownFalse;
- _shown[26] = kShownFalse;
- _shown[27] = kShownFalse;
- _shown[28] = kShownFalse;
- _shown[29] = kShownFalse;
- _shown[30] = kShownFalse;
_shown[31] = kShownTrue;
_objectState[0] = Object(_id, kStringButton,kStringDefaultDescription,CELL_BUTTON,PRESS,1,1,0);
@@ -924,30 +846,12 @@ public:
_fileNumber = 16;
_id = CORRIDOR1;
_shown[0] = kShownTrue;
- _shown[1] = kShownFalse;
- _shown[2] = kShownFalse;
_shown[3] = kShownTrue;
_shown[4] = kShownTrue;
_shown[5] = kShownTrue;
- _shown[6] = kShownFalse;
- _shown[7] = kShownFalse;
- _shown[8] = kShownFalse;
- _shown[9] = kShownFalse;
- _shown[10] = kShownFalse;
- _shown[11] = kShownFalse;
- _shown[12] = kShownFalse;
_shown[13] = kShownTrue;
- _shown[14] = kShownFalse;
- _shown[15] = kShownFalse;
- _shown[16] = kShownFalse;
- _shown[17] = kShownFalse;
- _shown[18] = kShownFalse;
- _shown[19] = kShownFalse;
- _shown[20] = kShownFalse;
_shown[21] = kShownTrue;
- _shown[22] = kShownFalse;
_shown[23] = kShownTrue;
- _shown[24] = kShownFalse;
_shown[25] = kShownTrue;
_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,GUARD3,2);
@@ -965,29 +869,12 @@ public:
_fileNumber = 16;
_id = CORRIDOR2;
_shown[0] = kShownTrue;
- _shown[1] = kShownFalse;
_shown[2] = kShownTrue;
_shown[3] = kShownTrue;
_shown[4] = kShownTrue;
_shown[5] = kShownTrue;
- _shown[6] = kShownFalse;
- _shown[7] = kShownFalse;
- _shown[8] = kShownFalse;
- _shown[9] = kShownFalse;
- _shown[10] = kShownFalse;
- _shown[11] = kShownFalse;
- _shown[12] = kShownFalse;
- _shown[13] = kShownFalse;
- _shown[14] = kShownFalse;
- _shown[15] = kShownFalse;
- _shown[16] = kShownFalse;
_shown[17] = kShownTrue;
- _shown[18] = kShownFalse;
- _shown[19] = kShownFalse;
- _shown[20] = kShownFalse;
_shown[21] = kShownTrue;
- _shown[22] = kShownFalse;
- _shown[23] = kShownFalse;
_shown[24] = kShownTrue;
_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR1,2);
@@ -1006,28 +893,9 @@ public:
_fileNumber = 16;
_id = CORRIDOR3;
_shown[0] = kShownTrue;
- _shown[1] = kShownFalse;
- _shown[2] = kShownFalse;
_shown[3] = kShownTrue;
- _shown[4] = kShownFalse;
_shown[5] = kShownTrue;
- _shown[6] = kShownFalse;
- _shown[7] = kShownFalse;
- _shown[8] = kShownFalse;
- _shown[9] = kShownFalse;
- _shown[10] = kShownFalse;
- _shown[11] = kShownFalse;
- _shown[12] = kShownFalse;
- _shown[13] = kShownFalse;
- _shown[14] = kShownFalse;
- _shown[15] = kShownFalse;
- _shown[16] = kShownFalse;
- _shown[17] = kShownFalse;
- _shown[18] = kShownFalse;
_shown[19] = kShownTrue;
- _shown[20] = kShownFalse;
- _shown[21] = kShownFalse;
- _shown[22] = kShownFalse;
_shown[23] = kShownTrue;
_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR2,2);
@@ -1046,29 +914,12 @@ public:
_shown[0] = kShownTrue;
_shown[1] = kShownTrue;
_shown[2] = kShownTrue;
- _shown[3] = kShownFalse;
- _shown[4] = kShownFalse;
- _shown[5] = kShownFalse;
- _shown[6] = kShownFalse;
- _shown[7] = kShownFalse;
_shown[8] = kShownTrue;
_shown[9] = kShownTrue;
- _shown[10] = kShownFalse;
_shown[11] = kShownTrue;
- _shown[12] = kShownFalse;
- _shown[13] = kShownFalse;
- _shown[14] = kShownFalse;
_shown[15] = kShownTrue;
- _shown[16] = kShownFalse;
- _shown[17] = kShownFalse;
_shown[18] = kShownTrue;
- _shown[19] = kShownFalse;
_shown[20] = kShownTrue;
- _shown[21] = kShownFalse;
- _shown[22] = kShownFalse;
- _shown[23] = kShownFalse;
- _shown[24] = kShownFalse;
- _shown[25] = kShownFalse;
_shown[26] = kShownTrue;
_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,0,0,0,CORRIDOR2,10);
@@ -1092,27 +943,10 @@ public:
_fileNumber = 16;
_id = CORRIDOR5;
_shown[0] = kShownTrue;
- _shown[1] = kShownFalse;
- _shown[2] = kShownFalse;
_shown[3] = kShownTrue;
_shown[4] = kShownTrue;
_shown[5] = kShownTrue;
- _shown[6] = kShownFalse;
- _shown[7] = kShownFalse;
- _shown[8] = kShownFalse;
- _shown[9] = kShownFalse;
- _shown[10] = kShownFalse;
- _shown[11] = kShownFalse;
_shown[12] = kShownTrue;
- _shown[13] = kShownFalse;
- _shown[14] = kShownFalse;
- _shown[15] = kShownFalse;
- _shown[16] = kShownFalse;
- _shown[17] = kShownFalse;
- _shown[18] = kShownFalse;
- _shown[19] = kShownFalse;
- _shown[20] = kShownFalse;
- _shown[21] = kShownFalse;
_shown[22] = kShownTrue;
_shown[23] = kShownTrue;
_shown[24] = kShownTrue;
@@ -1147,29 +981,11 @@ public:
_fileNumber = 16;
_id = CORRIDOR6;
_shown[0] = kShownTrue;
- _shown[1] = kShownFalse;
- _shown[2] = kShownFalse;
_shown[3] = kShownTrue;
_shown[4] = kShownTrue;
_shown[5] = kShownTrue;
_shown[6] = kShownTrue;
- _shown[7] = kShownFalse;
- _shown[8] = kShownFalse;
- _shown[9] = kShownFalse;
- _shown[10] = kShownFalse;
- _shown[11] = kShownFalse;
- _shown[12] = kShownFalse;
- _shown[13] = kShownFalse;
- _shown[14] = kShownFalse;
- _shown[15] = kShownFalse;
- _shown[16] = kShownFalse;
- _shown[17] = kShownFalse;
- _shown[18] = kShownFalse;
- _shown[19] = kShownFalse;
- _shown[20] = kShownFalse;
- _shown[21] = kShownFalse;
_shown[22] = kShownTrue;
- _shown[23] = kShownFalse;
_shown[24] = kShownTrue;
_shown[25] = kShownTrue;
@@ -1190,29 +1006,11 @@ public:
_fileNumber = 16;
_id = CORRIDOR7;
_shown[0] = kShownTrue;
- _shown[1] = kShownFalse;
- _shown[2] = kShownFalse;
_shown[3] = kShownTrue;
_shown[4] = kShownTrue;
_shown[5] = kShownTrue;
- _shown[6] = kShownFalse;
- _shown[7] = kShownFalse;
- _shown[8] = kShownFalse;
- _shown[9] = kShownFalse;
_shown[10] = kShownTrue;
- _shown[11] = kShownFalse;
- _shown[12] = kShownFalse;
- _shown[13] = kShownFalse;
- _shown[14] = kShownFalse;
- _shown[15] = kShownFalse;
- _shown[16] = kShownFalse;
- _shown[17] = kShownFalse;
- _shown[18] = kShownFalse;
- _shown[19] = kShownFalse;
- _shown[20] = kShownFalse;
_shown[21] = kShownTrue;
- _shown[22] = kShownFalse;
- _shown[23] = kShownFalse;
_shown[24] = kShownTrue;
_shown[25] = kShownTrue;
@@ -1232,32 +1030,10 @@ public:
_id = CORRIDOR8;
_shown[0] = kShownTrue;
_shown[1] = kShownTrue;
- _shown[2] = kShownFalse;
- _shown[3] = kShownFalse;
_shown[4] = kShownTrue;
- _shown[5] = kShownFalse;
- _shown[6] = kShownFalse;
- _shown[7] = kShownFalse;
- _shown[8] = kShownFalse;
- _shown[9] = kShownFalse;
- _shown[10] = kShownFalse;
- _shown[11] = kShownFalse;
- _shown[12] = kShownFalse;
- _shown[13] = kShownFalse;
- _shown[14] = kShownFalse;
_shown[15] = kShownTrue;
- _shown[16] = kShownFalse;
- _shown[17] = kShownFalse;
- _shown[18] = kShownFalse;
- _shown[19] = kShownFalse;
_shown[20] = kShownTrue;
- _shown[21] = kShownFalse;
_shown[22] = kShownTrue;
- _shown[23] = kShownFalse;
- _shown[24] = kShownFalse;
- _shown[25] = kShownFalse;
- _shown[26] = kShownFalse;
- _shown[27] = kShownFalse;
_shown[28] = kShownTrue;
_objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE,0,0,0,CORRIDOR6,10);
@@ -1277,32 +1053,10 @@ public:
_id = CORRIDOR9;
_shown[0] = kShownTrue;
_shown[1] = kShownTrue;
- _shown[2] = kShownFalse;
_shown[3] = kShownTrue;
- _shown[4] = kShownFalse;
- _shown[5] = kShownFalse;
- _shown[6] = kShownFalse;
- _shown[7] = kShownFalse;
- _shown[8] = kShownFalse;
- _shown[9] = kShownFalse;
- _shown[10] = kShownFalse;
- _shown[11] = kShownFalse;
- _shown[12] = kShownFalse;
- _shown[13] = kShownFalse;
_shown[14] = kShownTrue;
- _shown[15] = kShownFalse;
- _shown[16] = kShownFalse;
- _shown[17] = kShownFalse;
- _shown[18] = kShownFalse;
_shown[19] = kShownTrue;
- _shown[20] = kShownFalse;
- _shown[21] = kShownFalse;
- _shown[22] = kShownFalse;
_shown[23] = kShownTrue;
- _shown[24] = kShownFalse;
- _shown[25] = kShownFalse;
- _shown[26] = kShownFalse;
- _shown[27] = kShownFalse;
_shown[28] = kShownTrue;
_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,BCORRIDOR,2);
@@ -1321,8 +1075,6 @@ public:
_fileNumber = 6;
_id = BCORRIDOR;
_shown[0] = kShownTrue;
- _shown[1] = kShownFalse;
- _shown[2] = kShownFalse;
_shown[3] = kShownTrue;
_objectState[0] = Object(_id, kStringPillar,kStringDefaultDescription,PILLAR1,NULLTYPE,4,4,0);
@@ -1393,21 +1145,9 @@ public:
_fileNumber = 7;
_id = OFFICE_L1;
_shown[0] = kShownTrue;
- _shown[1] = kShownFalse;
_shown[2] = kShownTrue;
- _shown[3] = kShownFalse;
- _shown[4] = kShownFalse;
- _shown[5] = kShownFalse;
- _shown[6] = kShownFalse;
_shown[7] = kShownTrue;
- _shown[8] = kShownFalse;
_shown[9] = kShownTrue;
- _shown[10] = kShownFalse;
- _shown[11] = kShownFalse;
- _shown[12] = kShownFalse;
- _shown[13] = kShownFalse;
- _shown[14] = kShownFalse;
- _shown[15] = kShownFalse;
_shown[16] = kShownTrue;
_objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,9,BCORRIDOR,9);
@@ -1429,20 +1169,7 @@ public:
_id = OFFICE_L2;
_shown[0] = kShownTrue;
_shown[1] = kShownTrue;
- _shown[2] = kShownFalse;
- _shown[3] = kShownFalse;
- _shown[4] = kShownFalse;
- _shown[5] = kShownFalse;
- _shown[6] = kShownFalse;
- _shown[7] = kShownFalse;
- _shown[8] = kShownFalse;
_shown[9] = kShownTrue;
- _shown[10] = kShownFalse;
- _shown[11] = kShownFalse;
- _shown[12] = kShownFalse;
- _shown[13] = kShownFalse;
- _shown[14] = kShownFalse;
- _shown[15] = kShownFalse;
_shown[16] = kShownTrue;
_objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,9,BCORRIDOR,9);
@@ -1464,7 +1191,6 @@ public:
_id = OFFICE_R1;
_shown[0] = kShownTrue;
_shown[1] = kShownTrue;
- _shown[2] = kShownFalse;
_shown[3] = kShownTrue;
_objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,0,0,3,BCORRIDOR,5);
@@ -1486,7 +1212,6 @@ public:
_fileNumber = 8;
_id = OFFICE_R2;
_shown[0] = kShownTrue;
- _shown[1] = kShownFalse;
_shown[2] = kShownTrue;
_shown[3] = kShownTrue;
@@ -1507,22 +1232,8 @@ public:
_fileNumber = 7;
_id = OFFICE_L;
_shown[0] = kShownTrue;
- _shown[1] = kShownFalse;
- _shown[2] = kShownFalse;
_shown[3] = kShownTrue;
- _shown[4] = kShownFalse;
_shown[5] = kShownTrue;
- _shown[6] = kShownFalse;
- _shown[7] = kShownFalse;
- _shown[8] = kShownFalse;
- _shown[9] = kShownFalse;
- _shown[10] = kShownFalse;
- _shown[11] = kShownFalse;
- _shown[12] = kShownFalse;
- _shown[13] = kShownFalse;
- _shown[14] = kShownFalse;
- _shown[15] = kShownFalse;
- _shown[16] = kShownFalse;
_shown[17] = kShownTrue;
_objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,17,GUARD3,9);
Commit: 31a04960910673a34f4634a293602d04c351fd4c
https://github.com/scummvm/scummvm/commit/31a04960910673a34f4634a293602d04c351fd4c
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:34Z
Commit Message:
SUPERNOVA: Janitorial - Fix some spacing in rooms.cpp
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 790d201..3bfe23a 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -157,9 +157,9 @@ void Intro::titleScreen() {
const Common::String& title1 = _vm->getGameString(kStringTitle1);
const Common::String& title2 = _vm->getGameString(kStringTitle2);
const Common::String& title3 = _vm->getGameString(kStringTitle3);
- _vm->renderText(title1, 78 - _vm->textWidth(title1)/2, 120, kColorLightBlue);
- _vm->renderText(title2, 78 - _vm->textWidth(title2)/2, 132, kColorWhite99);
- _vm->renderText(title3, 78 - _vm->textWidth(title3)/2, 142, kColorWhite99);
+ _vm->renderText(title1, 78 - _vm->textWidth(title1) / 2, 120, kColorLightBlue);
+ _vm->renderText(title2, 78 - _vm->textWidth(title2) / 2, 132, kColorWhite99);
+ _vm->renderText(title3, 78 - _vm->textWidth(title3) / 2, 142, kColorWhite99);
_gm->wait2(1);
CursorMan.showMouse(true);
_vm->playSoundMod(kMusicIntro);
@@ -172,7 +172,7 @@ void Intro::titleScreen() {
void Intro::titleFadeIn() {
byte titlePaletteColor[] = {0xfe, 0xeb};
- byte titleNewColor[2][3] = {{255,255,255}, {199, 21, 21}};
+ byte titleNewColor[2][3] = {{255, 255, 255}, {199, 21, 21}};
byte newColors[2][3];
for (int brightness = 1; brightness <= 40; ++brightness) {
@@ -275,17 +275,17 @@ void Intro::cutscene() {
_vm->renderImage(9, 1);
_vm->renderImage(9, 9);
_vm->paletteFadeIn();
- if (!animate(9,11,10,6,kMessageRight,kStringIntroCutscene2))
+ if (!animate(9, 11, 10, 6, kMessageRight, kStringIntroCutscene2))
return;
_vm->renderImage(9, 3);
exitOnEscape(4);
_vm->renderImage(9, 4);
- if (!animate(9, 11,10,3)) {// test duration
+ if (!animate(9, 11, 10, 3)) {// test duration
_vm->removeMessage();
return;
}
_vm->removeMessage();
- if (!animate(9, 5,4,0,kMessageLeft,kStringIntroCutscene3))
+ if (!animate(9, 5, 4, 0, kMessageLeft, kStringIntroCutscene3))
return;
_vm->renderImage(9, 3);
exitOnEscape(3);
@@ -295,7 +295,7 @@ void Intro::cutscene() {
exitOnEscape(6);
_vm->renderImage(9, 6);
exitOnEscape(6);
- if (!animate(9, 0,0,0,kMessageLeft,kStringIntroCutscene4))
+ if (!animate(9, 0, 0, 0, kMessageLeft, kStringIntroCutscene4))
return;
_vm->renderMessage(kStringIntroCutscene5, kMessageLeft);
exitOnEscape(28);
@@ -305,7 +305,7 @@ void Intro::cutscene() {
_vm->removeMessage();
StringID textCounting[4] =
- {kStringIntroCutscene7,kStringIntroCutscene8,kStringIntroCutscene9,kStringIntroCutscene10};
+ {kStringIntroCutscene7, kStringIntroCutscene8, kStringIntroCutscene9, kStringIntroCutscene10};
_vm->renderImage(31, 0);
_vm->paletteBrightness();
for (int i = 0; i < 4; ++i){
@@ -340,39 +340,39 @@ void Intro::cutscene() {
_vm->paletteBrightness();
_vm->renderBox(0, 138, 320, 62, kColorBlack);
_vm->paletteBrightness();
- if (!animate(9, 11,10,0,kMessageRight,kStringIntroCutscene12))
+ if (!animate(9, 11, 10, 0, kMessageRight, kStringIntroCutscene12))
return;
_vm->renderImage(9, 3);
exitOnEscape(3);
_vm->renderImage(9, 4);
- if (!animate(9, 5,4,0,kMessageLeft,kStringIntroCutscene13))
+ if (!animate(9, 5, 4, 0, kMessageLeft, kStringIntroCutscene13))
return;
- if (!animate(9, 0,0,0,kMessageCenter,kStringIntroCutscene14))
+ if (!animate(9, 0, 0, 0, kMessageCenter, kStringIntroCutscene14))
return;
_vm->renderImage(9, 12);
exitOnEscape(2);
_vm->renderImage(9, 13);
exitOnEscape(2);
_vm->renderImage(9, 14);
- if (!animate(9, 19,20,0,kMessageRight,kStringIntroCutscene15))
+ if (!animate(9, 19, 20, 0, kMessageRight, kStringIntroCutscene15))
return;
- if (!animate(9, 0,0,0,kMessageCenter,kStringIntroCutscene16))
+ if (!animate(9, 0, 0, 0, kMessageCenter, kStringIntroCutscene16))
return;
exitOnEscape(20);
- if (!animate(9, 0,0,0,kMessageCenter,kStringIntroCutscene17))
+ if (!animate(9, 0, 0, 0, kMessageCenter, kStringIntroCutscene17))
return;
- if (!animate(9, 19,20,0,kMessageRight,kStringIntroCutscene18))
+ if (!animate(9, 19, 20, 0, kMessageRight, kStringIntroCutscene18))
return;
- if (!animate(9, 0,0,0,kMessageCenter,kStringIntroCutscene19))
+ if (!animate(9, 0, 0, 0, kMessageCenter, kStringIntroCutscene19))
return;
_vm->renderImage(9, 16);
exitOnEscape(3);
_vm->renderImage(9, 17);
- if (!animate(9, 19,20,18,17,0,kMessageRight,kStringIntroCutscene20))
+ if (!animate(9, 19, 20, 18, 17, 0, kMessageRight, kStringIntroCutscene20))
return;
- if (!animate(9, 19,20,18,17,0,kMessageRight,kStringIntroCutscene21))
+ if (!animate(9, 19, 20, 18, 17, 0, kMessageRight, kStringIntroCutscene21))
return;
- if (!animate(9, 5,4,0,kMessageLeft,kStringIntroCutscene3))
+ if (!animate(9, 5, 4, 0, kMessageLeft, kStringIntroCutscene3))
return;
_vm->renderImage(9, 3);
exitOnEscape(3);
@@ -390,9 +390,9 @@ void Intro::cutscene() {
_vm->renderImage(9, 16);
exitOnEscape(3);
_vm->renderImage(9, 15);
- if (!animate(9, 19,20,0,kMessageRight,kStringIntroCutscene22))
+ if (!animate(9, 19, 20, 0, kMessageRight, kStringIntroCutscene22))
return;
- if (!animate(9, 19,20,0,kMessageRight,kStringIntroCutscene23))
+ if (!animate(9, 19, 20, 0, kMessageRight, kStringIntroCutscene23))
return;
exitOnEscape(10);
_vm->renderImage(9, 13);
@@ -400,9 +400,9 @@ void Intro::cutscene() {
_vm->renderImage(9, 12);
exitOnEscape(2);
_vm->renderImage(9, 9);
- if (!animate(9, 11,10,0,kMessageRight,kStringIntroCutscene24))
+ if (!animate(9, 11, 10, 0, kMessageRight, kStringIntroCutscene24))
return;
- if (!animate(9, 5,4,0,kMessageLeft,kStringIntroCutscene3))
+ if (!animate(9, 5, 4, 0, kMessageLeft, kStringIntroCutscene3))
return;
_vm->paletteFadeOut();
@@ -412,27 +412,27 @@ void Intro::cutscene() {
_vm->_system->fillScreen(kColorBlack);
_vm->_menuBrightness = 255;
_vm->paletteBrightness();
- if (!animate(9,0,0,0,kMessageNormal,kStringIntroCutscene25))
+ if (!animate(9, 0, 0, 0, kMessageNormal, kStringIntroCutscene25))
return;
_vm->_menuBrightness = 5;
_vm->paletteBrightness();
_vm->renderImage(31, 0);
_vm->paletteFadeIn();
- if (!animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene26))
+ if (!animate(31, 0, 0, 0, kMessageNormal, kStringIntroCutscene26))
return;
- if (!animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene27))
+ if (!animate(31, 0, 0, 0, kMessageNormal, kStringIntroCutscene27))
return;
- if (!animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene28))
+ if (!animate(31, 0, 0, 0, kMessageNormal, kStringIntroCutscene28))
return;
- if (!animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene29))
+ if (!animate(31, 0, 0, 0, kMessageNormal, kStringIntroCutscene29))
return;
exitOnEscape(54);
- if (!animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene30))
+ if (!animate(31, 0, 0, 0, kMessageNormal, kStringIntroCutscene30))
return;
- if (!animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene31))
+ if (!animate(31, 0, 0, 0, kMessageNormal, kStringIntroCutscene31))
return;
- if (!animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene32))
+ if (!animate(31, 0, 0, 0, kMessageNormal, kStringIntroCutscene32))
return;
_vm->_brightness = 0;
@@ -450,29 +450,29 @@ void Intro::cutscene() {
while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
;
exitOnEscape(30);
- if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene33))
+ if (!animate(22, 0, 0, 0, kMessageNormal, kStringIntroCutscene33))
return;
exitOnEscape(18);
- if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene34))
+ if (!animate(22, 0, 0, 0, kMessageNormal, kStringIntroCutscene34))
return;
- if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene35))
+ if (!animate(22, 0, 0, 0, kMessageNormal, kStringIntroCutscene35))
return;
- if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene36))
+ if (!animate(22, 0, 0, 0, kMessageNormal, kStringIntroCutscene36))
return;
- if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene37))
+ if (!animate(22, 0, 0, 0, kMessageNormal, kStringIntroCutscene37))
return;
exitOnEscape(18);
- if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene38))
+ if (!animate(22, 0, 0, 0, kMessageNormal, kStringIntroCutscene38))
return;
- if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene39))
+ if (!animate(22, 0, 0, 0, kMessageNormal, kStringIntroCutscene39))
return;
exitOnEscape(18);
- if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene40))
+ if (!animate(22, 0, 0, 0, kMessageNormal, kStringIntroCutscene40))
return;
- if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene41))
+ if (!animate(22, 0, 0, 0, kMessageNormal, kStringIntroCutscene41))
return;
exitOnEscape(36);
- animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene42);
+ animate(22, 0, 0, 0, kMessageNormal, kStringIntroCutscene42);
_vm->removeMessage();
#undef exitOnEscape
Commit: f23baf902f57762ae43cab17ff3ace582e23a99d
https://github.com/scummvm/scummvm/commit/f23baf902f57762ae43cab17ff3ace582e23a99d
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:34Z
Commit Message:
SUPERNOVA: Extract strings for Ship Hall and Ship Sleep Cabin
Changed paths:
devtools/create_supernova/gametext.h
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index 110506c..006a1a2 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -423,27 +423,27 @@ const char *gameText[] = {
"Erst mal den Lichtschalter finden.", // kStringIntroCutscene40
"Hmm, gar nicht so einfach|bei Schwerelosigkeit.", // kStringIntroCutscene41
"Ah, hier ist er.", // kStringIntroCutscene42
- "", //
- "", //
+ "In der K\201che warst du schon|oft genug, im Moment hast|du keinen Appetit.", // kStringShipHall1
+ "Flugziel erreicht", // kStringShipSleepCabin1
// 325
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Energie ersch\224pft", // kStringShipSleepCabin2
+ "Tiefschlafprozess abgebrochen", // kStringShipSleepCabin3
+ "Schlafdauer in Tagen:", // kStringShipSleepCabin4
+ "Bitte legen Sie sich in die angezeigte Schlafkammer.", // kStringShipSleepCabin5
+ "Bitte Passwort eingeben:", // kStringShipSleepCabin6
// 330
- "", //
- "", //
- "", //
- "", //
- "", //
+ "Schlafdauer in Tagen:", // kStringShipSleepCabin7
+ "Bitte legen Sie sich in die angezeigte Schlafkammer.", // kStringShipSleepCabin8
+ "Falsches Passwort", // kStringShipSleepCabin9
+ "Es w\201rde wenig bringen,|sich in eine Schlafkammer zu legen,|die nicht eingeschaltet ist.", // kStringShipSleepCabin10
+ "Dazu mu\341t du erst den Raumanzug ausziehen.", // kStringShipSleepCabin11
// 335
- "", //
- "", //
- "", //
- "", //
- "", //
-
+ "Was war das?", // kStringShipSleepCabin12
+ "Achtung", // kStringShipSleepCabin13
+ "Du wachst mit brummendem Sch\204del auf|und merkst, daß du nur getr\204umt hast.", // kStringShipSleepCabin14
+ "Beim Aufprall des Raumschiffs|mu\341t du mit dem Kopf aufgeschlagen|und bewu\341tlos geworden sein.", // kStringShipSleepCabin15
+ "Was steht dir jetzt wohl wirklich bevor?", // kStringShipSleepCabin16
+ // 340
NULL
};
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 93755fe..1e2cdcf 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -474,7 +474,11 @@ enum StringID {
kStringIntroCutscene25, kStringIntroCutscene26, kStringIntroCutscene27, kStringIntroCutscene28, kStringIntroCutscene29,
kStringIntroCutscene30, kStringIntroCutscene31, kStringIntroCutscene32, kStringIntroCutscene33, kStringIntroCutscene34,
kStringIntroCutscene35, kStringIntroCutscene36, kStringIntroCutscene37, kStringIntroCutscene38, kStringIntroCutscene39,
- kStringIntroCutscene40, kStringIntroCutscene41, kStringIntroCutscene42
+ kStringIntroCutscene40, kStringIntroCutscene41, kStringIntroCutscene42, kStringShipHall1, kStringShipSleepCabin1,
+ //325
+ kStringShipSleepCabin2, kStringShipSleepCabin3, kStringShipSleepCabin4, kStringShipSleepCabin5, kStringShipSleepCabin6,
+ kStringShipSleepCabin7, kStringShipSleepCabin8, kStringShipSleepCabin9, kStringShipSleepCabin10, kStringShipSleepCabin11,
+ kStringShipSleepCabin12, kStringShipSleepCabin13, kStringShipSleepCabin14, kStringShipSleepCabin15, kStringShipSleepCabin16
};
static StringID guiCommands[] = {
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 3bfe23a..dc3035c 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -516,7 +516,7 @@ bool ShipCorridor::interact(Action verb, Object &obj1, Object &obj2) {
bool ShipHall::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_OPEN) && (obj1._id == KITCHEN_HATCH)) {
- _vm->renderMessage("In der K\201che warst du schon|oft genug, im Moment hast|du keinen Appetit.");
+ _vm->renderMessage(_vm->getGameString(kStringShipHall1));
} else if ((verb == ACTION_USE) && Object::combine(obj1,obj2,KEYCARD2,SLEEP_SLOT)) {
if (_objectState[2].hasProperty(OPENED)) {
_objectState[2].disableProperty(OPENED);
@@ -555,24 +555,23 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
g_system->fillScreen(kColorDarkBlue);
if (_gm->_state._arrivalDaysLeft == 0) {
// Destination reached
- _vm->renderText("Flugziel erreicht", 60, 95, kColorWhite99);
+ _vm->renderText(kStringShipSleepCabin1, 60, 95, kColorWhite99);
_gm->getInput();
} else if (_gm->_state._powerOff) {
// Energy depleted
- _vm->renderText("Energie ersch\224pft", 60, 95, kColorWhite99);
+ _vm->renderText(kStringShipSleepCabin2, 60, 95, kColorWhite99);
// Artificial coma interrupted
- _vm->renderText("Tiefschlafprozess abgebrochen", 60, 115, kColorWhite99);
+ _vm->renderText(kStringShipSleepCabin3, 60, 115, kColorWhite99);
_gm->getInput();
} else if (isSectionVisible(5)) {
// Sleep duration in days
- _vm->renderText("Schlafdauer in Tagen:", 30, 85, kColorWhite99);
+ _vm->renderText(kStringShipSleepCabin4, 30, 85, kColorWhite99);
_vm->renderText(Common::String::format("%d",_gm->_state._timeSleep).c_str(),
150, 85, kColorWhite99);
- _vm->renderText("Bitte legen Sie sich in die angezeigte Schlafkammer.",
- 30, 105, kColorWhite99);
+ _vm->renderText(kStringShipSleepCabin5, 30, 105, kColorWhite99);
_gm->getInput();
} else {
- _vm->renderText("Bitte Passwort eingeben:", 100, 85, kColorWhite99);
+ _vm->renderText(kStringShipSleepCabin6, 100, 85, kColorWhite99);
_gm->edit(input, 100, 105, 30);
input.toUppercase();
@@ -580,7 +579,7 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
if (input == _vm->getGameString(kStringComputerPassword)) {
_gm->great(6);
g_system->fillScreen(kColorDarkBlue);
- _vm->renderText("Schlafdauer in Tagen:", 30, 85, kColorWhite99);
+ _vm->renderText(kStringShipSleepCabin7, 30, 85, kColorWhite99);
uint daysSleep = 0;
do {
input.clear();
@@ -600,13 +599,13 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
}
if (daysSleep != 0) {
_gm->_state._timeSleep = daysSleep;
- _vm->renderText("Bitte legen Sie sich in die angezeigte Schlafkammer.", 30, 105, kColorWhite99);
+ _vm->renderText(kStringShipSleepCabin8, 30, 105, kColorWhite99);
_gm->wait2(18);
setSectionVisible(5, true);
}
} while (daysSleep == 0);
} else {
- _vm->renderText("Falsches Passwort", 100, 125, kColorLightRed);
+ _vm->renderText(kStringShipSleepCabin9, 100, 125, kColorLightRed);
_gm->wait2(18);
}
}
@@ -618,9 +617,9 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
((obj1._id == CABINS) || (obj1._id == CABIN))) {
room = _gm->_rooms[AIRLOCK];
if (!(obj1._id == CABIN) || !isSectionVisible(5)) {
- _vm->renderMessage("Es w\201rde wenig bringen,|sich in eine Schlafkammer zu legen,|die nicht eingeschaltet ist.");
+ _vm->renderMessage(kStringShipSleepCabin10);
} else if (room->getObject(5)->hasProperty(WORN)) {
- _vm->renderMessage("Dazu mu\341t du erst den Raumanzug ausziehen.");
+ _vm->renderMessage(kStringShipSleepCabin11);
} else {
_vm->paletteFadeOut();
_gm->drawImage(_gm->invertSection(5));
@@ -693,7 +692,7 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
_vm->playSound(kAudioCrash);
_gm->screenShake();
_gm->wait2(18);
- _vm->renderMessage("Was war das?");
+ _vm->renderMessage(kStringShipSleepCabin12);
}
}
} else {
@@ -720,7 +719,7 @@ void ShipSleepCabin::animation() {
_color = kColorLightRed;
}
- _vm->renderText("Achtung", 60, 75, _color);
+ _vm->renderText(kStringShipSleepCabin13, 60, 75, _color);
}
} else if (isSectionVisible(5) && _gm->_guiEnabled) {
if (isSectionVisible(4))
@@ -733,13 +732,13 @@ void ShipSleepCabin::animation() {
}
void ShipSleepCabin::onEntrance() {
if (_gm->_state._dream && (_gm->_rooms[CAVE]->getObject(1)->_exitRoom == MEETUP3)) {
- _vm->renderMessage("Du wachst mit brummendem Sch\204del auf|und merkst, daß du nur getr\204umt hast.");
+ _vm->renderMessage(kStringShipSleepCabin14);
_gm->mouseWait(_gm->_timer1);
_vm->removeMessage();
- _vm->renderMessage("Beim Aufprall des Raumschiffs|mu\341t du mit dem Kopf aufgeschlagen|und bewu\341tlos geworden sein.");
+ _vm->renderMessage(kStringShipSleepCabin15);
_gm->mouseWait(_gm->_timer1);
_vm->removeMessage();
- _vm->renderMessage("Was steht dir jetzt wohl wirklich bevor?");
+ _vm->renderMessage(kStringShipSleepCabin16);
_gm->_state._dream = false;
}
setRoomSeen(true);
Commit: 572f205e679325e9dbbf2f6589588287ccf2d215
https://github.com/scummvm/scummvm/commit/572f205e679325e9dbbf2f6589588287ccf2d215
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:34Z
Commit Message:
SUPERNOVA: Extract the strings from ShipCockpit
Changed paths:
devtools/create_supernova/gametext.h
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index 006a1a2..2c30a79 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -444,6 +444,60 @@ const char *gameText[] = {
"Beim Aufprall des Raumschiffs|mu\341t du mit dem Kopf aufgeschlagen|und bewu\341tlos geworden sein.", // kStringShipSleepCabin15
"Was steht dir jetzt wohl wirklich bevor?", // kStringShipSleepCabin16
// 340
+ "Geschwindigkeit: ",
+ "8000 hpm",
+ "0 hpm",
+ "Ziel: Arsano 3",
+ "Entfernung: ",
+ //345
+ " Lichtjahre",
+ "Dauer der Reise bei momentaner Geschwindigkeit:",
+ " Tage",
+ "Vergi\341 nicht, du bist nur der|Schiffskoch und hast keine Ahnung,|wie man ein Raumschiff fliegt.",
+ "Achtung: Triebwerke funktionsunf\204hig",
+ //350
+ "Energievorrat ersch\224pft",
+ "Notstromversorgung aktiv",
+ "Was?! Keiner im Cockpit!|Die sind wohl verr\201ckt!",
+ "",
+ "",
+ //355
+ "",
+ "",
+ "",
+ "",
+ "",
+ //360
+ "",
+ "",
+ "",
+ "",
+ "",
+ //365
+ "",
+ "",
+ "",
+ "",
+ "",
+ //370
+ "",
+ "",
+ "",
+ "",
+ "",
+ //375
+ "",
+ "",
+ "",
+ "",
+ "",
+ //380
+ "",
+ "",
+ "",
+ "",
+ "",
+ //385
NULL
};
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 1e2cdcf..20953c0 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -478,7 +478,11 @@ enum StringID {
//325
kStringShipSleepCabin2, kStringShipSleepCabin3, kStringShipSleepCabin4, kStringShipSleepCabin5, kStringShipSleepCabin6,
kStringShipSleepCabin7, kStringShipSleepCabin8, kStringShipSleepCabin9, kStringShipSleepCabin10, kStringShipSleepCabin11,
- kStringShipSleepCabin12, kStringShipSleepCabin13, kStringShipSleepCabin14, kStringShipSleepCabin15, kStringShipSleepCabin16
+ kStringShipSleepCabin12, kStringShipSleepCabin13, kStringShipSleepCabin14, kStringShipSleepCabin15, kStringShipSleepCabin16,
+ kStringShipCockpit1, kStringShipCockpit2, kStringShipCockpit3, kStringShipCockpit4, kStringShipCockpit5,
+ kStringShipCockpit6, kStringShipCockpit7, kStringShipCockpit8, kStringShipCockpit9, kStringShipCockpit10,
+ // 350
+ kStringShipCockpit11, kStringShipCockpit12, kStringShipCockpit13
};
static StringID guiCommands[] = {
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index dc3035c..c3cd0b9 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -751,29 +751,29 @@ bool ShipCockpit::interact(Action verb, Object &obj1, Object &obj2) {
char c[2] = {0, 0};
_gm->_guiEnabled = false;
_vm->renderBox(0, 0, 320, 200, kColorBlack);
- _vm->renderText("Geschwindigkeit: ", 50, 50, kColorLightYellow);
+ _vm->renderText(kStringShipCockpit1, 50, 50, kColorLightYellow);
if (_gm->_state._arrivalDaysLeft)
- _vm->renderText("8000 hpm");
+ _vm->renderText(kStringShipCockpit2);
else
- _vm->renderText("0 hpm");
- _vm->renderText("Ziel: Arsano 3", 50, 70, kColorLightYellow);
- _vm->renderText("Entfernung: ", 50, 90, kColorLightYellow);
+ _vm->renderText(kStringShipCockpit3);
+ _vm->renderText(kStringShipCockpit4, 50, 70, kColorLightYellow);
+ _vm->renderText(kStringShipCockpit5, 50, 90, kColorLightYellow);
_vm->renderText(Common::String::format("%d", _gm->_state._arrivalDaysLeft / 400).c_str());
_vm->renderText(",");
c[0] = (_gm->_state._arrivalDaysLeft / 40) % 10 + '0';
_vm->renderText(c);
c[0] = (_gm->_state._arrivalDaysLeft / 4) % 10 + '0';
_vm->renderText(c);
- _vm->renderText(" Lichtjahre");
- _vm->renderText("Dauer der Reise bei momentaner Geschwindigkeit:", 50, 110, kColorLightYellow);
+ _vm->renderText(kStringShipCockpit6);
+ _vm->renderText(kStringShipCockpit7, 50, 110, kColorLightYellow);
_vm->renderText(Common::String::format("%d", _gm->_state._arrivalDaysLeft).c_str(),
50, 120, kColorLightYellow);
- _vm->renderText(" Tage");
+ _vm->renderText(kStringShipCockpit8);
_gm->getInput();
_gm->_guiEnabled = true;
} else if ((verb == ACTION_USE) && (obj1._id == INSTRUMENTS))
- _vm->renderMessage("Vergi\341 nicht, du bist nur der|Schiffskoch und hast keine Ahnung,|wie man ein Raumschiff fliegt.");
+ _vm->renderMessage(kStringShipCockpit9);
else
return false;
@@ -788,7 +788,7 @@ void ShipCockpit::animation() {
_color = kColorLightYellow;
_gm->setAnimationTimer(10);
}
- _vm->renderText("Achtung: Triebwerke funktionsunf\204hig", 50, 145, _color);
+ _vm->renderText(kStringShipCockpit10, 50, 145, _color);
} else {
if (isSectionVisible(21)) {
_gm->drawImage(_gm->invertSection(21));
@@ -800,8 +800,8 @@ void ShipCockpit::animation() {
}
if (_gm->_state._powerOff) {
if (!_gm->_guiEnabled) {
- _vm->renderText("Energievorrat ersch\224pft", 97, 165, _color);
- _vm->renderText("Notstromversorgung aktiv", 97, 175, _color);
+ _vm->renderText(kStringShipCockpit11, 97, 165, _color);
+ _vm->renderText(kStringShipCockpit12, 97, 175, _color);
} else {
if (isSectionVisible(21))
_gm->drawImage(22);
@@ -813,7 +813,7 @@ void ShipCockpit::animation() {
void ShipCockpit::onEntrance() {
if (!hasSeen())
- _vm->renderMessage("Was?! Keiner im Cockpit!|Die sind wohl verr\201ckt!");
+ _vm->renderMessage(kStringShipCockpit13);
setRoomSeen(true);
}
Commit: ae65de93fa552f8a44641eff321fe4993f3bbb7a
https://github.com/scummvm/scummvm/commit/ae65de93fa552f8a44641eff321fe4993f3bbb7a
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:34Z
Commit Message:
SUPERNOVA: Fix non-ASCII character in game strings
Changed paths:
devtools/create_supernova/gametext.h
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index 2c30a79..79f1d0e 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -440,7 +440,7 @@ const char *gameText[] = {
// 335
"Was war das?", // kStringShipSleepCabin12
"Achtung", // kStringShipSleepCabin13
- "Du wachst mit brummendem Sch\204del auf|und merkst, daß du nur getr\204umt hast.", // kStringShipSleepCabin14
+ "Du wachst mit brummendem Sch\204del auf|und merkst, da\341 du nur getr\204umt hast.", // kStringShipSleepCabin14
"Beim Aufprall des Raumschiffs|mu\341t du mit dem Kopf aufgeschlagen|und bewu\341tlos geworden sein.", // kStringShipSleepCabin15
"Was steht dir jetzt wohl wirklich bevor?", // kStringShipSleepCabin16
// 340
Commit: c290e144dba1768547a17e7b3f5af044261617bb
https://github.com/scummvm/scummvm/commit/c290e144dba1768547a17e7b3f5af044261617bb
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:34Z
Commit Message:
SUPERNOVA: Simplify a bit the code
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index c3cd0b9..b6f4107 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -516,7 +516,7 @@ bool ShipCorridor::interact(Action verb, Object &obj1, Object &obj2) {
bool ShipHall::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_OPEN) && (obj1._id == KITCHEN_HATCH)) {
- _vm->renderMessage(_vm->getGameString(kStringShipHall1));
+ _vm->renderMessage(kStringShipHall1);
} else if ((verb == ACTION_USE) && Object::combine(obj1,obj2,KEYCARD2,SLEEP_SLOT)) {
if (_objectState[2].hasProperty(OPENED)) {
_objectState[2].disableProperty(OPENED);
Commit: a141438e60ba0ca966cbb9b453d7444060a24cb4
https://github.com/scummvm/scummvm/commit/a141438e60ba0ca966cbb9b453d7444060a24cb4
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:34Z
Commit Message:
SUPERNOVA: Fix check of dialog status in ArsanoRoger onEntrance
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index b6f4107..ca1cc7f 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -1924,7 +1924,7 @@ void ArsanoRemaining::animation() {
void ArsanoRoger::onEntrance() {
// This is not a normal shown variable, it's a dialog
- if (_shown[kMaxSection - 2] = 0) {
+ if (_shown[kMaxSection - 2] == 0) {
_gm->say("Darf ich hier Platz nehmen?");
_gm->reply("Klar!", 2, 2 + 128);
_shown[kMaxSection - 2] = 1;
Commit: cb12a88fc5f042edf8010c146bb2d2d76722cfb5
https://github.com/scummvm/scummvm/commit/cb12a88fc5f042edf8010c146bb2d2d76722cfb5
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:35Z
Commit Message:
SUPERNOVA: Extract strings for ShibCabinL3 & R3 and for ShipAirlock
Changed paths:
devtools/create_supernova/gametext.h
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index 79f1d0e..bc6a2bd 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -459,17 +459,17 @@ const char *gameText[] = {
"Energievorrat ersch\224pft",
"Notstromversorgung aktiv",
"Was?! Keiner im Cockpit!|Die sind wohl verr\201ckt!",
- "",
- "",
+ "Du hast die Platte schon aufgelegt.",
+ "Es ist doch gar keine Platte aufgelegt.",
//355
- "",
- "",
- "",
- "",
- "",
+ "Die Platte scheint einen Sprung zu haben.",
+ "Schneid doch besser ein|l\204ngeres St\201ck Kabel ab!",
+ "Das ist befestigt.",
+ "Zu niedriger Luftdruck soll ungesund sein.",
+ "Er zeigt Null an.",
//360
- "",
- "",
+ "Er zeigt Normaldruck an.",
+ "Komisch, es ist nur|noch ein Raumanzug da.",
"",
"",
"",
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 20953c0..0e3a068 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -482,7 +482,9 @@ enum StringID {
kStringShipCockpit1, kStringShipCockpit2, kStringShipCockpit3, kStringShipCockpit4, kStringShipCockpit5,
kStringShipCockpit6, kStringShipCockpit7, kStringShipCockpit8, kStringShipCockpit9, kStringShipCockpit10,
// 350
- kStringShipCockpit11, kStringShipCockpit12, kStringShipCockpit13
+ kStringShipCockpit11, kStringShipCockpit12, kStringShipCockpit13, kStringShipCabinL3_1, kStringShipCabinL3_2,
+ kStringShipCabinL3_3, kStringShipCabinL3_4, kStringShipCabinL3_5, kStringShipAirlock1, kStringShipAirlock2,
+ kStringShipAirlock3, kStringShipAirlock4
};
static StringID guiCommands[] = {
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index ca1cc7f..d6d36f3 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -870,7 +870,7 @@ bool ShipCabinL3::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_USE) && Object::combine(obj1, obj2, RECORD, TURNTABLE)) {
if (!_gm->_guiEnabled || isSectionVisible(15))
- _vm->renderMessage("Du hast die Platte schon aufgelegt.");
+ _vm->renderMessage(kStringShipCabinL3_1);
else {
if (!getObject(4)->hasProperty(CARRIED))
_gm->drawImage(_gm->invertSection(8));
@@ -881,7 +881,7 @@ bool ShipCabinL3::interact(Action verb, Object &obj1, Object &obj2) {
}
} else if ((verb == ACTION_PRESS) && (obj1._id == TURNTABLE_BUTTON)) {
if (!isSectionVisible(15)) {
- _vm->renderMessage("Es ist doch gar keine Platte aufgelegt.");
+ _vm->renderMessage(kStringShipCabinL3_2);
} else if (!isSectionVisible(10) && !isSectionVisible(11) && isSectionVisible(12)) {
_gm->drawImage(14);
setSectionVisible(15, false);
@@ -902,7 +902,7 @@ bool ShipCabinL3::interact(Action verb, Object &obj1, Object &obj2) {
_gm->drawImage(15);
setSectionVisible(14, false);
setSectionVisible(13, false);
- _vm->renderMessage("Die Platte scheint einen Sprung zu haben.");
+ _vm->renderMessage(kStringShipCabinL3_3);
} else if ((verb == ACTION_TAKE) && (obj1._id == RECORD) && (obj1._click != 15)) {
_gm->drawImage(9);
setSectionVisible(13, false);
@@ -919,7 +919,7 @@ bool ShipCabinL3::interact(Action verb, Object &obj1, Object &obj2) {
setSectionVisible(10, false);
getObject(10)->_click = 20;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, WIRE2))
- _vm->renderMessage("Schneid doch besser ein|l\204ngeres St\201ck Kabel ab!");
+ _vm->renderMessage(kStringShipCabinL3_4);
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, WIRE)) {
r = _gm->_rooms[AIRLOCK];
if (!isSectionVisible(10) && !r->getObject(5)->hasProperty(WORN)) {
@@ -939,7 +939,7 @@ bool ShipCabinL3::interact(Action verb, Object &obj1, Object &obj2) {
getObject(9)->_click = 255;
getObject(10)->_click = 255;
} else {
- _vm->renderMessage("Das ist befestigt.");
+ _vm->renderMessage(kStringShipCabinL3_5);
}
} else {
return false;
@@ -1096,7 +1096,7 @@ bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) {
if (!r->getObject(4)->hasProperty(WORN) ||
!r->getObject(5)->hasProperty(WORN) ||
!r->getObject(6)->hasProperty(WORN)) {
- _gm->death("Zu niedriger Luftdruck soll ungesund sein.");
+ _gm->dead(kStringShipAirlock1);
return true;
}
}
@@ -1104,9 +1104,9 @@ bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) {
}
} else if ((verb == ACTION_LOOK) && (obj1._id == MANOMETER)) {
if (getObject(1)->hasProperty(OPENED))
- _vm->renderMessage("Er zeigt Null an.");
+ _vm->renderMessage(kStringShipAirlock2);
else
- _vm->renderMessage("Er zeigt Normaldruck an.");
+ _vm->renderMessage(kStringShipAirlock3);
} else
return false;
@@ -1115,7 +1115,7 @@ bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) {
void ShipAirlock::onEntrance() {
if (!hasSeen())
- _vm->renderMessage("Komisch, es ist nur|noch ein Raumanzug da.");
+ _vm->renderMessage(kStringShipAirlock4);
setRoomSeen(true);
}
@@ -2508,7 +2508,7 @@ bool AxacussCell::interact(Action verb, Object &obj1, Object &obj2) {
// TODO: wait till sound is played
_vm->playSound(kAudioGunShot);
_vm->playSound(kAudioGunShot);
- _gm->death("Bei deinem Fluchtversuch hat|dich der Roboter erschossen.");
+ _gm->dead("Bei deinem Fluchtversuch hat|dich der Roboter erschossen.");
} else if ((verb == ACTION_USE) && (obj1._id == TRAY))
_vm->renderMessage("Du i\341t etwas, aber|es schmeckt scheu\341lich.");
else if ((verb == ACTION_TAKE) && (obj1._id == MAGNET)) {
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index a817f02..2bbcb0a 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1035,7 +1035,7 @@ void GameManager::screenShake() {
void GameManager::shock() {
_vm->playSound(kAudioShock);
- death("Du h\204ttest besser vorher|den Stecker rausgezogen.");
+ dead("Du h\204ttest besser vorher|den Stecker rausgezogen.");
}
void GameManager::showMenu() {
@@ -1159,7 +1159,7 @@ void GameManager::shot(int a, int b) {
if (b)
drawImage(b);
- death("Der Axacussaner hat dich erwischt.");
+ dead("Der Axacussaner hat dich erwischt.");
}
void GameManager::takeMoney(int amount) {
@@ -1221,7 +1221,32 @@ void GameManager::closeLocker(const Room *room, Object *obj, Object *lock, int s
}
}
-void GameManager::death(const char *message) {
+void GameManager::dead(StringID messageId) {
+ _vm->paletteFadeOut();
+ _guiEnabled = false;
+ _vm->renderImage(11, 0);
+ _vm->renderMessage(messageId);
+ _vm->playSound(kAudioDeath);
+ _vm->paletteFadeIn();
+ getInput();
+ _vm->paletteFadeOut();
+ _vm->removeMessage();
+
+ // TODO: Load screen
+ destroyRooms();
+ initRooms();
+ initState();
+ initGui();
+ _inventory.clear();
+ changeRoom(CABIN_R3);
+ g_system->fillScreen(kColorBlack);
+ _vm->paletteFadeIn();
+
+ _guiEnabled = true;
+}
+
+// TODO: Remove this function when all the texts are properly extracted
+void GameManager::dead(const char *message) {
_vm->paletteFadeOut();
_guiEnabled = false;
_vm->renderImage(11, 0);
@@ -1480,7 +1505,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
} else {
if (obj1.hasProperty(WORN)) {
if (airless()) {
- death("Den Helm h\204ttest du|besser angelassen!");
+ dead("Den Helm h\204ttest du|besser angelassen!");
}
obj1.disableProperty(WORN);
_vm->renderMessage("Du ziehst den Helm ab.");
@@ -1507,7 +1532,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
} else {
if (obj1.hasProperty(WORN)) {
if (airless()) {
- death("Den Versorgungsteil h\204ttest du|besser nicht abgenommen!");
+ dead("Den Versorgungsteil h\204ttest du|besser nicht abgenommen!");
}
obj1.disableProperty(WORN);
_vm->renderMessage("Du nimmst den Versorgungsteil ab.");
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index bfadd82..c4d1cf4 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -178,7 +178,8 @@ public:
void handleInput();
void handleTime();
void setAnimationTimer(int ticks);
- void death(const char *message);
+ void dead(const char *message);
+ void dead(StringID messageId);
int dialog(int num, byte *rowLength[6], const char **text[6], int number);
void sentence(int number, bool brightness);
void removeSentence(int sentence, int number);
Commit: 38fbda91895ae41c1d45a0d0a25b0d1c21def21f
https://github.com/scummvm/scummvm/commit/38fbda91895ae41c1d45a0d0a25b0d1c21def21f
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:35Z
Commit Message:
SUPERNOVA: Extract strings used in ShipHold and operations related to the cable
Changed paths:
devtools/create_supernova/gametext.h
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index bc6a2bd..5c5ecc0 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -470,30 +470,30 @@ const char *gameText[] = {
//360
"Er zeigt Normaldruck an.",
"Komisch, es ist nur|noch ein Raumanzug da.",
- "",
- "",
- "",
+ "Du mu\341t erst hingehen.",
+ "Das Kabel ist im Weg.",
+ "Das Kabel ist schon ganz|richtig an dieser Stelle.",
//365
- "",
- "",
- "",
- "",
- "",
+ "Womit denn?",
+ "Die Leitung ist zu kurz.",
+ "Was ist denn das f\201r ein Chaos?|Und au\341erdem fehlt das Notraumschiff!|Jetzt wird mir einiges klar.|Die anderen sind gefl\201chtet,|und ich habe es verpennt.",
+ "Es ist nicht spitz genug.",
+ "Du wirst aus den Anzeigen nicht schlau.",
//370
- "",
- "",
- "",
- "",
- "",
+ "La\341 lieber die Finger davon!",
+ "An dem Kabel ist doch gar kein Stecker.",
+ "Du solltest die Luke vielleicht erst \224ffnen.",
+ "Das Seil ist im Weg.",
+ "Das ist geschlossen.",
//375
- "",
- "",
- "",
- "",
- "",
+ "Das geht nicht.|Die Luke ist mindestens|5 Meter \201ber dem Boden.",
+ "Was n\201tzt dir der Anschlu\341|ohne eine Stromquelle?!",
+ "Die Spannung ist auf Null abgesunken.",
+ "Es zeigt volle Spannung an.",
+ "Du mu\341t die Luke erst \224ffnen.",
//380
- "",
- "",
+ "Das Seil ist hier schon ganz richtig.",
+ "Das Kabel ist zu kurz.",
"",
"",
"",
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 0e3a068..ba9eff3 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -484,7 +484,12 @@ enum StringID {
// 350
kStringShipCockpit11, kStringShipCockpit12, kStringShipCockpit13, kStringShipCabinL3_1, kStringShipCabinL3_2,
kStringShipCabinL3_3, kStringShipCabinL3_4, kStringShipCabinL3_5, kStringShipAirlock1, kStringShipAirlock2,
- kStringShipAirlock3, kStringShipAirlock4
+ kStringShipAirlock3, kStringShipAirlock4, kStringShipHold1, kStringCable1, kStringCable2,
+ kStringCable3, kStringCable4, kStringShipHold2, kStringShipHold3, kStringShipHold4,
+ kStringShipHold5, kStringShipHold6, kStringShipHold7, kStringShipHold8, kStringShipHold9,
+ // 375
+ kStringShipHold10, kStringShipHold11, kStringShipHold12, kStringShipHold13, kStringShipHold14,
+ kStringShipHold15, kStringShipHold16
};
static StringID guiCommands[] = {
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index d6d36f3..77d6efa 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -1129,13 +1129,13 @@ bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
_gm->takeObject(*getObject(2));
} else if (((verb == ACTION_OPEN) || (verb == ACTION_CLOSE)) &&
(obj1._id == OUTERHATCH_TOP)) {
- _vm->renderMessage("Du mu\341t erst hingehen.");
+ _vm->renderMessage(kStringShipHold1);
} else if ((verb == ACTION_CLOSE) && (obj1._id == LANDINGMOD_HATCH) &&
(isSectionVisible(4) || isSectionVisible(6)))
- _vm->renderMessage("Das Kabel ist im Weg.");
+ _vm->renderMessage(kStringCable1);
else if (((verb == ACTION_TAKE) && (obj1._id == HOLD_WIRE)) ||
((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, LANDINGMOD_HATCH)))
- _vm->renderMessage("Das Kabel ist schon ganz|richtig an dieser Stelle.");
+ _vm->renderMessage(kStringCable2);
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, HOLD_WIRE)) {
getObject(0)->_name = kStringWireAndClip;
_gm->_inventory.remove(*getObject(2));
@@ -1144,7 +1144,7 @@ bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage("Ok.");
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, SPOOL)) {
if (!_gm->_state._terminalStripConnected)
- _vm->renderMessage("Womit denn?");
+ _vm->renderMessage(kStringCable3);
else {
_gm->drawImage(5);
getObject(0)->_name = kStringWireAndPlug2;
@@ -1164,7 +1164,7 @@ bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
setSectionVisible(4, false);
getObject(0)->_click = 11;
} else {
- _vm->renderMessage("Die Leitung ist zu kurz.");
+ _vm->renderMessage(kStringCable4);
}
} else {
return false;
@@ -1175,7 +1175,7 @@ bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
void ShipHold::onEntrance() {
if (!hasSeen())
- _vm->renderMessage("Was ist denn das f\201r ein Chaos?|Und au\341erdem fehlt das Notraumschiff!|Jetzt wird mir einiges klar.|Die anderen sind gefl\201chtet,|und ich habe es verpennt.");
+ _vm->renderMessage(kStringShipHold2);
setRoomSeen(true);
_gm->_rooms[COCKPIT]->setRoomSeen(true);
}
@@ -1218,12 +1218,12 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
}
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, LANDINGMOD_BUTTON))
- _vm->renderMessage("Es ist nicht spitz genug.");
+ _vm->renderMessage(kStringShipHold3);
else if ((verb == ACTION_LOOK) && (obj1._id == LANDINGMOD_MONITOR) &&
isSectionVisible(7))
- _vm->renderMessage("Du wirst aus den Anzeigen nicht schlau.");
+ _vm->renderMessage(kStringShipHold4);
else if ((verb == ACTION_USE) && (obj1._id == KEYBOARD))
- _vm->renderMessage("La\341 lieber die Finger davon!");
+ _vm->renderMessage(kStringShipHold5);
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, WIRE, LANDINGMOD_SOCKET)) {
r = _gm->_rooms[CABIN_L3];
_gm->_inventory.remove(*r->getObject(8));
@@ -1238,7 +1238,7 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
_gm->drawImage(11);
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SPOOL, LANDINGMOD_SOCKET))
- _vm->renderMessage("An dem Kabel ist doch gar kein Stecker.");
+ _vm->renderMessage(kStringShipHold8);
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, TERMINALSTRIP)) {
_gm->drawImage(11);
getObject(4)->_name = kStringWireAndClip;
@@ -1248,7 +1248,7 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_state._terminalStripWire = true;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, SPOOL)) {
if (!_gm->_state._terminalStripConnected)
- _vm->renderMessage("Womit denn?");
+ _vm->renderMessage(kStringCable3);
else {
_gm->drawImage(5);
getObject(4)->_name = kStringWireAndPlug2;
@@ -1272,14 +1272,14 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
_gm->drawImage(6);
getObject(4)->_click = 7;
} else {
- _vm->renderMessage("Du solltest die Luke vielleicht erst \224ffnen.");
+ _vm->renderMessage(kStringShipHold6);
}
} else if ((verb == ACTION_CLOSE) && (obj1._id == LANDINGMOD_HATCH) &&
isSectionVisible(6)) {
- _vm->renderMessage("Das Kabel ist im Weg.");
+ _vm->renderMessage(kStringCable1);
} else if (((verb == ACTION_TAKE) || (verb == ACTION_PULL)) &&
(obj1._id == LANDINGMOD_WIRE)) {
- _vm->renderMessage("Das Kabel ist schon ganz|richtig an dieser Stelle.");
+ _vm->renderMessage(kStringCable2);
} else {
return false;
}
@@ -1307,7 +1307,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
if (!obj1.hasProperty(OPENED))
return false;
if (isSectionVisible(11) || isSectionVisible(12)) {
- _vm->renderMessage("Das Seil ist im Weg.");
+ _vm->renderMessage(kStringShipHold7);
} else {
_vm->playSound(kAudioDoorSound);
_gm->drawImage(_gm->invertSection(1));
@@ -1322,15 +1322,15 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_WALK) && (obj1._id == OUTERHATCH) &&
isSectionVisible(7)) {
if (!obj1.hasProperty(OPENED))
- _vm->renderMessage("Das ist geschlossen.");
+ _vm->renderMessage(kStringShipHold9);
else if (!isSectionVisible(11))
- _vm->renderMessage("Das geht nicht.|Die Luke ist mindestens|5 Meter \201ber dem Boden.");
+ _vm->renderMessage(kStringShipHold10);
else {
obj1._exitRoom = ROCKS;
return false;
}
} else if ((verb == ACTION_TAKE) && (obj1._id == GENERATOR_WIRE))
- _vm->renderMessage("Das Kabel ist schon ganz|richtig an dieser Stelle.");
+ _vm->renderMessage(kStringCable2);
else if ((verb == ACTION_PULL) && (obj1._id == SHORT_WIRE) &&
(obj1._click != 11)) {
_gm->drawImage(3);
@@ -1361,7 +1361,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
_vm->playSound(kAudioDoorOpen);
} else if ((verb == ACTION_CLOSE) && (obj1._id == TRAP)) {
if (isSectionVisible(9))
- _vm->renderMessage("Das Kabel ist im Weg.");
+ _vm->renderMessage(kStringCable1);
else {
setSectionVisible(3, false);
return false;
@@ -1395,12 +1395,12 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
(Object::combine(obj1, obj2, WIRE, CLIP) ||
Object::combine(obj1, obj2, SPOOL, CLIP)) &&
isSectionVisible(3)) {
- _vm->renderMessage("Was n\201tzt dir der Anschlu\341|ohne eine Stromquelle?!");
+ _vm->renderMessage(kStringShipHold11);
} else if ((verb == ACTION_LOOK) && (obj1._id == VOLTMETER)) {
if (_gm->_state._powerOff)
- _vm->renderMessage("Die Spannung ist auf Null abgesunken.");
+ _vm->renderMessage(kStringShipHold12);
else
- _vm->renderMessage("Es zeigt volle Spannung an.");
+ _vm->renderMessage(kStringShipHold13);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LADDER, ROPE)) {
_gm->drawImage(13);
r = _gm->_rooms[CABIN_R3];
@@ -1408,7 +1408,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
getObject(3)->_click = 18;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, OUTERHATCH, GENERATOR_ROPE)) {
if (!isSectionVisible(1))
- _vm->renderMessage("Du mu\341t die Luke erst \224ffnen.");
+ _vm->renderMessage(kStringShipHold14);
else {
_gm->drawImage(_gm->invertSection(13));
_gm->drawImage(1);
@@ -1424,10 +1424,10 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
getObject(3)->_click = 17;
}
} else if ((verb == ACTION_TAKE) && (obj1._id == GENERATOR_ROPE)) {
- _vm->renderMessage("Das Seil ist hier schon ganz richtig.");
+ _vm->renderMessage(kStringShipHold15);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, OUTERHATCH, GENERATOR_WIRE) &&
isSectionVisible(1)) {
- _vm->renderMessage("Das Kabel ist zu kurz.");
+ _vm->renderMessage(kStringShipHold16);
} else {
return false;
}
Commit: ed9d92407ec496922245b06c9b0372dc6e466f36
https://github.com/scummvm/scummvm/commit/ed9d92407ec496922245b06c9b0372dc6e466f36
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:35Z
Commit Message:
SUPERNOVA: Extract more dialog texts
Changed paths:
devtools/create_supernova/gametext.h
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
engines/supernova/rooms.h
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index 5c5ecc0..f385c76 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -444,60 +444,114 @@ const char *gameText[] = {
"Beim Aufprall des Raumschiffs|mu\341t du mit dem Kopf aufgeschlagen|und bewu\341tlos geworden sein.", // kStringShipSleepCabin15
"Was steht dir jetzt wohl wirklich bevor?", // kStringShipSleepCabin16
// 340
- "Geschwindigkeit: ",
- "8000 hpm",
- "0 hpm",
- "Ziel: Arsano 3",
- "Entfernung: ",
+ "Geschwindigkeit: ", // kStringShipCockpit1
+ "8000 hpm", // kStringShipCockpit2
+ "0 hpm", // kStringShipCockpit3
+ "Ziel: Arsano 3", // kStringShipCockpit4
+ "Entfernung: ", // kStringShipCockpit5
//345
- " Lichtjahre",
- "Dauer der Reise bei momentaner Geschwindigkeit:",
- " Tage",
- "Vergi\341 nicht, du bist nur der|Schiffskoch und hast keine Ahnung,|wie man ein Raumschiff fliegt.",
- "Achtung: Triebwerke funktionsunf\204hig",
+ " Lichtjahre", // kStringShipCockpit6
+ "Dauer der Reise bei momentaner Geschwindigkeit:", // kStringShipCockpit7
+ " Tage", // kStringShipCockpit8
+ "Vergi\341 nicht, du bist nur der|Schiffskoch und hast keine Ahnung,|wie man ein Raumschiff fliegt.", // kStringShipCockpit9
+ "Achtung: Triebwerke funktionsunf\204hig", // kStringShipCockpit10
//350
- "Energievorrat ersch\224pft",
- "Notstromversorgung aktiv",
- "Was?! Keiner im Cockpit!|Die sind wohl verr\201ckt!",
- "Du hast die Platte schon aufgelegt.",
- "Es ist doch gar keine Platte aufgelegt.",
+ "Energievorrat ersch\224pft", // kStringShipCockpit11
+ "Notstromversorgung aktiv", // kStringShipCockpit12
+ "Was?! Keiner im Cockpit!|Die sind wohl verr\201ckt!", // kStringShipCockpit13
+ "Du hast die Platte schon aufgelegt.", // kStringShipCabinL3_1
+ "Es ist doch gar keine Platte aufgelegt.", // kStringShipCabinL3_2
//355
- "Die Platte scheint einen Sprung zu haben.",
- "Schneid doch besser ein|l\204ngeres St\201ck Kabel ab!",
- "Das ist befestigt.",
- "Zu niedriger Luftdruck soll ungesund sein.",
- "Er zeigt Null an.",
+ "Die Platte scheint einen Sprung zu haben.", // kStringShipCabinL3_3
+ "Schneid doch besser ein|l\204ngeres St\201ck Kabel ab!", // kStringShipCabinL3_4
+ "Das ist befestigt.", // kStringShipCabinL3_5
+ "Zu niedriger Luftdruck soll ungesund sein.", // kStringShipAirlock1
+ "Er zeigt Null an.", // kStringShipAirlock2
//360
- "Er zeigt Normaldruck an.",
- "Komisch, es ist nur|noch ein Raumanzug da.",
- "Du mu\341t erst hingehen.",
- "Das Kabel ist im Weg.",
- "Das Kabel ist schon ganz|richtig an dieser Stelle.",
+ "Er zeigt Normaldruck an.", // kStringShipAirlock3
+ "Komisch, es ist nur|noch ein Raumanzug da.", // kStringShipAirlock4
+ "Du mu\341t erst hingehen.", // kStringShipHold1
+ "Das Kabel ist im Weg.", // kStringCable1
+ "Das Kabel ist schon ganz|richtig an dieser Stelle.", // kStringCable2
//365
- "Womit denn?",
- "Die Leitung ist zu kurz.",
- "Was ist denn das f\201r ein Chaos?|Und au\341erdem fehlt das Notraumschiff!|Jetzt wird mir einiges klar.|Die anderen sind gefl\201chtet,|und ich habe es verpennt.",
- "Es ist nicht spitz genug.",
- "Du wirst aus den Anzeigen nicht schlau.",
+ "Womit denn?", // kStringCable3
+ "Die Leitung ist zu kurz.", // kStringCable4
+ "Was ist denn das f\201r ein Chaos?|Und au\341erdem fehlt das Notraumschiff!|Jetzt wird mir einiges klar.|Die anderen sind gefl\201chtet,|und ich habe es verpennt.", // kStringShipHold2
+ "Es ist nicht spitz genug.", // kStringShipHold3
+ "Du wirst aus den Anzeigen nicht schlau.", // kStringShipHold4
//370
- "La\341 lieber die Finger davon!",
- "An dem Kabel ist doch gar kein Stecker.",
- "Du solltest die Luke vielleicht erst \224ffnen.",
- "Das Seil ist im Weg.",
- "Das ist geschlossen.",
+ "La\341 lieber die Finger davon!", // kStringShipHold5
+ "An dem Kabel ist doch gar kein Stecker.", // kStringShipHold6
+ "Du solltest die Luke vielleicht erst \224ffnen.", // kStringShipHold7
+ "Das Seil ist im Weg.", // kStringShipHold8
+ "Das ist geschlossen.", // kStringShipHold9
//375
- "Das geht nicht.|Die Luke ist mindestens|5 Meter \201ber dem Boden.",
- "Was n\201tzt dir der Anschlu\341|ohne eine Stromquelle?!",
- "Die Spannung ist auf Null abgesunken.",
- "Es zeigt volle Spannung an.",
- "Du mu\341t die Luke erst \224ffnen.",
+ "Das geht nicht.|Die Luke ist mindestens|5 Meter \201ber dem Boden.", // kStringShipHold10
+ "Was n\201tzt dir der Anschlu\341|ohne eine Stromquelle?!", // kStringShipHold11
+ "Die Spannung ist auf Null abgesunken.", // kStringShipHold12
+ "Es zeigt volle Spannung an.", // kStringShipHold13
+ "Du mu\341t die Luke erst \224ffnen.", // kStringShipHold14
//380
- "Das Seil ist hier schon ganz richtig.",
- "Das Kabel ist zu kurz.",
- "",
- "",
- "",
+ "Das Seil ist hier schon ganz richtig.", // kStringShipHold15
+ "Das Kabel ist zu kurz.", // kStringShipHold16
+ "Die Raumschifft sind alle verschlossen.", // kStringArsanoMeetup1
+ "Unsinn!", // kStringArsanoMeetup2
+ "Komisch! Auf einmal kannst du|das Schild lesen! Darauf steht:|\"Treffpunkt Galactica\".", // kStringArsanoMeetup3
//385
+ "Durch deinen Helm kannst|du nicht sprechen.", // kStringArsanoEntrance1
+ "Wo soll ich die Schuhe ablegen?", // kStringArsanoEntrance2
+ "Was, das wissen Sie nicht?", // kStringArsanoEntrance3
+ "Sie befinden sich im Restaurant|\"Treffpunkt Galactica\".", // kStringArsanoEntrance4
+ "Wir sind bei den interessantesten|Ereignissen in der Galaxis|immer zur Stelle.", // kStringArsanoEntrance5
+ //390
+ "Wenn Sie meinen.", // kStringArsanoEntrance6
+ "In der Toilette gibt es|Schlie\341f\204cher f\201r Schuhe.", // kStringArsanoEntrance7
+ "Wenn Sie das Lokal betreten|wollen, m\201ssen Sie erst|ihre Schuhe ausziehen.", // kStringArsanoEntrance8
+ "Wollen Sie, da\341 ich Sie rau\341schmei\341e?", // kStringArsanoEntrance9
+ "Hhius otgfh Dgfdrkjlh Fokj gf.", // kStringArsanoEntrance10
+ //395
+ "Halt!", // kStringArsanoEntrance11
+ "Uhwdejkt!", // kStringArsanoEntrance12
+ "Sie m\201ssen erst ihre Schuhe ausziehen, Sie Trottel!", // kStringArsanoEntrance13
+ "Was f\204llt ihnen ein!|Sie k\224nnen doch ein Lokal|nicht mit Schuhen betreten!", // kStringArsanoEntrance14
+ "Fragen Sie nicht so doof!", // kStringArsanoEntrance15
+ // 400
+ "Das w\201rde ich an ihrer|Stelle nicht versuchen!", // kStringArsanoEntrance16
+ "Du ziehst deine Schuhe|aus und legst sie in|eins der Schlie\341f\204cher.", // kStringArsanoEntrance17
+ "Du ziehst deine Schuhe wieder an.", // kStringArsanoEntrance18
+ "Du durchsuchst die Klos nach|anderen brauchbaren Sachen,|findest aber nichts.", // kStringArsanoEntrance19
+ "Bevor du aufs Klo gehst,|solltest du besser deinen|Raumanzug ausziehen.", // kStringArsanoEntrance20
+ // 405
+ "Du gehst seit sieben Jahren das|erste Mal wieder aufs Klo!", // kStringArsanoEntrance21
+ "In einem der Schlie\341f\204cher,|die sich auch im Raum befinden,|findest du einige M\201nzen.", // kStringArsanoEntrance22
+ "Mach doch zuerst das Fach leer!", // kStringArsanoEntrance23
+ "Komisch! Auf einmal kannst du|das Schild lesen! Darauf steht:|\"Zutritt nur f\201r Personal\".", // kStringArsanoEntrance24
+ "Komisch! Auf einmal kannst|du das Schild lesen!|Darauf steht:\"Toilette\".", // kStringArsanoEntrance25
+ // 410
+ "Du ziehst den Raumanzug wieder an.", // kStringArsanoEntrance26
+ "Nicht so gewaltt\204tig!", // kStringArsanoEntrance27
+ "Wo bin ich hier?", // kStringArsanoDialog1
+ "Sch\224nes Wetter heute, nicht wahr?", // kStringArsanoDialog2
+ "W\201rden Sie mich bitte durchlassen.", // kStringArsanoDialog3
+ // 415
+ "Hey Alter, la\341 mich durch!", // kStringArsanoDialog4
+ "Was haben Sie gesagt?", // kStringArsanoDialog5
+ "Sprechen Sie bitte etwas deutlicher!", // kStringArsanoDialog6
+ "Wieso das denn nicht?", // kStringArsanoDialog7
+ "Wo soll ich die Schuhe ablegen?", // kStringArsanoDialog8
+ // 420
+ "Schwachsinn! Ich gehe jetzt nach oben!", // kStringArsanoDialog9
+ "|", // kStringDialogSeparator
+ "K\224nnten Sie mir ein Gericht empfehlen?", // kStringDialogArsanoRoger1
+ "Wie lange dauert es denn noch bis zur Supernova?", // kStringDialogArsanoRoger2
+ "Sie kommen mir irgendwie bekannt vor.", // kStringDialogArsanoRoger3
+ // 425
+ "Was wollen Sie von mir?", // kStringDialogArsanoMeetup3_1
+ "Hilfe!!", // kStringDialogArsanoMeetup3_2
+ "Warum sprechen Sie meine Sprache?", // kStringDialogArsanoMeetup3_3
+ "Ja, ich bin einverstanden.", // kStringDialogArsanoMeetup3_4
+ "Nein, lieber bleibe ich hier, als mit Ihnen zu fliegen.", // kStringDialogArsanoMeetup3_5
+ // 430
NULL
};
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index ba9eff3..d30aec1 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -489,7 +489,18 @@ enum StringID {
kStringShipHold5, kStringShipHold6, kStringShipHold7, kStringShipHold8, kStringShipHold9,
// 375
kStringShipHold10, kStringShipHold11, kStringShipHold12, kStringShipHold13, kStringShipHold14,
- kStringShipHold15, kStringShipHold16
+ kStringShipHold15, kStringShipHold16, kStringArsanoMeetup1, kStringArsanoMeetup2, kStringArsanoMeetup3,
+ kStringArsanoEntrance1, kStringArsanoEntrance2, kStringArsanoEntrance3, kStringArsanoEntrance4, kStringArsanoEntrance5,
+ kStringArsanoEntrance6, kStringArsanoEntrance7, kStringArsanoEntrance8, kStringArsanoEntrance9, kStringArsanoEntrance10,
+ kStringArsanoEntrance11, kStringArsanoEntrance12, kStringArsanoEntrance13, kStringArsanoEntrance14, kStringArsanoEntrance15,
+ // 400
+ kStringArsanoEntrance16, kStringArsanoEntrance17, kStringArsanoEntrance18, kStringArsanoEntrance19, kStringArsanoEntrance20,
+ kStringArsanoEntrance21, kStringArsanoEntrance22, kStringArsanoEntrance23, kStringArsanoEntrance24, kStringArsanoEntrance25,
+ kStringArsanoEntrance26, kStringArsanoEntrance27, kStringArsanoDialog1, kStringArsanoDialog2, kStringArsanoDialog3,
+ kStringArsanoDialog4, kStringArsanoDialog5, kStringArsanoDialog6, kStringArsanoDialog7, kStringArsanoDialog8,
+ kStringArsanoDialog9, kStringDialogSeparator, kStringDialogArsanoRoger1, kStringDialogArsanoRoger2, kStringDialogArsanoRoger3,
+ // 425
+ kStringDialogArsanoMeetup3_1, kStringDialogArsanoMeetup3_2, kStringDialogArsanoMeetup3_3, kStringDialogArsanoMeetup3_4, kStringDialogArsanoMeetup3_5
};
static StringID guiCommands[] = {
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 77d6efa..cdcc295 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -1489,12 +1489,12 @@ bool ArsanoMeetup::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_WALK) &&
((obj1._id == SPACESHIPS) ||
((obj1._id == SPACESHIP) && !obj1.hasProperty(OPENED)))) {
- _vm->renderMessage("Die Raumschifft sind alle verschlossen.");
+ _vm->renderMessage(kStringArsanoMeetup1);
} else if ((verb == ACTION_WALK) && (obj1._id == SPACESHIP)) {
_gm->changeRoom(GLIDER);
_gm->_newRoom = true;
} else if ((verb == ACTION_WALK) && (obj1._id == STAR)) {
- _vm->renderMessage("Unsinn!");
+ _vm->renderMessage(kStringArsanoMeetup2);
} else if ((verb == ACTION_LOOK) && (obj1._id == STAR)) {
_vm->renderImage(26, 0);
_vm->paletteBrightness();
@@ -1515,7 +1515,7 @@ bool ArsanoMeetup::interact(Action verb, Object &obj1, Object &obj2) {
return false;
} else if ((verb == ACTION_LOOK) && (obj1._id == MEETUP_SIGN) && _gm->_state._language) {
if (_gm->_state._language == 2)
- _vm->renderMessage("Komisch! Auf einmal kannst du|das Schild lesen! Darauf steht:|\"Treffpunkt Galactica\".");
+ _vm->renderMessage(kStringArsanoMeetup3);
obj1._description = kStringSignDescription2;
if (_gm->_state._language == 1)
@@ -1576,43 +1576,43 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_TALK) && (obj1._id == PORTER)) {
if (_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN)) {
- _vm->renderMessage("Durch deinen Helm kannst|du nicht sprechen.");
+ _vm->renderMessage(kStringArsanoEntrance1);
} else {
if (_gm->_state._language) {
do {
if (_gm->_state._shoes == 1) {
- _dialog2[2] = "Wo soll ich die Schuhe ablegen?";
+ _dialog2[2] = kStringArsanoEntrance2;
_gm->addSentence(2, 2);
} else if (_gm->_state._shoes > 1) {
_gm->removeSentence(2, 2);
}
switch (e = _gm->dialog(5, nullptr, nullptr, 2)) { // row2, dialog2
case 0:
- _gm->reply("Was, das wissen Sie nicht?", 1, _gm->invertSection(1));
- _gm->reply("Sie befinden sich im Restaurant|\"Treffpunkt Galactica\".", 1, _gm->invertSection(1));
- _gm->reply("Wir sind bei den interessantesten|Ereignissen in der Galaxis|immer zur Stelle.", 1, _gm->invertSection(1));
+ _gm->reply(kStringArsanoEntrance3, 1, _gm->invertSection(1));
+ _gm->reply(kStringArsanoEntrance4, 1, _gm->invertSection(1));
+ _gm->reply(kStringArsanoEntrance5, 1, _gm->invertSection(1));
_gm->removeSentence(1, 1);
break;
case 1:
- _gm->reply("Wenn Sie meinen.", 1, _gm->invertSection(1));
+ _gm->reply(kStringArsanoEntrance6, 1, _gm->invertSection(1));
_gm->addSentence(1, 2);
break;
case 2:
if (_gm->_state._shoes == 1) {
- _gm->reply("In der Toilette gibt es|Schlie\341f\204cher f\201r Schuhe.", 1, _gm->invertSection(1));
+ _gm->reply(kStringArsanoEntrance7, 1, _gm->invertSection(1));
_gm->_state._shoes = 2;
} else {
- _gm->reply("Wenn Sie das Lokal betreten|wollen, m\201ssen Sie erst|ihre Schuhe ausziehen.", 1, _gm->invertSection(1));
+ _gm->reply(kStringArsanoEntrance8, 1, _gm->invertSection(1));
_gm->_state._shoes = 1;
}
break;
case 3:
- _gm->reply("Wollen Sie, da\341 ich Sie rau\341schmei\341e?", 1, _gm->invertSection(1));
+ _gm->reply(kStringArsanoEntrance9, 1, _gm->invertSection(1));
}
} while (e != 4);
} else {
if (_gm->dialog(5, nullptr, nullptr, 0) != 4) // row2, dialog2
- _gm->reply("Hhius otgfh Dgfdrkjlh Fokj gf.", 1, _gm->invertSection(1));
+ _gm->reply(kStringArsanoEntrance10, 1, _gm->invertSection(1));
}
}
} else if ((verb == ACTION_WALK) && (obj1._id == STAIRCASE) && (_gm->_state._shoes != 3)) {
@@ -1623,9 +1623,9 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
if (_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN))
_gm->reply("|", 1, _gm->invertSection(1));
else if (_gm->_state._language)
- _gm->reply("Halt!", 1, _gm->invertSection(1));
+ _gm->reply(kStringArsanoEntrance11, 1, _gm->invertSection(1));
else
- _gm->reply("Uhwdejkt!", 1, _gm->invertSection(1));
+ _gm->reply(kStringArsanoEntrance12, 1, _gm->invertSection(1));
_gm->drawImage(3);
setSectionVisible(4, false);
_gm->wait2(2);
@@ -1633,23 +1633,23 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
if (!_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN)) {
if (_gm->_state._language) {
if (_gm->_state._shoes)
- _gm->reply("Sie m\201ssen erst ihre Schuhe ausziehen, Sie Trottel!", 1, _gm->invertSection(1));
+ _gm->reply(kStringArsanoEntrance13, 1, _gm->invertSection(1));
else
- _gm->reply("Was f\204llt ihnen ein!|Sie k\224nnen doch ein Lokal|nicht mit Schuhen betreten!", 1, _gm->invertSection(1));
+ _gm->reply(kStringArsanoEntrance14, 1, _gm->invertSection(1));
e = 0;
while ((e < 3) && (_shown[kMaxSection - 1] != 15)) {
switch (e = _gm->dialog(5, nullptr, nullptr, 1)) { // row1, dialog1
case 0:
- _gm->reply("Fragen Sie nicht so doof!", 1, 1 + 128);
+ _gm->reply(kStringArsanoEntrance15, 1, 1 + 128);
break;
case 1:
- _gm->reply("Was, das wissen Sie nicht?", 1, 1 + 128);
- _gm->reply("Sie befinden sich im Restaurant|\"Treffpunkt Galactica\".", 1, 1 + 128);
- _gm->reply("Wir sind bei den interessantesten|Ereignissen in der Galaxis|immer zur Stelle.", 1, 1 + 128);
+ _gm->reply(kStringArsanoEntrance3, 1, 1 + 128);
+ _gm->reply(kStringArsanoEntrance4, 1, 1 + 128);
+ _gm->reply(kStringArsanoEntrance5, 1, 1 + 128);
_gm->removeSentence(0, 2);
break;
case 2:
- _gm->reply("In der Toilette gibt es|Schlie\341f\204cher f\201r Schuhe.", 1, 1 + 128);
+ _gm->reply(kStringArsanoEntrance7, 1, 1 + 128);
_gm->_state._shoes = 2;
break;
case 3:
@@ -1657,7 +1657,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
_gm->wait2(2);
_gm->drawImage(4);
setSectionVisible(3, false);
- _gm->reply("Das w\201rde ich an ihrer|Stelle nicht versuchen!", 1, 1 + 128);
+ _gm->reply(kStringArsanoEntrance16, 1, 1 + 128);
_gm->drawImage(3);
setSectionVisible(4, false);
_gm->wait2(2);
@@ -1668,7 +1668,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
}
} else {
_gm->dialog(2, nullptr, nullptr, 0); // row3, dialog3
- _gm->reply("Hhius otgfh Dgfdrkjlh Fokj gf.", 1, 1 + 128);
+ _gm->reply(kStringArsanoEntrance10, 1, 1 + 128);
}
}
} else if ((verb == ACTION_PRESS) && (obj1._id == BATHROOM_BUTTON)) {
@@ -1690,23 +1690,23 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_WALK) && (obj1._id == ARSANO_BATHROOM)) {
if (_gm->_state._coins) {
if (_gm->_state._shoes == 2) {
- _vm->renderMessage("Du ziehst deine Schuhe|aus und legst sie in|eins der Schlie\341f\204cher.");
+ _vm->renderMessage(kStringArsanoEntrance17);
_gm->_state._shoes = 3;
_gm->removeSentence(2, 2);
_gm->removeSentence(3, 2);
} else if (_gm->_state._shoes == 3) {
- _vm->renderMessage("Du ziehst deine Schuhe wieder an.");
+ _vm->renderMessage(kStringArsanoEntrance18);
_gm->_state._shoes = 2;
} else
- _vm->renderMessage("Du durchsuchst die Klos nach|anderen brauchbaren Sachen,|findest aber nichts.");
+ _vm->renderMessage(kStringArsanoEntrance19);
} else {
if (_gm->_rooms[AIRLOCK]->getObject(5)->hasProperty(WORN))
- _vm->renderMessage("Bevor du aufs Klo gehst,|solltest du besser deinen|Raumanzug ausziehen.");
+ _vm->renderMessage(kStringArsanoEntrance20);
else {
- _vm->renderMessage("Du gehst seit sieben Jahren das|erste Mal wieder aufs Klo!");
+ _vm->renderMessage(kStringArsanoEntrance21);
_gm->mouseWait(_gm->_timer1);
_vm->removeMessage();
- _vm->renderMessage("In einem der Schlie\341f\204cher,|die sich auch im Raum befinden,|findest du einige M\201nzen.");
+ _vm->renderMessage(kStringArsanoEntrance22);
_gm->takeObject(*getObject(16));
_gm->_state._coins = 5;
}
@@ -1716,7 +1716,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
_shown[kMaxSection - 5] = kShownTrue;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COINS, CAR_SLOT)) {
if ((_gm->_state._coins < 5) && (getObject(7 - _gm->_state._coins)->_click == 7))
- _vm->renderMessage("Mach doch zuerst das Fach leer!");
+ _vm->renderMessage(kStringArsanoEntrance23);
else {
_gm->drawImage(15 - _gm->_state._coins);
getObject(8 - _gm->_state._coins)->_click = 7;
@@ -1731,14 +1731,14 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
}
} else if ((verb == ACTION_LOOK) && (obj1._id == KITCHEN_SIGN) && _gm->_state._language) {
if (_gm->_state._language == 2)
- _vm->renderMessage("Komisch! Auf einmal kannst du|das Schild lesen! Darauf steht:|\"Zutritt nur f\201r Personal\".");
+ _vm->renderMessage(kStringArsanoEntrance24);
obj1._description = kStringDoorDescription5;
if (_gm->_state._language == 1)
return false;
_gm->_state._language = 1;
} else if ((verb == ACTION_LOOK) && (obj1._id == BATHROOM_SIGN) && _gm->_state._language) {
if (_gm->_state._language == 2)
- _vm->renderMessage("Komisch! Auf einmal kannst|du das Schild lesen!|Darauf steht:\"Toilette\".");
+ _vm->renderMessage(kStringArsanoEntrance25);
obj1._description = kStringDoorDescription6;
if (_gm->_state._language == 1)
return false;
@@ -1747,7 +1747,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
if (!((_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN)) &&
(_gm->_rooms[AIRLOCK]->getObject(5)->hasProperty(WORN)) &&
(_gm->_rooms[AIRLOCK]->getObject(6)->hasProperty(WORN)))) {
- _vm->renderMessage("Du ziehst den Raumanzug wieder an.");
+ _vm->renderMessage(kStringArsanoEntrance26);
getObject(4)->setProperty(WORN);
getObject(5)->setProperty(WORN);
getObject(6)->setProperty(WORN);
@@ -1756,9 +1756,10 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
}
return false;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, PORTER))
- _vm->renderMessage("Nicht so gewaltt\204tig!");
+ _vm->renderMessage(kStringArsanoEntrance27);
else
return false;
+
return true;
}
@@ -2251,7 +2252,7 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
byte zeilen3[2] = {1, 1};
if ((verb == ACTION_WALK) && (obj1._id == STAR))
- _vm->renderMessage("Unsinn!");
+ _vm->renderMessage(kStringArsanoMeetup2);
else if ((verb == ACTION_LOOK) && (obj1._id == STAR)) {
_vm->renderImage(26, 0);
_vm->paletteBrightness();
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 6e570ef..8e857e8 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -625,20 +625,20 @@ public:
_objectState[16] = Object(_id, kStringCoins,kStringCoinsDescription,COINS,TAKE|COMBINABLE,255,255,0);
_objectState[17] = Object(_id, kStringTabletPackage,kStringTabletPackageDescription,PILL_HULL,TAKE,255,255,0);
- _dialog1[0] = "Wieso das denn nicht?";
- _dialog1[1] = "Wo bin ich hier?";
- _dialog1[2] = "Wo soll ich die Schuhe ablegen?";
- _dialog1[3] = "Schwachsinn! Ich gehe jetzt nach oben!";
- _dialog1[4] = "|";
+ _dialog1[0] = kStringArsanoDialog7;
+ _dialog1[1] = kStringArsanoDialog1;
+ _dialog1[2] = kStringArsanoDialog8;
+ _dialog1[3] = kStringArsanoDialog9;
+ _dialog1[4] = kStringDialogSeparator;
- _dialog2[0] = "Wo bin ich hier?";
- _dialog2[1] = "Sch\224nes Wetter heute, nicht wahr?";
- _dialog2[2] = "W\201rden Sie mich bitte durchlassen.";
- _dialog2[3] = "Hey Alter, la\341 mich durch!";
- _dialog2[4] = "|";
+ _dialog2[0] = kStringArsanoDialog1;
+ _dialog2[1] = kStringArsanoDialog2;
+ _dialog2[2] = kStringArsanoDialog3;
+ _dialog2[3] = kStringArsanoDialog4;
+ _dialog2[4] = kStringDialogSeparator;
- _dialog3[0] = "Was haben Sie gesagt?";
- _dialog3[1] = "Sprechen Sie bitte etwas deutlicher!";
+ _dialog3[0] = kStringArsanoDialog5;
+ _dialog3[1] = kStringArsanoDialog6;
_eyewitness = 5;
}
@@ -647,9 +647,9 @@ public:
virtual void animation();
private:
- Common::String _dialog1[5];
- Common::String _dialog2[5];
- Common::String _dialog3[5];
+ StringID _dialog1[5];
+ StringID _dialog2[5];
+ StringID _dialog3[5];
byte _eyewitness;
};
class ArsanoRemaining : public Room {
@@ -695,10 +695,10 @@ public:
_objectState[7] = Object(_id, kStringBill,kStringBillDescription,NULLOBJECT,TAKE|COMBINABLE,255,255,0);
_objectState[8] = Object(_id, kStringKeycard3,kStringDefaultDescription,KEYCARD_R,TAKE|COMBINABLE,255,255,0);
- _dialog1[0] = "K\224nnten Sie mir ein Gericht empfehlen?";
- _dialog1[1] = "Wie lange dauert es denn noch bis zur Supernova?";
- _dialog1[2] = "Sie kommen mir irgendwie bekannt vor.";
- _dialog1[3] = "|";
+ _dialog1[0] = kStringDialogArsanoRoger1;
+ _dialog1[1] = kStringDialogArsanoRoger2;
+ _dialog1[2] = kStringDialogArsanoRoger3;
+ _dialog1[3] = kStringDialogSeparator;
_eyewitness = 5;
}
@@ -708,7 +708,7 @@ public:
virtual bool interact(Action verb, Object &obj1, Object &obj2);
private:
- Common::String _dialog1[4];
+ StringID _dialog1[4];
byte _eyewitness;
byte _hands;
};
@@ -793,19 +793,19 @@ public:
_objectState[1] = Object(_id, kStringStar,kStringDefaultDescription,STAR,NULLTYPE,1,1,0);
_objectState[2] = Object(_id, kStringCave,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
- _dialog2[0] = "Wo bin ich hier?";
- _dialog2[1] = "Was wollen Sie von mir?";
- _dialog2[2] = "Hilfe!!";
- _dialog2[3] = "Warum sprechen Sie meine Sprache?";
- _dialog3[0] = "Ja, ich bin einverstanden.";
- _dialog3[1] = "Nein, lieber bleibe ich hier, als mit Ihnen zu fliegen.";
+ _dialog2[0] = kStringArsanoDialog1;
+ _dialog2[1] = kStringDialogArsanoMeetup3_1;
+ _dialog2[2] = kStringDialogArsanoMeetup3_2;
+ _dialog2[3] = kStringDialogArsanoMeetup3_3;
+ _dialog3[0] = kStringDialogArsanoMeetup3_4;
+ _dialog3[1] = kStringDialogArsanoMeetup3_5;
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
private:
- Common::String _dialog2[4];
- Common::String _dialog3[2];
+ StringID _dialog2[4];
+ StringID _dialog3[2];
};
// Axacuss
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 2bbcb0a..293f3d4 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -787,6 +787,10 @@ void GameManager::say(const char *text) {
// STUB
}
+void GameManager::reply(StringID textId, int aus1, int aus2) {
+ // STUB
+}
+
void GameManager::reply(const char *text, int aus1, int aus2) {
// STUB
}
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index c4d1cf4..f294f14 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -185,6 +185,7 @@ public:
void removeSentence(int sentence, int number);
void addSentence(int sentence, int number);
void say(const char *text);
+ void reply(StringID textId, int aus1, int aus2);
void reply(const char *text, int aus1, int aus2);
void shipStart();
void shot(int a, int b);
Commit: 609856d36a97389d58999a2c92431c0881704863
https://github.com/scummvm/scummvm/commit/609856d36a97389d58999a2c92431c0881704863
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:35Z
Commit Message:
SUPERNOVA: Fix a remaining kStringDialogSeparator
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index cdcc295..6311a0a 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -1621,7 +1621,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
_gm->drawImage(4);
setSectionVisible(3, false);
if (_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN))
- _gm->reply("|", 1, _gm->invertSection(1));
+ _gm->reply(kStringDialogSeparator, 1, _gm->invertSection(1));
else if (_gm->_state._language)
_gm->reply(kStringArsanoEntrance11, 1, _gm->invertSection(1));
else
Commit: 56f9328e90a08fb53c67e7dabf45965d7c02b4f0
https://github.com/scummvm/scummvm/commit/56f9328e90a08fb53c67e7dabf45965d7c02b4f0
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:35Z
Commit Message:
SUPERNOVA: Extract ArsanoRoger texts
Changed paths:
devtools/create_supernova/gametext.h
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index f385c76..46e59b4 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -552,6 +552,60 @@ const char *gameText[] = {
"Ja, ich bin einverstanden.", // kStringDialogArsanoMeetup3_4
"Nein, lieber bleibe ich hier, als mit Ihnen zu fliegen.", // kStringDialogArsanoMeetup3_5
// 430
+ "Darf ich hier Platz nehmen?", // kStringArsanoRoger1
+ "Klar!", // kStringArsanoRoger2
+ "Hey, Witzkeks, la\341 die Brieftasche da liegen!", // kStringArsanoRoger3
+ "Das ist nicht deine.", // kStringArsanoRoger4
+ "Roger ist im Moment nicht ansprechbar.", // kStringArsanoRoger5
+ // 435
+ "Bestellen Sie lieber nichts!", // kStringArsanoRoger6
+ "Ich habe vor zwei Stunden mein Essen|bestellt und immer noch nichts bekommen.", // kStringArsanoRoger7
+ "Noch mindestens zwei Stunden.", // kStringArsanoRoger8
+ "Haben Sie keine Idee, womit wir uns|bis dahin die Zeit vertreiben k\224nnen?", // kStringArsanoRoger9
+ "Hmm ... im Moment f\201llt mir nichts ein, aber vielleicht|hat der Spieler des Adventures ja eine Idee.", // kStringArsanoRoger10
+ // 440
+ "Nein, Sie m\201ssen sich irren.|Ich kenne Sie jedenfalls nicht.", // kStringArsanoRoger11
+ "Aber ihre Kleidung habe ich irgendwo schon mal gesehen.", // kStringArsanoRoger12
+ "Ja? Komisch.", // kStringArsanoRoger13
+ "Jetzt wei\341 ich's. Sie sind Roger W. !", // kStringArsanoRoger14
+ "Pssst, nicht so laut, sonst will|gleich jeder ein Autogramm von mir.", // kStringArsanoRoger15
+ // 415
+ "Ich habe extra eine Maske auf, damit|ich nicht von jedem angelabert werde.", // kStringArsanoRoger16
+ "\216h ... ach so.", // kStringArsanoRoger17
+ "Wann kommt denn das n\204chste SQ-Abenteuer raus?", // kStringArsanoRoger18
+ "SQ 127 m\201\341te in einem Monat erscheinen.", // kStringArsanoRoger19
+ "Was, Teil 127 ??", // kStringArsanoRoger20
+ // 420
+ "Bei uns ist gerade Teil 8 erschienen.", // kStringArsanoRoger21
+ "Hmm ... von welchem Planeten sind Sie denn?", // kStringArsanoRoger22
+ "Von der Erde.", // kStringArsanoRoger23
+ "Erde? Nie geh\224rt.", // kStringArsanoRoger24
+ "Wahrscheinlich irgendein Kaff, wo Neuerungen|erst hundert Jahre sp\204ter hingelangen.", // kStringArsanoRoger25
+ // 425
+ "\216h ... kann sein.", // kStringArsanoRoger26
+ "Aber eins m\201ssen Sie mir erkl\204ren!", // kStringArsanoRoger27
+ "Wieso sehen Sie mir so verdammt \204hnlich, wenn|Sie nicht von Xenon stammen, wie ich?", // kStringArsanoRoger28
+ "Keine Ahnung. Bis jetzt dachte ich immer, Sie w\201ren ein|von Programmierern auf der Erde erfundenes Computersprite.", // kStringArsanoRoger29
+ "Was? Lachhaft!", // kStringArsanoRoger30
+ // 430
+ "Wie erkl\204ren Sie sich dann,|da\341 ich ihnen gegen\201bersitze?", // kStringArsanoRoger31
+ "Ja, das ist in der Tat seltsam.", // kStringArsanoRoger32
+ "Halt, jetzt wei\341 ich es. Sie sind von der Konkurrenz,|von \"Georgefilm Games\" und wollen mich verunsichern.", // kStringArsanoRoger33
+ "Nein, ich bin nur ein Ahnungsloser Koch von der Erde.", // kStringArsanoRoger34
+ "Na gut, ich glaube Ihnen. Lassen wir jetzt|dieses Thema, langsam wird es mir zu bunt!", // kStringArsanoRoger35
+ // 435
+ "Eine Partie Schach! Das ist eine gute Idee.", // kStringArsanoRoger36
+ "Schach? Was ist das denn?", // kStringArsanoRoger37
+ "Schach ist ein interessantes Spiel.|Ich werde es Ihnen erkl\204ren.", // kStringArsanoRoger38
+ "Knapp zwei Stunden sp\204ter ...", // kStringArsanoRoger39
+ "Roger W. steht kurz vor dem Schachmatt|und gr\201belt nach einem Ausweg.", // kStringArsanoRoger40
+ // 440
+ "",
+ "",
+ "",
+ "",
+ "",
+ // 445
NULL
};
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index d30aec1..91d3be3 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -500,7 +500,15 @@ enum StringID {
kStringArsanoDialog4, kStringArsanoDialog5, kStringArsanoDialog6, kStringArsanoDialog7, kStringArsanoDialog8,
kStringArsanoDialog9, kStringDialogSeparator, kStringDialogArsanoRoger1, kStringDialogArsanoRoger2, kStringDialogArsanoRoger3,
// 425
- kStringDialogArsanoMeetup3_1, kStringDialogArsanoMeetup3_2, kStringDialogArsanoMeetup3_3, kStringDialogArsanoMeetup3_4, kStringDialogArsanoMeetup3_5
+ kStringDialogArsanoMeetup3_1, kStringDialogArsanoMeetup3_2, kStringDialogArsanoMeetup3_3, kStringDialogArsanoMeetup3_4, kStringDialogArsanoMeetup3_5,
+ kStringArsanoRoger1, kStringArsanoRoger2, kStringArsanoRoger3, kStringArsanoRoger4, kStringArsanoRoger5,
+ kStringArsanoRoger6, kStringArsanoRoger7, kStringArsanoRoger8, kStringArsanoRoger9, kStringArsanoRoger10,
+ kStringArsanoRoger11, kStringArsanoRoger12, kStringArsanoRoger13, kStringArsanoRoger14, kStringArsanoRoger15,
+ kStringArsanoRoger16, kStringArsanoRoger17, kStringArsanoRoger18, kStringArsanoRoger19, kStringArsanoRoger20,
+ kStringArsanoRoger21, kStringArsanoRoger22, kStringArsanoRoger23, kStringArsanoRoger24, kStringArsanoRoger25,
+ kStringArsanoRoger26, kStringArsanoRoger27, kStringArsanoRoger28, kStringArsanoRoger29, kStringArsanoRoger30,
+ kStringArsanoRoger31, kStringArsanoRoger32, kStringArsanoRoger33, kStringArsanoRoger34, kStringArsanoRoger35,
+ kStringArsanoRoger36, kStringArsanoRoger37, kStringArsanoRoger38, kStringArsanoRoger39, kStringArsanoRoger40
};
static StringID guiCommands[] = {
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 6311a0a..9272d63 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -1926,8 +1926,8 @@ void ArsanoRemaining::animation() {
void ArsanoRoger::onEntrance() {
// This is not a normal shown variable, it's a dialog
if (_shown[kMaxSection - 2] == 0) {
- _gm->say("Darf ich hier Platz nehmen?");
- _gm->reply("Klar!", 2, 2 + 128);
+ _gm->say(kStringArsanoRoger1);
+ _gm->reply(kStringArsanoRoger2, 2, 2 + 128);
_shown[kMaxSection - 2] = 1;
}
}
@@ -1966,64 +1966,64 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
_gm->great(0);
return false;
}
- _gm->reply("Hey, Witzkeks, la\341 die Brieftasche da liegen!", 2, 2 + 128);
+ _gm->reply(kStringArsanoRoger3, 2, 2 + 128);
} else if ((verb == ACTION_USE) && (obj1._id == CUP)) {
- _vm->renderMessage("Das ist nicht deine.");
+ _vm->renderMessage(kStringArsanoRoger4);
} else if ((verb == ACTION_TALK) && (obj1._id == ROGER_W)) {
if (isSectionVisible(3))
- _vm->renderMessage("Roger ist im Moment nicht ansprechbar.");
+ _vm->renderMessage(kStringArsanoRoger5);
else {
switch (_gm->dialog(4, nullptr, nullptr, 1)) { // row1, dialog1
case 0:
- _gm->reply("Bestellen Sie lieber nichts!", 2, 2 + 128);
- _gm->reply("Ich habe vor zwei Stunden mein Essen|bestellt und immer noch nichts bekommen.", 2, 2 + 128);
+ _gm->reply(kStringArsanoRoger6, 2, 2 + 128);
+ _gm->reply(kStringArsanoRoger7, 2, 2 + 128);
break;
case 1:
- _gm->reply("Noch mindestens zwei Stunden.", 2, 2 + 128);
- _gm->reply("Haben Sie keine Idee, womit wir uns|bis dahin die Zeit vertreiben k\224nnen?", 2, 2 + 128);
- _gm->say("Hmm ... im Moment f\201llt mir nichts ein, aber vielleicht|hat der Spieler des Adventures ja eine Idee.");
+ _gm->reply(kStringArsanoRoger8, 2, 2 + 128);
+ _gm->reply(kStringArsanoRoger9, 2, 2 + 128);
+ _gm->say(kStringArsanoRoger10);
break;
case 2:
- _gm->reply("Nein, Sie m\201ssen sich irren.|Ich kenne Sie jedenfalls nicht.", 2, 2 + 128);
- _gm->say("Aber ihre Kleidung habe ich irgendwo schon mal gesehen.");
- _gm->reply("Ja? Komisch.", 2, 2 + 128);
- _gm->say("Jetzt wei\341 ich's. Sie sind Roger W. !");
- _gm->reply("Pssst, nicht so laut, sonst will|gleich jeder ein Autogramm von mir.", 2, 2 + 128);
- _gm->reply("Ich habe extra eine Maske auf, damit|ich nicht von jedem angelabert werde.", 2, 2 + 128);
- _gm->say("\216h ... ach so.");
- _gm->say("Wann kommt denn das n\204chste SQ-Abenteuer raus?");
- _gm->reply("SQ 127 m\201\341te in einem Monat erscheinen.", 2, 2 + 128);
- _gm->say("Was, Teil 127 ??");
- _gm->say("Bei uns ist gerade Teil 8 erschienen.");
- _gm->reply("Hmm ... von welchem Planeten sind Sie denn?", 2, 2 + 128);
- _gm->say("Von der Erde.");
- _gm->reply("Erde? Nie geh\224rt.", 2, 2 + 128);
- _gm->reply("Wahrscheinlich irgendein Kaff, wo Neuerungen|erst hundert Jahre sp\204ter hingelangen.", 2, 2 + 128);
- _gm->say("\216h ... kann sein.");
- _gm->reply("Aber eins m\201ssen Sie mir erkl\204ren!", 2, 2 + 128);
- _gm->reply("Wieso sehen Sie mir so verdammt \204hnlich, wenn|Sie nicht von Xenon stammen, wie ich?", 2, 2 + 128);
- _gm->say("Keine Ahnung. Bis jetzt dachte ich immer, Sie w\201ren ein|von Programmierern auf der Erde erfundenes Computersprite.");
- _gm->reply("Was? Lachhaft!", 2, 2 + 128);
- _gm->reply("Wie erkl\204ren Sie sich dann,|da\341 ich ihnen gegen\201bersitze?", 2, 2 + 128);
- _gm->say("Ja, das ist in der Tat seltsam.");
- _gm->reply("Halt, jetzt wei\341 ich es. Sie sind von der Konkurrenz,|von \"Georgefilm Games\" und wollen mich verunsichern.", 2, 2 + 128);
- _gm->say("Nein, ich bin nur ein Ahnungsloser Koch von der Erde.");
- _gm->reply("Na gut, ich glaube Ihnen. Lassen wir jetzt|dieses Thema, langsam wird es mir zu bunt!", 2, 2 + 128);
+ _gm->reply(kStringArsanoRoger11, 2, 2 + 128);
+ _gm->say(kStringArsanoRoger12);
+ _gm->reply(kStringArsanoRoger13, 2, 2 + 128);
+ _gm->say(kStringArsanoRoger14);
+ _gm->reply(kStringArsanoRoger15, 2, 2 + 128);
+ _gm->reply(kStringArsanoRoger16, 2, 2 + 128);
+ _gm->say(kStringArsanoRoger17);
+ _gm->say(kStringArsanoRoger18);
+ _gm->reply(kStringArsanoRoger19, 2, 2 + 128);
+ _gm->say(kStringArsanoRoger20);
+ _gm->say(kStringArsanoRoger21);
+ _gm->reply(kStringArsanoRoger22, 2, 2 + 128);
+ _gm->say(kStringArsanoRoger23);
+ _gm->reply(kStringArsanoRoger24, 2, 2 + 128);
+ _gm->reply(kStringArsanoRoger25, 2, 2 + 128);
+ _gm->say(kStringArsanoRoger26);
+ _gm->reply(kStringArsanoRoger27, 2, 2 + 128);
+ _gm->reply(kStringArsanoRoger28, 2, 2 + 128);
+ _gm->say(kStringArsanoRoger29);
+ _gm->reply(kStringArsanoRoger30, 2, 2 + 128);
+ _gm->reply(kStringArsanoRoger31, 2, 2 + 128);
+ _gm->say(kStringArsanoRoger32);
+ _gm->reply(kStringArsanoRoger33, 2, 2 + 128);
+ _gm->say(kStringArsanoRoger34);
+ _gm->reply(kStringArsanoRoger35, 2, 2 + 128);
}
}
} else if (((verb == ACTION_USE) && Object::combine(obj1, obj2, CHESS, ROGER_W)) ||
((verb == ACTION_GIVE) && (obj1._id == CHESS) && (obj2._id == ROGER_W))) {
_gm->drawImage(11);
_gm->great(0);
- _gm->say("Eine Partie Schach! Das ist eine gute Idee.");
- _gm->reply("Schach? Was ist das denn?", 2, 2 + 128);
- _gm->say("Schach ist ein interessantes Spiel.|Ich werde es Ihnen erkl\204ren.");
+ _gm->say(kStringArsanoRoger36);
+ _gm->reply(kStringArsanoRoger37, 2, 2 + 128);
+ _gm->say(kStringArsanoRoger38);
_vm->paletteFadeOut();
_gm->_inventory.remove(*_gm->_rooms[CABIN_R3]->getObject(0)); // Chess board
g_system->fillScreen(kColorBlack);
_vm->_menuBrightness = 255;
_vm->paletteBrightness();
- _vm->renderMessage("Knapp zwei Stunden sp\204ter ...");
+ _vm->renderMessage(kStringArsanoRoger39);
_gm->mouseWait(_gm->_timer1);
_vm->removeMessage();
_vm->_menuBrightness = 0;
@@ -2042,12 +2042,11 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
getObject(5)->_click = 6;
getObject(6)->_click = 7;
_vm->paletteFadeIn();
- _vm->renderMessage("Roger W. steht kurz vor dem Schachmatt|und gr\201belt nach einem Ausweg.");
+ _vm->renderMessage(kStringArsanoRoger40);
_gm->mouseWait(_gm->_timer1);
_vm->removeMessage();
- } else {
+ } else
return false;
- }
return true;
}
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 293f3d4..39e086e 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -783,6 +783,10 @@ void GameManager::addSentence(int sentence, int number) {
// STUB
}
+void GameManager::say(StringID textId) {
+ // STUB
+}
+
void GameManager::say(const char *text) {
// STUB
}
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index f294f14..875a89a 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -184,6 +184,7 @@ public:
void sentence(int number, bool brightness);
void removeSentence(int sentence, int number);
void addSentence(int sentence, int number);
+ void say(StringID textId);
void say(const char *text);
void reply(StringID textId, int aus1, int aus2);
void reply(const char *text, int aus1, int aus2);
Commit: 7cfe38501cb8d61544d3a6e71e32fdd48d79c67a
https://github.com/scummvm/scummvm/commit/7cfe38501cb8d61544d3a6e71e32fdd48d79c67a
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:35Z
Commit Message:
SUPERNOVA: Extract ArsanoGlider, ArsanoMeetup 2 & 3 and AxacussCell strings
Changed paths:
devtools/create_supernova/gametext.h
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index 46e59b4..b4e94a1 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -600,12 +600,66 @@ const char *gameText[] = {
"Knapp zwei Stunden sp\204ter ...", // kStringArsanoRoger39
"Roger W. steht kurz vor dem Schachmatt|und gr\201belt nach einem Ausweg.", // kStringArsanoRoger40
// 440
- "",
- "",
- "",
- "",
- "",
+ "Du tippst auf den Tasten herum,|aber es passiert nichts.", // kStringArsanoGlider1
+ "Alle Raumschiffe haben|den Planeten verlassen.", // kStringArsanoMeetup2_1
+ "Alle Raumschiffe haben den Planeten|verlassen, bis auf eins ...", // kStringArsanoMeetup2_2
+ "Was wollen Sie denn schon wieder?", // kStringArsanoMeetup2_3
+ "Nein.", // kStringArsanoMeetup2_4
// 445
+ "Haben Sie zuf\204llig meine Brieftasche gesehen?|Ich mu\341 Sie irgendwo verloren haben.", // kStringArsanoMeetup2_5
+ "Ohne die Brieftasche kann ich nicht|starten, weil meine Keycard darin ist.", // kStringArsanoMeetup2_6
+ "Oh! Vielen Dank.", // kStringArsanoMeetup2_7
+ "Wo ist denn Ihr Raumschiff?|Soll ich Sie ein St\201ck mitnehmen?", // kStringArsanoMeetup2_8
+ "Wo wollen Sie denn hin?", // kStringArsanoMeetup2_9
+ // 450
+ "Ok, steigen Sie ein!", // kStringArsanoMeetup2_10
+ "Wie Sie wollen.", // kStringArsanoMeetup2_11
+ "Huch, du lebst ja noch!", // kStringArsanoMeetup2_12
+ "Das w\201rde ich jetzt nicht tun, schlie\341lich|steht Roger W. neben seinem Schiff.", // kStringArsanoMeetup2_13
+ "Ich glaube, er wacht auf.", // kStringArsanoMeetup3_1
+ // 455
+ "Ja, sieht so aus.", // kStringArsanoMeetup3_2
+ "Sie befinden sich im Raumschiff \"Dexxa\".", // kStringArsanoMeetup3_3
+ "Wir kommen vom Planeten Axacuss und|sind aus dem gleichen Grund hier wie Sie,|n?mlich zur Erforschung der Supernova.", // kStringArsanoMeetup3_4
+ "Sie k\224nnen beruhigt sein, wir wollen Ihnen nur helfen.", // kStringArsanoMeetup3_5
+ "Und wieso hat der Typ im Raumanzug|eben auf mich geschossen?", // kStringArsanoMeetup3_6
+ // 460
+ "Das war eine Schreckreaktion.", // kStringArsanoMeetup3_7
+ "Schlie\341lich ist es f\201r uns das erste Mal,|da\341 wir auf eine fremde Intelligenz treffen.", // kStringArsanoMeetup3_8
+ "Wie wir festgestellt haben, ist|Ihr Raumschiff v\224llig zerst\224rt.", // kStringArsanoMeetup3_9
+ "Wahrscheinlich k\224nnen Sie nicht|mehr auf ihren Heimatplaneten zur\201ck.", // kStringArsanoMeetup3_10
+ "Wir bieten Ihnen an, Sie|mit nach Axacuss zu nehmen.", // kStringArsanoMeetup3_11
+ // 465
+ "Sind Sie sich da wirklich sicher?", // kStringArsanoMeetup3_12
+ "Wenn ich es mir genau \201berlege,|fliege ich doch lieber mit.", // kStringArsanoMeetup3_13
+ "Gut, wir nehmen Sie unter der|Bedingung mit, da\341 wir Sie jetzt|sofort in Tiefschlaf versetzen d\201rfen.", // kStringArsanoMeetup3_14
+ "Diese Art des Reisens ist Ihnen|ja scheinbar nicht unbekannt.", // kStringArsanoMeetup3_15
+ "Sie werden in vier Jahren nach der|Landung der \"Dexxa\" wieder aufgeweckt.", // kStringArsanoMeetup3_16
+ // 470
+ "Sind Sie damit einverstanden?", // kStringArsanoMeetup3_17
+ "Gut, haben Sie noch irgendwelche Fragen?", // kStringArsanoMeetup3_18
+ "Keine Panik!", // kStringArsanoMeetup3_19
+ "Wir tun Ihnen nichts.", // kStringArsanoMeetup3_20
+ "Wir sprechen nicht ihre Sprache,|sondern Sie sprechen unsere.", // kStringArsanoMeetup3_21
+ // 475
+ "Nach einer Gehirnanalyse konnten|wir Ihr Gehirn an unsere Sprache anpassen.", // kStringArsanoMeetup3_22
+ "Was? Sie haben in mein Gehirn eingegriffen?", // kStringArsanoMeetup3_23
+ "Keine Angst, wir haben sonst nichts ver\204ndert.", // kStringArsanoMeetup3_24
+ "Ohne diesen Eingriff w\204ren|Sie verloren gewesen.", // kStringArsanoMeetup3_25
+ "Ich habe keine weiteren Fragen mehr.", // kStringArsanoMeetup3_26
+ // 480
+ "Gut, dann versetzen wir Sie jetzt in Tiefschlaf.", // kStringArsanoMeetup3_27
+ "Gute Nacht!", // kStringArsanoMeetup3_28
+ "Du wachst auf und findest dich in|einem geschlossenen Raum wieder.", // kStringAxacussCell_1
+ "Du dr\201ckst den Knopf,|aber nichts passiert.", // kStringAxacussCell_2
+ "Das ist befestigt.", // kStringAxacussCell_3
+ // 485
+ "Bei deinem Fluchtversuch hat|dich der Roboter erschossen.", // kStringAxacussCell_4
+ "Du i\341t etwas, aber|es schmeckt scheu\341lich.", // kStringAxacussCell_5
+ "Ok.", // kStringOk
+ "", //
+ "", //
+ // 490
NULL
};
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 91d3be3..551d07a 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -505,10 +505,22 @@ enum StringID {
kStringArsanoRoger6, kStringArsanoRoger7, kStringArsanoRoger8, kStringArsanoRoger9, kStringArsanoRoger10,
kStringArsanoRoger11, kStringArsanoRoger12, kStringArsanoRoger13, kStringArsanoRoger14, kStringArsanoRoger15,
kStringArsanoRoger16, kStringArsanoRoger17, kStringArsanoRoger18, kStringArsanoRoger19, kStringArsanoRoger20,
+ // 450
kStringArsanoRoger21, kStringArsanoRoger22, kStringArsanoRoger23, kStringArsanoRoger24, kStringArsanoRoger25,
kStringArsanoRoger26, kStringArsanoRoger27, kStringArsanoRoger28, kStringArsanoRoger29, kStringArsanoRoger30,
kStringArsanoRoger31, kStringArsanoRoger32, kStringArsanoRoger33, kStringArsanoRoger34, kStringArsanoRoger35,
- kStringArsanoRoger36, kStringArsanoRoger37, kStringArsanoRoger38, kStringArsanoRoger39, kStringArsanoRoger40
+ kStringArsanoRoger36, kStringArsanoRoger37, kStringArsanoRoger38, kStringArsanoRoger39, kStringArsanoRoger40,
+ kStringArsanoGlider1, kStringArsanoMeetup2_1, kStringArsanoMeetup2_2, kStringArsanoMeetup2_3, kStringArsanoMeetup2_4,
+ // 475
+ kStringArsanoMeetup2_5, kStringArsanoMeetup2_6, kStringArsanoMeetup2_7, kStringArsanoMeetup2_8, kStringArsanoMeetup2_9,
+ kStringArsanoMeetup2_10, kStringArsanoMeetup2_11, kStringArsanoMeetup2_12, kStringArsanoMeetup2_13, kStringArsanoMeetup3_1,
+ kStringArsanoMeetup3_2, kStringArsanoMeetup3_3, kStringArsanoMeetup3_4, kStringArsanoMeetup3_5, kStringArsanoMeetup3_6,
+ kStringArsanoMeetup3_7, kStringArsanoMeetup3_8, kStringArsanoMeetup3_9, kStringArsanoMeetup3_10, kStringArsanoMeetup3_11,
+ kStringArsanoMeetup3_12, kStringArsanoMeetup3_13, kStringArsanoMeetup3_14, kStringArsanoMeetup3_15, kStringArsanoMeetup3_16,
+ kStringArsanoMeetup3_17, kStringArsanoMeetup3_18, kStringArsanoMeetup3_19, kStringArsanoMeetup3_20, kStringArsanoMeetup3_21,
+ kStringArsanoMeetup3_22, kStringArsanoMeetup3_23, kStringArsanoMeetup3_24, kStringArsanoMeetup3_25, kStringArsanoMeetup3_26,
+ kStringArsanoMeetup3_27, kStringArsanoMeetup3_28, kStringAxacussCell_1, kStringAxacussCell_2, kStringAxacussCell_3,
+ kStringAxacussCell_4, kStringAxacussCell_5, kStringOk
};
static StringID guiCommands[] = {
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 9272d63..5126649 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -1141,7 +1141,7 @@ bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_inventory.remove(*getObject(2));
_gm->_state._terminalStripConnected = true;
_gm->_state._terminalStripWire = true;
- _vm->renderMessage("Ok.");
+ _vm->renderMessage(kStringOk);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, SPOOL)) {
if (!_gm->_state._terminalStripConnected)
_vm->renderMessage(kStringCable3);
@@ -2121,25 +2121,24 @@ bool ArsanoGlider::interact(Action verb, Object &obj1, Object &obj2) {
_gm->wait2(4);
_gm->drawImage(_gm->invertSection(i));
} else if ((verb == ACTION_USE) && (obj1._id == GLIDER_BUTTONS)) {
- _vm->renderMessage("Du tippst auf den Tasten herum,|aber es passiert nichts.");
- } else {
+ _vm->renderMessage(kStringArsanoGlider1);
+ } else
return false;
- }
return true;
}
void ArsanoMeetup2::onEntrance() {
- // We use 1, 2, 3 because those are dialog status and not "real" _shown
+ // We don't use the enum because those are dialog status and not "real" _shown
switch (_shown[kMaxSection - 1]) {
case 1:
_gm->shipStart();
break;
case 2:
- _vm->renderMessage("Alle Raumschiffe haben|den Planeten verlassen."); // All spaceships have left the planet
+ _vm->renderMessage(kStringArsanoMeetup2_1); // All spaceships have left the planet
break;
case 3:
- _vm->renderMessage("Alle Raumschiffe haben den Planeten|verlassen, bis auf eins ..."); // All spaceships have left the planet, except one ...
+ _vm->renderMessage(kStringArsanoMeetup2_2); // All spaceships have left the planet, except one ...
}
_shown[kMaxSection - 1] = 0;
}
@@ -2158,13 +2157,13 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
_vm->paletteBrightness();
bool found;
if (_gm->_rooms[MEETUP2]->isSectionVisible(kMaxSection - 2)) {
- _gm->reply("Was wollen Sie denn schon wieder?", 1, 1 + 128);
+ _gm->reply(kStringArsanoMeetup2_3, 1, 1 + 128);
found = !_gm->dialog(2, nullptr, nullptr, 0); // row4, dialog4
if (!(found))
- _gm->reply("Nein.", 1, 1 + 128);
+ _gm->reply(kStringArsanoMeetup2_4, 1, 1 + 128);
} else {
- _gm->reply("Haben Sie zuf\204llig meine Brieftasche gesehen?|Ich mu\341 Sie irgendwo verloren haben.", 1, 1 + 128);
- _gm->reply("Ohne die Brieftasche kann ich nicht|starten, weil meine Keycard darin ist.", 1, 1 + 128);
+ _gm->reply(kStringArsanoMeetup2_5, 1, 1 + 128);
+ _gm->reply(kStringArsanoMeetup2_6, 1, 1 + 128);
found = !_gm->dialog(2, nullptr, nullptr, 0); // row1, dialog1
_gm->_rooms[MEETUP2]->setSectionVisible(kMaxSection - 2, true);
}
@@ -2172,15 +2171,15 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(3));
_gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(7));
_gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(8));
- _gm->reply("Oh! Vielen Dank.", 1, 1 + 128);
- _gm->reply("Wo ist denn Ihr Raumschiff?|Soll ich Sie ein St\201ck mitnehmen?", 1, 1 + 128);
+ _gm->reply(kStringArsanoMeetup2_7, 1, 1 + 128);
+ _gm->reply(kStringArsanoMeetup2_8, 1, 1 + 128);
bool flight = _gm->dialog(2, nullptr, nullptr, 0); // row2, dialog2
if (flight) {
- _gm->reply("Wo wollen Sie denn hin?", 1, 1 + 128);
+ _gm->reply(kStringArsanoMeetup2_9, 1, 1 + 128);
_gm->dialog(4, nullptr, nullptr, 0); // row3, dialog3
- _gm->reply("Ok, steigen Sie ein!", 1, 1 + 128);
+ _gm->reply(kStringArsanoMeetup2_10, 1, 1 + 128);
} else {
- _gm->reply("Wie Sie wollen.", 1, 1 + 128);
+ _gm->reply(kStringArsanoMeetup2_11, 1, 1 + 128);
}
_gm->changeRoom(MEETUP2);
_gm->_rooms[MEETUP2]->setSectionVisible(12, false);
@@ -2221,7 +2220,7 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderImage(11, 0);
_vm->paletteFadeIn();
_gm->wait2(18);
- _vm->renderMessage("Huch, du lebst ja noch!");
+ _vm->renderMessage(kStringArsanoMeetup2_12);
_gm->great(0);
_gm->mouseWait(_gm->_timer1);
_vm->removeMessage();
@@ -2239,7 +2238,7 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
_gm->changeRoom(MEETUP2);
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KEYCARD_R, SPACESHIP))
- _vm->renderMessage("Das w\201rde ich jetzt nicht tun, schlie\341lich|steht Roger W. neben seinem Schiff.");
+ _vm->renderMessage(kStringArsanoMeetup2_13);
else
return false;
@@ -2270,67 +2269,67 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
_gm->wait2(6);
_vm->renderImage(36, 4);
_vm->playSound(kAudioGunShot);
- // TODO: wait until audio finshed playing
+ // TODO: wait until audio finished playing
_vm->renderImage(36, 5);
_gm->wait2(3);
_vm->renderImage(36, 4);
_vm->playSound(kAudioGunShot);
- // TODO: wait until audio finshed playing
+ // TODO: wait until audio finished playing
_vm->renderImage(36, 5);
_vm->paletteFadeOut();
_gm->wait2(12);
_vm->renderImage(0, 0);
_vm->paletteFadeIn();
_gm->wait2(18);
- _gm->reply("Ich glaube, er wacht auf.", 2, 2 + 128);
+ _gm->reply(kStringArsanoMeetup3_1, 2, 2 + 128);
_gm->wait2(10);
- _gm->reply("Ja, sieht so aus.", 1, 1 + 128);
+ _gm->reply(kStringArsanoMeetup3_2, 1, 1 + 128);
do {
int i = _gm->dialog(4, nullptr, nullptr, 2); // row2, dialog2
switch (i) {
case 0:
- _gm->reply("Sie befinden sich im Raumschiff \"Dexxa\".", 1, 1 + 128);
- _gm->reply("Wir kommen vom Planeten Axacuss und|sind aus dem gleichen Grund hier wie Sie,|nmlich zur Erforschung der Supernova.", 1, 1 + 128);
+ _gm->reply(kStringArsanoMeetup3_3, 1, 1 + 128);
+ _gm->reply(kStringArsanoMeetup3_4, 1, 1 + 128);
break;
case 1:
- _gm->reply("Sie k\224nnen beruhigt sein, wir wollen Ihnen nur helfen.", 2, 2 + 128);
- _gm->say("Und wieso hat der Typ im Raumanzug|eben auf mich geschossen?");
- _gm->reply("Das war eine Schreckreaktion.", 2, 2 + 128);
- _gm->reply("Schlie\341lich ist es f\201r uns das erste Mal,|da\341 wir auf eine fremde Intelligenz treffen.", 2, 2 + 128);
- _gm->reply("Wie wir festgestellt haben, ist|Ihr Raumschiff v\224llig zerst\224rt.", 2, 2 + 128);
- _gm->reply("Wahrscheinlich k\224nnen Sie nicht|mehr auf ihren Heimatplaneten zur\201ck.", 2, 2 + 128);
- _gm->reply("Wir bieten Ihnen an, Sie|mit nach Axacuss zu nehmen.", 2, 2 + 128);
+ _gm->reply(kStringArsanoMeetup3_5, 2, 2 + 128);
+ _gm->say(kStringArsanoMeetup3_6);
+ _gm->reply(kStringArsanoMeetup3_7, 2, 2 + 128);
+ _gm->reply(kStringArsanoMeetup3_8, 2, 2 + 128);
+ _gm->reply(kStringArsanoMeetup3_9, 2, 2 + 128);
+ _gm->reply(kStringArsanoMeetup3_10, 2, 2 + 128);
+ _gm->reply(kStringArsanoMeetup3_11, 2, 2 + 128);
if (_gm->dialog(2, nullptr, nullptr, 0)) { // row3, dialog3
- _gm->reply("Sind Sie sich da wirklich sicher?", 2, 2 + 128);
- _gm->say("Wenn ich es mir genau \201berlege,|fliege ich doch lieber mit.");
+ _gm->reply(kStringArsanoMeetup3_12, 2, 2 + 128);
+ _gm->say(kStringArsanoMeetup3_13);
}
- _gm->reply("Gut, wir nehmen Sie unter der|Bedingung mit, da\341 wir Sie jetzt|sofort in Tiefschlaf versetzen d\201rfen.", 2, 2 + 128);
- _gm->reply("Diese Art des Reisens ist Ihnen|ja scheinbar nicht unbekannt.", 2, 2 + 128);
- _gm->reply("Sie werden in vier Jahren nach der|Landung der \"Dexxa\" wieder aufgeweckt.", 2, 2 + 128);
- _gm->reply("Sind Sie damit einverstanden?", 2, 2 + 128);
+ _gm->reply(kStringArsanoMeetup3_14, 2, 2 + 128);
+ _gm->reply(kStringArsanoMeetup3_15, 2, 2 + 128);
+ _gm->reply(kStringArsanoMeetup3_16, 2, 2 + 128);
+ _gm->reply(kStringArsanoMeetup3_17, 2, 2 + 128);
if (_gm->dialog(2, nullptr, nullptr, 0)) { // row3, dialog3
- _gm->reply("Sind Sie sich da wirklich sicher?", 2, 2 + 128);
- _gm->say("Wenn ich es mir genau \201berlege,|fliege ich doch lieber mit.");
+ _gm->reply(kStringArsanoMeetup3_12, 2, 2 + 128);
+ _gm->say(kStringArsanoMeetup3_13);
}
- _gm->reply("Gut, haben Sie noch irgendwelche Fragen?", 2, 2 + 128);
+ _gm->reply(kStringArsanoMeetup3_18, 2, 2 + 128);
break;
case 2:
- _gm->reply("Keine Panik!", 2, 2 + 128);
- _gm->reply("Wir tun Ihnen nichts.", 2, 2 + 128);
+ _gm->reply(kStringArsanoMeetup3_19, 2, 2 + 128);
+ _gm->reply(kStringArsanoMeetup3_20, 2, 2 + 128);
break;
case 3:
- _gm->reply("Wir sprechen nicht ihre Sprache,|sondern Sie sprechen unsere.", 1, 1 + 128);
- _gm->reply("Nach einer Gehirnanalyse konnten|wir Ihr Gehirn an unsere Sprache anpassen.", 1, 1 + 128);
- _gm->say("Was? Sie haben in mein Gehirn eingegriffen?");
- _gm->reply("Keine Angst, wir haben sonst nichts ver\204ndert.", 1, 1 + 128);
- _gm->reply("Ohne diesen Eingriff w\204ren|Sie verloren gewesen.", 1, 1 + 128);
+ _gm->reply(kStringArsanoMeetup3_21, 1, 1 + 128);
+ _gm->reply(kStringArsanoMeetup3_22, 1, 1 + 128);
+ _gm->say(kStringArsanoMeetup3_23);
+ _gm->reply(kStringArsanoMeetup3_24, 1, 1 + 128);
+ _gm->reply(kStringArsanoMeetup3_25, 1, 1 + 128);
}
_gm->removeSentence(2, 2);
} while (_shown[kMaxSection - 2] != 15);
- _gm->say("Ich habe keine weiteren Fragen mehr.");
- _gm->reply("Gut, dann versetzen wir Sie jetzt in Tiefschlaf.", 1, 1 + 128);
- _gm->reply("Gute Nacht!", 1, 1 + 128);
+ _gm->say(kStringArsanoMeetup3_26);
+ _gm->reply(kStringArsanoMeetup3_27, 1, 1 + 128);
+ _gm->reply(kStringArsanoMeetup3_28, 1, 1 + 128);
_vm->paletteFadeOut();
_gm->_inventory.clear();
_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(1)); // Knife
@@ -2348,7 +2347,7 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
void AxacussCell::onEntrance() {
if (_gm->_state._dream) {
- _vm->renderMessage("Du wachst auf und findest dich in|einem geschlossenen Raum wieder.");
+ _vm->renderMessage(kStringAxacussCell_1);
_gm->_state._time = ticksToMsec(500000);
_gm->_state._alarmOn = (_gm->_state._timeAlarm > _gm->_state._time);
_gm->_state._powerOff = false;
@@ -2423,7 +2422,7 @@ void AxacussCell::animation() {
bool AxacussCell::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_PRESS) && (obj1._id == CELL_BUTTON))
- _vm->renderMessage("Du dr\201ckst den Knopf,|aber nichts passiert.");
+ _vm->renderMessage(kStringAxacussCell_2);
else if ((verb == ACTION_PULL) && (obj1._id == CELL_WIRE) &&
!isSectionVisible(2) &&
!isSectionVisible(3) &&
@@ -2498,7 +2497,7 @@ bool AxacussCell::interact(Action verb, Object &obj1, Object &obj2) {
_gm->drawImage(_gm->invertSection(5));
_gm->takeObject(obj1);
} else {
- _vm->renderMessage("Das ist befestigt.");
+ _vm->renderMessage(kStringAxacussCell_3);
}
} else if ((verb == ACTION_WALK) && (obj1._id == CELL_DOOR) &&
(obj1.hasProperty(OPENED))) {
@@ -2508,14 +2507,14 @@ bool AxacussCell::interact(Action verb, Object &obj1, Object &obj2) {
// TODO: wait till sound is played
_vm->playSound(kAudioGunShot);
_vm->playSound(kAudioGunShot);
- _gm->dead("Bei deinem Fluchtversuch hat|dich der Roboter erschossen.");
+ _gm->dead(kStringAxacussCell_4);
} else if ((verb == ACTION_USE) && (obj1._id == TRAY))
- _vm->renderMessage("Du i\341t etwas, aber|es schmeckt scheu\341lich.");
+ _vm->renderMessage(kStringAxacussCell_5);
else if ((verb == ACTION_TAKE) && (obj1._id == MAGNET)) {
if (isSectionVisible(6))
_gm->shock();
_gm->takeObject(obj1);
- _vm->renderMessage("Ok.");
+ _vm->renderMessage(kStringOk);
} else
return false;
Commit: 49e3dd5864b59fdd966de382a74d4ed1044d0d21
https://github.com/scummvm/scummvm/commit/49e3dd5864b59fdd966de382a74d4ed1044d0d21
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:35Z
Commit Message:
SUPERNOVA: Update English translation
Changed paths:
devtools/create_supernova/strings-en.po
diff --git a/devtools/create_supernova/strings-en.po b/devtools/create_supernova/strings-en.po
index ae4eec7..3938962 100644
--- a/devtools/create_supernova/strings-en.po
+++ b/devtools/create_supernova/strings-en.po
@@ -8,12 +8,12 @@ msgstr ""
"Project-Id-Version: Mission Supernova 1.0\n"
"Report-Msgid-Bugs-To: scummvm-devel at lists.scummvm.org\n"
"POT-Creation-Date: 2017-07-21 23:49+0100\n"
-"PO-Revision-Date: 2017-10-10 22:14+0000\n"
+"PO-Revision-Date: 2017-10-17 15:53+0000\n"
"Last-Translator: Thierry Crozat <criezy at scummvm.org>\n"
"Language-Team: none\n"
"Language: en\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Type: text/plain; charset=CP850\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 2.9\n"
@@ -1449,580 +1449,603 @@ msgstr ""
#: ../../msn/msn_r2.c:249
msgid "Fragen Sie nicht so doof!"
-msgstr ""
+msgstr "Quit asking so stupidly!"
#: ../../msn/msn_r2.c:262
msgid "Das wrde ich an ihrer|Stelle nicht versuchen!"
-msgstr ""
+msgstr "I would not try that if I were you!"
#: ../../msn/msn_r2.c:300
msgid "Du ziehst deine Schuhe|aus und legst sie in|eins der Schlieáfcher."
-msgstr ""
+msgstr "You remove your shoes|and put them in one|of the lockers."
#: ../../msn/msn_r2.c:307
msgid "Du ziehst deine Schuhe wieder an."
-msgstr ""
+msgstr "You put your shoes on again."
#: ../../msn/msn_r2.c:311
msgid ""
"Du durchsuchst die Klos nach|anderen brauchbaren Sachen,|findest aber nichts."
-msgstr ""
+msgstr "You search the toilet|for other useful items,|but find nothing."
#: ../../msn/msn_r2.c:316
msgid "Bevor du aufs Klo gehst,|solltest du besser deinen|Raumanzug ausziehen."
-msgstr ""
+msgstr "Before you use the toilet,| you had better take off|your space suit."
#: ../../msn/msn_r2.c:319
msgid "Du gehst seit sieben Jahren das|erste Mal wieder aufs Klo!"
-msgstr ""
+msgstr "You're now back in a lavatory,|for the first time in seven years!"
#: ../../msn/msn_r2.c:322
msgid ""
"In einem der Schlieáfcher,|die sich auch im Raum befinden,|findest du "
"einige Mnzen."
-msgstr ""
+msgstr "In one of the lockers in this room,|you will find some coins."
#: ../../msn/msn_r2.c:332
msgid "Mach doch zuerst das Fach leer!"
-msgstr ""
+msgstr "First, empty the drawer!"
#: ../../msn/msn_r2.c:340
msgid "Mnze"
-msgstr ""
+msgstr "Coin"
#: ../../msn/msn_r2.c:353
msgid ""
"Komisch! Auf einmal kannst du|das Schild lesen! Darauf steht:|\"Zutritt nur "
"fr Personal\"."
msgstr ""
+"Strange! Suddenly you can |read the sign! It states:|\"Access Only for "
+"Personnel\"."
#: ../../msn/msn_r2.c:361
msgid ""
"Komisch! Auf einmal kannst|du das Schild lesen!|Darauf steht:\"Toilette\"."
-msgstr ""
+msgstr "Strange! Suddenly you can read the sign!|It says:\"Toilet\"."
#: ../../msn/msn_r2.c:362
msgid "Darauf steht:|\"Toilette\"."
-msgstr ""
+msgstr "It says:|\"Toilet\"."
#: ../../msn/msn_r2.c:372
msgid "Du ziehst den Raumanzug wieder an."
-msgstr ""
+msgstr "You put the space suit back on."
#: ../../msn/msn_r2.c:382 ../../msn/msn_r3.c:488 ../../msn/msn_r3.c:540
msgid "Nicht so gewaltttig!"
-msgstr ""
+msgstr "Not so rough!"
#: ../../msn/msn_r2.c:603
msgid ""
"Du hast das komische Gefhl,|daá drauáen etwas passiert,|und eilst zum "
"Restaurant."
msgstr ""
+"You get the funny feeling,|that something has happened outside,|and hurry to "
+"the restaurant."
#: ../../msn/msn_r2.c:617
msgid "Da! Die Supernova!"
-msgstr ""
+msgstr "There! The Supernova!"
#: ../../msn/msn_r2.c:630
msgid "Zwei Minuten spter ..."
-msgstr ""
+msgstr "Two minutes later ..."
#: ../../msn/msn_r2.c:638
msgid "Hey, was machen Sie in meinem Raumschiff?!"
-msgstr ""
+msgstr "Hey, what are you doing in my spaceship?!"
#: ../../msn/msn_r2.c:641
msgid "Geben Sie mir sofort meine Brieftasche wieder!"
-msgstr ""
+msgstr "Just give me my wallet back!"
#: ../../msn/msn_r2.c:644
msgid "Versuchen Sie das ja nicht nochmal!"
-msgstr ""
+msgstr "Do not try that again!"
#: ../../msn/msn_r2.c:647
msgid "Und jetzt raus mit Ihnen!"
-msgstr ""
+msgstr "And now, get out of here!"
#: ../../msn/msn_r2.c:660
msgid "Zehn Minuten spter ..."
-msgstr ""
+msgstr "Ten Minutes later ..."
#: ../../msn/msn_r2.c:690
msgid "Knnten Sie mir ein Gericht empfehlen?"
-msgstr ""
+msgstr "Could you recommend a dish for me?"
#: ../../msn/msn_r2.c:691
msgid "Wie lange dauert es denn noch bis zur Supernova?"
-msgstr ""
+msgstr "How long does it take to reach the Supernova?"
#: ../../msn/msn_r2.c:692
msgid "Sie kommen mir irgendwie bekannt vor."
-msgstr ""
+msgstr "You look kind of familiar to me."
#: ../../msn/msn_r2.c:704
msgid "Hey, Witzkeks, laá die Brieftasche da liegen!"
-msgstr ""
+msgstr "Hey, Joker, leave the Wallet there!"
#: ../../msn/msn_r2.c:708
msgid "Das ist nicht deine."
-msgstr ""
+msgstr "This is not yours."
#: ../../msn/msn_r2.c:713
msgid "Roger ist im Moment nicht ansprechbar."
-msgstr ""
+msgstr "Roger is not available at the moment."
#: ../../msn/msn_r2.c:718
msgid "Bestellen Sie lieber nichts!"
-msgstr ""
+msgstr "Do Not order anything!"
#: ../../msn/msn_r2.c:719
msgid ""
"Ich habe vor zwei Stunden mein Essen|bestellt und immer noch nichts bekommen."
-msgstr ""
+msgstr "I ordered my food two hours ago|and I still haven't received it."
#: ../../msn/msn_r2.c:721
msgid "Noch mindestens zwei Stunden."
-msgstr ""
+msgstr "At least two more hours."
#: ../../msn/msn_r2.c:722
msgid ""
"Haben Sie keine Idee, womit wir uns|bis dahin die Zeit vertreiben knnen?"
-msgstr ""
+msgstr "Don't you have an idea|that can help pass the time?"
#: ../../msn/msn_r2.c:723
msgid ""
"Hmm ... im Moment fllt mir nichts ein, aber vielleicht|hat der Spieler des "
"Adventures ja eine Idee."
msgstr ""
+"Hmm ... at the moment I'm not sure,|but maybe the Adventure Game Player has "
+"an idea."
#: ../../msn/msn_r2.c:725
msgid "Nein, Sie mssen sich irren.|Ich kenne Sie jedenfalls nicht."
-msgstr ""
+msgstr "No, you must be mistaken.|I don't know you."
#: ../../msn/msn_r2.c:726
msgid "Aber ihre Kleidung habe ich irgendwo schon mal gesehen."
-msgstr ""
+msgstr "However, I've seen your clothes somewhere before."
#: ../../msn/msn_r2.c:727
msgid "Ja? Komisch."
-msgstr ""
+msgstr "Yes? Strange."
#: ../../msn/msn_r2.c:728
msgid "Jetzt weiá ich's. Sie sind Roger W. !"
-msgstr ""
+msgstr "Now I know. You are Roger W.!"
#: ../../msn/msn_r2.c:729
msgid "Pssst, nicht so laut, sonst will|gleich jeder ein Autogramm von mir."
-msgstr ""
+msgstr "Pssst, not so loud, otherwise|everyone will want an autograph from me."
#: ../../msn/msn_r2.c:730
msgid ""
"Ich habe extra eine Maske auf, damit|ich nicht von jedem angelabert werde."
-msgstr ""
+msgstr "I have an extra mask on so I don't get yakked on by everyone."
#: ../../msn/msn_r2.c:731
msgid "h ... ach so."
-msgstr ""
+msgstr "Uh... I see."
#: ../../msn/msn_r2.c:732
msgid "Wann kommt denn das nchste SQ-Abenteuer raus?"
-msgstr ""
+msgstr "When does the next SQ adventure come out?"
#: ../../msn/msn_r2.c:733
msgid "SQ 127 máte in einem Monat erscheinen."
-msgstr ""
+msgstr "SQ 127 should come out in a month."
#: ../../msn/msn_r2.c:734
msgid "Was, Teil 127 ??"
-msgstr ""
+msgstr "What, part 127 ??"
#: ../../msn/msn_r2.c:735
msgid "Bei uns ist gerade Teil 8 erschienen."
-msgstr ""
+msgstr "We have just released part 8."
#: ../../msn/msn_r2.c:736
msgid "Hmm ... von welchem Planeten sind Sie denn?"
-msgstr ""
+msgstr "Hmm ... what planet are you from?"
#: ../../msn/msn_r2.c:737
msgid "Von der Erde."
-msgstr ""
+msgstr "From the Earth."
#: ../../msn/msn_r2.c:738
msgid "Erde? Nie gehrt."
-msgstr ""
+msgstr "Earth? Never heard of it."
#: ../../msn/msn_r2.c:739
msgid ""
"Wahrscheinlich irgendein Kaff, wo Neuerungen|erst hundert Jahre spter "
"hingelangen."
-msgstr ""
+msgstr "Probably some Dump, where innovations happen|only a century late."
#: ../../msn/msn_r2.c:740
msgid "h ... kann sein."
-msgstr ""
+msgstr "Uh ... maybe."
#: ../../msn/msn_r2.c:741
msgid "Aber eins mssen Sie mir erklren!"
-msgstr ""
+msgstr "But you must tell me!"
#: ../../msn/msn_r2.c:742
msgid ""
"Wieso sehen Sie mir so verdammt hnlich, wenn|Sie nicht von Xenon stammen, "
"wie ich?"
msgstr ""
+"Why do you look so damn similar to me|if you are not from Xenon, like me?"
#: ../../msn/msn_r2.c:743
msgid ""
"Keine Ahnung. Bis jetzt dachte ich immer, Sie wren ein|von Programmierern "
"auf der Erde erfundenes Computersprite."
msgstr ""
+"I have no idea. Until now, I've always thought you were|a computer sprite, "
+"invented by programmers on Earth."
#: ../../msn/msn_r2.c:744
msgid "Was? Lachhaft!"
-msgstr ""
+msgstr "What? Ridiculous!"
#: ../../msn/msn_r2.c:745
+#, fuzzy
msgid "Wie erklren Sie sich dann,|daá ich ihnen gegenbersitze?"
-msgstr ""
+msgstr "How do you explain then|that I am seated opposite you?"
#: ../../msn/msn_r2.c:746
msgid "Ja, das ist in der Tat seltsam."
-msgstr ""
+msgstr "Yes, this is definitely strange."
#: ../../msn/msn_r2.c:747
msgid ""
"Halt, jetzt weiá ich es. Sie sind von der Konkurrenz,|von \"Georgefilm Games"
"\" und wollen mich verunsichern."
msgstr ""
+"Wait, now I understand! You are from the competition,|\"Georgefilm Games\", "
+"and want to unnerve me."
#: ../../msn/msn_r2.c:748
msgid "Nein, ich bin nur ein Ahnungsloser Koch von der Erde."
-msgstr ""
+msgstr "No, I'm just a clueless cook from the Earth."
#: ../../msn/msn_r2.c:749
+#, fuzzy
msgid ""
"Na gut, ich glaube Ihnen. Lassen wir jetzt|dieses Thema, langsam wird es mir "
"zu bunt!"
msgstr ""
+"All right, I believe you. Let's drop this subject, it slowly becomes "
+"colorful to me!"
#: ../../msn/msn_r2.c:761
msgid "Eine Partie Schach! Das ist eine gute Idee."
-msgstr ""
+msgstr "A game of chess! That's a good idea."
#: ../../msn/msn_r2.c:762
msgid "Schach? Was ist das denn?"
-msgstr ""
+msgstr "Chess? What is that?"
#: ../../msn/msn_r2.c:763
msgid "Schach ist ein interessantes Spiel.|Ich werde es Ihnen erklren."
-msgstr ""
+msgstr "Chess is an interesting game.|I will explain it to you."
#: ../../msn/msn_r2.c:769
msgid "Knapp zwei Stunden spter ..."
-msgstr ""
+msgstr "Almost two hours later ..."
#: ../../msn/msn_r2.c:787
msgid "Roger W. steht kurz vor dem Schachmatt|und grbelt nach einem Ausweg."
-msgstr ""
+msgstr "Roger W. is on the brink of checkmate|and trying to find a way out."
#: ../../msn/msn_r2.c:831
msgid "Darf ich hier Platz nehmen?"
-msgstr ""
+msgstr "Can I sit here?"
#: ../../msn/msn_r2.c:832
msgid "Klar!"
-msgstr ""
+msgstr "Sure!"
#: ../../msn/msn_r2.c:892
msgid "Du tippst auf den Tasten herum,|aber es passiert nichts."
-msgstr ""
+msgstr "You tap the buttons,|but nothing happens."
#: ../../msn/msn_r2.c:917
+#, fuzzy
msgid "Ach, Ihnen gehrt die. Ich habe sie eben im Sand gefunden."
-msgstr ""
+msgstr "Oh, they are yours. I just found them in the sand."
#: ../../msn/msn_r2.c:918
msgid "Nein, tut mir leid."
-msgstr ""
+msgstr "No, I'm sorry."
#: ../../msn/msn_r2.c:924
msgid "Nein, danke. Ich bleibe lieber hier."
-msgstr ""
+msgstr "No thanks. I'd rather stay here."
#: ../../msn/msn_r2.c:925
msgid "Ja, das wre gut."
-msgstr ""
+msgstr "Yes, that would be good."
#: ../../msn/msn_r2.c:931
msgid "Zur Erde."
-msgstr ""
+msgstr "To Earth."
#: ../../msn/msn_r2.c:932
msgid "Zum Prsident der Galaxis."
-msgstr ""
+msgstr "To the President of the Galaxy."
#: ../../msn/msn_r2.c:933
msgid "Nach Xenon."
-msgstr ""
+msgstr "To Xenon."
#: ../../msn/msn_r2.c:934
msgid "Mir egal, setzen Sie mich irgendwo ab!"
-msgstr ""
+msgstr "I don't care, drop me off somewhere!"
#: ../../msn/msn_r2.c:940
msgid "Ich habe gerade Ihre Brieftasche gefunden!"
-msgstr ""
+msgstr "I just found your wallet!"
#: ../../msn/msn_r2.c:941
+#, fuzzy
msgid "Sie lag da drben hinter einem Felsen."
-msgstr ""
+msgstr "It was over there behind a rock."
#: ../../msn/msn_r2.c:942
msgid "Ich wollte nur wissen, ob Sie die Brieftasche wiederhaben."
-msgstr ""
+msgstr "I just wanted to know if you got the wallet back."
#: ../../msn/msn_r2.c:959
msgid "Was wollen Sie denn schon wieder?"
-msgstr ""
+msgstr "What do you want again?"
#: ../../msn/msn_r2.c:965
msgid ""
"Haben Sie zufllig meine Brieftasche gesehen?|Ich muá Sie irgendwo verloren "
"haben."
-msgstr ""
+msgstr "Have you seen my wallet, by chance?|I must have lost it somewhere."
#: ../../msn/msn_r2.c:966
msgid ""
"Ohne die Brieftasche kann ich nicht|starten, weil meine Keycard darin ist."
-msgstr ""
+msgstr "Without my wallet I can not take off|because my keycard is in it."
#: ../../msn/msn_r2.c:975
msgid "Oh! Vielen Dank."
-msgstr ""
+msgstr "Oh! Many thanks."
#: ../../msn/msn_r2.c:976
msgid "Wo ist denn Ihr Raumschiff?|Soll ich Sie ein Stck mitnehmen?"
-msgstr ""
+msgstr "Where is your spaceship?|Shall I give you a lift?"
#: ../../msn/msn_r2.c:979
msgid "Wo wollen Sie denn hin?"
-msgstr ""
+msgstr "Where do you want to go?"
#: ../../msn/msn_r2.c:981
msgid "Ok, steigen Sie ein!"
-msgstr ""
+msgstr "Ok, get in!"
#: ../../msn/msn_r2.c:983
msgid "Wie Sie wollen."
-msgstr ""
+msgstr "As you wish."
#: ../../msn/msn_r2.c:1030
msgid "Huch, du lebst ja noch!"
-msgstr ""
+msgstr "Huh, you're still alive!"
#: ../../msn/msn_r2.c:1057
msgid ""
"Das wrde ich jetzt nicht tun, schlieálich|steht Roger W. neben seinem "
"Schiff."
-msgstr ""
+msgstr "I wouldn't do that now, because|Roger W. is standing beside his ship."
#: ../../msn/msn_r2.c:1069
msgid "Alle Raumschiffe haben|den Planeten verlassen."
-msgstr ""
+msgstr "All spaceships|have left the planet."
#: ../../msn/msn_r2.c:1071
msgid "Alle Raumschiffe haben den Planeten|verlassen, bis auf eins ..."
-msgstr ""
+msgstr "All spaceships have left the planet,|except for one ..."
#: ../../msn/msn_r2.c:1083
msgid "Was wollen Sie von mir?"
-msgstr ""
+msgstr "What do you want from me?"
#: ../../msn/msn_r2.c:1084
msgid "Hilfe!!"
-msgstr ""
+msgstr "Help!!"
#: ../../msn/msn_r2.c:1085
msgid "Warum sprechen Sie meine Sprache?"
-msgstr ""
+msgstr "Why do you speak my language?"
#: ../../msn/msn_r2.c:1091
msgid "Ja, ich bin einverstanden."
-msgstr ""
+msgstr "Yes, I agree."
#: ../../msn/msn_r2.c:1092
msgid "Nein, lieber bleibe ich hier, als mit Ihnen zu fliegen."
-msgstr ""
+msgstr "No, I'd rather stay here than fly with you."
#: ../../msn/msn_r2.c:1141
msgid "Ich glaube, er wacht auf."
-msgstr ""
+msgstr "I think he's waking up."
#: ../../msn/msn_r2.c:1143
msgid "Ja, sieht so aus."
-msgstr ""
+msgstr "Yes, it looks like it."
#: ../../msn/msn_r2.c:1148
msgid "Sie befinden sich im Raumschiff \"Dexxa\"."
-msgstr ""
+msgstr "You are in the spaceship \"Dexxa\"."
#: ../../msn/msn_r2.c:1149
msgid ""
"Wir kommen vom Planeten Axacuss und|sind aus dem gleichen Grund hier wie "
"Sie,|nmlich zur Erforschung der Supernova."
msgstr ""
+"We come from the planet Axacuss|and are here for the same reason as you,|"
+"namely, to investigate the Supernova."
#: ../../msn/msn_r2.c:1151
msgid "Sie knnen beruhigt sein, wir wollen Ihnen nur helfen."
-msgstr ""
+msgstr "Don't worry, we just want to help you."
#: ../../msn/msn_r2.c:1152
msgid "Und wieso hat der Typ im Raumanzug|eben auf mich geschossen?"
-msgstr ""
+msgstr "And why did the guy in the spacesuit|shoot at me?"
#: ../../msn/msn_r2.c:1153
msgid "Das war eine Schreckreaktion."
-msgstr ""
+msgstr "It was a reflex."
#: ../../msn/msn_r2.c:1154
msgid ""
"Schlieálich ist es fr uns das erste Mal,|daá wir auf eine fremde "
"Intelligenz treffen."
msgstr ""
+"After all, this is the first time we have|come across an alien intelligence."
#: ../../msn/msn_r2.c:1155
msgid "Wie wir festgestellt haben, ist|Ihr Raumschiff vllig zerstrt."
-msgstr ""
+msgstr "As we've established, your spaceship|is completely destroyed."
#: ../../msn/msn_r2.c:1156
msgid "Wahrscheinlich knnen Sie nicht|mehr auf ihren Heimatplaneten zurck."
-msgstr ""
+msgstr "You may not be able to return to your home planet."
#: ../../msn/msn_r2.c:1157
msgid "Wir bieten Ihnen an, Sie|mit nach Axacuss zu nehmen."
-msgstr ""
+msgstr "We offer to take you|with us to Axacuss."
#: ../../msn/msn_r2.c:1160 ../../msn/msn_r2.c:1169
msgid "Sind Sie sich da wirklich sicher?"
-msgstr ""
+msgstr "Are you really sure about that?"
#: ../../msn/msn_r2.c:1161 ../../msn/msn_r2.c:1170
msgid "Wenn ich es mir genau berlege,|fliege ich doch lieber mit."
-msgstr ""
+msgstr "If I think about it,|I'd rather fly with you."
#: ../../msn/msn_r2.c:1163
msgid ""
"Gut, wir nehmen Sie unter der|Bedingung mit, daá wir Sie jetzt|sofort in "
"Tiefschlaf versetzen drfen."
msgstr ""
+"All right, we'll take you with us|on condition that we can put you|into a "
+"deep sleep right now."
#: ../../msn/msn_r2.c:1164
msgid "Diese Art des Reisens ist Ihnen|ja scheinbar nicht unbekannt."
-msgstr ""
+msgstr "You seem to be familiar with|this kind of traveling."
#: ../../msn/msn_r2.c:1165
msgid ""
"Sie werden in vier Jahren nach der|Landung der \"Dexxa\" wieder aufgeweckt."
msgstr ""
+"You will be woken up again in four years|after the \"Dexxa\" has landed."
#: ../../msn/msn_r2.c:1166
msgid "Sind Sie damit einverstanden?"
-msgstr ""
+msgstr "Are you okay with this?"
#: ../../msn/msn_r2.c:1172
msgid "Gut, haben Sie noch irgendwelche Fragen?"
-msgstr ""
+msgstr "Good, do you have any questions?"
#: ../../msn/msn_r2.c:1174
msgid "Keine Panik!"
-msgstr ""
+msgstr "Don't panic!"
#: ../../msn/msn_r2.c:1175
msgid "Wir tun Ihnen nichts."
-msgstr ""
+msgstr "We are not going to hurt you."
#: ../../msn/msn_r2.c:1177
msgid "Wir sprechen nicht ihre Sprache,|sondern Sie sprechen unsere."
-msgstr ""
+msgstr "We don't speak your language,|you speak ours."
#: ../../msn/msn_r2.c:1178
msgid ""
"Nach einer Gehirnanalyse konnten|wir Ihr Gehirn an unsere Sprache anpassen."
-msgstr ""
+msgstr "After a brain analysis, we were able|to adapt your brain to our speech."
#: ../../msn/msn_r2.c:1179
msgid "Was? Sie haben in mein Gehirn eingegriffen?"
-msgstr ""
+msgstr "What? You've interfered with my brain?"
#: ../../msn/msn_r2.c:1180
msgid "Keine Angst, wir haben sonst nichts verndert."
-msgstr ""
+msgstr "Don't worry, we haven't changed anything else."
#: ../../msn/msn_r2.c:1181
msgid "Ohne diesen Eingriff wren|Sie verloren gewesen."
-msgstr ""
+msgstr "Without this intervention,|you would have been lost."
#: ../../msn/msn_r2.c:1186
msgid "Ich habe keine weiteren Fragen mehr."
-msgstr ""
+msgstr "I have no more questions."
#: ../../msn/msn_r2.c:1187
msgid "Gut, dann versetzen wir Sie jetzt in Tiefschlaf."
-msgstr ""
+msgstr "Good, let's put you in a deep sleep now."
#: ../../msn/msn_r2.c:1188
msgid "Gute Nacht!"
-msgstr ""
+msgstr "Good night!"
#: ../../msn/msn_r2.c:1213 ../../msn/msn_r2.c:1214
msgid "Stein"
-msgstr ""
+msgstr "Stone"
#: ../../msn/msn_r2.c:1215
msgid "Loch"
-msgstr ""
+msgstr "Opening"
#: ../../msn/msn_r2.c:1215
msgid "Es scheint eine Hhle zu sein."
-msgstr ""
+msgstr "It seems to be a cave."
#: ../../msn/msn_r2.c:1221
msgid "Hier bist du gerade hergekommen."
-msgstr ""
+msgstr "You just came from there."
#: ../../msn/msn_r2.c:1229 ../../msn/msn_r2.c:1310 ../../msn/msn_r2.c:1319
msgid "Hhle"
-msgstr ""
+msgstr "Cave"
#: ../../msn/msn_r2.c:1230 ../../msn/msn_r2.c:1243 ../../msn/msn_r2.c:1257
#: ../../msn/msn_r3.c:1691
msgid "Schild"
-msgstr ""
+msgstr "Sign"
#: ../../msn/msn_r2.c:1230 ../../msn/msn_r2.c:1243 ../../msn/msn_r2.c:1257
msgid "Diese Schrift kannst du nicht lesen."
-msgstr ""
+msgstr "You cannot read these inscriptions."
#: ../../msn/msn_r2.c:1231
msgid "Eingang"
-msgstr ""
+msgstr "Entrance"
#: ../../msn/msn_r2.c:1232 ../../msn/msn_r2.c:1318
msgid "Stern"
-msgstr ""
+msgstr "Star"
#: ../../msn/msn_r2.c:1233 ../../msn/msn_r2.c:1234 ../../msn/msn_r2.c:1309
msgid "Raumschiff"
-msgstr ""
+msgstr "Spaceship"
#: ../../msn/msn_r2.c:1240
msgid "Portier"
-msgstr ""
+msgstr "Doorman"
#: ../../msn/msn_r2.c:1240
msgid "Du siehst doch selbst, wie er aussieht."
-msgstr ""
+msgstr "You can see for yourself what he looks like."
#: ../../msn/msn_r2.c:1242 ../../msn/msn_r3.c:1484 ../../msn/msn_r3.c:1549
#: ../../msn/msn_r3.c:1564 ../../msn/msn_r3.c:1573 ../../msn/msn_r3.c:1584
@@ -2032,211 +2055,216 @@ msgstr ""
#: ../../msn/msn_r3.c:1648 ../../msn/msn_r3.c:1660 ../../msn/msn_r3.c:1671
#: ../../msn/msn_r3.c:1692
msgid "Tr"
-msgstr ""
+msgstr "Door"
#: ../../msn/msn_r2.c:1245
msgid "Kaugummi"
-msgstr ""
+msgstr "Chewing gum"
#: ../../msn/msn_r2.c:1246
msgid "Gummibrchen"
-msgstr ""
+msgstr "Gummy bear"
#: ../../msn/msn_r2.c:1247
msgid "Schokokugel"
-msgstr ""
+msgstr "Chocolate ball"
#: ../../msn/msn_r2.c:1248
msgid "berraschungsei"
-msgstr ""
+msgstr "Surprise egg"
#: ../../msn/msn_r2.c:1249
msgid "Lakritz"
-msgstr ""
+msgstr "Liquorice"
#: ../../msn/msn_r2.c:1250
msgid "Tablette"
-msgstr ""
+msgstr "Pill"
#: ../../msn/msn_r2.c:1250
msgid ""
"Die Plastikhlle zeigt einen|Mund mit einer Sprechblase. Was|darin steht, "
"kannst du nicht lesen."
msgstr ""
+"The plastic envelope shows|a mouth with a speech bubble.|You can't read what "
+"it says."
#: ../../msn/msn_r2.c:1253
msgid "Automat"
-msgstr ""
+msgstr "Vending machine"
#: ../../msn/msn_r2.c:1253
msgid "Sieht aus wie ein Kaugummiautomat."
-msgstr ""
+msgstr "Looks like a gum dispenser."
#: ../../msn/msn_r2.c:1254
msgid "Die Toiletten sind denen|auf der Erde sehr hnlich."
-msgstr ""
+msgstr "The toilets are very similar|to those on Earth."
#: ../../msn/msn_r2.c:1258 ../../msn/msn_r2.c:1269
msgid "Treppe"
-msgstr ""
+msgstr "Staircase"
#: ../../msn/msn_r2.c:1260
msgid "Mnzen"
-msgstr ""
+msgstr "Coins"
#: ../../msn/msn_r2.c:1260
msgid "Es sind seltsame|Kpfe darauf abgebildet."
-msgstr ""
+msgstr "They have strange|heads on them."
#: ../../msn/msn_r2.c:1262
msgid "Tablettenhlle"
-msgstr ""
+msgstr "Pill envelope"
#: ../../msn/msn_r2.c:1262
msgid ""
"Darauf steht:\"Wenn Sie diese|Schrift jetzt lesen knnen,|hat die Tablette "
"gewirkt.\""
-msgstr ""
+msgstr "It says,\"If you can read|this writing now,|the pill worked.\""
#: ../../msn/msn_r2.c:1270
msgid "Stuhl"
-msgstr ""
+msgstr "Chair"
#: ../../msn/msn_r2.c:1271
msgid "Schuhe"
-msgstr ""
+msgstr "Shoes"
#: ../../msn/msn_r2.c:1271
msgid "Wie ist der denn mit|Schuhen hier reingekommen?"
-msgstr ""
+msgstr "How did he get in here|with his shoes on?"
#: ../../msn/msn_r2.c:1278
+#, fuzzy
msgid "Froschgesicht"
-msgstr ""
+msgstr "Frog face"
#: ../../msn/msn_r2.c:1279
msgid "Gekritzel"
-msgstr ""
+msgstr "Scribble"
#: ../../msn/msn_r2.c:1279
msgid "\"Mr Spock was here\""
-msgstr ""
+msgstr "\"Mr Spock was here\""
#: ../../msn/msn_r2.c:1280
msgid "Brieftasche"
-msgstr ""
+msgstr "Wallet"
#: ../../msn/msn_r2.c:1281
msgid "Speisekarte"
-msgstr ""
+msgstr "Menu"
#: ../../msn/msn_r2.c:1281
msgid "\"Heute empfehlen wir:|Fonua Opra mit Ulk.\""
-msgstr ""
+msgstr "\"Today we recommend: Fonua Opra with a joke.\""
#: ../../msn/msn_r2.c:1282
msgid "Tasse"
-msgstr ""
+msgstr "Cup"
#: ../../msn/msn_r2.c:1282
msgid "Sie enthlt eine grnliche Flssigkeit."
-msgstr ""
+msgstr "It contains a greenish liquid."
#: ../../msn/msn_r2.c:1284
msgid "10-Buckazoid-Schein"
-msgstr ""
+msgstr "A 10 buckazoid bill"
#: ../../msn/msn_r2.c:1284
msgid "Nicht gerade sehr viel Geld."
-msgstr ""
+msgstr "Not a lot of money."
#: ../../msn/msn_r2.c:1286 ../../msn/msn_r2.c:1297
msgid "Keycard von Roger"
-msgstr ""
+msgstr "Roger's keycard"
#: ../../msn/msn_r2.c:1301
+#, fuzzy
msgid "Anzeige"
-msgstr ""
+msgstr "Advertisement"
#: ../../msn/msn_r2.c:1301 ../../msn/msn_r2.c:1302
+#, fuzzy
msgid "Hmm, seltsame Anzeigen."
-msgstr ""
+msgstr "Hmm, weird ads."
#: ../../msn/msn_r2.c:1308
msgid "Roger W."
-msgstr ""
+msgstr "Roger W."
#: ../../msn/msn_r2.c:1317
msgid "Ufo"
-msgstr ""
+msgstr "UFO"
#: ../../msn/msn_r2.c:1317
msgid "Der Eingang scheint offen zu sein."
-msgstr ""
+msgstr "The entrance appears to be open."
#: ../../msn/msn_r3.c:26
msgid "Du drckst den Knopf,|aber nichts passiert."
-msgstr ""
+msgstr "You push the button,|but nothing happens."
#: ../../msn/msn_r3.c:87
msgid "Bei deinem Fluchtversuch hat|dich der Roboter erschossen."
-msgstr ""
+msgstr "When you tried to escape,|the robot shot you."
#: ../../msn/msn_r3.c:90
msgid "Du iát etwas, aber|es schmeckt scheuálich."
-msgstr ""
+msgstr "You're eating something,|but it tastes horrible."
#: ../../msn/msn_r3.c:170
msgid "Du wachst auf und findest dich in|einem geschlossenen Raum wieder."
-msgstr ""
+msgstr "You wake up and find yourself|in a closed room."
#: ../../msn/msn_r3.c:229
msgid "h ... nein, mein Name ist Mller."
-msgstr ""
+msgstr "Uh... no, my name is Mller."
#: ../../msn/msn_r3.c:230
msgid "Oh, ich habe mich im Gang vertan."
-msgstr ""
+msgstr "Oh, I got lost."
#: ../../msn/msn_r3.c:236
msgid "Wrden Sie mich bitte zum Fahrstuhl lassen?"
-msgstr ""
+msgstr "Will you please let me go to the elevator?"
#: ../../msn/msn_r3.c:237
msgid "Ich gehe wieder."
-msgstr ""
+msgstr "I'm leaving."
#: ../../msn/msn_r3.c:242
msgid "Dann gehe ich eben wieder."
-msgstr ""
+msgstr "Then I will be going."
#: ../../msn/msn_r3.c:243
msgid "Ach, halten Sie's Maul, ich gehe trotzdem!"
-msgstr ""
+msgstr "Oh, shut up, I'm leaving anyway!"
#: ../../msn/msn_r3.c:244 ../../msn/msn_r3.c:245
msgid "Wenn Sie mich durchlassen gebe ich Ihnen "
-msgstr ""
+msgstr "If you let me through, I'll give you "
#: ../../msn/msn_r3.c:257
msgid "Sie schon wieder?"
-msgstr ""
+msgstr "You again?"
#: ../../msn/msn_r3.c:263
msgid "Halt! Sie sind doch dieser Hummel.|Bleiben Sie sofort stehen!"
-msgstr ""
+msgstr "Stop! You're this Hummel.|Stop right there!"
#: ../../msn/msn_r3.c:265
msgid "Sehr witzig!"
-msgstr ""
+msgstr "Very funny!"
#: ../../msn/msn_r3.c:268
msgid "Kann auch sein, auf jeden Fall|sind Sie der Nicht-Axacussaner."
-msgstr ""
+msgstr "Well, you're the non-Axacussan,|you know."
#: ../../msn/msn_r3.c:272
msgid "Nein!"
-msgstr ""
+msgstr "No!"
#: ../../msn/msn_r3.c:285 ../../msn/msn_r3.c:286
msgid " Xa."
@@ -2480,7 +2508,7 @@ msgstr ""
#: ../../msn/msn_r3.c:1221 ../../msn/msn_s.c:312
msgid "Ich werde mal nachsehen."
-msgstr ""
+msgstr "Let's find out..."
#: ../../msn/msn_r3.c:1309
msgid "Jetzt verschwinden Sie endlich!"
@@ -2690,7 +2718,7 @@ msgstr ""
#: ../../msn/msn_r3.c:1684
msgid "Lauter Bume."
-msgstr ""
+msgstr "Nothing but trees."
#: ../../msn/msn_s.c:84
msgid "Teil 1:"
@@ -2797,12 +2825,12 @@ msgid ""
"Commander an alle! Achtung, Achtung!|Begeben Sie sich sofort zum "
"Notraumschiff!"
msgstr ""
-"Commander to all! Attention, attention! Attention!|Get to the emergency ship "
+"Commander to all! Attention, attention!|Get to the emergency ship "
"immediately!"
#: ../../msn/msn_s.c:256
msgid "Ich wiederhole:|Begeben Sie sich sofort zum Notraumschiff!"
-msgstr "I repeat,|proceed immediately to the emergency spaceship!"
+msgstr "I repeat, proceed immediately|to the emergency spaceship!"
#: ../../msn/msn_s.c:263
msgid ""
Commit: 4d7d8023333cf64d77810f097fd4b72392bda5a7
https://github.com/scummvm/scummvm/commit/4d7d8023333cf64d77810f097fd4b72392bda5a7
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:35Z
Commit Message:
SUPERNOVA: Change the signature of dialog(), fix calls, extract some more strings
Changed paths:
devtools/create_supernova/gametext.h
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
engines/supernova/rooms.h
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index b4e94a1..10e1507 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -569,97 +569,121 @@ const char *gameText[] = {
"Ja? Komisch.", // kStringArsanoRoger13
"Jetzt wei\341 ich's. Sie sind Roger W. !", // kStringArsanoRoger14
"Pssst, nicht so laut, sonst will|gleich jeder ein Autogramm von mir.", // kStringArsanoRoger15
- // 415
+ // 445
"Ich habe extra eine Maske auf, damit|ich nicht von jedem angelabert werde.", // kStringArsanoRoger16
"\216h ... ach so.", // kStringArsanoRoger17
"Wann kommt denn das n\204chste SQ-Abenteuer raus?", // kStringArsanoRoger18
"SQ 127 m\201\341te in einem Monat erscheinen.", // kStringArsanoRoger19
"Was, Teil 127 ??", // kStringArsanoRoger20
- // 420
+ // 450
"Bei uns ist gerade Teil 8 erschienen.", // kStringArsanoRoger21
"Hmm ... von welchem Planeten sind Sie denn?", // kStringArsanoRoger22
"Von der Erde.", // kStringArsanoRoger23
"Erde? Nie geh\224rt.", // kStringArsanoRoger24
"Wahrscheinlich irgendein Kaff, wo Neuerungen|erst hundert Jahre sp\204ter hingelangen.", // kStringArsanoRoger25
- // 425
+ // 455
"\216h ... kann sein.", // kStringArsanoRoger26
"Aber eins m\201ssen Sie mir erkl\204ren!", // kStringArsanoRoger27
"Wieso sehen Sie mir so verdammt \204hnlich, wenn|Sie nicht von Xenon stammen, wie ich?", // kStringArsanoRoger28
"Keine Ahnung. Bis jetzt dachte ich immer, Sie w\201ren ein|von Programmierern auf der Erde erfundenes Computersprite.", // kStringArsanoRoger29
"Was? Lachhaft!", // kStringArsanoRoger30
- // 430
+ // 460
"Wie erkl\204ren Sie sich dann,|da\341 ich ihnen gegen\201bersitze?", // kStringArsanoRoger31
"Ja, das ist in der Tat seltsam.", // kStringArsanoRoger32
"Halt, jetzt wei\341 ich es. Sie sind von der Konkurrenz,|von \"Georgefilm Games\" und wollen mich verunsichern.", // kStringArsanoRoger33
"Nein, ich bin nur ein Ahnungsloser Koch von der Erde.", // kStringArsanoRoger34
"Na gut, ich glaube Ihnen. Lassen wir jetzt|dieses Thema, langsam wird es mir zu bunt!", // kStringArsanoRoger35
- // 435
+ // 465
"Eine Partie Schach! Das ist eine gute Idee.", // kStringArsanoRoger36
"Schach? Was ist das denn?", // kStringArsanoRoger37
"Schach ist ein interessantes Spiel.|Ich werde es Ihnen erkl\204ren.", // kStringArsanoRoger38
"Knapp zwei Stunden sp\204ter ...", // kStringArsanoRoger39
"Roger W. steht kurz vor dem Schachmatt|und gr\201belt nach einem Ausweg.", // kStringArsanoRoger40
- // 440
+ // 470
"Du tippst auf den Tasten herum,|aber es passiert nichts.", // kStringArsanoGlider1
"Alle Raumschiffe haben|den Planeten verlassen.", // kStringArsanoMeetup2_1
"Alle Raumschiffe haben den Planeten|verlassen, bis auf eins ...", // kStringArsanoMeetup2_2
"Was wollen Sie denn schon wieder?", // kStringArsanoMeetup2_3
"Nein.", // kStringArsanoMeetup2_4
- // 445
+ // 475
"Haben Sie zuf\204llig meine Brieftasche gesehen?|Ich mu\341 Sie irgendwo verloren haben.", // kStringArsanoMeetup2_5
"Ohne die Brieftasche kann ich nicht|starten, weil meine Keycard darin ist.", // kStringArsanoMeetup2_6
"Oh! Vielen Dank.", // kStringArsanoMeetup2_7
"Wo ist denn Ihr Raumschiff?|Soll ich Sie ein St\201ck mitnehmen?", // kStringArsanoMeetup2_8
"Wo wollen Sie denn hin?", // kStringArsanoMeetup2_9
- // 450
+ // 480
"Ok, steigen Sie ein!", // kStringArsanoMeetup2_10
"Wie Sie wollen.", // kStringArsanoMeetup2_11
"Huch, du lebst ja noch!", // kStringArsanoMeetup2_12
"Das w\201rde ich jetzt nicht tun, schlie\341lich|steht Roger W. neben seinem Schiff.", // kStringArsanoMeetup2_13
"Ich glaube, er wacht auf.", // kStringArsanoMeetup3_1
- // 455
+ // 485
"Ja, sieht so aus.", // kStringArsanoMeetup3_2
"Sie befinden sich im Raumschiff \"Dexxa\".", // kStringArsanoMeetup3_3
"Wir kommen vom Planeten Axacuss und|sind aus dem gleichen Grund hier wie Sie,|n?mlich zur Erforschung der Supernova.", // kStringArsanoMeetup3_4
"Sie k\224nnen beruhigt sein, wir wollen Ihnen nur helfen.", // kStringArsanoMeetup3_5
"Und wieso hat der Typ im Raumanzug|eben auf mich geschossen?", // kStringArsanoMeetup3_6
- // 460
+ // 490
"Das war eine Schreckreaktion.", // kStringArsanoMeetup3_7
"Schlie\341lich ist es f\201r uns das erste Mal,|da\341 wir auf eine fremde Intelligenz treffen.", // kStringArsanoMeetup3_8
"Wie wir festgestellt haben, ist|Ihr Raumschiff v\224llig zerst\224rt.", // kStringArsanoMeetup3_9
"Wahrscheinlich k\224nnen Sie nicht|mehr auf ihren Heimatplaneten zur\201ck.", // kStringArsanoMeetup3_10
"Wir bieten Ihnen an, Sie|mit nach Axacuss zu nehmen.", // kStringArsanoMeetup3_11
- // 465
+ // 495
"Sind Sie sich da wirklich sicher?", // kStringArsanoMeetup3_12
"Wenn ich es mir genau \201berlege,|fliege ich doch lieber mit.", // kStringArsanoMeetup3_13
"Gut, wir nehmen Sie unter der|Bedingung mit, da\341 wir Sie jetzt|sofort in Tiefschlaf versetzen d\201rfen.", // kStringArsanoMeetup3_14
"Diese Art des Reisens ist Ihnen|ja scheinbar nicht unbekannt.", // kStringArsanoMeetup3_15
"Sie werden in vier Jahren nach der|Landung der \"Dexxa\" wieder aufgeweckt.", // kStringArsanoMeetup3_16
- // 470
+ // 500
"Sind Sie damit einverstanden?", // kStringArsanoMeetup3_17
"Gut, haben Sie noch irgendwelche Fragen?", // kStringArsanoMeetup3_18
"Keine Panik!", // kStringArsanoMeetup3_19
"Wir tun Ihnen nichts.", // kStringArsanoMeetup3_20
"Wir sprechen nicht ihre Sprache,|sondern Sie sprechen unsere.", // kStringArsanoMeetup3_21
- // 475
+ // 505
"Nach einer Gehirnanalyse konnten|wir Ihr Gehirn an unsere Sprache anpassen.", // kStringArsanoMeetup3_22
"Was? Sie haben in mein Gehirn eingegriffen?", // kStringArsanoMeetup3_23
"Keine Angst, wir haben sonst nichts ver\204ndert.", // kStringArsanoMeetup3_24
"Ohne diesen Eingriff w\204ren|Sie verloren gewesen.", // kStringArsanoMeetup3_25
"Ich habe keine weiteren Fragen mehr.", // kStringArsanoMeetup3_26
- // 480
+ // 510
"Gut, dann versetzen wir Sie jetzt in Tiefschlaf.", // kStringArsanoMeetup3_27
"Gute Nacht!", // kStringArsanoMeetup3_28
"Du wachst auf und findest dich in|einem geschlossenen Raum wieder.", // kStringAxacussCell_1
"Du dr\201ckst den Knopf,|aber nichts passiert.", // kStringAxacussCell_2
"Das ist befestigt.", // kStringAxacussCell_3
- // 485
+ // 515
"Bei deinem Fluchtversuch hat|dich der Roboter erschossen.", // kStringAxacussCell_4
"Du i\341t etwas, aber|es schmeckt scheu\341lich.", // kStringAxacussCell_5
"Ok.", // kStringOk
- "", //
- "", //
- // 490
+ "Ach, Ihnen geh\224rt die. Ich habe sie eben im Sand gefunden.", // kStringDialogArsanoMeetup2_1
+ "Nein, tut mir leid.", // kStringDialogArsanoMeetup2_2
+ // 520
+ "Nein, danke. Ich bleibe lieber hier.", // kStringDialogArsanoMeetup2_3
+ "Ja, das w\204re gut.", // kStringDialogArsanoMeetup2_4
+ "Zur Erde.", // kStringDialogArsanoMeetup2_5
+ "Zum Pr\204sident der Galaxis.", // kStringDialogArsanoMeetup2_6
+ "Nach Xenon.", // kStringDialogArsanoMeetup2_7
+ // 525
+ "Mir egal, setzen Sie mich irgendwo ab!", // kStringDialogArsanoMeetup2_8
+ "Ich habe gerade Ihre Brieftasche gefunden!", // kStringDialogArsanoMeetup2_9
+ "Sie lag da dr\201ben hinter einem Felsen.", // kStringDialogArsanoMeetup2_10
+ "Ich wollte nur wissen, ob Sie die Brieftasche wiederhaben.", // kStringDialogArsanoMeetup2_11
+ "\216h ... nein, mein Name ist M\201ller.", // kStringDialogAxacussCorridor5_1
+ // 530
+ "Oh, ich habe mich im Gang vertan.", // kStringDialogAxacussCorridor5_2
+ "W\201rden Sie mich bitte zum Fahrstuhl lassen?", // kStringDialogAxacussCorridor5_3
+ "Ich gehe wieder.", // kStringDialogAxacussCorridor5_4
+ "Dann gehe ich eben wieder.", // kStringDialogAxacussCorridor5_5
+ "Ach, halten Sie's Maul, ich gehe trotzdem!", // kStringDialogAxacussCorridor5_6
+ // 535
+ "Wenn Sie mich durchlassen gebe ich Ihnen ", // kStringDialogAxacussCorridor5_7
+ "Hallo!", // kStringDialogX1
+ "Guten Tag!", // kStringDialogX2
+ "Ich bin's, Horst Hummel.", // kStringDialogX3
+ "",
+ // 540
NULL
};
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 551d07a..565c1b6 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -464,6 +464,7 @@ enum StringID {
kStringOutro3, kStringOutro4, kStringOutro5, kStringOutro6, kStringOutro7,
kStringOutro8, kStringOutro9, kStringOutro10, kStringOutro11, kStringOutro12,
kStringOutro13, kStringOutro14, kStringWireAndPlug, kStringWireAndClip, kStringWireAndPlug2,
+ // 275
kStringSignDescription2, kStringCoin, kStringDoorDescription5, kStringDoorDescription6, kStringKeycard2Description2,
kSringSpoolAndClip, kStringIntroCutscene1, kStringIntroCutscene2, kStringIntroCutscene3, kStringIntroCutscene4,
kStringIntroCutscene5, kStringIntroCutscene6, kStringIntroCutscene7, kStringIntroCutscene8, kStringIntroCutscene9,
@@ -517,10 +518,16 @@ enum StringID {
kStringArsanoMeetup3_2, kStringArsanoMeetup3_3, kStringArsanoMeetup3_4, kStringArsanoMeetup3_5, kStringArsanoMeetup3_6,
kStringArsanoMeetup3_7, kStringArsanoMeetup3_8, kStringArsanoMeetup3_9, kStringArsanoMeetup3_10, kStringArsanoMeetup3_11,
kStringArsanoMeetup3_12, kStringArsanoMeetup3_13, kStringArsanoMeetup3_14, kStringArsanoMeetup3_15, kStringArsanoMeetup3_16,
+ // 500
kStringArsanoMeetup3_17, kStringArsanoMeetup3_18, kStringArsanoMeetup3_19, kStringArsanoMeetup3_20, kStringArsanoMeetup3_21,
kStringArsanoMeetup3_22, kStringArsanoMeetup3_23, kStringArsanoMeetup3_24, kStringArsanoMeetup3_25, kStringArsanoMeetup3_26,
kStringArsanoMeetup3_27, kStringArsanoMeetup3_28, kStringAxacussCell_1, kStringAxacussCell_2, kStringAxacussCell_3,
- kStringAxacussCell_4, kStringAxacussCell_5, kStringOk
+ kStringAxacussCell_4, kStringAxacussCell_5, kStringOk, kStringDialogArsanoMeetup2_1, kStringDialogArsanoMeetup2_2,
+ kStringDialogArsanoMeetup2_3, kStringDialogArsanoMeetup2_4, kStringDialogArsanoMeetup2_5, kStringDialogArsanoMeetup2_6, kStringDialogArsanoMeetup2_7,
+ // 525
+ kStringDialogArsanoMeetup2_8, kStringDialogArsanoMeetup2_9, kStringDialogArsanoMeetup2_10, kStringDialogArsanoMeetup2_11, kStringDialogAxacussCorridor5_1,
+ kStringDialogAxacussCorridor5_2, kStringDialogAxacussCorridor5_3, kStringDialogAxacussCorridor5_4, kStringDialogAxacussCorridor5_5, kStringDialogAxacussCorridor5_6,
+ kStringDialogAxacussCorridor5_7, kStringDialogX1, kStringDialogX2, kStringDialogX3
};
static StringID guiCommands[] = {
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 5126649..886cd4b 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -1567,10 +1567,9 @@ void ArsanoEntrance::animation() {
}
bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
- // TODO: Refactor row/dialog data structure for dialog()
- byte zeilen1[5] = {1, 1, 1, 1, 1};
- byte zeilen2[5] = {1, 1, 1, 1, 1};
- byte zeilen3[2] = {1, 1};
+ static byte row1[6] = {1, 1, 1, 1, 1, 0};
+ static byte row2[6] = {1, 1, 1, 1, 1, 0};
+ static byte row3[6] = {1, 1, 0, 0, 0, 0};
char e;
@@ -1586,7 +1585,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
} else if (_gm->_state._shoes > 1) {
_gm->removeSentence(2, 2);
}
- switch (e = _gm->dialog(5, nullptr, nullptr, 2)) { // row2, dialog2
+ switch (e = _gm->dialog(5, row2, _dialog2, 2)) {
case 0:
_gm->reply(kStringArsanoEntrance3, 1, _gm->invertSection(1));
_gm->reply(kStringArsanoEntrance4, 1, _gm->invertSection(1));
@@ -1610,10 +1609,8 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
_gm->reply(kStringArsanoEntrance9, 1, _gm->invertSection(1));
}
} while (e != 4);
- } else {
- if (_gm->dialog(5, nullptr, nullptr, 0) != 4) // row2, dialog2
- _gm->reply(kStringArsanoEntrance10, 1, _gm->invertSection(1));
- }
+ } else if (_gm->dialog(5, row2, _dialog2, 0) != 4)
+ _gm->reply(kStringArsanoEntrance10, 1, _gm->invertSection(1));
}
} else if ((verb == ACTION_WALK) && (obj1._id == STAIRCASE) && (_gm->_state._shoes != 3)) {
_gm->drawImage(3);
@@ -1638,7 +1635,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
_gm->reply(kStringArsanoEntrance14, 1, _gm->invertSection(1));
e = 0;
while ((e < 3) && (_shown[kMaxSection - 1] != 15)) {
- switch (e = _gm->dialog(5, nullptr, nullptr, 1)) { // row1, dialog1
+ switch (e = _gm->dialog(5, row1, _dialog1, 1)) {
case 0:
_gm->reply(kStringArsanoEntrance15, 1, 1 + 128);
break;
@@ -1667,7 +1664,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
_gm->removeSentence(0, 1);
}
} else {
- _gm->dialog(2, nullptr, nullptr, 0); // row3, dialog3
+ _gm->dialog(2, row3, _dialog3, 0);
_gm->reply(kStringArsanoEntrance10, 1, 1 + 128);
}
}
@@ -1959,7 +1956,7 @@ void ArsanoRoger::animation() {
}
bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
- byte zeilen1[4] = {1, 1, 1, 1};
+ static byte row1[6] = {1, 1, 1, 1, 0, 0};
if ((verb == ACTION_TAKE) && (obj1._id == WALLET)) {
if (isSectionVisible(3)) {
@@ -1973,7 +1970,7 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
if (isSectionVisible(3))
_vm->renderMessage(kStringArsanoRoger5);
else {
- switch (_gm->dialog(4, nullptr, nullptr, 1)) { // row1, dialog1
+ switch (_gm->dialog(4, row1, _dialog1, 1)) {
case 0:
_gm->reply(kStringArsanoRoger6, 2, 2 + 128);
_gm->reply(kStringArsanoRoger7, 2, 2 + 128);
@@ -2144,10 +2141,10 @@ void ArsanoMeetup2::onEntrance() {
}
bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
- byte zeilen1[2] = {1, 1};
- byte zeilen2[2] = {1, 1};
- byte zeilen3[4] = {1, 1, 1, 1};
- byte zeilen4[2] = {2, 1};
+ static byte row1[6] = {1, 1, 0, 0, 0, 0};
+ static byte row2[6] = {1, 1, 0, 0, 0, 0};
+ static byte row3[6] = {1, 1, 1, 1, 0, 0};
+ static byte row4[6] = {2, 1, 0, 0, 0, 0};
if (((verb == ACTION_WALK) &&
((obj1._id == SPACESHIP) || (obj1._id == ROGER_W))) ||
@@ -2158,13 +2155,13 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
bool found;
if (_gm->_rooms[MEETUP2]->isSectionVisible(kMaxSection - 2)) {
_gm->reply(kStringArsanoMeetup2_3, 1, 1 + 128);
- found = !_gm->dialog(2, nullptr, nullptr, 0); // row4, dialog4
+ found = !_gm->dialog(2, row4, _dialog4, 0);
if (!(found))
_gm->reply(kStringArsanoMeetup2_4, 1, 1 + 128);
} else {
_gm->reply(kStringArsanoMeetup2_5, 1, 1 + 128);
_gm->reply(kStringArsanoMeetup2_6, 1, 1 + 128);
- found = !_gm->dialog(2, nullptr, nullptr, 0); // row1, dialog1
+ found = !_gm->dialog(2, row1, _dialog1, 0);
_gm->_rooms[MEETUP2]->setSectionVisible(kMaxSection - 2, true);
}
if (found) {
@@ -2173,10 +2170,10 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(8));
_gm->reply(kStringArsanoMeetup2_7, 1, 1 + 128);
_gm->reply(kStringArsanoMeetup2_8, 1, 1 + 128);
- bool flight = _gm->dialog(2, nullptr, nullptr, 0); // row2, dialog2
+ bool flight = _gm->dialog(2, row2, _dialog2, 0);
if (flight) {
_gm->reply(kStringArsanoMeetup2_9, 1, 1 + 128);
- _gm->dialog(4, nullptr, nullptr, 0); // row3, dialog3
+ _gm->dialog(4, row3, _dialog3, 0);
_gm->reply(kStringArsanoMeetup2_10, 1, 1 + 128);
} else {
_gm->reply(kStringArsanoMeetup2_11, 1, 1 + 128);
@@ -2246,8 +2243,11 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
}
bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
- byte zeilen2[4] = {1, 1, 1, 1};
- byte zeilen3[2] = {1, 1};
+ byte row2[6] = {1, 1, 1, 1, 0, 0};
+ byte row3[6] = {1, 1, 0, 0, 0, 0};
+
+ // TODO: Hack, to be move away and renamed when the other uses are found
+ byte rowsX[6] = {1, 1, 1, 0, 0, 0};
if ((verb == ACTION_WALK) && (obj1._id == STAR))
_vm->renderMessage(kStringArsanoMeetup2);
@@ -2256,11 +2256,12 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
_vm->paletteBrightness();
_gm->getInput();
g_system->fillScreen(kColorBlack);
+ // CHECKME: Doesn't look complete - check sb_meetup()
} else if ((verb == ACTION_WALK) && (obj1._id == UFO)) {
g_system->fillScreen(kColorBlack);
_vm->renderImage(36, 0);
_vm->paletteBrightness();
- _gm->dialog(3, nullptr, nullptr, 0); // rowX, dialogX
+ _gm->dialog(3, rowsX, _dialogsX, 0);
_vm->renderImage(36, 1);
_gm->wait2(3);
_vm->renderImage(36, 2);
@@ -2286,7 +2287,7 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
_gm->reply(kStringArsanoMeetup3_2, 1, 1 + 128);
do {
- int i = _gm->dialog(4, nullptr, nullptr, 2); // row2, dialog2
+ int i = _gm->dialog(4, row2, _dialog2, 2);
switch (i) {
case 0:
_gm->reply(kStringArsanoMeetup3_3, 1, 1 + 128);
@@ -2300,7 +2301,7 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
_gm->reply(kStringArsanoMeetup3_9, 2, 2 + 128);
_gm->reply(kStringArsanoMeetup3_10, 2, 2 + 128);
_gm->reply(kStringArsanoMeetup3_11, 2, 2 + 128);
- if (_gm->dialog(2, nullptr, nullptr, 0)) { // row3, dialog3
+ if (_gm->dialog(2, row3, _dialog3, 0)) {
_gm->reply(kStringArsanoMeetup3_12, 2, 2 + 128);
_gm->say(kStringArsanoMeetup3_13);
}
@@ -2308,7 +2309,7 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
_gm->reply(kStringArsanoMeetup3_15, 2, 2 + 128);
_gm->reply(kStringArsanoMeetup3_16, 2, 2 + 128);
_gm->reply(kStringArsanoMeetup3_17, 2, 2 + 128);
- if (_gm->dialog(2, nullptr, nullptr, 0)) { // row3, dialog3
+ if (_gm->dialog(2, row3, _dialog3, 0)) {
_gm->reply(kStringArsanoMeetup3_12, 2, 2 + 128);
_gm->say(kStringArsanoMeetup3_13);
}
@@ -2580,8 +2581,7 @@ void AxacussCorridor5::onEntrance() {
bool AxacussCorridor5::interact(Action verb, Object &obj1, Object &obj2) {
// TODO: needs to be refactored
-// static char
-// rows[] = {1, 1, 1, 1},
+ static byte rows[6] = {1, 1, 1, 1, 0, 0};
int sum;
@@ -2595,22 +2595,23 @@ bool AxacussCorridor5::interact(Action verb, Object &obj1, Object &obj2) {
} else {
_gm->_guiEnabled = true;
_gm->reply("Halt! Sie sind doch dieser Hummel.|Bleiben Sie sofort stehen!", 1, 1 + 128);
- if (_gm->dialog(2, nullptr, nullptr, 0)) // rows, dialog1
+ if (_gm->dialog(2, rows, _dialog1, 0))
_gm->reply("Sehr witzig!", 1, 1 + 128);
else {
_gm->reply("Kann auch sein, auf jeden Fall|sind Sie der Nicht-Axacussaner.", 1, 1 + 128);
bestechen:
- if (_gm->dialog(2, nullptr, nullptr, 0) == 0) { // rows, dialog2
+ if (_gm->dialog(2, rows, _dialog2, 0) == 0) {
_gm->reply("Nein!", 1, 1 + 128);
setSectionVisible(kMaxSection - 2, false);
if (_gm->_state._money == 0) {
_gm->removeSentence(2, 2);
_gm->removeSentence(3, 2);
} else {
- _dialog3[2] += Common::String::format("%d Xa.", _gm->_state._money - 200);
- _dialog3[3] += Common::String::format("%d Xa.", _gm->_state._money);
+ // TODO: Handle string manipulation in dialogs
+ // _dialog3[2] += Common::String::format("%d Xa.", _gm->_state._money - 200);
+ // _dialog3[3] += Common::String::format("%d Xa.", _gm->_state._money);
}
- switch (_gm->dialog(4, nullptr, nullptr, 2)) { // rows, dialog3
+ switch (_gm->dialog(4, rows, _dialog3, 2)) {
case 1:
_gm->wait2(3);
_gm->drawImage(1);
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 8e857e8..d609b0d 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -751,31 +751,33 @@ public:
_id = MEETUP2;
_shown[0] = kShownTrue;
- _objectState[0] = Object(_id, kStringRoger,kStringDefaultDescription,ROGER_W,TALK,255,255,0);
- _objectState[1] = Object(_id, kStringSpaceshift,kStringDefaultDescription,SPACESHIP,COMBINABLE,255,255,0);
- _objectState[2] = Object(_id, kStringCave,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
-
- _dialog1[0] = "Ach, Ihnen geh\224rt die. Ich habe sie eben im Sand gefunden.";
- _dialog1[1] = "Nein, tut mir leid.";
- _dialog2[0] = "Nein, danke. Ich bleibe lieber hier.";
- _dialog2[1] = "Ja, das w\204re gut.";
- _dialog3[0] = "Zur Erde.";
- _dialog3[1] = "Zum Pr\204sident der Galaxis.";
- _dialog3[2] = "Nach Xenon.";
- _dialog3[3] = "Mir egal, setzen Sie mich irgendwo ab!";
- _dialog4[0] = "Ich habe gerade Ihre Brieftasche gefunden!";
- _dialog4[1] = "Sie lag da dr\201ben hinter einem Felsen.";
- _dialog4[2] = "Ich wollte nur wissen, ob Sie die Brieftasche wiederhaben.";
+ _objectState[0] = Object(_id, kStringRoger, kStringDefaultDescription, ROGER_W, TALK, 255, 255, 0);
+ _objectState[1] = Object(_id, kStringSpaceshift, kStringDefaultDescription, SPACESHIP, COMBINABLE, 255, 255, 0);
+ _objectState[2] = Object(_id, kStringCave, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, CAVE, 22);
+
+ _dialog1[0] = kStringDialogArsanoMeetup2_1;
+ _dialog1[1] = kStringDialogArsanoMeetup2_2;
+ _dialog2[0] = kStringDialogArsanoMeetup2_3;
+ _dialog2[1] = kStringDialogArsanoMeetup2_4;
+ _dialog3[0] = kStringDialogArsanoMeetup2_5;
+ _dialog3[1] = kStringDialogArsanoMeetup2_6;
+ _dialog3[2] = kStringDialogArsanoMeetup2_7;
+ _dialog3[3] = kStringDialogArsanoMeetup2_8;
+ _dialog4[0] = kStringDialogArsanoMeetup2_9;
+ _dialog4[1] = kStringDialogArsanoMeetup2_10;
+ _dialog4[2] = kStringDialogArsanoMeetup2_11;
}
virtual void onEntrance();
virtual bool interact(Action verb, Object &obj1, Object &obj2);
private:
- Common::String _dialog1[2];
- Common::String _dialog2[2];
- Common::String _dialog3[4];
- Common::String _dialog4[3];
+ // TODO: change to 6, fix initialization
+ StringID _dialog1[2];
+ StringID _dialog2[2];
+ StringID _dialog3[4];
+ StringID _dialog4[3];
+
bool _found;
bool _flug;
};
@@ -799,6 +801,11 @@ public:
_dialog2[3] = kStringDialogArsanoMeetup3_3;
_dialog3[0] = kStringDialogArsanoMeetup3_4;
_dialog3[1] = kStringDialogArsanoMeetup3_5;
+
+ // TODO: Hack, to be move away and renamed when the other uses are found
+ _dialogsX[0] = kStringDialogX1;
+ _dialogsX[1] = kStringDialogX2;
+ _dialogsX[2] = kStringDialogX3;
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -806,6 +813,10 @@ public:
private:
StringID _dialog2[4];
StringID _dialog3[2];
+
+ // TODO: Hack, to be move away and renamed when the other uses are found
+ StringID _dialogsX[6];
+ //
};
// Axacuss
@@ -954,23 +965,24 @@ public:
_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,DOOR,EXIT,2,2,0,NULLROOM,2);
_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR6,22);
- _dialog1[0] = "\216h ... nein, mein Name ist M\201ller.";
- _dialog1[1] = "Oh, ich habe mich im Gang vertan.";
- _dialog2[0] = "W\201rden Sie mich bitte zum Fahrstuhl lassen?";
- _dialog2[1] = "Ich gehe wieder.";
- _dialog3[0] = "Dann gehe ich eben wieder.";
- _dialog3[1] = "Ach, halten Sie's Maul, ich gehe trotzdem!";
- _dialog3[2] = "Wenn Sie mich durchlassen gebe ich Ihnen ";
- _dialog3[3] = "Wenn Sie mich durchlassen gebe ich Ihnen ";
+ _dialog1[0] = kStringDialogAxacussCorridor5_1;
+ _dialog1[1] = kStringDialogAxacussCorridor5_2;
+ _dialog2[0] = kStringDialogAxacussCorridor5_3;
+ _dialog2[1] = kStringDialogAxacussCorridor5_4;
+ _dialog3[0] = kStringDialogAxacussCorridor5_5;
+ _dialog3[1] = kStringDialogAxacussCorridor5_6;
+ _dialog3[2] = kStringDialogAxacussCorridor5_7;
+ _dialog3[3] = kStringDialogAxacussCorridor5_7;
}
virtual void onEntrance();
virtual bool interact(Action verb, Object &obj1, Object &obj2);
private:
- Common::String _dialog1[2];
- Common::String _dialog2[2];
- Common::String _dialog3[4];
+ // TODO: Change to 6, or change struct, and fix initialization
+ StringID _dialog1[2];
+ StringID _dialog2[2];
+ StringID _dialog3[4];
};
class AxacussCorridor6 : public Room {
public:
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 39e086e..e95c4ec 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -799,7 +799,7 @@ void GameManager::reply(const char *text, int aus1, int aus2) {
// STUB
}
-int GameManager::dialog(int num, byte *rowLength[], const char **text[6], int number) {
+int GameManager::dialog(int num, byte rowLength[6], StringID text[6], int number) {
// STUB
return 0;
}
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 875a89a..d72cd17 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -180,7 +180,7 @@ public:
void setAnimationTimer(int ticks);
void dead(const char *message);
void dead(StringID messageId);
- int dialog(int num, byte *rowLength[6], const char **text[6], int number);
+ int dialog(int num, byte rowLength[6], StringID text[6], int number);
void sentence(int number, bool brightness);
void removeSentence(int sentence, int number);
void addSentence(int sentence, int number);
Commit: 52952c48a7d89907fa7b8d681a2050a193b0ed88
https://github.com/scummvm/scummvm/commit/52952c48a7d89907fa7b8d681a2050a193b0ed88
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:35Z
Commit Message:
SUPERNOVA: Fix displaying image missing last row and last column
This also fixes a crash for single row image sections
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index fc011b2..c54ce1c 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -405,8 +405,8 @@ void SupernovaEngine::renderImage(MSNImageDecoder &image, int section) {
Common::Rect sectionRect(image._section[section].x1,
image._section[section].y1,
- image._section[section].x2,
- image._section[section].y2);
+ image._section[section].x2 + 1,
+ image._section[section].y2 + 1) ;
if (image._filenumber == 1 || image._filenumber == 2) {
sectionRect.setWidth(640);
sectionRect.setHeight(480);
Commit: 9db84783be9dcfdd940a0c3ade05cf4fb3319289
https://github.com/scummvm/scummvm/commit/9db84783be9dcfdd940a0c3ade05cf4fb3319289
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:35Z
Commit Message:
SUPERNOVA: Merge two strings to help with translation
Changed paths:
devtools/create_supernova/gametext.h
engines/supernova/rooms.cpp
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index 10e1507..25542ff 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -678,7 +678,7 @@ const char *gameText[] = {
"Dann gehe ich eben wieder.", // kStringDialogAxacussCorridor5_5
"Ach, halten Sie's Maul, ich gehe trotzdem!", // kStringDialogAxacussCorridor5_6
// 535
- "Wenn Sie mich durchlassen gebe ich Ihnen ", // kStringDialogAxacussCorridor5_7
+ "Wenn Sie mich durchlassen gebe ich Ihnen %d Xa.", // kStringDialogAxacussCorridor5_7
"Hallo!", // kStringDialogX1
"Guten Tag!", // kStringDialogX2
"Ich bin's, Horst Hummel.", // kStringDialogX3
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 886cd4b..8a3b937 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2608,8 +2608,10 @@ bestechen:
_gm->removeSentence(3, 2);
} else {
// TODO: Handle string manipulation in dialogs
- // _dialog3[2] += Common::String::format("%d Xa.", _gm->_state._money - 200);
- // _dialog3[3] += Common::String::format("%d Xa.", _gm->_state._money);
+ // _dialog3[2] and _dialog3[3] are both using kStringDialogAxacussCorridor5_7
+ // ("Wenn Sie mich durchlassen gebe ich Ihnen %d Xa.")
+ // _dialog3[2] += Common::String::format(kStringDialogAxacussCorridor5_7, _gm->_state._money - 200);
+ // _dialog3[3] += Common::String::format(kStringDialogAxacussCorridor5_7, _gm->_state._money);
}
switch (_gm->dialog(4, rows, _dialog3, 2)) {
case 1:
Commit: f213ea8e0a672a40aa5075b5b7a4ed6653013a00
https://github.com/scummvm/scummvm/commit/f213ea8e0a672a40aa5075b5b7a4ed6653013a00
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:35Z
Commit Message:
SUPERNOVA: extract strings for Axacuss Corridor 5
Changed paths:
devtools/create_supernova/gametext.h
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index 25542ff..a3ec589 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -682,8 +682,20 @@ const char *gameText[] = {
"Hallo!", // kStringDialogX1
"Guten Tag!", // kStringDialogX2
"Ich bin's, Horst Hummel.", // kStringDialogX3
- "",
+ "Sie schon wieder?", // kStringAxacussCorridor5_1
// 540
+ "Halt! Sie sind doch dieser Hummel.|Bleiben Sie sofort stehen!", // kStringAxacussCorridor5_2
+ "Sehr witzig!", // kStringAxacussCorridor5_3
+ "Kann auch sein, auf jeden Fall|sind Sie der Nicht-Axacussaner.", // kStringAxacussCorridor5_4
+ "Nein!", // kStringAxacussCorridor5_5
+ "Das m\201\341te schon ein bi\341chen mehr sein.", // kStringAxacussCorridor5_6
+ // 545
+ "Ok, dann machen Sie da\341 Sie wegkommen!", kStringAxacussCorridor5_7
+ "",
+ "",
+ "",
+ "",
+ // 550
NULL
};
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 565c1b6..3a8b920 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -527,7 +527,9 @@ enum StringID {
// 525
kStringDialogArsanoMeetup2_8, kStringDialogArsanoMeetup2_9, kStringDialogArsanoMeetup2_10, kStringDialogArsanoMeetup2_11, kStringDialogAxacussCorridor5_1,
kStringDialogAxacussCorridor5_2, kStringDialogAxacussCorridor5_3, kStringDialogAxacussCorridor5_4, kStringDialogAxacussCorridor5_5, kStringDialogAxacussCorridor5_6,
- kStringDialogAxacussCorridor5_7, kStringDialogX1, kStringDialogX2, kStringDialogX3
+ kStringDialogAxacussCorridor5_7, kStringDialogX1, kStringDialogX2, kStringDialogX3, kStringAxacussCorridor5_1,
+ kStringAxacussCorridor5_2, kStringAxacussCorridor5_3, kStringAxacussCorridor5_4, kStringAxacussCorridor5_5, kStringAxacussCorridor5_6,
+ kStringAxacussCorridor5_7
};
static StringID guiCommands[] = {
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 8a3b937..9410be5 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2590,18 +2590,18 @@ bool AxacussCorridor5::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderImage(41, 0);
_vm->paletteBrightness();
if (_gm->_guiEnabled) {
- _gm->reply("Sie schon wieder?", 1, 1 + 128);
+ _gm->reply(kStringAxacussCorridor5_1, 1, 1 + 128);
goto bestechen;
} else {
_gm->_guiEnabled = true;
- _gm->reply("Halt! Sie sind doch dieser Hummel.|Bleiben Sie sofort stehen!", 1, 1 + 128);
+ _gm->reply(kStringAxacussCorridor5_2, 1, 1 + 128);
if (_gm->dialog(2, rows, _dialog1, 0))
- _gm->reply("Sehr witzig!", 1, 1 + 128);
+ _gm->reply(kStringAxacussCorridor5_3, 1, 1 + 128);
else {
- _gm->reply("Kann auch sein, auf jeden Fall|sind Sie der Nicht-Axacussaner.", 1, 1 + 128);
+ _gm->reply(kStringAxacussCorridor5_4, 1, 1 + 128);
bestechen:
if (_gm->dialog(2, rows, _dialog2, 0) == 0) {
- _gm->reply("Nein!", 1, 1 + 128);
+ _gm->reply(kStringAxacussCorridor5_5, 1, 1 + 128);
setSectionVisible(kMaxSection - 2, false);
if (_gm->_state._money == 0) {
_gm->removeSentence(2, 2);
@@ -2610,6 +2610,9 @@ bestechen:
// TODO: Handle string manipulation in dialogs
// _dialog3[2] and _dialog3[3] are both using kStringDialogAxacussCorridor5_7
// ("Wenn Sie mich durchlassen gebe ich Ihnen %d Xa.")
+ // One way could be to keep an array of string[6], replace the %d of the previous sentence by a %s,
+ // and format the dialog string when the associated parameter string isn't empty.
+ // The following code is broken and only kept in order to remember the values used.
// _dialog3[2] += Common::String::format(kStringDialogAxacussCorridor5_7, _gm->_state._money - 200);
// _dialog3[3] += Common::String::format(kStringDialogAxacussCorridor5_7, _gm->_state._money);
}
@@ -2634,7 +2637,7 @@ bestechen:
sum = _gm->_state._money - 200;
goto genug;
}
- _gm->reply("Das m\201\341te schon ein bi\341chen mehr sein.", 1, 1 + 128);
+ _gm->reply(kStringAxacussCorridor5_6, 1, 1 + 128);
}
}
}
@@ -2643,7 +2646,7 @@ bestechen:
return true;
genug:
- _gm->reply("Ok, dann machen Sie da\341 Sie wegkommen!", 1, 1 + 128);
+ _gm->reply(kStringAxacussCorridor5_7, 1, 1 + 128);
_gm->great(0);
_gm->changeRoom(ELEVATOR);
_gm->_newRoom = true;
Commit: e0dde7865bda37405f106fdcd2f0c4159ec3e622
https://github.com/scummvm/scummvm/commit/e0dde7865bda37405f106fdcd2f0c4159ec3e622
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:35Z
Commit Message:
SUPERNOVA: Remove AxacussCorridor5::interact in order to get rid of several GOTOs
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 9410be5..74f9c43 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2576,82 +2576,82 @@ bool AxacussCorridor4::interact(Action verb, Object &obj1, Object &obj2) {
}
void AxacussCorridor5::onEntrance() {
-
}
-bool AxacussCorridor5::interact(Action verb, Object &obj1, Object &obj2) {
- // TODO: needs to be refactored
- static byte rows[6] = {1, 1, 1, 1, 0, 0};
+bool AxacussCorridor5::handleMoneyDialog() {
+ if (_gm->dialog(2, _rows, _dialog2, 0) == 0) {
+ _gm->reply(kStringAxacussCorridor5_5, 1, 1 + 128);
+ setSectionVisible(kMaxSection - 2, false);
+ if (_gm->_state._money == 0) {
+ _gm->removeSentence(2, 2);
+ _gm->removeSentence(3, 2);
+ } else {
+ // TODO: Handle string manipulation in dialogs
+ // _dialog3[2] and _dialog3[3] are both using kStringDialogAxacussCorridor5_7
+ // ("Wenn Sie mich durchlassen gebe ich Ihnen %d Xa.")
+ // One way could be to keep an array of string[6], replace the %d of the previous sentence by a %s,
+ // and format the dialog string when the associated parameter string isn't empty.
+ // The following code is broken and only kept in order to remember the values used.
+ // _dialog3[2] += Common::String::format(kStringDialogAxacussCorridor5_7, _gm->_state._money - 200);
+ // _dialog3[3] += Common::String::format(kStringDialogAxacussCorridor5_7, _gm->_state._money);
+ }
+ switch (_gm->dialog(4, _rows, _dialog3, 2)) {
+ case 1:
+ _gm->wait2(3);
+ _gm->drawImage(1);
+ _vm->playSound(kAudioVoiceHalt);
+ _gm->drawImage(_gm->invertSection(1));
+ _gm->wait2(5);
+ _gm->drawImage(2);
+ _gm->wait2(2);
+ _gm->shot(3, _gm->invertSection(3));
+ break;
+ case 3:
+ if (_gm->_state._money >= 900) {
+ stopInteract(_gm->_state._money);
+ return true;
+ }
+ case 2:
+ if (_gm->_state._money > 1100) {
+ stopInteract(_gm->_state._money - 200);
+ return true;
+ }
+ _gm->reply(kStringAxacussCorridor5_6, 1, 1 + 128);
+ }
+ }
+ return false;
+}
- int sum;
+void AxacussCorridor5::stopInteract(int sum) {
+ _gm->reply(kStringAxacussCorridor5_7, 1, 1 + 128);
+ _gm->great(0);
+ _gm->changeRoom(ELEVATOR);
+ _gm->_newRoom = true;
+ _gm->takeMoney(-sum);
+}
+bool AxacussCorridor5::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_WALK) && (obj1._id == DOOR)) {
g_system->fillScreen(kColorBlack);
_vm->renderImage(41, 0);
_vm->paletteBrightness();
if (_gm->_guiEnabled) {
_gm->reply(kStringAxacussCorridor5_1, 1, 1 + 128);
- goto bestechen;
+ if (handleMoneyDialog())
+ return true;
} else {
_gm->_guiEnabled = true;
_gm->reply(kStringAxacussCorridor5_2, 1, 1 + 128);
- if (_gm->dialog(2, rows, _dialog1, 0))
+ if (_gm->dialog(2, _rows, _dialog1, 0))
_gm->reply(kStringAxacussCorridor5_3, 1, 1 + 128);
else {
_gm->reply(kStringAxacussCorridor5_4, 1, 1 + 128);
-bestechen:
- if (_gm->dialog(2, rows, _dialog2, 0) == 0) {
- _gm->reply(kStringAxacussCorridor5_5, 1, 1 + 128);
- setSectionVisible(kMaxSection - 2, false);
- if (_gm->_state._money == 0) {
- _gm->removeSentence(2, 2);
- _gm->removeSentence(3, 2);
- } else {
- // TODO: Handle string manipulation in dialogs
- // _dialog3[2] and _dialog3[3] are both using kStringDialogAxacussCorridor5_7
- // ("Wenn Sie mich durchlassen gebe ich Ihnen %d Xa.")
- // One way could be to keep an array of string[6], replace the %d of the previous sentence by a %s,
- // and format the dialog string when the associated parameter string isn't empty.
- // The following code is broken and only kept in order to remember the values used.
- // _dialog3[2] += Common::String::format(kStringDialogAxacussCorridor5_7, _gm->_state._money - 200);
- // _dialog3[3] += Common::String::format(kStringDialogAxacussCorridor5_7, _gm->_state._money);
- }
- switch (_gm->dialog(4, rows, _dialog3, 2)) {
- case 1:
- _gm->wait2(3);
- _gm->drawImage(1);
- _vm->playSound(kAudioVoiceHalt);
- _gm->drawImage(_gm->invertSection(1));
- _gm->wait2(5);
- _gm->drawImage(2);
- _gm->wait2(2);
- _gm->shot(3, _gm->invertSection(3));
- break;
- case 3:
- if (_gm->_state._money >= 900) {
- sum = _gm->_state._money;
- goto genug;
- }
- case 2:
- if (_gm->_state._money > 1100) {
- sum = _gm->_state._money - 200;
- goto genug;
- }
- _gm->reply(kStringAxacussCorridor5_6, 1, 1 + 128);
- }
- }
+ if (handleMoneyDialog())
+ return true;
}
}
g_system->fillScreen(kColorBlack);
return true;
-
-genug:
- _gm->reply(kStringAxacussCorridor5_7, 1, 1 + 128);
- _gm->great(0);
- _gm->changeRoom(ELEVATOR);
- _gm->_newRoom = true;
- _gm->takeMoney(-sum);
- return true;
}
return false;
}
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index d609b0d..e3b30f8 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -973,17 +973,30 @@ public:
_dialog3[1] = kStringDialogAxacussCorridor5_6;
_dialog3[2] = kStringDialogAxacussCorridor5_7;
_dialog3[3] = kStringDialogAxacussCorridor5_7;
+
+ _rows[0] = 1;
+ _rows[1] = 1;
+ _rows[2] = 1;
+ _rows[3] = 1;
+ _rows[4] = 0;
+ _rows[5] = 0;
}
virtual void onEntrance();
virtual bool interact(Action verb, Object &obj1, Object &obj2);
private:
+ void stopInteract(int sum);
+ bool handleMoneyDialog();
+
// TODO: Change to 6, or change struct, and fix initialization
StringID _dialog1[2];
StringID _dialog2[2];
StringID _dialog3[4];
+
+ byte _rows[6];
};
+
class AxacussCorridor6 : public Room {
public:
AxacussCorridor6(SupernovaEngine *vm, GameManager *gm) {
Commit: c4ee3e72b7de44aae851b4d08802643479af8c82
https://github.com/scummvm/scummvm/commit/c4ee3e72b7de44aae851b4d08802643479af8c82
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:35Z
Commit Message:
SUPERNOVA: Extract some more stings from rooms.cpp
Changed paths:
devtools/create_supernova/gametext.h
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index a3ec589..b659ebd 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -690,12 +690,30 @@ const char *gameText[] = {
"Nein!", // kStringAxacussCorridor5_5
"Das m\201\341te schon ein bi\341chen mehr sein.", // kStringAxacussCorridor5_6
// 545
- "Ok, dann machen Sie da\341 Sie wegkommen!", kStringAxacussCorridor5_7
- "",
- "",
- "",
- "",
+ "Ok, dann machen Sie da\341 Sie wegkommen!", // kStringAxacussCorridor5_7
+ "Du stellst dich hinter die S\204ule.", // kStringAxacussBcorridor_1
+ "Welche Zahlenkombination willst|du eingeben?", // kStringAxacussOffice1_1
+ "Hmm, das haut nicht ganz hin,|aber irgendwie mu\341 die Zahl|mit dem Code zusammenh\204ngen.", // kStringAxacussOffice1_2
+ "Das war die falsche Kombination.", // kStringAxacussOffice1_3
// 550
+ "Streng geheim", // kStringAxacussOffice1_4
+ "418-98", // kStringAxacussOffice1_5
+ "Sehr geehrter Dr. Hansi,", // kStringAxacussOffice1_6
+ "Ich muá Ihren Roboterexperten ein Lob aussprechen. Die", // kStringAxacussOffice1_7
+ "Imitation von Horst Hummel ist perfekt gelungen, wie ich", // kStringAxacussOffice1_8
+ // 555
+ "heute bei der \232bertragung des Interviews feststellen", // kStringAxacussOffice1_9
+ "konnte. Dem Aufschwung Ihrer Firma durch die Werbe-", // kStringAxacussOffice1_10
+ "kampagne mit dem falschen Horst Hummel d\201rfte ja jetzt", // kStringAxacussOffice1_11
+ "nichts mehr im Wege stehen.", // kStringAxacussOffice1_12
+ "PS: Herzlichen zum Geburtstag!", // kStringAxacussOffice1_13
+ // 560
+ "Hochachtungsvoll", // kStringAxacussOffice1_14
+ "Commander Sumoti", // kStringAxacussOffice1_15
+ "Nicht zu fassen!", // kStringAxacussOffice1_16
+ "Hey, hinter dem Bild ist Geld|versteckt. Ich nehme es mit.", // kStringAxacussOffice3_1
+ "",
+ // 565
NULL
};
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 3a8b920..cf76198 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -529,7 +529,11 @@ enum StringID {
kStringDialogAxacussCorridor5_2, kStringDialogAxacussCorridor5_3, kStringDialogAxacussCorridor5_4, kStringDialogAxacussCorridor5_5, kStringDialogAxacussCorridor5_6,
kStringDialogAxacussCorridor5_7, kStringDialogX1, kStringDialogX2, kStringDialogX3, kStringAxacussCorridor5_1,
kStringAxacussCorridor5_2, kStringAxacussCorridor5_3, kStringAxacussCorridor5_4, kStringAxacussCorridor5_5, kStringAxacussCorridor5_6,
- kStringAxacussCorridor5_7
+ kStringAxacussCorridor5_7, kStringAxacussBcorridor_1, kStringAxacussOffice1_1, kStringAxacussOffice1_2, kStringAxacussOffice1_3,
+ kStringAxacussOffice1_4, kStringAxacussOffice1_5, kStringAxacussOffice1_6, kStringAxacussOffice1_7, kStringAxacussOffice1_8,
+ kStringAxacussOffice1_9, kStringAxacussOffice1_10, kStringAxacussOffice1_11, kStringAxacussOffice1_12, kStringAxacussOffice1_13,
+ kStringAxacussOffice1_14, kStringAxacussOffice1_15, kStringAxacussOffice1_16, kStringAxacussOffice3_1, kStringAxacussElevator_1,
+ kStringAxacussElevator_2, kStringAxacussElevator_3
};
static StringID guiCommands[] = {
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 74f9c43..f7d4f15 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2818,7 +2818,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
return false;
} else if ((verb == ACTION_WALK) &&
((obj1._id == PILLAR1) || (obj1._id == PILLAR2))) {
- _vm->renderMessage("Du stellst dich hinter die S\204ule.");
+ _vm->renderMessage(kStringAxacussBcorridor_1);
_gm->_guiEnabled = true;
} else
return false;
@@ -2860,7 +2860,7 @@ bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
} else if (((verb == ACTION_OPEN) || (verb == ACTION_USE)) &&
(obj1._id == LOCKER) &&
!obj1.hasProperty(OPENED)) {
- _vm->renderMessage("Welche Zahlenkombination willst|du eingeben?");
+ _vm->renderMessage(kStringAxacussOffice1_1);
_vm->renderBox(160, 70, 70, 10, kColorDarkBlue);
_gm->edit(input, 161, 71, 10);
@@ -2868,9 +2868,9 @@ bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
if (_gm->_key.keycode != Common::KEYCODE_ESCAPE) {
if (!input.equals("89814")) {
if (input.equals("41898"))
- _vm->renderMessage("Hmm, das haut nicht ganz hin,|aber irgendwie mu\341 die Zahl|mit dem Code zusammenh\204ngen.");
+ _vm->renderMessage(kStringAxacussOffice1_2);
else
- _vm->renderMessage("Das war die falsche Kombination.");
+ _vm->renderMessage(kStringAxacussOffice1_3);
} else {
_gm->drawImage(6);
setSectionVisible(7, false);
@@ -2899,21 +2899,21 @@ bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
_gm->takeMoney(500);
} else if ((verb == ACTION_LOOK) && (obj1._id == LETTER)) {
g_system->fillScreen(kColorBlack);
- _vm->renderText("Streng geheim", 10, 10, 4);
- _vm->renderText("418-98", 270, 10, 4);
- _vm->renderText("Sehr geehrter Dr. Hansi,", 10, 60, 4);
- _vm->renderText("Ich muá Ihren Roboterexperten ein Lob aussprechen. Die", 10, 75, 4);
- _vm->renderText("Imitation von Horst Hummel ist perfekt gelungen, wie ich", 10, 86, 4);
- _vm->renderText("heute bei der \232bertragung des Interviews feststellen", 10, 97, 4);
- _vm->renderText("konnte. Dem Aufschwung Ihrer Firma durch die Werbe-", 10, 108, 4);
- _vm->renderText("kampagne mit dem falschen Horst Hummel d\201rfte ja jetzt", 10, 119, 4);
- _vm->renderText("nichts mehr im Wege stehen.", 10, 130, 4);
- _vm->renderText("PS: Herzlichen zum Geburtstag!", 10, 147, 4);
- _vm->renderText("Hochachtungsvoll", 200, 170, 4);
- _vm->renderText("Commander Sumoti", 200, 181, 4);
+ _vm->renderText(kStringAxacussOffice1_4, 10, 10, 4);
+ _vm->renderText(kStringAxacussOffice1_5, 270, 10, 4);
+ _vm->renderText(kStringAxacussOffice1_6, 10, 60, 4);
+ _vm->renderText(kStringAxacussOffice1_7, 10, 75, 4);
+ _vm->renderText(kStringAxacussOffice1_8, 10, 86, 4);
+ _vm->renderText(kStringAxacussOffice1_9, 10, 97, 4);
+ _vm->renderText(kStringAxacussOffice1_10, 10, 108, 4);
+ _vm->renderText(kStringAxacussOffice1_11, 10, 119, 4);
+ _vm->renderText(kStringAxacussOffice1_12, 10, 130, 4);
+ _vm->renderText(kStringAxacussOffice1_13, 10, 147, 4);
+ _vm->renderText(kStringAxacussOffice1_14, 200, 170, 4);
+ _vm->renderText(kStringAxacussOffice1_15, 200, 181, 4);
_gm->getInput();
g_system->fillScreen(kColorBlack);
- _vm->renderMessage("Nicht zu fassen!");
+ _vm->renderMessage(kStringAxacussOffice1_16);
} else
return false;
@@ -2966,7 +2966,7 @@ bool AxacussOffice3::interact(Action verb, Object &obj1, Object &obj2) {
else
_gm->telomat(2);
} else if ((verb == ACTION_LOOK) && (obj1._id == PAINTING)) {
- _vm->renderMessage("Hey, hinter dem Bild ist Geld|versteckt. Ich nehme es mit.");
+ _vm->renderMessage(kStringAxacussOffice3_1);
_gm->takeMoney(300);
obj1._id = NULLOBJECT;
} else
@@ -3023,8 +3023,8 @@ bool AxacussElevator::interact(Action verb, Object &obj1, Object &obj2) {
g_system->fillScreen(kColorBlack);
_vm->renderImage(41, 0);
_vm->paletteBrightness();
- _gm->reply("Jetzt verschwinden Sie endlich!", 1, 1 + 128);
- _gm->say("Huch, ich habe mich vertan.");
+ _gm->reply(kStringAxacussElevator_1, 1, 1 + 128);
+ _gm->say(kStringAxacussElevator_2);
g_system->fillScreen(kColorBlack);
} else if ((verb == ACTION_PRESS) && (obj1._id == BUTTON1)) {
if (!isSectionVisible(3)) {
@@ -3064,7 +3064,7 @@ bool AxacussElevator::interact(Action verb, Object &obj1, Object &obj2) {
g_system->fillScreen(kColorBlack);
_vm->_menuBrightness = 255;
_vm->paletteBrightness();
- _vm->renderMessage("Nachdem du zwei Stunden im|Dschungel herumgeirrt bist,|findest du ein Geb\204ude.");
+ _vm->renderMessage(kStringAxacussElevator_3);
_gm->mouseWait(_gm->_timer1);
_vm->removeMessage();
_vm->_menuBrightness = 0;
Commit: d4351a5ff2fbe5124a4680ed1508ef77b808ffb9
https://github.com/scummvm/scummvm/commit/d4351a5ff2fbe5124a4680ed1508ef77b808ffb9
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:36Z
Commit Message:
SUPERNOVA: Extract some strings from state.cpp
Changed paths:
devtools/create_supernova/gametext.h
engines/supernova/msn_def.h
engines/supernova/state.cpp
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index b659ebd..9134512 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -712,8 +712,32 @@ const char *gameText[] = {
"Commander Sumoti", // kStringAxacussOffice1_15
"Nicht zu fassen!", // kStringAxacussOffice1_16
"Hey, hinter dem Bild ist Geld|versteckt. Ich nehme es mit.", // kStringAxacussOffice3_1
- "",
+ "Jetzt verschwinden Sie endlich!", // kStringAxacussElevator_1
// 565
+ "Huch, ich habe mich vertan.", // kStringAxacussElevator_2
+ "Nachdem du zwei Stunden im|Dschungel herumgeirrt bist,|findest du ein Geb\204ude.", // kStringAxacussElevator_3
+ "Du h\204ttest besser vorher|den Stecker rausgezogen.", // kStringShock
+ "Der Axacussaner hat dich erwischt.", // kStringShot
+ "Das ist schon geschlossen.", // kStringCloseLocker_1
+ // 570
+ "Irgendwie ist ein Raumhelm|beim Essen unpraktisch.", // kStringIsHelmetOff_1
+ "Schmeckt ganz gut.", // kStringGenericInteract_1
+ "Da war irgendetwas drin,|aber jetzt hast du es|mit runtergeschluckt.", // kStringGenericInteract_2
+ "Du hast es doch schon ge\224ffnet.", // kStringGenericInteract_3
+ "In dem Ei ist eine Tablette|in einer Plastikh\201lle.", // kStringGenericInteract_4
+ // 575
+ "Du iát die Tablette und merkst,|da\341 sich irgendetwas ver\216ndert hat.", // kStringGenericInteract_5
+ "Komisch! Auf einmal kannst du die Schrift lesen!|Darauf steht:\"Wenn Sie diese Schrift jetzt|lesen k\224nnen, hat die Tablette gewirkt.\"", // kStringGenericInteract_6
+ "Das mu\341t du erst nehmen.", // kStringGenericInteract_7
+ "Sie ist leer.", // kStringGenericInteract_8
+ "Du findest 10 Buckazoids und eine Keycard.", // kStringGenericInteract_9
+ // 580
+ "Es ist eine Art elektronische Zeitung.", // kStringGenericInteract_10
+ "Halt, hier ist ein interessanter Artikel.", // kStringGenericInteract_11
+ "Hmm, irgendwie komme|ich mir verarscht vor.", // kStringGenericInteract_12
+ "",
+ "",
+ // 585
NULL
};
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index cf76198..a3d45bc 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -533,7 +533,10 @@ enum StringID {
kStringAxacussOffice1_4, kStringAxacussOffice1_5, kStringAxacussOffice1_6, kStringAxacussOffice1_7, kStringAxacussOffice1_8,
kStringAxacussOffice1_9, kStringAxacussOffice1_10, kStringAxacussOffice1_11, kStringAxacussOffice1_12, kStringAxacussOffice1_13,
kStringAxacussOffice1_14, kStringAxacussOffice1_15, kStringAxacussOffice1_16, kStringAxacussOffice3_1, kStringAxacussElevator_1,
- kStringAxacussElevator_2, kStringAxacussElevator_3
+ kStringAxacussElevator_2, kStringAxacussElevator_3, kStringShock, kStringShot, kStringCloseLocker_1,
+ kStringIsHelmetOff_1, kStringGenericInteract_1, kStringGenericInteract_2, kStringGenericInteract_3, kStringGenericInteract_4,
+ kStringGenericInteract_5, kStringGenericInteract_6, kStringGenericInteract_7, kStringGenericInteract_8, kStringGenericInteract_9,
+ kStringGenericInteract_10, kStringGenericInteract_11, kStringGenericInteract_12
};
static StringID guiCommands[] = {
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index e95c4ec..f40b1fc 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1043,7 +1043,7 @@ void GameManager::screenShake() {
void GameManager::shock() {
_vm->playSound(kAudioShock);
- dead("Du h\204ttest besser vorher|den Stecker rausgezogen.");
+ dead(kStringShock);
}
void GameManager::showMenu() {
@@ -1167,7 +1167,7 @@ void GameManager::shot(int a, int b) {
if (b)
drawImage(b);
- dead("Der Axacussaner hat dich erwischt.");
+ dead(kStringShot);
}
void GameManager::takeMoney(int amount) {
@@ -1218,7 +1218,7 @@ void GameManager::openLocker(const Room *room, Object *obj, Object *lock, int se
void GameManager::closeLocker(const Room *room, Object *obj, Object *lock, int section) {
if (!obj->hasProperty(OPENED)) {
- _vm->renderMessage("Das ist schon geschlossen.");
+ _vm->renderMessage(kStringCloseLocker_1);
} else {
drawImage(invertSection(section));
obj->disableProperty(OPENED);
@@ -1290,7 +1290,7 @@ int GameManager::invertSection(int section) {
bool GameManager::isHelmetOff() {
Object *helmet = _inventory.get(HELMET);
if (helmet && helmet->hasProperty(WORN)) {
- _vm->renderMessage("Irgendwie ist ein Raumhelm|beim Essen unpraktisch.");
+ _vm->renderMessage(kStringIsHelmetOff_1);
return false;
}
@@ -1304,31 +1304,31 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_USE) && (obj1._id == SCHNUCK)) {
if (isHelmetOff()) {
takeObject(obj1);
- _vm->renderMessage("Schmeckt ganz gut.");
+ _vm->renderMessage(kStringGenericInteract_1);
_inventory.remove(obj1);
}
} else if ((verb == ACTION_USE) && (obj1._id == EGG)) {
if (isHelmetOff()) {
takeObject(obj1);
if (obj1.hasProperty(OPENED))
- _vm->renderMessage("Schmeckt ganz gut.");
+ _vm->renderMessage(kStringGenericInteract_1);
else
- _vm->renderMessage("Da war irgendetwas drin,|aber jetzt hast du es|mit runtergeschluckt.");
+ _vm->renderMessage(kStringGenericInteract_2);
_inventory.remove(obj1);
}
} else if ((verb == ACTION_OPEN) && (obj1._id == EGG)) {
takeObject(obj1);
if (obj1.hasProperty(OPENED)) {
- _vm->renderMessage("Du hast es doch schon ge\224ffnet.");
+ _vm->renderMessage(kStringGenericInteract_3);
} else {
takeObject(*_rooms[ENTRANCE]->getObject(8));
- _vm->renderMessage("In dem Ei ist eine Tablette|in einer Plastikh\201lle.");
+ _vm->renderMessage(kStringGenericInteract_4);
obj1.setProperty(OPENED);
}
} else if ((verb == ACTION_USE) && (obj1._id == PILL)) {
if (isHelmetOff()) {
- _vm->renderMessage("Du iát die Tablette und merkst,|da\341 sich irgendetwas ver\216ndert hat.");
+ _vm->renderMessage(kStringGenericInteract_5);
great(0);
_inventory.remove(obj1);
_state._language = 2;
@@ -1336,23 +1336,23 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
}
} else if ((verb == ACTION_LOOK) && (obj1._id == PILL_HULL) &&
(_state._language == 2)) {
- _vm->renderMessage("Komisch! Auf einmal kannst du die Schrift lesen!|Darauf steht:\"Wenn Sie diese Schrift jetzt|lesen k\224nnen, hat die Tablette gewirkt.\"");
+ _vm->renderMessage(kStringGenericInteract_6);
_state._language = 1;
} else if ((verb == ACTION_OPEN) && (obj1._id == WALLET)) {
if (!_rooms[ROGER]->getObject(3)->hasProperty(CARRIED)) {
- _vm->renderMessage("Das mu\341t du erst nehmen.");
+ _vm->renderMessage(kStringGenericInteract_7);
} else if (_rooms[ROGER]->getObject(7)->hasProperty(CARRIED)) {
- _vm->renderMessage("Sie ist leer.");
+ _vm->renderMessage(kStringGenericInteract_8);
} else {
- _vm->renderMessage("Du findest 10 Buckazoids und eine Keycard.");
+ _vm->renderMessage(kStringGenericInteract_9);
takeObject(*_rooms[ROGER]->getObject(7));
takeObject(*_rooms[ROGER]->getObject(8));
}
} else if ((verb == ACTION_LOOK) && (obj1._id == NEWSPAPER)) {
- _vm->renderMessage("Es ist eine Art elektronische Zeitung.");
+ _vm->renderMessage(kStringGenericInteract_10);
mouseWait(_timer1);
_vm->removeMessage();
- _vm->renderMessage("Halt, hier ist ein interessanter Artikel.");
+ _vm->renderMessage(kStringGenericInteract_11);
mouseWait(_timer1);
_vm->removeMessage();
_vm->renderImage(2, 0);
@@ -1360,15 +1360,13 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
getInput();
_vm->renderRoom(*_currentRoom);
roomBrightness();
- _vm->renderMessage("Hmm, irgendwie komme|ich mir verarscht vor.");
+ _vm->renderMessage(kStringGenericInteract_12);
} else if ((verb == ACTION_LOOK) && (obj1._id == KEYCARD2)) {
_vm->renderMessage(obj1._description);
obj1._description = kStringKeycard2Description2;
} else if ((verb == ACTION_LOOK) && (obj1._id == WATCH)) {
_vm->renderMessage(Common::String::format(
- "Es ist eine Uhr mit extra|lautem Wecker. "
- "Sie hat einen|Knopf zum Verstellen der Alarmzeit.|"
- "Uhrzeit: %s Alarmzeit: %s",
+ "Es ist eine Uhr mit extra|lautem Wecker. Sie hat einen|Knopf zum Verstellen der Alarmzeit.|Uhrzeit: %s Alarmzeit: %s",
timeToString(_state._time).c_str(),
timeToString(_state._timeAlarm).c_str()).c_str());
} else if ((verb == ACTION_PRESS) && (obj1._id == WATCH)) {
Commit: 21415efa40719b9b6b494864727a25ce579476f7
https://github.com/scummvm/scummvm/commit/21415efa40719b9b6b494864727a25ce579476f7
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:36Z
Commit Message:
SUPERNOVA: Use octal value for non-ASCII characters in game text
Changed paths:
devtools/create_supernova/gametext.h
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index 9134512..ab6189b 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -699,7 +699,7 @@ const char *gameText[] = {
"Streng geheim", // kStringAxacussOffice1_4
"418-98", // kStringAxacussOffice1_5
"Sehr geehrter Dr. Hansi,", // kStringAxacussOffice1_6
- "Ich muá Ihren Roboterexperten ein Lob aussprechen. Die", // kStringAxacussOffice1_7
+ "Ich mu\341 Ihren Roboterexperten ein Lob aussprechen. Die", // kStringAxacussOffice1_7
"Imitation von Horst Hummel ist perfekt gelungen, wie ich", // kStringAxacussOffice1_8
// 555
"heute bei der \232bertragung des Interviews feststellen", // kStringAxacussOffice1_9
@@ -726,7 +726,7 @@ const char *gameText[] = {
"Du hast es doch schon ge\224ffnet.", // kStringGenericInteract_3
"In dem Ei ist eine Tablette|in einer Plastikh\201lle.", // kStringGenericInteract_4
// 575
- "Du iát die Tablette und merkst,|da\341 sich irgendetwas ver\216ndert hat.", // kStringGenericInteract_5
+ "Du i\341t die Tablette und merkst,|da\341 sich irgendetwas ver\216ndert hat.", // kStringGenericInteract_5
"Komisch! Auf einmal kannst du die Schrift lesen!|Darauf steht:\"Wenn Sie diese Schrift jetzt|lesen k\224nnen, hat die Tablette gewirkt.\"", // kStringGenericInteract_6
"Das mu\341t du erst nehmen.", // kStringGenericInteract_7
"Sie ist leer.", // kStringGenericInteract_8
Commit: 5b25fc282d77ed439fbb5369c784cbc6581431c0
https://github.com/scummvm/scummvm/commit/5b25fc282d77ed439fbb5369c784cbc6581431c0
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:36Z
Commit Message:
SUPERNOVA: Update English translation
Changed paths:
devtools/create_supernova/strings-en.po
diff --git a/devtools/create_supernova/strings-en.po b/devtools/create_supernova/strings-en.po
index 3938962..266e37f 100644
--- a/devtools/create_supernova/strings-en.po
+++ b/devtools/create_supernova/strings-en.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Mission Supernova 1.0\n"
"Report-Msgid-Bugs-To: scummvm-devel at lists.scummvm.org\n"
-"POT-Creation-Date: 2017-07-21 23:49+0100\n"
-"PO-Revision-Date: 2017-10-17 15:53+0000\n"
+"POT-Creation-Date: 2017-07-22 19:53+0100\n"
+"PO-Revision-Date: 2017-10-22 18:01+0000\n"
"Last-Translator: Thierry Crozat <criezy at scummvm.org>\n"
"Language-Team: none\n"
"Language: en\n"
@@ -43,10 +43,10 @@ msgstr "Open"
msgid "Schlieáe"
msgstr "Close"
-#. I18N: Press
+#. I18N: Push
#: ../../msn/msn.c:1620
msgid "Drcke"
-msgstr "Press"
+msgstr "Push"
#. I18N: Pull
#: ../../msn/msn.c:1622
@@ -98,10 +98,10 @@ msgstr "Open "
msgid "Schlieáe "
msgstr "Close "
-#. I18N: Press
+#. I18N: Push
#: ../../msn/msn.c:2344
msgid "Drcke "
-msgstr "Press "
+msgstr "Push "
#. I18N: Pull
#: ../../msn/msn.c:2346
@@ -338,30 +338,35 @@ msgid "und vieles mehr!##"
msgstr "and much more!##"
#. I18N: There's nothing special about it
-#: ../../msn/msn_r0.c:25
+#: ../../msn/msn_r0.c:26
msgid "Es ist nichts Besonderes daran."
msgstr "There's nothing special about it."
#. I18N: You first have to take it
-#: ../../msn/msn_r0.c:27 ../../msn/msn_r0.c:230
+#: ../../msn/msn_r0.c:28 ../../msn/msn_r0.c:230
msgid "Das muát du erst nehmen."
msgstr "You first have to take it."
#. I18N: Hello
-#: ../../msn/msn_r0.c:32
+#: ../../msn/msn_r0.c:33
msgid "Hallo!"
msgstr "Hello!"
#. I18N: Good day!
-#: ../../msn/msn_r0.c:34
+#: ../../msn/msn_r0.c:35
msgid "Guten Tag!"
msgstr "Good day!"
#. I18N: It's me, Horst Hummel
-#: ../../msn/msn_r0.c:36
+#: ../../msn/msn_r0.c:37
msgid "Ich bin's, Horst Hummel."
msgstr "It's me, Horst Hummel."
+#: ../../msn/msn_r0.c:127
+#, c-format
+msgid "%d Xa"
+msgstr "%d Xa"
+
#: ../../msn/msn_r0.c:147
msgid "Ok."
msgstr "OK."
@@ -425,14 +430,10 @@ msgstr "This is the keycard of the Commander."
#: ../../msn/msn_r0.c:277
msgid ""
"Es ist eine Uhr mit extra|lautem Wecker. Sie hat einen|Knopf zum Verstellen "
-"der Alarmzeit.|Uhrzeit: "
+"der Alarmzeit.|Uhrzeit: %s Alarmzeit: %s"
msgstr ""
"This is a clock with a very loud alarm. It has a button|for adjusting the "
-"alarm time.|Time: "
-
-#: ../../msn/msn_r0.c:279
-msgid " Alarmzeit: "
-msgstr " Alarm time: "
+"alarm time.|Time: %s Alarm: %s"
#: ../../msn/msn_r0.c:291
msgid "Neue Alarmzeit (hh:mm) :"
@@ -544,7 +545,7 @@ msgstr "pocket knife"
msgid "Es ist nicht mehr das schrfste."
msgstr "It is quite blunt."
-#: ../../msn/msn_r0.c:807 ../../msn/msn_r3.c:1531
+#: ../../msn/msn_r0.c:807 ../../msn/msn_r3.c:1527
msgid "Armbanduhr"
msgstr "watch"
@@ -559,7 +560,8 @@ msgstr "There is a \"Mad Monkeys\" CD in it."
#: ../../msn/msn_r1.c:58
msgid ""
"In der Kche warst du schon|oft genug, im Moment hast|du keinen Appetit."
-msgstr "You have been often enough|in the kitchen and you are|no longer hungry."
+msgstr ""
+"You have been often enough|in the kitchen and you are|no longer hungry."
#. I18N: FORTYTWO
#: ../../msn/msn_r1.c:91
@@ -589,7 +591,7 @@ msgstr "Please lay down in the indicated stasis pod."
msgid "Bitte Passwort eingeben:"
msgstr "Please enter your password:"
-#: ../../msn/msn_r1.c:135 ../../msn/msn_r3.c:1175
+#: ../../msn/msn_r1.c:135 ../../msn/msn_r3.c:1171
msgid "Falsches Passwort"
msgstr "Password incorrect"
@@ -633,8 +635,9 @@ msgstr ""
"consciousness."
#: ../../msn/msn_r1.c:295
+#, fuzzy
msgid "Was steht dir jetzt wohl wirklich bevor?"
-msgstr ""
+msgstr "What is going to happen to you now?"
#: ../../msn/msn_r1.c:307
msgid "Geschwindigkeit: "
@@ -796,7 +799,7 @@ msgstr "You should cut a longer|piece of cable!"
msgid "Leitung mit Stecker"
msgstr "Cable with plug"
-#: ../../msn/msn_r1.c:1008 ../../msn/msn_r3.c:74
+#: ../../msn/msn_r1.c:1008 ../../msn/msn_r3.c:75
msgid "Das ist befestigt."
msgstr "This is fixed."
@@ -839,8 +842,8 @@ msgstr "Hatch"
#: ../../msn/msn_r1_r.c:23 ../../msn/msn_r1_r.c:67 ../../msn/msn_r1_r.c:68
#: ../../msn/msn_r1_r.c:103 ../../msn/msn_r1_r.c:239 ../../msn/msn_r2.c:1256
#: ../../msn/msn_r2.c:1293 ../../msn/msn_r2.c:1294 ../../msn/msn_r2.c:1295
-#: ../../msn/msn_r2.c:1296 ../../msn/msn_r3.c:1483 ../../msn/msn_r3.c:1681
-#: ../../msn/msn_r3.c:1682
+#: ../../msn/msn_r2.c:1296 ../../msn/msn_r3.c:1479 ../../msn/msn_r3.c:1677
+#: ../../msn/msn_r3.c:1678
msgid "Knopf"
msgstr "Button"
@@ -855,14 +858,14 @@ msgstr "Ladder"
#: ../../msn/msn_r1_r.c:25 ../../msn/msn_r1_r.c:47 ../../msn/msn_r1_r.c:57
#: ../../msn/msn_r1_r.c:92 ../../msn/msn_r1_r.c:293 ../../msn/msn_r2.c:1221
#: ../../msn/msn_r2.c:1223 ../../msn/msn_r2.c:1259 ../../msn/msn_r2.c:1277
-#: ../../msn/msn_r2.c:1292 ../../msn/msn_r3.c:1502 ../../msn/msn_r3.c:1503
-#: ../../msn/msn_r3.c:1510 ../../msn/msn_r3.c:1511 ../../msn/msn_r3.c:1512
-#: ../../msn/msn_r3.c:1519 ../../msn/msn_r3.c:1526 ../../msn/msn_r3.c:1527
-#: ../../msn/msn_r3.c:1539 ../../msn/msn_r3.c:1540 ../../msn/msn_r3.c:1547
-#: ../../msn/msn_r3.c:1548 ../../msn/msn_r3.c:1556 ../../msn/msn_r3.c:1557
-#: ../../msn/msn_r3.c:1565 ../../msn/msn_r3.c:1572 ../../msn/msn_r3.c:1582
-#: ../../msn/msn_r3.c:1583 ../../msn/msn_r3.c:1598 ../../msn/msn_r3.c:1612
-#: ../../msn/msn_r3.c:1683 ../../msn/msn_r3.c:1699
+#: ../../msn/msn_r2.c:1292 ../../msn/msn_r3.c:1498 ../../msn/msn_r3.c:1499
+#: ../../msn/msn_r3.c:1506 ../../msn/msn_r3.c:1507 ../../msn/msn_r3.c:1508
+#: ../../msn/msn_r3.c:1515 ../../msn/msn_r3.c:1522 ../../msn/msn_r3.c:1523
+#: ../../msn/msn_r3.c:1535 ../../msn/msn_r3.c:1536 ../../msn/msn_r3.c:1543
+#: ../../msn/msn_r3.c:1544 ../../msn/msn_r3.c:1552 ../../msn/msn_r3.c:1553
+#: ../../msn/msn_r3.c:1561 ../../msn/msn_r3.c:1568 ../../msn/msn_r3.c:1578
+#: ../../msn/msn_r3.c:1579 ../../msn/msn_r3.c:1594 ../../msn/msn_r3.c:1608
+#: ../../msn/msn_r3.c:1679 ../../msn/msn_r3.c:1695
msgid "Ausgang"
msgstr "Exit"
@@ -884,7 +887,7 @@ msgstr "It leads to the stasis pods."
#: ../../msn/msn_r1_r.c:220 ../../msn/msn_r1_r.c:246 ../../msn/msn_r1_r.c:256
#: ../../msn/msn_r1_r.c:257 ../../msn/msn_r1_r.c:258 ../../msn/msn_r1_r.c:259
#: ../../msn/msn_r1_r.c:280 ../../msn/msn_r2.c:1252 ../../msn/msn_r2.c:1298
-#: ../../msn/msn_r3.c:1700
+#: ../../msn/msn_r3.c:1696
msgid "Schlitz"
msgstr "Slot"
@@ -897,7 +900,7 @@ msgstr "Slot"
msgid "Es ist ein Keycard-Leser."
msgstr "It is a keycard reader."
-#: ../../msn/msn_r1_r.c:38 ../../msn/msn_r3.c:1599
+#: ../../msn/msn_r1_r.c:38 ../../msn/msn_r3.c:1595
msgid "Gang"
msgstr "Corridor"
@@ -905,8 +908,8 @@ msgstr "Corridor"
msgid "Dies ist eine der Tiefschlafkammern."
msgstr "This is one of the stasis pods."
-#: ../../msn/msn_r1_r.c:46 ../../msn/msn_r3.c:1626 ../../msn/msn_r3.c:1638
-#: ../../msn/msn_r3.c:1649 ../../msn/msn_r3.c:1661 ../../msn/msn_r3.c:1672
+#: ../../msn/msn_r1_r.c:46 ../../msn/msn_r3.c:1622 ../../msn/msn_r3.c:1634
+#: ../../msn/msn_r3.c:1645 ../../msn/msn_r3.c:1657 ../../msn/msn_r3.c:1668
msgid "Computer"
msgstr "Computer"
@@ -1025,7 +1028,7 @@ msgstr "It supplies power to the spaceship."
#: ../../msn/msn_r1_r.c:102 ../../msn/msn_r1_r.c:154 ../../msn/msn_r1_r.c:169
#: ../../msn/msn_r1_r.c:205 ../../msn/msn_r1_r.c:223 ../../msn/msn_r1_r.c:249
-#: ../../msn/msn_r1_r.c:283 ../../msn/msn_r3.c:1490
+#: ../../msn/msn_r1_r.c:283 ../../msn/msn_r3.c:1486
msgid "Steckdose"
msgstr "Socket"
@@ -1033,7 +1036,7 @@ msgstr "Socket"
msgid ""
"Es ist ein Sicherheitsknopf.|Er kann nur mit einem spitzen|Gegenstand "
"gedrckt werden."
-msgstr "It's a safety button.|It can only be pressed|with a pointed object."
+msgstr "It's a safety button.|It can only be pushed|with a pointed object."
#: ../../msn/msn_r1_r.c:106 ../../msn/msn_r2.c:1300
msgid "Tastatur"
@@ -1048,8 +1051,8 @@ msgid ""
"Hey, das ist die Keycard des Commanders!|Er muá sie bei dem berstrzten|"
"Aufbruch verloren haben."
msgstr ""
-"Hey, that's the commander's keycard!|He must have lost it in the "
-"rushed|departure."
+"Hey, that's the commander's keycard!|He must have lost it in the rushed|"
+"departure."
#: ../../msn/msn_r1_r.c:119 ../../msn/msn_r1_r.c:137 ../../msn/msn_r1_r.c:188
#: ../../msn/msn_r2.c:1212
@@ -1061,7 +1064,7 @@ msgid "Klappe"
msgstr "Hatch"
#: ../../msn/msn_r1_r.c:125 ../../msn/msn_r1_r.c:128 ../../msn/msn_r1_r.c:242
-#: ../../msn/msn_r1_r.c:243 ../../msn/msn_r3.c:1489
+#: ../../msn/msn_r1_r.c:243 ../../msn/msn_r3.c:1485
msgid "Leitung"
msgstr "Cable"
@@ -1078,9 +1081,9 @@ msgid "Sie f
msgstr "It goes from the generator to the voltage meter."
#: ../../msn/msn_r1_r.c:143 ../../msn/msn_r1_r.c:212 ../../msn/msn_r1_r.c:213
-#: ../../msn/msn_r1_r.c:214 ../../msn/msn_r1_r.c:217 ../../msn/msn_r3.c:1603
-#: ../../msn/msn_r3.c:1618 ../../msn/msn_r3.c:1640 ../../msn/msn_r3.c:1650
-#: ../../msn/msn_r3.c:1651
+#: ../../msn/msn_r1_r.c:214 ../../msn/msn_r1_r.c:217 ../../msn/msn_r3.c:1599
+#: ../../msn/msn_r3.c:1614 ../../msn/msn_r3.c:1636 ../../msn/msn_r3.c:1646
+#: ../../msn/msn_r3.c:1647
msgid "Bild"
msgstr "Image"
@@ -1511,7 +1514,7 @@ msgstr "It says:|\"Toilet\"."
msgid "Du ziehst den Raumanzug wieder an."
msgstr "You put the space suit back on."
-#: ../../msn/msn_r2.c:382 ../../msn/msn_r3.c:488 ../../msn/msn_r3.c:540
+#: ../../msn/msn_r2.c:382 ../../msn/msn_r3.c:487 ../../msn/msn_r3.c:539
msgid "Nicht so gewaltttig!"
msgstr "Not so rough!"
@@ -1972,7 +1975,8 @@ msgstr "We don't speak your language,|you speak ours."
#: ../../msn/msn_r2.c:1178
msgid ""
"Nach einer Gehirnanalyse konnten|wir Ihr Gehirn an unsere Sprache anpassen."
-msgstr "After a brain analysis, we were able|to adapt your brain to our speech."
+msgstr ""
+"After a brain analysis, we were able|to adapt your brain to our speech."
#: ../../msn/msn_r2.c:1179
msgid "Was? Sie haben in mein Gehirn eingegriffen?"
@@ -2019,7 +2023,7 @@ msgid "H
msgstr "Cave"
#: ../../msn/msn_r2.c:1230 ../../msn/msn_r2.c:1243 ../../msn/msn_r2.c:1257
-#: ../../msn/msn_r3.c:1691
+#: ../../msn/msn_r3.c:1687
msgid "Schild"
msgstr "Sign"
@@ -2047,13 +2051,13 @@ msgstr "Doorman"
msgid "Du siehst doch selbst, wie er aussieht."
msgstr "You can see for yourself what he looks like."
-#: ../../msn/msn_r2.c:1242 ../../msn/msn_r3.c:1484 ../../msn/msn_r3.c:1549
-#: ../../msn/msn_r3.c:1564 ../../msn/msn_r3.c:1573 ../../msn/msn_r3.c:1584
-#: ../../msn/msn_r3.c:1586 ../../msn/msn_r3.c:1588 ../../msn/msn_r3.c:1590
-#: ../../msn/msn_r3.c:1600 ../../msn/msn_r3.c:1613 ../../msn/msn_r3.c:1614
-#: ../../msn/msn_r3.c:1615 ../../msn/msn_r3.c:1625 ../../msn/msn_r3.c:1637
-#: ../../msn/msn_r3.c:1648 ../../msn/msn_r3.c:1660 ../../msn/msn_r3.c:1671
-#: ../../msn/msn_r3.c:1692
+#: ../../msn/msn_r2.c:1242 ../../msn/msn_r3.c:1480 ../../msn/msn_r3.c:1545
+#: ../../msn/msn_r3.c:1560 ../../msn/msn_r3.c:1569 ../../msn/msn_r3.c:1580
+#: ../../msn/msn_r3.c:1582 ../../msn/msn_r3.c:1584 ../../msn/msn_r3.c:1586
+#: ../../msn/msn_r3.c:1596 ../../msn/msn_r3.c:1609 ../../msn/msn_r3.c:1610
+#: ../../msn/msn_r3.c:1611 ../../msn/msn_r3.c:1621 ../../msn/msn_r3.c:1633
+#: ../../msn/msn_r3.c:1644 ../../msn/msn_r3.c:1656 ../../msn/msn_r3.c:1667
+#: ../../msn/msn_r3.c:1688
msgid "Tr"
msgstr "Door"
@@ -2202,521 +2206,522 @@ msgstr "UFO"
msgid "Der Eingang scheint offen zu sein."
msgstr "The entrance appears to be open."
-#: ../../msn/msn_r3.c:26
+#: ../../msn/msn_r3.c:27
msgid "Du drckst den Knopf,|aber nichts passiert."
msgstr "You push the button,|but nothing happens."
-#: ../../msn/msn_r3.c:87
+#: ../../msn/msn_r3.c:88
msgid "Bei deinem Fluchtversuch hat|dich der Roboter erschossen."
msgstr "When you tried to escape,|the robot shot you."
-#: ../../msn/msn_r3.c:90
+#: ../../msn/msn_r3.c:91
msgid "Du iát etwas, aber|es schmeckt scheuálich."
msgstr "You're eating something,|but it tastes horrible."
-#: ../../msn/msn_r3.c:170
+#: ../../msn/msn_r3.c:171
msgid "Du wachst auf und findest dich in|einem geschlossenen Raum wieder."
msgstr "You wake up and find yourself|in a closed room."
-#: ../../msn/msn_r3.c:229
+#: ../../msn/msn_r3.c:230
msgid "h ... nein, mein Name ist Mller."
msgstr "Uh... no, my name is Mller."
-#: ../../msn/msn_r3.c:230
+#: ../../msn/msn_r3.c:231
msgid "Oh, ich habe mich im Gang vertan."
msgstr "Oh, I got lost."
-#: ../../msn/msn_r3.c:236
+#: ../../msn/msn_r3.c:237
msgid "Wrden Sie mich bitte zum Fahrstuhl lassen?"
msgstr "Will you please let me go to the elevator?"
-#: ../../msn/msn_r3.c:237
+#: ../../msn/msn_r3.c:238
msgid "Ich gehe wieder."
msgstr "I'm leaving."
-#: ../../msn/msn_r3.c:242
+#: ../../msn/msn_r3.c:243
msgid "Dann gehe ich eben wieder."
msgstr "Then I will be going."
-#: ../../msn/msn_r3.c:243
+#: ../../msn/msn_r3.c:244
msgid "Ach, halten Sie's Maul, ich gehe trotzdem!"
msgstr "Oh, shut up, I'm leaving anyway!"
-#: ../../msn/msn_r3.c:244 ../../msn/msn_r3.c:245
-msgid "Wenn Sie mich durchlassen gebe ich Ihnen "
-msgstr "If you let me through, I'll give you "
+#: ../../msn/msn_r3.c:245 ../../msn/msn_r3.c:246
+msgid "Wenn Sie mich durchlassen gebe ich Ihnen %d Xa."
+msgstr "I will give you %d Xa if you let me through."
-#: ../../msn/msn_r3.c:257
+#: ../../msn/msn_r3.c:258
msgid "Sie schon wieder?"
msgstr "You again?"
-#: ../../msn/msn_r3.c:263
+#: ../../msn/msn_r3.c:264
msgid "Halt! Sie sind doch dieser Hummel.|Bleiben Sie sofort stehen!"
msgstr "Stop! You're this Hummel.|Stop right there!"
-#: ../../msn/msn_r3.c:265
+#: ../../msn/msn_r3.c:266
msgid "Sehr witzig!"
msgstr "Very funny!"
-#: ../../msn/msn_r3.c:268
+#: ../../msn/msn_r3.c:269
msgid "Kann auch sein, auf jeden Fall|sind Sie der Nicht-Axacussaner."
msgstr "Well, you're the non-Axacussan,|you know."
-#: ../../msn/msn_r3.c:272
+#: ../../msn/msn_r3.c:273
msgid "Nein!"
msgstr "No!"
-#: ../../msn/msn_r3.c:285 ../../msn/msn_r3.c:286
-msgid " Xa."
-msgstr ""
-
-#: ../../msn/msn_r3.c:311
+#: ../../msn/msn_r3.c:310
+#, fuzzy
msgid "Das máte schon ein biáchen mehr sein."
-msgstr ""
+msgstr "That should be a little more than that."
-#: ../../msn/msn_r3.c:325
+#: ../../msn/msn_r3.c:324
msgid "Ok, dann machen Sie daá Sie wegkommen!"
-msgstr ""
+msgstr "Okay, then get out of here!"
-#: ../../msn/msn_r3.c:431
+#: ../../msn/msn_r3.c:430
msgid "Der Axacussaner hat dich erwischt."
-msgstr ""
+msgstr "The Axacussan caught you."
-#: ../../msn/msn_r3.c:548
+#: ../../msn/msn_r3.c:547
msgid ""
"Diese Tr wrde ich lieber|nicht ffnen. Nach dem Schild zu|urteilen, ist "
"jemand in dem Raum."
msgstr ""
+"I'd rather not open that door.|Judging by the sign, there's|someone in that "
+"room."
-#: ../../msn/msn_r3.c:643
+#: ../../msn/msn_r3.c:642
msgid "Du stellst dich hinter die Sule."
-msgstr ""
+msgstr "You stand behind the column."
-#: ../../msn/msn_r3.c:657
+#: ../../msn/msn_r3.c:656
msgid "Hmm, er scheint kaputt zu sein."
msgstr "Hmm, it seems to be broken."
-#: ../../msn/msn_r3.c:658
-msgid "Hmm, it seems to be broken."
-msgstr ""
-
-#: ../../msn/msn_r3.c:697
+#: ../../msn/msn_r3.c:696
msgid "Welche Zahlenkombination willst|du eingeben?"
-msgstr ""
+msgstr "Which combination do you want|to enter?"
-#: ../../msn/msn_r3.c:709
+#: ../../msn/msn_r3.c:708
msgid ""
"Hmm, das haut nicht ganz hin,|aber irgendwie muá die Zahl|mit dem Code "
"zusammenhngen."
msgstr ""
+"Hmm, that doesn't really work,|but somehow the number|must be related to the "
+"code."
-#: ../../msn/msn_r3.c:711
+#: ../../msn/msn_r3.c:710
msgid "Das war die falsche Kombination."
-msgstr ""
+msgstr "That combination is incorrect."
-#: ../../msn/msn_r3.c:749
+#: ../../msn/msn_r3.c:748
msgid "Streng geheim"
-msgstr ""
+msgstr "Strictly secret"
-#: ../../msn/msn_r3.c:750
+#: ../../msn/msn_r3.c:749
msgid "418-98"
-msgstr ""
+msgstr "418-98"
-#: ../../msn/msn_r3.c:751
+#: ../../msn/msn_r3.c:750
msgid "Sehr geehrter Dr. Hansi,"
-msgstr ""
+msgstr "Dear Dr. Hansi,"
-#: ../../msn/msn_r3.c:752
+#: ../../msn/msn_r3.c:751
msgid "Ich muá Ihren Roboterexperten ein Lob aussprechen. Die"
-msgstr ""
+msgstr "I must commend your robot expert. The imitation"
-#: ../../msn/msn_r3.c:753
+#: ../../msn/msn_r3.c:752
msgid "Imitation von Horst Hummel ist perfekt gelungen, wie ich"
-msgstr ""
+msgstr "of Horst Hummel was a perfect success, as I found"
-#: ../../msn/msn_r3.c:754
+#: ../../msn/msn_r3.c:753
msgid "heute bei der bertragung des Interviews feststellen"
-msgstr ""
+msgstr "out today during the broadcast of the interview."
-#: ../../msn/msn_r3.c:755
+#: ../../msn/msn_r3.c:754
msgid "konnte. Dem Aufschwung Ihrer Firma durch die Werbe-"
-msgstr ""
+msgstr "Nothing should stand in the way of your company's"
-#: ../../msn/msn_r3.c:756
+#: ../../msn/msn_r3.c:755
msgid "kampagne mit dem falschen Horst Hummel drfte ja jetzt"
-msgstr ""
+msgstr "recovery through the advertising campaign with"
-#: ../../msn/msn_r3.c:757
+#: ../../msn/msn_r3.c:756
msgid "nichts mehr im Wege stehen."
-msgstr ""
+msgstr "the false Horst Hummel now."
-#: ../../msn/msn_r3.c:758
+#: ../../msn/msn_r3.c:757
msgid "PS: Herzlichen zum Geburtstag!"
-msgstr ""
+msgstr "PS: Happy Birthday!"
-#: ../../msn/msn_r3.c:759
+#: ../../msn/msn_r3.c:758
msgid "Hochachtungsvoll"
-msgstr ""
+msgstr "Yours sincerely"
-#: ../../msn/msn_r3.c:760
+#: ../../msn/msn_r3.c:759
msgid "Commander Sumoti"
-msgstr ""
+msgstr "Commander Sumoti"
-#: ../../msn/msn_r3.c:767
+#: ../../msn/msn_r3.c:766
msgid "Nicht zu fassen!"
-msgstr ""
+msgstr "I can't believe it!"
-#: ../../msn/msn_r3.c:839
+#: ../../msn/msn_r3.c:838
msgid "Hey, hinter dem Bild ist Geld|versteckt. Ich nehme es mit."
-msgstr ""
+msgstr "Hey, there's money hidden behind that|picture. I'll take it with me."
-#: ../../msn/msn_r3.c:1048
+#: ../../msn/msn_r3.c:1047
msgid "DR. ALAB HANSI"
-msgstr ""
+msgstr "DR. ALAB HANSI"
-#: ../../msn/msn_r3.c:1048
+#: ../../msn/msn_r3.c:1047
msgid "ALAB HANSI"
-msgstr ""
+msgstr "ALAB HANSI"
-#: ../../msn/msn_r3.c:1049
+#: ../../msn/msn_r3.c:1048
msgid "SAVAL LUN"
-msgstr ""
+msgstr "SAVAL LUN"
-#: ../../msn/msn_r3.c:1049 ../../msn/msn_r3.c:1051
+#: ../../msn/msn_r3.c:1048 ../../msn/msn_r3.c:1050
msgid "x"
-msgstr ""
+msgstr "x"
-#: ../../msn/msn_r3.c:1050
+#: ../../msn/msn_r3.c:1049
msgid "PROF. DR. UGNUL TSCHABB"
-msgstr ""
+msgstr "PROF. DR. UGNUL TSCHABB"
-#: ../../msn/msn_r3.c:1050
+#: ../../msn/msn_r3.c:1049
msgid "UGNUL TSCHABB"
-msgstr ""
+msgstr "UGNUL TSCHABB"
-#: ../../msn/msn_r3.c:1051
+#: ../../msn/msn_r3.c:1050
msgid "ALGA HURZ LI"
-msgstr ""
+msgstr "ALGA HURZ LI"
-#: ../../msn/msn_r3.c:1055
+#: ../../msn/msn_r3.c:1054
msgid "Alab Hansi"
-msgstr ""
+msgstr "Alab Hansi"
-#: ../../msn/msn_r3.c:1055
+#: ../../msn/msn_r3.c:1054
msgid "Saval Lun"
-msgstr ""
+msgstr "Saval Lun"
-#: ../../msn/msn_r3.c:1055
+#: ../../msn/msn_r3.c:1054
msgid "Ugnul Tschabb"
-msgstr ""
+msgstr "Ugnul Tschabb"
-#: ../../msn/msn_r3.c:1055
+#: ../../msn/msn_r3.c:1054
msgid "Alga Hurz Li"
-msgstr ""
+msgstr "Alga Hurz Li"
-#: ../../msn/msn_r3.c:1061
+#: ../../msn/msn_r3.c:1060
msgid "Guten Tag, hier ist Horst Hummel."
-msgstr ""
+msgstr "Hello, I am Horst Hummel."
-#: ../../msn/msn_r3.c:1063
+#: ../../msn/msn_r3.c:1062
msgid "Es ist sehr wichtig."
-msgstr ""
+msgstr "It's very important."
-#: ../../msn/msn_r3.c:1069
+#: ../../msn/msn_r3.c:1068
msgid "Vom Mars."
-msgstr ""
+msgstr "From Mars."
-#: ../../msn/msn_r3.c:1070
+#: ../../msn/msn_r3.c:1069
msgid "Vom Klo."
-msgstr ""
+msgstr "The toilet."
-#: ../../msn/msn_r3.c:1071
+#: ../../msn/msn_r3.c:1070
msgid "Das werde ich kaum erzhlen."
-msgstr ""
+msgstr "I won't tell you that."
-#: ../../msn/msn_r3.c:1080
+#: ../../msn/msn_r3.c:1079
msgid "1 Bromanager"
-msgstr ""
+msgstr "1 Office manager"
-#: ../../msn/msn_r3.c:1081
+#: ../../msn/msn_r3.c:1080
msgid "2 Telomat"
-msgstr ""
+msgstr "2 Phone"
-#: ../../msn/msn_r3.c:1082
+#: ../../msn/msn_r3.c:1081
msgid "3 ProText"
-msgstr ""
+msgstr "3 ProText"
-#: ../../msn/msn_r3.c:1083
+#: ../../msn/msn_r3.c:1082
msgid "4 Calculata"
-msgstr ""
+msgstr "4 Calculata"
-#: ../../msn/msn_r3.c:1084
+#: ../../msn/msn_r3.c:1083
msgid "Bitte whlen"
-msgstr ""
+msgstr "Please select an option"
-#: ../../msn/msn_r3.c:1092
+#: ../../msn/msn_r3.c:1091
msgid "Geben Sie den gewnschten Namen ein:"
-msgstr ""
+msgstr "Enter the desired name:"
-#: ../../msn/msn_r3.c:1093
+#: ../../msn/msn_r3.c:1092
msgid "(Vor- und Nachname)"
-msgstr ""
+msgstr "(first and last name)"
-#: ../../msn/msn_r3.c:1107
+#: ../../msn/msn_r3.c:1106
msgid "Name unbekannt"
-msgstr ""
+msgstr "Name unknown"
-#: ../../msn/msn_r3.c:1113
+#: ../../msn/msn_r3.c:1112
msgid "Verbindung unmglich"
-msgstr ""
+msgstr "Connection not possible"
-#: ../../msn/msn_r3.c:1117
+#: ../../msn/msn_r3.c:1116
msgid "Verbindung wird hergestellt"
-msgstr ""
+msgstr "Connection is established"
-#: ../../msn/msn_r3.c:1123
-msgid " am Apparat."
-msgstr ""
+#. I18N: Here the %s is a name
+#: ../../msn/msn_r3.c:1121
+#, c-format
+msgid "%s am Apparat."
+msgstr "%s speaking."
-#: ../../msn/msn_r3.c:1129
-msgid "Hier ist "
-msgstr ""
+#: ../../msn/msn_r3.c:1127
+#, c-format
+msgid "Hier ist %s. Knnen Sie mal gerade kommen?"
+msgstr "This is %s. Can you come over now?"
-#: ../../msn/msn_r3.c:1131
-msgid ". Knnen Sie mal gerade kommen?"
-msgstr ""
-
-#: ../../msn/msn_r3.c:1138
+#: ../../msn/msn_r3.c:1134
msgid "Huch, Sie hren sich aber|nicht gut an. Ich komme sofort."
-msgstr ""
+msgstr "You don't sound good.|I'll be right there."
-#: ../../msn/msn_r3.c:1149
+#: ../../msn/msn_r3.c:1145
msgid "Horst Hummel! Von wo rufen Sie an?"
-msgstr ""
+msgstr "Horst Hummel! Where are you calling from?"
-#: ../../msn/msn_r3.c:1155
+#: ../../msn/msn_r3.c:1151
msgid "Hmm, keine Antwort."
-msgstr ""
+msgstr "Hmm, no answer."
-#: ../../msn/msn_r3.c:1168
+#: ../../msn/msn_r3.c:1164
msgid "Passwort:"
-msgstr ""
+msgstr "Password:"
-#: ../../msn/msn_r3.c:1219
+#: ../../msn/msn_r3.c:1215
msgid "Was war das fr ein Gerusch?"
-msgstr ""
+msgstr "What was that noise?"
-#: ../../msn/msn_r3.c:1221 ../../msn/msn_s.c:312
+#: ../../msn/msn_r3.c:1217 ../../msn/msn_s.c:312
msgid "Ich werde mal nachsehen."
msgstr "Let's find out..."
-#: ../../msn/msn_r3.c:1309
+#: ../../msn/msn_r3.c:1305
msgid "Jetzt verschwinden Sie endlich!"
-msgstr ""
+msgstr "Get the hell out of here!"
-#: ../../msn/msn_r3.c:1310
+#: ../../msn/msn_r3.c:1306
msgid "Huch, ich habe mich vertan."
-msgstr ""
+msgstr "Oops, I made a mistake."
-#: ../../msn/msn_r3.c:1372
+#: ../../msn/msn_r3.c:1368
msgid ""
"Nachdem du zwei Stunden im|Dschungel herumgeirrt bist,|findest du ein "
"Gebude."
msgstr ""
+"After you've been wandering around|the jungle for two hours,|you find a "
+"building."
-#: ../../msn/msn_r3.c:1485
+#: ../../msn/msn_r3.c:1481
msgid "Tablett"
-msgstr ""
+msgstr "Tray"
-#: ../../msn/msn_r3.c:1485
+#: ../../msn/msn_r3.c:1481
msgid "Es ist irgendein Fraá und|etwas zu Trinken darauf."
-msgstr ""
+msgstr "There is some kind of food|and a drink on it."
-#: ../../msn/msn_r3.c:1487
+#: ../../msn/msn_r3.c:1483
msgid "Stange"
-msgstr ""
+msgstr "Rod"
-#: ../../msn/msn_r3.c:1487
+#: ../../msn/msn_r3.c:1483
msgid "Es scheint eine Lampe zu sein."
-msgstr ""
+msgstr "It seems to be a lamp."
-#: ../../msn/msn_r3.c:1488
+#: ../../msn/msn_r3.c:1484
msgid "Augen"
-msgstr ""
+msgstr "Eyes"
-#: ../../msn/msn_r3.c:1488
+#: ../../msn/msn_r3.c:1484
msgid "Es ist nur ein Bild."
-msgstr ""
+msgstr "It's just a picture."
-#: ../../msn/msn_r3.c:1490
+#: ../../msn/msn_r3.c:1486
+#, fuzzy
msgid "Sieht etwas anders aus als auf der Erde."
-msgstr ""
+msgstr "Looks a little different than on Earth."
-#: ../../msn/msn_r3.c:1492
+#: ../../msn/msn_r3.c:1488
msgid "Metallblock"
-msgstr ""
+msgstr "Metal block"
-#: ../../msn/msn_r3.c:1492
+#: ../../msn/msn_r3.c:1488
msgid "Er ist ziemlich schwer."
-msgstr ""
+msgstr "It's pretty heavy."
-#: ../../msn/msn_r3.c:1494
+#: ../../msn/msn_r3.c:1490
msgid "Roboter"
-msgstr ""
+msgstr "Robot"
-#: ../../msn/msn_r3.c:1494
+#: ../../msn/msn_r3.c:1490
+#, fuzzy
msgid "Den hast du erledigt."
-msgstr ""
+msgstr "You took care of it."
-#: ../../msn/msn_r3.c:1495 ../../msn/msn_r3.c:1532
+#: ../../msn/msn_r3.c:1491 ../../msn/msn_r3.c:1528
msgid "Tisch"
-msgstr ""
+msgstr "Table"
-#: ../../msn/msn_r3.c:1495
+#: ../../msn/msn_r3.c:1491
msgid "Ein kleiner Metalltisch."
-msgstr ""
+msgstr "A small metal table."
-#: ../../msn/msn_r3.c:1528
+#: ../../msn/msn_r3.c:1524
msgid "Zellentr"
-msgstr ""
+msgstr "Cell door"
-#: ../../msn/msn_r3.c:1528
+#: ../../msn/msn_r3.c:1524
msgid "Hier warst du eingesperrt."
-msgstr ""
+msgstr "You were locked up here."
-#: ../../msn/msn_r3.c:1530
+#: ../../msn/msn_r3.c:1526
msgid "Laptop"
-msgstr ""
+msgstr "Laptop"
-#: ../../msn/msn_r3.c:1580 ../../msn/msn_r3.c:1581
+#: ../../msn/msn_r3.c:1576 ../../msn/msn_r3.c:1577
msgid "Sule"
-msgstr ""
+msgstr "Pillar"
-#: ../../msn/msn_r3.c:1584
+#: ../../msn/msn_r3.c:1580
msgid "Auf einem Schild an der Tr steht \"Dr. Alab Hansi\"."
-msgstr ""
+msgstr "A sign on the door says \"Dr. Alab Hansi\"."
-#: ../../msn/msn_r3.c:1586
+#: ../../msn/msn_r3.c:1582
msgid "Auf einem Schild an der Tr steht \"Saval Lun\"."
-msgstr ""
+msgstr "A sign on the door says \"Saval Lun\"."
-#: ../../msn/msn_r3.c:1588
+#: ../../msn/msn_r3.c:1584
msgid "Auf einem Schild an der Tr steht \"Prof. Dr. Ugnul Tschabb\"."
-msgstr ""
+msgstr "A sign on the door says \"Prof. Dr. Ugnul Tschabb\"."
-#: ../../msn/msn_r3.c:1590
+#: ../../msn/msn_r3.c:1586
msgid "Auf einem Schild an der Tr steht \"Alga Hurz Li\"."
-msgstr ""
+msgstr "A sign on the door says \"Alga Hurz Li\"."
-#: ../../msn/msn_r3.c:1601 ../../msn/msn_r3.c:1617
+#: ../../msn/msn_r3.c:1597 ../../msn/msn_r3.c:1613
msgid "Axacussaner"
-msgstr ""
+msgstr "Axacussan"
-#: ../../msn/msn_r3.c:1601
+#: ../../msn/msn_r3.c:1597
msgid "Du mátest ihn irgendwie ablenken."
-msgstr ""
+msgstr "You have to distract him somehow."
-#: ../../msn/msn_r3.c:1603
+#: ../../msn/msn_r3.c:1599
msgid "Komisches Bild."
-msgstr ""
+msgstr "Funny picture."
-#: ../../msn/msn_r3.c:1604
+#: ../../msn/msn_r3.c:1600
msgid "Karte"
-msgstr ""
+msgstr "Map"
-#: ../../msn/msn_r3.c:1604
+#: ../../msn/msn_r3.c:1600
msgid "Darauf steht: \"Generalkarte\"."
-msgstr ""
+msgstr "It says:\"General Map\"."
-#: ../../msn/msn_r3.c:1616
+#: ../../msn/msn_r3.c:1612
msgid "Lampe"
-msgstr ""
+msgstr "Lamp"
-#: ../../msn/msn_r3.c:1618
+#: ../../msn/msn_r3.c:1614
msgid "Seltsam!"
-msgstr ""
+msgstr "Strange!"
-#: ../../msn/msn_r3.c:1627 ../../msn/msn_r3.c:1674
+#: ../../msn/msn_r3.c:1623 ../../msn/msn_r3.c:1670
msgid "Geld"
-msgstr ""
+msgstr "Cash"
-#: ../../msn/msn_r3.c:1627
+#: ../../msn/msn_r3.c:1623
msgid "Es sind 500 Xa."
-msgstr ""
+msgstr "It's 500 Xa."
-#: ../../msn/msn_r3.c:1628
+#: ../../msn/msn_r3.c:1624
msgid "Schlieáfach"
-msgstr ""
+msgstr "Locker"
-#: ../../msn/msn_r3.c:1628
+#: ../../msn/msn_r3.c:1624
msgid "Es hat ein elektronisches Zahlenschloá."
-msgstr ""
+msgstr "It has an electronic combination lock."
-#: ../../msn/msn_r3.c:1630
+#: ../../msn/msn_r3.c:1626
msgid "Brief"
-msgstr ""
+msgstr "Note"
-#: ../../msn/msn_r3.c:1639
+#: ../../msn/msn_r3.c:1635
+#, fuzzy
msgid "Wrfel"
-msgstr ""
+msgstr "Dice"
-#: ../../msn/msn_r3.c:1639
+#: ../../msn/msn_r3.c:1635
msgid "Sonderbar!"
-msgstr ""
+msgstr "Quirky!"
-#: ../../msn/msn_r3.c:1640
+#: ../../msn/msn_r3.c:1636
msgid "Affenstark!"
-msgstr ""
+msgstr "Awesome!"
-#: ../../msn/msn_r3.c:1641
+#: ../../msn/msn_r3.c:1637
msgid "Komisches Ding"
-msgstr ""
+msgstr "Strange thing"
-#: ../../msn/msn_r3.c:1641
+#: ../../msn/msn_r3.c:1637
msgid "Wundersam!"
-msgstr ""
+msgstr "Amazing!"
-#: ../../msn/msn_r3.c:1650 ../../msn/msn_r3.c:1651
+#: ../../msn/msn_r3.c:1646 ../../msn/msn_r3.c:1647
msgid "Es ist ein Axacussanerkopf auf dem Bild."
-msgstr ""
+msgstr "There is an Axacussan head in the picture."
-#: ../../msn/msn_r3.c:1652 ../../msn/msn_r3.c:1663
+#: ../../msn/msn_r3.c:1648 ../../msn/msn_r3.c:1659
msgid "Pflanze"
-msgstr ""
+msgstr "Plant"
-#: ../../msn/msn_r3.c:1662
+#: ../../msn/msn_r3.c:1658
msgid "Figur"
-msgstr ""
+msgstr "Figure"
-#: ../../msn/msn_r3.c:1662
+#: ../../msn/msn_r3.c:1658
msgid "Stark!"
-msgstr ""
+msgstr "Strong!"
-#: ../../msn/msn_r3.c:1663
+#: ../../msn/msn_r3.c:1659
msgid "Sie ist den Pflanzen auf der Erde sehr hnlich."
-msgstr ""
+msgstr "It is very similar to the plants on earth."
-#: ../../msn/msn_r3.c:1672
+#: ../../msn/msn_r3.c:1668
msgid "Er funktioniert nicht."
-msgstr ""
+msgstr "It doesn't work."
-#: ../../msn/msn_r3.c:1673
+#: ../../msn/msn_r3.c:1669
msgid "Graffiti"
-msgstr ""
+msgstr "Graffiti"
-#: ../../msn/msn_r3.c:1673
+#: ../../msn/msn_r3.c:1669
msgid "Seltsamer Broschmuck!"
-msgstr ""
+msgstr "Strange office decoration!"
-#: ../../msn/msn_r3.c:1674
+#: ../../msn/msn_r3.c:1670
msgid "Es sind 350 Xa."
-msgstr ""
+msgstr "It's 350 Xa."
-#: ../../msn/msn_r3.c:1684
+#: ../../msn/msn_r3.c:1680
msgid "Dschungel"
-msgstr ""
+msgstr "Jungle"
-#: ../../msn/msn_r3.c:1684
+#: ../../msn/msn_r3.c:1680
msgid "Lauter Bume."
msgstr "Nothing but trees."
@@ -2850,7 +2855,8 @@ msgstr "The crew has left the \"Supernova\"."
msgid ""
"Das Schiff wird zwar in acht Jahren sein Ziel|erreichen, allerdings ohne "
"Mannschaft."
-msgstr "The ship will reach its destination in eight years,|but without a crew."
+msgstr ""
+"The ship will reach its destination in eight years,|but without a crew."
#: ../../msn/msn_s.c:286
msgid "Das ist das klgliche Ende|der Mission Supernova."
Commit: 1cee221e7a46bac665494a84ba450685b29d63ca
https://github.com/scummvm/scummvm/commit/1cee221e7a46bac665494a84ba450685b29d63ca
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:36Z
Commit Message:
SUPERNOVA: Finish the string extraction in state.cpp
Changed paths:
devtools/create_supernova/gametext.h
engines/supernova/msn_def.h
engines/supernova/state.cpp
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index ab6189b..b0c1ef6 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -735,9 +735,51 @@ const char *gameText[] = {
"Es ist eine Art elektronische Zeitung.", // kStringGenericInteract_10
"Halt, hier ist ein interessanter Artikel.", // kStringGenericInteract_11
"Hmm, irgendwie komme|ich mir verarscht vor.", // kStringGenericInteract_12
+ " an ", // kPhrasalVerbParticleGiveTo
+ " mit ", // kPhrasalVerbParticleUseWith
+ // 585
+ "Es ist eine Uhr mit extra|lautem Wecker. Sie hat einen|Knopf zum Verstellen der Alarmzeit.|Uhrzeit: %s Alarmzeit: %s", // kStringGenericInteract_13
+ "Neue Alarmzeit (hh:mm) :", // kStringGenericInteract_14
+ "Die Luft hier ist atembar,|du ziehst den Anzug aus.", // kStringGenericInteract_15
+ "Hier drinnen brauchtst du deinen Anzug nicht.", // kStringGenericInteract_16
+ "Du mu\341t erst den Helm abnehmen.", // kStringGenericInteract_17
+ // 590
+ "Du mu\341t erst den Versorgungsteil abnehmen.", // kStringGenericInteract_18
+ "Du ziehst den Raumanzug aus.", // kStringGenericInteract_19
+ "Du ziehst den Raumanzug an.", // kStringGenericInteract_20
+ "Die Luft hier ist atembar,|du ziehst den Anzug aus.", // kStringGenericInteract_21
+ "Hier drinnen brauchtst du deinen Anzug nicht.", // kStringGenericInteract_22
+ // 595
+ "Den Helm h\204ttest du|besser angelassen!", // kStringGenericInteract_23
+ "Du ziehst den Helm ab.", // kStringGenericInteract_24
+ "Du ziehst den Helm auf.", // kStringGenericInteract_25
+ "Du mu\341t erst den Anzug anziehen.", // kStringGenericInteract_26
+ "Den Versorgungsteil h\204ttest du|besser nicht abgenommen!", // kStringGenericInteract_27
+ // 600
+ "Du nimmst den Versorgungsteil ab.", // kStringGenericInteract_28
+ "Du ziehst den Versorgungsteil an.", // kStringGenericInteract_29
+ "Die Leitung ist hier unn\201tz.", // kStringGenericInteract_30
+ "Stark, das ist ja die Fortsetzung zum \"Anhalter\":|\"Das Restaurant am Ende des Universums\".", // kStringGenericInteract_31
+ "Moment mal, es ist ein Lesezeichen drin,|auf dem \"Zweiundvierzig\" steht.", // kStringGenericInteract_32
+ // 605
+ "Das tr\204gst du doch bei dir.", // kStringGenericInteract_33
+ "Du bist doch schon da.", // kStringGenericInteract_34
+ "Das hast du doch schon.", // kStringGenericInteract_35
+ "Das brauchst du nicht.", // kStringGenericInteract_36
+ "Das kannst du nicht nehmen.", // kStringGenericInteract_37
+ // 610
+ "Das l\204\341t sich nicht \224ffnen.", // kStringGenericInteract_38
+ "Das ist schon offen.", // kStringGenericInteract_39
+ "Das ist verschlossen.", // kStringGenericInteract_40
+ "Das l\204\341t sich nicht schlie\341en.", // kStringGenericInteract_41
+ "Behalt es lieber!", // kStringGenericInteract_42
+ // 615
+ "Das geht nicht.", // kStringGenericInteract_43
"",
"",
- // 585
+ "",
+ "",
+ // 620
NULL
};
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index a3d45bc..f463755 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -536,7 +536,14 @@ enum StringID {
kStringAxacussElevator_2, kStringAxacussElevator_3, kStringShock, kStringShot, kStringCloseLocker_1,
kStringIsHelmetOff_1, kStringGenericInteract_1, kStringGenericInteract_2, kStringGenericInteract_3, kStringGenericInteract_4,
kStringGenericInteract_5, kStringGenericInteract_6, kStringGenericInteract_7, kStringGenericInteract_8, kStringGenericInteract_9,
- kStringGenericInteract_10, kStringGenericInteract_11, kStringGenericInteract_12
+ kStringGenericInteract_10, kStringGenericInteract_11, kStringGenericInteract_12, kPhrasalVerbParticleGiveTo, kPhrasalVerbParticleUseWith,
+ kStringGenericInteract_13, kStringGenericInteract_14, kStringGenericInteract_15, kStringGenericInteract_16, kStringGenericInteract_17,
+ kStringGenericInteract_18, kStringGenericInteract_19, kStringGenericInteract_20, kStringGenericInteract_21, kStringGenericInteract_22,
+ kStringGenericInteract_23, kStringGenericInteract_24, kStringGenericInteract_25, kStringGenericInteract_26, kStringGenericInteract_27,
+ kStringGenericInteract_28, kStringGenericInteract_29, kStringGenericInteract_30, kStringGenericInteract_31, kStringGenericInteract_32,
+ kStringGenericInteract_33, kStringGenericInteract_34, kStringGenericInteract_35, kStringGenericInteract_36, kStringGenericInteract_37,
+ kStringGenericInteract_38, kStringGenericInteract_39, kStringGenericInteract_40, kStringGenericInteract_41, kStringGenericInteract_42,
+ kStringGenericInteract_43
};
static StringID guiCommands[] = {
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index f40b1fc..646bdaa 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -218,7 +218,7 @@ void GuiElement::setHighlight(bool isHighlighted) {
}
}
-
+// Used by Look Watch (when it's fixed). Do not remove.
static Common::String timeToString(int msec) {
char s[9] = " 0:00:00";
msec /= 1000;
@@ -1197,11 +1197,10 @@ void GameManager::drawStatus() {
_vm->renderText(_currentInputObject->_name);
} else {
_vm->renderText(_inputObject[0]->_name);
- if (_inputVerb == ACTION_GIVE) {
- _vm->renderText(" an ");
- } else if (_inputVerb == ACTION_USE) {
- _vm->renderText(" mit ");
- }
+ if (_inputVerb == ACTION_GIVE)
+ _vm->renderText(kPhrasalVerbParticleGiveTo);
+ else if (_inputVerb == ACTION_USE)
+ _vm->renderText(kPhrasalVerbParticleUseWith);
_vm->renderText(_currentInputObject->_name);
}
@@ -1365,10 +1364,10 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage(obj1._description);
obj1._description = kStringKeycard2Description2;
} else if ((verb == ACTION_LOOK) && (obj1._id == WATCH)) {
- _vm->renderMessage(Common::String::format(
- "Es ist eine Uhr mit extra|lautem Wecker. Sie hat einen|Knopf zum Verstellen der Alarmzeit.|Uhrzeit: %s Alarmzeit: %s",
- timeToString(_state._time).c_str(),
- timeToString(_state._timeAlarm).c_str()).c_str());
+ // FIXME: kStringGenericInteract_13 requires 2 string parameters in order to format the string properly
+ _vm->renderMessage(kStringGenericInteract_13, kMessageNormal);
+ // timeToString(_state._time).c_str(),
+ // timeToString(_state._timeAlarm).c_str());
} else if ((verb == ACTION_PRESS) && (obj1._id == WATCH)) {
bool validInput = true;
int hours = 0;
@@ -1377,7 +1376,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
animationOff();
_vm->saveScreen(88, 87, 144, 24);
_vm->renderBox(88, 87, 144, 24, kColorWhite35);
- _vm->renderText("Neue Alarmzeit (hh:mm) :", 91, 90, kColorWhite99);
+ _vm->renderText(kStringGenericInteract_14, 91, 90, kColorWhite99);
do {
validInput = true;
input.clear();
@@ -1440,7 +1439,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
_inventory.remove(*r->getObject(2));
_state._terminalStripConnected = true;
_state._terminalStripWire = true;
- _vm->renderMessage("Ok.");
+ _vm->renderMessage(kStringOk);
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, SPOOL)) {
r = _rooms[CABIN_L2];
@@ -1449,12 +1448,12 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
r = _rooms[HOLD];
_inventory.remove(*r->getObject(2));
_state._terminalStripConnected = true;
- _vm->renderMessage("Ok.");
+ _vm->renderMessage(kStringOk);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, WIRE, SPOOL)) {
r = _rooms[CABIN_L3];
if (!_state._terminalStripConnected) {
if (r->isSectionVisible(26))
- _vm->renderMessage("Womit denn?");
+ _vm->renderMessage(kStringCable3);
else
return false;
} else {
@@ -1468,60 +1467,60 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
r = _rooms[CABIN_L2];
_inventory.remove(*r->getObject(9));
_state._cableConnected = true;
- _vm->renderMessage("Ok.");
+ _vm->renderMessage(kStringOk);
}
}
} else if ((verb == ACTION_USE) && (obj1._id == SUIT)) {
takeObject(obj1);
if ((_currentRoom->getId() >= ENTRANCE) && (_currentRoom->getId() <= ROGER)) {
if (obj1.hasProperty(WORN)) {
- _vm->renderMessage("Die Luft hier ist atembar,|du ziehst den Anzug aus.");
+ _vm->renderMessage(kStringGenericInteract_15);
_rooms[AIRLOCK]->getObject(4)->disableProperty(WORN);
_rooms[AIRLOCK]->getObject(5)->disableProperty(WORN);
_rooms[AIRLOCK]->getObject(6)->disableProperty(WORN);
} else
- _vm->renderMessage("Hier drinnen brauchtst du deinen Anzug nicht.");
+ _vm->renderMessage(kStringGenericInteract_16);
} else {
if (obj1.hasProperty(WORN)) {
r = _rooms[AIRLOCK];
if (r->getObject(4)->hasProperty(WORN)) {
- _vm->renderMessage("Du mu\341t erst den Helm abnehmen.");
+ _vm->renderMessage(kStringGenericInteract_17);
} else if (r->getObject(6)->hasProperty(WORN)) {
- _vm->renderMessage("Du mu\341t erst den Versorgungsteil abnehmen.");
+ _vm->renderMessage(kStringGenericInteract_18);
} else {
obj1.disableProperty(WORN);
- _vm->renderMessage("Du ziehst den Raumanzug aus.");
+ _vm->renderMessage(kStringGenericInteract_19);
}
} else {
obj1.setProperty(WORN);
- _vm->renderMessage("Du ziehst den Raumanzug an.");
+ _vm->renderMessage(kStringGenericInteract_20);
}
}
} else if ((verb == ACTION_USE) && (obj1._id == HELMET)) {
takeObject(obj1);
if ((_currentRoom->getId() >= ENTRANCE) && (_currentRoom->getId() <= ROGER)) {
if (obj1.hasProperty(WORN)) {
- _vm->renderMessage("Die Luft hier ist atembar,|du ziehst den Anzug aus.");
+ _vm->renderMessage(kStringGenericInteract_21);
_rooms[AIRLOCK]->getObject(4)->disableProperty(WORN);
_rooms[AIRLOCK]->getObject(5)->disableProperty(WORN);
_rooms[AIRLOCK]->getObject(6)->disableProperty(WORN);
} else {
- _vm->renderMessage("Hier drinnen brauchtst du deinen Anzug nicht.");
+ _vm->renderMessage(kStringGenericInteract_22);
}
} else {
if (obj1.hasProperty(WORN)) {
if (airless()) {
- dead("Den Helm h\204ttest du|besser angelassen!");
+ dead(kStringGenericInteract_23);
}
obj1.disableProperty(WORN);
- _vm->renderMessage("Du ziehst den Helm ab.");
+ _vm->renderMessage(kStringGenericInteract_24);
} else {
r = _rooms[AIRLOCK];
if (r->getObject(5)->hasProperty(WORN)) {
obj1.setProperty(WORN);
- _vm->renderMessage("Du ziehst den Helm auf.");
+ _vm->renderMessage(kStringGenericInteract_25);
} else {
- _vm->renderMessage("Du mu\341t erst den Anzug anziehen.");
+ _vm->renderMessage(kStringGenericInteract_26);
}
}
}
@@ -1529,39 +1528,38 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
takeObject(obj1);
if ((_currentRoom->getId() >= ENTRANCE) && (_currentRoom->getId() <= ROGER)) {
if (obj1.hasProperty(WORN)) {
- _vm->renderMessage("Die Luft hier ist atembar,|du ziehst den Anzug aus.");
+ _vm->renderMessage(kStringGenericInteract_21);
_rooms[AIRLOCK]->getObject(4)->disableProperty(WORN);
_rooms[AIRLOCK]->getObject(5)->disableProperty(WORN);
_rooms[AIRLOCK]->getObject(6)->disableProperty(WORN);
} else
- _vm->renderMessage("Hier drinnen brauchtst du deinen Anzug nicht.");
+ _vm->renderMessage(kStringGenericInteract_22);
} else {
if (obj1.hasProperty(WORN)) {
- if (airless()) {
- dead("Den Versorgungsteil h\204ttest du|besser nicht abgenommen!");
- }
+ if (airless())
+ dead(kStringGenericInteract_27);
+
obj1.disableProperty(WORN);
- _vm->renderMessage("Du nimmst den Versorgungsteil ab.");
+ _vm->renderMessage(kStringGenericInteract_28);
} else {
r = _rooms[AIRLOCK];
if (r->getObject(5)->hasProperty(WORN)) {
obj1.setProperty(WORN);
- _vm->renderMessage("Du ziehst den Versorgungsteil an.");
- } else {
- _vm->renderMessage("Du mu\341t erst den Anzug anziehen.");
- }
+ _vm->renderMessage(kStringGenericInteract_29);
+ } else
+ _vm->renderMessage(kStringGenericInteract_26);
}
}
} else if ((verb == ACTION_WALK) && (obj1._id == BATHROOM_DOOR)) {
// *bathroom = current_room;
return false;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, WIRE, SOCKET))
- _vm->renderMessage("Die Leitung ist hier unn\201tz.");
+ _vm->renderMessage(kStringGenericInteract_30);
else if ((verb == ACTION_LOOK) && (obj1._id == BOOK2)) {
- _vm->renderMessage("Stark, das ist ja die Fortsetzung zum \"Anhalter\":|\"Das Restaurant am Ende des Universums\".");
+ _vm->renderMessage(kStringGenericInteract_31);
mouseWait(_timer1);
_vm->removeMessage();
- _vm->renderMessage("Moment mal, es ist ein Lesezeichen drin,|auf dem \"Zweiundvierzig\" steht.");
+ _vm->renderMessage(kStringGenericInteract_32);
} else {
return false;
}
@@ -1582,13 +1580,13 @@ void GameManager::handleInput() {
case ACTION_WALK:
if (_inputObject[0]->hasProperty(CARRIED)) {
// You already carry this.
- _vm->renderMessage("Das tr\204gst du doch bei dir.");
+ _vm->renderMessage(kStringGenericInteract_33);
} else if (!_inputObject[0]->hasProperty(EXIT)) {
// You're already there.
- _vm->renderMessage("Du bist doch schon da.");
+ _vm->renderMessage(kStringGenericInteract_34);
} else if (_inputObject[0]->hasProperty(OPENABLE) && !_inputObject[0]->hasProperty(OPENED)) {
// This is closed
- _vm->renderMessage("Das ist geschlossen.");
+ _vm->renderMessage(kStringShipHold9);
} else {
changeRoom(_inputObject[0]->_exitRoom);
}
@@ -1597,13 +1595,13 @@ void GameManager::handleInput() {
case ACTION_TAKE:
if (_inputObject[0]->hasProperty(OPENED)) {
// You already have that
- _vm->renderMessage("Das hast du doch schon.");
+ _vm->renderMessage(kStringGenericInteract_35);
} else if (_inputObject[0]->hasProperty(UNNECESSARY)) {
// You do not need that.
- _vm->renderMessage("Das brauchst du nicht.");
+ _vm->renderMessage(kStringGenericInteract_36);
} else if (!_inputObject[0]->hasProperty(TAKE)) {
// You can't take that.
- _vm->renderMessage("Das kannst du nicht nehmen.");
+ _vm->renderMessage(kStringGenericInteract_37);
} else {
takeObject(*_inputObject[0]);
}
@@ -1612,13 +1610,13 @@ void GameManager::handleInput() {
case ACTION_OPEN:
if (!_inputObject[0]->hasProperty(OPENABLE)) {
// This can't be opened
- _vm->renderMessage("Das l\204\341t sich nicht \224ffnen.");
+ _vm->renderMessage(kStringGenericInteract_38);
} else if (_inputObject[0]->hasProperty(OPENED)) {
// This is already opened.
- _vm->renderMessage("Das ist schon offen.");
+ _vm->renderMessage(kStringGenericInteract_39);
} else if (_inputObject[0]->hasProperty(CLOSED)) {
// This is locked.
- _vm->renderMessage("Das ist verschlossen.");
+ _vm->renderMessage(kStringGenericInteract_40);
} else {
drawImage(_inputObject[0]->_section);
_inputObject[0]->setProperty(OPENED);
@@ -1634,10 +1632,10 @@ void GameManager::handleInput() {
(_inputObject[0]->hasProperty(CLOSED) &&
_inputObject[0]->hasProperty(OPENED))) {
// This can't be closed.
- _vm->renderMessage("Das l\204\341t sich nicht schlie\341en.");
+ _vm->renderMessage(kStringGenericInteract_41);
} else if (!_inputObject[0]->hasProperty(OPENED)) {
// This is already closed.
- _vm->renderMessage("Das ist schon geschlossen.");
+ _vm->renderMessage(kStringCloseLocker_1);
} else {
drawImage(invertSection(_inputObject[0]->_section));
_inputObject[0]->disableProperty(OPENED);
@@ -1651,13 +1649,13 @@ void GameManager::handleInput() {
case ACTION_GIVE:
if (_inputObject[0]->hasProperty(CARRIED)) {
// Better keep it!
- _vm->renderMessage("Behalt es lieber!");
+ _vm->renderMessage(kStringGenericInteract_42);
}
break;
default:
// This is not possible.
- _vm->renderMessage("Das geht nicht.");
+ _vm->renderMessage(kStringGenericInteract_43);
}
}
}
Commit: 73c9c7ad50db0d79339aa8888218e0548e51e111
https://github.com/scummvm/scummvm/commit/73c9c7ad50db0d79339aa8888218e0548e51e111
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:36Z
Commit Message:
SUPERNOVA: Update English translation
Changed paths:
devtools/create_supernova/strings-en.po
diff --git a/devtools/create_supernova/strings-en.po b/devtools/create_supernova/strings-en.po
index 266e37f..3104577 100644
--- a/devtools/create_supernova/strings-en.po
+++ b/devtools/create_supernova/strings-en.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Mission Supernova 1.0\n"
"Report-Msgid-Bugs-To: scummvm-devel at lists.scummvm.org\n"
"POT-Creation-Date: 2017-07-22 19:53+0100\n"
-"PO-Revision-Date: 2017-10-22 18:01+0000\n"
+"PO-Revision-Date: 2017-10-29 16:51+0000\n"
"Last-Translator: Thierry Crozat <criezy at scummvm.org>\n"
"Language-Team: none\n"
"Language: en\n"
@@ -635,7 +635,6 @@ msgstr ""
"consciousness."
#: ../../msn/msn_r1.c:295
-#, fuzzy
msgid "Was steht dir jetzt wohl wirklich bevor?"
msgstr "What is going to happen to you now?"
@@ -1138,7 +1137,6 @@ msgid "Schachspiel"
msgstr "Game of chess"
#: ../../msn/msn_r1_r.c:161
-#, fuzzy
msgid "Es macht wohl Spaá, an|der Decke Schach zu spielen."
msgstr "I guess it's fun to play|chess on the ceiling."
@@ -1248,7 +1246,7 @@ msgstr "Poster"
#: ../../msn/msn_r1_r.c:230
msgid "Ein Poster von \"Big Boss\"."
-msgstr "A poster from \"Big Boss\"."
+msgstr "A poster of \"Big Boss\"."
#: ../../msn/msn_r1_r.c:231
msgid "Ein Poster von \"Rock Desaster\"."
@@ -1695,7 +1693,6 @@ msgid "Was? Lachhaft!"
msgstr "What? Ridiculous!"
#: ../../msn/msn_r2.c:745
-#, fuzzy
msgid "Wie erklren Sie sich dann,|daá ich ihnen gegenbersitze?"
msgstr "How do you explain then|that I am seated opposite you?"
@@ -1716,13 +1713,11 @@ msgid "Nein, ich bin nur ein Ahnungsloser Koch von der Erde."
msgstr "No, I'm just a clueless cook from the Earth."
#: ../../msn/msn_r2.c:749
-#, fuzzy
msgid ""
"Na gut, ich glaube Ihnen. Lassen wir jetzt|dieses Thema, langsam wird es mir "
"zu bunt!"
msgstr ""
-"All right, I believe you. Let's drop this subject, it slowly becomes "
-"colorful to me!"
+"OK. I believe you. Let's move away from this topic|before it goes too far!"
#: ../../msn/msn_r2.c:761
msgid "Eine Partie Schach! Das ist eine gute Idee."
@@ -1757,9 +1752,8 @@ msgid "Du tippst auf den Tasten herum,|aber es passiert nichts."
msgstr "You tap the buttons,|but nothing happens."
#: ../../msn/msn_r2.c:917
-#, fuzzy
msgid "Ach, Ihnen gehrt die. Ich habe sie eben im Sand gefunden."
-msgstr "Oh, they are yours. I just found them in the sand."
+msgstr "Oh, it is yours. I just found it in the sand."
#: ../../msn/msn_r2.c:918
msgid "Nein, tut mir leid."
@@ -1794,7 +1788,6 @@ msgid "Ich habe gerade Ihre Brieftasche gefunden!"
msgstr "I just found your wallet!"
#: ../../msn/msn_r2.c:941
-#, fuzzy
msgid "Sie lag da drben hinter einem Felsen."
msgstr "It was over there behind a rock."
@@ -2140,7 +2133,6 @@ msgid "Wie ist der denn mit|Schuhen hier reingekommen?"
msgstr "How did he get in here|with his shoes on?"
#: ../../msn/msn_r2.c:1278
-#, fuzzy
msgid "Froschgesicht"
msgstr "Frog face"
@@ -2185,14 +2177,12 @@ msgid "Keycard von Roger"
msgstr "Roger's keycard"
#: ../../msn/msn_r2.c:1301
-#, fuzzy
msgid "Anzeige"
-msgstr "Advertisement"
+msgstr "Display"
#: ../../msn/msn_r2.c:1301 ../../msn/msn_r2.c:1302
-#, fuzzy
msgid "Hmm, seltsame Anzeigen."
-msgstr "Hmm, weird ads."
+msgstr "Hmm, weird instruments."
#: ../../msn/msn_r2.c:1308
msgid "Roger W."
@@ -2271,9 +2261,8 @@ msgid "Nein!"
msgstr "No!"
#: ../../msn/msn_r3.c:310
-#, fuzzy
msgid "Das máte schon ein biáchen mehr sein."
-msgstr "That should be a little more than that."
+msgstr "It should be a little more than that."
#: ../../msn/msn_r3.c:324
msgid "Ok, dann machen Sie daá Sie wegkommen!"
@@ -2551,7 +2540,6 @@ msgid "Es ist nur ein Bild."
msgstr "It's just a picture."
#: ../../msn/msn_r3.c:1486
-#, fuzzy
msgid "Sieht etwas anders aus als auf der Erde."
msgstr "Looks a little different than on Earth."
@@ -2568,7 +2556,6 @@ msgid "Roboter"
msgstr "Robot"
#: ../../msn/msn_r3.c:1490
-#, fuzzy
msgid "Den hast du erledigt."
msgstr "You took care of it."
@@ -2661,9 +2648,8 @@ msgid "Brief"
msgstr "Note"
#: ../../msn/msn_r3.c:1635
-#, fuzzy
msgid "Wrfel"
-msgstr "Dice"
+msgstr "Cubes"
#: ../../msn/msn_r3.c:1635
msgid "Sonderbar!"
Commit: 201fd0ff56493fce78508d4a1acef6ec8de954cb
https://github.com/scummvm/scummvm/commit/201fd0ff56493fce78508d4a1acef6ec8de954cb
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:36Z
Commit Message:
SUPERNOVA: Change detection to use data files instead of executables
Changed paths:
engines/supernova/detection.cpp
diff --git a/engines/supernova/detection.cpp b/engines/supernova/detection.cpp
index 17db24a..e3f4856 100644
--- a/engines/supernova/detection.cpp
+++ b/engines/supernova/detection.cpp
@@ -37,38 +37,38 @@ static const PlainGameDescriptor supernovaGames[] = {
namespace Supernova {
static const ADGameDescription gameDescriptions[] = {
- // Mission Supernova 1
- {
- "msn1",
- NULL,
- AD_ENTRY1s("msn.exe", "d11264516c529c7fc2ca81d8ba062d9e", 65536),
- Common::DE_DEU,
- Common::kPlatformDOS,
- ADGF_UNSTABLE,
- GUIO1(GUIO_NONE)
- },
+ // Mission Supernova 1
{
"msn1",
NULL,
- AD_ENTRY1s("msn.exe", "d11264516c529c7fc2ca81d8ba062d9e", 65536),
+ AD_ENTRY1s("msn_data.000", "f64f16782a86211efa919fbae41e7568", 24163),
+ Common::DE_DEU,
+ Common::kPlatformDOS,
+ ADGF_UNSTABLE,
+ GUIO1(GUIO_NONE)
+ },
+ {
+ "msn1",
+ NULL,
+ AD_ENTRY1s("msn_data.000", "f64f16782a86211efa919fbae41e7568", 24163),
Common::EN_ANY,
Common::kPlatformDOS,
ADGF_UNSTABLE,
GUIO1(GUIO_NONE)
},
- // Mission Supernova 2
- {
- "msn2",
- NULL,
- AD_ENTRY1s("ms2.exe", "e1b725393c3665f30efa96e2f46d589e", 82944),
- Common::DE_DEU,
- Common::kPlatformDOS,
- ADGF_UNSTABLE,
- GUIO1(GUIO_NONE)
- },
-
- AD_TABLE_END_MARKER
+ // Mission Supernova 2
+ {
+ "msn2",
+ NULL,
+ AD_ENTRY1s("ms2_data.000", "e595610cba4a6d24a763e428d05cc83f", 24805),
+ Common::DE_DEU,
+ Common::kPlatformDOS,
+ ADGF_UNSTABLE,
+ GUIO1(GUIO_NONE)
+ },
+
+ AD_TABLE_END_MARKER
};
}
Commit: 15b4e7a298d2e553680d2f8a77984ea1745b1e6a
https://github.com/scummvm/scummvm/commit/15b4e7a298d2e553680d2f8a77984ea1745b1e6a
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:36Z
Commit Message:
SUPERNOVA: Fix delay when loading a savedgame while a message is displayed
This required the user to click a mouse button to close the message and
get to the mew state. Now the message is automatically closed before
loading the new state.
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index c54ce1c..65fefea 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -911,6 +911,10 @@ bool SupernovaEngine::loadGame(int slot) {
return false; //Common::kUnknownError;
}
+ // Make sure no message is displayed as this would otherwise delay the
+ // switch to the new location until a mouse click.
+ removeMessage();
+
int descriptionSize = savefile->readSint16LE();
savefile->skip(descriptionSize);
savefile->skip(6);
Commit: 7f8806e9290578870b251f9a9eee91cac79ec937
https://github.com/scummvm/scummvm/commit/7f8806e9290578870b251f9a9eee91cac79ec937
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:36Z
Commit Message:
SUPERNOVA: Update English translation
Changed paths:
devtools/create_supernova/strings-en.po
diff --git a/devtools/create_supernova/strings-en.po b/devtools/create_supernova/strings-en.po
index 3104577..f9f6839 100644
--- a/devtools/create_supernova/strings-en.po
+++ b/devtools/create_supernova/strings-en.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Mission Supernova 1.0\n"
"Report-Msgid-Bugs-To: scummvm-devel at lists.scummvm.org\n"
"POT-Creation-Date: 2017-07-22 19:53+0100\n"
-"PO-Revision-Date: 2017-10-29 16:51+0000\n"
+"PO-Revision-Date: 2017-10-31 22:17+0000\n"
"Last-Translator: Thierry Crozat <criezy at scummvm.org>\n"
"Language-Team: none\n"
"Language: en\n"
@@ -227,7 +227,7 @@ msgstr "You already have that."
#. I18N: You do not need that.
#: ../../msn/msn.c:3360
msgid "Das brauchst du nicht."
-msgstr "You do not need that."
+msgstr "You don't need that."
#. I18N: You can't take that.
#: ../../msn/msn.c:3363
@@ -267,7 +267,7 @@ msgstr "Better keep it!"
#. I18N: This is not possible.
#: ../../msn/msn.c:3418
msgid "Das geht nicht."
-msgstr "This is not possible."
+msgstr "You can't do that."
#: ../../msn/msn_mod.c:573
msgid "^(C) 1994 Thomas und Steffen Dingel#"
@@ -470,7 +470,7 @@ msgstr "You must take off your helmet first."
#: ../../msn/msn_r0.c:397
msgid "Du muát erst den Versorgungsteil abnehmen."
-msgstr "You must take off your supply first."
+msgstr "You must take off your oxygen supply unit first."
#: ../../msn/msn_r0.c:401
msgid "Du ziehst den Raumanzug aus."
@@ -484,6 +484,10 @@ msgstr "You put on your space suit."
msgid "Den Helm httest du|besser angelassen!"
msgstr "You should have kept your helmet on!"
+#: ../../msn/msn_r0.c:433
+msgid "Du ziehst den Helm ab."
+msgstr "You put on your helmet."
+
#: ../../msn/msn_r0.c:441
msgid "Du ziehst den Helm auf."
msgstr "You take off your helmet."
@@ -494,15 +498,15 @@ msgstr "You must wear the suit first."
#: ../../msn/msn_r0.c:467
msgid "Den Versorungsteil httest du|besser nicht abgenommen!"
-msgstr "You should have not taken off your supply!"
+msgstr "You should not have taken off your oxygen supply unit!"
#: ../../msn/msn_r0.c:469
msgid "Du nimmst den Versorgungsteil ab."
-msgstr "You take off your supply."
+msgstr "You take off your oxygen supply unit."
#: ../../msn/msn_r0.c:477
msgid "Du ziehst den Versorgungsteil an."
-msgstr "You put on your supply."
+msgstr "You put on your oxygen supply unit."
#: ../../msn/msn_r0.c:489
msgid "Die Leitung ist hier unntz."
@@ -692,7 +696,7 @@ msgstr "Emergency energy supply active"
#: ../../msn/msn_r1.c:447
msgid "Zu niedriger Luftdruck soll ungesund sein."
-msgstr "Air pressure too low is unhealthy."
+msgstr "Air pressure too low unhealthy is."
#: ../../msn/msn_r1.c:454
msgid "Er zeigt Null an."
@@ -816,7 +820,7 @@ msgstr "What?! No one in the cockpit!|They're crazy!"
#: ../../msn/msn_r1.c:1105
msgid "Komisch, es ist nur|noch ein Raumanzug da."
-msgstr "Funny, there's only|one spacesuit."
+msgstr "Funny, there's only|one space suit."
#: ../../msn/msn_r1.c:1113
msgid ""
@@ -942,23 +946,23 @@ msgstr "Helmet"
#: ../../msn/msn_r1_r.c:69
msgid "Es ist der Helm zum Raumanzug."
-msgstr "This is the helmet for the spacesuit."
+msgstr "This is the helmet for the space suit."
#: ../../msn/msn_r1_r.c:70
msgid "Raumanzug"
-msgstr "Spacesuit"
+msgstr "Space suit"
#: ../../msn/msn_r1_r.c:70
msgid "Der einzige Raumanzug, den die|anderen hiergelassen haben ..."
-msgstr "The only space suit the others have left ..."
+msgstr "The only space suit left behind by the others..."
#: ../../msn/msn_r1_r.c:72
msgid "Versorgung"
-msgstr "Oxygen Supply"
+msgstr "Oxygen Supply Unit"
#: ../../msn/msn_r1_r.c:72
msgid "Es ist der Versorgungsteil zum Raumanzug."
-msgstr "It is the supply for the spacesuit."
+msgstr "It is the oxygen supply unit for the space suit."
#: ../../msn/msn_r1_r.c:74
msgid "Druckmesser"
@@ -1099,8 +1103,8 @@ msgid ""
"Auf dem Zettel sind lauter|unverstndliche Skizzen und Berechnungen.|"
"(Jedenfalls fr dich unverstndlich.)"
msgstr ""
-"There are incomprehensible sketches|and calculations on that note.|(In any "
-"case, it's incomprehensible to you.)"
+"There are incomprehensible sketches|and calculations on that note.|(At "
+"least, it's incomprehensible to you.)"
#: ../../msn/msn_r1_r.c:148 ../../msn/msn_r1_r.c:215 ../../msn/msn_r1_r.c:233
#: ../../msn/msn_r1_r.c:276
@@ -1230,7 +1234,7 @@ msgstr "Brilliant!"
#: ../../msn/msn_r1_r.c:217
msgid "Es scheint noch nicht fertig zu sein."
-msgstr "It doesn't seem ready yet."
+msgstr "It looks like it is not yet finished."
#: ../../msn/msn_r1_r.c:218
msgid "Stift"
@@ -1262,7 +1266,7 @@ msgstr "Record"
#: ../../msn/msn_r1_r.c:235
msgid "Die Platte ist von \"Big Boss\"."
-msgstr "This record is the soundtrack from \"Big Boss\"."
+msgstr "A record from \"Big Boss\"."
#: ../../msn/msn_r1_r.c:237
msgid "Schallplattenstnder"
@@ -1894,7 +1898,7 @@ msgstr "Don't worry, we just want to help you."
#: ../../msn/msn_r2.c:1152
msgid "Und wieso hat der Typ im Raumanzug|eben auf mich geschossen?"
-msgstr "And why did the guy in the spacesuit|shoot at me?"
+msgstr "And why did the guy in the space suit|shoot at me?"
#: ../../msn/msn_r2.c:1153
msgid "Das war eine Schreckreaktion."
Commit: e06d7cc99bb2c29b07aac1f2cf38191d9d3a22f0
https://github.com/scummvm/scummvm/commit/e06d7cc99bb2c29b07aac1f2cf38191d9d3a22f0
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:36Z
Commit Message:
SUPERNOVA: Fix incorrect game text strings
Changed paths:
devtools/create_supernova/gametext.h
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index b0c1ef6..e1c7bde 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -98,9 +98,9 @@ const char *gameText[] = {
// 50
"Leiter", // kStringLadder
"Ausgang", // kStringExit
- "Sie f\204hrt ins Cockpit.", // kStringCockpitHatchDescription
- "Sie f\204hrt zur K\201che.", // kStringKitchenHatchDescription
- "Sie f\204hrt zu den Tiefschlafkammern.", // kStringStasisHatchDescription
+ "Sie f\201hrt ins Cockpit.", // kStringCockpitHatchDescription
+ "Sie f\201hrt zur K\201che.", // kStringKitchenHatchDescription
+ "Sie f\201hrt zu den Tiefschlafkammern.", // kStringStasisHatchDescription
// 55
"Dies ist eine der Tiefschlafkammern.", // kStringStasisHatchDescription2
"Schlitz", // kStringSlot
Commit: 8950934a473fb59436f7daa79d25d9a560ed94ea
https://github.com/scummvm/scummvm/commit/8950934a473fb59436f7daa79d25d9a560ed94ea
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:36Z
Commit Message:
SUPERNOVA: Fix incorrect string
Changed paths:
devtools/create_supernova/strings-en.po
diff --git a/devtools/create_supernova/strings-en.po b/devtools/create_supernova/strings-en.po
index f9f6839..2af7059 100644
--- a/devtools/create_supernova/strings-en.po
+++ b/devtools/create_supernova/strings-en.po
@@ -1051,7 +1051,7 @@ msgstr "Empty cable reel"
#: ../../msn/msn_r1_r.c:117
msgid ""
-"Hey, das ist die Keycard des Commanders!|Er muá sie bei dem berstrzten|"
+"Hey, das ist die Keycard des Commanders!|Er muá sie bei dem berstrzten|"
"Aufbruch verloren haben."
msgstr ""
"Hey, that's the commander's keycard!|He must have lost it in the rushed|"
Commit: 29397932af20e43ff63a8d551ead01333cc9db0e
https://github.com/scummvm/scummvm/commit/29397932af20e43ff63a8d551ead01333cc9db0e
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:36Z
Commit Message:
SUPERNOVA: Fix incorrect translation
Changed paths:
devtools/create_supernova/strings-en.po
diff --git a/devtools/create_supernova/strings-en.po b/devtools/create_supernova/strings-en.po
index 2af7059..090d211 100644
--- a/devtools/create_supernova/strings-en.po
+++ b/devtools/create_supernova/strings-en.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Mission Supernova 1.0\n"
"Report-Msgid-Bugs-To: scummvm-devel at lists.scummvm.org\n"
"POT-Creation-Date: 2017-07-22 19:53+0100\n"
-"PO-Revision-Date: 2017-10-31 22:17+0000\n"
+"PO-Revision-Date: 2017-11-01 00:16+0000\n"
"Last-Translator: Thierry Crozat <criezy at scummvm.org>\n"
"Language-Team: none\n"
"Language: en\n"
@@ -486,11 +486,11 @@ msgstr "You should have kept your helmet on!"
#: ../../msn/msn_r0.c:433
msgid "Du ziehst den Helm ab."
-msgstr "You put on your helmet."
+msgstr "You take off your helmet."
#: ../../msn/msn_r0.c:441
msgid "Du ziehst den Helm auf."
-msgstr "You take off your helmet."
+msgstr "You put on your helmet."
#: ../../msn/msn_r0.c:443 ../../msn/msn_r0.c:479
msgid "Du muát erst den Anzug anziehen."
@@ -608,8 +608,8 @@ msgid ""
"Es wrde wenig bringen,|sich in eine Schlafkammer zu legen,|die nicht "
"eingeschaltet ist."
msgstr ""
-"Going into a stasis pod|that is not switched on|is not going to achieve "
-"anything."
+"You are not going to achieve anything|by using a stasis pod that is|not "
+"switched on."
#: ../../msn/msn_r1.c:174
msgid "Dazu muát du erst den Raumanzug ausziehen."
Commit: f98fcd139b61b2816b30c405ac103dd8e3c5c495
https://github.com/scummvm/scummvm/commit/f98fcd139b61b2816b30c405ac103dd8e3c5c495
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:36Z
Commit Message:
SUPERNOVA: Fix screen shake
OSystem::setShakePos(int) can only take positive offset (as documented).
Passing a negative offset caused memory issues in the drawing code and
some random crashes.
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 646bdaa..812cf1a 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1030,15 +1030,12 @@ void GameManager::handleTime() {
}
void GameManager::screenShake() {
- // STUB
for (int i = 0; i < 12; ++i) {
- _vm->_system->setShakePos(4);
+ _vm->_system->setShakePos(8);
wait2(1);
- _vm->_system->setShakePos(-4);
+ _vm->_system->setShakePos(0);
wait2(1);
}
-
- _vm->_system->setShakePos(0);
}
void GameManager::shock() {
Commit: 06c46bd281f0ebd121ee1b3e8ea5f5bc08a2008a
https://github.com/scummvm/scummvm/commit/06c46bd281f0ebd121ee1b3e8ea5f5bc08a2008a
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:37Z
Commit Message:
SUPERNOVA: Fix incorrect German string
Changed paths:
devtools/create_supernova/gametext.h
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index e1c7bde..3702c22 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -494,7 +494,7 @@ const char *gameText[] = {
//380
"Das Seil ist hier schon ganz richtig.", // kStringShipHold15
"Das Kabel ist zu kurz.", // kStringShipHold16
- "Die Raumschifft sind alle verschlossen.", // kStringArsanoMeetup1
+ "Die Raumschiffe sind alle verschlossen.", // kStringArsanoMeetup1
"Unsinn!", // kStringArsanoMeetup2
"Komisch! Auf einmal kannst du|das Schild lesen! Darauf steht:|\"Treffpunkt Galactica\".", // kStringArsanoMeetup3
//385
Commit: f4b10b7a83aa9e7f5f6177c8f809402668719c11
https://github.com/scummvm/scummvm/commit/f4b10b7a83aa9e7f5f6177c8f809402668719c11
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:37Z
Commit Message:
SUPERNOVA: Add missing game string
Changed paths:
devtools/create_supernova/gametext.h
engines/supernova/msn_def.h
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index 3702c22..077d75d 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -775,11 +775,7 @@ const char *gameText[] = {
"Behalt es lieber!", // kStringGenericInteract_42
// 615
"Das geht nicht.", // kStringGenericInteract_43
- "",
- "",
- "",
- "",
- // 620
+ "Gespr\204ch beenden", // kStringConversationEnd
NULL
};
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index f463755..6f57e28 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -530,20 +530,23 @@ enum StringID {
kStringDialogAxacussCorridor5_7, kStringDialogX1, kStringDialogX2, kStringDialogX3, kStringAxacussCorridor5_1,
kStringAxacussCorridor5_2, kStringAxacussCorridor5_3, kStringAxacussCorridor5_4, kStringAxacussCorridor5_5, kStringAxacussCorridor5_6,
kStringAxacussCorridor5_7, kStringAxacussBcorridor_1, kStringAxacussOffice1_1, kStringAxacussOffice1_2, kStringAxacussOffice1_3,
+ // 550
kStringAxacussOffice1_4, kStringAxacussOffice1_5, kStringAxacussOffice1_6, kStringAxacussOffice1_7, kStringAxacussOffice1_8,
kStringAxacussOffice1_9, kStringAxacussOffice1_10, kStringAxacussOffice1_11, kStringAxacussOffice1_12, kStringAxacussOffice1_13,
kStringAxacussOffice1_14, kStringAxacussOffice1_15, kStringAxacussOffice1_16, kStringAxacussOffice3_1, kStringAxacussElevator_1,
kStringAxacussElevator_2, kStringAxacussElevator_3, kStringShock, kStringShot, kStringCloseLocker_1,
kStringIsHelmetOff_1, kStringGenericInteract_1, kStringGenericInteract_2, kStringGenericInteract_3, kStringGenericInteract_4,
+ // 575
kStringGenericInteract_5, kStringGenericInteract_6, kStringGenericInteract_7, kStringGenericInteract_8, kStringGenericInteract_9,
kStringGenericInteract_10, kStringGenericInteract_11, kStringGenericInteract_12, kPhrasalVerbParticleGiveTo, kPhrasalVerbParticleUseWith,
kStringGenericInteract_13, kStringGenericInteract_14, kStringGenericInteract_15, kStringGenericInteract_16, kStringGenericInteract_17,
kStringGenericInteract_18, kStringGenericInteract_19, kStringGenericInteract_20, kStringGenericInteract_21, kStringGenericInteract_22,
kStringGenericInteract_23, kStringGenericInteract_24, kStringGenericInteract_25, kStringGenericInteract_26, kStringGenericInteract_27,
+ // 600
kStringGenericInteract_28, kStringGenericInteract_29, kStringGenericInteract_30, kStringGenericInteract_31, kStringGenericInteract_32,
kStringGenericInteract_33, kStringGenericInteract_34, kStringGenericInteract_35, kStringGenericInteract_36, kStringGenericInteract_37,
kStringGenericInteract_38, kStringGenericInteract_39, kStringGenericInteract_40, kStringGenericInteract_41, kStringGenericInteract_42,
- kStringGenericInteract_43
+ kStringGenericInteract_43, kStringConversationEnd
};
static StringID guiCommands[] = {
Commit: 21899d8716475c08aa591c087b58c63bb00927ed
https://github.com/scummvm/scummvm/commit/21899d8716475c08aa591c087b58c63bb00927ed
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:37Z
Commit Message:
SUPERNOVA: Implement most dialog related functions
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/rooms.h
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index f7d4f15..8c32d5c 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -1581,20 +1581,20 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
do {
if (_gm->_state._shoes == 1) {
_dialog2[2] = kStringArsanoEntrance2;
- _gm->addSentence(2, 2);
+ addSentence(2, 2);
} else if (_gm->_state._shoes > 1) {
- _gm->removeSentence(2, 2);
+ removeSentence(2, 2);
}
switch (e = _gm->dialog(5, row2, _dialog2, 2)) {
case 0:
_gm->reply(kStringArsanoEntrance3, 1, _gm->invertSection(1));
_gm->reply(kStringArsanoEntrance4, 1, _gm->invertSection(1));
_gm->reply(kStringArsanoEntrance5, 1, _gm->invertSection(1));
- _gm->removeSentence(1, 1);
+ removeSentence(1, 1);
break;
case 1:
_gm->reply(kStringArsanoEntrance6, 1, _gm->invertSection(1));
- _gm->addSentence(1, 2);
+ addSentence(1, 2);
break;
case 2:
if (_gm->_state._shoes == 1) {
@@ -1643,7 +1643,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
_gm->reply(kStringArsanoEntrance3, 1, 1 + 128);
_gm->reply(kStringArsanoEntrance4, 1, 1 + 128);
_gm->reply(kStringArsanoEntrance5, 1, 1 + 128);
- _gm->removeSentence(0, 2);
+ removeSentence(0, 2);
break;
case 2:
_gm->reply(kStringArsanoEntrance7, 1, 1 + 128);
@@ -1661,7 +1661,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
_gm->drawImage(_gm->invertSection(3));
break;
}
- _gm->removeSentence(0, 1);
+ removeSentence(0, 1);
}
} else {
_gm->dialog(2, row3, _dialog3, 0);
@@ -1689,8 +1689,8 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
if (_gm->_state._shoes == 2) {
_vm->renderMessage(kStringArsanoEntrance17);
_gm->_state._shoes = 3;
- _gm->removeSentence(2, 2);
- _gm->removeSentence(3, 2);
+ removeSentence(2, 2);
+ removeSentence(3, 2);
} else if (_gm->_state._shoes == 3) {
_vm->renderMessage(kStringArsanoEntrance18);
_gm->_state._shoes = 2;
@@ -2326,7 +2326,7 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
_gm->reply(kStringArsanoMeetup3_24, 1, 1 + 128);
_gm->reply(kStringArsanoMeetup3_25, 1, 1 + 128);
}
- _gm->removeSentence(2, 2);
+ removeSentence(2, 2);
} while (_shown[kMaxSection - 2] != 15);
_gm->say(kStringArsanoMeetup3_26);
_gm->reply(kStringArsanoMeetup3_27, 1, 1 + 128);
@@ -2583,8 +2583,8 @@ bool AxacussCorridor5::handleMoneyDialog() {
_gm->reply(kStringAxacussCorridor5_5, 1, 1 + 128);
setSectionVisible(kMaxSection - 2, false);
if (_gm->_state._money == 0) {
- _gm->removeSentence(2, 2);
- _gm->removeSentence(3, 2);
+ removeSentence(2, 2);
+ removeSentence(3, 2);
} else {
// TODO: Handle string manipulation in dialogs
// _dialog3[2] and _dialog3[3] are both using kStringDialogAxacussCorridor5_7
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index e3b30f8..47249f0 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -61,6 +61,23 @@ public:
bool isSectionVisible(uint index) const {
return _shown[index] == kShownTrue;
}
+
+ void removeSentence(int sentence, int number) {
+ if (number > 0)
+ _shown[kMaxSection - number] |= (1 << sentence);
+ }
+
+ void addSentence(int sentence, int number) {
+ if (number > 0)
+ _shown[kMaxSection - number] &= ~(1 << sentence);
+ }
+
+ bool sentencedRemoved(int sentence, int number) {
+ if (number <= 0)
+ return false;
+ return (_shown[kMaxSection - number] & (1 << sentence));
+ }
+
Object *getObject(uint index) {
return &_objectState[index];
}
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 812cf1a..c289fba 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -319,6 +319,14 @@ void GameManager::initState() {
_timer1 = 0;
_animationTimer = 0;
+ _currentSentence = -1;
+ for (int i = 0 ; i < 6 ; ++i) {
+ _sentenceNumber[i] = -1;
+ _texts[i] = kNoString;
+ _rows[i] = 0;
+ _rowsStart[i] = 0;
+ }
+
_state._time = ticksToMsec(916364); // 2 pm
_state._timeSleep = 0;
_state._timeAlarm = ticksToMsec(458182); // 7 am
@@ -775,33 +783,119 @@ void GameManager::shipStart() {
// STUB
}
-void GameManager::removeSentence(int sentence, int number) {
- // STUB
-}
-
-void GameManager::addSentence(int sentence, int number) {
- // STUB
+void GameManager::sentence(int number, bool brightness) {
+ if (number < 0)
+ return;
+ _vm->renderBox(0, 141 + _rowsStart[number] * 10, 320, _rows[number] * 10 - 1, brightness ? kColorWhite44 : kColorWhite25);
+ if (_texts[_rowsStart[number]] == kStringDialogSeparator)
+ _vm->renderText(kStringConversationEnd, 1, 142 + _rowsStart[number] * 10, brightness ? kColorRed : kColorDarkRed);
+ else {
+ for (int r = _rowsStart[number]; r < _rowsStart[number] + _rows[number]; ++r)
+ _vm->renderText(_texts[r], 1, 142 + r * 10, brightness ? kColorGreen : kColorDarkGreen);
+ }
}
void GameManager::say(StringID textId) {
- // STUB
+ Common::String str = _vm->getGameString(textId);
+ if (!str.empty())
+ say(str.c_str());
}
void GameManager::say(const char *text) {
- // STUB
+ Common::String t(text);
+ char *row[6];
+ Common::String::iterator p = t.begin();
+ uint numRows = 0;
+ while (*p) {
+ row[numRows++] = p;
+ while ((*p != '\0') && (*p != '|')) {
+ ++p;
+ }
+ if (*p == '|') {
+ *p = 0;
+ ++p;
+ }
+ }
+
+ _vm->renderBox(0, 138, 320, 62, kColorBlack);
+ _vm->renderBox(0, 141, 320, numRows * 10 - 1, kColorWhite25);
+ for (int r = 0; r < numRows; ++r)
+ _vm->renderText(row[r], 1, 142 + r * 10, kColorDarkGreen);
+ mouseWait((t.size() + 20) * _vm->_textSpeed / 10);
+ _vm->renderBox(0, 138, 320, 62, kColorBlack);
}
void GameManager::reply(StringID textId, int aus1, int aus2) {
- // STUB
+ Common::String str = _vm->getGameString(textId);
+ if (!str.empty())
+ reply(str.c_str(), aus1, aus2);
}
void GameManager::reply(const char *text, int aus1, int aus2) {
- // STUB
+ if (*text != '|')
+ _vm->renderMessage(text, kMessageTop);
+
+ for (int z = (strlen(text) + 20) * _vm->_textSpeed / 40; z > 0; --z) {
+ drawImage(aus1);
+ mouseWait(2);
+ if (_keyPressed) // ?? origin: key != -1, need to check what mouseWait does...
+ z = 1;
+ drawImage(aus2);
+ mouseWait(2);
+ if (_keyPressed)
+ z = 1;
+ }
+ if (*text != '|')
+ _vm->removeMessage();
}
int GameManager::dialog(int num, byte rowLength[6], StringID text[6], int number) {
- // STUB
- return 0;
+ bool remove[6];
+ for (int i = 0; i < 5; ++i)
+ remove[i] = _currentRoom->sentencedRemoved(i, number);
+ // The original does not initialize remove[5]!!!
+ // Set it to false/0. But maybe the loop above should use 6 instead of 5?
+ remove[5] = false;
+
+ _vm->renderBox(0, 138, 320, 62, kColorBlack);
+
+ for (int i = 0; i < 6 ; ++i)
+ _sentenceNumber[i] = -1;
+
+ int r = 0, rq = 0;
+ for (int i = 0; i < num; ++i) {
+ if (!remove[i]) {
+ _rowsStart[i] = r;
+ _rows[i] = rowLength[i];
+ for (int j = 0; j < _rows[i]; ++j, ++r, ++rq) {
+ _texts[r] = text[rq];
+ _sentenceNumber[r] = i;
+ }
+ sentence(i, false);
+ } else
+ rq += rowLength[i];
+ }
+
+ _currentSentence = -1;
+ do {
+ mouseInput3();
+ } while (_currentSentence == -1);
+
+ _vm->renderBox(0, 138, 320, 62, kColorBlack);
+
+ if (number && _texts[_rowsStart[_currentSentence]] != kStringDialogSeparator)
+ _currentRoom->removeSentence(_currentSentence, number);
+
+ return _currentSentence;
+}
+
+void GameManager::mousePosDialog(int x, int y) {
+ int a = y < 141 ? -1 : _sentenceNumber[(y - 141) / 10];
+ if (a != _currentSentence) {
+ sentence(_currentSentence, false);
+ _currentSentence = a;
+ sentence(_currentSentence, true);
+ }
}
void GameManager::turnOff() {
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index d72cd17..c5f5803 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -132,6 +132,12 @@ public:
GuiElement _guiInventoryArrow[2];
// 0 PC Speaker | 1 SoundBlaster | 2 No Sound
int _soundDevice;
+ // Dialog
+ int _currentSentence;
+ int _sentenceNumber[6];
+ StringID _texts[6];
+ byte _rows[6];
+ byte _rowsStart[6];
void takeObject(Object &obj);
@@ -182,12 +188,11 @@ public:
void dead(StringID messageId);
int dialog(int num, byte rowLength[6], StringID text[6], int number);
void sentence(int number, bool brightness);
- void removeSentence(int sentence, int number);
- void addSentence(int sentence, int number);
void say(StringID textId);
void say(const char *text);
void reply(StringID textId, int aus1, int aus2);
void reply(const char *text, int aus1, int aus2);
+ void mousePosDialog(int x, int y);
void shipStart();
void shot(int a, int b);
void takeMoney(int amount);
Commit: 7bf803f6e677b9b8bf29caf55f9c211cfe175c1b
https://github.com/scummvm/scummvm/commit/7bf803f6e677b9b8bf29caf55f9c211cfe175c1b
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:37Z
Commit Message:
SUPERNOVA: Cleanup dialog code
The main change consists in using a separate byte array for the sentence
removal flags, move some functions from the GameManager to the Room class,
and add a few additional functions to manipulate this new array. This
allows to clarify some code related to dialogs.
This change also allows to switch the _shown array back to a bool array.
Changed paths:
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
engines/supernova/rooms.h
engines/supernova/state.cpp
engines/supernova/state.h
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 6f57e28..fcf5744 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -33,6 +33,7 @@ const int kTextSpeed[] = {19, 14, 10, 7, 4};
const int kMsecPerTick = 55;
const int kMaxSection = 40;
+const int kMaxDialog = 2;
const int kMaxObject = 25;
const int kMaxCarry = 30;
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 8c32d5c..eef4d16 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -36,6 +36,8 @@ bool Room::serialize(Common::WriteStream *out) {
out->writeSint32LE(_id);
for (int i = 0; i < kMaxSection; ++i)
out->writeByte(_shown[i]);
+ for (int i = 0; i < kMaxDialog ; ++i)
+ out->writeByte(_sentenceRemoved[i]);
int numObjects = 0;
while ((_objectState[numObjects]._id != INVALIDOBJECT) && (numObjects < kMaxObject))
@@ -60,14 +62,21 @@ bool Room::serialize(Common::WriteStream *out) {
return !out->err();
}
-bool Room::deserialize(Common::ReadStream *in) {
+bool Room::deserialize(Common::ReadStream *in, int version) {
if (in->err())
return false;
in->readSint32LE();
+
for (int i = 0; i < kMaxSection; ++i)
_shown[i] = in->readByte();
+ // Prior to version 3, _sentenceRemoved was part of _shown (the last two values)
+ // But on the other hand dialog was not implemented anyway, so we don't even try to
+ // recover it.
+ for (int i = 0; i < kMaxDialog ; ++i)
+ _sentenceRemoved[i] = version < 3 ? 0 : in->readByte();
+
int numObjects = in->readSint32LE();
for (int i = 0; i < numObjects; ++i) {
_objectState[i]._name = static_cast<StringID>(in->readSint32LE());
@@ -1634,7 +1643,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
else
_gm->reply(kStringArsanoEntrance14, 1, _gm->invertSection(1));
e = 0;
- while ((e < 3) && (_shown[kMaxSection - 1] != 15)) {
+ while ((e < 3) && (!allSentencesRemoved(4, 1))) {
switch (e = _gm->dialog(5, row1, _dialog1, 1)) {
case 0:
_gm->reply(kStringArsanoEntrance15, 1, 1 + 128);
@@ -1921,11 +1930,10 @@ void ArsanoRemaining::animation() {
}
void ArsanoRoger::onEntrance() {
- // This is not a normal shown variable, it's a dialog
- if (_shown[kMaxSection - 2] == 0) {
+ if (!sentenceRemoved(0, 2)) {
_gm->say(kStringArsanoRoger1);
_gm->reply(kStringArsanoRoger2, 2, 2 + 128);
- _shown[kMaxSection - 2] = 1;
+ removeSentence(0, 2);
}
}
@@ -2126,18 +2134,15 @@ bool ArsanoGlider::interact(Action verb, Object &obj1, Object &obj2) {
}
void ArsanoMeetup2::onEntrance() {
- // We don't use the enum because those are dialog status and not "real" _shown
- switch (_shown[kMaxSection - 1]) {
- case 1:
- _gm->shipStart();
- break;
- case 2:
+ if (sentenceRemoved(0, 1)) {
+ if (sentenceRemoved(1, 1))
+ _vm->renderMessage(kStringArsanoMeetup2_2); // All spaceships have left the planet, except one ...
+ else
+ _gm->shipStart();
+ } else if (sentenceRemoved(1, 1))
_vm->renderMessage(kStringArsanoMeetup2_1); // All spaceships have left the planet
- break;
- case 3:
- _vm->renderMessage(kStringArsanoMeetup2_2); // All spaceships have left the planet, except one ...
- }
- _shown[kMaxSection - 1] = 0;
+
+ addAllSentences(1);
}
bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
@@ -2153,7 +2158,7 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderImage(30, 0);
_vm->paletteBrightness();
bool found;
- if (_gm->_rooms[MEETUP2]->isSectionVisible(kMaxSection - 2)) {
+ if (sentenceRemoved(0, 2) || sentenceRemoved(1, 2)) {
_gm->reply(kStringArsanoMeetup2_3, 1, 1 + 128);
found = !_gm->dialog(2, row4, _dialog4, 0);
if (!(found))
@@ -2162,7 +2167,7 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
_gm->reply(kStringArsanoMeetup2_5, 1, 1 + 128);
_gm->reply(kStringArsanoMeetup2_6, 1, 1 + 128);
found = !_gm->dialog(2, row1, _dialog1, 0);
- _gm->_rooms[MEETUP2]->setSectionVisible(kMaxSection - 2, true);
+ removeSentence(0, 2);
}
if (found) {
_gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(3));
@@ -2327,7 +2332,7 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
_gm->reply(kStringArsanoMeetup3_25, 1, 1 + 128);
}
removeSentence(2, 2);
- } while (_shown[kMaxSection - 2] != 15);
+ } while (!allSentencesRemoved(4, 2));
_gm->say(kStringArsanoMeetup3_26);
_gm->reply(kStringArsanoMeetup3_27, 1, 1 + 128);
_gm->reply(kStringArsanoMeetup3_28, 1, 1 + 128);
@@ -2581,7 +2586,7 @@ void AxacussCorridor5::onEntrance() {
bool AxacussCorridor5::handleMoneyDialog() {
if (_gm->dialog(2, _rows, _dialog2, 0) == 0) {
_gm->reply(kStringAxacussCorridor5_5, 1, 1 + 128);
- setSectionVisible(kMaxSection - 2, false);
+ addAllSentences(2);
if (_gm->_state._money == 0) {
removeSentence(2, 2);
removeSentence(3, 2);
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 47249f0..b9dbfd1 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -38,6 +38,8 @@ public:
_seen = false;
for (int i = 0; i < kMaxSection; ++i)
_shown[i] = kShownFalse;
+ for (int i = 0; i < kMaxDialog; ++i)
+ _sentenceRemoved[i] = 0;
}
bool hasSeen() {
@@ -64,18 +66,32 @@ public:
void removeSentence(int sentence, int number) {
if (number > 0)
- _shown[kMaxSection - number] |= (1 << sentence);
+ _sentenceRemoved[number - 1] |= (1 << sentence);
}
void addSentence(int sentence, int number) {
if (number > 0)
- _shown[kMaxSection - number] &= ~(1 << sentence);
+ _sentenceRemoved[number - 1] &= ~(1 << sentence);
}
- bool sentencedRemoved(int sentence, int number) {
+ void addAllSentences(int number) {
+ if (number > 0)
+ _sentenceRemoved[number - 1] = 0;
+ }
+
+ bool sentenceRemoved(int sentence, int number) {
+ if (number <= 0)
+ return false;
+ return (_sentenceRemoved[number - 1] & (1 << sentence));
+ }
+
+ bool allSentencesRemoved(int maxSentence, int number) {
if (number <= 0)
return false;
- return (_shown[kMaxSection - number] & (1 << sentence));
+ for (int i = 0, flag = 1 ; i < maxSentence ; ++i, flag <<= 1)
+ if (!(_sentenceRemoved[number - 1] & flag))
+ return false;
+ return true;
}
Object *getObject(uint index) {
@@ -89,11 +105,12 @@ public:
return false;
}
virtual bool serialize(Common::WriteStream *out);
- virtual bool deserialize(Common::ReadStream *in);
+ virtual bool deserialize(Common::ReadStream *in, int version);
protected:
int _fileNumber;
- byte _shown[kMaxSection];
+ bool _shown[kMaxSection];
+ byte _sentenceRemoved[kMaxDialog];
Object _objectState[kMaxObject];
RoomID _id;
SupernovaEngine *_vm;
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index c289fba..d3ab297 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -75,7 +75,7 @@ bool GameManager::serialize(Common::WriteStream *out) {
}
-bool GameManager::deserialize(Common::ReadStream *in) {
+bool GameManager::deserialize(Common::ReadStream *in, int version) {
if (in->err())
return false;
@@ -115,7 +115,7 @@ bool GameManager::deserialize(Common::ReadStream *in) {
// Rooms
_currentRoom = _rooms[static_cast<RoomID>(in->readByte())];
for (int i = 0; i < NUMROOMS; ++i) {
- _rooms[i]->deserialize(in);
+ _rooms[i]->deserialize(in, version);
}
return !in->err();
@@ -852,7 +852,7 @@ void GameManager::reply(const char *text, int aus1, int aus2) {
int GameManager::dialog(int num, byte rowLength[6], StringID text[6], int number) {
bool remove[6];
for (int i = 0; i < 5; ++i)
- remove[i] = _currentRoom->sentencedRemoved(i, number);
+ remove[i] = _currentRoom->sentenceRemoved(i, number);
// The original does not initialize remove[5]!!!
// Set it to false/0. But maybe the loop above should use 6 instead of 5?
remove[5] = false;
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index c5f5803..8b904d1 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -99,7 +99,7 @@ public:
void processInput();
void executeRoom();
bool serialize(Common::WriteStream *out);
- bool deserialize(Common::ReadStream *in);
+ bool deserialize(Common::ReadStream *in, int version);
SupernovaEngine *_vm;
Common::KeyState _key;
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 65fefea..c693f9e 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -920,7 +920,7 @@ bool SupernovaEngine::loadGame(int slot) {
savefile->skip(6);
setTotalPlayTime(savefile->readUint32LE() * 1000);
Graphics::skipThumbnail(*savefile);
- _gm->deserialize(savefile);
+ _gm->deserialize(savefile, saveVersion);
delete savefile;
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 70df62f..8ba298c 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -43,7 +43,7 @@
namespace Supernova {
#define SAVEGAME_HEADER MKTAG('M','S','N','1')
-#define SAVEGAME_VERSION 2
+#define SAVEGAME_VERSION 3
#define SUPERNOVA_DAT "supernova.dat"
#define SUPERNOVA_DAT_VERSION 1
Commit: bd6cdf4ba22393d254de6b656edf7d33441fa704
https://github.com/scummvm/scummvm/commit/bd6cdf4ba22393d254de6b656edf7d33441fa704
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:37Z
Commit Message:
SUPERNOVA: Handle events during dialogs
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index eef4d16..9c503a8 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -742,10 +742,10 @@ void ShipSleepCabin::animation() {
void ShipSleepCabin::onEntrance() {
if (_gm->_state._dream && (_gm->_rooms[CAVE]->getObject(1)->_exitRoom == MEETUP3)) {
_vm->renderMessage(kStringShipSleepCabin14);
- _gm->mouseWait(_gm->_timer1);
+ _gm->waitOnInput(_gm->_timer1);
_vm->removeMessage();
_vm->renderMessage(kStringShipSleepCabin15);
- _gm->mouseWait(_gm->_timer1);
+ _gm->waitOnInput(_gm->_timer1);
_vm->removeMessage();
_vm->renderMessage(kStringShipSleepCabin16);
_gm->_state._dream = false;
@@ -1710,7 +1710,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage(kStringArsanoEntrance20);
else {
_vm->renderMessage(kStringArsanoEntrance21);
- _gm->mouseWait(_gm->_timer1);
+ _gm->waitOnInput(_gm->_timer1);
_vm->removeMessage();
_vm->renderMessage(kStringArsanoEntrance22);
_gm->takeObject(*getObject(16));
@@ -1757,7 +1757,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
getObject(4)->setProperty(WORN);
getObject(5)->setProperty(WORN);
getObject(6)->setProperty(WORN);
- _gm->mouseWait(_gm->_timer1);
+ _gm->waitOnInput(_gm->_timer1);
_vm->removeMessage();
}
return false;
@@ -2029,7 +2029,7 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
_vm->_menuBrightness = 255;
_vm->paletteBrightness();
_vm->renderMessage(kStringArsanoRoger39);
- _gm->mouseWait(_gm->_timer1);
+ _gm->waitOnInput(_gm->_timer1);
_vm->removeMessage();
_vm->_menuBrightness = 0;
_vm->paletteBrightness();
@@ -2048,7 +2048,7 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
getObject(6)->_click = 7;
_vm->paletteFadeIn();
_vm->renderMessage(kStringArsanoRoger40);
- _gm->mouseWait(_gm->_timer1);
+ _gm->waitOnInput(_gm->_timer1);
_vm->removeMessage();
} else
return false;
@@ -2224,7 +2224,7 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
_gm->wait2(18);
_vm->renderMessage(kStringArsanoMeetup2_12);
_gm->great(0);
- _gm->mouseWait(_gm->_timer1);
+ _gm->waitOnInput(_gm->_timer1);
_vm->removeMessage();
_vm->paletteFadeOut();
g_system->fillScreen(kColorBlack);
@@ -3070,7 +3070,7 @@ bool AxacussElevator::interact(Action verb, Object &obj1, Object &obj2) {
_vm->_menuBrightness = 255;
_vm->paletteBrightness();
_vm->renderMessage(kStringAxacussElevator_3);
- _gm->mouseWait(_gm->_timer1);
+ _gm->waitOnInput(_gm->_timer1);
_vm->removeMessage();
_vm->_menuBrightness = 0;
_vm->paletteBrightness();
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index d3ab297..0b569e4 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -821,7 +821,7 @@ void GameManager::say(const char *text) {
_vm->renderBox(0, 141, 320, numRows * 10 - 1, kColorWhite25);
for (int r = 0; r < numRows; ++r)
_vm->renderText(row[r], 1, 142 + r * 10, kColorDarkGreen);
- mouseWait((t.size() + 20) * _vm->_textSpeed / 10);
+ waitOnInput((t.size() + 20) * _vm->_textSpeed / 10);
_vm->renderBox(0, 138, 320, 62, kColorBlack);
}
@@ -837,12 +837,12 @@ void GameManager::reply(const char *text, int aus1, int aus2) {
for (int z = (strlen(text) + 20) * _vm->_textSpeed / 40; z > 0; --z) {
drawImage(aus1);
- mouseWait(2);
- if (_keyPressed) // ?? origin: key != -1, need to check what mouseWait does...
+ waitOnInput(2);
+ if (_keyPressed || _mouseClicked)
z = 1;
drawImage(aus2);
- mouseWait(2);
- if (_keyPressed)
+ waitOnInput(2);
+ if (_keyPressed || _mouseClicked)
z = 1;
}
if (*text != '|')
@@ -876,10 +876,12 @@ int GameManager::dialog(int num, byte rowLength[6], StringID text[6], int number
rq += rowLength[i];
}
+ _guiEnabled = false;
_currentSentence = -1;
do {
mouseInput3();
- } while (_currentSentence == -1);
+ } while (_currentSentence == -1 && !_vm->shouldQuit());
+ _guiEnabled = true;
_vm->renderBox(0, 138, 320, 62, kColorBlack);
@@ -1012,33 +1014,33 @@ uint16 GameManager::getKeyInput(bool blockForPrintChar) {
}
Common::EventType GameManager::getMouseInput() {
- while (true) {
+ while (!_vm->shouldQuit()) {
_vm->updateEvents();
- if (_mouseClicked) {
+ if (_mouseClicked)
return _mouseClickType;
- }
g_system->updateScreen();
g_system->delayMillis(_vm->_delay);
}
+ return Common::EVENT_INVALID;
}
void GameManager::getInput() {
while (true) {
_vm->updateEvents();
- if (_mouseClicked || _keyPressed) {
+ if (_mouseClicked || _keyPressed)
break;
- }
g_system->updateScreen();
g_system->delayMillis(_vm->_delay);
}
}
-// TODO: Unify mouseInput3 and mouseWait with getMouseInput
void GameManager::mouseInput3() {
- // STUB
-}
-void GameManager::mouseWait(int delay) {
- // STUB
+ do {
+ _vm->updateEvents();
+ mousePosDialog(_mouseX, _mouseY);
+ g_system->updateScreen();
+ g_system->delayMillis(_vm->_delay);
+ } while (!_mouseClicked && !_vm->shouldQuit());
}
void GameManager::roomBrightness() {
@@ -1086,7 +1088,16 @@ void GameManager::wait2(int ticks) {
g_system->delayMillis(_vm->_delay);
_vm->updateEvents();
g_system->updateScreen();
- } while (_state._time < end);
+ } while (_state._time < end && !_vm->shouldQuit());
+}
+
+void GameManager::waitOnInput(int ticks) {
+ int32 end = _state._time + ticksToMsec(ticks);
+ do {
+ g_system->delayMillis(_vm->_delay);
+ _vm->updateEvents();
+ g_system->updateScreen();
+ } while (_state._time < end && !_vm->shouldQuit() && !_keyPressed && !_mouseClicked);
}
bool GameManager::waitOnInput(int ticks, Common::KeyCode &keycode) {
@@ -1102,7 +1113,7 @@ bool GameManager::waitOnInput(int ticks, Common::KeyCode &keycode) {
return true;
} else if (_mouseClicked)
return true;
- } while (_state._time < end);
+ } while (_state._time < end && !_vm->shouldQuit());
return false;
}
@@ -1440,10 +1451,10 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
}
} else if ((verb == ACTION_LOOK) && (obj1._id == NEWSPAPER)) {
_vm->renderMessage(kStringGenericInteract_10);
- mouseWait(_timer1);
+ waitOnInput(_timer1);
_vm->removeMessage();
_vm->renderMessage(kStringGenericInteract_11);
- mouseWait(_timer1);
+ waitOnInput(_timer1);
_vm->removeMessage();
_vm->renderImage(2, 0);
_vm->setColor63(40);
@@ -1648,7 +1659,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage(kStringGenericInteract_30);
else if ((verb == ACTION_LOOK) && (obj1._id == BOOK2)) {
_vm->renderMessage(kStringGenericInteract_31);
- mouseWait(_timer1);
+ waitOnInput(_timer1);
_vm->removeMessage();
_vm->renderMessage(kStringGenericInteract_32);
} else {
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 8b904d1..b67622e 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -154,8 +154,8 @@ public:
uint16 getKeyInput(bool blockForPrintChar = false);
void getInput();
void mouseInput3();
- void mouseWait(int delay);
void wait2(int ticks);
+ void waitOnInput(int ticks);
bool waitOnInput(int ticks, Common::KeyCode &keycode);
void turnOff();
void turnOn();
Commit: 7c40e38d7c59873c804123a71a0fe124f62f1cbd
https://github.com/scummvm/scummvm/commit/7c40e38d7c59873c804123a71a0fe124f62f1cbd
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:37Z
Commit Message:
SUPERNOVA: Fix recursive infinite loop in door closing animation in ArsanoEntrance
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 9c503a8..1ab4c3a 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -1544,6 +1544,7 @@ bool ArsanoMeetup::interact(Action verb, Object &obj1, Object &obj2) {
void ArsanoEntrance::animation() {
if (!_vm->_messageDisplayed && isSectionVisible(kMaxSection - 5)) {
+ _gm->animationOff(); // to avoid recursive call
_vm->playSound(kAudioDoorSound);
_gm->drawImage(8);
setSectionVisible(9, false);
@@ -1560,6 +1561,7 @@ void ArsanoEntrance::animation() {
_gm->drawImage(_gm->invertSection(5));
getObject(11)->_click = 255;
setSectionVisible(kMaxSection - 5, false);
+ _gm->animationOn();
}
if (isSectionVisible(2)) {
_gm->drawImage(_gm->invertSection(2));
Commit: 5362f3bc26ef995613c924294009e18dfca17794
https://github.com/scummvm/scummvm/commit/5362f3bc26ef995613c924294009e18dfca17794
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:37Z
Commit Message:
SUPERNOVA: Improve English translation
Changed paths:
devtools/create_supernova/strings-en.po
diff --git a/devtools/create_supernova/strings-en.po b/devtools/create_supernova/strings-en.po
index 090d211..55e2efb 100644
--- a/devtools/create_supernova/strings-en.po
+++ b/devtools/create_supernova/strings-en.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Mission Supernova 1.0\n"
"Report-Msgid-Bugs-To: scummvm-devel at lists.scummvm.org\n"
"POT-Creation-Date: 2017-07-22 19:53+0100\n"
-"PO-Revision-Date: 2017-11-01 00:16+0000\n"
+"PO-Revision-Date: 2017-11-05 01:01+0000\n"
"Last-Translator: Thierry Crozat <criezy at scummvm.org>\n"
"Language-Team: none\n"
"Language: en\n"
@@ -1485,7 +1485,7 @@ msgstr "You're now back in a lavatory,|for the first time in seven years!"
msgid ""
"In einem der Schlieáfcher,|die sich auch im Raum befinden,|findest du "
"einige Mnzen."
-msgstr "In one of the lockers in this room,|you will find some coins."
+msgstr "You find some coins in one of|the lockers in this room."
#: ../../msn/msn_r2.c:332
msgid "Mach doch zuerst das Fach leer!"
Commit: 5dd3bea723b61e83e375e7c503c1f95a8f6fbee0
https://github.com/scummvm/scummvm/commit/5dd3bea723b61e83e375e7c503c1f95a8f6fbee0
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:37Z
Commit Message:
SUPERNOVA: Fix incorrect German string
Changed paths:
devtools/create_supernova/gametext.h
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index 077d75d..a35e398 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -726,7 +726,7 @@ const char *gameText[] = {
"Du hast es doch schon ge\224ffnet.", // kStringGenericInteract_3
"In dem Ei ist eine Tablette|in einer Plastikh\201lle.", // kStringGenericInteract_4
// 575
- "Du i\341t die Tablette und merkst,|da\341 sich irgendetwas ver\216ndert hat.", // kStringGenericInteract_5
+ "Du i\341t die Tablette und merkst,|da\341 sich irgendetwas ver\204ndert hat.", // kStringGenericInteract_5
"Komisch! Auf einmal kannst du die Schrift lesen!|Darauf steht:\"Wenn Sie diese Schrift jetzt|lesen k\224nnen, hat die Tablette gewirkt.\"", // kStringGenericInteract_6
"Das mu\341t du erst nehmen.", // kStringGenericInteract_7
"Sie ist leer.", // kStringGenericInteract_8
Commit: 5b76bbb016a4e24f72e895b96c3c6ce2c4615b1f
https://github.com/scummvm/scummvm/commit/5b76bbb016a4e24f72e895b96c3c6ce2c4615b1f
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:37Z
Commit Message:
SUPERNOVA: Fix graphics glitches
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 0b569e4..995f390 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -622,8 +622,8 @@ void GameManager::drawImage(int section) {
section -= 128;
}
+ _currentRoom->setSectionVisible(section, sectionVisible);
do {
- _currentRoom->setSectionVisible(section, sectionVisible);
if (sectionVisible)
_vm->renderImage(_currentRoom->getFileNumber(), section);
else
Commit: 73278c3f9f0157e1adf19134eceeb65eec3e37eb
https://github.com/scummvm/scummvm/commit/73278c3f9f0157e1adf19134eceeb65eec3e37eb
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:37Z
Commit Message:
SUPERNOVA: Replace a class variable used in a single function by a local variable
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index c693f9e..6dda565 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -104,7 +104,6 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)
, _brightness(255)
, _menuBrightness(255)
, _imageIndex(0)
- , _sectionIndex(0)
, _delay(33)
, _textSpeed(kTextSpeed[2])
, _screenWidth(320)
@@ -391,10 +390,13 @@ void SupernovaEngine::playSoundMod(int filenumber)
}
void SupernovaEngine::renderImage(MSNImageDecoder &image, int section) {
- _sectionIndex = section;
-
- if (section > 128)
+ // Note: inverting means we are removing the section. So we should get the rect for that
+ // section but draw the background (section 0) instead.
+ bool invert = false;
+ if (section > 128) {
section -= 128;
+ invert = true;
+ }
if (section > image._numSections - 1)
return;
@@ -424,7 +426,7 @@ void SupernovaEngine::renderImage(MSNImageDecoder &image, int section) {
}
uint offset = image._section[section].y1 * image._pitch + image._section[section].x1;
- if (_sectionIndex > 128)
+ if (invert)
section = 0;
_system->copyRectToScreen(static_cast<const byte *>(image._sectionSurfaces[section]->getPixels()) + offset,
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 8ba298c..16c9888 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -108,7 +108,6 @@ public:
Common::String _nullString;
byte _imageIndex;
- byte _sectionIndex;
byte _menuBrightness;
byte _brightness;
uint _timePaused;
Commit: 841e7182f28471ffda0ecd0c692649f58fd3aea8
https://github.com/scummvm/scummvm/commit/841e7182f28471ffda0ecd0c692649f58fd3aea8
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:37Z
Commit Message:
SUPERNOVA: Reduce memory usage to store sections and simplify code
Each section was store dusing the full image size. Now it only uses the
section size, which should reduce considerably the amout of memory used
for each image.
Also when a section has one or more next section, they were all drawn on
the surface for this section, but then they were drawn again on their own
surface. And while this should not cause any issue, this was really
unnecessary (and prevented optimizing the surface size for each section).
So now this is no longer the case and the surface for a section only
contains this section.
Changed paths:
engines/supernova/graphics.cpp
engines/supernova/supernova.cpp
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index 87485e0..ee2bfe8 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -203,12 +203,10 @@ bool MSNImageDecoder::loadSections() {
for (int section = 0; section < _numSections; ++section) {
Graphics::Surface *surface = new Graphics::Surface;
_sectionSurfaces.push_back(surface);
- surface->create(imageWidth,
- imageHeight,
- g_system->getScreenFormat());
- byte *surfacePixels = static_cast<byte *>(surface->getPixels());
if (isNewspaper) {
+ surface->create(imageWidth, imageHeight, g_system->getScreenFormat());
+ byte *surfacePixels = static_cast<byte *>(surface->getPixels());
for (int i = 0; i < imageWidth * imageHeight / 8; ++i) {
*surfacePixels++ = (_encodedImage[i] & 0x80) ? kColorWhite63 : kColorBlack;
*surfacePixels++ = (_encodedImage[i] & 0x40) ? kColorWhite63 : kColorBlack;
@@ -220,24 +218,15 @@ bool MSNImageDecoder::loadSections() {
*surfacePixels++ = (_encodedImage[i] & 0x01) ? kColorWhite63 : kColorBlack;
}
} else {
- uint image = section;
- do {
- uint32 offset = (_section[image].addressHigh << 16) + _section[image].addressLow;
- if (offset == kInvalidAddress || _section[image].x2 == 0) {
- return false;
- }
- int width = _section[image].x2 - _section[image].x1 + 1;
- int height = _section[image].y2 - _section[image].y1 + 1;
- uint32 destAddress = imageWidth * _section[image].y1 + _section[image].x1;
- while (height) {
- Common::copy(_encodedImage + offset, _encodedImage + offset + width, surfacePixels + destAddress);
- offset += width;
- destAddress += imageWidth;
- --height;
- }
-
- image = _section[image].next;
- } while (image != 0);
+ uint32 offset = (_section[section].addressHigh << 16) + _section[section].addressLow;
+ if (offset == kInvalidAddress || _section[section].x2 == 0) {
+ return false;
+ }
+ int width = _section[section].x2 - _section[section].x1 + 1;
+ int height = _section[section].y2 - _section[section].y1 + 1;
+ surface->create(width, height, g_system->getScreenFormat());
+ byte *surfacePixels = static_cast<byte *>(surface->getPixels());
+ Common::copy(_encodedImage + offset, _encodedImage + offset + width * height, surfacePixels);
}
}
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 6dda565..291e18d 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -425,12 +425,14 @@ void SupernovaEngine::renderImage(MSNImageDecoder &image, int section) {
}
}
- uint offset = image._section[section].y1 * image._pitch + image._section[section].x1;
- if (invert)
+ uint offset = 0;
+ if (invert) {
+ offset = image._section[section].y1 * image._pitch + image._section[section].x1;
section = 0;
+ }
_system->copyRectToScreen(static_cast<const byte *>(image._sectionSurfaces[section]->getPixels()) + offset,
- image._pitch,
+ sectionRect.width(),
sectionRect.left, sectionRect.top,
sectionRect.width(), sectionRect.height());
}
Commit: 8f7dcbe4ac77da2d5c6a0d4658ee813a17369944
https://github.com/scummvm/scummvm/commit/8f7dcbe4ac77da2d5c6a0d4658ee813a17369944
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:37Z
Commit Message:
SUPERNOVA: Fix crash when displaying strings larger than the screen
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 291e18d..5bc8787 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -967,16 +967,32 @@ ScreenBufferStack::ScreenBufferStack()
: _last(_buffer) {
}
-void ScreenBufferStack::push(int x, int y, int width, int height, int pitch) {
+void ScreenBufferStack::push(int x, int y, int width, int height) {
if (_last == ARRAYEND(_buffer))
return;
+ Graphics::Surface* screenSurface = g_system->lockScreen();
+
+ if (x < 0) {
+ width += x;
+ x = 0;
+ }
+ if (x + width > screenSurface->w)
+ width = screenSurface->w - x;
+
+ if (y < 0) {
+ height += y;
+ y = 0;
+ }
+ if (y + height > screenSurface->h)
+ height = screenSurface->h - y;
+
_last->_pixels = new byte[width * height];
byte *pixels = _last->_pixels;
- const byte *screen = static_cast<const byte *>(g_system->lockScreen()->getBasePtr(x, y));
+ const byte *screen = static_cast<const byte *>(screenSurface->getBasePtr(x, y));
for (int i = 0; i < height; ++i) {
Common::copy(screen, screen + width, pixels);
- screen += pitch;
+ screen += screenSurface->pitch;
pixels += width;
}
g_system->unlockScreen();
@@ -985,7 +1001,6 @@ void ScreenBufferStack::push(int x, int y, int width, int height, int pitch) {
_last->_y = y;
_last->_width = width;
_last->_height = height;
- _last->_pitch = pitch;
++_last;
}
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 16c9888..b3ab3f4 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -55,7 +55,6 @@ struct ScreenBuffer {
, _y(0)
, _width(0)
, _height(0)
- , _pitch(0)
, _pixels(NULL)
{}
@@ -64,13 +63,12 @@ struct ScreenBuffer {
int _y;
int _width;
int _height;
- int _pitch;
};
class ScreenBufferStack {
public:
ScreenBufferStack();
- void push(int x, int y, int width, int height, int pitch = 320);
+ void push(int x, int y, int width, int height);
void restore();
private:
Commit: a159a193247f3aec2d02dfaa5c1c4f8b28283487
https://github.com/scummvm/scummvm/commit/a159a193247f3aec2d02dfaa5c1c4f8b28283487
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:37Z
Commit Message:
SUPERNOVA: Split English translation on two lines
The string is too long to be displayed on a single line (and the
original German string was already on two lines).
Changed paths:
devtools/create_supernova/strings-en.po
diff --git a/devtools/create_supernova/strings-en.po b/devtools/create_supernova/strings-en.po
index 55e2efb..4159c08 100644
--- a/devtools/create_supernova/strings-en.po
+++ b/devtools/create_supernova/strings-en.po
@@ -1629,7 +1629,7 @@ msgstr "Pssst, not so loud, otherwise|everyone will want an autograph from me."
#: ../../msn/msn_r2.c:730
msgid ""
"Ich habe extra eine Maske auf, damit|ich nicht von jedem angelabert werde."
-msgstr "I have an extra mask on so I don't get yakked on by everyone."
+msgstr "I have an extra mask on so I don't|get yakked on by everyone."
#: ../../msn/msn_r2.c:731
msgid "h ... ach so."
Commit: 3f2c0673e4f23db6b2f74581e26566a715aed0e9
https://github.com/scummvm/scummvm/commit/3f2c0673e4f23db6b2f74581e26566a715aed0e9
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:38Z
Commit Message:
SUPERNOVA: Do not run animations while a text box is displayed
That is also what the original is doing, and this avoid having
graphical glitches.
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 5bc8787..60d3c1c 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -177,7 +177,7 @@ Common::Error SupernovaEngine::run() {
void SupernovaEngine::updateEvents() {
_gm->handleTime();
- if (_gm->_animationEnabled && _gm->_animationTimer == 0)
+ if (_gm->_animationEnabled && !_messageDisplayed && _gm->_animationTimer == 0)
_gm->_currentRoom->animation();
_gm->_mouseClicked = false;
Commit: c8c6eeb974ce48ee6cf3d0c5a79871743fc0c68d
https://github.com/scummvm/scummvm/commit/c8c6eeb974ce48ee6cf3d0c5a79871743fc0c68d
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:38Z
Commit Message:
SUPERNOVA: Fix usage of uninitialized variables
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 995f390..6505181 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -313,6 +313,10 @@ void GameManager::initState() {
_processInput = false;
_guiEnabled = true;
_animationEnabled = true;
+ _mouseClicked = false;
+ _keyPressed = false;
+ _mouseX = -1;
+ _mouseY = -1;
_mouseField = -1;
_inventoryScroll = 0;
_oldTime = 0;
Commit: 54201327f762dd75e184ab260aa20ff4840875a4
https://github.com/scummvm/scummvm/commit/54201327f762dd75e184ab260aa20ff4840875a4
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:38Z
Commit Message:
SUPERNOVA: Fix image rendering when removing image
This is mostly used in talk animations and result in bad artefacts.
The issue was a regression introduced in commit e0f6da0.
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 60d3c1c..fe52f20 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -426,13 +426,15 @@ void SupernovaEngine::renderImage(MSNImageDecoder &image, int section) {
}
uint offset = 0;
+ int pitch = sectionRect.width();
if (invert) {
- offset = image._section[section].y1 * image._pitch + image._section[section].x1;
+ pitch = image._pitch;
+ offset = image._section[section].y1 * pitch + image._section[section].x1;
section = 0;
}
_system->copyRectToScreen(static_cast<const byte *>(image._sectionSurfaces[section]->getPixels()) + offset,
- sectionRect.width(),
+ pitch,
sectionRect.left, sectionRect.top,
sectionRect.width(), sectionRect.height());
}
Commit: 682dfa0e0ce00020ae4cc1f4720d2cd77807e28f
https://github.com/scummvm/scummvm/commit/682dfa0e0ce00020ae4cc1f4720d2cd77807e28f
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:38Z
Commit Message:
SUPERNOVA: Fix two incorrect German strings
Changed paths:
devtools/create_supernova/gametext.h
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index a35e398..b6ba866 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -562,7 +562,7 @@ const char *gameText[] = {
"Ich habe vor zwei Stunden mein Essen|bestellt und immer noch nichts bekommen.", // kStringArsanoRoger7
"Noch mindestens zwei Stunden.", // kStringArsanoRoger8
"Haben Sie keine Idee, womit wir uns|bis dahin die Zeit vertreiben k\224nnen?", // kStringArsanoRoger9
- "Hmm ... im Moment f\201llt mir nichts ein, aber vielleicht|hat der Spieler des Adventures ja eine Idee.", // kStringArsanoRoger10
+ "Hmm ... im Moment f\204llt mir nichts ein, aber vielleicht|hat der Spieler des Adventures ja eine Idee.", // kStringArsanoRoger10
// 440
"Nein, Sie m\201ssen sich irren.|Ich kenne Sie jedenfalls nicht.", // kStringArsanoRoger11
"Aber ihre Kleidung habe ich irgendwo schon mal gesehen.", // kStringArsanoRoger12
@@ -585,7 +585,7 @@ const char *gameText[] = {
"\216h ... kann sein.", // kStringArsanoRoger26
"Aber eins m\201ssen Sie mir erkl\204ren!", // kStringArsanoRoger27
"Wieso sehen Sie mir so verdammt \204hnlich, wenn|Sie nicht von Xenon stammen, wie ich?", // kStringArsanoRoger28
- "Keine Ahnung. Bis jetzt dachte ich immer, Sie w\201ren ein|von Programmierern auf der Erde erfundenes Computersprite.", // kStringArsanoRoger29
+ "Keine Ahnung. Bis jetzt dachte ich immer, Sie w\204ren ein|von Programmierern auf der Erde erfundenes Computersprite.", // kStringArsanoRoger29
"Was? Lachhaft!", // kStringArsanoRoger30
// 460
"Wie erkl\204ren Sie sich dann,|da\341 ich ihnen gegen\201bersitze?", // kStringArsanoRoger31
Commit: eb43b029cce3b83305659b0de689b8f8e9e5194c
https://github.com/scummvm/scummvm/commit/eb43b029cce3b83305659b0de689b8f8e9e5194c
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:38Z
Commit Message:
SUPERNOVA: Improve English translation
Changed paths:
devtools/create_supernova/strings-en.po
diff --git a/devtools/create_supernova/strings-en.po b/devtools/create_supernova/strings-en.po
index 4159c08..d1b8f5d 100644
--- a/devtools/create_supernova/strings-en.po
+++ b/devtools/create_supernova/strings-en.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Mission Supernova 1.0\n"
"Report-Msgid-Bugs-To: scummvm-devel at lists.scummvm.org\n"
"POT-Creation-Date: 2017-07-22 19:53+0100\n"
-"PO-Revision-Date: 2017-11-05 01:01+0000\n"
+"PO-Revision-Date: 2017-11-05 21:18+0000\n"
"Last-Translator: Thierry Crozat <criezy at scummvm.org>\n"
"Language-Team: none\n"
"Language: en\n"
@@ -1624,7 +1624,7 @@ msgstr "Now I know. You are Roger W.!"
#: ../../msn/msn_r2.c:729
msgid "Pssst, nicht so laut, sonst will|gleich jeder ein Autogramm von mir."
-msgstr "Pssst, not so loud, otherwise|everyone will want an autograph from me."
+msgstr "Pssst, not so loud, otherwise everyone|will want an autograph from me."
#: ../../msn/msn_r2.c:730
msgid ""
@@ -1649,7 +1649,7 @@ msgstr "What, part 127 ??"
#: ../../msn/msn_r2.c:735
msgid "Bei uns ist gerade Teil 8 erschienen."
-msgstr "We have just released part 8."
+msgstr "Part 8 has just been released."
#: ../../msn/msn_r2.c:736
msgid "Hmm ... von welchem Planeten sind Sie denn?"
@@ -1667,7 +1667,7 @@ msgstr "Earth? Never heard of it."
msgid ""
"Wahrscheinlich irgendein Kaff, wo Neuerungen|erst hundert Jahre spter "
"hingelangen."
-msgstr "Probably some Dump, where innovations happen|only a century late."
+msgstr "Probably some Dump, where innovations|happen only a century late."
#: ../../msn/msn_r2.c:740
msgid "h ... kann sein."
@@ -1721,7 +1721,7 @@ msgid ""
"Na gut, ich glaube Ihnen. Lassen wir jetzt|dieses Thema, langsam wird es mir "
"zu bunt!"
msgstr ""
-"OK. I believe you. Let's move away from this topic|before it goes too far!"
+"OK. I believe you. Let's move away from|this topic before it goes too far!"
#: ../../msn/msn_r2.c:761
msgid "Eine Partie Schach! Das ist eine gute Idee."
Commit: 30a3ab640ecbfacfe1784a5553bd27814dfcc3bc
https://github.com/scummvm/scummvm/commit/30a3ab640ecbfacfe1784a5553bd27814dfcc3bc
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:38Z
Commit Message:
SUPERNOVA: Improve English translation
Changed paths:
devtools/create_supernova/strings-en.po
diff --git a/devtools/create_supernova/strings-en.po b/devtools/create_supernova/strings-en.po
index d1b8f5d..4bb0107 100644
--- a/devtools/create_supernova/strings-en.po
+++ b/devtools/create_supernova/strings-en.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Mission Supernova 1.0\n"
"Report-Msgid-Bugs-To: scummvm-devel at lists.scummvm.org\n"
"POT-Creation-Date: 2017-07-22 19:53+0100\n"
-"PO-Revision-Date: 2017-11-05 21:18+0000\n"
+"PO-Revision-Date: 2017-11-05 21:23+0000\n"
"Last-Translator: Thierry Crozat <criezy at scummvm.org>\n"
"Language-Team: none\n"
"Language: en\n"
@@ -1596,14 +1596,14 @@ msgstr "At least two more hours."
#: ../../msn/msn_r2.c:722
msgid ""
"Haben Sie keine Idee, womit wir uns|bis dahin die Zeit vertreiben knnen?"
-msgstr "Don't you have an idea|that can help pass the time?"
+msgstr "Don't you have an idea that|can help pass the time?"
#: ../../msn/msn_r2.c:723
msgid ""
"Hmm ... im Moment fllt mir nichts ein, aber vielleicht|hat der Spieler des "
"Adventures ja eine Idee."
msgstr ""
-"Hmm ... at the moment I'm not sure,|but maybe the Adventure Game Player has "
+"Hmm ... at the moment I'm not sure,but maybe|the Adventure Game Player has "
"an idea."
#: ../../msn/msn_r2.c:725
@@ -1698,7 +1698,7 @@ msgstr "What? Ridiculous!"
#: ../../msn/msn_r2.c:745
msgid "Wie erklren Sie sich dann,|daá ich ihnen gegenbersitze?"
-msgstr "How do you explain then|that I am seated opposite you?"
+msgstr "How do you explain then that|I am seated opposite you?"
#: ../../msn/msn_r2.c:746
msgid "Ja, das ist in der Tat seltsam."
Commit: 3270b5137255a0b8f59cbbbfbf8332e210fbf830
https://github.com/scummvm/scummvm/commit/3270b5137255a0b8f59cbbbfbf8332e210fbf830
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:38Z
Commit Message:
SUPERNOVA: Add strings for supernova explosion cutscene
Changed paths:
devtools/create_supernova/gametext.h
engines/supernova/msn_def.h
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index b6ba866..e3e3c12 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -776,6 +776,16 @@ const char *gameText[] = {
// 615
"Das geht nicht.", // kStringGenericInteract_43
"Gespr\204ch beenden", // kStringConversationEnd
+ "Du hast das komische Gef\201hl,|da\341 drau\341en etwas passiert,|und eilst zum Restaurant.", // kStringSupernova1
+ "Da! Die Supernova!", // kStringSupernova2
+ "Zwei Minuten sp\204ter ...", // kStringSupernova3
+ // 620
+ "Hey, was machen Sie in meinem Raumschiff?!", // kStringSupernova4
+ "Geben Sie mir sofort meine Brieftasche wieder!", // kStringSupernova5
+ "Versuchen Sie das ja nicht nochmal!", // kStringSupernova6
+ "Und jetzt raus mit Ihnen!", // kStringSupernova7
+ "Zehn Minuten sp\204ter ...", // kStringSupernova8
+ //625
NULL
};
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index fcf5744..0cca058 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -547,7 +547,9 @@ enum StringID {
kStringGenericInteract_28, kStringGenericInteract_29, kStringGenericInteract_30, kStringGenericInteract_31, kStringGenericInteract_32,
kStringGenericInteract_33, kStringGenericInteract_34, kStringGenericInteract_35, kStringGenericInteract_36, kStringGenericInteract_37,
kStringGenericInteract_38, kStringGenericInteract_39, kStringGenericInteract_40, kStringGenericInteract_41, kStringGenericInteract_42,
- kStringGenericInteract_43, kStringConversationEnd
+ kStringGenericInteract_43, kStringConversationEnd, kStringSupernova1, kStringSupernova2, kStringSupernova3,
+ kStringSupernova4, kStringSupernova5, kStringSupernova6, kStringSupernova7, kStringSupernova8
+ // 625
};
static StringID guiCommands[] = {
Commit: ba4e20b80a416132794238b9cb518a67fc9eb57e
https://github.com/scummvm/scummvm/commit/ba4e20b80a416132794238b9cb518a67fc9eb57e
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:38Z
Commit Message:
SUPERNOVA: Improve English translation
Changed paths:
devtools/create_supernova/strings-en.po
diff --git a/devtools/create_supernova/strings-en.po b/devtools/create_supernova/strings-en.po
index 4bb0107..ff9abe8 100644
--- a/devtools/create_supernova/strings-en.po
+++ b/devtools/create_supernova/strings-en.po
@@ -1562,7 +1562,7 @@ msgstr "Could you recommend a dish for me?"
#: ../../msn/msn_r2.c:691
msgid "Wie lange dauert es denn noch bis zur Supernova?"
-msgstr "How long does it take to reach the Supernova?"
+msgstr "How long do we have before the supernova?"
#: ../../msn/msn_r2.c:692
msgid "Sie kommen mir irgendwie bekannt vor."
@@ -1596,7 +1596,7 @@ msgstr "At least two more hours."
#: ../../msn/msn_r2.c:722
msgid ""
"Haben Sie keine Idee, womit wir uns|bis dahin die Zeit vertreiben knnen?"
-msgstr "Don't you have an idea that|can help pass the time?"
+msgstr "Do you have an idea what we could|do to pass the time?"
#: ../../msn/msn_r2.c:723
msgid ""
Commit: 909818c7301998738f04014fa0cbbf44d7a830c8
https://github.com/scummvm/scummvm/commit/909818c7301998738f04014fa0cbbf44d7a830c8
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:38Z
Commit Message:
SUPERNOVA: Fix combining ObjectType enum values
It was storing the result of bitwise operation on the ObjectType
enum values in a ObjectType variable. But that was incorrect as
the result was not a value from the enum.
Also removing a property was actually adding the property if it
was not present in the value initially.
Changed paths:
engines/supernova/msn_def.h
engines/supernova/state.cpp
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 0cca058..eda835e 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -330,6 +330,7 @@ enum ObjectType {
OCCUPIED = 2048,
CAUGHT = 4096
};
+typedef uint16 ObjectTypes;
enum Action {
ACTION_WALK,
@@ -613,7 +614,7 @@ struct Object {
}
void disableProperty(ObjectType type) {
- _type ^= type;
+ _type &= ~type;
}
bool hasProperty(ObjectType type) const {
@@ -632,7 +633,7 @@ struct Object {
StringID _name;
StringID _description;
ObjectID _id;
- ObjectType _type;
+ ObjectTypes _type;
byte _click;
byte _click2;
byte _section;
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 6505181..11ffd27 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -527,7 +527,7 @@ void GameManager::processInput() {
if (((_mouseField >= 0) && (_mouseField < 256)) ||
((_mouseField >= 512) && (_mouseField < 768))) {
_inputObject[0] = _currentInputObject;
- ObjectType type = _inputObject[0]->_type;
+ ObjectTypes type = _inputObject[0]->_type;
if (type & OPENABLE) {
if (type & OPENED)
_inputVerb = ACTION_CLOSE;
Commit: 8a8a0b9d38024dbcf58047766fc0aef817970f89
https://github.com/scummvm/scummvm/commit/8a8a0b9d38024dbcf58047766fc0aef817970f89
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:38Z
Commit Message:
SUPERNOVA: Implement event callback mechanism and Supernova event
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/state.cpp
engines/supernova/state.h
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 1ab4c3a..419adbc 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2035,12 +2035,10 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
_vm->removeMessage();
_vm->_menuBrightness = 0;
_vm->paletteBrightness();
- _gm->_state._time -= ticksToMsec(125000); // 2 hours
- _gm->_state._timeAlarm -= ticksToMsec(125000);
- _gm->_state._eventTime = _gm->_state._time + ticksToMsec(4000);
- // TODO: implement event calling
-// _gm->_state.event = &supernova;
+ _gm->_state._time += ticksToMsec(125000); // 2 hours
_gm->_state._alarmOn = (_gm->_state._timeAlarm > _gm->_state._time);
+ _gm->_state._eventTime = _gm->_state._time + ticksToMsec(4000);
+ _gm->_state._eventCallback = kSupernovaFn;
setSectionVisible(11, false);
setSectionVisible(1, false);
_vm->renderRoom(*this);
@@ -3126,7 +3124,7 @@ bool AxacussSign::interact(Action verb, Object &obj1, Object &obj2) {
_gm->drawImage(2);
setSectionVisible(1, false);
_gm->_state._eventTime = _gm->_state._time + ticksToMsec(600);
-// *event = &taxi;
+ _gm->_state._eventCallback = kTaxiFn;
return true;
}
return false;
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 11ffd27..3cb941a 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -25,6 +25,7 @@
#include "gui/message.h"
#include "supernova/supernova.h"
#include "supernova/state.h"
+#include "graphics/cursorman.h"
namespace Supernova {
@@ -37,6 +38,7 @@ bool GameManager::serialize(Common::WriteStream *out) {
out->writeSint32LE(_state._timeSleep);
out->writeSint32LE(_state._timeAlarm);
out->writeSint32LE(_state._eventTime);
+ out->writeSint32LE(_state._eventCallback);
out->writeSint32LE(_state._arrivalDaysLeft);
out->writeSint32LE(_state._shipEnergyDaysLeft);
out->writeSint32LE(_state._landingModuleEnergyDaysLeft);
@@ -84,6 +86,10 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
_state._timeSleep = in->readSint32LE();
_state._timeAlarm = in->readSint32LE();
_state._eventTime = in->readSint32LE();
+ if (version >= 4)
+ _state._eventCallback = (EventFunction)in->readSint32LE();
+ else
+ _state._eventCallback = kNoFn;
_state._arrivalDaysLeft = in->readSint32LE();
_state._shipEnergyDaysLeft = in->readSint32LE();
_state._landingModuleEnergyDaysLeft = in->readSint32LE();
@@ -335,6 +341,7 @@ void GameManager::initState() {
_state._timeSleep = 0;
_state._timeAlarm = ticksToMsec(458182); // 7 am
_state._eventTime = 0xffffffff;
+ _state._eventCallback = kNoFn;
_state._arrivalDaysLeft = 2840;
_state._shipEnergyDaysLeft = 2135;
_state._landingModuleEnergyDaysLeft = 923;
@@ -658,7 +665,7 @@ void GameManager::startSearch() {
void GameManager::search(int time) {
_state._eventTime = _state._time + time;
-// *event = &search_start;
+ _state._eventCallback = kSearchStartFn;
}
void GameManager::guardNoticed() {
@@ -709,7 +716,128 @@ void GameManager::busted(int i) {
shot(0, 0);
}
-void GameManager::guardReturned() {
+void GameManager::novaScroll() {
+ static byte planet_f[6] = {0xeb,0xec,0xf0,0xed,0xf1,0xf2};
+ static byte nova_f[13] = {0xea,0xe9,0xf5,0xf3,0xf7,0xf4,0xf6,
+ 0xf9,0xfb,0xfc,0xfd,0xfe,0xfa};
+ static byte rgb[65][3] = {
+ { 5, 0, 0},{10, 0, 0},{15, 0, 0},{20, 0, 0},{25, 0, 0},
+ {30, 0, 0},{35, 0, 0},{40, 0, 0},{45, 0, 0},{50, 0, 0},
+ {55, 0, 0},{60, 0, 0},{63,10, 5},{63,20,10},{63,30,15},
+ {63,40,20},{63,50,25},{63,60,30},{63,63,33},{63,63,30},
+ {63,63,25},{63,63,20},{63,63,15},{63,63,10},{60,60,15},
+ {57,57,20},{53,53,25},{50,50,30},{47,47,35},{43,43,40},
+ {40,40,45},{37,37,50},{33,33,53},{30,30,56},{27,27,59},
+ {23,23,61},{20,20,63},{21,25,63},{22,30,63},{25,35,63},
+ {30,40,63},{35,45,63},{40,50,63},{45,55,63},{50,60,63},
+ {55,63,63},{59,63,63},{63,63,63},{63,60,63},{60,50,60},
+ {55,40,55},{50,30,50},{45,20,45},{40,10,40},{42,15,42},
+ {45,20,45},{47,25,47},{50,30,50},{52,35,52},{55,40,55},
+ {57,45,57},{60,50,60},{62,55,62},{63,60,63},{63,63,63}};
+
+ byte palette[768];
+ _vm->_system->getPaletteManager()->grabPalette(palette, 0, 255);
+
+ for (int t = 0; t < 65; ++t) {
+ for (int i = 0; i < 6; ++i) {
+ int idx = 3 * (planet_f[i] - 1);
+ for (int c = 0 ; c < 3 ; ++c) {
+ if (palette[idx+c] < rgb[t][c])
+ palette[idx+c] = rgb[t][c];
+ }
+ }
+ for (int kreis = 0; kreis < t && kreis < 13; ++kreis) {
+ int idx = 3 * (nova_f[kreis] - 1);
+ for (int c = 0 ; c < 3 ; ++c)
+ palette[idx+c] = rgb[t-kreis-1][c];
+ }
+
+ _vm->_system->getPaletteManager()->setPalette(palette, 0, 255);
+ _vm->_system->updateScreen();
+ _vm->_system->delayMillis(_vm->_delay);
+ }
+}
+
+void GameManager::supernovaEvent() {
+ _vm->removeMessage();
+ CursorMan.showMouse(false);
+ if (_currentRoom->getId() <= CAVE) {
+ _vm->renderMessage(kStringSupernova1);
+ waitOnInput(_timer1);
+ _vm->removeMessage();
+ _vm->paletteFadeOut();
+ changeRoom(MEETUP);
+ _rooms[AIRLOCK]->getObject(0)->disableProperty(OPENED);
+ _rooms[AIRLOCK]->setSectionVisible(3, true);
+ _rooms[AIRLOCK]->getObject(1)->setProperty(OPENED);
+ _rooms[AIRLOCK]->setSectionVisible(17, true);
+ _rooms[AIRLOCK]->setSectionVisible(6, false);
+ _vm->renderRoom(*_currentRoom);
+ _vm->paletteFadeIn();
+ }
+ _vm->renderMessage(kStringSupernova2);
+ waitOnInput(_timer1);
+ _vm->removeMessage();
+ _vm->renderImage(26, 0);
+ _vm->paletteBrightness();
+ novaScroll();
+ _vm->paletteFadeOut();
+ _vm->renderBox(0, 0, 320, 200, kColorBlack);
+ _vm->_menuBrightness = 255;
+ _vm->paletteBrightness();
+
+ if (_currentRoom->getId() == GLIDER) {
+ _vm->renderMessage(kStringSupernova3);
+ waitOnInput(_timer1);
+ _vm->removeMessage();
+ _vm->_menuBrightness = 0;
+ _vm->paletteBrightness();
+ _vm->renderRoom(*_currentRoom);
+ _vm->paletteFadeIn();
+ _vm->renderMessage(kStringSupernova4, kMessageTop);
+ waitOnInput(_timer1);
+ _vm->removeMessage();
+ _vm->renderMessage(kStringSupernova5, kMessageTop);
+ waitOnInput(_timer1);
+ _vm->removeMessage();
+ _vm->renderMessage(kStringSupernova6, kMessageTop);
+ waitOnInput(_timer1);
+ _vm->removeMessage();
+ _vm->renderMessage(kStringSupernova7, kMessageTop);
+ waitOnInput(_timer1);
+ _vm->removeMessage();
+ changeRoom(MEETUP2);
+ _rooms[MEETUP2]->setSectionVisible(1, true);
+ _rooms[MEETUP2]->removeSentence(0, 1);
+ _inventory.remove(*(_rooms[ROGER]->getObject(3)));
+ _inventory.remove(*(_rooms[ROGER]->getObject(7)));
+ _inventory.remove(*(_rooms[ROGER]->getObject(8)));
+ } else {
+ _vm->renderMessage(kStringSupernova8);
+ waitOnInput(_timer1);
+ _vm->removeMessage();
+ _vm->_menuBrightness = 0;
+ _vm->paletteBrightness();
+ changeRoom(MEETUP2);
+ if (_rooms[ROGER]->getObject(3)->hasProperty(CARRIED) && !_rooms[GLIDER]->isSectionVisible(5)) {
+ _rooms[MEETUP2]->setSectionVisible(1, true);
+ _rooms[MEETUP2]->setSectionVisible(12, true);
+ _rooms[MEETUP2]->getObject(1)->_click = 0;
+ _rooms[MEETUP2]->getObject(0)->_click = 1;
+ _rooms[MEETUP2]->removeSentence(0, 1);
+ }
+ _rooms[MEETUP2]->removeSentence(1, 1);
+ _vm->paletteFadeIn();
+ }
+ _rooms[AIRLOCK]->getObject(4)->setProperty(WORN);
+ _rooms[AIRLOCK]->getObject(5)->setProperty(WORN);
+ _rooms[AIRLOCK]->getObject(6)->setProperty(WORN);
+ _rooms[CAVE]->getObject(1)->_exitRoom = MEETUP2;
+ _guiEnabled = true;
+ CursorMan.showMouse(true);
+}
+
+void GameManager::guardReturnedEvent() {
if (_currentRoom->getId() == GUARD)
busted(-1);
else if ((_currentRoom->getId() == CORRIDOR9) && (_currentRoom->isSectionVisible(27)))
@@ -726,7 +854,11 @@ void GameManager::guardReturned() {
_rooms[CORRIDOR9]->getObject(1)->disableProperty(OPENED);
}
-void GameManager::taxi() {
+void GameManager::guardWalkEvent() {
+ // STUBS
+}
+
+void GameManager::taxiEvent() {
if (_currentRoom->getId() == SIGN) {
changeRoom(STATION);
}
@@ -749,6 +881,10 @@ void GameManager::taxi() {
_rooms[SIGN]->setSectionVisible(3, true);
}
+void GameManager::searchStartEvent() {
+ // STUBS
+}
+
void GameManager::outro() {
// title = 2;
_vm->playSoundMod(49);
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index b67622e..352e312 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -29,11 +29,14 @@
namespace Supernova {
+enum EventFunction { kNoFn, kSupernovaFn, kGuardReturnedFn, kGuardWalkFn, kTaxiFn, kSearchStartFn };
+
struct GameState {
int32 _time;
int32 _timeSleep;
int32 _timeAlarm;
int32 _eventTime;
+ EventFunction _eventCallback;
int32 _arrivalDaysLeft;
int32 _shipEnergyDaysLeft;
int32 _landingModuleEnergyDaysLeft;
@@ -199,12 +202,16 @@ public:
void search(int time);
void startSearch();
void guardNoticed();
- void guardReturned();
void busted(int i);
void corridorOnEntrance();
void event(int time);
void telomat(int number);
- void taxi();
+ void novaScroll();
+ void supernovaEvent();
+ void guardReturnedEvent();
+ void guardWalkEvent();
+ void taxiEvent();
+ void searchStartEvent();
void outro();
};
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index fe52f20..fb1e869 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -180,6 +180,32 @@ void SupernovaEngine::updateEvents() {
if (_gm->_animationEnabled && !_messageDisplayed && _gm->_animationTimer == 0)
_gm->_currentRoom->animation();
+ if (_gm->_state._eventCallback != kNoFn && _gm->_state._time >= _gm->_state._eventTime) {
+ _gm->_state._eventTime = 0xffffffff;
+ EventFunction fn = _gm->_state._eventCallback;
+ _gm->_state._eventCallback = kNoFn;
+ switch (fn) {
+ case kNoFn:
+ break;
+ case kSupernovaFn:
+ _gm->supernovaEvent();
+ break;
+ case kGuardReturnedFn:
+ _gm->guardReturnedEvent();
+ break;
+ case kGuardWalkFn:
+ _gm->guardWalkEvent();
+ break;
+ case kTaxiFn:
+ _gm->taxiEvent();
+ break;
+ case kSearchStartFn:
+ _gm->searchStartEvent();
+ break;
+ }
+ return;
+ }
+
_gm->_mouseClicked = false;
_gm->_keyPressed = false;
while (g_system->getEventManager()->pollEvent(_event)) {
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index b3ab3f4..c296c0e 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -43,7 +43,7 @@
namespace Supernova {
#define SAVEGAME_HEADER MKTAG('M','S','N','1')
-#define SAVEGAME_VERSION 3
+#define SAVEGAME_VERSION 4
#define SUPERNOVA_DAT "supernova.dat"
#define SUPERNOVA_DAT_VERSION 1
Commit: af226daf81b90f72f6812c20263ed61024b91e35
https://github.com/scummvm/scummvm/commit/af226daf81b90f72f6812c20263ed61024b91e35
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:38Z
Commit Message:
SUPERNOVA: Fix incorrect delay for message display
The delay was not set, meaning the messages were immediately
removed in some cutscenes.
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index fb1e869..3c75e6e 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -593,7 +593,7 @@ void SupernovaEngine::renderMessage(const char *text, MessagePosition position)
}
_messageDisplayed = true;
-// _timer1 = (Common::strnlen(text, BUFSIZ) + 20) * textspeed / 10;
+ _gm->_timer1 = (Common::strnlen(text, 512) + 20) * _textSpeed / 10;
}
void SupernovaEngine::removeMessage() {
Commit: 575aef711b5bfaeeb21c4ee1f9ad898a88ff7ce4
https://github.com/scummvm/scummvm/commit/575aef711b5bfaeeb21c4ee1f9ad898a88ff7ce4
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:38Z
Commit Message:
SUPERNOVA: Fix updating the palette brightness when the current image has no palette
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 3c75e6e..342709b 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -677,7 +677,7 @@ void SupernovaEngine::paletteBrightness() {
if (_currentImage->getPalette()) {
imagePalette = _currentImage->getPalette();
} else {
- imagePalette = palette;
+ imagePalette = palette + 48;
}
palette[i + 48] = (imagePalette[i] * _brightness) >> 8;
}
Commit: 70e8f36a55c5c8f26c8788ca802c087047ffc051
https://github.com/scummvm/scummvm/commit/70e8f36a55c5c8f26c8788ca802c087047ffc051
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:38Z
Commit Message:
SUPERNOVA: Remove variables and stub functions related to overlay
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 419adbc..1c7b647 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2343,7 +2343,6 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(3)); // Discman
_gm->changeRoom(CELL);
_gm->_newRoom = true;
- _gm->_newOverlay = true;
_gm->_state._dream = true;
} else
return false;
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 3cb941a..b53bb04 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1390,10 +1390,6 @@ void GameManager::edit(Common::String &input, int x, int y, uint length) {
}
}
-void GameManager::loadOverlayStart() {
- // STUB
-}
-
void GameManager::shot(int a, int b) {
if (a)
drawImage(a);
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 352e312..bc44259 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -124,7 +124,6 @@ public:
Object *_inputObject[2];
bool _waitEvent;
bool _newRoom;
- bool _newOverlay;
int32 _oldTime;
int32 _timer1;
int32 _animationTimer;
@@ -172,7 +171,6 @@ public:
void showMenu();
void animationOff();
void animationOn();
- void loadOverlayStart();
void openLocker(const Room *room, Object *obj, Object *lock, int section);
void closeLocker(const Room *room, Object *obj, Object *lock, int section);
void edit(Common::String &input, int x, int y, uint length);
Commit: f40a53473746a78619a92e1a183745dc55ed86fc
https://github.com/scummvm/scummvm/commit/f40a53473746a78619a92e1a183745dc55ed86fc
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:39Z
Commit Message:
SUPERNOVA: Fix room brightness
The incorrect implementation meant than for example when leaving
the cave the room could stay black.
Note that the implementation is still approximative for the HOLD
and LANDINGMODULE rooms.
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index b53bb04..452339c 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1184,15 +1184,12 @@ void GameManager::mouseInput3() {
}
void GameManager::roomBrightness() {
+ _vm->_brightness = 255;
if ((_currentRoom->getId() != OUTSIDE) && (_currentRoom->getId() < ROCKS) ) {
if (_state._powerOff)
_vm->_brightness = 153;
- else
- _vm->_brightness = 255;
} else if (_currentRoom->getId() == CAVE) {
_vm->_brightness = 0;
- } else if (_currentRoom->getId() == MEETUP) {
- _vm->_brightness = 255;
} else if (_currentRoom->getId() == GUARD3) {
if (_state._powerOff)
_vm->_brightness = 0;
Commit: b527b54c6ff8c60d93ca61b60dc63d88344f3e5b
https://github.com/scummvm/scummvm/commit/b527b54c6ff8c60d93ca61b60dc63d88344f3e5b
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:39Z
Commit Message:
SUPERNOVA: Disable loading and saving during execution of event callbacks
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 342709b..d61c75e 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -181,6 +181,8 @@ void SupernovaEngine::updateEvents() {
_gm->_currentRoom->animation();
if (_gm->_state._eventCallback != kNoFn && _gm->_state._time >= _gm->_state._eventTime) {
+ _allowLoadGame = false;
+ _allowSaveGame = false;
_gm->_state._eventTime = 0xffffffff;
EventFunction fn = _gm->_state._eventCallback;
_gm->_state._eventCallback = kNoFn;
@@ -203,6 +205,8 @@ void SupernovaEngine::updateEvents() {
_gm->searchStartEvent();
break;
}
+ _allowLoadGame = true;
+ _allowSaveGame = true;
return;
}
Commit: d3eb662fe2959b4b3a83fa61a4627a64f4f06298
https://github.com/scummvm/scummvm/commit/d3eb662fe2959b4b3a83fa61a4627a64f4f06298
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:39Z
Commit Message:
SUPERNOVA: Fix warning
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 452339c..318516e 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -959,7 +959,7 @@ void GameManager::say(const char *text) {
_vm->renderBox(0, 138, 320, 62, kColorBlack);
_vm->renderBox(0, 141, 320, numRows * 10 - 1, kColorWhite25);
- for (int r = 0; r < numRows; ++r)
+ for (uint r = 0; r < numRows; ++r)
_vm->renderText(row[r], 1, 142 + r * 10, kColorDarkGreen);
waitOnInput((t.size() + 20) * _vm->_textSpeed / 10);
_vm->renderBox(0, 138, 320, 62, kColorBlack);
Commit: 897a1e93a1118f20bcee7327f3cc2b9c375a1847
https://github.com/scummvm/scummvm/commit/897a1e93a1118f20bcee7327f3cc2b9c375a1847
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:39Z
Commit Message:
SUPERNOVA: Display stubs, remove useless function declaration
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 318516e..4dffde5 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -127,9 +127,8 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
return !in->err();
}
-Inventory::Inventory()
- : _numObjects(0)
-{}
+Inventory::Inventory() : _numObjects(0) {
+}
// TODO: Update Inventory surface for scrolling
void Inventory::add(Object &obj) {
@@ -648,12 +647,8 @@ void GameManager::corridorOnEntrance() {
busted(0);
}
-void busted(int i) {
- // STUB
-}
-
void GameManager::telomat(int number) {
- // STUB
+ warning("STUB: telomat %d", number);
}
void GameManager::startSearch() {
@@ -669,7 +664,7 @@ void GameManager::search(int time) {
}
void GameManager::guardNoticed() {
- // STUB
+ warning("STUB: guardNoticed");
}
void GameManager::busted(int i) {
@@ -855,7 +850,7 @@ void GameManager::guardReturnedEvent() {
}
void GameManager::guardWalkEvent() {
- // STUBS
+ warning("STUB: guardWalkEvent");
}
void GameManager::taxiEvent() {
@@ -882,7 +877,7 @@ void GameManager::taxiEvent() {
}
void GameManager::searchStartEvent() {
- // STUBS
+ warning("STUB: searchStartEvent");
}
void GameManager::outro() {
@@ -920,7 +915,7 @@ bool GameManager::airless() {
}
void GameManager::shipStart() {
- // STUB
+ warning("STUB: shipStart");
}
void GameManager::sentence(int number, bool brightness) {
@@ -1199,15 +1194,15 @@ void GameManager::roomBrightness() {
}
void GameManager::loadTime() {
- // STUB
+ warning("STUB: loadTime");
}
void GameManager::saveTime() {
- // STUB
+ warning("STUB: saveTime");
}
bool GameManager::saveGame(int number) {
- // STUB
+ warning("STUB: savegame %d", number);
return false;
}
@@ -1216,7 +1211,7 @@ void GameManager::changeRoom(RoomID id) {
}
void GameManager::errorTemp() {
- // STUB
+ warning("STUB: errorTemp");
}
void GameManager::wait2(int ticks) {
Commit: 529a9c98119ab15a17a43dc8ee65ddf892d3eca2
https://github.com/scummvm/scummvm/commit/529a9c98119ab15a17a43dc8ee65ddf892d3eca2
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:39Z
Commit Message:
SUPERNOVA: Properly handle timer stop/start
Changed paths:
engines/supernova/state.cpp
engines/supernova/state.h
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 4dffde5..bc4eeea 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -325,6 +325,8 @@ void GameManager::initState() {
_mouseField = -1;
_inventoryScroll = 0;
_oldTime = 0;
+ _timerPaused = 0;
+ _timePaused = false;
_timer1 = 0;
_animationTimer = 0;
@@ -1193,14 +1195,6 @@ void GameManager::roomBrightness() {
_vm->paletteBrightness();
}
-void GameManager::loadTime() {
- warning("STUB: loadTime");
-}
-
-void GameManager::saveTime() {
- warning("STUB: saveTime");
-}
-
bool GameManager::saveGame(int number) {
warning("STUB: savegame %d", number);
return false;
@@ -1254,6 +1248,8 @@ void GameManager::setAnimationTimer(int ticks) {
}
void GameManager::handleTime() {
+ if (_timerPaused)
+ return;
int32 delta = g_system->getMillis() - _oldTime;
_state._time += delta;
if (_state._time > 86400000)
@@ -1266,6 +1262,29 @@ void GameManager::handleTime() {
_oldTime = g_system->getMillis();
}
+void GameManager::pauseTimer(bool pause) {
+ if (pause == _timerPaused)
+ return;
+
+ if (pause) {
+ _timerPaused = true;
+ int32 delta = g_system->getMillis() - _oldTime;
+ _timePaused = _state._time + delta;
+ } else {
+ _state._time = _timePaused;
+ _oldTime = g_system->getMillis();
+ _timerPaused = false;
+ }
+}
+
+void GameManager::loadTime() {
+ pauseTimer(false);
+}
+
+void GameManager::saveTime() {
+ pauseTimer(true);
+}
+
void GameManager::screenShake() {
for (int i = 0; i < 12; ++i) {
_vm->_system->setShakePos(8);
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index bc44259..1b993d1 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -125,6 +125,8 @@ public:
bool _waitEvent;
bool _newRoom;
int32 _oldTime;
+ uint _timePaused;
+ bool _timerPaused;
int32 _timer1;
int32 _animationTimer;
int _inventoryScroll;
@@ -162,8 +164,6 @@ public:
void turnOff();
void turnOn();
void screenShake();
- void loadTime();
- void saveTime();
bool saveGame(int number);
void errorTemp();
void roomBrightness();
@@ -184,6 +184,9 @@ public:
void resetInputState();
void handleInput();
void handleTime();
+ void pauseTimer(bool pause);
+ void loadTime();
+ void saveTime();
void setAnimationTimer(int ticks);
void dead(const char *message);
void dead(StringID messageId);
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index d61c75e..aaa898f 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -264,16 +264,7 @@ bool SupernovaEngine::hasFeature(EngineFeature f) const {
void SupernovaEngine::pauseEngineIntern(bool pause) {
_mixer->pauseAll(pause);
- pauseTimer(pause);
-}
-
-void SupernovaEngine::pauseTimer(bool pause) {
- if (pause) {
- _timePaused = _gm->_state._time;
- } else {
- _gm->_state._time = _timePaused;
- _gm->_oldTime = _system->getMillis();
- }
+ _gm->pauseTimer(pause);
}
Common::Error SupernovaEngine::loadGameStrings() {
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index c296c0e..45705a6 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -108,7 +108,6 @@ public:
byte _imageIndex;
byte _menuBrightness;
byte _brightness;
- uint _timePaused;
uint _delay;
bool _messageDisplayed;
int _textSpeed;
@@ -116,7 +115,6 @@ public:
int _textCursorY;
int _textColor;
- void pauseTimer(bool pause);
int textWidth(const char *text);
int textWidth(const uint16 key);
Common::Error loadGameStrings();
Commit: 965b4ca3ded768c7f6f343f134fddbb0f8b19857
https://github.com/scummvm/scummvm/commit/965b4ca3ded768c7f6f343f134fddbb0f8b19857
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:39Z
Commit Message:
SUPERNOVA: Check shouldQuit to break from input loop
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index bc4eeea..08c4f0e 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1162,7 +1162,7 @@ Common::EventType GameManager::getMouseInput() {
}
void GameManager::getInput() {
- while (true) {
+ while (!_vm->shouldQuit()) {
_vm->updateEvents();
if (_mouseClicked || _keyPressed)
break;
Commit: 1566b6cadc2dab70b14724494448b030a0f4f6e0
https://github.com/scummvm/scummvm/commit/1566b6cadc2dab70b14724494448b030a0f4f6e0
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:39Z
Commit Message:
SUPERNOVA: Add string for text speed dialog
Changed paths:
devtools/create_supernova/gametext.h
engines/supernova/msn_def.h
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index e3e3c12..b5d11e8 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -786,6 +786,7 @@ const char *gameText[] = {
"Und jetzt raus mit Ihnen!", // kStringSupernova7
"Zehn Minuten sp\204ter ...", // kStringSupernova8
//625
+ "Textgeschwindigkeit:", // kStringTextSpeed
NULL
};
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index eda835e..19a4417 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -549,8 +549,9 @@ enum StringID {
kStringGenericInteract_33, kStringGenericInteract_34, kStringGenericInteract_35, kStringGenericInteract_36, kStringGenericInteract_37,
kStringGenericInteract_38, kStringGenericInteract_39, kStringGenericInteract_40, kStringGenericInteract_41, kStringGenericInteract_42,
kStringGenericInteract_43, kStringConversationEnd, kStringSupernova1, kStringSupernova2, kStringSupernova3,
- kStringSupernova4, kStringSupernova5, kStringSupernova6, kStringSupernova7, kStringSupernova8
+ kStringSupernova4, kStringSupernova5, kStringSupernova6, kStringSupernova7, kStringSupernova8,
// 625
+ kStringTextSpeed
};
static StringID guiCommands[] = {
Commit: 7eb5924f65debd86f4f336db5ea7bd56f2fc72f4
https://github.com/scummvm/scummvm/commit/7eb5924f65debd86f4f336db5ea7bd56f2fc72f4
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:39Z
Commit Message:
SUPERNOVA: Implement text speed dialog
The text speed is also saved in the scummvm.ini file so that
it persists between runs.
Changed paths:
engines/supernova/state.cpp
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 08c4f0e..7886225 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -463,7 +463,7 @@ void GameManager::processInput(Common::KeyState &state) {
// show game info
break;
case Common::KEYCODE_F4:
- // set text speed
+ _vm->setTextSpeed();
break;
case Common::KEYCODE_F5:
// load/save
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index aaa898f..c0b9216 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -115,6 +115,9 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)
// const Common::FSNode gameDataDir(ConfMan.get("path"));
// SearchMan.addSubDirectoryMatching(gameDataDir, "sound");
+ if (ConfMan.hasKey("textspeed"))
+ _textSpeed = ConfMan.getInt("textspeed");
+
// setup engine specific debug channels
DebugMan.addDebugChannel(kDebugGeneral, "general", "Supernova general debug channel");
@@ -712,6 +715,60 @@ void SupernovaEngine::setColor63(byte value) {
_system->getPaletteManager()->setPalette(color, 63, 1);
}
+void SupernovaEngine::setTextSpeed() {
+ const Common::String& textSpeedString = getGameString(kStringTextSpeed);
+ int stringWidth = textWidth(textSpeedString);
+ int textX = (320 - stringWidth) / 2;
+ int textY = 100;
+ stringWidth += 4;
+ int boxX = stringWidth > 110 ? (320 - stringWidth) / 2 : 105;
+ int boxY = 97;
+ int boxWidth = stringWidth > 110 ? stringWidth : 110;
+ int boxHeight = 27;
+
+ _gm->animationOff();
+ _gm->saveTime();
+ saveScreen(boxX, boxY, boxWidth, boxHeight);
+
+ renderBox(boxX, boxY, boxWidth, boxHeight, kColorBlue);
+ renderText(textSpeedString, textX, textY, kColorWhite99); // Text speed
+
+ // Find the closest index in kTextSpeed for the current _textSpeed.
+ // Important note: values in kTextSpeed decrease with the index.
+ int speedIndex = 0;
+ while (speedIndex < 4 && _textSpeed < (kTextSpeed[speedIndex] + kTextSpeed[speedIndex+1]) / 2)
+ ++speedIndex;
+
+ char nbString[2];
+ nbString[1] = 0;
+ for (int i = 0; i < 5; ++i) {
+ byte color = i == speedIndex ? kColorWhite63 : kColorWhite35;
+ renderBox(110 + 21 * i, 111, 16, 10, color);
+
+ nbString[0] = '1' + i;
+ renderText(nbString, 115 + 21 * i, 112, kColorWhite99);
+ }
+ do {
+ _gm->getInput();
+ int key = _gm->_keyPressed ? _gm->_key.keycode : Common::KEYCODE_INVALID;
+ if (!_gm->_keyPressed && _gm->_mouseClicked && _gm->_mouseY >= 111 && _gm->_mouseY < 121 && (_gm->_mouseX + 16) % 21 < 16)
+ key = Common::KEYCODE_0 - 5 + (_gm->_mouseX + 16) / 21;
+ if (key == Common::KEYCODE_ESCAPE)
+ break;
+ else if (key >= Common::KEYCODE_1 && key <= Common::KEYCODE_5) {
+ speedIndex = key - Common::KEYCODE_1;
+ _textSpeed = kTextSpeed[speedIndex];
+ ConfMan.setInt("textspeed", _textSpeed);
+ break;
+ }
+ } while (!shouldQuit());
+ _gm->resetInputState();
+
+ restoreScreen();
+ _gm->loadTime();
+ _gm->animationOn();
+}
+
Common::MemoryReadStream *SupernovaEngine::convertToMod(const char *filename, int version) {
// MSN format
struct {
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 45705a6..8606600 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -143,6 +143,7 @@ public:
void command_print();
bool loadGame(int slot);
bool saveGame(int slot, const Common::String &description);
+ void setTextSpeed();
const Common::String &getGameString(int idx) const {
if (idx < 0 || idx >= (int)_gameStrings.size())
Commit: eed616a4aa43d4c128b2dd21371b50a942dad755
https://github.com/scummvm/scummvm/commit/eed616a4aa43d4c128b2dd21371b50a942dad755
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:39Z
Commit Message:
SUPERNOVA: Fix bug in GUARD room definition
Changed paths:
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index b9dbfd1..f4cb4a3 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -1162,13 +1162,12 @@ public:
_id = GUARD;
_shown[0] = kShownTrue;
- _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,CORRIDOR4,21);
- _objectState[1] = Object(_id, kStringCorridor,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR7,5);
- _objectState[2] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE,1,1,6,CORRIDOR9,3);
- // Originally GUARD was ObjectID..
- _objectState[3] = Object(_id, kStringAxacussan,kStringAxacussanDescription,INSTRUMENTS,TALK,0,0,0);
- _objectState[4] = Object(_id, kStringImage,kStringImageDescription2,NULLOBJECT,NULLTYPE,2,2,0);
- _objectState[5] = Object(_id, kStringMastercard,kStringMastercardDescription,MASTERKEYCARD,TAKE|COMBINABLE,255,255,1);
+ _objectState[0] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, CORRIDOR4, 21);
+ _objectState[1] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 3, 3, 0, CORRIDOR7, 5);
+ _objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 6, CORRIDOR9, 3);
+ _objectState[3] = Object(_id, kStringAxacussan, kStringAxacussanDescription, GUARDIAN, TALK, 0, 0, 0);
+ _objectState[4] = Object(_id, kStringImage, kStringImageDescription2, NULLOBJECT, NULLTYPE, 2, 2, 0);
+ _objectState[5] = Object(_id, kStringMastercard, kStringMastercardDescription, MASTERKEYCARD, TAKE | COMBINABLE, 255, 255, 1);
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
Commit: d1d1d988b08ba19f4daa095eff6ee64ef9c19c77
https://github.com/scummvm/scummvm/commit/d1d1d988b08ba19f4daa095eff6ee64ef9c19c77
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:39Z
Commit Message:
SUPERNOVA: Add interaction logic for AxacussIntersection
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 1c7b647..8c0cbd6 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2831,8 +2831,32 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
}
bool AxacussIntersection::interact(Action verb, Object &obj1, Object &obj2) {
- // STUB
- return false;
+ if (((verb == ACTION_WALK) || (verb == ACTION_OPEN)) && (obj1._id == DOOR) && !isSectionVisible(1))
+ _gm->guardShot();
+ else if ((verb == ACTION_OPEN) && (obj1._id == DOOR) && !obj1.hasProperty(OPENED)) {
+ _gm->_rooms[CORRIDOR9]->setSectionVisible(27, true);
+ _gm->_rooms[CORRIDOR9]->setSectionVisible(28, false);
+ _gm->_rooms[CORRIDOR9]->getObject(1)->setProperty(OPENED);
+ return false;
+ } else if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) && obj1.hasProperty(OPENED)) {
+ _gm->_rooms[CORRIDOR9]->setSectionVisible(27, false);
+ _gm->_rooms[CORRIDOR9]->setSectionVisible(28, true);
+ _gm->_rooms[CORRIDOR9]->getObject(1)->disableProperty(OPENED);
+ return false;
+ } else if ((verb == ACTION_TALK) && (obj1._id == GUARDIAN)) {
+ // FIXME: refactor _rowsX and _dialogsX
+ // _gm->dialog(3, &rowsx, &_dialogsX, 0);
+ _gm->guardShot();
+ } else if ((verb == ACTION_TAKE) && (obj1._id == MASTERKEYCARD)) {
+ _gm->great(0);
+ setSectionVisible(7, false);
+ return false;
+ } else if ((verb == ACTION_USE) && (Object::combine(obj1, obj2, MAGNET, GUARDIAN) || Object::combine(obj1, obj2, KNIFE, GUARDIAN)))
+ _vm->renderMessage(kStringArsanoEntrance27);
+ else
+ return false;
+
+ return true;
}
bool AxacussExit::interact(Action verb, Object &obj1, Object &obj2) {
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 7886225..4c697c8 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1930,4 +1930,22 @@ void GameManager::executeRoom() {
_currentRoom->onEntrance();
}
+void GameManager::guardShot() {
+ drawImage(2);
+ drawImage(5);
+ wait2(3);
+ drawImage(2);
+
+ _vm->playSound(kAudioVoiceHalt);
+ while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
+ wait2(1);
+
+ drawImage(5);
+ wait2(5);
+ drawImage(3);
+ wait2(3);
+
+ shot(4, 3);
+}
+
}
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 1b993d1..30bb7eb 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -214,6 +214,7 @@ public:
void taxiEvent();
void searchStartEvent();
void outro();
+ void guardShot();
};
}
Commit: d189820ce3c01060f1cf834d269f815e4198516b
https://github.com/scummvm/scummvm/commit/d189820ce3c01060f1cf834d269f815e4198516b
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:39Z
Commit Message:
SUPERNOVA: Implement AxacussExit interaction logic
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 8c0cbd6..7bae002 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2860,8 +2860,33 @@ bool AxacussIntersection::interact(Action verb, Object &obj1, Object &obj2) {
}
bool AxacussExit::interact(Action verb, Object &obj1, Object &obj2) {
- // STUB
- return false;
+ if (((verb == ACTION_WALK) || (verb == ACTION_OPEN)) && (obj1._id == DOOR) && !_gm->_state._powerOff)
+ _gm->guard3Shot();
+ else if ((verb == ACTION_TALK) && (obj1._id == GUARDIAN)) {
+ // FIXME: refactor _rowsX and _dialogsX
+ // _gm->dialog(3, &_rowsX, &_dialogsX,0);
+ _gm->guard3Shot();
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LAMP, MAGNET)) {
+ _gm->_inventory.remove(*_gm->_rooms[CELL]->getObject(7));
+ for (int i = 4; i <= 11; i++) {
+ _gm->drawImage(i);
+ if (i == 11)
+ _vm->playSound(kAudioUndef2); // 046/4020
+ _gm->wait2(1);
+ _gm->drawImage(i + 128);
+ }
+ _gm->_state._powerOff = true;
+ _gm->_currentRoom->getObject(5)->_click = 255;
+
+ _gm->search(450);
+ _gm->roomBrightness();
+ _vm->paletteBrightness();
+ } else if ((verb == ACTION_USE) && (Object::combine(obj1,obj2,MAGNET,GUARDIAN) || Object::combine(obj1,obj2,KNIFE,GUARDIAN)))
+ _vm->renderMessage(kStringArsanoEntrance27);
+ else
+ return false;
+
+ return true;
}
bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 4c697c8..27ad9da 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1948,4 +1948,17 @@ void GameManager::guardShot() {
shot(4, 3);
}
+void GameManager::guard3Shot() {
+ drawImage(1);
+ wait2(3);
+ _vm->playSound(kAudioVoiceHalt); // 46/0
+ while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
+ wait2(1);
+
+ wait2(5);
+ drawImage(2);
+ wait2(3);
+ shot(3,2);
+}
+
}
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 30bb7eb..91a066e 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -167,7 +167,6 @@ public:
bool saveGame(int number);
void errorTemp();
void roomBrightness();
- void palette();
void showMenu();
void animationOff();
void animationOn();
@@ -215,6 +214,7 @@ public:
void searchStartEvent();
void outro();
void guardShot();
+ void guard3Shot();
};
}
Commit: d8e221e206981ed0b9c9f383fd1dacfc86063ea3
https://github.com/scummvm/scummvm/commit/d8e221e206981ed0b9c9f383fd1dacfc86063ea3
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:39Z
Commit Message:
SUPERNOVA: Fix bug in AxacussExit
Changed paths:
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index f4cb4a3..2607abd 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -1187,8 +1187,7 @@ public:
_objectState[2] = Object(_id, kStringDoor,kStringDefaultDescription,NULLOBJECT,EXIT|OPENABLE|CLOSED,1,1,0,NULLROOM,15);
_objectState[3] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE,2,2,11,OFFICE_L,0);
_objectState[4] = Object(_id, kStringLamp2,kStringDefaultDescription,LAMP,COMBINABLE,3,3,0);
- // Originally GUARD was ObjectID..
- _objectState[5] = Object(_id, kStringAxacussan,kStringDefaultDescription,INSTRUMENTS,TALK,5,5,0);
+ _objectState[5] = Object(_id, kStringAxacussan,kStringDefaultDescription,GUARDIAN,TALK,5,5,0);
_objectState[6] = Object(_id, kStringImage,kStringGenericDescription5,NULLOBJECT,NULLTYPE,4,4,0);
}
Commit: 45595b9683b9d8ba88bf94d2ba8aaa931551865c
https://github.com/scummvm/scummvm/commit/45595b9683b9d8ba88bf94d2ba8aaa931551865c
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:40Z
Commit Message:
SUPERNOVA: enable general dialogs in AxacussIntersection and AxacussExit
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/rooms.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 7bae002..b598b0d 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2250,8 +2250,6 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
byte row2[6] = {1, 1, 1, 1, 0, 0};
byte row3[6] = {1, 1, 0, 0, 0, 0};
-
- // TODO: Hack, to be move away and renamed when the other uses are found
byte rowsX[6] = {1, 1, 1, 0, 0, 0};
if ((verb == ACTION_WALK) && (obj1._id == STAR))
@@ -2831,6 +2829,8 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
}
bool AxacussIntersection::interact(Action verb, Object &obj1, Object &obj2) {
+ byte rowsX[6] = {1, 1, 1, 0, 0, 0};
+
if (((verb == ACTION_WALK) || (verb == ACTION_OPEN)) && (obj1._id == DOOR) && !isSectionVisible(1))
_gm->guardShot();
else if ((verb == ACTION_OPEN) && (obj1._id == DOOR) && !obj1.hasProperty(OPENED)) {
@@ -2844,8 +2844,7 @@ bool AxacussIntersection::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_rooms[CORRIDOR9]->getObject(1)->disableProperty(OPENED);
return false;
} else if ((verb == ACTION_TALK) && (obj1._id == GUARDIAN)) {
- // FIXME: refactor _rowsX and _dialogsX
- // _gm->dialog(3, &rowsx, &_dialogsX, 0);
+ _gm->dialog(3, rowsX, _dialogsX, 0);
_gm->guardShot();
} else if ((verb == ACTION_TAKE) && (obj1._id == MASTERKEYCARD)) {
_gm->great(0);
@@ -2860,11 +2859,12 @@ bool AxacussIntersection::interact(Action verb, Object &obj1, Object &obj2) {
}
bool AxacussExit::interact(Action verb, Object &obj1, Object &obj2) {
+ byte rowsX[6] = {1, 1, 1, 0, 0, 0};
+
if (((verb == ACTION_WALK) || (verb == ACTION_OPEN)) && (obj1._id == DOOR) && !_gm->_state._powerOff)
_gm->guard3Shot();
else if ((verb == ACTION_TALK) && (obj1._id == GUARDIAN)) {
- // FIXME: refactor _rowsX and _dialogsX
- // _gm->dialog(3, &_rowsX, &_dialogsX,0);
+ _gm->dialog(3, rowsX, _dialogsX,0);
_gm->guard3Shot();
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LAMP, MAGNET)) {
_gm->_inventory.remove(*_gm->_rooms[CELL]->getObject(7));
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 2607abd..164248c 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -836,7 +836,6 @@ public:
_dialog3[0] = kStringDialogArsanoMeetup3_4;
_dialog3[1] = kStringDialogArsanoMeetup3_5;
- // TODO: Hack, to be move away and renamed when the other uses are found
_dialogsX[0] = kStringDialogX1;
_dialogsX[1] = kStringDialogX2;
_dialogsX[2] = kStringDialogX3;
@@ -1168,10 +1167,18 @@ public:
_objectState[3] = Object(_id, kStringAxacussan, kStringAxacussanDescription, GUARDIAN, TALK, 0, 0, 0);
_objectState[4] = Object(_id, kStringImage, kStringImageDescription2, NULLOBJECT, NULLTYPE, 2, 2, 0);
_objectState[5] = Object(_id, kStringMastercard, kStringMastercardDescription, MASTERKEYCARD, TAKE | COMBINABLE, 255, 255, 1);
+
+ _dialogsX[0] = kStringDialogX1;
+ _dialogsX[1] = kStringDialogX2;
+ _dialogsX[2] = kStringDialogX3;
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+ StringID _dialogsX[6];
};
+
class AxacussExit : public Room {
public:
AxacussExit(SupernovaEngine *vm, GameManager *gm) {
@@ -1189,9 +1196,16 @@ public:
_objectState[4] = Object(_id, kStringLamp2,kStringDefaultDescription,LAMP,COMBINABLE,3,3,0);
_objectState[5] = Object(_id, kStringAxacussan,kStringDefaultDescription,GUARDIAN,TALK,5,5,0);
_objectState[6] = Object(_id, kStringImage,kStringGenericDescription5,NULLOBJECT,NULLTYPE,4,4,0);
+
+ _dialogsX[0] = kStringDialogX1;
+ _dialogsX[1] = kStringDialogX2;
+ _dialogsX[2] = kStringDialogX3;
}
virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+ StringID _dialogsX[6];
};
class AxacussOffice1 : public Room {
public:
Commit: b39beb43fd9e9cbbebc0a6bb035ed6cc809f6385
https://github.com/scummvm/scummvm/commit/b39beb43fd9e9cbbebc0a6bb035ed6cc809f6385
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:40Z
Commit Message:
SUPERNOVA: Fix initialization of timer when starting or loading game
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 27ad9da..7291152 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -108,6 +108,8 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
_state._powerOff = in->readByte();
_state._dream = in->readByte();
+ _oldTime = g_system->getMillis();
+
// Inventory
int inventorySize = in->readSint32LE();
_inventoryScroll = in->readSint32LE();
@@ -324,7 +326,7 @@ void GameManager::initState() {
_mouseY = -1;
_mouseField = -1;
_inventoryScroll = 0;
- _oldTime = 0;
+ _oldTime = g_system->getMillis();
_timerPaused = 0;
_timePaused = false;
_timer1 = 0;
@@ -1250,7 +1252,8 @@ void GameManager::setAnimationTimer(int ticks) {
void GameManager::handleTime() {
if (_timerPaused)
return;
- int32 delta = g_system->getMillis() - _oldTime;
+ int32 newTime = g_system->getMillis();
+ int32 delta = newTime - _oldTime;
_state._time += delta;
if (_state._time > 86400000)
_state._time -= 86400000; // 24h wrap around
@@ -1259,7 +1262,7 @@ void GameManager::handleTime() {
else
_animationTimer = 0;
- _oldTime = g_system->getMillis();
+ _oldTime = newTime;
}
void GameManager::pauseTimer(bool pause) {
Commit: 58cfbb532bd5092b3159211713c146c94dacead9
https://github.com/scummvm/scummvm/commit/58cfbb532bd5092b3159211713c146c94dacead9
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:40Z
Commit Message:
SUPERNOVA: Fix room rendering
It could initially access the wrong image to check the number
of section. The code was working fine as long as it had one
section, so there was probably no bad side effect to using
the wrong image (except if it was NULL).
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index c0b9216..66fde28 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -480,11 +480,12 @@ void SupernovaEngine::restoreScreen() {
void SupernovaEngine::renderRoom(Room &room) {
if (room.getFileNumber() != -1) {
+ _currentImage = &(_images[room.getFileNumber()]);
for (int i = 0; i < _currentImage->_numSections; ++i) {
int section = i;
if (room.isSectionVisible(section)) {
do {
- renderImage(room.getFileNumber(), section);
+ renderImage(*_currentImage, section);
section = _currentImage->_section[section].next;
} while (section != 0);
}
Commit: ee905b762a6356a6313aa9c150338991fc0dc6ed
https://github.com/scummvm/scummvm/commit/ee905b762a6356a6313aa9c150338991fc0dc6ed
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:40Z
Commit Message:
SUPERNOVA: Implement shipstart cutscene
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/rooms.h
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index b598b0d..6e3c7f0 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2138,7 +2138,7 @@ void ArsanoMeetup2::onEntrance() {
if (sentenceRemoved(1, 1))
_vm->renderMessage(kStringArsanoMeetup2_2); // All spaceships have left the planet, except one ...
else
- _gm->shipStart();
+ shipStart();
} else if (sentenceRemoved(1, 1))
_vm->renderMessage(kStringArsanoMeetup2_1); // All spaceships have left the planet
@@ -2189,7 +2189,7 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_rooms[MEETUP2]->getObject(1)->_click = 255;
_vm->renderRoom(*this);
_vm->paletteBrightness();
- _gm->shipStart();
+ shipStart();
if (flight) {
_vm->renderImage(13, 0);
_vm->paletteBrightness();
@@ -2247,6 +2247,19 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
return true;
}
+void ArsanoMeetup2::shipStart() {
+ _gm->wait2(12);
+ for (int i = 2; i <= 11; ++i) {
+ if (i >= 9)
+ _gm->drawImage(i - 1 + 128);
+ else
+ setSectionVisible(i - 1, false);
+ _gm->drawImage(i);
+ _gm->wait2(2);
+ }
+ _gm->drawImage(11 + 128);
+}
+
bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
byte row2[6] = {1, 1, 1, 1, 0, 0};
byte row3[6] = {1, 1, 0, 0, 0, 0};
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 164248c..402c4d6 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -805,6 +805,8 @@ public:
virtual void onEntrance();
virtual bool interact(Action verb, Object &obj1, Object &obj2);
+ void shipStart();
+
private:
// TODO: change to 6, fix initialization
StringID _dialog1[2];
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 7291152..7b72e58 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -918,10 +918,6 @@ bool GameManager::airless() {
(_currentRoom->getId() == AIRLOCK && _rooms[AIRLOCK]->getObject(1)->hasProperty(OPENED)));
}
-void GameManager::shipStart() {
- warning("STUB: shipStart");
-}
-
void GameManager::sentence(int number, bool brightness) {
if (number < 0)
return;
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 91a066e..a979d22 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -196,7 +196,6 @@ public:
void reply(StringID textId, int aus1, int aus2);
void reply(const char *text, int aus1, int aus2);
void mousePosDialog(int x, int y);
- void shipStart();
void shot(int a, int b);
void takeMoney(int amount);
void search(int time);
Commit: b11772d9044196666117cb0e8141664e7385b746
https://github.com/scummvm/scummvm/commit/b11772d9044196666117cb0e8141664e7385b746
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:40Z
Commit Message:
SUPERNOVA: Fix logic in rendering code
There were several issues fixed by this commit. The main ones are:
- It was in many places only drawing the first section even for
images that have multiple sections.
- It was in some places using the wrong image.
The first issue has been fixed by removing the GameManager::drawImage
function, and moving its logic to SupernovaEngine::renderImage which
was initially only drawing one section, but was nevertheless called
directly from many place.
The second image required more changes to the rendering code to allow
setting the current image file when it is different from the room file.
This fixes some memory issues and random crashes in places where it was
for example trying to use the image -1. This also fixes the rendering
of the flying cutscene.
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/state.cpp
engines/supernova/state.h
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 6e3c7f0..ba38fd3 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -500,22 +500,22 @@ bool ShipCorridor::interact(Action verb, Object &obj1, Object &obj2) {
if (_objectState[6].hasProperty(OPENED)) {
_vm->playSound(kAudioDoorSound);
_objectState[6].disableProperty(OPENED);
- _gm->drawImage(8);
+ _vm->renderImage(8);
setSectionVisible(9, false);
_gm->wait2(2);
- _gm->drawImage(7);
+ _vm->renderImage(7);
setSectionVisible(8, false);
_gm->wait2(2);
- _gm->drawImage(_gm->invertSection(7));
+ _vm->renderImage(_gm->invertSection(7));
} else {
_vm->playSound(kAudioDoorSound);
_objectState[6].setProperty(OPENED);
- _gm->drawImage(7);
+ _vm->renderImage(7);
_gm->wait2(2);
- _gm->drawImage(8);
+ _vm->renderImage(8);
setSectionVisible(7, false);
_gm->wait2(2);
- _gm->drawImage(9);
+ _vm->renderImage(9);
setSectionVisible(8, false);
}
return true;
@@ -529,21 +529,21 @@ bool ShipHall::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_USE) && Object::combine(obj1,obj2,KEYCARD2,SLEEP_SLOT)) {
if (_objectState[2].hasProperty(OPENED)) {
_objectState[2].disableProperty(OPENED);
- _gm->drawImage(3);
+ _vm->renderImage(3);
setSectionVisible(4, false);
_gm->wait2(2);
- _gm->drawImage(2);
+ _vm->renderImage(2);
setSectionVisible(3, false);
_gm->wait2(2);
- _gm->drawImage(_gm->invertSection(2));
+ _vm->renderImage(_gm->invertSection(2));
} else {
_objectState[2].setProperty(OPENED);
- _gm->drawImage(2);
+ _vm->renderImage(2);
_gm->wait2(2);
- _gm->drawImage(3);
+ _vm->renderImage(3);
setSectionVisible(2, false);
_gm->wait2(2);
- _gm->drawImage(4);
+ _vm->renderImage(4);
setSectionVisible(3, false);
_gm->great(1);
}
@@ -631,8 +631,8 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage(kStringShipSleepCabin11);
} else {
_vm->paletteFadeOut();
- _gm->drawImage(_gm->invertSection(5));
- _gm->drawImage(_gm->invertSection(4));
+ _vm->renderImage(_gm->invertSection(5));
+ _vm->renderImage(_gm->invertSection(4));
room = _gm->_rooms[GENERATOR];
int32 *energyDaysLeft;
if (room->isSectionVisible(9)) {
@@ -655,7 +655,7 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
}
}
if (_gm->_state._timeSleep == _gm->_state._arrivalDaysLeft) {
- _gm->drawImage(3);
+ _vm->renderImage(3);
room = _gm->_rooms[COCKPIT];
room->setSectionVisible(23, true);
room = _gm->_rooms[CABIN_R2];
@@ -715,10 +715,10 @@ void ShipSleepCabin::animation() {
if (_gm->_state._powerOff && _gm->_state._arrivalDaysLeft) {
if (_gm->_guiEnabled) {
if (isSectionVisible(1)) {
- _gm->drawImage(2);
+ _vm->renderImage(2);
setSectionVisible(1, false);
} else {
- _gm->drawImage(1);
+ _vm->renderImage(1);
setSectionVisible(2, false);
}
} else {
@@ -732,9 +732,9 @@ void ShipSleepCabin::animation() {
}
} else if (isSectionVisible(5) && _gm->_guiEnabled) {
if (isSectionVisible(4))
- _gm->drawImage(_gm->invertSection(4));
+ _vm->renderImage(_gm->invertSection(4));
else
- _gm->drawImage(4);
+ _vm->renderImage(4);
}
_gm->setAnimationTimer(6);
@@ -800,10 +800,10 @@ void ShipCockpit::animation() {
_vm->renderText(kStringShipCockpit10, 50, 145, _color);
} else {
if (isSectionVisible(21)) {
- _gm->drawImage(_gm->invertSection(21));
+ _vm->renderImage(_gm->invertSection(21));
_gm->setAnimationTimer(5);
} else {
- _gm->drawImage(21);
+ _vm->renderImage(21);
_gm->setAnimationTimer(10);
}
}
@@ -813,9 +813,9 @@ void ShipCockpit::animation() {
_vm->renderText(kStringShipCockpit12, 97, 175, _color);
} else {
if (isSectionVisible(21))
- _gm->drawImage(22);
+ _vm->renderImage(22);
else
- _gm->drawImage(_gm->invertSection(22));
+ _vm->renderImage(_gm->invertSection(22));
}
}
}
@@ -830,7 +830,7 @@ bool ShipCabinL2::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL1, KEYCARD2)) {
_gm->openLocker(this, getObject(4), getObject(0), 17);
if (getObject(5)->_click == 255)
- _gm->drawImage(20); // Remove Pistol
+ _vm->renderImage(20); // Remove Pistol
_gm->great(2);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL2, KEYCARD2)) {
_gm->openLocker(this, getObject(6), getObject(1), 18);
@@ -838,12 +838,12 @@ bool ShipCabinL2::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL3, KEYCARD2)) {
_gm->openLocker(this, getObject(8), getObject(2), 19);
if (getObject(9)->_click == 255)
- _gm->drawImage(21); // Remove cable spool
+ _vm->renderImage(21); // Remove cable spool
_gm->great(2);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL4, KEYCARD2)) {
_gm->openLocker(this, getObject(10), getObject(3), 22);
if (getObject(11)->_click == 255)
- _gm->drawImage(23); // Remove book
+ _vm->renderImage(23); // Remove book
_gm->great(2);
}
@@ -882,49 +882,49 @@ bool ShipCabinL3::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage(kStringShipCabinL3_1);
else {
if (!getObject(4)->hasProperty(CARRIED))
- _gm->drawImage(_gm->invertSection(8));
+ _vm->renderImage(_gm->invertSection(8));
else
_gm->_inventory.remove(*getObject(4));
- _gm->drawImage(15);
+ _vm->renderImage(15);
getObject(4)->_click = 48;
}
} else if ((verb == ACTION_PRESS) && (obj1._id == TURNTABLE_BUTTON)) {
if (!isSectionVisible(15)) {
_vm->renderMessage(kStringShipCabinL3_2);
} else if (!isSectionVisible(10) && !isSectionVisible(11) && isSectionVisible(12)) {
- _gm->drawImage(14);
+ _vm->renderImage(14);
setSectionVisible(15, false);
for (int i = 3; i; i--) {
_vm->playSound(kAudioTurntable);
while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle)) {
if (isSectionVisible(13)) {
- _gm->drawImage(14);
+ _vm->renderImage(14);
setSectionVisible(13, false);
} else {
- _gm->drawImage(13);
+ _vm->renderImage(13);
setSectionVisible(14, false);
}
_gm->wait2(3);
}
}
}
- _gm->drawImage(15);
+ _vm->renderImage(15);
setSectionVisible(14, false);
setSectionVisible(13, false);
_vm->renderMessage(kStringShipCabinL3_3);
} else if ((verb == ACTION_TAKE) && (obj1._id == RECORD) && (obj1._click != 15)) {
- _gm->drawImage(9);
+ _vm->renderImage(9);
setSectionVisible(13, false);
setSectionVisible(14, false);
setSectionVisible(15, false);
obj1._section = 0;
_gm->takeObject(obj1);
} else if ((verb == ACTION_PULL) && (obj1._id == PLUG)) {
- _gm->drawImage(10);
+ _vm->renderImage(10);
setSectionVisible(7, false);
obj1._click = 21;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, PLUG, SOCKET)) {
- _gm->drawImage(7);
+ _vm->renderImage(7);
setSectionVisible(10, false);
getObject(10)->_click = 20;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, WIRE2))
@@ -932,17 +932,17 @@ bool ShipCabinL3::interact(Action verb, Object &obj1, Object &obj2) {
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, WIRE)) {
r = _gm->_rooms[AIRLOCK];
if (!isSectionVisible(10) && !r->getObject(5)->hasProperty(WORN)) {
- _gm->drawImage(25);
+ _vm->renderImage(25);
_gm->shock();
}
- _gm->drawImage(11);
- _gm->drawImage(26);
+ _vm->renderImage(11);
+ _vm->renderImage(26);
setSectionVisible(12, false);
} else if ((verb == ACTION_TAKE) &&
((obj1._id == WIRE) || (obj1._id == WIRE2) || (obj1._id == PLUG))) {
if (isSectionVisible(10) && isSectionVisible(11)) {
- _gm->drawImage(_gm->invertSection(10));
- _gm->drawImage(_gm->invertSection(11));
+ _vm->renderImage(_gm->invertSection(10));
+ _vm->renderImage(_gm->invertSection(11));
getObject(8)->_name = kStringWireAndPlug;
_gm->takeObject(*getObject(8));
getObject(9)->_click = 255;
@@ -963,15 +963,15 @@ bool ShipCabinR3::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K2, KEYCARD)) {
_gm->openLocker(this, getObject(8), getObject(3), 10);
if (getObject(9)->_click == 255)
- _gm->drawImage(12); // Remove rope
+ _vm->renderImage(12); // Remove rope
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K3, KEYCARD)) {
_gm->openLocker(this, getObject(10), getObject(4), 11);
if (getObject(17)->_click == 255)
- _gm->drawImage(16); // Remove Discman
+ _vm->renderImage(16); // Remove Discman
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K4, KEYCARD)) {
_gm->openLocker(this, getObject(15), getObject(5), 13);
if (getObject(16)->_click == 255)
- _gm->drawImage(14); // Remove Book
+ _vm->renderImage(14); // Remove Book
}
else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF1))
@@ -993,7 +993,7 @@ bool ShipCabinR3::interact(Action verb, Object &obj1, Object &obj2) {
getObject(10)->_click = 34; // Locker empty
obj1._click = 255;
_gm->takeObject(*_gm->_rooms[0]->getObject(3));
- _gm->drawImage(16);
+ _vm->renderImage(16);
} else if ((verb == ACTION_TAKE) && (obj1._id == ROPE) &&
obj1.hasProperty(CARRIED)) {
getObject(8)->_click = 31; // Shelf empty
@@ -1023,84 +1023,84 @@ bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_PRESS) && (obj1._id == BUTTON1)) {
if (!getObject(1)->hasProperty(OPENED)) {
- _gm->drawImage(10);
+ _vm->renderImage(10);
_vm->playSound(kAudioDoorSound);
if (getObject(0)->hasProperty(OPENED)) {
getObject(0)->disableProperty(OPENED);
- _gm->drawImage(1);
+ _vm->renderImage(1);
_gm->wait2(2);
- _gm->drawImage(2);
+ _vm->renderImage(2);
setSectionVisible(1, false);
_gm->wait2(2);
- _gm->drawImage(3);
+ _vm->renderImage(3);
setSectionVisible(2, false);
} else {
getObject(0)->setProperty(OPENED);
- _gm->drawImage(2);
+ _vm->renderImage(2);
setSectionVisible(3, false);
_gm->wait2(2);
- _gm->drawImage(1);
+ _vm->renderImage(1);
setSectionVisible(2, false);
_gm->wait2(2);
- _gm->drawImage(_gm->invertSection(1));
+ _vm->renderImage(_gm->invertSection(1));
}
- _gm->drawImage(_gm->invertSection(10));
+ _vm->renderImage(_gm->invertSection(10));
}
} else if ((verb == ACTION_PRESS) && (obj1._id == BUTTON2)) {
if (!getObject(0)->hasProperty(OPENED)) {
- _gm->drawImage(11);
+ _vm->renderImage(11);
if (getObject(1)->hasProperty(OPENED)) {
_vm->playSound(kAudioDoorSound);
getObject(1)->disableProperty(OPENED);
- _gm->drawImage(4);
+ _vm->renderImage(4);
_gm->wait2(2);
- _gm->drawImage(5);
+ _vm->renderImage(5);
setSectionVisible(4, false);
_gm->wait2(2);
- _gm->drawImage(6);
+ _vm->renderImage(6);
setSectionVisible(5, false);
- _gm->drawImage(16);
+ _vm->renderImage(16);
setSectionVisible(17, false);
_gm->wait2(3);
- _gm->drawImage(15);
+ _vm->renderImage(15);
setSectionVisible(16, false);
_gm->wait2(3);
- _gm->drawImage(14);
+ _vm->renderImage(14);
setSectionVisible(15, false);
_gm->wait2(3);
- _gm->drawImage(13);
+ _vm->renderImage(13);
setSectionVisible(14, false);
_gm->wait2(3);
- _gm->drawImage(12);
+ _vm->renderImage(12);
setSectionVisible(13, false);
_gm->wait2(3);
- _gm->drawImage(_gm->invertSection(12));
+ _vm->renderImage(_gm->invertSection(12));
} else {
getObject(1)->setProperty(OPENED);
- _gm->drawImage(12);
+ _vm->renderImage(12);
_gm->wait2(3);
- _gm->drawImage(13);
+ _vm->renderImage(13);
setSectionVisible(12, false);
_gm->wait2(3);
- _gm->drawImage(14);
+ _vm->renderImage(14);
setSectionVisible(13, false);
_gm->wait2(3);
- _gm->drawImage(15);
+ _vm->renderImage(15);
setSectionVisible(14, false);
_gm->wait2(3);
- _gm->drawImage(16);
+ _vm->renderImage(16);
setSectionVisible(15, false);
_gm->wait2(3);
- _gm->drawImage(17);
+ _vm->renderImage(17);
setSectionVisible(16, false);
_vm->playSound(kAudioDoorSound);
- _gm->drawImage(5);
+ _vm->renderImage(5);
setSectionVisible(6, false);
_gm->wait2(2);
- _gm->drawImage(4);
+ _vm->renderImage(4);
setSectionVisible(5, false);
_gm->wait2(2);
- _gm->drawImage(_gm->invertSection(4));
+ _vm->renderImage(_gm->invertSection(4));
r = _gm->_rooms[AIRLOCK];
if (!r->getObject(4)->hasProperty(WORN) ||
!r->getObject(5)->hasProperty(WORN) ||
@@ -1109,7 +1109,7 @@ bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) {
return true;
}
}
- _gm->drawImage(_gm->invertSection(11));
+ _vm->renderImage(_gm->invertSection(11));
}
} else if ((verb == ACTION_LOOK) && (obj1._id == MANOMETER)) {
if (getObject(1)->hasProperty(OPENED))
@@ -1155,7 +1155,7 @@ bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
if (!_gm->_state._terminalStripConnected)
_vm->renderMessage(kStringCable3);
else {
- _gm->drawImage(5);
+ _vm->renderImage(5);
getObject(0)->_name = kStringWireAndPlug2;
getObject(0)->_click = 10;
room = _gm->_rooms[CABIN_L2];
@@ -1168,8 +1168,8 @@ bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
room->getObject(1)->_click = 13;
room->setSectionVisible(6, true);
room->setSectionVisible(8, true);
- _gm->drawImage(_gm->invertSection(5));
- _gm->drawImage(6);
+ _vm->renderImage(_gm->invertSection(5));
+ _vm->renderImage(6);
setSectionVisible(4, false);
getObject(0)->_click = 11;
} else {
@@ -1197,33 +1197,32 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
if (_gm->_state._landingModuleEnergyDaysLeft) {
r = _gm->_rooms[GENERATOR];
if (isSectionVisible(7)) {
- _gm->drawImage(_gm->invertSection(9));
- _gm->drawImage(_gm->invertSection(2));
- _gm->drawImage(_gm->invertSection(8));
- _gm->drawImage(_gm->invertSection(7));
- _gm->drawImage(_gm->invertSection(10));
+ _vm->renderImage(_gm->invertSection(9));
+ _vm->renderImage(_gm->invertSection(2));
+ _vm->renderImage(_gm->invertSection(8));
+ _vm->renderImage(_gm->invertSection(7));
+ _vm->renderImage(_gm->invertSection(10));
if (r->isSectionVisible(9))
_gm->_state._powerOff = true;
_gm->roomBrightness();
_vm->paletteBrightness();
} else {
- _gm->drawImage(7);
+ _vm->renderImage(7);
if (r->isSectionVisible(9))
_gm->_state._powerOff = false;
-// load("MSN_DATA.025");
_gm->roomBrightness();
_vm->paletteBrightness();
r = _gm->_rooms[SLEEP];
r->setSectionVisible(1, false);
r->setSectionVisible(2, false);
_gm->wait2(2);
- _gm->drawImage(2);
+ _vm->renderImage(2);
_gm->wait2(3);
- _gm->drawImage(8);
+ _vm->renderImage(8);
_gm->wait2(2);
- _gm->drawImage(9);
+ _vm->renderImage(9);
_gm->wait2(1);
- _gm->drawImage(10);
+ _vm->renderImage(10);
}
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, LANDINGMOD_BUTTON))
@@ -1237,19 +1236,19 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
r = _gm->_rooms[CABIN_L3];
_gm->_inventory.remove(*r->getObject(8));
getObject(4)->_name = r->getObject(8)->_name;
- _gm->drawImage(4);
+ _vm->renderImage(4);
if (_gm->_state._cableConnected) {
- _gm->drawImage(5);
+ _vm->renderImage(5);
getObject(4)->_click = 6;
} else {
getObject(4)->_click = 5;
if (_gm->_state._terminalStripWire)
- _gm->drawImage(11);
+ _vm->renderImage(11);
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SPOOL, LANDINGMOD_SOCKET))
_vm->renderMessage(kStringShipHold8);
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, TERMINALSTRIP)) {
- _gm->drawImage(11);
+ _vm->renderImage(11);
getObject(4)->_name = kStringWireAndClip;
r = _gm->_rooms[HOLD];
_gm->_inventory.remove(*r->getObject(2));
@@ -1259,7 +1258,7 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
if (!_gm->_state._terminalStripConnected)
_vm->renderMessage(kStringCable3);
else {
- _gm->drawImage(5);
+ _vm->renderImage(5);
getObject(4)->_name = kStringWireAndPlug2;
getObject(4)->_click = 6;
_gm->_inventory.remove(*_gm->_rooms[CABIN_L2]->getObject(9));
@@ -1275,10 +1274,10 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
}
r->setSectionVisible(4, true);
r->getObject(0)->_name = getObject(4)->_name;
- _gm->drawImage(_gm->invertSection(5));
- _gm->drawImage(_gm->invertSection(4));
+ _vm->renderImage(_gm->invertSection(5));
+ _vm->renderImage(_gm->invertSection(4));
setSectionVisible(11, false);
- _gm->drawImage(6);
+ _vm->renderImage(6);
getObject(4)->_click = 7;
} else {
_vm->renderMessage(kStringShipHold6);
@@ -1303,11 +1302,11 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
if (obj1.hasProperty(OPENED))
return false;
_vm->playSound(kAudioDoorSound);
- _gm->drawImage(1);
+ _vm->renderImage(1);
if (isSectionVisible(7))
- _gm->drawImage(10);
+ _vm->renderImage(10);
if (isSectionVisible(13))
- _gm->drawImage(13);
+ _vm->renderImage(13);
_gm->_rooms[HOLD]->setSectionVisible(3, true);
obj1.setProperty(OPENED);
obj1._click = 2;
@@ -1319,10 +1318,10 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage(kStringShipHold7);
} else {
_vm->playSound(kAudioDoorSound);
- _gm->drawImage(_gm->invertSection(1));
+ _vm->renderImage(_gm->invertSection(1));
setSectionVisible(10, false);
if (isSectionVisible(13))
- _gm->drawImage(13);
+ _vm->renderImage(13);
_gm->_rooms[HOLD]->setSectionVisible(3, false);
obj1.disableProperty(OPENED);
obj1._click = 1;
@@ -1342,27 +1341,27 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage(kStringCable2);
else if ((verb == ACTION_PULL) && (obj1._id == SHORT_WIRE) &&
(obj1._click != 11)) {
- _gm->drawImage(3);
- _gm->drawImage(4);
+ _vm->renderImage(3);
+ _vm->renderImage(4);
obj1._click = 11;
_gm->turnOff();
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SHORT_WIRE, CLIP) &&
(getObject(11)->_click == 11) && !isSectionVisible(9)) {
- _gm->drawImage(2);
+ _vm->renderImage(2);
setSectionVisible(3, false);
setSectionVisible(4, false);
getObject(11)->_click = 10;
if (_gm->_state._shipEnergyDaysLeft)
_gm->turnOn();
else
- _gm->drawImage(4);
+ _vm->renderImage(4);
} else if ((verb == ACTION_OPEN) && (obj1._id == TRAP)) {
_vm->playSound(kAudioDoorSound);
- _gm->drawImage(2);
+ _vm->renderImage(2);
if (getObject(11)->_click == 11)
- _gm->drawImage(3);
+ _vm->renderImage(3);
if (_gm->_state._powerOff)
- _gm->drawImage(4);
+ _vm->renderImage(4);
obj1.setProperty(OPENED);
obj1._click = 6;
@@ -1377,26 +1376,26 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, GENERATOR_WIRE, CLIP) &&
isSectionVisible(3) && (getObject(0)->_click != 16)) {
- _gm->drawImage(_gm->invertSection(8));
- _gm->drawImage(2);
+ _vm->renderImage(_gm->invertSection(8));
+ _vm->renderImage(2);
setSectionVisible(4, false);
- _gm->drawImage(3);
- _gm->drawImage(9);
+ _vm->renderImage(3);
+ _vm->renderImage(9);
getObject(0)->_click = 16;
r = _gm->_rooms[LANDINGMODULE];
if (_gm->_state._landingModuleEnergyDaysLeft && r->isSectionVisible(7))
_gm->turnOn();
else
- _gm->drawImage(4);
+ _vm->renderImage(4);
_gm->_rooms[HOLD]->setSectionVisible(7, true);
_gm->great(3);
} else if ((verb == ACTION_PULL) && (obj1._id == GENERATOR_WIRE) &&
(obj1._click == 16)) {
- _gm->drawImage(_gm->invertSection(9));
- _gm->drawImage(2);
- _gm->drawImage(3);
- _gm->drawImage(4);
- _gm->drawImage(8);
+ _vm->renderImage(_gm->invertSection(9));
+ _vm->renderImage(2);
+ _vm->renderImage(3);
+ _vm->renderImage(4);
+ _vm->renderImage(8);
obj1._click = 15;
_gm->turnOff();
_gm->_rooms[HOLD]->setSectionVisible(7, false);
@@ -1411,7 +1410,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
else
_vm->renderMessage(kStringShipHold13);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LADDER, ROPE)) {
- _gm->drawImage(13);
+ _vm->renderImage(13);
r = _gm->_rooms[CABIN_R3];
_gm->_inventory.remove(*r->getObject(9));
getObject(3)->_click = 18;
@@ -1419,13 +1418,13 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
if (!isSectionVisible(1))
_vm->renderMessage(kStringShipHold14);
else {
- _gm->drawImage(_gm->invertSection(13));
- _gm->drawImage(1);
+ _vm->renderImage(_gm->invertSection(13));
+ _vm->renderImage(1);
if (isSectionVisible(7)) {
- _gm->drawImage(10);
- _gm->drawImage(11);
+ _vm->renderImage(10);
+ _vm->renderImage(11);
} else {
- _gm->drawImage(12);
+ _vm->renderImage(12);
}
r = _gm->_rooms[OUTSIDE];
r->setSectionVisible(1, true);
@@ -1452,11 +1451,11 @@ void ArsanoRocks::onEntrance() {
bool ArsanoRocks::interact(Action verb, Object &obj1, Object &obj2) {
if (((verb == ACTION_PULL) || (verb == ACTION_PRESS)) &&
(obj1._id == STONE) && !isSectionVisible(3)) {
- _gm->drawImage(1);
+ _vm->renderImage(1);
_gm->wait2(2);
- _gm->drawImage(2);
+ _vm->renderImage(2);
_gm->wait2(2);
- _gm->drawImage(3);
+ _vm->renderImage(3);
_vm->playSound(kAudioRocks);
obj1._click = 3;
getObject(3)->_click = 4;
@@ -1469,10 +1468,10 @@ bool ArsanoRocks::interact(Action verb, Object &obj1, Object &obj2) {
void ArsanoMeetup::onEntrance() {
if (isSectionVisible(7)) {
_gm->wait2(3);
- _gm->drawImage(6);
+ _vm->renderImage(6);
setSectionVisible(7, false);
_gm->wait2(3);
- _gm->drawImage(_gm->invertSection(6));
+ _vm->renderImage(_gm->invertSection(6));
}
if (!(_gm->_state._greatFlag & 0x8000)) {
_vm->playSound(kAudioGreat);
@@ -1481,14 +1480,14 @@ void ArsanoMeetup::onEntrance() {
}
void ArsanoMeetup::animation() {
- _gm->drawImage(_gm->invertSection(1) + _beacon);
+ _vm->renderImage(_gm->invertSection(1) + _beacon);
_beacon = (_beacon + 1) % 5;
- _gm->drawImage(_beacon + 1);
- _gm->drawImage(_beacon + 8);
+ _vm->renderImage(_beacon + 1);
+ _vm->renderImage(_beacon + 8);
if (isSectionVisible(_sign + 13))
- _gm->drawImage(_gm->invertSection(13) + _sign);
+ _vm->renderImage(_gm->invertSection(13) + _sign);
else
- _gm->drawImage(13 + _sign);
+ _vm->renderImage(13 + _sign);
_sign = (_sign + 1) % 14;
_gm->setAnimationTimer(3);
@@ -1501,7 +1500,6 @@ bool ArsanoMeetup::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage(kStringArsanoMeetup1);
} else if ((verb == ACTION_WALK) && (obj1._id == SPACESHIP)) {
_gm->changeRoom(GLIDER);
- _gm->_newRoom = true;
} else if ((verb == ACTION_WALK) && (obj1._id == STAR)) {
_vm->renderMessage(kStringArsanoMeetup2);
} else if ((verb == ACTION_LOOK) && (obj1._id == STAR)) {
@@ -1511,13 +1509,12 @@ bool ArsanoMeetup::interact(Action verb, Object &obj1, Object &obj2) {
_gm->getInput();
_gm->animationOn();
g_system->fillScreen(kColorBlack);
- // TODO: those two function calls needed?
_vm->renderRoom(*this);
_vm->paletteBrightness();
} else if ((verb == ACTION_WALK) && (obj1._id == DOOR)) {
- _gm->drawImage(6);
+ _vm->renderImage(6);
_gm->wait2(3);
- _gm->drawImage(7);
+ _vm->renderImage(7);
setSectionVisible(6, false);
_gm->wait2(3);
@@ -1534,7 +1531,6 @@ bool ArsanoMeetup::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KEYCARD_R, SPACESHIP)) {
getObject(5)->setProperty(OPENED);
_gm->changeRoom(GLIDER);
- _gm->_newRoom = true;
} else {
return false;
}
@@ -1546,31 +1542,31 @@ void ArsanoEntrance::animation() {
if (!_vm->_messageDisplayed && isSectionVisible(kMaxSection - 5)) {
_gm->animationOff(); // to avoid recursive call
_vm->playSound(kAudioDoorSound);
- _gm->drawImage(8);
+ _vm->renderImage(8);
setSectionVisible(9, false);
_gm->wait2(2);
- _gm->drawImage(7);
+ _vm->renderImage(7);
setSectionVisible(8, false);
_gm->wait2(2);
- _gm->drawImage(6);
+ _vm->renderImage(6);
setSectionVisible(7, false);
_gm->wait2(2);
- _gm->drawImage(5);
+ _vm->renderImage(5);
setSectionVisible(6, false);
_gm->wait2(2);
- _gm->drawImage(_gm->invertSection(5));
+ _vm->renderImage(_gm->invertSection(5));
getObject(11)->_click = 255;
setSectionVisible(kMaxSection - 5, false);
_gm->animationOn();
}
if (isSectionVisible(2)) {
- _gm->drawImage(_gm->invertSection(2));
+ _vm->renderImage(_gm->invertSection(2));
} else {
if (_eyewitness) {
--_eyewitness;
} else {
_eyewitness = 20;
- _gm->drawImage(2);
+ _vm->renderImage(2);
}
}
@@ -1624,9 +1620,9 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
_gm->reply(kStringArsanoEntrance10, 1, _gm->invertSection(1));
}
} else if ((verb == ACTION_WALK) && (obj1._id == STAIRCASE) && (_gm->_state._shoes != 3)) {
- _gm->drawImage(3);
+ _vm->renderImage(3);
_gm->wait2(2);
- _gm->drawImage(4);
+ _vm->renderImage(4);
setSectionVisible(3, false);
if (_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN))
_gm->reply(kStringDialogSeparator, 1, _gm->invertSection(1));
@@ -1634,10 +1630,10 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
_gm->reply(kStringArsanoEntrance11, 1, _gm->invertSection(1));
else
_gm->reply(kStringArsanoEntrance12, 1, _gm->invertSection(1));
- _gm->drawImage(3);
+ _vm->renderImage(3);
setSectionVisible(4, false);
_gm->wait2(2);
- _gm->drawImage(_gm->invertSection(3));
+ _vm->renderImage(_gm->invertSection(3));
if (!_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN)) {
if (_gm->_state._language) {
if (_gm->_state._shoes)
@@ -1661,15 +1657,15 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_state._shoes = 2;
break;
case 3:
- _gm->drawImage(3);
+ _vm->renderImage(3);
_gm->wait2(2);
- _gm->drawImage(4);
+ _vm->renderImage(4);
setSectionVisible(3, false);
_gm->reply(kStringArsanoEntrance16, 1, 1 + 128);
- _gm->drawImage(3);
+ _vm->renderImage(3);
setSectionVisible(4, false);
_gm->wait2(2);
- _gm->drawImage(_gm->invertSection(3));
+ _vm->renderImage(_gm->invertSection(3));
break;
}
removeSentence(0, 1);
@@ -1681,18 +1677,18 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
}
} else if ((verb == ACTION_PRESS) && (obj1._id == BATHROOM_BUTTON)) {
_vm->playSound(kAudioDoorSound);
- _gm->drawImage(5);
+ _vm->renderImage(5);
_gm->wait2(2);
- _gm->drawImage(6);
+ _vm->renderImage(6);
setSectionVisible(5, false);
_gm->wait2(2);
- _gm->drawImage(7);
+ _vm->renderImage(7);
setSectionVisible(6, false);
_gm->wait2(2);
- _gm->drawImage(8);
+ _vm->renderImage(8);
setSectionVisible(7, false);
_gm->wait2(2);
- _gm->drawImage(9);
+ _vm->renderImage(9);
setSectionVisible(8, false);
getObject(11)->_click = 9;
} else if ((verb == ACTION_WALK) && (obj1._id == ARSANO_BATHROOM)) {
@@ -1726,7 +1722,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
if ((_gm->_state._coins < 5) && (getObject(7 - _gm->_state._coins)->_click == 7))
_vm->renderMessage(kStringArsanoEntrance23);
else {
- _gm->drawImage(15 - _gm->_state._coins);
+ _vm->renderImage(15 - _gm->_state._coins);
getObject(8 - _gm->_state._coins)->_click = 7;
--_gm->_state._coins;
if (_gm->_state._coins == 1) {
@@ -1774,159 +1770,159 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
void ArsanoRemaining::animation() {
switch (_i) {
case 0:
- _gm->drawImage(1);
- _gm->drawImage(_gm->invertSection(4));
+ _vm->renderImage(1);
+ _vm->renderImage(_gm->invertSection(4));
break;
case 1:
- _gm->drawImage(_gm->invertSection(1));
- _gm->drawImage(4);
+ _vm->renderImage(_gm->invertSection(1));
+ _vm->renderImage(4);
break;
case 2:
- _gm->drawImage(2);
- _gm->drawImage(_gm->invertSection(4));
+ _vm->renderImage(2);
+ _vm->renderImage(_gm->invertSection(4));
break;
case 3:
- _gm->drawImage(7); // Dragon
- _gm->drawImage(_gm->invertSection(2));
- _gm->drawImage(4);
+ _vm->renderImage(7); // Dragon
+ _vm->renderImage(_gm->invertSection(2));
+ _vm->renderImage(4);
break;
case 4:
- _gm->drawImage(8);
+ _vm->renderImage(8);
setSectionVisible(7, false);
- _gm->drawImage(2);
- _gm->drawImage(_gm->invertSection(4));
+ _vm->renderImage(2);
+ _vm->renderImage(_gm->invertSection(4));
break;
case 5:
- _gm->drawImage(_gm->invertSection(8));
- _gm->drawImage(_gm->invertSection(2));
+ _vm->renderImage(_gm->invertSection(8));
+ _vm->renderImage(_gm->invertSection(2));
break;
case 6:
- _gm->drawImage(3);
- _gm->drawImage(2);
+ _vm->renderImage(3);
+ _vm->renderImage(2);
break;
case 7:
- _gm->drawImage(_gm->invertSection(3));
- _gm->drawImage(_gm->invertSection(2));
+ _vm->renderImage(_gm->invertSection(3));
+ _vm->renderImage(_gm->invertSection(2));
break;
case 8:
- _gm->drawImage(3);
+ _vm->renderImage(3);
break;
case 9:
- _gm->drawImage(14); // Card Player 1
- _gm->drawImage(4);
- _gm->drawImage(_gm->invertSection(3));
+ _vm->renderImage(14); // Card Player 1
+ _vm->renderImage(4);
+ _vm->renderImage(_gm->invertSection(3));
break;
case 10:
- _gm->drawImage(15);
- _gm->drawImage(14);
- _gm->drawImage(_gm->invertSection(4));
- _gm->drawImage(3);
+ _vm->renderImage(15);
+ _vm->renderImage(14);
+ _vm->renderImage(_gm->invertSection(4));
+ _vm->renderImage(3);
break;
case 11:
- _gm->drawImage(16);
+ _vm->renderImage(16);
setSectionVisible(15, false);
- _gm->drawImage(4);
- _gm->drawImage(_gm->invertSection(3));
+ _vm->renderImage(4);
+ _vm->renderImage(_gm->invertSection(3));
break;
case 12:
- _gm->drawImage(17);
+ _vm->renderImage(17);
setSectionVisible(16, false);
- _gm->drawImage(_gm->invertSection(4));
- _gm->drawImage(3);
+ _vm->renderImage(_gm->invertSection(4));
+ _vm->renderImage(3);
break;
case 13:
- _gm->drawImage(_gm->invertSection(17));
- _gm->drawImage(4);
- _gm->drawImage(_gm->invertSection(3));
+ _vm->renderImage(_gm->invertSection(17));
+ _vm->renderImage(4);
+ _vm->renderImage(_gm->invertSection(3));
break;
case 14:
- _gm->drawImage(_gm->invertSection(4));
+ _vm->renderImage(_gm->invertSection(4));
break;
case 15:
- _gm->drawImage(6);
+ _vm->renderImage(6);
break;
case 16:
- _gm->drawImage(18); // Card Player 2
- _gm->drawImage(5);
+ _vm->renderImage(18); // Card Player 2
+ _vm->renderImage(5);
break;
case 17:
- _gm->drawImage(19);
+ _vm->renderImage(19);
setSectionVisible(18, false);
- _gm->drawImage(_gm->invertSection(5));
+ _vm->renderImage(_gm->invertSection(5));
break;
case 18:
- _gm->drawImage(20);
+ _vm->renderImage(20);
setSectionVisible(19, false);
- _gm->drawImage(5);
+ _vm->renderImage(5);
break;
case 19:
- _gm->drawImage(21);
+ _vm->renderImage(21);
setSectionVisible(20, false);
- _gm->drawImage(_gm->invertSection(5));
+ _vm->renderImage(_gm->invertSection(5));
break;
case 20:
- _gm->drawImage(_gm->invertSection(21));
- _gm->drawImage(5);
+ _vm->renderImage(_gm->invertSection(21));
+ _vm->renderImage(5);
break;
case 21:
- _gm->drawImage(_gm->invertSection(5));
+ _vm->renderImage(_gm->invertSection(5));
break;
case 22:
- _gm->drawImage(5);
+ _vm->renderImage(5);
break;
case 23:
- _gm->drawImage(10);
+ _vm->renderImage(10);
_chewing = false;
- _gm->drawImage(_gm->invertSection(5));
+ _vm->renderImage(_gm->invertSection(5));
break;
case 24:
- _gm->drawImage(11);
+ _vm->renderImage(11);
setSectionVisible(10, false);
break;
case 25:
- _gm->drawImage(12);
+ _vm->renderImage(12);
setSectionVisible(11, false);
break;
case 26:
- _gm->drawImage(13);
+ _vm->renderImage(13);
setSectionVisible(12, false);
break;
case 27:
- _gm->drawImage(12);
+ _vm->renderImage(12);
setSectionVisible(13, false);
break;
case 28:
- _gm->drawImage(11);
+ _vm->renderImage(11);
setSectionVisible(12, false);
break;
case 29:
- _gm->drawImage(10);
+ _vm->renderImage(10);
setSectionVisible(11, false);
break;
case 30:
- _gm->drawImage(_gm->invertSection(10));
+ _vm->renderImage(_gm->invertSection(10));
_chewing = true;
break;
case 31:
- _gm->drawImage(22); // Card Player 3
+ _vm->renderImage(22); // Card Player 3
break;
case 32:
- _gm->drawImage(_gm->invertSection(22));
+ _vm->renderImage(_gm->invertSection(22));
break;
case 33:
- _gm->drawImage(_gm->invertSection(6));
+ _vm->renderImage(_gm->invertSection(6));
break;
case 34:
- _gm->drawImage(4);
+ _vm->renderImage(4);
}
_i = (_i + 1) % 35;
if (_chewing) {
if (isSectionVisible(9))
- _gm->drawImage(_gm->invertSection(9));
+ _vm->renderImage(_gm->invertSection(9));
else
- _gm->drawImage(9);
+ _vm->renderImage(9);
}
_gm->setAnimationTimer(3);
}
@@ -1941,9 +1937,9 @@ void ArsanoRoger::onEntrance() {
void ArsanoRoger::animation() {
if (isSectionVisible(1))
- _gm->drawImage(_gm->invertSection(1));
+ _vm->renderImage(_gm->invertSection(1));
else if (isSectionVisible(10)) {
- _gm->drawImage(12);
+ _vm->renderImage(12);
setSectionVisible(10, false);
setSectionVisible(12, false);
} else {
@@ -1952,15 +1948,15 @@ void ArsanoRoger::animation() {
} else {
_eyewitness = 20;
if (isSectionVisible(3))
- _gm->drawImage(10);
+ _vm->renderImage(10);
else
- _gm->drawImage(1);
+ _vm->renderImage(1);
}
}
if (isSectionVisible(3)) {
setSectionVisible(5 + _hands, false);
_hands = (_hands + 1) % 5;
- _gm->drawImage(5 + _hands);
+ _vm->renderImage(5 + _hands);
}
_gm->setAnimationTimer(4);
}
@@ -2020,7 +2016,7 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
}
} else if (((verb == ACTION_USE) && Object::combine(obj1, obj2, CHESS, ROGER_W)) ||
((verb == ACTION_GIVE) && (obj1._id == CHESS) && (obj2._id == ROGER_W))) {
- _gm->drawImage(11);
+ _vm->renderImage(11);
_gm->great(0);
_gm->say(kStringArsanoRoger36);
_gm->reply(kStringArsanoRoger37, 2, 2 + 128);
@@ -2042,7 +2038,7 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
setSectionVisible(11, false);
setSectionVisible(1, false);
_vm->renderRoom(*this);
- _gm->drawImage(3);
+ _vm->renderImage(3);
getObject(3)->_click = 5;
getObject(5)->_click = 6;
getObject(6)->_click = 7;
@@ -2060,9 +2056,9 @@ void ArsanoGlider::animation() {
if (isSectionVisible(8)) {
setSectionVisible(24 + _sinus, false);
_sinus = (_sinus + 1) % 14;
- _gm->drawImage(24 + _sinus);
+ _vm->renderImage(24 + _sinus);
} else if (isSectionVisible(24 + _sinus))
- _gm->drawImage(_gm->invertSection(24 + _sinus));
+ _vm->renderImage(_gm->invertSection(24 + _sinus));
_gm->setAnimationTimer(2);
}
@@ -2070,24 +2066,24 @@ void ArsanoGlider::animation() {
bool ArsanoGlider::interact(Action verb, Object &obj1, Object &obj2) {
static char l, r;
if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KEYCARD_R, GLIDER_SLOT)) {
- _gm->drawImage(5);
+ _vm->renderImage(5);
_gm->wait2(7);
- _gm->drawImage(8);
+ _vm->renderImage(8);
getObject(5)->_click = 10;
_gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(8));
} else if (((verb == ACTION_TAKE) || (verb == ACTION_PULL)) &&
(obj1._id == GLIDER_KEYCARD)) {
- _gm->drawImage(_gm->invertSection(5));
- _gm->drawImage(_gm->invertSection(8));
+ _vm->renderImage(_gm->invertSection(5));
+ _vm->renderImage(_gm->invertSection(8));
getObject(5)->_click = 255;
_gm->takeObject(*_gm->_rooms[ROGER]->getObject(8));
for (int i = 9; i <= 22; i++)
- _gm->drawImage(_gm->invertSection(i));
+ _vm->renderImage(_gm->invertSection(i));
l = r = 0;
} else if ((verb == ACTION_PRESS) &&
(obj1._id >= GLIDER_BUTTON1) && (obj1._id <= GLIDER_BUTTON4)) {
int i = obj1._id - GLIDER_BUTTON1 + 1;
- _gm->drawImage(i);
+ _vm->renderImage(i);
if (isSectionVisible(8)) {
l = 0;
r = 0;
@@ -2101,30 +2097,30 @@ bool ArsanoGlider::interact(Action verb, Object &obj1, Object &obj2) {
case 1:
if (l < 7) {
l++;
- _gm->drawImage(l + 8);
+ _vm->renderImage(l + 8);
}
break;
case 3:
if (r < 7) {
r++;
- _gm->drawImage(r + 15);
+ _vm->renderImage(r + 15);
}
break;
case 2:
if (l) {
- _gm->drawImage(_gm->invertSection(l + 8));
+ _vm->renderImage(_gm->invertSection(l + 8));
l--;
}
break;
case 4:
if (r) {
- _gm->drawImage(_gm->invertSection(r + 15));
+ _vm->renderImage(_gm->invertSection(r + 15));
r--;
}
}
}
_gm->wait2(4);
- _gm->drawImage(_gm->invertSection(i));
+ _vm->renderImage(_gm->invertSection(i));
} else if ((verb == ACTION_USE) && (obj1._id == GLIDER_BUTTONS)) {
_vm->renderMessage(kStringArsanoGlider1);
} else
@@ -2196,26 +2192,26 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
_gm->wait2(36);
for (int i = 1; i <= 13; i++) {
if (i > 1)
- _gm->drawImage(_gm->invertSection(i - 1));
- _gm->drawImage(i);
+ _vm->renderImage(13, _gm->invertSection(i - 1));
+ _vm->renderImage(13, i);
_gm->wait2(2);
}
- _gm->drawImage(_gm->invertSection(13));
+ _vm->renderImage(13, _gm->invertSection(13));
_gm->wait2(20);
_vm->renderImage(14, 0);
_vm->paletteBrightness();
_gm->wait2(36);
for (int i = 1; i <= 13; i++) {
if (i > 1)
- _gm->drawImage(_gm->invertSection(i - 1));
- _gm->drawImage(i);
+ _vm->renderImage(14, _gm->invertSection(i - 1));
+ _vm->renderImage(14, i);
_gm->wait2(2);
}
- _gm->drawImage(_gm->invertSection(13));
+ _vm->renderImage(14, _gm->invertSection(13));
_gm->wait2(9);
_vm->playSound(kAudioCrash);
for (int i = 14; i <= 19; i++) {
- _gm->drawImage(i);
+ _vm->renderImage(14, i);
_gm->wait2(3);
}
_vm->paletteFadeOut();
@@ -2230,14 +2226,16 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
g_system->fillScreen(kColorBlack);
_gm->_state._dream = false;
// TODO:
+ // The original at this points loads a savegame from "MSN.TMP"
+ // which is provided with the data file.
// if (!load_game(-2)) error_temp();
_gm->loadTime();
- _gm->_newRoom = true;
_gm->_rooms[CAVE]->getObject(1)->_exitRoom = MEETUP3;
_gm->_state._dream = true;
}
} else {
_gm->changeRoom(MEETUP2);
+ _vm->renderRoom(*this);
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KEYCARD_R, SPACESHIP))
_vm->renderMessage(kStringArsanoMeetup2_13);
@@ -2251,13 +2249,13 @@ void ArsanoMeetup2::shipStart() {
_gm->wait2(12);
for (int i = 2; i <= 11; ++i) {
if (i >= 9)
- _gm->drawImage(i - 1 + 128);
+ _vm->renderImage(i - 1 + 128);
else
setSectionVisible(i - 1, false);
- _gm->drawImage(i);
+ _vm->renderImage(i);
_gm->wait2(2);
}
- _gm->drawImage(11 + 128);
+ _vm->renderImage(11 + 128);
}
bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
@@ -2272,6 +2270,7 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
_vm->paletteBrightness();
_gm->getInput();
g_system->fillScreen(kColorBlack);
+ _vm->renderRoom(*this);
// CHECKME: Doesn't look complete - check sb_meetup()
} else if ((verb == ACTION_WALK) && (obj1._id == UFO)) {
g_system->fillScreen(kColorBlack);
@@ -2353,7 +2352,6 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(2)); // Watch
_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(3)); // Discman
_gm->changeRoom(CELL);
- _gm->_newRoom = true;
_gm->_state._dream = true;
} else
return false;
@@ -2375,43 +2373,43 @@ void AxacussCell::animation() {
++_gm->_state._timeRobot;
if (_gm->_state._timeRobot == 299) {
- _gm->drawImage(_gm->invertSection(31));
- _gm->drawImage(28);
+ _vm->renderImage(_gm->invertSection(31));
+ _vm->renderImage(28);
getObject(0)->_click = 255;
getObject(1)->setProperty(EXIT | OPENABLE | OPENED | CLOSED);
} else if ((_gm->_state._timeRobot >= 301) && (_gm->_state._timeRobot <= 320)) {
- _gm->drawImage(_gm->invertSection(329 - _gm->_state._timeRobot));
- _gm->drawImage(328 - _gm->_state._timeRobot);
+ _vm->renderImage(_gm->invertSection(329 - _gm->_state._timeRobot));
+ _vm->renderImage(328 - _gm->_state._timeRobot);
} else if (_gm->_state._timeRobot == 321) {
- _gm->drawImage(31);
+ _vm->renderImage(31);
setSectionVisible(8, false);
getObject(0)->_click = 1;
getObject(1)->setProperty(EXIT | OPENABLE | CLOSED);
}
if (_gm->_state._timeRobot == 599) {
- _gm->drawImage(_gm->invertSection(31));
- _gm->drawImage(8);
+ _vm->renderImage(_gm->invertSection(31));
+ _vm->renderImage(8);
getObject(0)->_click = 255;
getObject(1)->setProperty(EXIT | OPENABLE | OPENED | CLOSED);
} else if ((_gm->_state._timeRobot >= 601) && (_gm->_state._timeRobot <= 620)) {
- _gm->drawImage(_gm->_state._timeRobot - 593 + 128);
- _gm->drawImage(_gm->_state._timeRobot - 592);
+ _vm->renderImage(_gm->_state._timeRobot - 593 + 128);
+ _vm->renderImage(_gm->_state._timeRobot - 592);
} else if (_gm->_state._timeRobot == 621) {
- _gm->drawImage(31);
+ _vm->renderImage(31);
setSectionVisible(28, false);
getObject(0)->_click = 1;
getObject(1)->setProperty(EXIT | OPENABLE | CLOSED);
} else if (_gm->_state._timeRobot == 700) {
_gm->_state._timeRobot = 0;
} else if (_gm->_state._timeRobot == 10002) {
- _gm->drawImage(18 + 128);
- _gm->drawImage(29);
- _gm->drawImage(7);
+ _vm->renderImage(18 + 128);
+ _vm->renderImage(29);
+ _vm->renderImage(7);
getObject(2)->_click = 13;
} else if (_gm->_state._timeRobot == 10003) {
setSectionVisible(29, false);
- _gm->drawImage(30);
+ _vm->renderImage(30);
getObject(8)->_click = 12;
getObject(7)->_click = 14;
_vm->playSound(kAudioUndef4);
@@ -2420,7 +2418,7 @@ void AxacussCell::animation() {
}
if (_gm->_state._timeRobot == 312) {
- _gm->drawImage(7);
+ _vm->renderImage(7);
getObject(2)->_click = 13;
} else if (_gm->_state._timeRobot == 610) {
setSectionVisible(7, false);
@@ -2444,16 +2442,16 @@ bool AxacussCell::interact(Action verb, Object &obj1, Object &obj2) {
!isSectionVisible(3) &&
!isSectionVisible(5)) {
if (isSectionVisible(1)) {
- _gm->drawImage(_gm->invertSection(1));
- _gm->drawImage(2);
+ _vm->renderImage(_gm->invertSection(1));
+ _vm->renderImage(2);
getObject(5)->_click = 7;
} else if (isSectionVisible(4)) {
- _gm->drawImage(_gm->invertSection(4));
- _gm->drawImage(3);
+ _vm->renderImage(_gm->invertSection(4));
+ _vm->renderImage(3);
getObject(5)->_click = 8;
} else if (isSectionVisible(6)) {
- _gm->drawImage(_gm->invertSection(6));
- _gm->drawImage(5);
+ _vm->renderImage(_gm->invertSection(6));
+ _vm->renderImage(5);
getObject(5)->_click = 10;
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, CELL_WIRE, SOCKET) &&
@@ -2461,20 +2459,20 @@ bool AxacussCell::interact(Action verb, Object &obj1, Object &obj2) {
!isSectionVisible(4) &&
!isSectionVisible(6)) {
if (isSectionVisible(2)) {
- _gm->drawImage(_gm->invertSection(2));
- _gm->drawImage(1);
+ _vm->renderImage(_gm->invertSection(2));
+ _vm->renderImage(1);
getObject(5)->_click = 6;
} else if (isSectionVisible(3)) {
- _gm->drawImage(_gm->invertSection(3));
- _gm->drawImage(4);
+ _vm->renderImage(_gm->invertSection(3));
+ _vm->renderImage(4);
getObject(5)->_click = 9;
} else if (isSectionVisible(5)) {
- _gm->drawImage(_gm->invertSection(5));
- _gm->drawImage(6);
+ _vm->renderImage(_gm->invertSection(5));
+ _vm->renderImage(6);
getObject(5)->_click = 11;
} else {
_gm->_inventory.remove(*getObject(5));
- _gm->drawImage(4);
+ _vm->renderImage(4);
getObject(5)->_click = 9;
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, CELL_WIRE, KNIFE) &&
@@ -2482,8 +2480,8 @@ bool AxacussCell::interact(Action verb, Object &obj1, Object &obj2) {
if (isSectionVisible(1))
_gm->shock();
else {
- _gm->drawImage(_gm->invertSection(2));
- _gm->drawImage(3);
+ _vm->renderImage(_gm->invertSection(2));
+ _vm->renderImage(3);
getObject(5)->_click = 8;
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, CELL_WIRE, CELL_TABLE) &&
@@ -2492,25 +2490,25 @@ bool AxacussCell::interact(Action verb, Object &obj1, Object &obj2) {
!isSectionVisible(5) &&
!isSectionVisible(6)) {
if (isSectionVisible(3)) {
- _gm->drawImage(_gm->invertSection(3));
- _gm->drawImage(5);
+ _vm->renderImage(_gm->invertSection(3));
+ _vm->renderImage(5);
getObject(5)->_click = 10;
} else if (isSectionVisible(4)) {
- _gm->drawImage(_gm->invertSection(4));
- _gm->drawImage(6);
+ _vm->renderImage(_gm->invertSection(4));
+ _vm->renderImage(6);
_gm->shock();
} else {
_gm->_inventory.remove(*getObject(5));
- _gm->drawImage(5);
+ _vm->renderImage(5);
getObject(5)->_click = 10;
}
} else if ((verb == ACTION_TAKE) && (obj1._id == CELL_WIRE) &&
!(obj1.hasProperty(CARRIED))) {
if (isSectionVisible(3)) {
- _gm->drawImage(_gm->invertSection(3));
+ _vm->renderImage(_gm->invertSection(3));
_gm->takeObject(obj1);
} else if (isSectionVisible(5)) {
- _gm->drawImage(_gm->invertSection(5));
+ _vm->renderImage(_gm->invertSection(5));
_gm->takeObject(obj1);
} else {
_vm->renderMessage(kStringAxacussCell_3);
@@ -2566,7 +2564,7 @@ bool AxacussCorridor4::interact(Action verb, Object &obj1, Object &obj2) {
setSectionVisible(9, false);
_gm->takeObject(obj1);
if (isSectionVisible(29))
- _gm->drawImage(29);
+ _vm->renderImage(29);
} else if (((verb == ACTION_USE) && Object::combine(obj1, obj2, TABLE, WATCH)) ||
((verb == ACTION_GIVE) && (obj1._id == WATCH) &&
(obj2._id == TABLE))) {
@@ -2575,7 +2573,7 @@ bool AxacussCorridor4::interact(Action verb, Object &obj1, Object &obj2) {
else
_gm->_inventory.remove(obj2);
- _gm->drawImage(29);
+ _vm->renderImage(29);
getObject(4)->_click = 8;
} else if ((verb == ACTION_TAKE) && (obj1._id == WATCH) &&
!obj1.hasProperty(CARRIED)) {
@@ -2583,7 +2581,7 @@ bool AxacussCorridor4::interact(Action verb, Object &obj1, Object &obj2) {
getObject(4)->_click = 255;
_gm->takeObject(*_gm->_rooms[INTRO]->getObject(2));
if (isSectionVisible(9))
- _gm->drawImage(9);
+ _vm->renderImage(9);
} else
return false;
@@ -2613,11 +2611,11 @@ bool AxacussCorridor5::handleMoneyDialog() {
switch (_gm->dialog(4, _rows, _dialog3, 2)) {
case 1:
_gm->wait2(3);
- _gm->drawImage(1);
+ _vm->renderImage(1);
_vm->playSound(kAudioVoiceHalt);
- _gm->drawImage(_gm->invertSection(1));
+ _vm->renderImage(_gm->invertSection(1));
_gm->wait2(5);
- _gm->drawImage(2);
+ _vm->renderImage(2);
_gm->wait2(2);
_gm->shot(3, _gm->invertSection(3));
break;
@@ -2641,7 +2639,6 @@ void AxacussCorridor5::stopInteract(int sum) {
_gm->reply(kStringAxacussCorridor5_7, 1, 1 + 128);
_gm->great(0);
_gm->changeRoom(ELEVATOR);
- _gm->_newRoom = true;
_gm->takeMoney(-sum);
}
@@ -2678,7 +2675,7 @@ void AxacussCorridor6::onEntrance() {
bool AxacussCorridor6::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
(obj1.hasProperty(OPENED))) {
- _gm->drawImage(6);
+ _vm->renderImage(6);
setSectionVisible(7, false);
obj1.setProperty(EXIT | OPENABLE | CLOSED);
_gm->_rooms[CORRIDOR8]->setSectionVisible(27, false);
@@ -2702,7 +2699,7 @@ void AxacussCorridor8::onEntrance() {
bool AxacussCorridor8::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_OPEN) && (obj1._id == DOOR) &&
!obj1.hasProperty(OPENED)) {
- _gm->drawImage(27);
+ _vm->renderImage(27);
setSectionVisible(28, false);
obj1.setProperty(OPENED);
_gm->_rooms[CORRIDOR6]->setSectionVisible(6, false);
@@ -2712,7 +2709,7 @@ bool AxacussCorridor8::interact(Action verb, Object &obj1, Object &obj2) {
_vm->playSound(kAudioDoorOpen);
} else if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
(obj1._type & OPENED)) {
- _gm->drawImage(28);
+ _vm->renderImage(28);
setSectionVisible(27, false);
obj1.disableProperty(OPENED);
_gm->_rooms[CORRIDOR6]->setSectionVisible(6, true);
@@ -2732,7 +2729,7 @@ void AxacussCorridor9::onEntrance() {
bool AxacussCorridor9::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
(obj1.hasProperty(OPENED))) {
- _gm->drawImage(28);
+ _vm->renderImage(28);
setSectionVisible(27, false);
obj1.disableProperty(OPENED);
_gm->_rooms[GUARD]->setSectionVisible(6, false);
@@ -2740,7 +2737,7 @@ bool AxacussCorridor9::interact(Action verb, Object &obj1, Object &obj2) {
_vm->playSound(kAudioDoorClose);
} else if ((verb == ACTION_OPEN) && (obj1._id == DOOR) &&
!obj1.hasProperty(OPENED)) {
- _gm->drawImage(27);
+ _vm->renderImage(27);
setSectionVisible(28, false);
obj1.setProperty(OPENED);
_gm->_rooms[GUARD]->setSectionVisible(6, true);
@@ -2768,7 +2765,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_CLOSE) && (obj1._id >= DOOR1) && (obj1._id <= DOOR4) &&
obj1.hasProperty(OPENED)) {
- _gm->drawImage(_gm->invertSection(obj1._id - DOOR1 + 1));
+ _vm->renderImage(_gm->invertSection(obj1._id - DOOR1 + 1));
_vm->playSound(kAudioDoorClose);
if (obj1.hasProperty(OCCUPIED)) {
_gm->_state._destination = 255;
@@ -2788,7 +2785,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
if (getObject(4)->hasProperty(OCCUPIED))
_vm->renderMessage(kStringDontEnter);
else {
- _gm->drawImage(1);
+ _vm->renderImage(1);
_vm->playSound(kAudioDoorOpen);
if (getObject(4)->hasProperty(CAUGHT))
_gm->busted(11);
@@ -2799,7 +2796,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
if (getObject(5)->hasProperty(OCCUPIED)) {
_vm->renderMessage(kStringDontEnter);
} else {
- _gm->drawImage(2);
+ _vm->renderImage(2);
_vm->playSound(kAudioDoorOpen);
if (getObject(5)->hasProperty(CAUGHT))
_gm->busted(16);
@@ -2810,7 +2807,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
if (getObject(6)->hasProperty(OCCUPIED)) {
_vm->renderMessage(kStringDontEnter);
} else {
- _gm->drawImage(3);
+ _vm->renderImage(3);
_vm->playSound(kAudioDoorOpen);
if (getObject(6)->hasProperty(CAUGHT))
_gm->busted(15);
@@ -2821,7 +2818,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
if (getObject(7)->hasProperty(OCCUPIED)) {
_vm->renderMessage(kStringDontEnter);
} else {
- _gm->drawImage(4);
+ _vm->renderImage(4);
_vm->playSound(kAudioDoorOpen);
if (getObject(7)->hasProperty(CAUGHT))
_gm->busted(20);
@@ -2882,14 +2879,14 @@ bool AxacussExit::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LAMP, MAGNET)) {
_gm->_inventory.remove(*_gm->_rooms[CELL]->getObject(7));
for (int i = 4; i <= 11; i++) {
- _gm->drawImage(i);
+ _vm->renderImage(i);
if (i == 11)
_vm->playSound(kAudioUndef2); // 046/4020
_gm->wait2(1);
- _gm->drawImage(i + 128);
+ _vm->renderImage(i + 128);
}
_gm->_state._powerOff = true;
- _gm->_currentRoom->getObject(5)->_click = 255;
+ _objectState[5]._click = 255;
_gm->search(450);
_gm->roomBrightness();
@@ -2906,16 +2903,16 @@ bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
Common::String input;
if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
obj1.hasProperty(OPENED)) {
- _gm->drawImage(_gm->invertSection(9));
+ _vm->renderImage(_gm->invertSection(9));
obj1.setProperty(EXIT | OPENABLE | CLOSED);
_vm->playSound(kAudioDoorClose);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR) &&
!getObject(0)->hasProperty(OPENED)) {
- _gm->drawImage(9);
+ _vm->renderImage(9);
getObject(0)->setProperty(EXIT | OPENABLE | OPENED);
_vm->playSound(kAudioDoorOpen);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
- _gm->drawImage(4);
+ _vm->renderImage(4);
setSectionVisible(16, false);
_vm->playSound(kAudioUndef2);
} else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
@@ -2938,11 +2935,11 @@ bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
else
_vm->renderMessage(kStringAxacussOffice1_3);
} else {
- _gm->drawImage(6);
+ _vm->renderImage(6);
setSectionVisible(7, false);
obj1.setProperty(OPENABLE | OPENED);
if (getObject(2)->hasProperty(TAKE)) {
- _gm->drawImage(8);
+ _vm->renderImage(8);
getObject(2)->_click = 9;
}
_vm->playSound(kAudioDoorOpen);
@@ -2951,14 +2948,14 @@ bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
}
} else if ((verb == ACTION_CLOSE) && (obj1._id == LOCKER) &&
obj1.hasProperty(OPENED)) {
- _gm->drawImage(7);
+ _vm->renderImage(7);
setSectionVisible(6, false);
obj1.setProperty(OPENABLE | CLOSED);
setSectionVisible(8, false);
getObject(2)->_click = 255;
_vm->playSound(kAudioDoorClose);
} else if ((verb == ACTION_TAKE) && (obj1._id == TICKETS)) {
- _gm->drawImage(6);
+ _vm->renderImage(6);
setSectionVisible(8, false);
getObject(2)->_click = 255;
getObject(2)->resetProperty();
@@ -2989,16 +2986,16 @@ bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
bool AxacussOffice2::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
obj1.hasProperty(OPENED)) {
- _gm->drawImage(_gm->invertSection(9));
+ _vm->renderImage(_gm->invertSection(9));
obj1.setProperty(EXIT | OPENABLE | CLOSED);
_vm->playSound(kAudioDoorClose);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR) &&
!getObject(0)->hasProperty(OPENED)) {
- _gm->drawImage(9);
+ _vm->renderImage(9);
getObject(0)->setProperty(EXIT | OPENABLE | OPENED);
_vm->playSound(kAudioDoorOpen);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
- _gm->drawImage(4);
+ _vm->renderImage(4);
setSectionVisible(16, false);
_vm->playSound(kAudioUndef2);
} else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
@@ -3015,16 +3012,16 @@ bool AxacussOffice2::interact(Action verb, Object &obj1, Object &obj2) {
bool AxacussOffice3::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
obj1.hasProperty(OPENED)) {
- _gm->drawImage(_gm->invertSection(3));
+ _vm->renderImage(_gm->invertSection(3));
obj1.setProperty(EXIT | OPENABLE | CLOSED);
_vm->playSound(kAudioDoorClose);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR) &&
!getObject(0)->hasProperty(OPENED)) {
- _gm->drawImage(3);
+ _vm->renderImage(3);
getObject(0)->setProperty(EXIT | OPENABLE | OPENED);
_vm->playSound(kAudioDoorOpen);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
- _gm->drawImage(4);
+ _vm->renderImage(4);
_vm->playSound(kAudioUndef2);
} else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
if (isSectionVisible(4))
@@ -3044,16 +3041,16 @@ bool AxacussOffice3::interact(Action verb, Object &obj1, Object &obj2) {
bool AxacussOffice4::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
obj1.hasProperty(OPENED)) {
- _gm->drawImage(_gm->invertSection(3));
+ _vm->renderImage(_gm->invertSection(3));
obj1.setProperty(EXIT | OPENABLE | CLOSED);
_vm->playSound(kAudioDoorClose);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR) &&
!getObject(0)->hasProperty(OPENED)) {
- _gm->drawImage(3);
+ _vm->renderImage(3);
getObject(0)->setProperty(EXIT | OPENABLE | OPENED);
_vm->playSound(kAudioDoorOpen);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
- _gm->drawImage(4);
+ _vm->renderImage(4);
_vm->playSound(kAudioUndef2);
} else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
if (isSectionVisible(4))
@@ -3072,10 +3069,10 @@ void AxacussOffice5::onEntrance() {
bool AxacussOffice5::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
- _gm->drawImage(4);
+ _vm->renderImage(4);
_vm->playSound(kAudioUndef2);
} else if ((verb == ACTION_TAKE) && (obj1._id == TICKETS)) {
- _gm->drawImage(_gm->invertSection(5));
+ _vm->renderImage(_gm->invertSection(5));
obj1._click = 255;
_gm->takeMoney(350);
} else
@@ -3094,17 +3091,17 @@ bool AxacussElevator::interact(Action verb, Object &obj1, Object &obj2) {
g_system->fillScreen(kColorBlack);
} else if ((verb == ACTION_PRESS) && (obj1._id == BUTTON1)) {
if (!isSectionVisible(3)) {
- _gm->drawImage(1);
+ _vm->renderImage(1);
getObject(2)->resetProperty();
_vm->playSound(kAudioDoorSound);
_gm->wait2(25);
for (int i = 3; i <= 7; i++) {
_gm->wait2(2);
- _gm->drawImage(i);
+ _vm->renderImage(i);
}
getObject(3)->resetProperty(EXIT);
getObject(3)->_click = 2;
- _gm->drawImage(_gm->invertSection(1));
+ _vm->renderImage(_gm->invertSection(1));
if (!(_gm->_state._greatFlag & 0x4000)) {
_vm->playSound(kAudioGreat);
_gm->_state._greatFlag |= 0x4000;
@@ -3112,18 +3109,18 @@ bool AxacussElevator::interact(Action verb, Object &obj1, Object &obj2) {
}
} else if ((verb == ACTION_PRESS) && (obj1._id == BUTTON2)) {
if (isSectionVisible(3)) {
- _gm->drawImage(2);
+ _vm->renderImage(2);
getObject(3)->resetProperty();
getObject(3)->_click = 255;
_vm->playSound(kAudioDoorSound);
for (int i = 7; i >= 3; i--) {
_gm->wait2(2);
- _gm->drawImage(_gm->invertSection(i));
+ _vm->renderImage(_gm->invertSection(i));
}
_gm->wait2(25);
_vm->playSound(kAudioDoorSound);
getObject(2)->resetProperty(EXIT);
- _gm->drawImage(_gm->invertSection(2));
+ _vm->renderImage(_gm->invertSection(2));
}
} else if ((verb == ACTION_WALK) && (obj1._id == JUNGLE)) {
_vm->paletteFadeOut();
@@ -3149,7 +3146,6 @@ bool AxacussElevator::interact(Action verb, Object &obj1, Object &obj2) {
bool AxacussStation::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_LOOK) && (obj1._id == STATION_SIGN)) {
_gm->changeRoom(SIGN);
- _gm->_newRoom = true;
} else if ((verb == ACTION_WALK) && (obj1._id == DOOR) &&
obj1.hasProperty(OPENED)) {
_gm->great(0);
@@ -3182,7 +3178,7 @@ bool AxacussSign::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_USE) && Object::combine(obj1, obj2, STATION_SLOT, MONEY) &&
isSectionVisible(1)) {
_gm->takeMoney(-180);
- _gm->drawImage(2);
+ _vm->renderImage(2);
setSectionVisible(1, false);
_gm->_state._eventTime = _gm->_state._time + ticksToMsec(600);
_gm->_state._eventCallback = kTaxiFn;
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 7b72e58..d78c45c 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -121,10 +121,11 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
}
// Rooms
- _currentRoom = _rooms[static_cast<RoomID>(in->readByte())];
+ RoomID curRoomId = static_cast<RoomID>(in->readByte());
for (int i = 0; i < NUMROOMS; ++i) {
_rooms[i]->deserialize(in, version);
}
+ changeRoom(curRoomId);
return !in->err();
}
@@ -628,24 +629,6 @@ void GameManager::processInput() {
}
}
-void GameManager::drawImage(int section) {
- bool sectionVisible = true;
-
- if (section > 128) {
- sectionVisible = false;
- section -= 128;
- }
-
- _currentRoom->setSectionVisible(section, sectionVisible);
- do {
- if (sectionVisible)
- _vm->renderImage(_currentRoom->getFileNumber(), section);
- else
- _vm->renderImage(_currentRoom->getFileNumber(), section + 128);
- section = _vm->_currentImage->_section[section].next;
- } while (section != 0);
-}
-
void GameManager::corridorOnEntrance() {
if (_state._corridorSearch)
busted(0);
@@ -673,7 +656,7 @@ void GameManager::guardNoticed() {
void GameManager::busted(int i) {
if (i > 0)
- drawImage(i);
+ _vm->renderImage(i);
if (i == 0) {
if ((_currentRoom->getId() >= OFFICE_L1) && (_currentRoom->getId() <= OFFICE_R2)) {
if (_currentRoom->getId() < OFFICE_R1)
@@ -681,33 +664,33 @@ void GameManager::busted(int i) {
else
i = 5;
if (!_currentRoom->getObject(0)->hasProperty(OPENED)) {
- drawImage(i - 1);
+ _vm->renderImage(i - 1);
_vm->playSound(kAudioDoorOpen);
wait2(2);
}
- drawImage(i);
+ _vm->renderImage(i);
wait2(3);
- drawImage(i + 3);
+ _vm->renderImage(i + 3);
_vm->playSound(kAudioVoiceHalt);
- drawImage(i);
+ _vm->renderImage(i);
wait2(5);
if (_currentRoom->getId() == OFFICE_L2)
i = 13;
- drawImage(i + 1);
+ _vm->renderImage(i + 1);
wait2(3);
- drawImage(i + 2);
+ _vm->renderImage(i + 2);
shot(0, 0);
} else if (_currentRoom->getId() == BCORRIDOR) {
- drawImage(21);
+ _vm->renderImage(21);
} else {
if (_currentRoom->isSectionVisible(4))
- drawImage(32); // below
+ _vm->renderImage(32); // below
else if (_currentRoom->isSectionVisible(2))
- drawImage(30); // right
+ _vm->renderImage(30); // right
else if (_currentRoom->isSectionVisible(1))
- drawImage(31); // left
+ _vm->renderImage(31); // left
else
- drawImage(33); // above
+ _vm->renderImage(33); // above
}
}
_vm->playSound(kAudioVoiceHalt);
@@ -860,21 +843,22 @@ void GameManager::guardWalkEvent() {
void GameManager::taxiEvent() {
if (_currentRoom->getId() == SIGN) {
changeRoom(STATION);
+ _vm->renderRoom(*_currentRoom);
}
- drawImage(1);
- drawImage(2);
+ _vm->renderImage(1);
+ _vm->renderImage(2);
_vm->playSound(kAudioRocks);
screenShake();
- drawImage(9);
+ _vm->renderImage(9);
_currentRoom->getObject(1)->setProperty(OPENED);
- drawImage(1);
+ _vm->renderImage(1);
_currentRoom->setSectionVisible(2, false);
- drawImage(3);
+ _vm->renderImage(3);
for (int i = 4; i <= 8; i++) {
wait2(2);
- drawImage(invertSection(i - 1));
- drawImage(i);
+ _vm->renderImage(invertSection(i - 1));
+ _vm->renderImage(i);
}
_rooms[SIGN]->setSectionVisible(2, false);
_rooms[SIGN]->setSectionVisible(3, true);
@@ -971,11 +955,11 @@ void GameManager::reply(const char *text, int aus1, int aus2) {
_vm->renderMessage(text, kMessageTop);
for (int z = (strlen(text) + 20) * _vm->_textSpeed / 40; z > 0; --z) {
- drawImage(aus1);
+ _vm->renderImage(aus1);
waitOnInput(2);
if (_keyPressed || _mouseClicked)
z = 1;
- drawImage(aus2);
+ _vm->renderImage(aus2);
waitOnInput(2);
if (_keyPressed || _mouseClicked)
z = 1;
@@ -1056,7 +1040,7 @@ void GameManager::takeObject(Object &obj) {
return;
if (obj._section != 0)
- drawImage(obj._section);
+ _vm->renderImage(obj._section);
obj.setProperty(CARRIED);
obj._click = obj._click2 = 255;
_inventory.add(obj);
@@ -1402,18 +1386,18 @@ void GameManager::edit(Common::String &input, int x, int y, uint length) {
void GameManager::shot(int a, int b) {
if (a)
- drawImage(a);
+ _vm->renderImage(a);
_vm->playSound(kAudioGunShot);
wait2(2);
if (b)
- drawImage(b);
+ _vm->renderImage(b);
wait2(2);
if (a)
- drawImage(a);
+ _vm->renderImage(a);
_vm->playSound(kAudioGunShot);
wait2(2);
if (b)
- drawImage(b);
+ _vm->renderImage(b);
dead(kStringShot);
}
@@ -1455,7 +1439,7 @@ void GameManager::drawStatus() {
}
void GameManager::openLocker(const Room *room, Object *obj, Object *lock, int section) {
- drawImage(section);
+ _vm->renderImage(section);
obj->setProperty(OPENED);
lock->_click = 255;
int i = obj->_click;
@@ -1467,7 +1451,7 @@ void GameManager::closeLocker(const Room *room, Object *obj, Object *lock, int s
if (!obj->hasProperty(OPENED)) {
_vm->renderMessage(kStringCloseLocker_1);
} else {
- drawImage(invertSection(section));
+ _vm->renderImage(invertSection(section));
obj->disableProperty(OPENED);
lock->_click = lock->_click2;
int i = obj->_click;
@@ -1866,7 +1850,7 @@ void GameManager::handleInput() {
// This is locked.
_vm->renderMessage(kStringGenericInteract_40);
} else {
- drawImage(_inputObject[0]->_section);
+ _vm->renderImage(_inputObject[0]->_section);
_inputObject[0]->setProperty(OPENED);
byte i = _inputObject[0]->_click;
_inputObject[0]->_click = _inputObject[0]->_click2;
@@ -1885,7 +1869,7 @@ void GameManager::handleInput() {
// This is already closed.
_vm->renderMessage(kStringCloseLocker_1);
} else {
- drawImage(invertSection(_inputObject[0]->_section));
+ _vm->renderImage(invertSection(_inputObject[0]->_section));
_inputObject[0]->disableProperty(OPENED);
byte i = _inputObject[0]->_click;
_inputObject[0]->_click = _inputObject[0]->_click2;
@@ -1930,32 +1914,32 @@ void GameManager::executeRoom() {
}
void GameManager::guardShot() {
- drawImage(2);
- drawImage(5);
+ _vm->renderImage(2);
+ _vm->renderImage(5);
wait2(3);
- drawImage(2);
+ _vm->renderImage(2);
_vm->playSound(kAudioVoiceHalt);
while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
wait2(1);
- drawImage(5);
+ _vm->renderImage(5);
wait2(5);
- drawImage(3);
+ _vm->renderImage(3);
wait2(3);
shot(4, 3);
}
void GameManager::guard3Shot() {
- drawImage(1);
+ _vm->renderImage(1);
wait2(3);
_vm->playSound(kAudioVoiceHalt); // 46/0
while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
wait2(1);
wait2(5);
- drawImage(2);
+ _vm->renderImage(2);
wait2(3);
shot(3,2);
}
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index a979d22..8a3e6bf 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -123,7 +123,6 @@ public:
Object *_currentInputObject;
Object *_inputObject[2];
bool _waitEvent;
- bool _newRoom;
int32 _oldTime;
uint _timePaused;
bool _timerPaused;
@@ -178,7 +177,6 @@ public:
void drawStatus();
void drawCommandBox();
void drawInventory();
- void drawImage(int section);
void changeRoom(RoomID id);
void resetInputState();
void handleInput();
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 66fde28..f56db88 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -103,7 +103,6 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)
, _currentImage(_images)
, _brightness(255)
, _menuBrightness(255)
- , _imageIndex(0)
, _delay(33)
, _textSpeed(kTextSpeed[2])
, _screenWidth(320)
@@ -413,7 +412,7 @@ void SupernovaEngine::playSoundMod(int filenumber)
-1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO);
}
-void SupernovaEngine::renderImage(MSNImageDecoder &image, int section) {
+void SupernovaEngine::renderImageSection(int section) {
// Note: inverting means we are removing the section. So we should get the rect for that
// section but draw the background (section 0) instead.
bool invert = false;
@@ -421,19 +420,14 @@ void SupernovaEngine::renderImage(MSNImageDecoder &image, int section) {
section -= 128;
invert = true;
}
- if (section > image._numSections - 1)
+ if (!_currentImage || section > _currentImage->_numSections - 1)
return;
- _currentImage = ℑ
- _imageIndex = image._filenumber;
- _system->getPaletteManager()->setPalette(image.getPalette(), 16, 239);
- paletteBrightness();
-
- Common::Rect sectionRect(image._section[section].x1,
- image._section[section].y1,
- image._section[section].x2 + 1,
- image._section[section].y2 + 1) ;
- if (image._filenumber == 1 || image._filenumber == 2) {
+ Common::Rect sectionRect(_currentImage->_section[section].x1,
+ _currentImage->_section[section].y1,
+ _currentImage->_section[section].x2 + 1,
+ _currentImage->_section[section].y2 + 1) ;
+ if (_currentImage->_filenumber == 1 || _currentImage->_filenumber == 2) {
sectionRect.setWidth(640);
sectionRect.setHeight(480);
if (_screenWidth != 640) {
@@ -452,22 +446,49 @@ void SupernovaEngine::renderImage(MSNImageDecoder &image, int section) {
uint offset = 0;
int pitch = sectionRect.width();
if (invert) {
- pitch = image._pitch;
- offset = image._section[section].y1 * pitch + image._section[section].x1;
+ pitch = _currentImage->_pitch;
+ offset = _currentImage->_section[section].y1 * pitch + _currentImage->_section[section].x1;
section = 0;
}
- _system->copyRectToScreen(static_cast<const byte *>(image._sectionSurfaces[section]->getPixels()) + offset,
+ _system->copyRectToScreen(static_cast<const byte *>(_currentImage->_sectionSurfaces[section]->getPixels()) + offset,
pitch,
sectionRect.left, sectionRect.top,
sectionRect.width(), sectionRect.height());
}
void SupernovaEngine::renderImage(int filenumber, int section) {
- if (filenumber > ARRAYSIZE(_images) - 1)
- return;
+ if (setCurrentImage(filenumber))
+ renderImage(section);
+}
+
+void SupernovaEngine::renderImage(int section) {
+ bool sectionVisible = true;
+
+ if (section > 128) {
+ sectionVisible = false;
+ section -= 128;
+ }
- renderImage(_images[filenumber], section);
+ _gm->_currentRoom->setSectionVisible(section, sectionVisible);
+
+ do {
+ if (sectionVisible)
+ renderImageSection(section);
+ else
+ renderImageSection(section + 128);
+ section = _currentImage->_section[section].next;
+ } while (section != 0);
+}
+
+bool SupernovaEngine::setCurrentImage(int filenumber) {
+ if (filenumber == -1 || filenumber > ARRAYSIZE(_images) - 1)
+ return false;
+
+ _currentImage = &(_images[filenumber]);
+ _system->getPaletteManager()->setPalette(_currentImage->getPalette(), 16, 239);
+ paletteBrightness();
+ return true;
}
void SupernovaEngine::saveScreen(int x, int y, int width, int height) {
@@ -479,13 +500,12 @@ void SupernovaEngine::restoreScreen() {
}
void SupernovaEngine::renderRoom(Room &room) {
- if (room.getFileNumber() != -1) {
- _currentImage = &(_images[room.getFileNumber()]);
+ if (setCurrentImage(room.getFileNumber())) {
for (int i = 0; i < _currentImage->_numSections; ++i) {
int section = i;
if (room.isSectionVisible(section)) {
do {
- renderImage(*_currentImage, section);
+ renderImageSection(section);
section = _currentImage->_section[section].next;
} while (section != 0);
}
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 8606600..fe17108 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -105,7 +105,6 @@ public:
Common::StringArray _gameStrings;
Common::String _nullString;
- byte _imageIndex;
byte _menuBrightness;
byte _brightness;
uint _delay;
@@ -127,8 +126,10 @@ public:
void playSound(AudioIndex sample);
void playSoundMod(int filenumber);
void stopSound();
- void renderImage(MSNImageDecoder &image, int section);
+ void renderImageSection(int section);
void renderImage(int filenumber, int section);
+ void renderImage(int section);
+ bool setCurrentImage(int filenumber);
void saveScreen(int x, int y, int width, int height);
void restoreScreen();
void renderRoom(Room &room);
Commit: 624425077b0353303a72192906c495f619099b7d
https://github.com/scummvm/scummvm/commit/624425077b0353303a72192906c495f619099b7d
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:40Z
Commit Message:
SUPERNOVA: Add warning when trying to use out of bound file number
This is likely happening, and a comment has also been added to
indicate this. The warning was added to help detect those issue
and so that we don't forgert about it.
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index f56db88..0e7631b 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -482,8 +482,10 @@ void SupernovaEngine::renderImage(int section) {
}
bool SupernovaEngine::setCurrentImage(int filenumber) {
- if (filenumber == -1 || filenumber > ARRAYSIZE(_images) - 1)
+ if (filenumber == -1 || filenumber > ARRAYSIZE(_images) - 1) {
+ warning("Trying to display image from out of bound file number %d", filenumber);
return false;
+ }
_currentImage = &(_images[filenumber]);
_system->getPaletteManager()->setPalette(_currentImage->getPalette(), 16, 239);
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index fe17108..882f6a9 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -90,6 +90,8 @@ public:
ScreenBufferStack _screenBuffer;
byte _mouseNormal[256];
byte _mouseWait[256];
+ // TODO check this! There are 56 data files (0 to 55) and at least the outro
+ // tries to displayimage from file 55 (and fails!).
MSNImageDecoder _images[44];
MSNImageDecoder *_currentImage;
struct SoundSample {
Commit: 888930660a5a4bef4fe00e69f267ce0d35492dd8
https://github.com/scummvm/scummvm/commit/888930660a5a4bef4fe00e69f267ce0d35492dd8
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:40Z
Commit Message:
SUPERNOVA: Use setCurrentImage instead of passing the image to renderImage
This is more similar to what the original code does and allows to retire
the renderImage variant that takes an image.
Changed paths:
engines/supernova/console.cpp
engines/supernova/rooms.cpp
engines/supernova/rooms.h
engines/supernova/state.cpp
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/console.cpp b/engines/supernova/console.cpp
index 29c30b6..ee1905a 100644
--- a/engines/supernova/console.cpp
+++ b/engines/supernova/console.cpp
@@ -47,7 +47,11 @@ bool Console::cmdRenderImage(int argc, const char **argv) {
return true;
}
- _vm->renderImage(atoi(argv[1]), atoi(argv[2]));
+ int image = atoi(argv[1]);
+ if (_vm->setCurrentImage(image))
+ _vm->renderImage(atoi(argv[2]));
+ else
+ debugPrintf("Image %d is invalid!", image);
return true;
}
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index ba38fd3..92d216a 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -149,13 +149,15 @@ void Intro::titleScreen() {
CursorMan.showMouse(false);
_vm->_brightness = 0;
_vm->paletteBrightness();
- _vm->renderImage(1, 0);
+ _vm->setCurrentImage(1);
+ _vm->renderImage(0);
_vm->paletteFadeIn();
_gm->getInput();
_vm->paletteFadeOut();
// Title Screen
- _vm->renderImage(31, 0);
+ _vm->setCurrentImage(31);
+ _vm->renderImage(0);
_vm->paletteFadeIn();
_gm->wait2(1);
_vm->playSound(kAudioVoiceSupernova);
@@ -198,13 +200,13 @@ void Intro::titleFadeIn() {
}
}
-bool Intro::animate(int filenumber, int section1, int section2, int duration) {
+bool Intro::animate(int section1, int section2, int duration) {
Common::KeyCode key = Common::KEYCODE_INVALID;
while (duration) {
- _vm->renderImage(filenumber, section1);
+ _vm->renderImage(section1);
if (_gm->waitOnInput(2, key))
return key != Common::KEYCODE_ESCAPE;
- _vm->renderImage(filenumber, section2);
+ _vm->renderImage(section2);
if (_gm->waitOnInput(2, key))
return key != Common::KEYCODE_ESCAPE;
--duration;
@@ -212,7 +214,7 @@ bool Intro::animate(int filenumber, int section1, int section2, int duration) {
return true;
}
-bool Intro::animate(int filenumber, int section1, int section2, int duration,
+bool Intro::animate(int section1, int section2, int duration,
MessagePosition position, StringID textId) {
Common::KeyCode key = Common::KEYCODE_INVALID;
const Common::String& text = _vm->getGameString(textId);
@@ -220,13 +222,13 @@ bool Intro::animate(int filenumber, int section1, int section2, int duration,
int delay = (MIN(text.size(), (uint)512) + 20) * (10 - duration) * _vm->_textSpeed / 400;
while (delay) {
if (section1)
- _vm->renderImage(filenumber, section1);
+ _vm->renderImage(section1);
if (_gm->waitOnInput(2, key)) {
_vm->removeMessage();
return key != Common::KEYCODE_ESCAPE;
}
if (section2)
- _vm->renderImage(filenumber, section2);
+ _vm->renderImage(section2);
if (_gm->waitOnInput(2, key)) {
_vm->removeMessage();
return key != Common::KEYCODE_ESCAPE;
@@ -237,7 +239,7 @@ bool Intro::animate(int filenumber, int section1, int section2, int duration,
return true;
}
-bool Intro::animate(int filenumber, int section1, int section2, int section3, int section4,
+bool Intro::animate(int section1, int section2, int section3, int section4,
int duration, MessagePosition position, StringID textId) {
Common::KeyCode key = Common::KEYCODE_INVALID;
const Common::String& text = _vm->getGameString(textId);
@@ -246,14 +248,14 @@ bool Intro::animate(int filenumber, int section1, int section2, int section3, in
duration = (MIN(text.size(), (uint)512) + 20) * _vm->_textSpeed / 40;
while(duration) {
- _vm->renderImage(filenumber, section1);
- _vm->renderImage(filenumber, section3);
+ _vm->renderImage(section1);
+ _vm->renderImage(section3);
if (_gm->waitOnInput(2, key)) {
_vm->removeMessage();
return key != Common::KEYCODE_ESCAPE;
}
- _vm->renderImage(filenumber, section2);
- _vm->renderImage(filenumber, section4);
+ _vm->renderImage(section2);
+ _vm->renderImage(section4);
if (_gm->waitOnInput(2, key)) {
_vm->removeMessage();
return key != Common::KEYCODE_ESCAPE;
@@ -272,39 +274,41 @@ void Intro::cutscene() {
} while (0);
_vm->_system->fillScreen(kColorBlack);
+ _vm->setCurrentImage(31);
_vm->_menuBrightness = 255;
_vm->paletteBrightness();
- if (!animate(31, 0, 0, 0, kMessageNormal, kStringIntroCutscene1))
+ if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene1))
return;
_vm->_menuBrightness = 0;
_vm->paletteBrightness();
exitOnEscape(1);
- _vm->renderImage(9, 0);
- _vm->renderImage(9, 1);
- _vm->renderImage(9, 9);
+ _vm->setCurrentImage(9);
+ _vm->renderImage(0);
+ _vm->renderImage(1);
+ _vm->renderImage(9);
_vm->paletteFadeIn();
- if (!animate(9, 11, 10, 6, kMessageRight, kStringIntroCutscene2))
+ if (!animate(11, 10, 6, kMessageRight, kStringIntroCutscene2))
return;
- _vm->renderImage(9, 3);
+ _vm->renderImage(3);
exitOnEscape(4);
- _vm->renderImage(9, 4);
- if (!animate(9, 11, 10, 3)) {// test duration
+ _vm->renderImage(4);
+ if (!animate(11, 10, 3)) {// test duration
_vm->removeMessage();
return;
}
_vm->removeMessage();
- if (!animate(9, 5, 4, 0, kMessageLeft, kStringIntroCutscene3))
+ if (!animate(5, 4, 0, kMessageLeft, kStringIntroCutscene3))
return;
- _vm->renderImage(9, 3);
+ _vm->renderImage(3);
exitOnEscape(3);
- _vm->renderImage(9, 2);
+ _vm->renderImage(2);
exitOnEscape(3);
- _vm->renderImage(9, 7);
+ _vm->renderImage(7);
exitOnEscape(6);
- _vm->renderImage(9, 6);
+ _vm->renderImage(6);
exitOnEscape(6);
- if (!animate(9, 0, 0, 0, kMessageLeft, kStringIntroCutscene4))
+ if (!animate(0, 0, 0, kMessageLeft, kStringIntroCutscene4))
return;
_vm->renderMessage(kStringIntroCutscene5, kMessageLeft);
exitOnEscape(28);
@@ -315,12 +319,13 @@ void Intro::cutscene() {
StringID textCounting[4] =
{kStringIntroCutscene7, kStringIntroCutscene8, kStringIntroCutscene9, kStringIntroCutscene10};
- _vm->renderImage(31, 0);
+ _vm->setCurrentImage(31);
+ _vm->renderImage(0);
_vm->paletteBrightness();
for (int i = 0; i < 4; ++i){
_vm->renderMessage(textCounting[i], kMessageLeft);
for (int j = 0; j < 28; ++j) {
- _vm->renderImage(31, (j % 3) + 1);
+ _vm->renderImage((j % 3) + 1);
Common::KeyCode key = Common::KEYCODE_INVALID;
if (_gm->waitOnInput(1, key)) {
if (key == Common::KEYCODE_ESCAPE)
@@ -331,87 +336,88 @@ void Intro::cutscene() {
_vm->removeMessage();
}
_vm->renderMessage(kStringIntroCutscene11, kMessageLeft);
- _vm->renderImage(31, 6);
+ _vm->renderImage(6);
exitOnEscape(3);
- _vm->renderImage(31, 3);
+ _vm->renderImage(3);
exitOnEscape(3);
- _vm->renderImage(31, 4);
+ _vm->renderImage(4);
exitOnEscape(3);
- _vm->renderImage(31, 5);
+ _vm->renderImage(5);
exitOnEscape(3);
- _vm->renderImage(31, _gm->invertSection(5));
+ _vm->renderImage(_gm->invertSection(5));
exitOnEscape(18);
_vm->removeMessage();
- _vm->renderImage(9, 0);
- _vm->renderImage(9, 1);
- _vm->renderImage(9, 9);
+ _vm->setCurrentImage(9);
+ _vm->renderImage(0);
+ _vm->renderImage(1);
+ _vm->renderImage(9);
_vm->paletteBrightness();
_vm->renderBox(0, 138, 320, 62, kColorBlack);
_vm->paletteBrightness();
- if (!animate(9, 11, 10, 0, kMessageRight, kStringIntroCutscene12))
+ if (!animate(11, 10, 0, kMessageRight, kStringIntroCutscene12))
return;
- _vm->renderImage(9, 3);
+ _vm->renderImage(3);
exitOnEscape(3);
- _vm->renderImage(9, 4);
- if (!animate(9, 5, 4, 0, kMessageLeft, kStringIntroCutscene13))
+ _vm->renderImage(4);
+ if (!animate(5, 4, 0, kMessageLeft, kStringIntroCutscene13))
return;
- if (!animate(9, 0, 0, 0, kMessageCenter, kStringIntroCutscene14))
+ if (!animate(0, 0, 0, kMessageCenter, kStringIntroCutscene14))
return;
- _vm->renderImage(9, 12);
+ _vm->renderImage(12);
exitOnEscape(2);
- _vm->renderImage(9, 13);
+ _vm->renderImage(13);
exitOnEscape(2);
- _vm->renderImage(9, 14);
- if (!animate(9, 19, 20, 0, kMessageRight, kStringIntroCutscene15))
+ _vm->renderImage(14);
+ if (!animate(19, 20, 0, kMessageRight, kStringIntroCutscene15))
return;
- if (!animate(9, 0, 0, 0, kMessageCenter, kStringIntroCutscene16))
+ if (!animate(0, 0, 0, kMessageCenter, kStringIntroCutscene16))
return;
exitOnEscape(20);
- if (!animate(9, 0, 0, 0, kMessageCenter, kStringIntroCutscene17))
+ if (!animate(0, 0, 0, kMessageCenter, kStringIntroCutscene17))
return;
- if (!animate(9, 19, 20, 0, kMessageRight, kStringIntroCutscene18))
+ if (!animate(19, 20, 0, kMessageRight, kStringIntroCutscene18))
return;
- if (!animate(9, 0, 0, 0, kMessageCenter, kStringIntroCutscene19))
+ if (!animate(0, 0, 0, kMessageCenter, kStringIntroCutscene19))
return;
- _vm->renderImage(9, 16);
+ _vm->renderImage(16);
exitOnEscape(3);
- _vm->renderImage(9, 17);
- if (!animate(9, 19, 20, 18, 17, 0, kMessageRight, kStringIntroCutscene20))
+ _vm->renderImage(17);
+ if (!animate(19, 20, 18, 17, 0, kMessageRight, kStringIntroCutscene20))
return;
- if (!animate(9, 19, 20, 18, 17, 0, kMessageRight, kStringIntroCutscene21))
+ if (!animate(19, 20, 18, 17, 0, kMessageRight, kStringIntroCutscene21))
return;
- if (!animate(9, 5, 4, 0, kMessageLeft, kStringIntroCutscene3))
+ if (!animate(5, 4, 0, kMessageLeft, kStringIntroCutscene3))
return;
- _vm->renderImage(9, 3);
+ _vm->renderImage(3);
exitOnEscape(3);
- _vm->renderImage(9, 2);
+ _vm->renderImage(2);
exitOnEscape(3);
- _vm->renderImage(9, 8);
+ _vm->renderImage(8);
exitOnEscape(6);
- _vm->renderImage(9, 6);
+ _vm->renderImage(6);
_vm->playSound(kAudioSiren);
exitOnEscape(6);
- _vm->renderImage(9, 3);
+ _vm->renderImage(3);
exitOnEscape(3);
- _vm->renderImage(9, 4);
- _vm->renderImage(9, 16);
+ _vm->renderImage(4);
+ _vm->renderImage(16);
exitOnEscape(3);
- _vm->renderImage(9, 15);
- if (!animate(9, 19, 20, 0, kMessageRight, kStringIntroCutscene22))
+ _vm->renderImage(15);
+ if (!animate(19, 20, 0, kMessageRight, kStringIntroCutscene22))
return;
- if (!animate(9, 19, 20, 0, kMessageRight, kStringIntroCutscene23))
+ if (!animate(19, 20, 0, kMessageRight, kStringIntroCutscene23))
return;
exitOnEscape(10);
- _vm->renderImage(9, 13);
+ _vm->renderImage(13);
exitOnEscape(2);
- _vm->renderImage(9, 12);
+ _vm->renderImage(12);
exitOnEscape(2);
- _vm->renderImage(9, 9);
- if (!animate(9, 11, 10, 0, kMessageRight, kStringIntroCutscene24))
+ _vm->renderImage(9);
+ if (!animate(11, 10, 0, kMessageRight, kStringIntroCutscene24))
return;
- if (!animate(9, 5, 4, 0, kMessageLeft, kStringIntroCutscene3))
+ if (!animate(5, 4, 0, kMessageLeft, kStringIntroCutscene3))
return;
_vm->paletteFadeOut();
@@ -421,27 +427,28 @@ void Intro::cutscene() {
_vm->_system->fillScreen(kColorBlack);
_vm->_menuBrightness = 255;
_vm->paletteBrightness();
- if (!animate(9, 0, 0, 0, kMessageNormal, kStringIntroCutscene25))
+ if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene25))
return;
_vm->_menuBrightness = 5;
_vm->paletteBrightness();
- _vm->renderImage(31, 0);
+ _vm->setCurrentImage(31);
+ _vm->renderImage(0);
_vm->paletteFadeIn();
- if (!animate(31, 0, 0, 0, kMessageNormal, kStringIntroCutscene26))
+ if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene26))
return;
- if (!animate(31, 0, 0, 0, kMessageNormal, kStringIntroCutscene27))
+ if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene27))
return;
- if (!animate(31, 0, 0, 0, kMessageNormal, kStringIntroCutscene28))
+ if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene28))
return;
- if (!animate(31, 0, 0, 0, kMessageNormal, kStringIntroCutscene29))
+ if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene29))
return;
exitOnEscape(54);
- if (!animate(31, 0, 0, 0, kMessageNormal, kStringIntroCutscene30))
+ if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene30))
return;
- if (!animate(31, 0, 0, 0, kMessageNormal, kStringIntroCutscene31))
+ if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene31))
return;
- if (!animate(31, 0, 0, 0, kMessageNormal, kStringIntroCutscene32))
+ if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene32))
return;
_vm->_brightness = 0;
@@ -459,29 +466,30 @@ void Intro::cutscene() {
while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
;
exitOnEscape(30);
- if (!animate(22, 0, 0, 0, kMessageNormal, kStringIntroCutscene33))
+ _vm->setCurrentImage(22);
+ if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene33))
return;
exitOnEscape(18);
- if (!animate(22, 0, 0, 0, kMessageNormal, kStringIntroCutscene34))
+ if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene34))
return;
- if (!animate(22, 0, 0, 0, kMessageNormal, kStringIntroCutscene35))
+ if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene35))
return;
- if (!animate(22, 0, 0, 0, kMessageNormal, kStringIntroCutscene36))
+ if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene36))
return;
- if (!animate(22, 0, 0, 0, kMessageNormal, kStringIntroCutscene37))
+ if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene37))
return;
exitOnEscape(18);
- if (!animate(22, 0, 0, 0, kMessageNormal, kStringIntroCutscene38))
+ if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene38))
return;
- if (!animate(22, 0, 0, 0, kMessageNormal, kStringIntroCutscene39))
+ if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene39))
return;
exitOnEscape(18);
- if (!animate(22, 0, 0, 0, kMessageNormal, kStringIntroCutscene40))
+ if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene40))
return;
- if (!animate(22, 0, 0, 0, kMessageNormal, kStringIntroCutscene41))
+ if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene41))
return;
exitOnEscape(36);
- animate(22, 0, 0, 0, kMessageNormal, kStringIntroCutscene42);
+ animate(0, 0, 0, kMessageNormal, kStringIntroCutscene42);
_vm->removeMessage();
#undef exitOnEscape
@@ -1503,7 +1511,8 @@ bool ArsanoMeetup::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_WALK) && (obj1._id == STAR)) {
_vm->renderMessage(kStringArsanoMeetup2);
} else if ((verb == ACTION_LOOK) && (obj1._id == STAR)) {
- _vm->renderImage(26, 0);
+ _vm->setCurrentImage(26);
+ _vm->renderImage(0);
_vm->paletteBrightness();
_gm->animationOff();
_gm->getInput();
@@ -2151,7 +2160,8 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
((obj1._id == SPACESHIP) || (obj1._id == ROGER_W))) ||
((verb == ACTION_TALK) && (obj1._id == ROGER_W))) {
_gm->changeRoom(INTRO);
- _vm->renderImage(30, 0);
+ _vm->setCurrentImage(30);
+ _vm->renderImage(0);
_vm->paletteBrightness();
bool found;
if (sentenceRemoved(0, 2) || sentenceRemoved(1, 2)) {
@@ -2187,35 +2197,38 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
_vm->paletteBrightness();
shipStart();
if (flight) {
- _vm->renderImage(13, 0);
+ _vm->setCurrentImage(13);
+ _vm->renderImage(0);
_vm->paletteBrightness();
_gm->wait2(36);
for (int i = 1; i <= 13; i++) {
if (i > 1)
- _vm->renderImage(13, _gm->invertSection(i - 1));
- _vm->renderImage(13, i);
+ _vm->renderImage(_gm->invertSection(i - 1));
+ _vm->renderImage(i);
_gm->wait2(2);
}
- _vm->renderImage(13, _gm->invertSection(13));
+ _vm->renderImage(_gm->invertSection(13));
_gm->wait2(20);
- _vm->renderImage(14, 0);
+ _vm->setCurrentImage(14);
+ _vm->renderImage(0);
_vm->paletteBrightness();
_gm->wait2(36);
for (int i = 1; i <= 13; i++) {
if (i > 1)
- _vm->renderImage(14, _gm->invertSection(i - 1));
- _vm->renderImage(14, i);
+ _vm->renderImage(_gm->invertSection(i - 1));
+ _vm->renderImage(i);
_gm->wait2(2);
}
- _vm->renderImage(14, _gm->invertSection(13));
+ _vm->renderImage(_gm->invertSection(13));
_gm->wait2(9);
_vm->playSound(kAudioCrash);
for (int i = 14; i <= 19; i++) {
- _vm->renderImage(14, i);
+ _vm->renderImage(i);
_gm->wait2(3);
}
_vm->paletteFadeOut();
- _vm->renderImage(11, 0);
+ _vm->setCurrentImage(11);
+ _vm->renderImage(0);
_vm->paletteFadeIn();
_gm->wait2(18);
_vm->renderMessage(kStringArsanoMeetup2_12);
@@ -2266,7 +2279,8 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_WALK) && (obj1._id == STAR))
_vm->renderMessage(kStringArsanoMeetup2);
else if ((verb == ACTION_LOOK) && (obj1._id == STAR)) {
- _vm->renderImage(26, 0);
+ _vm->setCurrentImage(26);
+ _vm->renderImage(0);
_vm->paletteBrightness();
_gm->getInput();
g_system->fillScreen(kColorBlack);
@@ -2274,27 +2288,29 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
// CHECKME: Doesn't look complete - check sb_meetup()
} else if ((verb == ACTION_WALK) && (obj1._id == UFO)) {
g_system->fillScreen(kColorBlack);
- _vm->renderImage(36, 0);
+ _vm->setCurrentImage(36);
+ _vm->renderImage(0);
_vm->paletteBrightness();
_gm->dialog(3, rowsX, _dialogsX, 0);
- _vm->renderImage(36, 1);
+ _vm->renderImage(1);
_gm->wait2(3);
- _vm->renderImage(36, 2);
+ _vm->renderImage(2);
_gm->wait2(3);
- _vm->renderImage(36, 3);
+ _vm->renderImage(3);
_gm->wait2(6);
- _vm->renderImage(36, 4);
+ _vm->renderImage(4);
_vm->playSound(kAudioGunShot);
// TODO: wait until audio finished playing
- _vm->renderImage(36, 5);
+ _vm->renderImage(5);
_gm->wait2(3);
- _vm->renderImage(36, 4);
+ _vm->renderImage(4);
_vm->playSound(kAudioGunShot);
// TODO: wait until audio finished playing
- _vm->renderImage(36, 5);
+ _vm->renderImage(5);
_vm->paletteFadeOut();
_gm->wait2(12);
- _vm->renderImage(0, 0);
+ _vm->setCurrentImage(0);
+ _vm->renderImage(0);
_vm->paletteFadeIn();
_gm->wait2(18);
_gm->reply(kStringArsanoMeetup3_1, 2, 2 + 128);
@@ -2645,7 +2661,8 @@ void AxacussCorridor5::stopInteract(int sum) {
bool AxacussCorridor5::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_WALK) && (obj1._id == DOOR)) {
g_system->fillScreen(kColorBlack);
- _vm->renderImage(41, 0);
+ _vm->setCurrentImage(41);
+ _vm->renderImage(0);
_vm->paletteBrightness();
if (_gm->_guiEnabled) {
_gm->reply(kStringAxacussCorridor5_1, 1, 1 + 128);
@@ -3084,7 +3101,8 @@ bool AxacussOffice5::interact(Action verb, Object &obj1, Object &obj2) {
bool AxacussElevator::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_WALK) && (obj1._id == DOOR)) {
g_system->fillScreen(kColorBlack);
- _vm->renderImage(41, 0);
+ _vm->setCurrentImage(41);
+ _vm->renderImage(0);
_vm->paletteBrightness();
_gm->reply(kStringAxacussElevator_1, 1, 1 + 128);
_gm->say(kStringAxacussElevator_2);
@@ -3150,21 +3168,22 @@ bool AxacussStation::interact(Action verb, Object &obj1, Object &obj2) {
obj1.hasProperty(OPENED)) {
_gm->great(0);
_vm->paletteFadeOut();
- _vm->renderImage(35, 0);
- _vm->renderImage(35, 1);
+ _vm->setCurrentImage(35);
+ _vm->renderImage(0);
+ _vm->renderImage(1);
_vm->paletteFadeIn();
_gm->wait2(10);
for (int i = 8; i <= 21; i++) {
- _vm->renderImage(35, i);
+ _vm->renderImage(i);
_gm->wait2(2);
- _vm->renderImage(35, _gm->invertSection(i));
+ _vm->renderImage(_gm->invertSection(i));
}
_gm->wait2(18);
- _vm->renderImage(35, _gm->invertSection(1));
+ _vm->renderImage(_gm->invertSection(1));
for (int i = 2; i <= 7; i++) {
- _vm->renderImage(35, _gm->invertSection(i));
+ _vm->renderImage(_gm->invertSection(i));
_gm->wait2(3);
- _vm->renderImage(35, _gm->invertSection(i));
+ _vm->renderImage(_gm->invertSection(i));
}
_gm->outro();
} else {
@@ -3221,10 +3240,11 @@ void Outro::animation() {
}
void Outro::animate(int filenumber, int section1, int section2, int duration) {
+ _vm->setCurrentImage(filenumber);
while (duration) {
- _vm->renderImage(filenumber, section1);
+ _vm->renderImage(section1);
_gm->wait2(2);
- _vm->renderImage(filenumber, section2);
+ _vm->renderImage(section2);
_gm->wait2(2);
--duration;
}
@@ -3234,12 +3254,13 @@ void Outro::animate(int filenumber, int section1, int section2, int duration,
MessagePosition position, const char *text) {
_vm->renderMessage(text, position);
int delay = (Common::strnlen(text, 512) + 20) * (10 - duration) * _vm->_textSpeed / 400;
+ _vm->setCurrentImage(filenumber);
while (delay) {
if (section1)
- _vm->renderImage(filenumber, section1);
+ _vm->renderImage(section1);
_gm->wait2(2);
if (section2)
- _vm->renderImage(filenumber, section2);
+ _vm->renderImage(section2);
_gm->wait2(2);
--delay;
}
@@ -3252,12 +3273,13 @@ void Outro::animate(int filenumber, int section1, int section2, int section3, in
if (duration == 0)
duration = (Common::strnlen(text, 512) + 20) * _vm->_textSpeed / 40;
+ _vm->setCurrentImage(filenumber);
while(duration) {
- _vm->renderImage(filenumber, section1);
- _vm->renderImage(filenumber, section3);
+ _vm->renderImage(section1);
+ _vm->renderImage(section3);
_gm->wait2(2);
- _vm->renderImage(filenumber, section2);
- _vm->renderImage(filenumber, section4);
+ _vm->renderImage(section2);
+ _vm->renderImage(section4);
_gm->wait2(2);
duration--;
}
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 402c4d6..89609ea 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -127,10 +127,10 @@ public:
virtual void onEntrance();
private:
- bool animate(int filenumber, int section1, int section2, int duration);
- bool animate(int filenumber, int section1, int section2, int duration, MessagePosition position,
+ bool animate(int section1, int section2, int duration);
+ bool animate(int section1, int section2, int duration, MessagePosition position,
StringID text);
- bool animate(int filenumber, int section1, int section2, int section3, int section4, int duration,
+ bool animate(int section1, int section2, int section3, int section4, int duration,
MessagePosition position, StringID text);
void titleScreen();
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index d78c45c..11ef049 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -760,7 +760,8 @@ void GameManager::supernovaEvent() {
_vm->renderMessage(kStringSupernova2);
waitOnInput(_timer1);
_vm->removeMessage();
- _vm->renderImage(26, 0);
+ _vm->setCurrentImage(26);
+ _vm->renderImage(0);
_vm->paletteBrightness();
novaScroll();
_vm->paletteFadeOut();
@@ -873,7 +874,8 @@ void GameManager::outro() {
_vm->playSoundMod(49);
// title = 0;
_vm->paletteFadeOut();
- _vm->renderImage(55, 0);
+ _vm->setCurrentImage(55);
+ _vm->renderImage(0);
_vm->paletteFadeIn();
getInput();
_vm->paletteFadeOut();
@@ -1463,7 +1465,8 @@ void GameManager::closeLocker(const Room *room, Object *obj, Object *lock, int s
void GameManager::dead(StringID messageId) {
_vm->paletteFadeOut();
_guiEnabled = false;
- _vm->renderImage(11, 0);
+ _vm->setCurrentImage(11);
+ _vm->renderImage(0);
_vm->renderMessage(messageId);
_vm->playSound(kAudioDeath);
_vm->paletteFadeIn();
@@ -1488,7 +1491,8 @@ void GameManager::dead(StringID messageId) {
void GameManager::dead(const char *message) {
_vm->paletteFadeOut();
_guiEnabled = false;
- _vm->renderImage(11, 0);
+ _vm->setCurrentImage(11);
+ _vm->renderImage(0);
_vm->renderMessage(message);
_vm->playSound(kAudioDeath);
_vm->paletteFadeIn();
@@ -1586,7 +1590,8 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage(kStringGenericInteract_11);
waitOnInput(_timer1);
_vm->removeMessage();
- _vm->renderImage(2, 0);
+ _vm->setCurrentImage(2);
+ _vm->renderImage(0);
_vm->setColor63(40);
getInput();
_vm->renderRoom(*_currentRoom);
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 0e7631b..64a06c2 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -457,11 +457,6 @@ void SupernovaEngine::renderImageSection(int section) {
sectionRect.width(), sectionRect.height());
}
-void SupernovaEngine::renderImage(int filenumber, int section) {
- if (setCurrentImage(filenumber))
- renderImage(section);
-}
-
void SupernovaEngine::renderImage(int section) {
bool sectionVisible = true;
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 882f6a9..6cc7b0c 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -129,7 +129,6 @@ public:
void playSoundMod(int filenumber);
void stopSound();
void renderImageSection(int section);
- void renderImage(int filenumber, int section);
void renderImage(int section);
bool setCurrentImage(int filenumber);
void saveScreen(int x, int y, int width, int height);
Commit: ca1acaf5ea76ef3c59f60e2307681b666dfd6264
https://github.com/scummvm/scummvm/commit/ca1acaf5ea76ef3c59f60e2307681b666dfd6264
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:40Z
Commit Message:
SUPERNOVA: Implement guardNoticed()
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 11ef049..3450cdf 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -651,7 +651,25 @@ void GameManager::search(int time) {
}
void GameManager::guardNoticed() {
- warning("STUB: guardNoticed");
+ _vm->paletteFadeOut();
+ Room *r = _currentRoom;
+ _currentRoom = _rooms[GUARD];
+ _vm->setCurrentImage(40);
+ _vm->renderBox(0, 0, 320, 200, 0);
+ _vm->renderImage(0);
+ _vm->paletteFadeIn();
+ _vm->renderImage(2);
+ reply("Was war das für ein Geräusch?",2,5);
+ wait2(2);
+ reply("Ich werde mal nachsehen.",2,5);
+ _vm->paletteFadeOut();
+ r->setSectionVisible(2, false);
+ r->setSectionVisible(5, false);
+ _currentRoom = r;
+ _guiEnabled = true;
+ drawMapExits();
+ // new_room = true;
+ warning("SKIPPED: new_room");
}
void GameManager::busted(int i) {
Commit: 1759d1ffdda4427e9e958fef0fc7ee99d610b2e9
https://github.com/scummvm/scummvm/commit/1759d1ffdda4427e9e958fef0fc7ee99d610b2e9
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:40Z
Commit Message:
SUPERNOVA: Implement autosave used for dream sequence
Changed paths:
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
engines/supernova/state.cpp
engines/supernova/state.h
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 19a4417..4a5cdbf 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -37,6 +37,8 @@ const int kMaxDialog = 2;
const int kMaxObject = 25;
const int kMaxCarry = 30;
+const int kSleepAutosaveSlot = 999;
+
//const int kRoomsChap0 = 1;
//const int kRoomsChap1 = 16;
//const int kRoomsChap2 = 9;
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 92d216a..d660739 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -698,8 +698,8 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
}
if (_gm->_state._arrivalDaysLeft == 0) {
_gm->saveTime();
- if (!_gm->saveGame(-2))
- _gm->errorTemp();
+ if (!_vm->saveGame(kSleepAutosaveSlot, "Sleep autosave"))
+ _vm->errorTempSave(true);
_gm->_state._dream = true;
_gm->loadTime();
}
@@ -2238,10 +2238,8 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
_vm->paletteFadeOut();
g_system->fillScreen(kColorBlack);
_gm->_state._dream = false;
- // TODO:
- // The original at this points loads a savegame from "MSN.TMP"
- // which is provided with the data file.
-// if (!load_game(-2)) error_temp();
+ if (!_vm->loadGame(kSleepAutosaveSlot))
+ _vm->errorTempSave(false);
_gm->loadTime();
_gm->_rooms[CAVE]->getObject(1)->_exitRoom = MEETUP3;
_gm->_state._dream = true;
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 3450cdf..7cf4294 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1197,19 +1197,10 @@ void GameManager::roomBrightness() {
_vm->paletteBrightness();
}
-bool GameManager::saveGame(int number) {
- warning("STUB: savegame %d", number);
- return false;
-}
-
void GameManager::changeRoom(RoomID id) {
_currentRoom = _rooms[id];
}
-void GameManager::errorTemp() {
- warning("STUB: errorTemp");
-}
-
void GameManager::wait2(int ticks) {
int32 end = _state._time + ticksToMsec(ticks);
do {
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 8a3e6bf..bd08371 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -163,8 +163,6 @@ public:
void turnOff();
void turnOn();
void screenShake();
- bool saveGame(int number);
- void errorTemp();
void roomBrightness();
void showMenu();
void animationOff();
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 64a06c2..6a2327a 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -1060,6 +1060,14 @@ bool SupernovaEngine::saveGame(int slot, const Common::String &description) {
return true;
}
+void SupernovaEngine::errorTempSave(bool saving) {
+ // TODO: At this point the engine should terminate with the error
+ // "Failed to save temporary game state. Make sure your save game directory "
+ // "is set in scummvm and that you can write to it."
+ // or
+ // "Failed to load temporary game state."
+ warning("STUB: errorTempSave");
+}
ScreenBufferStack::ScreenBufferStack()
: _last(_buffer) {
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 6cc7b0c..eeb518e 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -145,6 +145,7 @@ public:
void command_print();
bool loadGame(int slot);
bool saveGame(int slot, const Common::String &description);
+ void errorTempSave(bool saving);
void setTextSpeed();
const Common::String &getGameString(int idx) const {
Commit: 7d72ae0d0d2c02a012f6f7362f6110e503813309
https://github.com/scummvm/scummvm/commit/7d72ae0d0d2c02a012f6f7362f6110e503813309
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:40Z
Commit Message:
SUPERNOVA: Implement errorTempSave()
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 6a2327a..923b8d6 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -1061,12 +1061,10 @@ bool SupernovaEngine::saveGame(int slot, const Common::String &description) {
}
void SupernovaEngine::errorTempSave(bool saving) {
- // TODO: At this point the engine should terminate with the error
- // "Failed to save temporary game state. Make sure your save game directory "
- // "is set in scummvm and that you can write to it."
- // or
- // "Failed to load temporary game state."
- warning("STUB: errorTempSave");
+ GUIErrorMessage(saving
+ ? "Failed to save temporary game state. Make sure your save game directory is set in ScummVM and that you can write to it."
+ : "Failed to load temporary game state.");
+ error("Unrecoverable error");
}
ScreenBufferStack::ScreenBufferStack()
Commit: 96afb54cc6457feec3ef9cac91a5f53a319b485e
https://github.com/scummvm/scummvm/commit/96afb54cc6457feec3ef9cac91a5f53a319b485e
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:40Z
Commit Message:
SUPERNOVA: Fix listing saves
The code was only looking at the last two digits of the file name, and
as a result the game autosaved in slot 999 was listed in slot 99.
Changed paths:
engines/supernova/detection.cpp
diff --git a/engines/supernova/detection.cpp b/engines/supernova/detection.cpp
index e3f4856..61a99f0 100644
--- a/engines/supernova/detection.cpp
+++ b/engines/supernova/detection.cpp
@@ -134,7 +134,7 @@ SaveStateList SupernovaMetaEngine::listSaves(const char *target) const {
SaveStateList saveFileList;
for (Common::StringArray::const_iterator file = filenames.begin();
file != filenames.end(); ++file) {
- int saveSlot = atoi(file->c_str() + file->size() - 2);
+ int saveSlot = atoi(file->c_str() + file->size() - 3);
if (saveSlot >= 0 && saveSlot <= getMaximumSaveSlot()) {
Common::InSaveFile *savefile = g_system->getSavefileManager()->openForLoading(*file);
if (savefile) {
Commit: 34658bc7d4dcbb041d24d2c35539814613d4307e
https://github.com/scummvm/scummvm/commit/34658bc7d4dcbb041d24d2c35539814613d4307e
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:40Z
Commit Message:
SUPERNOVA: Fix a german string
Changed paths:
devtools/create_supernova/gametext.h
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index b5d11e8..7ae25ef 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -620,7 +620,7 @@ const char *gameText[] = {
// 485
"Ja, sieht so aus.", // kStringArsanoMeetup3_2
"Sie befinden sich im Raumschiff \"Dexxa\".", // kStringArsanoMeetup3_3
- "Wir kommen vom Planeten Axacuss und|sind aus dem gleichen Grund hier wie Sie,|n?mlich zur Erforschung der Supernova.", // kStringArsanoMeetup3_4
+ "Wir kommen vom Planeten Axacuss und|sind aus dem gleichen Grund hier wie Sie,|n\204mlich zur Erforschung der Supernova.", // kStringArsanoMeetup3_4
"Sie k\224nnen beruhigt sein, wir wollen Ihnen nur helfen.", // kStringArsanoMeetup3_5
"Und wieso hat der Typ im Raumanzug|eben auf mich geschossen?", // kStringArsanoMeetup3_6
// 490
Commit: 87ab33a8aa585be4f83a53a2aee60c674872fbb4
https://github.com/scummvm/scummvm/commit/87ab33a8aa585be4f83a53a2aee60c674872fbb4
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:41Z
Commit Message:
SUPERNOVA: Fix several issues with savegames
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/state.cpp
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index d660739..96e8eaf 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2243,6 +2243,7 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
_gm->loadTime();
_gm->_rooms[CAVE]->getObject(1)->_exitRoom = MEETUP3;
_gm->_state._dream = true;
+ _vm->paletteFadeIn();
}
} else {
_gm->changeRoom(MEETUP2);
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 7cf4294..95f48e4 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -127,6 +127,10 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
}
changeRoom(curRoomId);
+ // Some additional variables
+ _guiEnabled = true;
+ _animationEnabled = true;
+
return !in->err();
}
@@ -989,6 +993,9 @@ void GameManager::reply(const char *text, int aus1, int aus2) {
}
int GameManager::dialog(int num, byte rowLength[6], StringID text[6], int number) {
+ _vm->_allowLoadGame = false;
+ _guiEnabled = false;
+
bool remove[6];
for (int i = 0; i < 5; ++i)
remove[i] = _currentRoom->sentenceRemoved(i, number);
@@ -1015,18 +1022,19 @@ int GameManager::dialog(int num, byte rowLength[6], StringID text[6], int number
rq += rowLength[i];
}
- _guiEnabled = false;
_currentSentence = -1;
do {
mouseInput3();
} while (_currentSentence == -1 && !_vm->shouldQuit());
- _guiEnabled = true;
_vm->renderBox(0, 138, 320, 62, kColorBlack);
if (number && _texts[_rowsStart[_currentSentence]] != kStringDialogSeparator)
_currentRoom->removeSentence(_currentSentence, number);
+ _guiEnabled = true;
+ _vm->_allowLoadGame = true;
+
return _currentSentence;
}
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 923b8d6..80a8404 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -982,7 +982,8 @@ Common::Error SupernovaEngine::loadGameState(int slot) {
}
bool SupernovaEngine::canSaveGameStateCurrently() {
- return _allowSaveGame;
+ // Do not allow saving when either _allowSaveGame, _animationEnabled or _guiEnabled is false
+ return _allowSaveGame && _gm->_animationEnabled && _gm->_guiEnabled;
}
Common::Error SupernovaEngine::saveGameState(int slot, const Common::String &desc) {
@@ -1024,6 +1025,13 @@ bool SupernovaEngine::loadGame(int slot) {
Graphics::skipThumbnail(*savefile);
_gm->deserialize(savefile, saveVersion);
+ if (saveVersion >= 5) {
+ _menuBrightness = savefile->readByte();
+ _brightness = savefile->readByte();
+ } else {
+ _menuBrightness = _brightness = 255;
+ }
+
delete savefile;
return true;
@@ -1054,6 +1062,9 @@ bool SupernovaEngine::saveGame(int slot, const Common::String &description) {
Graphics::saveThumbnail(*savefile);
_gm->serialize(savefile);
+ savefile->writeByte(_menuBrightness);
+ savefile->writeByte(_brightness);
+
savefile->finalize();
delete savefile;
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index eeb518e..8aace03 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -43,7 +43,7 @@
namespace Supernova {
#define SAVEGAME_HEADER MKTAG('M','S','N','1')
-#define SAVEGAME_VERSION 4
+#define SAVEGAME_VERSION 5
#define SUPERNOVA_DAT "supernova.dat"
#define SUPERNOVA_DAT_VERSION 1
Commit: cbfa0a0640eeeb2c86edd9c8d4f3e5925c437e05
https://github.com/scummvm/scummvm/commit/cbfa0a0640eeeb2c86edd9c8d4f3e5925c437e05
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:41Z
Commit Message:
SUPERNOVA: Fix some TODOs
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 96e8eaf..3c3ef94 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2299,12 +2299,18 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
_gm->wait2(6);
_vm->renderImage(4);
_vm->playSound(kAudioGunShot);
- // TODO: wait until audio finished playing
+
+ while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
+ _gm->wait2(1);
+
_vm->renderImage(5);
_gm->wait2(3);
_vm->renderImage(4);
_vm->playSound(kAudioGunShot);
- // TODO: wait until audio finished playing
+
+ while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
+ _gm->wait2(1);
+
_vm->renderImage(5);
_vm->paletteFadeOut();
_gm->wait2(12);
@@ -2533,7 +2539,10 @@ bool AxacussCell::interact(Action verb, Object &obj1, Object &obj2) {
if (isSectionVisible(30) || isSectionVisible(29))
return false;
_vm->playSound(kAudioGunShot);
- // TODO: wait till sound is played
+
+ while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
+ _gm->wait2(1);
+
_vm->playSound(kAudioGunShot);
_vm->playSound(kAudioGunShot);
_gm->dead(kStringAxacussCell_4);
Commit: 177539ba2ed85af4aa27a72110948063a8257a03
https://github.com/scummvm/scummvm/commit/177539ba2ed85af4aa27a72110948063a8257a03
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:41Z
Commit Message:
SUPERNOVA: Load images on demand
Changed paths:
engines/supernova/graphics.cpp
engines/supernova/state.cpp
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index ee2bfe8..d461d79 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -50,7 +50,8 @@ MSNImageDecoder::~MSNImageDecoder() {
bool MSNImageDecoder::init(int filenumber) {
Common::File file;
if (!file.open(Common::String::format("msn_data.%03d", filenumber))) {
- error("File %s could not be read!", file.getName());
+ warning("Image data file %s could not be read!", file.getName());
+ return false;
}
_filenumber = filenumber;
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 95f48e4..2aa5546 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -594,7 +594,7 @@ void GameManager::processInput() {
for (int i = 0; (_currentRoom->getObject(i)->_id != INVALIDOBJECT) &&
(field == -1) && i < kMaxObject; i++) {
click = _currentRoom->getObject(i)->_click;
- if (click != 255) {
+ if (click != 255 && _vm->_currentImage) {
MSNImageDecoder::ClickField *clickField = _vm->_currentImage->_clickField;
do {
if ((_mouseX >= clickField[click].x1) && (_mouseX <= clickField[click].x2) &&
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 80a8404..56ea113 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -100,7 +100,7 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)
: Engine(syst)
, _console(NULL)
, _gm(NULL)
- , _currentImage(_images)
+ , _currentImage(NULL)
, _brightness(255)
, _menuBrightness(255)
, _delay(33)
@@ -126,6 +126,7 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)
SupernovaEngine::~SupernovaEngine() {
DebugMan.clearAllDebugChannels();
+ delete _currentImage;
delete _rnd;
delete _console;
delete _gm;
@@ -329,10 +330,6 @@ Common::Error SupernovaEngine::loadGameStrings() {
}
void SupernovaEngine::initData() {
- // Images
- for (int i = 0; i < 44; ++i)
- _images[i].init(i);
-
// Sound
// Note:
// - samples start with a header of 6 bytes: 01 SS SS 00 AD 00
@@ -458,6 +455,9 @@ void SupernovaEngine::renderImageSection(int section) {
}
void SupernovaEngine::renderImage(int section) {
+ if (!_currentImage)
+ return;
+
bool sectionVisible = true;
if (section > 128) {
@@ -477,12 +477,17 @@ void SupernovaEngine::renderImage(int section) {
}
bool SupernovaEngine::setCurrentImage(int filenumber) {
- if (filenumber == -1 || filenumber > ARRAYSIZE(_images) - 1) {
- warning("Trying to display image from out of bound file number %d", filenumber);
+ if (_currentImage && _currentImage->_filenumber == filenumber)
+ return true;
+
+ delete _currentImage;
+ _currentImage = new MSNImageDecoder();
+ if (!_currentImage->init(filenumber)) {
+ delete _currentImage;
+ _currentImage = NULL;
return false;
}
- _currentImage = &(_images[filenumber]);
_system->getPaletteManager()->setPalette(_currentImage->getPalette(), 16, 239);
paletteBrightness();
return true;
@@ -690,7 +695,7 @@ void SupernovaEngine::paletteBrightness() {
}
for (uint i = 0; i < 717; ++i) {
const byte *imagePalette;
- if (_currentImage->getPalette()) {
+ if (_currentImage && _currentImage->getPalette()) {
imagePalette = _currentImage->getPalette();
} else {
imagePalette = palette + 48;
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 8aace03..895f49d 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -90,9 +90,6 @@ public:
ScreenBufferStack _screenBuffer;
byte _mouseNormal[256];
byte _mouseWait[256];
- // TODO check this! There are 56 data files (0 to 55) and at least the outro
- // tries to displayimage from file 55 (and fails!).
- MSNImageDecoder _images[44];
MSNImageDecoder *_currentImage;
struct SoundSample {
byte *_buffer;
Commit: 1ff953b8159110ce0707404746214f6a52ce8a1f
https://github.com/scummvm/scummvm/commit/1ff953b8159110ce0707404746214f6a52ce8a1f
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:41Z
Commit Message:
SUPERNOVA: Move 2 strings to the DAT file
Changed paths:
devtools/create_supernova/gametext.h
engines/supernova/msn_def.h
engines/supernova/state.cpp
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index 7ae25ef..8f2b623 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -787,6 +787,8 @@ const char *gameText[] = {
"Zehn Minuten sp\204ter ...", // kStringSupernova8
//625
"Textgeschwindigkeit:", // kStringTextSpeed
+ "Was war das f\201r ein Ger\204usch?", // kStringGuardNoticed1
+ "Ich werde mal nachsehen.", // kStringGuardNoticed2
NULL
};
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 4a5cdbf..151ad3c 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -553,7 +553,7 @@ enum StringID {
kStringGenericInteract_43, kStringConversationEnd, kStringSupernova1, kStringSupernova2, kStringSupernova3,
kStringSupernova4, kStringSupernova5, kStringSupernova6, kStringSupernova7, kStringSupernova8,
// 625
- kStringTextSpeed
+ kStringTextSpeed, kStringGuardNoticed1, kStringGuardNoticed2
};
static StringID guiCommands[] = {
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 2aa5546..1e7ebc8 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -663,9 +663,9 @@ void GameManager::guardNoticed() {
_vm->renderImage(0);
_vm->paletteFadeIn();
_vm->renderImage(2);
- reply("Was war das für ein Geräusch?",2,5);
+ reply(kStringGuardNoticed1, 2, 5);
wait2(2);
- reply("Ich werde mal nachsehen.",2,5);
+ reply(kStringGuardNoticed2, 2, 5);
_vm->paletteFadeOut();
r->setSectionVisible(2, false);
r->setSectionVisible(5, false);
Commit: 55fc09571f52c26392a0b54951db650968e99ff2
https://github.com/scummvm/scummvm/commit/55fc09571f52c26392a0b54951db650968e99ff2
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:41Z
Commit Message:
SUPERNOVA: Fix handling of room brightness
There were several issues with the brighness due to the different
implementation between the original and the code in scummvm. The
code has now been modified to be much closer to the original, which
fixed those issues and allowed to remove workarounds that had been
added in various places to deal with those issues (but those
workarounds had their own issues such as fade in happening too
soon before switching to the new room).
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/state.cpp
engines/supernova/state.h
engines/supernova/supernova.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 3c3ef94..5dfb6c8 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -1020,8 +1020,6 @@ void ShipCabinR3::onEntrance() {
for (int i = 0; i < 3; ++i)
_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(i));
- _vm->paletteBrightness();
- _vm->paletteFadeIn();
setRoomSeen(true);
}
@@ -2243,7 +2241,6 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
_gm->loadTime();
_gm->_rooms[CAVE]->getObject(1)->_exitRoom = MEETUP3;
_gm->_state._dream = true;
- _vm->paletteFadeIn();
}
} else {
_gm->changeRoom(MEETUP2);
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 1e7ebc8..3907370 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -325,6 +325,7 @@ void GameManager::initState() {
_processInput = false;
_guiEnabled = true;
_animationEnabled = true;
+ _roomBrightness = 255;
_mouseClicked = false;
_keyPressed = false;
_mouseX = -1;
@@ -832,7 +833,6 @@ void GameManager::supernovaEvent() {
_rooms[MEETUP2]->removeSentence(0, 1);
}
_rooms[MEETUP2]->removeSentence(1, 1);
- _vm->paletteFadeIn();
}
_rooms[AIRLOCK]->getObject(4)->setProperty(WORN);
_rooms[AIRLOCK]->getObject(5)->setProperty(WORN);
@@ -1048,7 +1048,12 @@ void GameManager::mousePosDialog(int x, int y) {
}
void GameManager::turnOff() {
+ if (_state._powerOff)
+ return;
+
_state._powerOff = true;
+ roomBrightness();
+ _vm->paletteBrightness();
}
void GameManager::turnOn() {
@@ -1191,18 +1196,19 @@ void GameManager::mouseInput3() {
}
void GameManager::roomBrightness() {
- _vm->_brightness = 255;
+ _roomBrightness = 255;
if ((_currentRoom->getId() != OUTSIDE) && (_currentRoom->getId() < ROCKS) ) {
if (_state._powerOff)
- _vm->_brightness = 153;
+ _roomBrightness = 153;
} else if (_currentRoom->getId() == CAVE) {
- _vm->_brightness = 0;
+ _roomBrightness = 0;
} else if (_currentRoom->getId() == GUARD3) {
if (_state._powerOff)
- _vm->_brightness = 0;
+ _roomBrightness = 0;
}
- _vm->paletteBrightness();
+ if (_vm->_brightness != 0)
+ _vm->_brightness = _roomBrightness;
}
void GameManager::changeRoom(RoomID id) {
@@ -1613,6 +1619,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
getInput();
_vm->renderRoom(*_currentRoom);
roomBrightness();
+ _vm->paletteBrightness();
_vm->renderMessage(kStringGenericInteract_12);
} else if ((verb == ACTION_LOOK) && (obj1._id == KEYCARD2)) {
_vm->renderMessage(obj1._description);
@@ -1930,7 +1937,13 @@ void GameManager::executeRoom() {
drawStatus();
drawCommandBox();
}
+
roomBrightness();
+ if (_vm->_brightness == 0)
+ _vm->paletteFadeIn();
+ else
+ _vm->paletteBrightness();
+
if (!_currentRoom->hasSeen())
_currentRoom->onEntrance();
}
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index bd08371..9cbd68c 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -119,6 +119,7 @@ public:
bool _processInput;
bool _guiEnabled;
bool _animationEnabled;
+ byte _roomBrightness;
Action _inputVerb;
Object *_currentInputObject;
Object *_inputObject[2];
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 56ea113..395fd78 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -706,10 +706,11 @@ void SupernovaEngine::paletteBrightness() {
}
void SupernovaEngine::paletteFadeOut() {
- while (_brightness > 10) {
- _menuBrightness = _brightness;
+ while (_menuBrightness > 10) {
+ _menuBrightness -= 10;
+ if (_brightness > _menuBrightness)
+ _brightness = _menuBrightness;
paletteBrightness();
- _brightness -= 10;
_system->updateScreen();
_system->delayMillis(_delay);
}
@@ -720,15 +721,16 @@ void SupernovaEngine::paletteFadeOut() {
}
void SupernovaEngine::paletteFadeIn() {
- while (_brightness < 245) {
- _menuBrightness = _brightness;
+ while (_menuBrightness < 245) {
+ if (_brightness < _gm->_roomBrightness)
+ _brightness += 10;
+ _menuBrightness += 10;
paletteBrightness();
- _brightness += 10;
_system->updateScreen();
_system->delayMillis(_delay);
}
_menuBrightness = 255;
- _brightness = 255;
+ _brightness = _gm->_roomBrightness;
paletteBrightness();
_system->updateScreen();
}
Commit: deb6168ed197f1594b6f4c0f7447dc450f10e1f4
https://github.com/scummvm/scummvm/commit/deb6168ed197f1594b6f4c0f7447dc450f10e1f4
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:41Z
Commit Message:
SUPERNOVA: Make sure to exit bathroom to the same room from which it was entered
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 3907370..6efcd49 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1812,7 +1812,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
}
}
} else if ((verb == ACTION_WALK) && (obj1._id == BATHROOM_DOOR)) {
-// *bathroom = current_room;
+ _rooms[BATHROOM]->getObject(2)->_exitRoom = _currentRoom->getId();
return false;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, WIRE, SOCKET))
_vm->renderMessage(kStringGenericInteract_30);
Commit: 312f33af3a84341f6f13b4debc7f9e1bd5420958
https://github.com/scummvm/scummvm/commit/312f33af3a84341f6f13b4debc7f9e1bd5420958
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:41Z
Commit Message:
SUPERNOVA: Fix missing message when waking up from dream
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 5dfb6c8..44446f4 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -758,7 +758,6 @@ void ShipSleepCabin::onEntrance() {
_vm->renderMessage(kStringShipSleepCabin16);
_gm->_state._dream = false;
}
- setRoomSeen(true);
}
bool ShipCockpit::interact(Action verb, Object &obj1, Object &obj2) {
Commit: 4014f4efae4f5341794b6eed287a888b3cf32ceb
https://github.com/scummvm/scummvm/commit/4014f4efae4f5341794b6eed287a888b3cf32ceb
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:41Z
Commit Message:
SUPERNOVA: Fix timing of search events
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 6efcd49..0454509 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -651,7 +651,7 @@ void GameManager::startSearch() {
}
void GameManager::search(int time) {
- _state._eventTime = _state._time + time;
+ _state._eventTime = _state._time + ticksToMsec(time);
_state._eventCallback = kSearchStartFn;
}
Commit: cccdcf9c26671cd83c143823aa85b1443546eea7
https://github.com/scummvm/scummvm/commit/cccdcf9c26671cd83c143823aa85b1443546eea7
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:41Z
Commit Message:
SUPERNOVA: Implement guardWalkEvent
Changed paths:
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 0454509..99e03f7 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -47,6 +47,7 @@ bool GameManager::serialize(Common::WriteStream *out) {
out->writeSint16LE(_state._money);
out->writeByte(_state._coins);
out->writeByte(_state._shoes);
+ out->writeByte(_state._origin);
out->writeByte(_state._destination);
out->writeByte(_state._language);
out->writeByte(_state._corridorSearch);
@@ -98,6 +99,10 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
_state._money = in->readSint16LE();
_state._coins = in->readByte();
_state._shoes = in->readByte();
+ if (version >= 6)
+ _state._origin = in->readByte();
+ else
+ _state._origin = 0;
_state._destination = in->readByte();
_state._language = in->readByte();
_state._corridorSearch = in->readByte();
@@ -359,6 +364,7 @@ void GameManager::initState() {
_state._money = 0;
_state._coins = 0;
_state._shoes = 0;
+ _state._origin = 0;
_state._destination = 255;
_state._language = 0;
_state._corridorSearch = false;
@@ -368,6 +374,8 @@ void GameManager::initState() {
_state._cableConnected = false;
_state._powerOff = false;
_state._dream = false;
+
+ _prevImgId = 0;
}
void GameManager::initRooms() {
@@ -859,8 +867,147 @@ void GameManager::guardReturnedEvent() {
_rooms[CORRIDOR9]->getObject(1)->disableProperty(OPENED);
}
+void GameManager::walk(int imgId) {
+ if (_prevImgId)
+ _vm->renderImage(_prevImgId + 128);
+ _vm->renderImage(imgId);
+ _prevImgId = imgId;
+ wait2(3);
+}
+
void GameManager::guardWalkEvent() {
- warning("STUB: guardWalkEvent");
+ _prevImgId = 0;
+ bool behind = (!_rooms[BCORRIDOR]->getObject(_state._origin + 4)->hasProperty(OCCUPIED) || _rooms[BCORRIDOR]->getObject(_state._origin + 4)->hasProperty(OPENED));
+ _rooms[BCORRIDOR]->getObject(_state._origin + 4)->resetProperty(OCCUPIED);
+ if (_currentRoom == _rooms[BCORRIDOR]) {
+ if (_vm->_messageDisplayed)
+ _vm->removeMessage();
+
+ if (!behind) {
+ _vm->renderImage(_state._origin + 1);
+ _prevImgId = _state._origin + 1;
+ _vm->playSound(kAudioDoorOpen);
+ wait2(3);
+ }
+
+ int imgId;
+ switch (_state._origin) {
+ case 0:
+ imgId = 11;
+ break;
+ case 1:
+ imgId = 16;
+ break;
+ case 2:
+ imgId = 15;
+ break;
+ case 3:
+ default:
+ imgId = 20;
+ break;
+ }
+ _vm->renderImage(imgId);
+ if (!behind) {
+ wait2(3);
+ _vm->renderImage(_prevImgId + 128);
+ _vm->playSound(kAudioDoorClose);
+ }
+
+ _prevImgId = imgId;
+ wait2(3);
+ switch (_state._origin) {
+ case 0:
+ walk(12);
+ walk(13);
+ break;
+ case 1:
+ walk(17);
+ walk(18);
+ break;
+ case 2:
+ walk(14);
+ walk(13);
+ break;
+ case 3:
+ walk(19);
+ walk(18);
+ }
+
+ if (!_currentRoom->isSectionVisible(kMaxSection - 1)) {
+ if (_state._origin & 1)
+ walk(10);
+ else
+ walk(5);
+ busted(-1);
+ }
+
+ if ((_state._origin & 1) && !(_state._destination & 1)) {
+ for (int i = 10; i >= 5; i--)
+ walk(i);
+ walk(13);
+ } else if (!(_state._origin & 1) && (_state._destination & 1)) {
+ for (int i = 5; i <= 10; i++)
+ walk(i);
+ walk(18);
+ }
+
+ switch (_state._destination) {
+ case 0:
+ for (int i = 13; i >= 11; i--)
+ walk(i);
+ break;
+ case 1:
+ for (int i = 18; i >= 16; i--)
+ walk(i);
+ break;
+ case 2:
+ for (int i = 13; i <= 15; i++)
+ walk(i);
+ break;
+ case 3:
+ for (int i = 18; i <= 20; i++)
+ walk(i);
+ }
+
+ if (behind) {
+ _vm->renderImage(_state._destination + 1);
+ _vm->playSound(kAudioDoorOpen);
+ wait2(3);
+ _vm->renderImage(_prevImgId + 128);
+ wait2(3);
+ _vm->renderImage(_state._destination + 1 + 128);
+ _vm->playSound(kAudioDoorClose);
+ _rooms[BCORRIDOR]->getObject(_state._destination + 4)->setProperty(OCCUPIED);
+ _state._destination = 255;
+ } else if (_rooms[BCORRIDOR]->isSectionVisible(_state._destination + 1)) {
+ _vm->renderImage(_prevImgId + 128);
+ _rooms[BCORRIDOR]->getObject(_state._destination + 4)->setProperty(OCCUPIED);
+ SWAP(_state._origin, _state._destination);
+ _state._eventTime = _state._time + ticksToMsec(60);
+ _state._eventCallback = kGuardWalkFn;
+ } else {
+ wait2(18);
+ SWAP(_state._origin, _state._destination);
+ _state._eventCallback = kGuardWalkFn;
+ }
+ } else {
+ if (behind) {
+ _rooms[BCORRIDOR]->getObject(_state._destination + 4)->setProperty(OCCUPIED);
+ if (_currentRoom == _rooms[OFFICE_L1 + _state._destination])
+ busted(0);
+ _state._destination = 255;
+ } else if (_rooms[BCORRIDOR]->isSectionVisible(_state._destination + 1) && _rooms[OFFICE_L1 + _state._destination]->getObject(0)->hasProperty(OPENED)) {
+ _rooms[BCORRIDOR]->getObject(_state._destination + 4)->setProperty(OCCUPIED);
+ if (_currentRoom == _rooms[OFFICE_L1 + _state._destination])
+ busted(0);
+ SWAP(_state._origin, _state._destination);
+ _state._eventTime = _state._time + ticksToMsec(60);
+ _state._eventCallback = kGuardWalkFn;
+ } else {
+ SWAP(_state._origin, _state._destination);
+ _state._eventCallback = kGuardWalkFn;
+ }
+ }
}
void GameManager::taxiEvent() {
@@ -1433,9 +1580,9 @@ void GameManager::takeMoney(int amount) {
great(0);
// TODO: kmaxobject - 1?
// _rooms[OFFICE_R1]->getObject(5)->_name = _rooms[OFFICE_R1]->getObject(kMaxObject - 1);
-// raumz[OFFICE_R1]->object[5].name = &(raumz[OFFICE_R1]->object[MAX_OBJECT-1]);
-// strcpy(raumz[OFFICE_R1]->object[5].name,ltoa((long)_state.money));
-// strcat(raumz[OFFICE_R1]->object[5].name," Xa");
+// _rooms[OFFICE_R1]->object[5].name = &(_rooms[OFFICE_R1]->object[MAX_OBJECT-1]);
+// strcpy(_rooms[OFFICE_R1]->object[5].name,ltoa((long)_state.money));
+// strcat(_rooms[OFFICE_R1]->object[5].name," Xa");
if (_state._money) {
if (!_rooms[OFFICE_R1]->getObject(5)->hasProperty(CARRIED))
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 9cbd68c..e5403ba 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -45,6 +45,7 @@ struct GameState {
int16 _money;
byte _coins;
byte _shoes;
+ byte _origin;
byte _destination;
byte _language;
bool _corridorSearch;
@@ -205,12 +206,16 @@ public:
void novaScroll();
void supernovaEvent();
void guardReturnedEvent();
+ void walk(int a);
void guardWalkEvent();
void taxiEvent();
void searchStartEvent();
void outro();
void guardShot();
void guard3Shot();
+
+private:
+ int _prevImgId;
};
}
Commit: e2b85ab7416dbd05aa303fa43c167947c7f6e647
https://github.com/scummvm/scummvm/commit/e2b85ab7416dbd05aa303fa43c167947c7f6e647
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:41Z
Commit Message:
SUPERNOVA: Update savegame version
Changed paths:
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 895f49d..f356c77 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -43,7 +43,7 @@
namespace Supernova {
#define SAVEGAME_HEADER MKTAG('M','S','N','1')
-#define SAVEGAME_VERSION 5
+#define SAVEGAME_VERSION 6
#define SUPERNOVA_DAT "supernova.dat"
#define SUPERNOVA_DAT_VERSION 1
@@ -78,7 +78,7 @@ private:
class SupernovaEngine : public Engine {
public:
- SupernovaEngine(OSystem *syst);
+ explicit SupernovaEngine(OSystem *syst);
~SupernovaEngine();
virtual Common::Error run();
Commit: 37706ade7860aff7ac4b61d91d35c708afaa3795
https://github.com/scummvm/scummvm/commit/37706ade7860aff7ac4b61d91d35c708afaa3795
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:41Z
Commit Message:
SUPERNOVA: Implement searchStartEvent, fix bug in corridor initialization
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 99e03f7..d9f4e8c 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -411,12 +411,12 @@ void GameManager::initRooms() {
_rooms[CORRIDOR1] = new AxacussCorridor1(_vm, this);
_rooms[CORRIDOR2] = new AxacussCorridor2(_vm, this);
_rooms[CORRIDOR3] = new AxacussCorridor3(_vm, this);
- _rooms[CORRIDOR4] = new AxacussCorridor3(_vm, this);
- _rooms[CORRIDOR5] = new AxacussCorridor4(_vm, this);
- _rooms[CORRIDOR6] = new AxacussCorridor5(_vm, this);
- _rooms[CORRIDOR7] = new AxacussCorridor6(_vm, this);
- _rooms[CORRIDOR8] = new AxacussCorridor7(_vm, this);
- _rooms[CORRIDOR9] = new AxacussCorridor8(_vm, this);
+ _rooms[CORRIDOR4] = new AxacussCorridor4(_vm, this);
+ _rooms[CORRIDOR5] = new AxacussCorridor5(_vm, this);
+ _rooms[CORRIDOR6] = new AxacussCorridor6(_vm, this);
+ _rooms[CORRIDOR7] = new AxacussCorridor7(_vm, this);
+ _rooms[CORRIDOR8] = new AxacussCorridor8(_vm, this);
+ _rooms[CORRIDOR9] = new AxacussCorridor9(_vm, this);
_rooms[BCORRIDOR] = new AxacussBcorridor(_vm, this);
_rooms[GUARD] = new AxacussIntersection(_vm, this);
_rooms[GUARD3] = new AxacussExit(_vm, this);
@@ -1035,7 +1035,9 @@ void GameManager::taxiEvent() {
}
void GameManager::searchStartEvent() {
- warning("STUB: searchStartEvent");
+ if ((_currentRoom >= _rooms[CORRIDOR1]) && (_currentRoom <= _rooms[BCORRIDOR]))
+ busted(0);
+ _state._corridorSearch = true;
}
void GameManager::outro() {
Commit: 626e93e6f8cd6bdb518c5962b851b9adab09c344
https://github.com/scummvm/scummvm/commit/626e93e6f8cd6bdb518c5962b851b9adab09c344
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:41Z
Commit Message:
SUPERNOVA: Consume click event when hiding message
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index d9f4e8c..6553596 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -515,7 +515,11 @@ void GameManager::resetInputState() {
void GameManager::processInput() {
if (_mouseClickType == Common::EVENT_LBUTTONUP) {
- _vm->removeMessage();
+ if (_vm->_messageDisplayed) {
+ // Hide the message and consume the event
+ _vm->removeMessage();
+ return;
+ }
if (((_mouseField >= 0) && (_mouseField < 256)) ||
((_mouseField >= 512) && (_mouseField < 768))) {
@@ -544,7 +548,11 @@ void GameManager::processInput() {
_inventoryScroll += 2;
}
} else if (_mouseClickType == Common::EVENT_RBUTTONUP) {
- _vm->removeMessage();
+ if (_vm->_messageDisplayed) {
+ // Hide the message and consume the event
+ _vm->removeMessage();
+ return;
+ }
if (Object::isNullObject(_currentInputObject))
return;
Commit: 4810d514fead024305aec4fcb1f414a1cc3b98ca
https://github.com/scummvm/scummvm/commit/4810d514fead024305aec4fcb1f414a1cc3b98ca
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:41Z
Commit Message:
SUPERNOVA: Implement telomat, increase savegame version
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/rooms.h
engines/supernova/state.cpp
engines/supernova/state.h
engines/supernova/supernova.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 44446f4..c7cc3ae 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2847,7 +2847,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
}
} else if ((verb == ACTION_LOOK) &&
(obj1._id >= DOOR1) && (obj1._id <= DOOR4)) {
- _nameSeen |= 1 << (obj1._id - DOOR1);
+ _gm->_state._nameSeen[obj1._id - DOOR1] = true;
return false;
} else if ((verb == ACTION_WALK) &&
((obj1._id == PILLAR1) || (obj1._id == PILLAR2))) {
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 89609ea..ad28afb 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -1149,10 +1149,8 @@ public:
virtual void onEntrance();
virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
- byte _nameSeen;
};
+
class AxacussIntersection : public Room {
public:
AxacussIntersection(SupernovaEngine *vm, GameManager *gm) {
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 6553596..f1ceda0 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -57,6 +57,8 @@ bool GameManager::serialize(Common::WriteStream *out) {
out->writeByte(_state._cableConnected);
out->writeByte(_state._powerOff);
out->writeByte(_state._dream);
+ for (int i = 0; i < 4; i++)
+ out->writeByte(_state._nameSeen[i]);
// Inventory
out->writeSint32LE(_inventory.getSize());
@@ -113,6 +115,13 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
_state._powerOff = in->readByte();
_state._dream = in->readByte();
+ for (int i = 0; i < 4; i++) {
+ if (version >= 7)
+ _state._nameSeen[i] = in->readByte();
+ else
+ _state._nameSeen[i] = false;
+ }
+
_oldTime = g_system->getMillis();
// Inventory
@@ -655,8 +664,163 @@ void GameManager::corridorOnEntrance() {
busted(0);
}
-void GameManager::telomat(int number) {
- warning("STUB: telomat %d", number);
+void GameManager::telomat(int nr) {
+ static Common::String name[8] = {
+ "DR. ALAB HANSI",
+ "ALAB HANSI",
+ "SAVAL LUN",
+ "x",
+ "PROF. DR. UGNUL TSCHABB",
+ "UGNUL TSCHABB",
+ "ALGA HURZ LI",
+ "x"
+ };
+
+ static Common::String name2[4] = {
+ "Alab Hansi",
+ "Saval Lun",
+ "Ugnul Tschabb",
+ "Alga Hurz Li"
+ };
+
+ Common::String dial1[4];
+ dial1[0] = "Guten Tag, hier ist Horst Hummel.";
+ dial1[1] = "";
+ dial1[2] = "Es ist sehr wichtig.";
+ dial1[3] = "|";
+
+ static byte rows1[3] = {1, 2, 1};
+
+ Common::String dial2[4];
+ dial2[0] = "Vom Mars.";
+ dial2[1] = "Vom Klo.";
+ dial2[2] = "Das werde ich kaum erzählen.";
+ dial2[3] = "|";
+
+ static byte rows2[4] = {1, 1, 1, 1};
+
+ _vm->renderBox(0, 0, 320, 200, kColorBlack);
+ _vm->renderText("1 Büromanager", 100, 70, kColorGreen);
+ _vm->renderText("2 Telomat", 100, 81, kColorGreen);
+ _vm->renderText("3 ProText", 100, 92, kColorGreen);
+ _vm->renderText("4 Calculata", 100, 103, kColorGreen);
+ _vm->renderText("Bitte wählen", 100, 120, kColorDarkGreen);
+ Common::String input;
+ do {
+ getInput();
+
+ switch (_key.keycode) {
+ case Common::KEYCODE_2: {
+ _vm->renderBox(0, 0, 320, 200, kColorDarkBlue);
+ _vm->renderText("Geben Sie den gewünschten Namen ein:", 50, 80, kColorGreen);
+ _vm->renderText("(Vor- und Nachname)", 50, 91, kColorGreen);
+ do
+ edit(input, 50, 105, 30);
+ while ((_key.keycode != Common::KEYCODE_RETURN) && (_key.keycode != Common::KEYCODE_ESCAPE));
+
+ if (_key.keycode == Common::KEYCODE_ESCAPE) {
+ _vm->renderBox(0, 0, 320, 200, kColorBlack);
+ _vm->renderRoom(*_currentRoom);
+ _vm->paletteBrightness();
+ _guiEnabled = true;
+ drawMapExits();
+ return;
+ }
+
+ input.toUppercase();
+
+ int i = 0;
+ while ((input != name[i]) && (i < 8))
+ i++;
+ i >>= 1;
+ if (i == 4) {
+ _vm->renderText("Name unbekannt", 50, 120, kColorGreen);
+ wait2(10);
+ _vm->renderBox(0, 0, 320, 200, kColorBlack);
+ _vm->renderRoom(*_currentRoom);
+ _vm->paletteBrightness();
+ _guiEnabled = true;
+ drawMapExits();
+ return;
+ }
+
+ if ((i == nr) || _rooms[BCORRIDOR]->getObject(4 + i)->hasProperty(CAUGHT)) {
+ _vm->renderText("Verbindung unmöglich", 50, 120, kColorGreen);
+ wait2(10);
+ _vm->renderBox(0, 0, 320, 200, kColorBlack);
+ _vm->renderRoom(*_currentRoom);
+ _vm->paletteBrightness();
+ _guiEnabled = true;
+ drawMapExits();
+ return;
+ }
+
+ _vm->renderText("Verbindung wird hergestellt", 50, 120, kColorGreen);
+ wait2(10);
+ _vm->renderBox(0, 0, 320, 200, kColorBlack);
+ _vm->renderRoom(*_currentRoom);
+ _vm->paletteBrightness();
+ input = Common::String::format("%s am Apparat.", name2[i]);
+ _vm->renderMessage(input, kMessageTop);
+ waitOnInput(_timer1);
+ _vm->removeMessage();
+ if (_state._nameSeen[nr]) {
+ input = Common::String::format("Hier ist %s. Können Sie mal gerade kommen?", name2[nr]);
+ dial1[1] = input;
+ _currentRoom->addSentence(1, 1);
+ } else
+ _currentRoom->removeSentence(1, 1);
+
+ switch (dialog(3, rows1, dial1, 1)) {
+ case 1: _vm->renderMessage("Huch, Sie hören sich aber|nicht gut an. Ich komme sofort.", kMessageTop);
+ waitOnInput(_timer1);
+ _vm->removeMessage();
+ if ((_state._destination == 255) && !_rooms[BCORRIDOR]->isSectionVisible(7)) {
+ _state._eventTime = _state._time + ticksToMsec(150);
+ _state._eventCallback = kGuardWalkFn;
+ _state._origin = i;
+ _state._destination = nr;
+ }
+ break;
+ case 0: _vm->renderMessage("Horst Hummel! Von wo rufen Sie an?", kMessageTop);
+ waitOnInput(_timer1);
+ _vm->removeMessage();
+ if (dialog(4, rows2, dial2, 0) != 3) {
+ wait2(10);
+ say("Hmm, keine Antwort.");
+ }
+ _rooms[BCORRIDOR]->setSectionVisible(7, true);
+ _rooms[BCORRIDOR]->setSectionVisible(i + 1, true);
+ _state._eventTime = 0xffffffff;
+ _currentRoom->addSentence(0, 1);
+ }
+ _guiEnabled = true;
+ drawMapExits();
+ return;
+ }
+ case Common::KEYCODE_1:
+ case Common::KEYCODE_3:
+ case Common::KEYCODE_4:
+ _vm->renderBox(0, 0, 320, 200, kColorDarkBlue);
+ _vm->renderText("Passwort:", 100, 90, kColorGreen);
+ input = "";
+ do
+ edit(input, 100, 105, 30);
+ while ((_key.keycode != Common::KEYCODE_RETURN) && (_key.keycode != Common::KEYCODE_ESCAPE));
+
+ if (_key.keycode == Common::KEYCODE_RETURN) {
+ _vm->renderText("Falsches Passwort", 100, 120, kColorGreen);
+ wait2(10);
+ }
+ case Common::KEYCODE_ESCAPE:
+ _vm->renderBox(0, 0, 320, 200, kColorBlack);
+ _vm->renderRoom(*_currentRoom);
+ _vm->paletteBrightness();
+ _guiEnabled = true;
+ drawMapExits();
+ return;
+ }
+ } while (true);
}
void GameManager::startSearch() {
@@ -1149,6 +1313,11 @@ void GameManager::reply(const char *text, int aus1, int aus2) {
_vm->removeMessage();
}
+int GameManager::dialog(int num, byte rowLength[6], Common::String text[6], int number) {
+ warning("STUB dialog");
+ return 0;
+}
+
int GameManager::dialog(int num, byte rowLength[6], StringID text[6], int number) {
_vm->_allowLoadGame = false;
_guiEnabled = false;
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index e5403ba..4a7c833 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -55,6 +55,7 @@ struct GameState {
bool _cableConnected;
bool _powerOff;
bool _dream;
+ bool _nameSeen[4];
};
class Inventory {
@@ -187,6 +188,7 @@ public:
void setAnimationTimer(int ticks);
void dead(const char *message);
void dead(StringID messageId);
+ int dialog(int num, byte rowLength[6], Common::String text[6], int number);
int dialog(int num, byte rowLength[6], StringID text[6], int number);
void sentence(int number, bool brightness);
void say(StringID textId);
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index f356c77..ffe7da5 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -43,7 +43,7 @@
namespace Supernova {
#define SAVEGAME_HEADER MKTAG('M','S','N','1')
-#define SAVEGAME_VERSION 6
+#define SAVEGAME_VERSION 7
#define SUPERNOVA_DAT "supernova.dat"
#define SUPERNOVA_DAT_VERSION 1
Commit: 13319458dc346dde27d92e7c1f9ba8b79b3e4727
https://github.com/scummvm/scummvm/commit/13319458dc346dde27d92e7c1f9ba8b79b3e4727
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:42Z
Commit Message:
SUPERNOVA; Move some strings to game text file,
Changed paths:
devtools/create_supernova/gametext.h
engines/supernova/msn_def.h
engines/supernova/state.cpp
engines/supernova/state.h
engines/supernova/supernova.h
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index 8f2b623..962bad7 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -785,10 +785,33 @@ const char *gameText[] = {
"Versuchen Sie das ja nicht nochmal!", // kStringSupernova6
"Und jetzt raus mit Ihnen!", // kStringSupernova7
"Zehn Minuten sp\204ter ...", // kStringSupernova8
- //625
+ // 625
"Textgeschwindigkeit:", // kStringTextSpeed
"Was war das f\201r ein Ger\204usch?", // kStringGuardNoticed1
"Ich werde mal nachsehen.", // kStringGuardNoticed2
+ "Guten Tag, hier ist Horst Hummel.", // kStringTelomat1
+ "Hier ist %s. Können Sie mal gerade kommen?", // kStringTelomat2
+ // 630
+ "Es ist sehr wichtig.", // kStringTelomat3
+ "Vom Mars.", // kStringTelomat4
+ "Vom Klo.", // kStringTelomat5
+ "Das werde ich kaum erzählen.", // kStringTelomat6
+ "1 Büromanager", // kStringTelomat7
+ // 635
+ "2 Telomat", // kStringTelomat8
+ "3 ProText", // kStringTelomat9
+ "4 Calculata", // kStringTelomat10
+ "Bitte wählen", // kStringTelomat11
+ "Geben Sie den gewünschten Namen ein:", // kStringTelomat12
+ // 640
+ "(Vor- und Nachname)", // kStringTelomat13
+ "Name unbekannt", // kStringTelomat14
+ "Verbindung unmöglich", // kStringTelomat15
+ "Verbindung wird hergestellt", // kStringTelomat16
+ "%s am Apparat.", // kStringTelomat17
+ // 645
+ "Huch, Sie hören sich aber|nicht gut an. Ich komme sofort.", // kStringTelomat18
+ "Horst Hummel! Von wo rufen Sie an?", // kStringTelomat19
NULL
};
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 151ad3c..e11d117 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -553,7 +553,11 @@ enum StringID {
kStringGenericInteract_43, kStringConversationEnd, kStringSupernova1, kStringSupernova2, kStringSupernova3,
kStringSupernova4, kStringSupernova5, kStringSupernova6, kStringSupernova7, kStringSupernova8,
// 625
- kStringTextSpeed, kStringGuardNoticed1, kStringGuardNoticed2
+ kStringTextSpeed, kStringGuardNoticed1, kStringGuardNoticed2, kStringTelomat1, kStringTelomat2,
+ kStringTelomat3, kStringTelomat4, kStringTelomat5, kStringTelomat6, kStringTelomat7,
+ kStringTelomat8, kStringTelomat9, kStringTelomat10, kStringTelomat11, kStringTelomat12,
+ kStringTelomat13, kStringTelomat14, kStringTelomat15, kStringTelomat16, kStringTelomat17,
+ kStringTelomat18, kStringTelomat19, kStringTelomat20, kStringTelomat21
};
static StringID guiCommands[] = {
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index f1ceda0..fe25292 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -356,6 +356,7 @@ void GameManager::initState() {
for (int i = 0 ; i < 6 ; ++i) {
_sentenceNumber[i] = -1;
_texts[i] = kNoString;
+ _varTexts[i].clear();
_rows[i] = 0;
_rowsStart[i] = 0;
}
@@ -683,28 +684,30 @@ void GameManager::telomat(int nr) {
"Alga Hurz Li"
};
- Common::String dial1[4];
- dial1[0] = "Guten Tag, hier ist Horst Hummel.";
- dial1[1] = "";
- dial1[2] = "Es ist sehr wichtig.";
- dial1[3] = "|";
+ StringID dial1[4];
+ dial1[0] = kStringTelomat1;
+ dial1[1] = kNoString;
+ dial1[2] = kStringTelomat3;
+ dial1[3] = kStringDialogSeparator;
static byte rows1[3] = {1, 2, 1};
- Common::String dial2[4];
- dial2[0] = "Vom Mars.";
- dial2[1] = "Vom Klo.";
- dial2[2] = "Das werde ich kaum erzählen.";
- dial2[3] = "|";
+ StringID dial2[4];
+ dial2[0] = kStringTelomat4;
+ dial2[1] = kStringTelomat5;
+ dial2[2] = kStringTelomat6;
+ dial2[3] = kStringDialogSeparator;
static byte rows2[4] = {1, 1, 1, 1};
+
+ Common::String varDial[6];
_vm->renderBox(0, 0, 320, 200, kColorBlack);
- _vm->renderText("1 Büromanager", 100, 70, kColorGreen);
- _vm->renderText("2 Telomat", 100, 81, kColorGreen);
- _vm->renderText("3 ProText", 100, 92, kColorGreen);
- _vm->renderText("4 Calculata", 100, 103, kColorGreen);
- _vm->renderText("Bitte wählen", 100, 120, kColorDarkGreen);
+ _vm->renderText(kStringTelomat7, 100, 70, kColorGreen);
+ _vm->renderText(kStringTelomat8, 100, 81, kColorGreen);
+ _vm->renderText(kStringTelomat9, 100, 92, kColorGreen);
+ _vm->renderText(kStringTelomat10, 100, 103, kColorGreen);
+ _vm->renderText(kStringTelomat11, 100, 120, kColorDarkGreen);
Common::String input;
do {
getInput();
@@ -712,8 +715,8 @@ void GameManager::telomat(int nr) {
switch (_key.keycode) {
case Common::KEYCODE_2: {
_vm->renderBox(0, 0, 320, 200, kColorDarkBlue);
- _vm->renderText("Geben Sie den gewünschten Namen ein:", 50, 80, kColorGreen);
- _vm->renderText("(Vor- und Nachname)", 50, 91, kColorGreen);
+ _vm->renderText(kStringTelomat12, 50, 80, kColorGreen);
+ _vm->renderText(kStringTelomat13, 50, 91, kColorGreen);
do
edit(input, 50, 105, 30);
while ((_key.keycode != Common::KEYCODE_RETURN) && (_key.keycode != Common::KEYCODE_ESCAPE));
@@ -734,7 +737,7 @@ void GameManager::telomat(int nr) {
i++;
i >>= 1;
if (i == 4) {
- _vm->renderText("Name unbekannt", 50, 120, kColorGreen);
+ _vm->renderText(kStringTelomat14, 50, 120, kColorGreen);
wait2(10);
_vm->renderBox(0, 0, 320, 200, kColorBlack);
_vm->renderRoom(*_currentRoom);
@@ -745,7 +748,7 @@ void GameManager::telomat(int nr) {
}
if ((i == nr) || _rooms[BCORRIDOR]->getObject(4 + i)->hasProperty(CAUGHT)) {
- _vm->renderText("Verbindung unmöglich", 50, 120, kColorGreen);
+ _vm->renderText(kStringTelomat15, 50, 120, kColorGreen);
wait2(10);
_vm->renderBox(0, 0, 320, 200, kColorBlack);
_vm->renderRoom(*_currentRoom);
@@ -755,24 +758,23 @@ void GameManager::telomat(int nr) {
return;
}
- _vm->renderText("Verbindung wird hergestellt", 50, 120, kColorGreen);
+ _vm->renderText(kStringTelomat16, 50, 120, kColorGreen);
wait2(10);
_vm->renderBox(0, 0, 320, 200, kColorBlack);
_vm->renderRoom(*_currentRoom);
_vm->paletteBrightness();
- input = Common::String::format("%s am Apparat.", name2[i]);
- _vm->renderMessage(input, kMessageTop);
+ _vm->renderMessage(kStringTelomat17, kMessageTop, name2[i]);
waitOnInput(_timer1);
_vm->removeMessage();
if (_state._nameSeen[nr]) {
- input = Common::String::format("Hier ist %s. Können Sie mal gerade kommen?", name2[nr]);
- dial1[1] = input;
+ varDial[1] = name2[nr];
+ dial1[1] = kStringTelomat2;
_currentRoom->addSentence(1, 1);
} else
_currentRoom->removeSentence(1, 1);
- switch (dialog(3, rows1, dial1, 1)) {
- case 1: _vm->renderMessage("Huch, Sie hören sich aber|nicht gut an. Ich komme sofort.", kMessageTop);
+ switch (dialog(3, rows1, dial1, 1, varDial)) {
+ case 1: _vm->renderMessage(kStringTelomat18, kMessageTop);
waitOnInput(_timer1);
_vm->removeMessage();
if ((_state._destination == 255) && !_rooms[BCORRIDOR]->isSectionVisible(7)) {
@@ -782,12 +784,12 @@ void GameManager::telomat(int nr) {
_state._destination = nr;
}
break;
- case 0: _vm->renderMessage("Horst Hummel! Von wo rufen Sie an?", kMessageTop);
+ case 0: _vm->renderMessage(kStringTelomat19, kMessageTop);
waitOnInput(_timer1);
_vm->removeMessage();
if (dialog(4, rows2, dial2, 0) != 3) {
wait2(10);
- say("Hmm, keine Antwort.");
+ say(kStringTelomat20);
}
_rooms[BCORRIDOR]->setSectionVisible(7, true);
_rooms[BCORRIDOR]->setSectionVisible(i + 1, true);
@@ -802,14 +804,14 @@ void GameManager::telomat(int nr) {
case Common::KEYCODE_3:
case Common::KEYCODE_4:
_vm->renderBox(0, 0, 320, 200, kColorDarkBlue);
- _vm->renderText("Passwort:", 100, 90, kColorGreen);
+ _vm->renderText(kStringTelomat21, 100, 90, kColorGreen);
input = "";
do
edit(input, 100, 105, 30);
while ((_key.keycode != Common::KEYCODE_RETURN) && (_key.keycode != Common::KEYCODE_ESCAPE));
if (_key.keycode == Common::KEYCODE_RETURN) {
- _vm->renderText("Falsches Passwort", 100, 120, kColorGreen);
+ _vm->renderText(kStringShipSleepCabin9, 100, 120, kColorGreen);
wait2(10);
}
case Common::KEYCODE_ESCAPE:
@@ -1313,12 +1315,7 @@ void GameManager::reply(const char *text, int aus1, int aus2) {
_vm->removeMessage();
}
-int GameManager::dialog(int num, byte rowLength[6], Common::String text[6], int number) {
- warning("STUB dialog");
- return 0;
-}
-
-int GameManager::dialog(int num, byte rowLength[6], StringID text[6], int number) {
+int GameManager::dialog(int num, byte rowLength[6], StringID text[6], int number, Common::String varText[6]) {
_vm->_allowLoadGame = false;
_guiEnabled = false;
@@ -1341,6 +1338,8 @@ int GameManager::dialog(int num, byte rowLength[6], StringID text[6], int number
_rows[i] = rowLength[i];
for (int j = 0; j < _rows[i]; ++j, ++r, ++rq) {
_texts[r] = text[rq];
+ if (varText != nullptr && !varText[rq].empty())
+ _varTexts[r] = varText[rq];
_sentenceNumber[r] = i;
}
sentence(i, false);
@@ -1951,10 +1950,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage(obj1._description);
obj1._description = kStringKeycard2Description2;
} else if ((verb == ACTION_LOOK) && (obj1._id == WATCH)) {
- // FIXME: kStringGenericInteract_13 requires 2 string parameters in order to format the string properly
- _vm->renderMessage(kStringGenericInteract_13, kMessageNormal);
- // timeToString(_state._time).c_str(),
- // timeToString(_state._timeAlarm).c_str());
+ _vm->renderMessage(kStringGenericInteract_13, kMessageNormal, timeToString(_state._time), timeToString(_state._timeAlarm));
} else if ((verb == ACTION_PRESS) && (obj1._id == WATCH)) {
bool validInput = true;
int hours = 0;
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 4a7c833..2147390 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -142,6 +142,7 @@ public:
int _currentSentence;
int _sentenceNumber[6];
StringID _texts[6];
+ Common::String _varTexts[6];
byte _rows[6];
byte _rowsStart[6];
@@ -188,8 +189,7 @@ public:
void setAnimationTimer(int ticks);
void dead(const char *message);
void dead(StringID messageId);
- int dialog(int num, byte rowLength[6], Common::String text[6], int number);
- int dialog(int num, byte rowLength[6], StringID text[6], int number);
+ int dialog(int num, byte rowLength[6], StringID text[6], int number, Common::String varText[6] = nullptr);
void sentence(int number, bool brightness);
void say(StringID textId);
void say(const char *text);
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index ffe7da5..d452213 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -155,7 +155,8 @@ public:
return 0;
return textWidth(text.c_str());
}
- void renderMessage(StringID stringId, MessagePosition position = kMessageNormal) {
+ void renderMessage(StringID stringId, MessagePosition position = kMessageNormal, Common::String var1 = "", Common::String var2 = "") {
+ //TODO : Merge the gameString and the variables, if any
renderMessage(getGameString(stringId), position);
}
void renderMessage(const Common::String &text, MessagePosition position = kMessageNormal) {
Commit: 8efc3a15c1ee9d5cad88cacc461f5b58e420c1e6
https://github.com/scummvm/scummvm/commit/8efc3a15c1ee9d5cad88cacc461f5b58e420c1e6
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:42Z
Commit Message:
SUPERNOVA: Replace non-ASCII characters with actal values
Changed paths:
devtools/create_supernova/gametext.h
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index 962bad7..ad264b4 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -790,27 +790,27 @@ const char *gameText[] = {
"Was war das f\201r ein Ger\204usch?", // kStringGuardNoticed1
"Ich werde mal nachsehen.", // kStringGuardNoticed2
"Guten Tag, hier ist Horst Hummel.", // kStringTelomat1
- "Hier ist %s. Können Sie mal gerade kommen?", // kStringTelomat2
+ "Hier ist %s. K\224nnen Sie mal gerade kommen?", // kStringTelomat2
// 630
"Es ist sehr wichtig.", // kStringTelomat3
"Vom Mars.", // kStringTelomat4
"Vom Klo.", // kStringTelomat5
- "Das werde ich kaum erzählen.", // kStringTelomat6
- "1 Büromanager", // kStringTelomat7
+ "Das werde ich kaum erz\204hlen.", // kStringTelomat6
+ "1 B\201romanager", // kStringTelomat7
// 635
"2 Telomat", // kStringTelomat8
"3 ProText", // kStringTelomat9
"4 Calculata", // kStringTelomat10
- "Bitte wählen", // kStringTelomat11
- "Geben Sie den gewünschten Namen ein:", // kStringTelomat12
+ "Bitte w\204hlen", // kStringTelomat11
+ "Geben Sie den gew\201nschten Namen ein:", // kStringTelomat12
// 640
"(Vor- und Nachname)", // kStringTelomat13
"Name unbekannt", // kStringTelomat14
- "Verbindung unmöglich", // kStringTelomat15
+ "Verbindung unm\224glich", // kStringTelomat15
"Verbindung wird hergestellt", // kStringTelomat16
"%s am Apparat.", // kStringTelomat17
// 645
- "Huch, Sie hören sich aber|nicht gut an. Ich komme sofort.", // kStringTelomat18
+ "Huch, Sie h\224ren sich aber|nicht gut an. Ich komme sofort.", // kStringTelomat18
"Horst Hummel! Von wo rufen Sie an?", // kStringTelomat19
NULL
};
Commit: b4d7a83c753b9e4a32062d44c9d51d905272c8f4
https://github.com/scummvm/scummvm/commit/b4d7a83c753b9e4a32062d44c9d51d905272c8f4
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:42Z
Commit Message:
SUPERNOVA: Small cleanups
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/state.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index c7cc3ae..08ee12e 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -805,25 +805,22 @@ void ShipCockpit::animation() {
_gm->setAnimationTimer(10);
}
_vm->renderText(kStringShipCockpit10, 50, 145, _color);
+ } else if (isSectionVisible(21)) {
+ _vm->renderImage(_gm->invertSection(21));
+ _gm->setAnimationTimer(5);
} else {
- if (isSectionVisible(21)) {
- _vm->renderImage(_gm->invertSection(21));
- _gm->setAnimationTimer(5);
- } else {
- _vm->renderImage(21);
- _gm->setAnimationTimer(10);
- }
+ _vm->renderImage(21);
+ _gm->setAnimationTimer(10);
}
+
if (_gm->_state._powerOff) {
if (!_gm->_guiEnabled) {
_vm->renderText(kStringShipCockpit11, 97, 165, _color);
_vm->renderText(kStringShipCockpit12, 97, 175, _color);
- } else {
- if (isSectionVisible(21))
- _vm->renderImage(22);
- else
- _vm->renderImage(_gm->invertSection(22));
- }
+ } else if (isSectionVisible(21))
+ _vm->renderImage(22);
+ else
+ _vm->renderImage(_gm->invertSection(22));
}
}
@@ -852,9 +849,7 @@ bool ShipCabinL2::interact(Action verb, Object &obj1, Object &obj2) {
if (getObject(11)->_click == 255)
_vm->renderImage(23); // Remove book
_gm->great(2);
- }
-
- else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L1)) {
+ } else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L1)) {
_gm->closeLocker(this, getObject(4), getObject(0), 17);
setSectionVisible(20, false);
} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L2))
@@ -865,14 +860,10 @@ bool ShipCabinL2::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L4)) {
_gm->closeLocker(this, getObject(10), getObject(3), 22);
setSectionVisible(23, false);
- }
-
- else if ((verb == ACTION_TAKE) && (obj1._id == SPOOL) &&
- !(obj1.hasProperty(CARRIED))) {
+ } else if ((verb == ACTION_TAKE) && (obj1._id == SPOOL) && !obj1.hasProperty(CARRIED)) {
getObject(8)->_click = 42; // empty shelf
return false;
- } else if ((verb == ACTION_TAKE) && (obj1._id == BOOK2) &&
- !(obj1.hasProperty(CARRIED))) {
+ } else if ((verb == ACTION_TAKE) && (obj1._id == BOOK2) && !obj1.hasProperty(CARRIED)) {
getObject(10)->_click = 47; // empty shelf
return false;
} else
@@ -945,8 +936,7 @@ bool ShipCabinL3::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderImage(11);
_vm->renderImage(26);
setSectionVisible(12, false);
- } else if ((verb == ACTION_TAKE) &&
- ((obj1._id == WIRE) || (obj1._id == WIRE2) || (obj1._id == PLUG))) {
+ } else if ((verb == ACTION_TAKE) && ((obj1._id == WIRE) || (obj1._id == WIRE2) || (obj1._id == PLUG))) {
if (isSectionVisible(10) && isSectionVisible(11)) {
_vm->renderImage(_gm->invertSection(10));
_vm->renderImage(_gm->invertSection(11));
@@ -954,20 +944,18 @@ bool ShipCabinL3::interact(Action verb, Object &obj1, Object &obj2) {
_gm->takeObject(*getObject(8));
getObject(9)->_click = 255;
getObject(10)->_click = 255;
- } else {
+ } else
_vm->renderMessage(kStringShipCabinL3_5);
- }
- } else {
+ } else
return false;
- }
return true;
}
bool ShipCabinR3::interact(Action verb, Object &obj1, Object &obj2) {
- if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K1, KEYCARD)) {
+ if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K1, KEYCARD))
_gm->openLocker(this, getObject(6), getObject(2), 9);
- } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K2, KEYCARD)) {
+ else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K2, KEYCARD)) {
_gm->openLocker(this, getObject(8), getObject(3), 10);
if (getObject(9)->_click == 255)
_vm->renderImage(12); // Remove rope
@@ -979,9 +967,7 @@ bool ShipCabinR3::interact(Action verb, Object &obj1, Object &obj2) {
_gm->openLocker(this, getObject(15), getObject(5), 13);
if (getObject(16)->_click == 255)
_vm->renderImage(14); // Remove Book
- }
-
- else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF1))
+ } else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF1))
_gm->closeLocker(this, getObject(6), getObject(2), 9);
else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF2)) {
setSectionVisible(12, false);
@@ -993,20 +979,15 @@ bool ShipCabinR3::interact(Action verb, Object &obj1, Object &obj2) {
setSectionVisible(14, false);
setSectionVisible(14, false);
_gm->closeLocker(this, getObject(15), getObject(5), 13);
- }
-
- else if ((verb == ACTION_TAKE) && (obj1._id == DISCMAN) &&
- !_gm->_rooms[0]->getObject(3)->hasProperty(CARRIED)) {
+ } else if ((verb == ACTION_TAKE) && (obj1._id == DISCMAN) && !_gm->_rooms[0]->getObject(3)->hasProperty(CARRIED)) {
getObject(10)->_click = 34; // Locker empty
obj1._click = 255;
_gm->takeObject(*_gm->_rooms[0]->getObject(3));
_vm->renderImage(16);
- } else if ((verb == ACTION_TAKE) && (obj1._id == ROPE) &&
- obj1.hasProperty(CARRIED)) {
+ } else if ((verb == ACTION_TAKE) && (obj1._id == ROPE) && obj1.hasProperty(CARRIED)) {
getObject(8)->_click = 31; // Shelf empty
return false;
- } else if ((verb == ACTION_TAKE) && (obj1._id == BOOK) &&
- !obj1.hasProperty(CARRIED)) {
+ } else if ((verb == ACTION_TAKE) && (obj1._id == BOOK) && !obj1.hasProperty(CARRIED)) {
getObject(15)->_click = 32; // Shelf empty
return false;
} else
@@ -1116,12 +1097,9 @@ bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) {
}
_vm->renderImage(_gm->invertSection(11));
}
- } else if ((verb == ACTION_LOOK) && (obj1._id == MANOMETER)) {
- if (getObject(1)->hasProperty(OPENED))
- _vm->renderMessage(kStringShipAirlock2);
- else
- _vm->renderMessage(kStringShipAirlock3);
- } else
+ } else if ((verb == ACTION_LOOK) && (obj1._id == MANOMETER))
+ _vm->renderMessage(getObject(1)->hasProperty(OPENED) ? kStringShipAirlock2 : kStringShipAirlock3);
+ else
return false;
return true;
@@ -1141,11 +1119,9 @@ bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage(obj1._description);
obj1._description = kStringScrapDescription3;
_gm->takeObject(*getObject(2));
- } else if (((verb == ACTION_OPEN) || (verb == ACTION_CLOSE)) &&
- (obj1._id == OUTERHATCH_TOP)) {
+ } else if (((verb == ACTION_OPEN) || (verb == ACTION_CLOSE)) && (obj1._id == OUTERHATCH_TOP))
_vm->renderMessage(kStringShipHold1);
- } else if ((verb == ACTION_CLOSE) && (obj1._id == LANDINGMOD_HATCH) &&
- (isSectionVisible(4) || isSectionVisible(6)))
+ else if ((verb == ACTION_CLOSE) && (obj1._id == LANDINGMOD_HATCH) && (isSectionVisible(4) || isSectionVisible(6)))
_vm->renderMessage(kStringCable1);
else if (((verb == ACTION_TAKE) && (obj1._id == HOLD_WIRE)) ||
((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, LANDINGMOD_HATCH)))
@@ -1177,12 +1153,10 @@ bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderImage(6);
setSectionVisible(4, false);
getObject(0)->_click = 11;
- } else {
+ } else
_vm->renderMessage(kStringCable4);
- }
- } else {
+ } else
return false;
- }
return true;
}
@@ -1195,12 +1169,11 @@ void ShipHold::onEntrance() {
}
bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
- Room *r;
if ((verb == ACTION_PRESS) && (obj1._id == LANDINGMOD_BUTTON))
_vm->renderMessage(obj1._description);
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, PEN, LANDINGMOD_BUTTON)) {
if (_gm->_state._landingModuleEnergyDaysLeft) {
- r = _gm->_rooms[GENERATOR];
+ Room *r = _gm->_rooms[GENERATOR];
if (isSectionVisible(7)) {
_vm->renderImage(_gm->invertSection(9));
_vm->renderImage(_gm->invertSection(2));
@@ -1232,13 +1205,12 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, LANDINGMOD_BUTTON))
_vm->renderMessage(kStringShipHold3);
- else if ((verb == ACTION_LOOK) && (obj1._id == LANDINGMOD_MONITOR) &&
- isSectionVisible(7))
+ else if ((verb == ACTION_LOOK) && (obj1._id == LANDINGMOD_MONITOR) && isSectionVisible(7))
_vm->renderMessage(kStringShipHold4);
else if ((verb == ACTION_USE) && (obj1._id == KEYBOARD))
_vm->renderMessage(kStringShipHold5);
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, WIRE, LANDINGMOD_SOCKET)) {
- r = _gm->_rooms[CABIN_L3];
+ Room *r = _gm->_rooms[CABIN_L3];
_gm->_inventory.remove(*r->getObject(8));
getObject(4)->_name = r->getObject(8)->_name;
_vm->renderImage(4);
@@ -1255,7 +1227,7 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, TERMINALSTRIP)) {
_vm->renderImage(11);
getObject(4)->_name = kStringWireAndClip;
- r = _gm->_rooms[HOLD];
+ Room *r = _gm->_rooms[HOLD];
_gm->_inventory.remove(*r->getObject(2));
_gm->_state._terminalStripConnected = true;
_gm->_state._terminalStripWire = true;
@@ -1270,13 +1242,13 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, LANDINGMOD_HATCH)) {
if (getObject(5)->hasProperty(OPENED)) {
- r = _gm->_rooms[HOLD];
+ Room *r = _gm->_rooms[HOLD];
if (isSectionVisible(5)) {
r->setSectionVisible(5, true);
r->getObject(0)->_click = 10;
- } else {
+ } else
r->getObject(0)->_click = 9;
- }
+
r->setSectionVisible(4, true);
r->getObject(0)->_name = getObject(4)->_name;
_vm->renderImage(_gm->invertSection(5));
@@ -1284,25 +1256,19 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
setSectionVisible(11, false);
_vm->renderImage(6);
getObject(4)->_click = 7;
- } else {
+ } else
_vm->renderMessage(kStringShipHold6);
- }
- } else if ((verb == ACTION_CLOSE) && (obj1._id == LANDINGMOD_HATCH) &&
- isSectionVisible(6)) {
+ } else if ((verb == ACTION_CLOSE) && (obj1._id == LANDINGMOD_HATCH) && isSectionVisible(6))
_vm->renderMessage(kStringCable1);
- } else if (((verb == ACTION_TAKE) || (verb == ACTION_PULL)) &&
- (obj1._id == LANDINGMOD_WIRE)) {
+ else if (((verb == ACTION_TAKE) || (verb == ACTION_PULL)) && (obj1._id == LANDINGMOD_WIRE))
_vm->renderMessage(kStringCable2);
- } else {
+ else
return false;
- }
return true;
}
bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
- Room *r;
-
if ((verb == ACTION_OPEN) && (obj1._id == OUTERHATCH)) {
if (obj1.hasProperty(OPENED))
return false;
@@ -1319,9 +1285,9 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_CLOSE) && (obj1._id == OUTERHATCH)) {
if (!obj1.hasProperty(OPENED))
return false;
- if (isSectionVisible(11) || isSectionVisible(12)) {
+ if (isSectionVisible(11) || isSectionVisible(12))
_vm->renderMessage(kStringShipHold7);
- } else {
+ else {
_vm->playSound(kAudioDoorSound);
_vm->renderImage(_gm->invertSection(1));
setSectionVisible(10, false);
@@ -1387,15 +1353,14 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderImage(3);
_vm->renderImage(9);
getObject(0)->_click = 16;
- r = _gm->_rooms[LANDINGMODULE];
+ Room *r = _gm->_rooms[LANDINGMODULE];
if (_gm->_state._landingModuleEnergyDaysLeft && r->isSectionVisible(7))
_gm->turnOn();
else
- _vm->renderImage(4);
+ _vm->renderImage(4);
_gm->_rooms[HOLD]->setSectionVisible(7, true);
_gm->great(3);
- } else if ((verb == ACTION_PULL) && (obj1._id == GENERATOR_WIRE) &&
- (obj1._click == 16)) {
+ } else if ((verb == ACTION_PULL) && (obj1._id == GENERATOR_WIRE) && (obj1._click == 16)) {
_vm->renderImage(_gm->invertSection(9));
_vm->renderImage(2);
_vm->renderImage(3);
@@ -1416,7 +1381,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage(kStringShipHold13);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LADDER, ROPE)) {
_vm->renderImage(13);
- r = _gm->_rooms[CABIN_R3];
+ Room *r = _gm->_rooms[CABIN_R3];
_gm->_inventory.remove(*r->getObject(9));
getObject(3)->_click = 18;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, OUTERHATCH, GENERATOR_ROPE)) {
@@ -1428,22 +1393,20 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
if (isSectionVisible(7)) {
_vm->renderImage(10);
_vm->renderImage(11);
- } else {
+ } else
_vm->renderImage(12);
- }
- r = _gm->_rooms[OUTSIDE];
+
+ Room *r = _gm->_rooms[OUTSIDE];
r->setSectionVisible(1, true);
r->getObject(1)->_click = 1;
getObject(3)->_click = 17;
}
- } else if ((verb == ACTION_TAKE) && (obj1._id == GENERATOR_ROPE)) {
+ } else if ((verb == ACTION_TAKE) && (obj1._id == GENERATOR_ROPE))
_vm->renderMessage(kStringShipHold15);
- } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, OUTERHATCH, GENERATOR_WIRE) &&
- isSectionVisible(1)) {
+ else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, OUTERHATCH, GENERATOR_WIRE) && isSectionVisible(1))
_vm->renderMessage(kStringShipHold16);
- } else {
+ else
return false;
- }
return true;
}
@@ -1503,11 +1466,11 @@ bool ArsanoMeetup::interact(Action verb, Object &obj1, Object &obj2) {
((obj1._id == SPACESHIPS) ||
((obj1._id == SPACESHIP) && !obj1.hasProperty(OPENED)))) {
_vm->renderMessage(kStringArsanoMeetup1);
- } else if ((verb == ACTION_WALK) && (obj1._id == SPACESHIP)) {
+ } else if ((verb == ACTION_WALK) && (obj1._id == SPACESHIP))
_gm->changeRoom(GLIDER);
- } else if ((verb == ACTION_WALK) && (obj1._id == STAR)) {
+ else if ((verb == ACTION_WALK) && (obj1._id == STAR))
_vm->renderMessage(kStringArsanoMeetup2);
- } else if ((verb == ACTION_LOOK) && (obj1._id == STAR)) {
+ else if ((verb == ACTION_LOOK) && (obj1._id == STAR)) {
_vm->setCurrentImage(26);
_vm->renderImage(0);
_vm->paletteBrightness();
@@ -1537,9 +1500,8 @@ bool ArsanoMeetup::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KEYCARD_R, SPACESHIP)) {
getObject(5)->setProperty(OPENED);
_gm->changeRoom(GLIDER);
- } else {
+ } else
return false;
- }
return true;
}
@@ -1565,15 +1527,13 @@ void ArsanoEntrance::animation() {
setSectionVisible(kMaxSection - 5, false);
_gm->animationOn();
}
- if (isSectionVisible(2)) {
+ if (isSectionVisible(2))
_vm->renderImage(_gm->invertSection(2));
- } else {
- if (_eyewitness) {
- --_eyewitness;
- } else {
- _eyewitness = 20;
- _vm->renderImage(2);
- }
+ else if (_eyewitness)
+ --_eyewitness;
+ else {
+ _eyewitness = 20;
+ _vm->renderImage(2);
}
_gm->setAnimationTimer(4);
@@ -1584,20 +1544,19 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
static byte row2[6] = {1, 1, 1, 1, 1, 0};
static byte row3[6] = {1, 1, 0, 0, 0, 0};
- char e;
-
if ((verb == ACTION_TALK) && (obj1._id == PORTER)) {
- if (_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN)) {
+ if (_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN))
_vm->renderMessage(kStringArsanoEntrance1);
- } else {
+ else {
if (_gm->_state._language) {
+ int e;
do {
if (_gm->_state._shoes == 1) {
_dialog2[2] = kStringArsanoEntrance2;
addSentence(2, 2);
- } else if (_gm->_state._shoes > 1) {
+ } else if (_gm->_state._shoes > 1)
removeSentence(2, 2);
- }
+
switch (e = _gm->dialog(5, row2, _dialog2, 2)) {
case 0:
_gm->reply(kStringArsanoEntrance3, 1, _gm->invertSection(1));
@@ -1646,7 +1605,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
_gm->reply(kStringArsanoEntrance13, 1, _gm->invertSection(1));
else
_gm->reply(kStringArsanoEntrance14, 1, _gm->invertSection(1));
- e = 0;
+ int e = 0;
while ((e < 3) && (!allSentencesRemoved(4, 1))) {
switch (e = _gm->dialog(5, row1, _dialog1, 1)) {
case 0:
@@ -1731,9 +1690,9 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderImage(15 - _gm->_state._coins);
getObject(8 - _gm->_state._coins)->_click = 7;
--_gm->_state._coins;
- if (_gm->_state._coins == 1) {
+ if (_gm->_state._coins == 1)
getObject(16)->_name = kStringCoin;
- }
+
if (_gm->_state._coins == 0) {
_gm->_inventory.remove(*getObject(16));
_gm->_state._coins = 255;
@@ -1948,17 +1907,16 @@ void ArsanoRoger::animation() {
_vm->renderImage(12);
setSectionVisible(10, false);
setSectionVisible(12, false);
+ } else if (_eyewitness) {
+ --_eyewitness;
} else {
- if (_eyewitness) {
- --_eyewitness;
- } else {
- _eyewitness = 20;
- if (isSectionVisible(3))
- _vm->renderImage(10);
- else
- _vm->renderImage(1);
- }
+ _eyewitness = 20;
+ if (isSectionVisible(3))
+ _vm->renderImage(10);
+ else
+ _vm->renderImage(1);
}
+
if (isSectionVisible(3)) {
setSectionVisible(5 + _hands, false);
_hands = (_hands + 1) % 5;
@@ -1976,9 +1934,9 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
return false;
}
_gm->reply(kStringArsanoRoger3, 2, 2 + 128);
- } else if ((verb == ACTION_USE) && (obj1._id == CUP)) {
+ } else if ((verb == ACTION_USE) && (obj1._id == CUP))
_vm->renderMessage(kStringArsanoRoger4);
- } else if ((verb == ACTION_TALK) && (obj1._id == ROGER_W)) {
+ else if ((verb == ACTION_TALK) && (obj1._id == ROGER_W)) {
if (isSectionVisible(3))
_vm->renderMessage(kStringArsanoRoger5);
else {
@@ -2127,9 +2085,9 @@ bool ArsanoGlider::interact(Action verb, Object &obj1, Object &obj2) {
}
_gm->wait2(4);
_vm->renderImage(_gm->invertSection(i));
- } else if ((verb == ACTION_USE) && (obj1._id == GLIDER_BUTTONS)) {
+ } else if ((verb == ACTION_USE) && (obj1._id == GLIDER_BUTTONS))
_vm->renderMessage(kStringArsanoGlider1);
- } else
+ else
return false;
return true;
@@ -2183,9 +2141,9 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
_gm->reply(kStringArsanoMeetup2_9, 1, 1 + 128);
_gm->dialog(4, row3, _dialog3, 0);
_gm->reply(kStringArsanoMeetup2_10, 1, 1 + 128);
- } else {
+ } else
_gm->reply(kStringArsanoMeetup2_11, 1, 1 + 128);
- }
+
_gm->changeRoom(MEETUP2);
_gm->_rooms[MEETUP2]->setSectionVisible(12, false);
_gm->_rooms[MEETUP2]->getObject(0)->_click = 255;
@@ -2417,9 +2375,9 @@ void AxacussCell::animation() {
setSectionVisible(28, false);
getObject(0)->_click = 1;
getObject(1)->setProperty(EXIT | OPENABLE | CLOSED);
- } else if (_gm->_state._timeRobot == 700) {
+ } else if (_gm->_state._timeRobot == 700)
_gm->_state._timeRobot = 0;
- } else if (_gm->_state._timeRobot == 10002) {
+ else if (_gm->_state._timeRobot == 10002) {
_vm->renderImage(18 + 128);
_vm->renderImage(29);
_vm->renderImage(7);
@@ -2430,9 +2388,8 @@ void AxacussCell::animation() {
getObject(8)->_click = 12;
getObject(7)->_click = 14;
_vm->playSound(kAudioUndef4);
- } else if (_gm->_state._timeRobot == 10010) {
+ } else if (_gm->_state._timeRobot == 10010)
--_gm->_state._timeRobot;
- }
if (_gm->_state._timeRobot == 312) {
_vm->renderImage(7);
@@ -2472,9 +2429,7 @@ bool AxacussCell::interact(Action verb, Object &obj1, Object &obj2) {
getObject(5)->_click = 10;
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, CELL_WIRE, SOCKET) &&
- !isSectionVisible(1) &&
- !isSectionVisible(4) &&
- !isSectionVisible(6)) {
+ !isSectionVisible(1) && !isSectionVisible(4) && !isSectionVisible(6)) {
if (isSectionVisible(2)) {
_vm->renderImage(_gm->invertSection(2));
_vm->renderImage(1);
@@ -2519,19 +2474,16 @@ bool AxacussCell::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderImage(5);
getObject(5)->_click = 10;
}
- } else if ((verb == ACTION_TAKE) && (obj1._id == CELL_WIRE) &&
- !(obj1.hasProperty(CARRIED))) {
+ } else if ((verb == ACTION_TAKE) && (obj1._id == CELL_WIRE) && !(obj1.hasProperty(CARRIED))) {
if (isSectionVisible(3)) {
_vm->renderImage(_gm->invertSection(3));
_gm->takeObject(obj1);
} else if (isSectionVisible(5)) {
_vm->renderImage(_gm->invertSection(5));
_gm->takeObject(obj1);
- } else {
+ } else
_vm->renderMessage(kStringAxacussCell_3);
- }
- } else if ((verb == ACTION_WALK) && (obj1._id == CELL_DOOR) &&
- (obj1.hasProperty(OPENED))) {
+ } else if ((verb == ACTION_WALK) && (obj1._id == CELL_DOOR) && (obj1.hasProperty(OPENED))) {
if (isSectionVisible(30) || isSectionVisible(29))
return false;
_vm->playSound(kAudioGunShot);
@@ -2557,15 +2509,12 @@ bool AxacussCell::interact(Action verb, Object &obj1, Object &obj2) {
void AxacussCorridor1::onEntrance() {
-
}
void AxacussCorridor2::onEntrance() {
-
}
void AxacussCorridor3::onEntrance() {
-
}
void AxacussCorridor4::onEntrance() {
@@ -2576,7 +2525,6 @@ void AxacussCorridor4::onEntrance() {
}
void AxacussCorridor4::animation() {
-
}
bool AxacussCorridor4::interact(Action verb, Object &obj1, Object &obj2) {
@@ -2586,8 +2534,7 @@ bool AxacussCorridor4::interact(Action verb, Object &obj1, Object &obj2) {
if (isSectionVisible(29))
_vm->renderImage(29);
} else if (((verb == ACTION_USE) && Object::combine(obj1, obj2, TABLE, WATCH)) ||
- ((verb == ACTION_GIVE) && (obj1._id == WATCH) &&
- (obj2._id == TABLE))) {
+ ((verb == ACTION_GIVE) && (obj1._id == WATCH) && (obj2._id == TABLE))) {
if (obj1._id == WATCH)
_gm->_inventory.remove(obj1);
else
@@ -2595,8 +2542,7 @@ bool AxacussCorridor4::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderImage(29);
getObject(4)->_click = 8;
- } else if ((verb == ACTION_TAKE) && (obj1._id == WATCH) &&
- !obj1.hasProperty(CARRIED)) {
+ } else if ((verb == ACTION_TAKE) && (obj1._id == WATCH) && !obj1.hasProperty(CARRIED)) {
setSectionVisible(29, false);
getObject(4)->_click = 255;
_gm->takeObject(*_gm->_rooms[INTRO]->getObject(2));
@@ -2690,7 +2636,6 @@ bool AxacussCorridor5::interact(Action verb, Object &obj1, Object &obj2) {
}
void AxacussCorridor6::onEntrance() {
-
}
bool AxacussCorridor6::interact(Action verb, Object &obj1, Object &obj2) {
@@ -2710,16 +2655,13 @@ bool AxacussCorridor6::interact(Action verb, Object &obj1, Object &obj2) {
}
void AxacussCorridor7::onEntrance() {
-
}
void AxacussCorridor8::onEntrance() {
-
}
bool AxacussCorridor8::interact(Action verb, Object &obj1, Object &obj2) {
- if ((verb == ACTION_OPEN) && (obj1._id == DOOR) &&
- !obj1.hasProperty(OPENED)) {
+ if ((verb == ACTION_OPEN) && (obj1._id == DOOR) && !obj1.hasProperty(OPENED)) {
_vm->renderImage(27);
setSectionVisible(28, false);
obj1.setProperty(OPENED);
@@ -2728,8 +2670,7 @@ bool AxacussCorridor8::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_rooms[CORRIDOR6]->getObject(2)->setProperty(EXIT | OPENED | OPENABLE);
_gm->_rooms[CORRIDOR6]->getObject(2)->_click = 4;
_vm->playSound(kAudioDoorOpen);
- } else if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
- (obj1._type & OPENED)) {
+ } else if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) && (obj1._type & OPENED)) {
_vm->renderImage(28);
setSectionVisible(27, false);
obj1.disableProperty(OPENED);
@@ -2744,29 +2685,25 @@ bool AxacussCorridor8::interact(Action verb, Object &obj1, Object &obj2) {
}
void AxacussCorridor9::onEntrance() {
-
}
bool AxacussCorridor9::interact(Action verb, Object &obj1, Object &obj2) {
- if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
- (obj1.hasProperty(OPENED))) {
+ if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) && (obj1.hasProperty(OPENED))) {
_vm->renderImage(28);
setSectionVisible(27, false);
obj1.disableProperty(OPENED);
_gm->_rooms[GUARD]->setSectionVisible(6, false);
_gm->_rooms[GUARD]->getObject(2)->disableProperty(OPENED);
_vm->playSound(kAudioDoorClose);
- } else if ((verb == ACTION_OPEN) && (obj1._id == DOOR) &&
- !obj1.hasProperty(OPENED)) {
+ } else if ((verb == ACTION_OPEN) && (obj1._id == DOOR) && !obj1.hasProperty(OPENED)) {
_vm->renderImage(27);
setSectionVisible(28, false);
obj1.setProperty(OPENED);
_gm->_rooms[GUARD]->setSectionVisible(6, true);
_gm->_rooms[GUARD]->getObject(2)->setProperty(OPENED);
_vm->playSound(kAudioDoorOpen);
- if (!_gm->_rooms[GUARD]->isSectionVisible(1)) {
+ if (!_gm->_rooms[GUARD]->isSectionVisible(1))
_gm->busted(0);
- }
} else
return false;
@@ -2784,8 +2721,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
((verb == ACTION_USE) && obj1.hasProperty(COMBINABLE) && obj2.hasProperty(EXIT)))
_gm->_guiEnabled = false;
- if ((verb == ACTION_CLOSE) && (obj1._id >= DOOR1) && (obj1._id <= DOOR4) &&
- obj1.hasProperty(OPENED)) {
+ if ((verb == ACTION_CLOSE) && (obj1._id >= DOOR1) && (obj1._id <= DOOR4) && obj1.hasProperty(OPENED)) {
_vm->renderImage(_gm->invertSection(obj1._id - DOOR1 + 1));
_vm->playSound(kAudioDoorClose);
if (obj1.hasProperty(OCCUPIED)) {
@@ -2812,30 +2748,27 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
_gm->busted(11);
getObject(4)->setProperty(EXIT | OPENABLE | OPENED);
}
- } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR2) &&
- !getObject(5)->hasProperty(OPENED)) {
- if (getObject(5)->hasProperty(OCCUPIED)) {
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR2) && !getObject(5)->hasProperty(OPENED)) {
+ if (getObject(5)->hasProperty(OCCUPIED))
_vm->renderMessage(kStringDontEnter);
- } else {
+ else {
_vm->renderImage(2);
_vm->playSound(kAudioDoorOpen);
if (getObject(5)->hasProperty(CAUGHT))
_gm->busted(16);
getObject(5)->setProperty(EXIT | OPENABLE | OPENED);
}
- } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR3) &&
- !getObject(6)->hasProperty(OPENED)) {
- if (getObject(6)->hasProperty(OCCUPIED)) {
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR3) && !getObject(6)->hasProperty(OPENED)) {
+ if (getObject(6)->hasProperty(OCCUPIED))
_vm->renderMessage(kStringDontEnter);
- } else {
+ else {
_vm->renderImage(3);
_vm->playSound(kAudioDoorOpen);
if (getObject(6)->hasProperty(CAUGHT))
_gm->busted(15);
getObject(6)->setProperty(EXIT | OPENABLE | OPENED);
}
- } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR4) &&
- !getObject(7)->hasProperty(OPENED)) {
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR4) && !getObject(7)->hasProperty(OPENED)) {
if (getObject(7)->hasProperty(OCCUPIED)) {
_vm->renderMessage(kStringDontEnter);
} else {
@@ -2845,12 +2778,10 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
_gm->busted(20);
getObject(7)->setProperty(EXIT | OPENABLE | OPENED);
}
- } else if ((verb == ACTION_LOOK) &&
- (obj1._id >= DOOR1) && (obj1._id <= DOOR4)) {
+ } else if ((verb == ACTION_LOOK) && (obj1._id >= DOOR1) && (obj1._id <= DOOR4)) {
_gm->_state._nameSeen[obj1._id - DOOR1] = true;
return false;
- } else if ((verb == ACTION_WALK) &&
- ((obj1._id == PILLAR1) || (obj1._id == PILLAR2))) {
+ } else if ((verb == ACTION_WALK) && ((obj1._id == PILLAR1) || (obj1._id == PILLAR2))) {
_vm->renderMessage(kStringAxacussBcorridor_1);
_gm->_guiEnabled = true;
} else
@@ -2967,8 +2898,7 @@ bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
_gm->great(7);
}
}
- } else if ((verb == ACTION_CLOSE) && (obj1._id == LOCKER) &&
- obj1.hasProperty(OPENED)) {
+ } else if ((verb == ACTION_CLOSE) && (obj1._id == LOCKER) && obj1.hasProperty(OPENED)) {
_vm->renderImage(7);
setSectionVisible(6, false);
obj1.setProperty(OPENABLE | CLOSED);
@@ -3010,8 +2940,7 @@ bool AxacussOffice2::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderImage(_gm->invertSection(9));
obj1.setProperty(EXIT | OPENABLE | CLOSED);
_vm->playSound(kAudioDoorClose);
- } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR) &&
- !getObject(0)->hasProperty(OPENED)) {
+ } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR) && !getObject(0)->hasProperty(OPENED)) {
_vm->renderImage(9);
getObject(0)->setProperty(EXIT | OPENABLE | OPENED);
_vm->playSound(kAudioDoorOpen);
@@ -3060,8 +2989,7 @@ bool AxacussOffice3::interact(Action verb, Object &obj1, Object &obj2) {
}
bool AxacussOffice4::interact(Action verb, Object &obj1, Object &obj2) {
- if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
- obj1.hasProperty(OPENED)) {
+ if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) && obj1.hasProperty(OPENED)) {
_vm->renderImage(_gm->invertSection(3));
obj1.setProperty(EXIT | OPENABLE | CLOSED);
_vm->playSound(kAudioDoorClose);
@@ -3168,8 +3096,7 @@ bool AxacussElevator::interact(Action verb, Object &obj1, Object &obj2) {
bool AxacussStation::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_LOOK) && (obj1._id == STATION_SIGN)) {
_gm->changeRoom(SIGN);
- } else if ((verb == ACTION_WALK) && (obj1._id == DOOR) &&
- obj1.hasProperty(OPENED)) {
+ } else if ((verb == ACTION_WALK) && (obj1._id == DOOR) && obj1.hasProperty(OPENED)) {
_gm->great(0);
_vm->paletteFadeOut();
_vm->setCurrentImage(35);
@@ -3190,9 +3117,8 @@ bool AxacussStation::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderImage(_gm->invertSection(i));
}
_gm->outro();
- } else {
+ } else
return false;
- }
return true;
}
@@ -3236,11 +3162,9 @@ Outro::Outro(SupernovaEngine *vm, GameManager *gm) {
}
void Outro::onEntrance() {
-
}
void Outro::animation() {
-
}
void Outro::animate(int filenumber, int section1, int section2, int duration) {
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index fe25292..dbf24bc 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -212,17 +212,16 @@ void GuiElement::setText(const char *text) {
}
void GuiElement::setTextPosition(int x, int y) {
- _textPosition.x = x;
- _textPosition.y = y;
+ _textPosition = Common::Point(x, y);
}
+
void GuiElement::setSize(int x1, int y1, int x2, int y2) {
this->left = x1;
this->top = y1;
this->right = x2;
this->bottom = y2;
- _textPosition.x = x1 + 1;
- _textPosition.y = y1 + 1;
+ _textPosition = Common::Point(x1 + 1, y1 + 1);
}
void GuiElement::setColor(int bgColor, int textColor, int bgColorHighlighted, int textColorHightlighted) {
Commit: 2e95c690d00aab56b1412ac7f74eb3c879c32ac6
https://github.com/scummvm/scummvm/commit/2e95c690d00aab56b1412ac7f74eb3c879c32ac6
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:42Z
Commit Message:
SUPERNOVA: Add 2 missing translation strings, handle variable dialogs in AxacussCorridor5
Changed paths:
devtools/create_supernova/gametext.h
engines/supernova/rooms.cpp
engines/supernova/rooms.h
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index ad264b4..11cc656 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -678,7 +678,7 @@ const char *gameText[] = {
"Dann gehe ich eben wieder.", // kStringDialogAxacussCorridor5_5
"Ach, halten Sie's Maul, ich gehe trotzdem!", // kStringDialogAxacussCorridor5_6
// 535
- "Wenn Sie mich durchlassen gebe ich Ihnen %d Xa.", // kStringDialogAxacussCorridor5_7
+ "Wenn Sie mich durchlassen gebe ich Ihnen %s Xa.", // kStringDialogAxacussCorridor5_7
"Hallo!", // kStringDialogX1
"Guten Tag!", // kStringDialogX2
"Ich bin's, Horst Hummel.", // kStringDialogX3
@@ -812,6 +812,8 @@ const char *gameText[] = {
// 645
"Huch, Sie h\224ren sich aber|nicht gut an. Ich komme sofort.", // kStringTelomat18
"Horst Hummel! Von wo rufen Sie an?", // kStringTelomat19
+ "Hmm, keine Antwort.", // kStringTelomat20
+ "Passwort:", // kStringTelomat21
NULL
};
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 08ee12e..6d5ddf8 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2565,16 +2565,10 @@ bool AxacussCorridor5::handleMoneyDialog() {
removeSentence(2, 2);
removeSentence(3, 2);
} else {
- // TODO: Handle string manipulation in dialogs
- // _dialog3[2] and _dialog3[3] are both using kStringDialogAxacussCorridor5_7
- // ("Wenn Sie mich durchlassen gebe ich Ihnen %d Xa.")
- // One way could be to keep an array of string[6], replace the %d of the previous sentence by a %s,
- // and format the dialog string when the associated parameter string isn't empty.
- // The following code is broken and only kept in order to remember the values used.
- // _dialog3[2] += Common::String::format(kStringDialogAxacussCorridor5_7, _gm->_state._money - 200);
- // _dialog3[3] += Common::String::format(kStringDialogAxacussCorridor5_7, _gm->_state._money);
+ _varTexts3[2] = Common::String::format("%d", _gm->_state._money - 200);
+ _varTexts3[3] = Common::String::format("%d", _gm->_state._money);
}
- switch (_gm->dialog(4, _rows, _dialog3, 2)) {
+ switch (_gm->dialog(4, _rows, _dialog3, 2, _varTexts3)) {
case 1:
_gm->wait2(3);
_vm->renderImage(1);
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index ad28afb..62c7d8f 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -1015,6 +1015,9 @@ public:
_rows[3] = 1;
_rows[4] = 0;
_rows[5] = 0;
+
+ for (int i = 0; i < 6; i++)
+ _varTexts3[i] = "";
}
virtual void onEntrance();
@@ -1028,6 +1031,7 @@ private:
StringID _dialog1[2];
StringID _dialog2[2];
StringID _dialog3[4];
+ Common::String _varTexts3[6];
byte _rows[6];
};
Commit: 967efacae1dc3fadac5506dc11ecade633dce816
https://github.com/scummvm/scummvm/commit/967efacae1dc3fadac5506dc11ecade633dce816
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:42Z
Commit Message:
SUPERNOVA: Remove leftover function declaration
Changed paths:
engines/supernova/state.h
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 2147390..23d60b1 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -203,7 +203,6 @@ public:
void guardNoticed();
void busted(int i);
void corridorOnEntrance();
- void event(int time);
void telomat(int number);
void novaScroll();
void supernovaEvent();
Commit: b207fdf54def0361422954650c25c3121dea033e
https://github.com/scummvm/scummvm/commit/b207fdf54def0361422954650c25c3121dea033e
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:42Z
Commit Message:
SUPERNOVA: Complete implementation of walking through the Jungle
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 6d5ddf8..6afae13 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -3076,10 +3076,8 @@ bool AxacussElevator::interact(Action verb, Object &obj1, Object &obj2) {
_vm->removeMessage();
_vm->_menuBrightness = 0;
_vm->paletteBrightness();
- // TODO: Reset Time
-// *startingtime -= 125000; // 2 hours
-// *alarmsystime -= 125000;
-// *alarm_on = (*alarmsystime > systime());
+ _gm->_state._time += ticksToMsec(125000); // 2 hours
+ _gm->_state._alarmOn = (_gm->_state._timeAlarm > _gm->_state._time);
return false;
} else
return false;
Commit: 5f0709d66f367451e58014b80a0cd84934c17b58
https://github.com/scummvm/scummvm/commit/5f0709d66f367451e58014b80a0cd84934c17b58
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:42Z
Commit Message:
SUPERNOVA: Silence warning about unhandled switch cases
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index dbf24bc..dfd0f7c 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -820,6 +820,8 @@ void GameManager::telomat(int nr) {
_guiEnabled = true;
drawMapExits();
return;
+ default:
+ break;
}
} while (true);
}
Commit: 0c5f02959f12b62fe4a25bf9fb8445bc4b35e8f6
https://github.com/scummvm/scummvm/commit/0c5f02959f12b62fe4a25bf9fb8445bc4b35e8f6
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:42Z
Commit Message:
SUPERNOVA: Remove outdated comment and warning
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index dfd0f7c..19be0f6 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -856,8 +856,6 @@ void GameManager::guardNoticed() {
_currentRoom = r;
_guiEnabled = true;
drawMapExits();
- // new_room = true;
- warning("SKIPPED: new_room");
}
void GameManager::busted(int i) {
Commit: 1b2e4f926c644d5835409c7a78d1ca8d58783c3e
https://github.com/scummvm/scummvm/commit/1b2e4f926c644d5835409c7a78d1ca8d58783c3e
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:42Z
Commit Message:
SUPERNOVA: Implement alarm
Changed paths:
devtools/create_supernova/gametext.h
engines/supernova/msn_def.h
engines/supernova/state.cpp
engines/supernova/state.h
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index 11cc656..d5b6c9a 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -814,6 +814,7 @@ const char *gameText[] = {
"Horst Hummel! Von wo rufen Sie an?", // kStringTelomat19
"Hmm, keine Antwort.", // kStringTelomat20
"Passwort:", // kStringTelomat21
+ "Deine Armbanduhr piepst,|die Alarmzeit ist erreicht.", // kStringAlarm
NULL
};
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index e11d117..597749a 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -557,7 +557,7 @@ enum StringID {
kStringTelomat3, kStringTelomat4, kStringTelomat5, kStringTelomat6, kStringTelomat7,
kStringTelomat8, kStringTelomat9, kStringTelomat10, kStringTelomat11, kStringTelomat12,
kStringTelomat13, kStringTelomat14, kStringTelomat15, kStringTelomat16, kStringTelomat17,
- kStringTelomat18, kStringTelomat19, kStringTelomat20, kStringTelomat21
+ kStringTelomat18, kStringTelomat19, kStringTelomat20, kStringTelomat21, kStringAlarm
};
static StringID guiCommands[] = {
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 19be0f6..3d2679c 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1584,8 +1584,10 @@ void GameManager::handleTime() {
int32 newTime = g_system->getMillis();
int32 delta = newTime - _oldTime;
_state._time += delta;
- if (_state._time > 86400000)
+ if (_state._time > 86400000) {
_state._time -= 86400000; // 24h wrap around
+ _state._alarmOn = (_state._timeAlarm > _state._time);
+ }
if (_animationTimer > delta)
_animationTimer -= delta;
else
@@ -2300,4 +2302,60 @@ void GameManager::guard3Shot() {
shot(3,2);
}
+void GameManager::alarm() {
+ if (_rooms[INTRO]->getObject(2)->hasProperty(CARRIED)) {
+ alarmSound();
+ if (_currentRoom->getId() == GUARD)
+ guardShot();
+ else if (_currentRoom->getId() == CORRIDOR4 || _currentRoom->getId() == CORRIDOR7) {
+ guardNoticed();
+ _state._corridorSearch = true;
+ } else if (_currentRoom->getId() == GUARD3)
+ guard3Shot();
+ else if (_currentRoom->getId() == CORRIDOR1)
+ busted(33);
+ } else {
+ if (_currentRoom->getId() == CORRIDOR2 ||
+ _currentRoom->getId() == CORRIDOR4 ||
+ _currentRoom->getId() == GUARD ||
+ _currentRoom->getId() == CORRIDOR7 ||
+ _currentRoom->getId() == CELL)
+ {
+ alarmSound();
+ if (_currentRoom->getId() == GUARD)
+ guardShot();
+ guardNoticed();
+ if (_currentRoom->getId() == CORRIDOR4)
+ _state._corridorSearch = true;
+ }
+ _rooms[GUARD]->setSectionVisible(1, true);
+ _rooms[GUARD]->getObject(3)->_click = 255;
+ if (!_rooms[GUARD]->getObject(5)->hasProperty(CARRIED)) {
+ _rooms[GUARD]->setSectionVisible(7, true);
+ _rooms[GUARD]->getObject(5)->_click = 4;
+ }
+ _state._eventTime = _state._time + ticksToMsec(180);
+ _state._eventCallback = kGuardReturnedFn;
+ }
+}
+
+void GameManager::alarmSound() {
+ animationOff();
+ _vm->removeMessage();
+ _vm->renderMessage(kStringAlarm);
+
+ int32 end = _state._time + ticksToMsec(_timer1);
+ do {
+ _vm->playSound(kAudioAlarm);
+ while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle)) {
+ g_system->delayMillis(_vm->_delay);
+ _vm->updateEvents();
+ g_system->updateScreen();
+ }
+ } while (_state._time < end && !_vm->shouldQuit());
+
+ _vm->removeMessage();
+ animationOn();
+}
+
}
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 23d60b1..91ab54f 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -214,6 +214,8 @@ public:
void outro();
void guardShot();
void guard3Shot();
+ void alarm();
+ void alarmSound();
private:
int _prevImgId;
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 395fd78..6b1006a 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -213,6 +213,12 @@ void SupernovaEngine::updateEvents() {
return;
}
+ if (_gm->_state._alarmOn && _gm->_state._timeAlarm <= _gm->_state._time) {
+ _gm->_state._alarmOn = false;
+ _gm->alarm();
+ return;
+ }
+
_gm->_mouseClicked = false;
_gm->_keyPressed = false;
while (g_system->getEventManager()->pollEvent(_event)) {
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index d452213..5602ce6 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -156,8 +156,14 @@ public:
return textWidth(text.c_str());
}
void renderMessage(StringID stringId, MessagePosition position = kMessageNormal, Common::String var1 = "", Common::String var2 = "") {
- //TODO : Merge the gameString and the variables, if any
- renderMessage(getGameString(stringId), position);
+ Common::String text = getGameString(stringId);
+ if (!var1.empty()) {
+ if (!var2.empty())
+ text = Common::String::format(text.c_str(), var1.c_str(), var2.c_str());
+ else
+ text = Common::String::format(text.c_str(), var1.c_str());
+ }
+ renderMessage(text, position);
}
void renderMessage(const Common::String &text, MessagePosition position = kMessageNormal) {
if (!text.empty())
Commit: ef90759e924caaf7b8b3854890eb0ea813a352c0
https://github.com/scummvm/scummvm/commit/ef90759e924caaf7b8b3854890eb0ea813a352c0
Author: Strangerke (strangerke at scummvm.org)
Date: 2018-01-23T02:15:42Z
Commit Message:
SUPERNOVA: Some cleanup, simplify some code
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 3d2679c..2481e6b 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -569,18 +569,14 @@ void GameManager::processInput() {
((_mouseField >= 512) && (_mouseField < 768))) {
_inputObject[0] = _currentInputObject;
ObjectTypes type = _inputObject[0]->_type;
- if (type & OPENABLE) {
- if (type & OPENED)
- _inputVerb = ACTION_CLOSE;
- else
- _inputVerb = ACTION_OPEN;
- } else if (type & PRESS) {
+ if (type & OPENABLE)
+ _inputVerb = (type & OPENED) ? ACTION_CLOSE : ACTION_OPEN;
+ else if (type & PRESS)
_inputVerb = ACTION_PRESS;
- } else if (type & TALK) {
+ else if (type & TALK)
_inputVerb = ACTION_TALK;
- } else {
+ else
_inputVerb = ACTION_LOOK;
- }
_processInput = true;
}
@@ -589,34 +585,27 @@ void GameManager::processInput() {
int field = -1;
int click = -1;
- /* command row? */
if ((_mouseY >= _guiCommandButton[0].top) && (_mouseY <= _guiCommandButton[0].bottom)) {
+ /* command row */
field = 9;
while (_mouseX < _guiCommandButton[field].left - 1)
field--;
field += 256;
- }
- /* exit box? */
- else if ((_mouseX >= 283) && (_mouseX <= 317) && (_mouseY >= 163) && (_mouseY <= 197)) {
+ } else if ((_mouseX >= 283) && (_mouseX <= 317) && (_mouseY >= 163) && (_mouseY <= 197)) {
+ /* exit box */
field = _exitList[(_mouseX - 283) / 7 + 5 * ((_mouseY - 163) / 7)];
- }
- /* inventory box */
- else if ((_mouseY >= 161) && (_mouseX <= 270)) {
+ } else if ((_mouseY >= 161) && (_mouseX <= 270)) {
+ /* inventory box */
field = (_mouseX + 1) / 136 + ((_mouseY - 161) / 10) * 2;
if (field + _inventoryScroll < _inventory.getSize())
field += 512;
else
field = -1;
- }
- /* inventory arrows */
- else if ((_mouseY >= 161) && (_mouseX >= 271) && (_mouseX < 279)) {
- if (_mouseY > 180)
- field = 769;
- else
- field = 768;
- }
- /* normal item */
- else {
+ } else if ((_mouseY >= 161) && (_mouseX >= 271) && (_mouseX < 279)) {
+ /* inventory arrows */
+ field = (_mouseY > 180) ? 769 : 768;
+ } else {
+ /* normal item */
for (int i = 0; (_currentRoom->getObject(i)->_id != INVALIDOBJECT) &&
(field == -1) && i < kMaxObject; i++) {
click = _currentRoom->getObject(i)->_click;
@@ -634,27 +623,27 @@ void GameManager::processInput() {
}
if (_mouseField != field) {
- if (_mouseField >= 768) {
+ if (_mouseField >= 768)
_guiInventoryArrow[_mouseField - 768].setHighlight(false);
- } else if (_mouseField >= 512) {
+ else if (_mouseField >= 512)
_guiInventory[_mouseField - 512].setHighlight(false);
- } else if (_mouseField >= 256) {
+ else if (_mouseField >= 256)
_guiCommandButton[_mouseField - 256].setHighlight(false);
- } else if (_mouseField != -1) {
+ else if (_mouseField != -1) {
}
+
Object::setObjectNull(_currentInputObject);
_mouseField = field;
- if (_mouseField >= 768) {
+ if (_mouseField >= 768)
_guiInventoryArrow[_mouseField - 768].setHighlight(true);
- } else if (_mouseField >= 512) {
+ else if (_mouseField >= 512) {
_guiInventory[_mouseField - 512].setHighlight(true);
_currentInputObject = _inventory.get(_mouseField - 512 + _inventoryScroll);
- } else if (_mouseField >= 256) {
+ } else if (_mouseField >= 256)
_guiCommandButton[_mouseField - 256].setHighlight(true);
- } else if (_mouseField != -1) {
+ else if (_mouseField != -1)
_currentInputObject = _currentRoom->getObject(_mouseField);
- }
}
}
}
@@ -732,7 +721,7 @@ void GameManager::telomat(int nr) {
input.toUppercase();
int i = 0;
- while ((input != name[i]) && (i < 8))
+ while ((i < 8) && (input != name[i]))
i++;
i >>= 1;
if (i == 4) {
@@ -884,18 +873,16 @@ void GameManager::busted(int i) {
wait2(3);
_vm->renderImage(i + 2);
shot(0, 0);
- } else if (_currentRoom->getId() == BCORRIDOR) {
+ } else if (_currentRoom->getId() == BCORRIDOR)
_vm->renderImage(21);
- } else {
- if (_currentRoom->isSectionVisible(4))
- _vm->renderImage(32); // below
- else if (_currentRoom->isSectionVisible(2))
- _vm->renderImage(30); // right
- else if (_currentRoom->isSectionVisible(1))
- _vm->renderImage(31); // left
- else
- _vm->renderImage(33); // above
- }
+ else if (_currentRoom->isSectionVisible(4))
+ _vm->renderImage(32); // below
+ else if (_currentRoom->isSectionVisible(2))
+ _vm->renderImage(30); // right
+ else if (_currentRoom->isSectionVisible(1))
+ _vm->renderImage(31); // left
+ else
+ _vm->renderImage(33); // above
}
_vm->playSound(kAudioVoiceHalt);
wait2(3);
@@ -932,10 +919,10 @@ void GameManager::novaScroll() {
palette[idx+c] = rgb[t][c];
}
}
- for (int kreis = 0; kreis < t && kreis < 13; ++kreis) {
- int idx = 3 * (nova_f[kreis] - 1);
+ for (int cycle = 0; cycle < t && cycle < 13; ++cycle) {
+ int idx = 3 * (nova_f[cycle] - 1);
for (int c = 0 ; c < 3 ; ++c)
- palette[idx+c] = rgb[t-kreis-1][c];
+ palette[idx + c] = rgb[t - cycle - 1][c];
}
_vm->_system->getPaletteManager()->setPalette(palette, 0, 255);
@@ -1163,23 +1150,21 @@ void GameManager::guardWalkEvent() {
SWAP(_state._origin, _state._destination);
_state._eventCallback = kGuardWalkFn;
}
+ } else if (behind) {
+ _rooms[BCORRIDOR]->getObject(_state._destination + 4)->setProperty(OCCUPIED);
+ if (_currentRoom == _rooms[OFFICE_L1 + _state._destination])
+ busted(0);
+ _state._destination = 255;
+ } else if (_rooms[BCORRIDOR]->isSectionVisible(_state._destination + 1) && _rooms[OFFICE_L1 + _state._destination]->getObject(0)->hasProperty(OPENED)) {
+ _rooms[BCORRIDOR]->getObject(_state._destination + 4)->setProperty(OCCUPIED);
+ if (_currentRoom == _rooms[OFFICE_L1 + _state._destination])
+ busted(0);
+ SWAP(_state._origin, _state._destination);
+ _state._eventTime = _state._time + ticksToMsec(60);
+ _state._eventCallback = kGuardWalkFn;
} else {
- if (behind) {
- _rooms[BCORRIDOR]->getObject(_state._destination + 4)->setProperty(OCCUPIED);
- if (_currentRoom == _rooms[OFFICE_L1 + _state._destination])
- busted(0);
- _state._destination = 255;
- } else if (_rooms[BCORRIDOR]->isSectionVisible(_state._destination + 1) && _rooms[OFFICE_L1 + _state._destination]->getObject(0)->hasProperty(OPENED)) {
- _rooms[BCORRIDOR]->getObject(_state._destination + 4)->setProperty(OCCUPIED);
- if (_currentRoom == _rooms[OFFICE_L1 + _state._destination])
- busted(0);
- SWAP(_state._origin, _state._destination);
- _state._eventTime = _state._time + ticksToMsec(60);
- _state._eventCallback = kGuardWalkFn;
- } else {
- SWAP(_state._origin, _state._destination);
- _state._eventCallback = kGuardWalkFn;
- }
+ SWAP(_state._origin, _state._destination);
+ _state._eventCallback = kGuardWalkFn;
}
}
@@ -1521,15 +1506,12 @@ void GameManager::mouseInput3() {
void GameManager::roomBrightness() {
_roomBrightness = 255;
- if ((_currentRoom->getId() != OUTSIDE) && (_currentRoom->getId() < ROCKS) ) {
- if (_state._powerOff)
- _roomBrightness = 153;
- } else if (_currentRoom->getId() == CAVE) {
+ if ((_currentRoom->getId() != OUTSIDE) && (_currentRoom->getId() < ROCKS) && _state._powerOff)
+ _roomBrightness = 153;
+ else if (_currentRoom->getId() == CAVE)
+ _roomBrightness = 0;
+ else if ((_currentRoom->getId() == GUARD3) && _state._powerOff)
_roomBrightness = 0;
- } else if (_currentRoom->getId() == GUARD3) {
- if (_state._powerOff)
- _roomBrightness = 0;
- }
if (_vm->_brightness != 0)
_vm->_brightness = _roomBrightness;
@@ -1685,10 +1667,10 @@ void GameManager::edit(Common::String &input, int x, int y, uint length) {
_vm->_textColor = kColorDarkBlue;
_vm->renderText(input[i]);
_vm->_textColor = kColorWhite99;
- } else {
+ } else
_vm->renderText(input[i]);
- }
}
+
if (cursorIndex == input.size()) {
_vm->renderBox(_vm->_textCursorX + 1, y - 1, 6, 9, kColorDarkBlue);
_vm->renderBox(_vm->_textCursorX , y - 1, 1, 9, kColorWhite99);
@@ -1705,19 +1687,16 @@ void GameManager::edit(Common::String &input, int x, int y, uint length) {
cursorIndex = input.size();
break;
case Common::KEYCODE_LEFT:
- if (cursorIndex != 0) {
+ if (cursorIndex != 0)
--cursorIndex;
- }
break;
case Common::KEYCODE_RIGHT:
- if (cursorIndex != input.size()) {
+ if (cursorIndex != input.size())
++cursorIndex;
- }
break;
case Common::KEYCODE_DELETE:
- if (cursorIndex != input.size()) {
+ if (cursorIndex != input.size())
input.deleteChar(cursorIndex);
- }
break;
case Common::KEYCODE_BACKSPACE:
if (cursorIndex != 0) {
@@ -1766,9 +1745,8 @@ void GameManager::takeMoney(int amount) {
if (_state._money) {
if (!_rooms[OFFICE_R1]->getObject(5)->hasProperty(CARRIED))
takeObject(*_rooms[OFFICE_R1]->getObject(5));
- } else {
+ } else
_inventory.remove(*_rooms[OFFICE_R1]->getObject(5));
- }
}
void GameManager::drawStatus() {
@@ -1776,9 +1754,9 @@ void GameManager::drawStatus() {
_vm->renderBox(0, 140, 320, 9, kColorWhite25);
_vm->renderText(_vm->getGameString(guiStatusCommands[index]), 1, 141, kColorDarkGreen);
- if (Object::isNullObject(_inputObject[0])) {
+ if (Object::isNullObject(_inputObject[0]))
_vm->renderText(_currentInputObject->_name);
- } else {
+ else {
_vm->renderText(_inputObject[0]->_name);
if (_inputVerb == ACTION_GIVE)
_vm->renderText(kPhrasalVerbParticleGiveTo);
@@ -1793,21 +1771,17 @@ void GameManager::openLocker(const Room *room, Object *obj, Object *lock, int se
_vm->renderImage(section);
obj->setProperty(OPENED);
lock->_click = 255;
- int i = obj->_click;
- obj->_click = obj->_click2;
- obj->_click2 = i;
+ SWAP(obj->_click, obj->_click2);
}
void GameManager::closeLocker(const Room *room, Object *obj, Object *lock, int section) {
- if (!obj->hasProperty(OPENED)) {
+ if (!obj->hasProperty(OPENED))
_vm->renderMessage(kStringCloseLocker_1);
- } else {
+ else {
_vm->renderImage(invertSection(section));
obj->disableProperty(OPENED);
lock->_click = lock->_click2;
- int i = obj->_click;
- obj->_click = obj->_click2;
- obj->_click2 = i;
+ SWAP(obj->_click, obj->_click2);
}
}
@@ -1882,9 +1856,6 @@ bool GameManager::isHelmetOff() {
}
bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
- Room *r;
- Common::String input;
-
if ((verb == ACTION_USE) && (obj1._id == SCHNUCK)) {
if (isHelmetOff()) {
takeObject(obj1);
@@ -1903,9 +1874,9 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
}
} else if ((verb == ACTION_OPEN) && (obj1._id == EGG)) {
takeObject(obj1);
- if (obj1.hasProperty(OPENED)) {
+ if (obj1.hasProperty(OPENED))
_vm->renderMessage(kStringGenericInteract_3);
- } else {
+ else {
takeObject(*_rooms[ENTRANCE]->getObject(8));
_vm->renderMessage(kStringGenericInteract_4);
obj1.setProperty(OPENED);
@@ -1923,11 +1894,11 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage(kStringGenericInteract_6);
_state._language = 1;
} else if ((verb == ACTION_OPEN) && (obj1._id == WALLET)) {
- if (!_rooms[ROGER]->getObject(3)->hasProperty(CARRIED)) {
+ if (!_rooms[ROGER]->getObject(3)->hasProperty(CARRIED))
_vm->renderMessage(kStringGenericInteract_7);
- } else if (_rooms[ROGER]->getObject(7)->hasProperty(CARRIED)) {
+ else if (_rooms[ROGER]->getObject(7)->hasProperty(CARRIED))
_vm->renderMessage(kStringGenericInteract_8);
- } else {
+ else {
_vm->renderMessage(kStringGenericInteract_9);
takeObject(*_rooms[ROGER]->getObject(7));
takeObject(*_rooms[ROGER]->getObject(8));
@@ -1950,9 +1921,9 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_LOOK) && (obj1._id == KEYCARD2)) {
_vm->renderMessage(obj1._description);
obj1._description = kStringKeycard2Description2;
- } else if ((verb == ACTION_LOOK) && (obj1._id == WATCH)) {
+ } else if ((verb == ACTION_LOOK) && (obj1._id == WATCH))
_vm->renderMessage(kStringGenericInteract_13, kMessageNormal, timeToString(_state._time), timeToString(_state._timeAlarm));
- } else if ((verb == ACTION_PRESS) && (obj1._id == WATCH)) {
+ else if ((verb == ACTION_PRESS) && (obj1._id == WATCH)) {
bool validInput = true;
int hours = 0;
int minutes = 0;
@@ -1961,6 +1932,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
_vm->saveScreen(88, 87, 144, 24);
_vm->renderBox(88, 87, 144, 24, kColorWhite35);
_vm->renderText(kStringGenericInteract_14, 91, 90, kColorWhite99);
+ Common::String input;
do {
validInput = true;
input.clear();
@@ -2011,7 +1983,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
_state._alarmOn = (_state._timeAlarm > _state._time);
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, WIRE)) {
- r = _rooms[CABIN_L3];
+ Room *r = _rooms[CABIN_L3];
if (!r->getObject(8)->hasProperty(CARRIED)) {
if (r->isSectionVisible(26))
_vm->renderMessage(kStringTakeMessage);
@@ -2026,7 +1998,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage(kStringOk);
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, SPOOL)) {
- r = _rooms[CABIN_L2];
+ Room *r = _rooms[CABIN_L2];
takeObject(*r->getObject(9));
r->getObject(9)->_name = kSringSpoolAndClip;
r = _rooms[HOLD];
@@ -2034,16 +2006,16 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
_state._terminalStripConnected = true;
_vm->renderMessage(kStringOk);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, WIRE, SPOOL)) {
- r = _rooms[CABIN_L3];
+ Room *r = _rooms[CABIN_L3];
if (!_state._terminalStripConnected) {
if (r->isSectionVisible(26))
_vm->renderMessage(kStringCable3);
else
return false;
} else {
- if (!r->getObject(8)->hasProperty(CARRIED)) {
+ if (!r->getObject(8)->hasProperty(CARRIED))
_vm->renderMessage(kStringTakeMessage);
- } else {
+ else {
r = _rooms[CABIN_L2];
takeObject(*r->getObject(9));
r = _rooms[CABIN_L3];
@@ -2066,12 +2038,12 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
_vm->renderMessage(kStringGenericInteract_16);
} else {
if (obj1.hasProperty(WORN)) {
- r = _rooms[AIRLOCK];
- if (r->getObject(4)->hasProperty(WORN)) {
+ Room *r = _rooms[AIRLOCK];
+ if (r->getObject(4)->hasProperty(WORN))
_vm->renderMessage(kStringGenericInteract_17);
- } else if (r->getObject(6)->hasProperty(WORN)) {
+ else if (r->getObject(6)->hasProperty(WORN))
_vm->renderMessage(kStringGenericInteract_18);
- } else {
+ else {
obj1.disableProperty(WORN);
_vm->renderMessage(kStringGenericInteract_19);
}
@@ -2088,25 +2060,21 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
_rooms[AIRLOCK]->getObject(4)->disableProperty(WORN);
_rooms[AIRLOCK]->getObject(5)->disableProperty(WORN);
_rooms[AIRLOCK]->getObject(6)->disableProperty(WORN);
- } else {
+ } else
_vm->renderMessage(kStringGenericInteract_22);
- }
+ } else if (obj1.hasProperty(WORN)) {
+ if (airless())
+ dead(kStringGenericInteract_23);
+
+ obj1.disableProperty(WORN);
+ _vm->renderMessage(kStringGenericInteract_24);
} else {
- if (obj1.hasProperty(WORN)) {
- if (airless()) {
- dead(kStringGenericInteract_23);
- }
- obj1.disableProperty(WORN);
- _vm->renderMessage(kStringGenericInteract_24);
- } else {
- r = _rooms[AIRLOCK];
- if (r->getObject(5)->hasProperty(WORN)) {
- obj1.setProperty(WORN);
- _vm->renderMessage(kStringGenericInteract_25);
- } else {
- _vm->renderMessage(kStringGenericInteract_26);
- }
- }
+ Room *r = _rooms[AIRLOCK];
+ if (r->getObject(5)->hasProperty(WORN)) {
+ obj1.setProperty(WORN);
+ _vm->renderMessage(kStringGenericInteract_25);
+ } else
+ _vm->renderMessage(kStringGenericInteract_26);
}
} else if ((verb == ACTION_USE) && (obj1._id == LIFESUPPORT)) {
takeObject(obj1);
@@ -2118,21 +2086,19 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
_rooms[AIRLOCK]->getObject(6)->disableProperty(WORN);
} else
_vm->renderMessage(kStringGenericInteract_22);
- } else {
- if (obj1.hasProperty(WORN)) {
- if (airless())
- dead(kStringGenericInteract_27);
+ } else if (obj1.hasProperty(WORN)) {
+ if (airless())
+ dead(kStringGenericInteract_27);
- obj1.disableProperty(WORN);
- _vm->renderMessage(kStringGenericInteract_28);
- } else {
- r = _rooms[AIRLOCK];
- if (r->getObject(5)->hasProperty(WORN)) {
- obj1.setProperty(WORN);
- _vm->renderMessage(kStringGenericInteract_29);
- } else
- _vm->renderMessage(kStringGenericInteract_26);
- }
+ obj1.disableProperty(WORN);
+ _vm->renderMessage(kStringGenericInteract_28);
+ } else {
+ Room *r = _rooms[AIRLOCK];
+ if (r->getObject(5)->hasProperty(WORN)) {
+ obj1.setProperty(WORN);
+ _vm->renderMessage(kStringGenericInteract_29);
+ } else
+ _vm->renderMessage(kStringGenericInteract_26);
}
} else if ((verb == ACTION_WALK) && (obj1._id == BATHROOM_DOOR)) {
_rooms[BATHROOM]->getObject(2)->_exitRoom = _currentRoom->getId();
@@ -2144,9 +2110,8 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
waitOnInput(_timer1);
_vm->removeMessage();
_vm->renderMessage(kStringGenericInteract_32);
- } else {
+ } else
return false;
- }
return true;
}
@@ -2171,9 +2136,9 @@ void GameManager::handleInput() {
} else if (_inputObject[0]->hasProperty(OPENABLE) && !_inputObject[0]->hasProperty(OPENED)) {
// This is closed
_vm->renderMessage(kStringShipHold9);
- } else {
+ } else
changeRoom(_inputObject[0]->_exitRoom);
- }
+
break;
case ACTION_TAKE:
@@ -2186,9 +2151,9 @@ void GameManager::handleInput() {
} else if (!_inputObject[0]->hasProperty(TAKE)) {
// You can't take that.
_vm->renderMessage(kStringGenericInteract_37);
- } else {
+ } else
takeObject(*_inputObject[0]);
- }
+
break;
case ACTION_OPEN:
@@ -2315,10 +2280,8 @@ void GameManager::alarm() {
else if (_currentRoom->getId() == CORRIDOR1)
busted(33);
} else {
- if (_currentRoom->getId() == CORRIDOR2 ||
- _currentRoom->getId() == CORRIDOR4 ||
- _currentRoom->getId() == GUARD ||
- _currentRoom->getId() == CORRIDOR7 ||
+ if (_currentRoom->getId() == CORRIDOR2 || _currentRoom->getId() == CORRIDOR4 ||
+ _currentRoom->getId() == GUARD || _currentRoom->getId() == CORRIDOR7 ||
_currentRoom->getId() == CELL)
{
alarmSound();
Commit: 75e3568f063c883ecfb057f4c6dccd3962d77a4c
https://github.com/scummvm/scummvm/commit/75e3568f063c883ecfb057f4c6dccd3962d77a4c
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:42Z
Commit Message:
SUPERNOVA: Implement dialogs with variable text
This was partially implemented but not finished. However I reverted
the changes already done to support that in order to use a different
approach.
Changed paths:
devtools/create_supernova/gametext.h
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
engines/supernova/rooms.h
engines/supernova/state.cpp
engines/supernova/state.h
engines/supernova/supernova.h
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index d5b6c9a..398e210 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -678,7 +678,7 @@ const char *gameText[] = {
"Dann gehe ich eben wieder.", // kStringDialogAxacussCorridor5_5
"Ach, halten Sie's Maul, ich gehe trotzdem!", // kStringDialogAxacussCorridor5_6
// 535
- "Wenn Sie mich durchlassen gebe ich Ihnen %s Xa.", // kStringDialogAxacussCorridor5_7
+ "Wenn Sie mich durchlassen gebe ich Ihnen %d Xa.", // kStringDialogAxacussCorridor5_7
"Hallo!", // kStringDialogX1
"Guten Tag!", // kStringDialogX2
"Ich bin's, Horst Hummel.", // kStringDialogX3
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 597749a..3dc54c5 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -557,7 +557,10 @@ enum StringID {
kStringTelomat3, kStringTelomat4, kStringTelomat5, kStringTelomat6, kStringTelomat7,
kStringTelomat8, kStringTelomat9, kStringTelomat10, kStringTelomat11, kStringTelomat12,
kStringTelomat13, kStringTelomat14, kStringTelomat15, kStringTelomat16, kStringTelomat17,
- kStringTelomat18, kStringTelomat19, kStringTelomat20, kStringTelomat21, kStringAlarm
+ kStringTelomat18, kStringTelomat19, kStringTelomat20, kStringTelomat21, kStringAlarm,
+
+ // Add two placeholder strings at the end for variable text
+ kStringPlaceholder1, kStringPlaceholder2
};
static StringID guiCommands[] = {
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 6afae13..2349fc8 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2565,10 +2565,13 @@ bool AxacussCorridor5::handleMoneyDialog() {
removeSentence(2, 2);
removeSentence(3, 2);
} else {
- _varTexts3[2] = Common::String::format("%d", _gm->_state._money - 200);
- _varTexts3[3] = Common::String::format("%d", _gm->_state._money);
+ Common::String string = _vm->getGameString(kStringDialogAxacussCorridor5_7);
+ _vm->setGameString(kStringPlaceholder1, Common::String::format(string.c_str(), _gm->_state._money - 200));
+ _vm->setGameString(kStringPlaceholder2, Common::String::format(string.c_str(), _gm->_state._money));
+ _dialog3[2] = kStringPlaceholder1;
+ _dialog3[3] = kStringPlaceholder2;
}
- switch (_gm->dialog(4, _rows, _dialog3, 2, _varTexts3)) {
+ switch (_gm->dialog(4, _rows, _dialog3, 2)) {
case 1:
_gm->wait2(3);
_vm->renderImage(1);
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 62c7d8f..ad28afb 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -1015,9 +1015,6 @@ public:
_rows[3] = 1;
_rows[4] = 0;
_rows[5] = 0;
-
- for (int i = 0; i < 6; i++)
- _varTexts3[i] = "";
}
virtual void onEntrance();
@@ -1031,7 +1028,6 @@ private:
StringID _dialog1[2];
StringID _dialog2[2];
StringID _dialog3[4];
- Common::String _varTexts3[6];
byte _rows[6];
};
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 2481e6b..e0f30e9 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -355,7 +355,6 @@ void GameManager::initState() {
for (int i = 0 ; i < 6 ; ++i) {
_sentenceNumber[i] = -1;
_texts[i] = kNoString;
- _varTexts[i].clear();
_rows[i] = 0;
_rowsStart[i] = 0;
}
@@ -687,8 +686,6 @@ void GameManager::telomat(int nr) {
dial2[3] = kStringDialogSeparator;
static byte rows2[4] = {1, 1, 1, 1};
-
- Common::String varDial[6];
_vm->renderBox(0, 0, 320, 200, kColorBlack);
_vm->renderText(kStringTelomat7, 100, 70, kColorGreen);
@@ -755,13 +752,14 @@ void GameManager::telomat(int nr) {
waitOnInput(_timer1);
_vm->removeMessage();
if (_state._nameSeen[nr]) {
- varDial[1] = name2[nr];
- dial1[1] = kStringTelomat2;
+ Common::String string = _vm->getGameString(kStringTelomat2);
+ _vm->setGameString(kStringPlaceholder1, Common::String::format(string.c_str(), name2[nr].c_str()));
+ dial1[1] = kStringPlaceholder1;
_currentRoom->addSentence(1, 1);
} else
_currentRoom->removeSentence(1, 1);
- switch (dialog(3, rows1, dial1, 1, varDial)) {
+ switch (dialog(3, rows1, dial1, 1)) {
case 1: _vm->renderMessage(kStringTelomat18, kMessageTop);
waitOnInput(_timer1);
_vm->removeMessage();
@@ -1299,7 +1297,7 @@ void GameManager::reply(const char *text, int aus1, int aus2) {
_vm->removeMessage();
}
-int GameManager::dialog(int num, byte rowLength[6], StringID text[6], int number, Common::String varText[6]) {
+int GameManager::dialog(int num, byte rowLength[6], StringID text[6], int number) {
_vm->_allowLoadGame = false;
_guiEnabled = false;
@@ -1322,8 +1320,6 @@ int GameManager::dialog(int num, byte rowLength[6], StringID text[6], int number
_rows[i] = rowLength[i];
for (int j = 0; j < _rows[i]; ++j, ++r, ++rq) {
_texts[r] = text[rq];
- if (varText != nullptr && !varText[rq].empty())
- _varTexts[r] = varText[rq];
_sentenceNumber[r] = i;
}
sentence(i, false);
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 91ab54f..7bb7b18 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -142,7 +142,6 @@ public:
int _currentSentence;
int _sentenceNumber[6];
StringID _texts[6];
- Common::String _varTexts[6];
byte _rows[6];
byte _rowsStart[6];
@@ -189,7 +188,7 @@ public:
void setAnimationTimer(int ticks);
void dead(const char *message);
void dead(StringID messageId);
- int dialog(int num, byte rowLength[6], StringID text[6], int number, Common::String varText[6] = nullptr);
+ int dialog(int num, byte rowLength[6], StringID text[6], int number);
void sentence(int number, bool brightness);
void say(StringID textId);
void say(const char *text);
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 5602ce6..e3aeebb 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -150,6 +150,15 @@ public:
return _nullString;
return _gameStrings[idx];
}
+
+ void setGameString(int idx, const Common::String &string) {
+ if (idx < 0)
+ return;
+ while ((int)_gameStrings.size() <= idx)
+ _gameStrings.push_back(Common::String());
+ _gameStrings[idx] = string;
+ }
+
int textWidth(const Common::String &text) {
if (text.empty())
return 0;
Commit: e8d50c3c1b655a186f03df5fa5c6ad151f802c62
https://github.com/scummvm/scummvm/commit/e8d50c3c1b655a186f03df5fa5c6ad151f802c62
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:42Z
Commit Message:
SUPERNOVA: Removes Discman from inventory
After landing on Axacuss your items are removed, except for your knife
and watch.
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 2349fc8..b5ee3e1 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2325,7 +2325,6 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_inventory.clear();
_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(1)); // Knife
_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(2)); // Watch
- _gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(3)); // Discman
_gm->changeRoom(CELL);
_gm->_state._dream = true;
} else
Commit: 6a39148a3040e51976c8cf299c2da042c2b30e82
https://github.com/scummvm/scummvm/commit/6a39148a3040e51976c8cf299c2da042c2b30e82
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:43Z
Commit Message:
SUPERNOVA: Sets sections in the correct room
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index e0f30e9..7f8475a 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -838,8 +838,8 @@ void GameManager::guardNoticed() {
wait2(2);
reply(kStringGuardNoticed2, 2, 5);
_vm->paletteFadeOut();
- r->setSectionVisible(2, false);
- r->setSectionVisible(5, false);
+ _currentRoom->setSectionVisible(2, false);
+ _currentRoom->setSectionVisible(5, false);
_currentRoom = r;
_guiEnabled = true;
drawMapExits();
Commit: c51f27f1d4a25d9dd9887bccf0d2436dab4ade56
https://github.com/scummvm/scummvm/commit/c51f27f1d4a25d9dd9887bccf0d2436dab4ade56
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:43Z
Commit Message:
SUPERNOVA: Removes redundant comments
Changed paths:
engines/supernova/msn_def.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 3dc54c5..0aa62e6 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -39,12 +39,6 @@ const int kMaxCarry = 30;
const int kSleepAutosaveSlot = 999;
-//const int kRoomsChap0 = 1;
-//const int kRoomsChap1 = 16;
-//const int kRoomsChap2 = 9;
-//const int kRoomsChap3 = 21;
-//const int kRoomsNum = kRoomsChap0 + kRoomsChap1 + kRoomsChap2 + kRoomsChap3;
-
const byte kShownFalse = 0;
const byte kShownTrue = 1;
Commit: a996a31ab9efcea5a4c239054b55a49c639bbfb3
https://github.com/scummvm/scummvm/commit/a996a31ab9efcea5a4c239054b55a49c639bbfb3
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:43Z
Commit Message:
SUPERNOVA: Add engine data file
Changed paths:
A dists/engine-data/supernova.dat
diff --git a/dists/engine-data/supernova.dat b/dists/engine-data/supernova.dat
new file mode 100644
index 0000000..75cad1a
Binary files /dev/null and b/dists/engine-data/supernova.dat differ
Commit: c09ecdb19cfc2381010718a7f76fca4dd2465a95
https://github.com/scummvm/scummvm/commit/c09ecdb19cfc2381010718a7f76fca4dd2465a95
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:43Z
Commit Message:
SUPERNOVA: Improve English translation
Changed paths:
devtools/create_supernova/strings-en.po
diff --git a/devtools/create_supernova/strings-en.po b/devtools/create_supernova/strings-en.po
index ff9abe8..9268f88 100644
--- a/devtools/create_supernova/strings-en.po
+++ b/devtools/create_supernova/strings-en.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Mission Supernova 1.0\n"
"Report-Msgid-Bugs-To: scummvm-devel at lists.scummvm.org\n"
"POT-Creation-Date: 2017-07-22 19:53+0100\n"
-"PO-Revision-Date: 2017-11-05 21:23+0000\n"
+"PO-Revision-Date: 2017-12-13 21:29+0000\n"
"Last-Translator: Thierry Crozat <criezy at scummvm.org>\n"
"Language-Team: none\n"
"Language: en\n"
@@ -389,11 +389,11 @@ msgstr "You've already opened it."
#: ../../msn/msn_r0.c:206
msgid "In dem Ei ist eine Tablette|in einer Plastikhlle."
-msgstr "The egg contains a tablet|in a plastic sleeve."
+msgstr "The egg contains a pill|in a plastic sleeve."
#: ../../msn/msn_r0.c:214
msgid "Du iát die Tablette und merkst,|daá sich irgendetwas verndert hat."
-msgstr "You eat the tablet and realize|that something has changed."
+msgstr "You eat the pill and realize|that something has changed."
#: ../../msn/msn_r0.c:224
msgid ""
@@ -401,7 +401,7 @@ msgid ""
"diese Schrift jetzt|lesen knnen, hat die Tablette gewirkt.\""
msgstr ""
"Funny! Now you can read the inscription! It says, \"If you can read this "
-"text now, the tablet has worked.\""
+"text now, the pill has worked.\""
#: ../../msn/msn_r0.c:232
msgid "Sie ist leer."
@@ -535,7 +535,7 @@ msgstr "Your watch beeps,|this is the alarm."
#: ../../msn/msn_r0.c:803 ../../msn/msn_r1_r.c:117
msgid "Keycard"
-msgstr "keycard"
+msgstr "Keycard"
#: ../../msn/msn_r0.c:803
msgid "Die Keycard fr deine Schrnke."
@@ -543,7 +543,7 @@ msgstr "The keycard for your locker."
#: ../../msn/msn_r0.c:805
msgid "Taschenmesser"
-msgstr "pocket knife"
+msgstr "Pocket knife"
#: ../../msn/msn_r0.c:805
msgid "Es ist nicht mehr das schrfste."
@@ -551,7 +551,7 @@ msgstr "It is quite blunt."
#: ../../msn/msn_r0.c:807 ../../msn/msn_r3.c:1527
msgid "Armbanduhr"
-msgstr "watch"
+msgstr "Watch"
#: ../../msn/msn_r0.c:808 ../../msn/msn_r1_r.c:199
msgid "Discman"
@@ -585,7 +585,7 @@ msgstr "Energy depleted"
#. I18N: Artificial coma interrupted
#: ../../msn/msn_r1.c:112
msgid "Tiefschlafprozess abgebrochen"
-msgstr "Artificial coma interrupted"
+msgstr "Stasis interrupted"
#: ../../msn/msn_r1.c:120 ../../msn/msn_r1.c:156
msgid "Bitte legen Sie sich in die angezeigte Schlafkammer."
@@ -1138,7 +1138,7 @@ msgstr "Toilet"
#: ../../msn/msn_r1_r.c:161 ../../msn/msn_r1_r.c:176 ../../msn/msn_r2.c:1283
msgid "Schachspiel"
-msgstr "Game of chess"
+msgstr "Chessboard"
#: ../../msn/msn_r1_r.c:161
msgid "Es macht wohl Spaá, an|der Decke Schach zu spielen."
@@ -1530,7 +1530,7 @@ msgstr ""
#: ../../msn/msn_r2.c:617
msgid "Da! Die Supernova!"
-msgstr "There! The Supernova!"
+msgstr "There! The supernova!"
#: ../../msn/msn_r2.c:630
msgid "Zwei Minuten spter ..."
@@ -1603,7 +1603,7 @@ msgid ""
"Hmm ... im Moment fllt mir nichts ein, aber vielleicht|hat der Spieler des "
"Adventures ja eine Idee."
msgstr ""
-"Hmm ... at the moment I'm not sure,but maybe|the Adventure Game Player has "
+"Hmm ... at the moment I'm not sure, but maybe|the Adventure Game Player has "
"an idea."
#: ../../msn/msn_r2.c:725
@@ -1667,7 +1667,7 @@ msgstr "Earth? Never heard of it."
msgid ""
"Wahrscheinlich irgendein Kaff, wo Neuerungen|erst hundert Jahre spter "
"hingelangen."
-msgstr "Probably some Dump, where innovations|happen only a century late."
+msgstr "Probably some dump, where innovations|happen only a century late."
#: ../../msn/msn_r2.c:740
msgid "h ... kann sein."
@@ -1890,7 +1890,7 @@ msgid ""
"Sie,|nmlich zur Erforschung der Supernova."
msgstr ""
"We come from the planet Axacuss|and are here for the same reason as you,|"
-"namely, to investigate the Supernova."
+"namely, to observe the supernova."
#: ../../msn/msn_r2.c:1151
msgid "Sie knnen beruhigt sein, wir wollen Ihnen nur helfen."
Commit: fa426e4dc3070b5945367db704c3a78db7759960
https://github.com/scummvm/scummvm/commit/fa426e4dc3070b5945367db704c3a78db7759960
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:43Z
Commit Message:
SUPERNOVA: Fix clearing inventory when landing on Axacuss
If the player did pik up the discman earlier in the game,
it should be kept.
Also the inventory scroll needs to be reset after removing
almost all the objects as otherwise we may see what seems
to be an empty inventory with no arrow (although we can
still scroll when clicking on the space where the up arrow
should be).
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index b5ee3e1..f48c06c 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2322,9 +2322,15 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
_gm->reply(kStringArsanoMeetup3_27, 1, 1 + 128);
_gm->reply(kStringArsanoMeetup3_28, 1, 1 + 128);
_vm->paletteFadeOut();
+ // Remove all objects from the inventory except the Knife, Watch and Discman
_gm->_inventory.clear();
- _gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(1)); // Knife
- _gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(2)); // Watch
+ _gm->_inventoryScroll = 0;
+ if (_gm->_rooms[INTRO]->getObject(1)->hasProperty(CARRIED)) // Knife
+ _gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(1));
+ if (_gm->_rooms[INTRO]->getObject(2)->hasProperty(CARRIED)) // Watch
+ _gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(2));
+ if (_gm->_rooms[INTRO]->getObject(3)->hasProperty(CARRIED)) // Discman
+ _gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(3));
_gm->changeRoom(CELL);
_gm->_state._dream = true;
} else
Commit: f3e32d91a4d6ad6d89423e0425f1199b3aec7606
https://github.com/scummvm/scummvm/commit/f3e32d91a4d6ad6d89423e0425f1199b3aec7606
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:43Z
Commit Message:
SUPERNOVA: Remove unused function variant
Changed paths:
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 7f8475a..515304a 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1806,32 +1806,6 @@ void GameManager::dead(StringID messageId) {
_guiEnabled = true;
}
-// TODO: Remove this function when all the texts are properly extracted
-void GameManager::dead(const char *message) {
- _vm->paletteFadeOut();
- _guiEnabled = false;
- _vm->setCurrentImage(11);
- _vm->renderImage(0);
- _vm->renderMessage(message);
- _vm->playSound(kAudioDeath);
- _vm->paletteFadeIn();
- getInput();
- _vm->paletteFadeOut();
- _vm->removeMessage();
-
- // TODO: Load screen
- destroyRooms();
- initRooms();
- initState();
- initGui();
- _inventory.clear();
- changeRoom(CABIN_R3);
- g_system->fillScreen(kColorBlack);
- _vm->paletteFadeIn();
-
- _guiEnabled = true;
-}
-
int GameManager::invertSection(int section) {
if (section < 128)
section += 128;
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 7bb7b18..03bbc80 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -186,7 +186,6 @@ public:
void loadTime();
void saveTime();
void setAnimationTimer(int ticks);
- void dead(const char *message);
void dead(StringID messageId);
int dialog(int num, byte rowLength[6], StringID text[6], int number);
void sentence(int number, bool brightness);
Commit: 3b36afc80f24794e97468b01ca8a2e6828491a0a
https://github.com/scummvm/scummvm/commit/3b36afc80f24794e97468b01ca8a2e6828491a0a
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:43Z
Commit Message:
SUPERNOVA: Implement onEntrance for all corridors
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index f48c06c..465bab3 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2514,12 +2514,15 @@ bool AxacussCell::interact(Action verb, Object &obj1, Object &obj2) {
void AxacussCorridor1::onEntrance() {
+ _gm->corridorOnEntrance();
}
void AxacussCorridor2::onEntrance() {
+ _gm->corridorOnEntrance();
}
void AxacussCorridor3::onEntrance() {
+ _gm->corridorOnEntrance();
}
void AxacussCorridor4::onEntrance() {
@@ -2560,6 +2563,7 @@ bool AxacussCorridor4::interact(Action verb, Object &obj1, Object &obj2) {
}
void AxacussCorridor5::onEntrance() {
+ _gm->corridorOnEntrance();
}
bool AxacussCorridor5::handleMoneyDialog() {
@@ -2638,6 +2642,7 @@ bool AxacussCorridor5::interact(Action verb, Object &obj1, Object &obj2) {
}
void AxacussCorridor6::onEntrance() {
+ _gm->corridorOnEntrance();
}
bool AxacussCorridor6::interact(Action verb, Object &obj1, Object &obj2) {
@@ -2657,9 +2662,11 @@ bool AxacussCorridor6::interact(Action verb, Object &obj1, Object &obj2) {
}
void AxacussCorridor7::onEntrance() {
+ _gm->corridorOnEntrance();
}
void AxacussCorridor8::onEntrance() {
+ _gm->corridorOnEntrance();
}
bool AxacussCorridor8::interact(Action verb, Object &obj1, Object &obj2) {
@@ -2687,6 +2694,7 @@ bool AxacussCorridor8::interact(Action verb, Object &obj1, Object &obj2) {
}
void AxacussCorridor9::onEntrance() {
+ _gm->corridorOnEntrance();
}
bool AxacussCorridor9::interact(Action verb, Object &obj1, Object &obj2) {
Commit: 1d32c6ac2566d7be14d3038b6729fe4a862c6be1
https://github.com/scummvm/scummvm/commit/1d32c6ac2566d7be14d3038b6729fe4a862c6be1
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:43Z
Commit Message:
SUPERNOVA: Only call onEntrace once after changing room
Changed paths:
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 515304a..44ecfae 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1515,6 +1515,7 @@ void GameManager::roomBrightness() {
void GameManager::changeRoom(RoomID id) {
_currentRoom = _rooms[id];
+ _newRoom = true;
}
void GameManager::wait2(int ticks) {
@@ -2202,8 +2203,10 @@ void GameManager::executeRoom() {
else
_vm->paletteBrightness();
- if (!_currentRoom->hasSeen())
+ if (!_currentRoom->hasSeen() && _newRoom) {
_currentRoom->onEntrance();
+ _newRoom = false;
+ }
}
void GameManager::guardShot() {
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 03bbc80..e61519c 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -115,6 +115,7 @@ public:
int _mouseY;
int _mouseField;
Room *_currentRoom;
+ bool _newRoom;
Room *_rooms[NUMROOMS];
Inventory _inventory;
GameState _state;
Commit: d8284756bb346ed4aa9dfe5d97fe34ee37a84ca9
https://github.com/scummvm/scummvm/commit/d8284756bb346ed4aa9dfe5d97fe34ee37a84ca9
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:43Z
Commit Message:
SUPERNOVA: Fix warning when not finding image file
Changed paths:
engines/supernova/graphics.cpp
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index d461d79..21e2e79 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -50,7 +50,7 @@ MSNImageDecoder::~MSNImageDecoder() {
bool MSNImageDecoder::init(int filenumber) {
Common::File file;
if (!file.open(Common::String::format("msn_data.%03d", filenumber))) {
- warning("Image data file %s could not be read!", file.getName());
+ warning("Image data file msn_data.%03d could not be read!", filenumber);
return false;
}
Commit: bc78e613fdd187b2dec4e045c37c2178248ba195
https://github.com/scummvm/scummvm/commit/bc78e613fdd187b2dec4e045c37c2178248ba195
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:43Z
Commit Message:
SUPERNOVA: Do not try to render INTRO room
This room has no image and this avoids getting a warning
about image file not found.
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 6b1006a..63694aa 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -508,6 +508,9 @@ void SupernovaEngine::restoreScreen() {
}
void SupernovaEngine::renderRoom(Room &room) {
+ if (room.getId() == INTRO)
+ return;
+
if (setCurrentImage(room.getFileNumber())) {
for (int i = 0; i < _currentImage->_numSections; ++i) {
int section = i;
Commit: ab6ae19ab358254a84a804883513a9d2db0f059c
https://github.com/scummvm/scummvm/commit/ab6ae19ab358254a84a804883513a9d2db0f059c
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:43Z
Commit Message:
SUPERNOVA: Fix calling onEntrance for new rooms
There was an issue when the onEntrance for one room changes
the current room. It would then fail to call onEntrance for
that new room. This happened at lest once at the start as the
Intro room onEntrance() changes to the first room at the end
if the intro cutscene.
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 44ecfae..e199e15 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -2204,8 +2204,8 @@ void GameManager::executeRoom() {
_vm->paletteBrightness();
if (!_currentRoom->hasSeen() && _newRoom) {
- _currentRoom->onEntrance();
_newRoom = false;
+ _currentRoom->onEntrance();
}
}
Commit: 8ccb752c33f033c94e68f5d89e005123c294b6a4
https://github.com/scummvm/scummvm/commit/8ccb752c33f033c94e68f5d89e005123c294b6a4
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:43Z
Commit Message:
SUPERNOVA: Puts on suit when leaving the restaurant
genericInteraction() has a special case when you take off your helmet
in the restaurant, it strips you completely.
Once you leave it's supposed to put on your suit, helmet and supply
but instead if flagged generic objects as worn.
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 465bab3..1f8a3c8 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -1717,9 +1717,9 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
(_gm->_rooms[AIRLOCK]->getObject(5)->hasProperty(WORN)) &&
(_gm->_rooms[AIRLOCK]->getObject(6)->hasProperty(WORN)))) {
_vm->renderMessage(kStringArsanoEntrance26);
- getObject(4)->setProperty(WORN);
- getObject(5)->setProperty(WORN);
- getObject(6)->setProperty(WORN);
+ _gm->_rooms[AIRLOCK]->getObject(4)->setProperty(WORN);
+ _gm->_rooms[AIRLOCK]->getObject(5)->setProperty(WORN);
+ _gm->_rooms[AIRLOCK]->getObject(6)->setProperty(WORN);
_gm->waitOnInput(_gm->_timer1);
_vm->removeMessage();
}
Commit: b76ac8331ff269210f8a9face931ec39cdb50f5d
https://github.com/scummvm/scummvm/commit/b76ac8331ff269210f8a9face931ec39cdb50f5d
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:43Z
Commit Message:
SUPERNOVA: Fixes turntable message
Do not show a message that the record is scratched when either
the turnable is unplugged or the cable cut.
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 1f8a3c8..8bbb170 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -905,11 +905,12 @@ bool ShipCabinL3::interact(Action verb, Object &obj1, Object &obj2) {
_gm->wait2(3);
}
}
+
+ _vm->renderImage(15);
+ setSectionVisible(14, false);
+ setSectionVisible(13, false);
+ _vm->renderMessage(kStringShipCabinL3_3);
}
- _vm->renderImage(15);
- setSectionVisible(14, false);
- setSectionVisible(13, false);
- _vm->renderMessage(kStringShipCabinL3_3);
} else if ((verb == ACTION_TAKE) && (obj1._id == RECORD) && (obj1._click != 15)) {
_vm->renderImage(9);
setSectionVisible(13, false);
Commit: bb8dbdfc682290f3d4da5a9eb50455485351f5c8
https://github.com/scummvm/scummvm/commit/bb8dbdfc682290f3d4da5a9eb50455485351f5c8
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:44Z
Commit Message:
SUPERNOVA: Fixes game freeze in bcorrdior
Most of the time _objectState[MAX_OBJECT - 1] was used for
showing/hiding the GUI, here it was to indicate if the player
is currently hidden behind a pillar though.
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 8bbb170..2ec0836 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2729,8 +2729,9 @@ void AxacussBcorridor::onEntrance() {
bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
if (obj1.hasProperty(EXIT) ||
- ((verb == ACTION_USE) && obj1.hasProperty(COMBINABLE) && obj2.hasProperty(EXIT)))
- _gm->_guiEnabled = false;
+ ((verb == ACTION_USE) && obj1.hasProperty(COMBINABLE) && obj2.hasProperty(EXIT))) {
+ _gm->_state._playerHidden = false;
+ }
if ((verb == ACTION_CLOSE) && (obj1._id >= DOOR1) && (obj1._id <= DOOR4) && obj1.hasProperty(OPENED)) {
_vm->renderImage(_gm->invertSection(obj1._id - DOOR1 + 1));
@@ -2794,7 +2795,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
return false;
} else if ((verb == ACTION_WALK) && ((obj1._id == PILLAR1) || (obj1._id == PILLAR2))) {
_vm->renderMessage(kStringAxacussBcorridor_1);
- _gm->_guiEnabled = true;
+ _gm->_state._playerHidden = true;
} else
return false;
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index e199e15..6821065 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1091,7 +1091,7 @@ void GameManager::guardWalkEvent() {
walk(18);
}
- if (!_currentRoom->isSectionVisible(kMaxSection - 1)) {
+ if (!_state._playerHidden) {
if (_state._origin & 1)
walk(10);
else
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index e61519c..50a0ce1 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -56,6 +56,7 @@ struct GameState {
bool _powerOff;
bool _dream;
bool _nameSeen[4];
+ bool _playerHidden;
};
class Inventory {
Commit: 4a042c8465e286d884607ae513c03f9cbe74b0cf
https://github.com/scummvm/scummvm/commit/4a042c8465e286d884607ae513c03f9cbe74b0cf
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:44Z
Commit Message:
SUPERNOVA: Save/restore _playerHidden flag in savegames
Changed paths:
engines/supernova/state.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 6821065..ce1fbe8 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -59,6 +59,7 @@ bool GameManager::serialize(Common::WriteStream *out) {
out->writeByte(_state._dream);
for (int i = 0; i < 4; i++)
out->writeByte(_state._nameSeen[i]);
+ out->writeByte(_state._playerHidden);
// Inventory
out->writeSint32LE(_inventory.getSize());
@@ -122,6 +123,11 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
_state._nameSeen[i] = false;
}
+ if (version >= 8)
+ _state._playerHidden = in->readByte();
+ else
+ _state._playerHidden = false;
+
_oldTime = g_system->getMillis();
// Inventory
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index e3aeebb..7a68b8e 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -43,7 +43,7 @@
namespace Supernova {
#define SAVEGAME_HEADER MKTAG('M','S','N','1')
-#define SAVEGAME_VERSION 7
+#define SAVEGAME_VERSION 8
#define SUPERNOVA_DAT "supernova.dat"
#define SUPERNOVA_DAT_VERSION 1
Commit: dbb2632d1ee99be7dd99b14e0b47eb7d79c91b40
https://github.com/scummvm/scummvm/commit/dbb2632d1ee99be7dd99b14e0b47eb7d79c91b40
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:44Z
Commit Message:
SUPERNOVA: Rename kAudioUndef2 to kAudioSmash
Changed paths:
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 0aa62e6..e625bd9 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -55,7 +55,7 @@ enum AudioIndex {
kAudioCrash, // 45|0
kAudioVoiceHalt, // 46|0
kAudioGunShot, // 46|2510
- kAudioUndef2, // 46|4020
+ kAudioSmash, // 46|4020
kAudioVoiceSupernova, // 47|0
kAudioVoiceYeah, // 47|24010
kAudioUndef3, // 48|0
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 2ec0836..da6eafa 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2845,7 +2845,7 @@ bool AxacussExit::interact(Action verb, Object &obj1, Object &obj2) {
for (int i = 4; i <= 11; i++) {
_vm->renderImage(i);
if (i == 11)
- _vm->playSound(kAudioUndef2); // 046/4020
+ _vm->playSound(kAudioSmash); // 046/4020
_gm->wait2(1);
_vm->renderImage(i + 128);
}
@@ -2878,7 +2878,7 @@ bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
_vm->renderImage(4);
setSectionVisible(16, false);
- _vm->playSound(kAudioUndef2);
+ _vm->playSound(kAudioSmash);
} else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
if (isSectionVisible(4))
_vm->renderMessage(kStringBroken);
@@ -2959,7 +2959,7 @@ bool AxacussOffice2::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
_vm->renderImage(4);
setSectionVisible(16, false);
- _vm->playSound(kAudioUndef2);
+ _vm->playSound(kAudioSmash);
} else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
if (isSectionVisible(4))
_vm->renderMessage(kStringBroken);
@@ -2984,7 +2984,7 @@ bool AxacussOffice3::interact(Action verb, Object &obj1, Object &obj2) {
_vm->playSound(kAudioDoorOpen);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
_vm->renderImage(4);
- _vm->playSound(kAudioUndef2);
+ _vm->playSound(kAudioSmash);
} else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
if (isSectionVisible(4))
_vm->renderMessage(kStringBroken);
@@ -3012,7 +3012,7 @@ bool AxacussOffice4::interact(Action verb, Object &obj1, Object &obj2) {
_vm->playSound(kAudioDoorOpen);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
_vm->renderImage(4);
- _vm->playSound(kAudioUndef2);
+ _vm->playSound(kAudioSmash);
} else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
if (isSectionVisible(4))
_vm->renderMessage(kStringBroken);
@@ -3031,7 +3031,7 @@ void AxacussOffice5::onEntrance() {
bool AxacussOffice5::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
_vm->renderImage(4);
- _vm->playSound(kAudioUndef2);
+ _vm->playSound(kAudioSmash);
} else if ((verb == ACTION_TAKE) && (obj1._id == TICKETS)) {
_vm->renderImage(_gm->invertSection(5));
obj1._click = 255;
Commit: 639bc10906042d8c3950962e47812a61764c6af4
https://github.com/scummvm/scummvm/commit/639bc10906042d8c3950962e47812a61764c6af4
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:44Z
Commit Message:
SUPERNOVA: Disables OCCUPIED flag correctly
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index ce1fbe8..bfd0951 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1041,8 +1041,9 @@ void GameManager::walk(int imgId) {
void GameManager::guardWalkEvent() {
_prevImgId = 0;
- bool behind = (!_rooms[BCORRIDOR]->getObject(_state._origin + 4)->hasProperty(OCCUPIED) || _rooms[BCORRIDOR]->getObject(_state._origin + 4)->hasProperty(OPENED));
- _rooms[BCORRIDOR]->getObject(_state._origin + 4)->resetProperty(OCCUPIED);
+ bool behind = (!_rooms[BCORRIDOR]->getObject(_state._origin + 4)->hasProperty(OCCUPIED) ||
+ _rooms[BCORRIDOR]->getObject(_state._origin + 4)->hasProperty(OPENED));
+ _rooms[BCORRIDOR]->getObject(_state._origin + 4)->disableProperty(OCCUPIED);
if (_currentRoom == _rooms[BCORRIDOR]) {
if (_vm->_messageDisplayed)
_vm->removeMessage();
Commit: acfe2ab145eeccd3129f18a10120b3bc5259696d
https://github.com/scummvm/scummvm/commit/acfe2ab145eeccd3129f18a10120b3bc5259696d
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:44Z
Commit Message:
SUPERNOVA: Registers cmdButton clicks
Mouse clicks were consumed if a message was shown. This commit
introduces an exception for clicks on command buttons.
Also some refactoring.
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index bfd0951..8871721 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -528,15 +528,40 @@ void GameManager::resetInputState() {
}
void GameManager::processInput() {
+ enum {
+ onNone,
+ onObject,
+ onCmdButton,
+ onInventory,
+ onInventoryArrowUp,
+ onInventoryArrowDown
+ } mouseLocation;
+
+ if (_mouseField >= 0 && _mouseField < 256)
+ mouseLocation = onObject;
+ else if (_mouseField >= 256 && _mouseField < 512)
+ mouseLocation = onCmdButton;
+ else if (_mouseField >= 512 && _mouseField < 768)
+ mouseLocation = onInventory;
+ else if (_mouseField == 768)
+ mouseLocation = onInventoryArrowUp;
+ else if (_mouseField == 769)
+ mouseLocation = onInventoryArrowDown;
+ else
+ mouseLocation = onNone;
+
if (_mouseClickType == Common::EVENT_LBUTTONUP) {
if (_vm->_messageDisplayed) {
// Hide the message and consume the event
_vm->removeMessage();
- return;
+ if (mouseLocation != onCmdButton)
+ return;
}
- if (((_mouseField >= 0) && (_mouseField < 256)) ||
- ((_mouseField >= 512) && (_mouseField < 768))) {
+ switch(mouseLocation) {
+ case onObject:
+ case onInventory:
+ // Fallthrough
if (_inputVerb == ACTION_GIVE || _inputVerb == ACTION_USE) {
if (Object::isNullObject(_inputObject[0])) {
_inputObject[0] = _currentInputObject;
@@ -551,27 +576,34 @@ void GameManager::processInput() {
if (!Object::isNullObject(_currentInputObject))
_processInput = true;
}
- } else if (_mouseField >= 256 && _mouseField < 512) {
+ break;
+ case onCmdButton:
resetInputState();
_inputVerb = static_cast<Action>(_mouseField - 256);
- } else if (_mouseField == 768) {
+ break;
+ case onInventoryArrowUp:
if (_inventoryScroll >= 2)
_inventoryScroll -= 2;
- } else if (_mouseField == 769) {
+ break;
+ case onInventoryArrowDown:
if (_inventoryScroll < _inventory.getSize() - ARRAYSIZE(_guiInventory))
_inventoryScroll += 2;
+ break;
+ case onNone:
+ break;
}
+
} else if (_mouseClickType == Common::EVENT_RBUTTONUP) {
if (_vm->_messageDisplayed) {
// Hide the message and consume the event
_vm->removeMessage();
return;
}
+
if (Object::isNullObject(_currentInputObject))
return;
- if (((_mouseField >= 0) && (_mouseField < 256)) ||
- ((_mouseField >= 512) && (_mouseField < 768))) {
+ if (mouseLocation == onObject || mouseLocation == onInventory) {
_inputObject[0] = _currentInputObject;
ObjectTypes type = _inputObject[0]->_type;
if (type & OPENABLE)
@@ -628,27 +660,59 @@ void GameManager::processInput() {
}
if (_mouseField != field) {
- if (_mouseField >= 768)
+ switch (mouseLocation) {
+ case onInventoryArrowUp:
+ case onInventoryArrowDown:
+ // Fallthrough
_guiInventoryArrow[_mouseField - 768].setHighlight(false);
- else if (_mouseField >= 512)
+ break;
+ case onInventory:
_guiInventory[_mouseField - 512].setHighlight(false);
- else if (_mouseField >= 256)
+ break;
+ case onCmdButton:
_guiCommandButton[_mouseField - 256].setHighlight(false);
- else if (_mouseField != -1) {
+ break;
+ case onObject:
+ case onNone:
+ // Fallthrough
+ break;
}
Object::setObjectNull(_currentInputObject);
_mouseField = field;
- if (_mouseField >= 768)
+ if (_mouseField >= 0 && _mouseField < 256)
+ mouseLocation = onObject;
+ else if (_mouseField >= 256 && _mouseField < 512)
+ mouseLocation = onCmdButton;
+ else if (_mouseField >= 512 && _mouseField < 768)
+ mouseLocation = onInventory;
+ else if (_mouseField == 768)
+ mouseLocation = onInventoryArrowUp;
+ else if (_mouseField == 769)
+ mouseLocation = onInventoryArrowDown;
+ else
+ mouseLocation = onNone;
+
+ switch (mouseLocation) {
+ case onInventoryArrowUp:
+ case onInventoryArrowDown:
+ // Fallthrough
_guiInventoryArrow[_mouseField - 768].setHighlight(true);
- else if (_mouseField >= 512) {
+ break;
+ case onInventory:
_guiInventory[_mouseField - 512].setHighlight(true);
_currentInputObject = _inventory.get(_mouseField - 512 + _inventoryScroll);
- } else if (_mouseField >= 256)
+ break;
+ case onCmdButton:
_guiCommandButton[_mouseField - 256].setHighlight(true);
- else if (_mouseField != -1)
+ break;
+ case onObject:
_currentInputObject = _currentRoom->getObject(_mouseField);
+ break;
+ case onNone:
+ break;
+ }
}
}
}
Commit: d90fa9d74513d03884f289c92f588957a14334a4
https://github.com/scummvm/scummvm/commit/d90fa9d74513d03884f289c92f588957a14334a4
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:44Z
Commit Message:
SUPERNOVA: Fixes setting of properies
resetProperty() clears the object's property flag compared to
setProperty().
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index da6eafa..3a32579 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2357,7 +2357,7 @@ void AxacussCell::animation() {
_vm->renderImage(_gm->invertSection(31));
_vm->renderImage(28);
getObject(0)->_click = 255;
- getObject(1)->setProperty(EXIT | OPENABLE | OPENED | CLOSED);
+ getObject(1)->resetProperty(EXIT | OPENABLE | OPENED | CLOSED);
} else if ((_gm->_state._timeRobot >= 301) && (_gm->_state._timeRobot <= 320)) {
_vm->renderImage(_gm->invertSection(329 - _gm->_state._timeRobot));
_vm->renderImage(328 - _gm->_state._timeRobot);
@@ -2365,14 +2365,14 @@ void AxacussCell::animation() {
_vm->renderImage(31);
setSectionVisible(8, false);
getObject(0)->_click = 1;
- getObject(1)->setProperty(EXIT | OPENABLE | CLOSED);
+ getObject(1)->resetProperty(EXIT | OPENABLE | CLOSED);
}
if (_gm->_state._timeRobot == 599) {
_vm->renderImage(_gm->invertSection(31));
_vm->renderImage(8);
getObject(0)->_click = 255;
- getObject(1)->setProperty(EXIT | OPENABLE | OPENED | CLOSED);
+ getObject(1)->resetProperty(EXIT | OPENABLE | OPENED | CLOSED);
} else if ((_gm->_state._timeRobot >= 601) && (_gm->_state._timeRobot <= 620)) {
_vm->renderImage(_gm->_state._timeRobot - 593 + 128);
_vm->renderImage(_gm->_state._timeRobot - 592);
@@ -2380,7 +2380,7 @@ void AxacussCell::animation() {
_vm->renderImage(31);
setSectionVisible(28, false);
getObject(0)->_click = 1;
- getObject(1)->setProperty(EXIT | OPENABLE | CLOSED);
+ getObject(1)->resetProperty(EXIT | OPENABLE | CLOSED);
} else if (_gm->_state._timeRobot == 700)
_gm->_state._timeRobot = 0;
else if (_gm->_state._timeRobot == 10002) {
@@ -2651,7 +2651,7 @@ bool AxacussCorridor6::interact(Action verb, Object &obj1, Object &obj2) {
(obj1.hasProperty(OPENED))) {
_vm->renderImage(6);
setSectionVisible(7, false);
- obj1.setProperty(EXIT | OPENABLE | CLOSED);
+ obj1.resetProperty(EXIT | OPENABLE | CLOSED);
_gm->_rooms[CORRIDOR8]->setSectionVisible(27, false);
_gm->_rooms[CORRIDOR8]->setSectionVisible(28, true);
_gm->_rooms[CORRIDOR8]->getObject(0)->disableProperty(OPENED);
@@ -2677,7 +2677,7 @@ bool AxacussCorridor8::interact(Action verb, Object &obj1, Object &obj2) {
obj1.setProperty(OPENED);
_gm->_rooms[CORRIDOR6]->setSectionVisible(6, false);
_gm->_rooms[CORRIDOR6]->setSectionVisible(7, true);
- _gm->_rooms[CORRIDOR6]->getObject(2)->setProperty(EXIT | OPENED | OPENABLE);
+ _gm->_rooms[CORRIDOR6]->getObject(2)->resetProperty(EXIT | OPENED | OPENABLE);
_gm->_rooms[CORRIDOR6]->getObject(2)->_click = 4;
_vm->playSound(kAudioDoorOpen);
} else if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) && (obj1._type & OPENED)) {
@@ -2686,7 +2686,7 @@ bool AxacussCorridor8::interact(Action verb, Object &obj1, Object &obj2) {
obj1.disableProperty(OPENED);
_gm->_rooms[CORRIDOR6]->setSectionVisible(6, true);
_gm->_rooms[CORRIDOR6]->setSectionVisible(7, false);
- _gm->_rooms[CORRIDOR6]->getObject(2)->setProperty(EXIT | CLOSED | OPENABLE);
+ _gm->_rooms[CORRIDOR6]->getObject(2)->resetProperty(EXIT | CLOSED | OPENABLE);
_vm->playSound(kAudioDoorClose);
} else
return false;
@@ -2736,15 +2736,17 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_CLOSE) && (obj1._id >= DOOR1) && (obj1._id <= DOOR4) && obj1.hasProperty(OPENED)) {
_vm->renderImage(_gm->invertSection(obj1._id - DOOR1 + 1));
_vm->playSound(kAudioDoorClose);
+ obj1.disableProperty(OPENED);
+ obj1.setProperty(CLOSED);
if (obj1.hasProperty(OCCUPIED)) {
_gm->_state._destination = 255;
- obj1.setProperty(EXIT | OPENABLE | CLOSED | CAUGHT);
+ obj1.disableProperty(OCCUPIED);
+ obj1.setProperty(CAUGHT);
if (!_gm->_rooms[OFFICE_L1 + obj1._id - DOOR1]->isSectionVisible(4))
_gm->search(180);
else
_gm->_state._eventTime = 0xffffffff;
- } else
- obj1.setProperty(EXIT | OPENABLE | CLOSED);
+ }
} else if (((verb == ACTION_WALK) || ((verb == ACTION_OPEN) && !obj1.hasProperty(OPENED))) &&
(obj1._id >= DOOR1) && (obj1._id <= DOOR4) &&
obj1.hasProperty(OCCUPIED)) {
@@ -2758,7 +2760,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
_vm->playSound(kAudioDoorOpen);
if (getObject(4)->hasProperty(CAUGHT))
_gm->busted(11);
- getObject(4)->setProperty(EXIT | OPENABLE | OPENED);
+ getObject(4)->resetProperty(EXIT | OPENABLE | OPENED);
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR2) && !getObject(5)->hasProperty(OPENED)) {
if (getObject(5)->hasProperty(OCCUPIED))
@@ -2768,7 +2770,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
_vm->playSound(kAudioDoorOpen);
if (getObject(5)->hasProperty(CAUGHT))
_gm->busted(16);
- getObject(5)->setProperty(EXIT | OPENABLE | OPENED);
+ getObject(5)->resetProperty(EXIT | OPENABLE | OPENED);
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR3) && !getObject(6)->hasProperty(OPENED)) {
if (getObject(6)->hasProperty(OCCUPIED))
@@ -2778,7 +2780,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
_vm->playSound(kAudioDoorOpen);
if (getObject(6)->hasProperty(CAUGHT))
_gm->busted(15);
- getObject(6)->setProperty(EXIT | OPENABLE | OPENED);
+ getObject(6)->resetProperty(EXIT | OPENABLE | OPENED);
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR4) && !getObject(7)->hasProperty(OPENED)) {
if (getObject(7)->hasProperty(OCCUPIED)) {
@@ -2788,7 +2790,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
_vm->playSound(kAudioDoorOpen);
if (getObject(7)->hasProperty(CAUGHT))
_gm->busted(20);
- getObject(7)->setProperty(EXIT | OPENABLE | OPENED);
+ getObject(7)->resetProperty(EXIT | OPENABLE | OPENED);
}
} else if ((verb == ACTION_LOOK) && (obj1._id >= DOOR1) && (obj1._id <= DOOR4)) {
_gm->_state._nameSeen[obj1._id - DOOR1] = true;
@@ -2868,12 +2870,14 @@ bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
obj1.hasProperty(OPENED)) {
_vm->renderImage(_gm->invertSection(9));
- obj1.setProperty(EXIT | OPENABLE | CLOSED);
+ obj1.disableProperty(OPENED);
+ obj1.setProperty(CLOSED);
_vm->playSound(kAudioDoorClose);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR) &&
!getObject(0)->hasProperty(OPENED)) {
_vm->renderImage(9);
- getObject(0)->setProperty(EXIT | OPENABLE | OPENED);
+ getObject(0)->disableProperty(CLOSED);
+ getObject(0)->setProperty(OPENED);
_vm->playSound(kAudioDoorOpen);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
_vm->renderImage(4);
@@ -2901,7 +2905,7 @@ bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
} else {
_vm->renderImage(6);
setSectionVisible(7, false);
- obj1.setProperty(OPENABLE | OPENED);
+ obj1.resetProperty(OPENABLE | OPENED);
if (getObject(2)->hasProperty(TAKE)) {
_vm->renderImage(8);
getObject(2)->_click = 9;
@@ -2913,7 +2917,7 @@ bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
} else if ((verb == ACTION_CLOSE) && (obj1._id == LOCKER) && obj1.hasProperty(OPENED)) {
_vm->renderImage(7);
setSectionVisible(6, false);
- obj1.setProperty(OPENABLE | CLOSED);
+ obj1.resetProperty(OPENABLE | CLOSED);
setSectionVisible(8, false);
getObject(2)->_click = 255;
_vm->playSound(kAudioDoorClose);
@@ -2950,11 +2954,13 @@ bool AxacussOffice2::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
obj1.hasProperty(OPENED)) {
_vm->renderImage(_gm->invertSection(9));
- obj1.setProperty(EXIT | OPENABLE | CLOSED);
+ obj1.disableProperty(OPENED);
+ obj1.setProperty(CLOSED);
_vm->playSound(kAudioDoorClose);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR) && !getObject(0)->hasProperty(OPENED)) {
_vm->renderImage(9);
- getObject(0)->setProperty(EXIT | OPENABLE | OPENED);
+ getObject(0)->disableProperty(CLOSED);
+ getObject(0)->setProperty(OPENED);
_vm->playSound(kAudioDoorOpen);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
_vm->renderImage(4);
@@ -2975,12 +2981,14 @@ bool AxacussOffice3::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
obj1.hasProperty(OPENED)) {
_vm->renderImage(_gm->invertSection(3));
- obj1.setProperty(EXIT | OPENABLE | CLOSED);
+ obj1.disableProperty(OPENED);
+ obj1.setProperty(CLOSED);
_vm->playSound(kAudioDoorClose);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR) &&
!getObject(0)->hasProperty(OPENED)) {
_vm->renderImage(3);
- getObject(0)->setProperty(EXIT | OPENABLE | OPENED);
+ getObject(0)->disableProperty(CLOSED);
+ getObject(0)->setProperty(OPENED);
_vm->playSound(kAudioDoorOpen);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
_vm->renderImage(4);
@@ -3003,12 +3011,14 @@ bool AxacussOffice3::interact(Action verb, Object &obj1, Object &obj2) {
bool AxacussOffice4::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) && obj1.hasProperty(OPENED)) {
_vm->renderImage(_gm->invertSection(3));
- obj1.setProperty(EXIT | OPENABLE | CLOSED);
+ obj1.disableProperty(OPENED);
+ obj1.setProperty(CLOSED);
_vm->playSound(kAudioDoorClose);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR) &&
!getObject(0)->hasProperty(OPENED)) {
_vm->renderImage(3);
- getObject(0)->setProperty(EXIT | OPENABLE | OPENED);
+ getObject(0)->disableProperty(CLOSED);
+ getObject(0)->setProperty(OPENED);
_vm->playSound(kAudioDoorOpen);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
_vm->renderImage(4);
Commit: b6bb1f9709e345add857ac0a2bcd6a926d6133d5
https://github.com/scummvm/scummvm/commit/b6bb1f9709e345add857ac0a2bcd6a926d6133d5
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:44Z
Commit Message:
SUPERNOVA: Corrects max value for int32
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/state.cpp
engines/supernova/supernova.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 3a32579..7175371 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2745,7 +2745,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
if (!_gm->_rooms[OFFICE_L1 + obj1._id - DOOR1]->isSectionVisible(4))
_gm->search(180);
else
- _gm->_state._eventTime = 0xffffffff;
+ _gm->_state._eventTime = 0x7FFFFFF;
}
} else if (((verb == ACTION_WALK) || ((verb == ACTION_OPEN) && !obj1.hasProperty(OPENED))) &&
(obj1._id >= DOOR1) && (obj1._id <= DOOR4) &&
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 8871721..3f9f38a 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -368,7 +368,7 @@ void GameManager::initState() {
_state._time = ticksToMsec(916364); // 2 pm
_state._timeSleep = 0;
_state._timeAlarm = ticksToMsec(458182); // 7 am
- _state._eventTime = 0xffffffff;
+ _state._eventTime = 0x7FFFFFFF;
_state._eventCallback = kNoFn;
_state._arrivalDaysLeft = 2840;
_state._shipEnergyDaysLeft = 2135;
@@ -849,7 +849,7 @@ void GameManager::telomat(int nr) {
}
_rooms[BCORRIDOR]->setSectionVisible(7, true);
_rooms[BCORRIDOR]->setSectionVisible(i + 1, true);
- _state._eventTime = 0xffffffff;
+ _state._eventTime = 0x7FFFFFFF;
_currentRoom->addSentence(0, 1);
}
_guiEnabled = true;
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 63694aa..b13b521 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -186,7 +186,7 @@ void SupernovaEngine::updateEvents() {
if (_gm->_state._eventCallback != kNoFn && _gm->_state._time >= _gm->_state._eventTime) {
_allowLoadGame = false;
_allowSaveGame = false;
- _gm->_state._eventTime = 0xffffffff;
+ _gm->_state._eventTime = 0x7FFFFFFF;
EventFunction fn = _gm->_state._eventCallback;
_gm->_state._eventCallback = kNoFn;
switch (fn) {
Commit: 6e7da438896b4fe089c90d26d4d2e1aab934677a
https://github.com/scummvm/scummvm/commit/6e7da438896b4fe089c90d26d4d2e1aab934677a
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:44Z
Commit Message:
SUPERNOVA: Introduces INT32_MAX for eventTime
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/state.cpp
engines/supernova/state.h
engines/supernova/supernova.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 7175371..24d9c83 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2745,7 +2745,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
if (!_gm->_rooms[OFFICE_L1 + obj1._id - DOOR1]->isSectionVisible(4))
_gm->search(180);
else
- _gm->_state._eventTime = 0x7FFFFFF;
+ _gm->_state._eventTime = INT32_MAX;
}
} else if (((verb == ACTION_WALK) || ((verb == ACTION_OPEN) && !obj1.hasProperty(OPENED))) &&
(obj1._id >= DOOR1) && (obj1._id <= DOOR4) &&
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 3f9f38a..7a77705 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -368,7 +368,7 @@ void GameManager::initState() {
_state._time = ticksToMsec(916364); // 2 pm
_state._timeSleep = 0;
_state._timeAlarm = ticksToMsec(458182); // 7 am
- _state._eventTime = 0x7FFFFFFF;
+ _state._eventTime = INT32_MAX;
_state._eventCallback = kNoFn;
_state._arrivalDaysLeft = 2840;
_state._shipEnergyDaysLeft = 2135;
@@ -849,7 +849,7 @@ void GameManager::telomat(int nr) {
}
_rooms[BCORRIDOR]->setSectionVisible(7, true);
_rooms[BCORRIDOR]->setSectionVisible(i + 1, true);
- _state._eventTime = 0x7FFFFFFF;
+ _state._eventTime = INT32_MAX;
_currentRoom->addSentence(0, 1);
}
_guiEnabled = true;
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 50a0ce1..568d4cf 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -29,6 +29,8 @@
namespace Supernova {
+const int32 INT32_MAX = 0x7FFFFFFF;
+
enum EventFunction { kNoFn, kSupernovaFn, kGuardReturnedFn, kGuardWalkFn, kTaxiFn, kSearchStartFn };
struct GameState {
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index b13b521..c3846d0 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -186,7 +186,7 @@ void SupernovaEngine::updateEvents() {
if (_gm->_state._eventCallback != kNoFn && _gm->_state._time >= _gm->_state._eventTime) {
_allowLoadGame = false;
_allowSaveGame = false;
- _gm->_state._eventTime = 0x7FFFFFFF;
+ _gm->_state._eventTime = INT32_MAX;
EventFunction fn = _gm->_state._eventCallback;
_gm->_state._eventCallback = kNoFn;
switch (fn) {
Commit: 8451f70c9758f991bb616479e77b12b984560ff2
https://github.com/scummvm/scummvm/commit/8451f70c9758f991bb616479e77b12b984560ff2
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:44Z
Commit Message:
SUPERNOVA: Sets CARRIED flag when added to inventory
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 7a77705..347e9dc 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -159,8 +159,10 @@ Inventory::Inventory() : _numObjects(0) {
// TODO: Update Inventory surface for scrolling
void Inventory::add(Object &obj) {
- if (_numObjects < kMaxCarry)
+ if (_numObjects < kMaxCarry) {
_inventory[_numObjects++] = &obj;
+ obj.setProperty(CARRIED);
+ }
// if (inventory_amount>8) inventory_scroll = ((inventory_amount+1)/2)*2-8;
// show_inventory();
Commit: 996d5c082e8bae3f14c7adf4c4ac94c5ca8ffd30
https://github.com/scummvm/scummvm/commit/996d5c082e8bae3f14c7adf4c4ac94c5ca8ffd30
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:44Z
Commit Message:
SUPERNOVA: Replaces TICKETS with MONEY
Changed paths:
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
engines/supernova/rooms.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index e625bd9..8837f1d 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -394,9 +394,7 @@ enum ObjectID {
PILLAR1,PILLAR2,DOOR1,DOOR2,DOOR3,DOOR4,
GUARDIAN,LAMP,
MASTERKEYCARD,PAINTING,MONEY,LOCKER,LETTER,
- JUNGLE,STATION_SLOT,STATION_SIGN,
-
- TICKETS
+ JUNGLE,STATION_SLOT,STATION_SIGN
};
enum StringID {
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 24d9c83..0c80d11 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2921,7 +2921,7 @@ bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
setSectionVisible(8, false);
getObject(2)->_click = 255;
_vm->playSound(kAudioDoorClose);
- } else if ((verb == ACTION_TAKE) && (obj1._id == TICKETS)) {
+ } else if ((verb == ACTION_TAKE) && (obj1._id == MONEY)) {
_vm->renderImage(6);
setSectionVisible(8, false);
getObject(2)->_click = 255;
@@ -3042,7 +3042,7 @@ bool AxacussOffice5::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
_vm->renderImage(4);
_vm->playSound(kAudioSmash);
- } else if ((verb == ACTION_TAKE) && (obj1._id == TICKETS)) {
+ } else if ((verb == ACTION_TAKE) && (obj1._id == MONEY)) {
_vm->renderImage(_gm->invertSection(5));
obj1._click = 255;
_gm->takeMoney(350);
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index ad28afb..3795842 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -1223,7 +1223,7 @@ public:
_objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,9,BCORRIDOR,9);
_objectState[1] = Object(_id, kStringComputer,kStringDefaultDescription,COMPUTER,COMBINABLE,4,4,0);
- _objectState[2] = Object(_id, kStringMoney,kStringMoneyDescription1,TICKETS,TAKE,255,255,0);
+ _objectState[2] = Object(_id, kStringMoney,kStringMoneyDescription1,MONEY,TAKE,255,255,0);
_objectState[3] = Object(_id, kStringLocker,kStringLockerDescription,LOCKER,OPENABLE|CLOSED,5,5,0);
_objectState[4] = Object(_id, kStringLetter,kStringDefaultDescription,LETTER,UNNECESSARY,3,3,0);
}
@@ -1310,7 +1310,7 @@ public:
_objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,17,GUARD3,9);
_objectState[1] = Object(_id, kStringComputer,kStringComputerDescription,COMPUTER,COMBINABLE,4,4,0);
_objectState[2] = Object(_id, kStringGraffiti,kStringGraffitiDescription,NULLOBJECT,NULLTYPE,7,7,0);
- _objectState[3] = Object(_id, kStringMoney,kStringMoneyDescription2,TICKETS,TAKE,8,8,0);
+ _objectState[3] = Object(_id, kStringMoney,kStringMoneyDescription2,MONEY,TAKE,8,8,0);
}
virtual void onEntrance();
Commit: 586162760259fb226dfc8f3a3175f0ac290407b8
https://github.com/scummvm/scummvm/commit/586162760259fb226dfc8f3a3175f0ac290407b8
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:44Z
Commit Message:
SUPERNOVA: Implements money object for inventory
Changed paths:
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
engines/supernova/state.cpp
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 8837f1d..874d71e 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -552,7 +552,10 @@ enum StringID {
kStringTelomat18, kStringTelomat19, kStringTelomat20, kStringTelomat21, kStringAlarm,
// Add two placeholder strings at the end for variable text
- kStringPlaceholder1, kStringPlaceholder2
+ kStringPlaceholder1, kStringPlaceholder2,
+
+ // String for money in inventory
+ kStringInventoryMoney
};
static StringID guiCommands[] = {
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 0c80d11..4f325aa 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -116,6 +116,9 @@ Intro::Intro(SupernovaEngine *vm, GameManager *gm) {
_objectState[3] =
Object(_id, kStringDiscman, kStringDiscmanDescription, DISCMAN,
TAKE | COMBINABLE, 255, 255, 0, NULLROOM, 0);
+ _objectState[4] =
+ Object(_id, kStringInventoryMoney, kStringDefaultDescription, MONEY,
+ TAKE | COMBINABLE, 255, 255, 0);
_shouldExit = false;
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 347e9dc..71d6bc2 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -100,6 +100,7 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
_state._greatFlag = in->readUint16LE();
_state._timeRobot = in->readSint16LE();
_state._money = in->readSint16LE();
+ _vm->setGameString(kStringInventoryMoney, Common::String::format("%d Xa", _state._money));
_state._coins = in->readByte();
_state._shoes = in->readByte();
if (version >= 6)
@@ -1452,7 +1453,6 @@ void GameManager::takeObject(Object &obj) {
if (obj._section != 0)
_vm->renderImage(obj._section);
- obj.setProperty(CARRIED);
obj._click = obj._click2 = 255;
_inventory.add(obj);
if (_inventory.getSize() > _inventoryScroll + 8) {
@@ -1482,6 +1482,7 @@ void GameManager::drawInventory() {
_guiInventory[i].width(),
_guiInventory[i].height(),
_guiInventory[i]._bgColor);
+
_vm->renderText(_inventory.get(i + _inventoryScroll)->_name,
_guiInventory[i]._textPosition.x,
_guiInventory[i]._textPosition.y,
@@ -1803,20 +1804,17 @@ void GameManager::shot(int a, int b) {
}
void GameManager::takeMoney(int amount) {
+ Object *moneyObject = _rooms[INTRO]->getObject(4);
_state._money += amount;
- if (amount > 0)
- great(0);
- // TODO: kmaxobject - 1?
-// _rooms[OFFICE_R1]->getObject(5)->_name = _rooms[OFFICE_R1]->getObject(kMaxObject - 1);
-// _rooms[OFFICE_R1]->object[5].name = &(_rooms[OFFICE_R1]->object[MAX_OBJECT-1]);
-// strcpy(_rooms[OFFICE_R1]->object[5].name,ltoa((long)_state.money));
-// strcat(_rooms[OFFICE_R1]->object[5].name," Xa");
-
- if (_state._money) {
- if (!_rooms[OFFICE_R1]->getObject(5)->hasProperty(CARRIED))
- takeObject(*_rooms[OFFICE_R1]->getObject(5));
- } else
- _inventory.remove(*_rooms[OFFICE_R1]->getObject(5));
+ _vm->setGameString(kStringInventoryMoney, Common::String::format("%d Xa", _state._money));
+
+ if (_state._money > 0) {
+ takeObject(*moneyObject);
+ if (amount > 0)
+ great(0);
+ } else {
+ _inventory.remove(*moneyObject);
+ }
}
void GameManager::drawStatus() {
Commit: 3ae3ee6978f91beed9d6bb38f441db25103e28b7
https://github.com/scummvm/scummvm/commit/3ae3ee6978f91beed9d6bb38f441db25103e28b7
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:44Z
Commit Message:
SUPERNOVA: Fixes inventory scrolling
Correctly moves inventory view when items are added/removed/cleared
Changed paths:
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 71d6bc2..5eabbda 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -155,24 +155,24 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
return !in->err();
}
-Inventory::Inventory() : _numObjects(0) {
-}
-
-// TODO: Update Inventory surface for scrolling
void Inventory::add(Object &obj) {
if (_numObjects < kMaxCarry) {
_inventory[_numObjects++] = &obj;
obj.setProperty(CARRIED);
}
-// if (inventory_amount>8) inventory_scroll = ((inventory_amount+1)/2)*2-8;
-// show_inventory();
+ if (getSize() > _inventoryScroll + 8) {
+ _inventoryScroll = getSize() - 8;
+ _inventoryScroll += _inventoryScroll % 2;
+ }
}
-// TODO: Update Inventory surface for scrolling
void Inventory::remove(Object &obj) {
for (int i = 0; i < _numObjects; ++i) {
if (_inventory[i] == &obj) {
+ if (_inventoryScroll >= 2 && getSize() % 2)
+ _inventoryScroll -= 2;
+
--_numObjects;
while (i < _numObjects) {
_inventory[i] = _inventory[i + 1];
@@ -185,6 +185,7 @@ void Inventory::remove(Object &obj) {
void Inventory::clear() {
_numObjects = 0;
+ _inventoryScroll = 0;
}
Object *Inventory::get(int index) const {
@@ -272,9 +273,9 @@ static Common::String timeToString(int msec) {
return Common::String(s);
}
-GameManager::GameManager(SupernovaEngine *vm) {
- _vm = vm;
-
+GameManager::GameManager(SupernovaEngine *vm)
+ : _inventory(_inventoryScroll)
+ , _vm(vm) {
initRooms();
changeRoom(INTRO);
initState();
@@ -1455,10 +1456,6 @@ void GameManager::takeObject(Object &obj) {
_vm->renderImage(obj._section);
obj._click = obj._click2 = 255;
_inventory.add(obj);
- if (_inventory.getSize() > _inventoryScroll + 8) {
- _inventoryScroll = _inventory.getSize() - 8;
- _inventoryScroll += _inventoryScroll % 2;
- }
}
void GameManager::drawCommandBox() {
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 568d4cf..e47c906 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -63,7 +63,10 @@ struct GameState {
class Inventory {
public:
- Inventory();
+ Inventory(int &inventoryScroll)
+ : _numObjects(0)
+ , _inventoryScroll(inventoryScroll)
+ {}
void add(Object &obj);
void remove(Object &obj);
@@ -74,6 +77,7 @@ public:
private:
Object *_inventory[kMaxCarry];
+ int &_inventoryScroll;
int _numObjects;
};
Commit: c1f6d41ce0b879f6a170f64214059c4572d90b9c
https://github.com/scummvm/scummvm/commit/c1f6d41ce0b879f6a170f64214059c4572d90b9c
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:45Z
Commit Message:
SUPERNOVA: Fixes outro cutscene
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 4f325aa..4ab3a67 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -3135,7 +3135,7 @@ bool AxacussStation::interact(Action verb, Object &obj1, Object &obj2) {
_gm->wait2(18);
_vm->renderImage(_gm->invertSection(1));
for (int i = 2; i <= 7; i++) {
- _vm->renderImage(_gm->invertSection(i));
+ _vm->renderImage(i);
_gm->wait2(3);
_vm->renderImage(_gm->invertSection(i));
}
Commit: 7ba9d94a899fc978c61f126ccc5d03be33e25a63
https://github.com/scummvm/scummvm/commit/7ba9d94a899fc978c61f126ccc5d03be33e25a63
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:45Z
Commit Message:
SUPERNOVA: Renames audio constants
Changed paths:
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
engines/supernova/state.cpp
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 874d71e..7d6076a 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -51,23 +51,23 @@ enum MessagePosition {
};
enum AudioIndex {
- kAudioGreat, // 44|0
+ kAudioFoundLocation, // 44|0
kAudioCrash, // 45|0
kAudioVoiceHalt, // 46|0
kAudioGunShot, // 46|2510
kAudioSmash, // 46|4020
kAudioVoiceSupernova, // 47|0
kAudioVoiceYeah, // 47|24010
- kAudioUndef3, // 48|0
- kAudioUndef4, // 48|2510
+ kAudioRobotShock, // 48|0
+ kAudioRobotBreaks, // 48|2510
kAudioShock, // 48|10520
kAudioTurntable, // 48|13530
kAudioSiren, // 50|0
- kAudioUndef6, // 50|12786
+ kAudioSnoring, // 50|12786
kAudioRocks, // 51|0
kAudioDeath, // 53|0
kAudioAlarm, // 54|0
- kAudioUndef7, // 54|8010
+ kAudioSuccess, // 54|8010
kAudioDoorSound, // 54|24020
kAudioDoorOpen, // 54|30030
kAudioDoorClose, // 54|31040
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 4ab3a67..bd06524 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -457,15 +457,15 @@ void Intro::cutscene() {
_vm->_brightness = 0;
_vm->paletteBrightness();
exitOnEscape(10);
- _vm->playSound(kAudioUndef6);
+ _vm->playSound(kAudioSnoring);
while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
;
exitOnEscape(10);
- _vm->playSound(kAudioUndef6);
+ _vm->playSound(kAudioSnoring);
while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
;
exitOnEscape(10);
- _vm->playSound(kAudioUndef6);
+ _vm->playSound(kAudioSnoring);
while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
;
exitOnEscape(30);
@@ -1446,7 +1446,7 @@ void ArsanoMeetup::onEntrance() {
_vm->renderImage(_gm->invertSection(6));
}
if (!(_gm->_state._greatFlag & 0x8000)) {
- _vm->playSound(kAudioGreat);
+ _vm->playSound(kAudioFoundLocation);
_gm->_state._greatFlag |= 0x8000;
}
}
@@ -2396,7 +2396,7 @@ void AxacussCell::animation() {
_vm->renderImage(30);
getObject(8)->_click = 12;
getObject(7)->_click = 14;
- _vm->playSound(kAudioUndef4);
+ _vm->playSound(kAudioRobotBreaks);
} else if (_gm->_state._timeRobot == 10010)
--_gm->_state._timeRobot;
@@ -2410,7 +2410,7 @@ void AxacussCell::animation() {
if ((isSectionVisible(6)) &&
((_gm->_state._timeRobot == 310) || (_gm->_state._timeRobot == 610))) {
- _vm->playSound(kAudioUndef3);
+ _vm->playSound(kAudioRobotShock);
_gm->_state._timeRobot = 10000;
}
@@ -3078,7 +3078,7 @@ bool AxacussElevator::interact(Action verb, Object &obj1, Object &obj2) {
getObject(3)->_click = 2;
_vm->renderImage(_gm->invertSection(1));
if (!(_gm->_state._greatFlag & 0x4000)) {
- _vm->playSound(kAudioGreat);
+ _vm->playSound(kAudioFoundLocation);
_gm->_state._greatFlag |= 0x4000;
}
}
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 5eabbda..7dc34cf 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1289,7 +1289,7 @@ void GameManager::great(uint number) {
if (number && (_state._greatFlag & (1 << number)))
return;
- _vm->playSound(kAudioUndef7);
+ _vm->playSound(kAudioSuccess);
_state._greatFlag |= 1 << number;
}
Commit: d69480b52ebb5850aa4fc77dea65d16e0c6b8adf
https://github.com/scummvm/scummvm/commit/d69480b52ebb5850aa4fc77dea65d16e0c6b8adf
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:45Z
Commit Message:
SUPERNOVA: Renames audio constants
Changed paths:
engines/supernova/msn_def.h
engines/supernova/rooms.cpp
engines/supernova/state.cpp
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 7d6076a..2649137 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -68,7 +68,7 @@ enum AudioIndex {
kAudioDeath, // 53|0
kAudioAlarm, // 54|0
kAudioSuccess, // 54|8010
- kAudioDoorSound, // 54|24020
+ kAudioSlideDoor, // 54|24020
kAudioDoorOpen, // 54|30030
kAudioDoorClose, // 54|31040
kAudioNumSamples
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index bd06524..0c4d84d 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -509,7 +509,7 @@ void Intro::leaveCutscene() {
bool ShipCorridor::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_PRESS) && (obj1._id == BUTTON)) {
if (_objectState[6].hasProperty(OPENED)) {
- _vm->playSound(kAudioDoorSound);
+ _vm->playSound(kAudioSlideDoor);
_objectState[6].disableProperty(OPENED);
_vm->renderImage(8);
setSectionVisible(9, false);
@@ -519,7 +519,7 @@ bool ShipCorridor::interact(Action verb, Object &obj1, Object &obj2) {
_gm->wait2(2);
_vm->renderImage(_gm->invertSection(7));
} else {
- _vm->playSound(kAudioDoorSound);
+ _vm->playSound(kAudioSlideDoor);
_objectState[6].setProperty(OPENED);
_vm->renderImage(7);
_gm->wait2(2);
@@ -1014,7 +1014,7 @@ bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_PRESS) && (obj1._id == BUTTON1)) {
if (!getObject(1)->hasProperty(OPENED)) {
_vm->renderImage(10);
- _vm->playSound(kAudioDoorSound);
+ _vm->playSound(kAudioSlideDoor);
if (getObject(0)->hasProperty(OPENED)) {
getObject(0)->disableProperty(OPENED);
_vm->renderImage(1);
@@ -1040,7 +1040,7 @@ bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) {
if (!getObject(0)->hasProperty(OPENED)) {
_vm->renderImage(11);
if (getObject(1)->hasProperty(OPENED)) {
- _vm->playSound(kAudioDoorSound);
+ _vm->playSound(kAudioSlideDoor);
getObject(1)->disableProperty(OPENED);
_vm->renderImage(4);
_gm->wait2(2);
@@ -1083,7 +1083,7 @@ bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) {
_gm->wait2(3);
_vm->renderImage(17);
setSectionVisible(16, false);
- _vm->playSound(kAudioDoorSound);
+ _vm->playSound(kAudioSlideDoor);
_vm->renderImage(5);
setSectionVisible(6, false);
_gm->wait2(2);
@@ -1276,7 +1276,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_OPEN) && (obj1._id == OUTERHATCH)) {
if (obj1.hasProperty(OPENED))
return false;
- _vm->playSound(kAudioDoorSound);
+ _vm->playSound(kAudioSlideDoor);
_vm->renderImage(1);
if (isSectionVisible(7))
_vm->renderImage(10);
@@ -1292,7 +1292,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
if (isSectionVisible(11) || isSectionVisible(12))
_vm->renderMessage(kStringShipHold7);
else {
- _vm->playSound(kAudioDoorSound);
+ _vm->playSound(kAudioSlideDoor);
_vm->renderImage(_gm->invertSection(1));
setSectionVisible(10, false);
if (isSectionVisible(13))
@@ -1331,7 +1331,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
else
_vm->renderImage(4);
} else if ((verb == ACTION_OPEN) && (obj1._id == TRAP)) {
- _vm->playSound(kAudioDoorSound);
+ _vm->playSound(kAudioSlideDoor);
_vm->renderImage(2);
if (getObject(11)->_click == 11)
_vm->renderImage(3);
@@ -1513,7 +1513,7 @@ bool ArsanoMeetup::interact(Action verb, Object &obj1, Object &obj2) {
void ArsanoEntrance::animation() {
if (!_vm->_messageDisplayed && isSectionVisible(kMaxSection - 5)) {
_gm->animationOff(); // to avoid recursive call
- _vm->playSound(kAudioDoorSound);
+ _vm->playSound(kAudioSlideDoor);
_vm->renderImage(8);
setSectionVisible(9, false);
_gm->wait2(2);
@@ -1645,7 +1645,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
}
}
} else if ((verb == ACTION_PRESS) && (obj1._id == BATHROOM_BUTTON)) {
- _vm->playSound(kAudioDoorSound);
+ _vm->playSound(kAudioSlideDoor);
_vm->renderImage(5);
_gm->wait2(2);
_vm->renderImage(6);
@@ -3068,7 +3068,7 @@ bool AxacussElevator::interact(Action verb, Object &obj1, Object &obj2) {
if (!isSectionVisible(3)) {
_vm->renderImage(1);
getObject(2)->resetProperty();
- _vm->playSound(kAudioDoorSound);
+ _vm->playSound(kAudioSlideDoor);
_gm->wait2(25);
for (int i = 3; i <= 7; i++) {
_gm->wait2(2);
@@ -3087,13 +3087,13 @@ bool AxacussElevator::interact(Action verb, Object &obj1, Object &obj2) {
_vm->renderImage(2);
getObject(3)->resetProperty();
getObject(3)->_click = 255;
- _vm->playSound(kAudioDoorSound);
+ _vm->playSound(kAudioSlideDoor);
for (int i = 7; i >= 3; i--) {
_gm->wait2(2);
_vm->renderImage(_gm->invertSection(i));
}
_gm->wait2(25);
- _vm->playSound(kAudioDoorSound);
+ _vm->playSound(kAudioSlideDoor);
getObject(2)->resetProperty(EXIT);
_vm->renderImage(_gm->invertSection(2));
}
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 7dc34cf..5313f08 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1273,8 +1273,8 @@ void GameManager::searchStartEvent() {
void GameManager::outro() {
// title = 2;
- _vm->playSoundMod(49);
// title = 0;
+ _vm->playSoundMod(kMusicOutro);
_vm->paletteFadeOut();
_vm->setCurrentImage(55);
_vm->renderImage(0);
Commit: 063962a583fc3268a5a6b1737a6272c653d6ba9a
https://github.com/scummvm/scummvm/commit/063962a583fc3268a5a6b1737a6272c653d6ba9a
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:45Z
Commit Message:
SUPERNOVA: Updates palette when changing room brightness
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/state.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 0c4d84d..8727ca2 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -1187,13 +1187,11 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
if (r->isSectionVisible(9))
_gm->_state._powerOff = true;
_gm->roomBrightness();
- _vm->paletteBrightness();
} else {
_vm->renderImage(7);
if (r->isSectionVisible(9))
_gm->_state._powerOff = false;
_gm->roomBrightness();
- _vm->paletteBrightness();
r = _gm->_rooms[SLEEP];
r->setSectionVisible(1, false);
r->setSectionVisible(2, false);
@@ -2859,7 +2857,6 @@ bool AxacussExit::interact(Action verb, Object &obj1, Object &obj2) {
_gm->search(450);
_gm->roomBrightness();
- _vm->paletteBrightness();
} else if ((verb == ACTION_USE) && (Object::combine(obj1,obj2,MAGNET,GUARDIAN) || Object::combine(obj1,obj2,KNIFE,GUARDIAN)))
_vm->renderMessage(kStringArsanoEntrance27);
else
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 5313f08..2b5ae29 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1433,7 +1433,6 @@ void GameManager::turnOff() {
_state._powerOff = true;
roomBrightness();
- _vm->paletteBrightness();
}
void GameManager::turnOn() {
@@ -1442,7 +1441,6 @@ void GameManager::turnOn() {
_state._powerOff = false;
_vm->_brightness = 255;
-// _vm->paletteBrightness();
_rooms[SLEEP]->setSectionVisible(1, false);
_rooms[SLEEP]->setSectionVisible(2, false);
_rooms[COCKPIT]->setSectionVisible(22, false);
@@ -1582,6 +1580,8 @@ void GameManager::roomBrightness() {
if (_vm->_brightness != 0)
_vm->_brightness = _roomBrightness;
+
+ _vm->paletteBrightness();
}
void GameManager::changeRoom(RoomID id) {
@@ -1955,7 +1955,6 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
getInput();
_vm->renderRoom(*_currentRoom);
roomBrightness();
- _vm->paletteBrightness();
_vm->renderMessage(kStringGenericInteract_12);
} else if ((verb == ACTION_LOOK) && (obj1._id == KEYCARD2)) {
_vm->renderMessage(obj1._description);
@@ -2266,10 +2265,6 @@ void GameManager::executeRoom() {
}
roomBrightness();
- if (_vm->_brightness == 0)
- _vm->paletteFadeIn();
- else
- _vm->paletteBrightness();
if (!_currentRoom->hasSeen() && _newRoom) {
_newRoom = false;
Commit: 509edfd53973da5484e6b3d4a1564bcae5e3e318
https://github.com/scummvm/scummvm/commit/509edfd53973da5484e6b3d4a1564bcae5e3e318
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:45Z
Commit Message:
SUPERNOVA: Returns to launcher after outro
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 2b5ae29..e27a68f 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1272,8 +1272,6 @@ void GameManager::searchStartEvent() {
}
void GameManager::outro() {
-// title = 2;
-// title = 0;
_vm->playSoundMod(kMusicOutro);
_vm->paletteFadeOut();
_vm->setCurrentImage(55);
@@ -1281,8 +1279,10 @@ void GameManager::outro() {
_vm->paletteFadeIn();
getInput();
_vm->paletteFadeOut();
- // TODO: render info file
- // Exit
+
+ Common::Event event;
+ event.type = Common::EVENT_RTL;
+ _vm->getEventManager()->pushEvent(event);
}
void GameManager::great(uint number) {
Commit: 6df88c5c4611199d4c7047fb5578cdcb0896c41b
https://github.com/scummvm/scummvm/commit/6df88c5c4611199d4c7047fb5578cdcb0896c41b
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:45Z
Commit Message:
SUPERNOVA: Fixes fading in intro
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 8727ca2..d926619 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -151,6 +151,7 @@ void Intro::titleScreen() {
// Newspaper
CursorMan.showMouse(false);
_vm->_brightness = 0;
+ _vm->_menuBrightness = 0;
_vm->paletteBrightness();
_vm->setCurrentImage(1);
_vm->renderImage(0);
@@ -499,6 +500,7 @@ void Intro::cutscene() {
}
void Intro::leaveCutscene() {
+ _vm->_brightness = 255;
_vm->removeMessage();
_gm->changeRoom(CABIN_R3);
_gm->_guiEnabled = true;
Commit: f3f75da959ff4ce33fa6a5b542518d71198158dc
https://github.com/scummvm/scummvm/commit/f3f75da959ff4ce33fa6a5b542518d71198158dc
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:45Z
Commit Message:
SUPERNOVA: Pushes a mousemove to update object state
If you click on an exit on the map and there is again an exit on the
same spot, it won't be recognized until the next mouse move/click.
This change fakes a mouse move and thus updates the object state.
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index e27a68f..9392dd5 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -2250,6 +2250,13 @@ void GameManager::handleInput() {
void GameManager::executeRoom() {
if (_processInput && !_vm->_messageDisplayed && _guiEnabled) {
handleInput();
+ if (_mouseClicked) {
+ Common::Event event;
+ event.type = Common::EVENT_MOUSEMOVE;
+ event.mouse = Common::Point(_mouseX, _mouseY);
+ _vm->getEventManager()->pushEvent(event);
+ }
+
resetInputState();
}
Commit: 1fd7ea7c390617ed525cb87884735119b7bef37e
https://github.com/scummvm/scummvm/commit/1fd7ea7c390617ed525cb87884735119b7bef37e
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:45Z
Commit Message:
SUPERNOVA: Fixes object state update
In order to trigger a mouseField change in processInput(), we move the
cursor to 0,0 first before restoring its original position.
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 9392dd5..2330f52 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -2253,6 +2253,9 @@ void GameManager::executeRoom() {
if (_mouseClicked) {
Common::Event event;
event.type = Common::EVENT_MOUSEMOVE;
+ event.mouse = Common::Point(0, 0);
+ _vm->getEventManager()->pushEvent(event);
+ event.type = Common::EVENT_MOUSEMOVE;
event.mouse = Common::Point(_mouseX, _mouseY);
_vm->getEventManager()->pushEvent(event);
}
Commit: 40b39b2b6d19fac7098c25ec459f6d490560db7c
https://github.com/scummvm/scummvm/commit/40b39b2b6d19fac7098c25ec459f6d490560db7c
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:45Z
Commit Message:
SUPERNOVA: Aborts intro if game should be closed
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index d926619..49ebe00 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -273,7 +273,7 @@ bool Intro::animate(int section1, int section2, int section3, int section4,
void Intro::cutscene() {
#define exitOnEscape(X) do { \
Common::KeyCode key = Common::KEYCODE_INVALID; \
- if (_gm->waitOnInput(X, key) && key == Common::KEYCODE_ESCAPE) \
+ if ((_gm->waitOnInput(X, key) && key == Common::KEYCODE_ESCAPE) || _vm->shouldQuit()) \
return; \
} while (0);
Commit: 45b2c4ea28d29dc0033ab07ebc65c9dfc39ed30d
https://github.com/scummvm/scummvm/commit/45b2c4ea28d29dc0033ab07ebc65c9dfc39ed30d
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:45Z
Commit Message:
SUPERNOVA: Hides cursor during snoring sequence
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 49ebe00..2f4c6de 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -455,6 +455,7 @@ void Intro::cutscene() {
if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene32))
return;
+ CursorMan.showMouse(false);
_vm->_brightness = 0;
_vm->paletteBrightness();
exitOnEscape(10);
@@ -470,6 +471,8 @@ void Intro::cutscene() {
while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
;
exitOnEscape(30);
+ CursorMan.showMouse(true);
+
_vm->setCurrentImage(22);
if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene33))
return;
Commit: 43709a59f32eba9ea1a6dcd3bef1a607c0e77d54
https://github.com/scummvm/scummvm/commit/43709a59f32eba9ea1a6dcd3bef1a607c0e77d54
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:45Z
Commit Message:
SUPERNOVA: Reverts brightness change
If the brightness is 0, it is faded in at the end of the game loop.
In some instances, especially cutscenes, it makes the code harder to
understand as in somecases the code expects the brightness to be faded
in after having it faded out, set manually to 0 or when you leave a dark
room, set by roomBrightness().
Removing it now, would just lead to more confusion during the port of
Supernova part 2.
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 2330f52..cd76af9 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -2275,6 +2275,8 @@ void GameManager::executeRoom() {
}
roomBrightness();
+ if (_vm->_brightness == 0)
+ _vm->paletteFadeIn();
if (!_currentRoom->hasSeen() && _newRoom) {
_newRoom = false;
Commit: f5c2271ffda256e68794d57319580aa9c7229ace
https://github.com/scummvm/scummvm/commit/f5c2271ffda256e68794d57319580aa9c7229ace
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:45Z
Commit Message:
SUPERNOVA: Prevents paletteFadeIn() to be triggered
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index cd76af9..deeb043 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1279,6 +1279,7 @@ void GameManager::outro() {
_vm->paletteFadeIn();
getInput();
_vm->paletteFadeOut();
+ _vm->_brightness = 1;
Common::Event event;
event.type = Common::EVENT_RTL;
Commit: 8d79bbad9b7846354fcffee8f5a717beaba77add
https://github.com/scummvm/scummvm/commit/8d79bbad9b7846354fcffee8f5a717beaba77add
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:46Z
Commit Message:
SUPERNOVA: Removes comment
renderRoom() and later in the game loop executeRoom() does everything
that is explicitly called in the original.
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 2f4c6de..4c35e27 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2245,7 +2245,6 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
_gm->getInput();
g_system->fillScreen(kColorBlack);
_vm->renderRoom(*this);
- // CHECKME: Doesn't look complete - check sb_meetup()
} else if ((verb == ACTION_WALK) && (obj1._id == UFO)) {
g_system->fillScreen(kColorBlack);
_vm->setCurrentImage(36);
Commit: 6fe9af93f399085d4775421012114343e79a594e
https://github.com/scummvm/scummvm/commit/6fe9af93f399085d4775421012114343e79a594e
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:46Z
Commit Message:
SUPERONVA: Sets uninitialized values to 0
Changed paths:
engines/supernova/graphics.cpp
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index 21e2e79..d7839c1 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -147,9 +147,6 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
}
_numClickFields = stream.readByte();
- for (int i = 0; i < kMaxClickFields; ++i) {
- _clickField[i].next = 0;
- }
for (int i = 0; i < _numClickFields; ++i) {
_clickField[i].x1 = stream.readUint16LE();
_clickField[i].x2 = stream.readUint16LE();
@@ -157,6 +154,13 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
_clickField[i].y2 = stream.readByte();
_clickField[i].next = stream.readByte();
}
+ for (int i = _numClickFields; i < kMaxClickFields; ++i) {
+ _clickField[i].x1 = 0;
+ _clickField[i].x2 = 0;
+ _clickField[i].y1 = 0;
+ _clickField[i].y2 = 0;
+ _clickField[i].next = 0;
+ }
// Newspaper images may be in the engine data file. So first try to read
// it from there.
Commit: da3d145819ef93a0600c404c0600b4db2d17367d
https://github.com/scummvm/scummvm/commit/da3d145819ef93a0600c404c0600b4db2d17367d
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:46Z
Commit Message:
SUPERNOVA: Moves strings to GameManager class
Changed paths:
engines/supernova/msn_def.h
engines/supernova/state.cpp
engines/supernova/state.h
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 2649137..2ed5cf5 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -558,16 +558,6 @@ enum StringID {
kStringInventoryMoney
};
-static StringID guiCommands[] = {
- kStringCommandGo, kStringCommandLook, kStringCommandTake, kStringCommandOpen, kStringCommandClose,
- kStringCommandPress, kStringCommandPull, kStringCommandUse, kStringCommandTalk, kStringCommandGive
-};
-
-static StringID guiStatusCommands[] = {
- kStringStatusCommandGo, kStringStatusCommandLook, kStringStatusCommandTake, kStringStatusCommandOpen, kStringStatusCommandClose,
- kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk, kStringStatusCommandGive
-};
-
ObjectType operator|(ObjectType a, ObjectType b);
ObjectType operator&(ObjectType a, ObjectType b);
ObjectType operator^(ObjectType a, ObjectType b);
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index deeb043..ff758f7 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -273,6 +273,16 @@ static Common::String timeToString(int msec) {
return Common::String(s);
}
+StringID GameManager::guiCommands[] = {
+ kStringCommandGo, kStringCommandLook, kStringCommandTake, kStringCommandOpen, kStringCommandClose,
+ kStringCommandPress, kStringCommandPull, kStringCommandUse, kStringCommandTalk, kStringCommandGive
+};
+
+StringID GameManager::guiStatusCommands[] = {
+ kStringStatusCommandGo, kStringStatusCommandLook, kStringStatusCommandTake, kStringStatusCommandOpen, kStringStatusCommandClose,
+ kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk, kStringStatusCommandGive
+};
+
GameManager::GameManager(SupernovaEngine *vm)
: _inventory(_inventoryScroll)
, _vm(vm) {
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index e47c906..674624d 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -113,6 +113,8 @@ public:
bool serialize(Common::WriteStream *out);
bool deserialize(Common::ReadStream *in, int version);
+ static StringID guiCommands[];
+ static StringID guiStatusCommands[];
SupernovaEngine *_vm;
Common::KeyState _key;
Common::EventType _mouseClickType;
Commit: fa1e93a15eda76022193d97fa4a1c5fa8e0ecf42
https://github.com/scummvm/scummvm/commit/fa1e93a15eda76022193d97fa4a1c5fa8e0ecf42
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:46Z
Commit Message:
SUPERNOVA: Removes global constructor call
Object() is redundant anyway as it instantiates an Object object and
copies it to nullObject, which was already default constructed.
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index c3846d0..8f4394c 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -70,7 +70,7 @@ const AudioInfo audioInfo[kAudioNumSamples] = {
{54, 31040, -1}
};
-const Object Object::nullObject = Object();
+const Object Object::nullObject;
ObjectType operator|(ObjectType a, ObjectType b) {
return static_cast<ObjectType>(+a | +b);
Commit: c0f47712c2ac160a571959a86fd4b711f058ed64
https://github.com/scummvm/scummvm/commit/c0f47712c2ac160a571959a86fd4b711f058ed64
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:46Z
Commit Message:
SUPERNOVA: Changes message order
When taking off your helmet or life support in a room without oxygen, it
showed the death screen before the 'taking off helmet/life support'
message.
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index ff758f7..6a57610 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -2112,11 +2112,11 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
} else
_vm->renderMessage(kStringGenericInteract_22);
} else if (obj1.hasProperty(WORN)) {
- if (airless())
- dead(kStringGenericInteract_23);
-
obj1.disableProperty(WORN);
_vm->renderMessage(kStringGenericInteract_24);
+ getInput();
+ if (airless())
+ dead(kStringGenericInteract_23);
} else {
Room *r = _rooms[AIRLOCK];
if (r->getObject(5)->hasProperty(WORN)) {
@@ -2136,11 +2136,11 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
} else
_vm->renderMessage(kStringGenericInteract_22);
} else if (obj1.hasProperty(WORN)) {
- if (airless())
- dead(kStringGenericInteract_27);
-
obj1.disableProperty(WORN);
_vm->renderMessage(kStringGenericInteract_28);
+ getInput();
+ if (airless())
+ dead(kStringGenericInteract_27);
} else {
Room *r = _rooms[AIRLOCK];
if (r->getObject(5)->hasProperty(WORN)) {
Commit: e40a0179628f312ebd8e8c0ae581dbd69fc2637a
https://github.com/scummvm/scummvm/commit/e40a0179628f312ebd8e8c0ae581dbd69fc2637a
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:46Z
Commit Message:
SUPERNOVA: Fixes segfault if dat file not found
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 8f4394c..1f0eb9b 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -121,6 +121,8 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)
DebugMan.addDebugChannel(kDebugGeneral, "general", "Supernova general debug channel");
_rnd = new Common::RandomSource("supernova");
+ _soundMusic[0] = NULL;
+ _soundMusic[1] = NULL;
}
SupernovaEngine::~SupernovaEngine() {
@@ -130,9 +132,6 @@ SupernovaEngine::~SupernovaEngine() {
delete _rnd;
delete _console;
delete _gm;
- for (int i = 0; i < kAudioNumSamples; ++i) {
- delete[] _soundSamples[i]._buffer;
- }
delete _soundMusic[0];
delete _soundMusic[1];
}
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 7a68b8e..8b1fe40 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -76,6 +76,20 @@ private:
ScreenBuffer *_last;
};
+struct SoundSample {
+ SoundSample()
+ : _buffer(NULL)
+ , _length(0)
+ {}
+
+ ~SoundSample() {
+ delete _buffer;
+ }
+
+ byte *_buffer;
+ int _length;
+};
+
class SupernovaEngine : public Engine {
public:
explicit SupernovaEngine(OSystem *syst);
@@ -91,10 +105,7 @@ public:
byte _mouseNormal[256];
byte _mouseWait[256];
MSNImageDecoder *_currentImage;
- struct SoundSample {
- byte *_buffer;
- int _length;
- } _soundSamples[kAudioNumSamples];
+ SoundSample _soundSamples[kAudioNumSamples];
Common::MemoryReadStream *_soundMusic[2];
Common::Event _event;
int _screenWidth;
Commit: d68ce6dc075cf359dd30d56bb1f72b0a005c7d94
https://github.com/scummvm/scummvm/commit/d68ce6dc075cf359dd30d56bb1f72b0a005c7d94
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:46Z
Commit Message:
SUPERNOVA: Changes array to seperate variables
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 1f0eb9b..3fe07dc 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -101,6 +101,8 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)
, _console(NULL)
, _gm(NULL)
, _currentImage(NULL)
+ , _soundMusicIntro(NULL)
+ , _soundMusicOutro(NULL)
, _brightness(255)
, _menuBrightness(255)
, _delay(33)
@@ -121,8 +123,6 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)
DebugMan.addDebugChannel(kDebugGeneral, "general", "Supernova general debug channel");
_rnd = new Common::RandomSource("supernova");
- _soundMusic[0] = NULL;
- _soundMusic[1] = NULL;
}
SupernovaEngine::~SupernovaEngine() {
@@ -132,8 +132,8 @@ SupernovaEngine::~SupernovaEngine() {
delete _rnd;
delete _console;
delete _gm;
- delete _soundMusic[0];
- delete _soundMusic[1];
+ delete _soundMusicIntro;
+ delete _soundMusicOutro;
}
Common::Error SupernovaEngine::run() {
@@ -360,8 +360,8 @@ void SupernovaEngine::initData() {
file.close();
}
- _soundMusic[0] = convertToMod("msn_data.049");
- _soundMusic[1] = convertToMod("msn_data.052");
+ _soundMusicIntro = convertToMod("msn_data.049");
+ _soundMusicOutro = convertToMod("msn_data.052");
// Cursor
const uint16 *bufferNormal = reinterpret_cast<const uint16 *>(mouseNormal);
@@ -403,12 +403,14 @@ void SupernovaEngine::stopSound() {
void SupernovaEngine::playSoundMod(int filenumber)
{
- if (filenumber != 49 && filenumber != 52) {
+ Audio::AudioStream *audioStream;
+ if (filenumber == 49)
+ audioStream = Audio::makeProtrackerStream(_soundMusicIntro);
+ else if (filenumber == 52)
+ audioStream = Audio::makeProtrackerStream(_soundMusicOutro);
+ else
return;
- }
- int index = filenumber == 49 ? 0 : 1;
- Audio::AudioStream *audioStream = Audio::makeProtrackerStream(_soundMusic[index]);
stopSound();
_mixer->playStream(Audio::Mixer::kMusicSoundType, &_soundHandle, audioStream,
-1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO);
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 8b1fe40..29d7dd6 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -106,7 +106,8 @@ public:
byte _mouseWait[256];
MSNImageDecoder *_currentImage;
SoundSample _soundSamples[kAudioNumSamples];
- Common::MemoryReadStream *_soundMusic[2];
+ Common::MemoryReadStream *_soundMusicIntro;
+ Common::MemoryReadStream *_soundMusicOutro;
Common::Event _event;
int _screenWidth;
int _screenHeight;
Commit: b8b0ae57ccc27308ec4117f826352d36e21fed4e
https://github.com/scummvm/scummvm/commit/b8b0ae57ccc27308ec4117f826352d36e21fed4e
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:46Z
Commit Message:
SUPERNOVA: Fixes AudioStream leak
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 3fe07dc..a3e939f 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -413,7 +413,7 @@ void SupernovaEngine::playSoundMod(int filenumber)
stopSound();
_mixer->playStream(Audio::Mixer::kMusicSoundType, &_soundHandle, audioStream,
- -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO);
+ -1, Audio::Mixer::kMaxChannelVolume, 0);
}
void SupernovaEngine::renderImageSection(int section) {
Commit: 32e8d22c14bae56f08a79e3cb5cf07573fbc4791
https://github.com/scummvm/scummvm/commit/32e8d22c14bae56f08a79e3cb5cf07573fbc4791
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:46Z
Commit Message:
SUPERNOVA: Corrects header guard name
Changed paths:
engines/supernova/graphics.h
engines/supernova/msn_def.h
engines/supernova/rooms.h
engines/supernova/state.h
engines/supernova/supernova.h
diff --git a/engines/supernova/graphics.h b/engines/supernova/graphics.h
index a77ea20..2a820c9 100644
--- a/engines/supernova/graphics.h
+++ b/engines/supernova/graphics.h
@@ -20,8 +20,8 @@
*
*/
-#ifndef GRAPHICS_H
-#define GRAPHICS_H
+#ifndef SUPERNOVA_GRAPHICS_H
+#define SUPERNOVA_GRAPHICS_H
#include "common/scummsys.h"
#include "image/image_decoder.h"
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 2ed5cf5..ad28cd5 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -20,8 +20,8 @@
*
*/
-#ifndef MSN_DEF_H
-#define MSN_DEF_H
+#ifndef SUPERNOVA_MSN_DEF_H
+#define SUPERNOVA_MSN_DEF_H
namespace Supernova {
@@ -640,4 +640,4 @@ struct Object {
}
-#endif // MSN_DEF_H
+#endif // SUPERNOVA_MSN_DEF_H
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 3795842..a16f57e 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -20,8 +20,8 @@
*
*/
-#ifndef ROOMS_H
-#define ROOMS_H
+#ifndef SUPERNOVA_ROOMS_H
+#define SUPERNOVA_ROOMS_H
#include "common/scummsys.h"
@@ -1385,4 +1385,4 @@ private:
};
}
-#endif // ROOMS_H
+#endif // SUPERNOVA_ROOMS_H
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 674624d..17d11e0 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -20,8 +20,8 @@
*
*/
-#ifndef STATE_H
-#define STATE_H
+#ifndef SUPERNOVA_STATE_H
+#define SUPERNOVA_STATE_H
#include "common/rect.h"
#include "common/keyboard.h"
@@ -231,4 +231,4 @@ private:
}
-#endif // STATE_H
+#endif // SUPERNOVA_STATE_H
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 29d7dd6..d41467c 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -20,8 +20,8 @@
*
*/
-#ifndef SUPERNOVA_H
-#define SUPERNOVA_H
+#ifndef SUPERNOVA_SUPERNOVA_H
+#define SUPERNOVA_SUPERNOVA_H
#include "audio/audiostream.h"
#include "audio/mixer.h"
Commit: b937268e61a041bd1578f250be39b85e75b40e67
https://github.com/scummvm/scummvm/commit/b937268e61a041bd1578f250be39b85e75b40e67
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:46Z
Commit Message:
SUPERNOVA: Renames INT32_MAX to kMaxTimerValue
Prevents collision with stdint.h INT32_MAX
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/state.cpp
engines/supernova/state.h
engines/supernova/supernova.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 4c35e27..480f743 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2750,7 +2750,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
if (!_gm->_rooms[OFFICE_L1 + obj1._id - DOOR1]->isSectionVisible(4))
_gm->search(180);
else
- _gm->_state._eventTime = INT32_MAX;
+ _gm->_state._eventTime = kMaxTimerValue;
}
} else if (((verb == ACTION_WALK) || ((verb == ACTION_OPEN) && !obj1.hasProperty(OPENED))) &&
(obj1._id >= DOOR1) && (obj1._id <= DOOR4) &&
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 6a57610..50a7fd2 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -382,7 +382,7 @@ void GameManager::initState() {
_state._time = ticksToMsec(916364); // 2 pm
_state._timeSleep = 0;
_state._timeAlarm = ticksToMsec(458182); // 7 am
- _state._eventTime = INT32_MAX;
+ _state._eventTime = kMaxTimerValue;
_state._eventCallback = kNoFn;
_state._arrivalDaysLeft = 2840;
_state._shipEnergyDaysLeft = 2135;
@@ -863,7 +863,7 @@ void GameManager::telomat(int nr) {
}
_rooms[BCORRIDOR]->setSectionVisible(7, true);
_rooms[BCORRIDOR]->setSectionVisible(i + 1, true);
- _state._eventTime = INT32_MAX;
+ _state._eventTime = kMaxTimerValue;
_currentRoom->addSentence(0, 1);
}
_guiEnabled = true;
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 17d11e0..bb0b933 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -29,7 +29,7 @@
namespace Supernova {
-const int32 INT32_MAX = 0x7FFFFFFF;
+const int32 kMaxTimerValue = 0x7FFFFFFF;
enum EventFunction { kNoFn, kSupernovaFn, kGuardReturnedFn, kGuardWalkFn, kTaxiFn, kSearchStartFn };
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index a3e939f..94fcdf0 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -185,7 +185,7 @@ void SupernovaEngine::updateEvents() {
if (_gm->_state._eventCallback != kNoFn && _gm->_state._time >= _gm->_state._eventTime) {
_allowLoadGame = false;
_allowSaveGame = false;
- _gm->_state._eventTime = INT32_MAX;
+ _gm->_state._eventTime = kMaxTimerValue;
EventFunction fn = _gm->_state._eventCallback;
_gm->_state._eventCallback = kNoFn;
switch (fn) {
Commit: dd6df76b32c548356cc20a9efcfdcbb889d429c6
https://github.com/scummvm/scummvm/commit/dd6df76b32c548356cc20a9efcfdcbb889d429c6
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:46Z
Commit Message:
SUPERNOVA: Initializes RandomSource on stack
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 94fcdf0..177d581 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -103,6 +103,7 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)
, _currentImage(NULL)
, _soundMusicIntro(NULL)
, _soundMusicOutro(NULL)
+ , _rnd("supernova")
, _brightness(255)
, _menuBrightness(255)
, _delay(33)
@@ -121,15 +122,12 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)
// setup engine specific debug channels
DebugMan.addDebugChannel(kDebugGeneral, "general", "Supernova general debug channel");
-
- _rnd = new Common::RandomSource("supernova");
}
SupernovaEngine::~SupernovaEngine() {
DebugMan.clearAllDebugChannels();
delete _currentImage;
- delete _rnd;
delete _console;
delete _gm;
delete _soundMusicIntro;
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index d41467c..8e5ff52 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -97,7 +97,7 @@ public:
virtual Common::Error run();
- Common::RandomSource *_rnd;
+ Common::RandomSource _rnd;
GameManager *_gm;
Console *_console;
Audio::SoundHandle _soundHandle;
Commit: e1959627639a4cfb50473c892a50d05598d44178
https://github.com/scummvm/scummvm/commit/e1959627639a4cfb50473c892a50d05598d44178
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:46Z
Commit Message:
SUPERNOVA: Update English translation
Changed paths:
devtools/create_supernova/strings-en.po
diff --git a/devtools/create_supernova/strings-en.po b/devtools/create_supernova/strings-en.po
index 9268f88..f1c9d2f 100644
--- a/devtools/create_supernova/strings-en.po
+++ b/devtools/create_supernova/strings-en.po
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: Mission Supernova 1.0\n"
"Report-Msgid-Bugs-To: scummvm-devel at lists.scummvm.org\n"
"POT-Creation-Date: 2017-07-22 19:53+0100\n"
-"PO-Revision-Date: 2017-12-13 21:29+0000\n"
-"Last-Translator: Thierry Crozat <criezy at scummvm.org>\n"
+"PO-Revision-Date: 2018-01-07 18:01+0000\n"
+"Last-Translator: Joseph-Eugene Winzer <Joe.Winzer at gmx.de>\n"
"Language-Team: none\n"
"Language: en\n"
"MIME-Version: 1.0\n"
@@ -400,8 +400,8 @@ msgid ""
"Komisch! Auf einmal kannst du die Schrift lesen!|Darauf steht:\"Wenn Sie "
"diese Schrift jetzt|lesen knnen, hat die Tablette gewirkt.\""
msgstr ""
-"Funny! Now you can read the inscription! It says, \"If you can read this "
-"text now, the pill has worked.\""
+"Funny! Now you can read the inscription!|It says, \"If you can read this "
+"text now,|the pill has worked.\""
#: ../../msn/msn_r0.c:232
msgid "Sie ist leer."
@@ -1352,7 +1352,7 @@ msgstr "Nonsense!"
msgid ""
"Komisch! Auf einmal kannst du|das Schild lesen! Darauf steht:|\"Treffpunkt "
"Galactica\"."
-msgstr "Funny! You can read the sign now! It says \"Galactica meeting point\"."
+msgstr "Funny! You can read the sign now!|It says \"Galactica meeting point\"."
#: ../../msn/msn_r2.c:92
msgid "Darauf steht:|\"Treffpunkt Galactica\"."
@@ -2617,11 +2617,11 @@ msgstr "Funny picture."
#: ../../msn/msn_r3.c:1600
msgid "Karte"
-msgstr "Map"
+msgstr "Keycard"
#: ../../msn/msn_r3.c:1600
msgid "Darauf steht: \"Generalkarte\"."
-msgstr "It says:\"General Map\"."
+msgstr "It says: \"Master keycard\"."
#: ../../msn/msn_r3.c:1612
msgid "Lampe"
Commit: 963ad97e2a5d7b1dc27bd7c08e5dffbe988d45fb
https://github.com/scummvm/scummvm/commit/963ad97e2a5d7b1dc27bd7c08e5dffbe988d45fb
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:47Z
Commit Message:
SUPERNOVA: Fix missing reset of object CARRIED flag when clearing inventory
Changed paths:
engines/supernova/rooms.cpp
engines/supernova/state.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 480f743..71e7010 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -2329,13 +2329,16 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
_gm->reply(kStringArsanoMeetup3_28, 1, 1 + 128);
_vm->paletteFadeOut();
// Remove all objects from the inventory except the Knife, Watch and Discman
+ bool has_knife = _gm->_rooms[INTRO]->getObject(1)->hasProperty(CARRIED);
+ bool has_watch = _gm->_rooms[INTRO]->getObject(2)->hasProperty(CARRIED);
+ bool has_discman = _gm->_rooms[INTRO]->getObject(3)->hasProperty(CARRIED);
_gm->_inventory.clear();
_gm->_inventoryScroll = 0;
- if (_gm->_rooms[INTRO]->getObject(1)->hasProperty(CARRIED)) // Knife
+ if (has_knife)
_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(1));
- if (_gm->_rooms[INTRO]->getObject(2)->hasProperty(CARRIED)) // Watch
+ if (has_watch)
_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(2));
- if (_gm->_rooms[INTRO]->getObject(3)->hasProperty(CARRIED)) // Discman
+ if (has_discman)
_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(3));
_gm->changeRoom(CELL);
_gm->_state._dream = true;
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 50a7fd2..a0776b3 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -184,6 +184,8 @@ void Inventory::remove(Object &obj) {
}
void Inventory::clear() {
+ for (int i = 0; i < _numObjects; ++i)
+ _inventory[i]->disableProperty(CARRIED);
_numObjects = 0;
_inventoryScroll = 0;
}
Commit: ba51c37a5c3de6691b8e16dc8bec6db50f45c5ee
https://github.com/scummvm/scummvm/commit/ba51c37a5c3de6691b8e16dc8bec6db50f45c5ee
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:47Z
Commit Message:
SUPERNOVA: Fix cursor not shown if escaping during the intro snoring sequence
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 71e7010..5893c48 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -273,8 +273,10 @@ bool Intro::animate(int section1, int section2, int section3, int section4,
void Intro::cutscene() {
#define exitOnEscape(X) do { \
Common::KeyCode key = Common::KEYCODE_INVALID; \
- if ((_gm->waitOnInput(X, key) && key == Common::KEYCODE_ESCAPE) || _vm->shouldQuit()) \
+ if ((_gm->waitOnInput(X, key) && key == Common::KEYCODE_ESCAPE) || _vm->shouldQuit()) { \
+ CursorMan.showMouse(true); \
return; \
+ } \
} while (0);
_vm->_system->fillScreen(kColorBlack);
Commit: 2c422760521e02f610ac03d1abd00cda98b4d3a1
https://github.com/scummvm/scummvm/commit/2c422760521e02f610ac03d1abd00cda98b4d3a1
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:47Z
Commit Message:
SUPERNOVA: Update engine data file
Changed paths:
dists/engine-data/supernova.dat
diff --git a/dists/engine-data/supernova.dat b/dists/engine-data/supernova.dat
index 75cad1a..74d9092 100644
Binary files a/dists/engine-data/supernova.dat and b/dists/engine-data/supernova.dat differ
Commit: d12b1824504cec662ea5f1481881307657a9669b
https://github.com/scummvm/scummvm/commit/d12b1824504cec662ea5f1481881307657a9669b
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:47Z
Commit Message:
SUPERNOVA: Remove declaration for unimplemented and unused function
Changed paths:
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 8e5ff52..7cf6f54 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -151,7 +151,6 @@ public:
void renderText(const uint16 character);
void renderBox(int x, int y, int width, int height, byte color);
void setColor63(byte value);
- void command_print();
bool loadGame(int slot);
bool saveGame(int slot, const Common::String &description);
void errorTempSave(bool saving);
Commit: 2a8cf41b33b6411fd4c4c9067d111eabec925206
https://github.com/scummvm/scummvm/commit/2a8cf41b33b6411fd4c4c9067d111eabec925206
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:47Z
Commit Message:
SUPERNOVA: Handle RTL and Quit while editing text
Changed paths:
engines/supernova/state.cpp
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index a0776b3..f7bf70f 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -1524,7 +1524,7 @@ void GameManager::drawInventory() {
}
uint16 GameManager::getKeyInput(bool blockForPrintChar) {
- while (true) {
+ while (!_vm->shouldQuit()) {
_vm->updateEvents();
if (_keyPressed) {
if (blockForPrintChar) {
@@ -1550,6 +1550,7 @@ uint16 GameManager::getKeyInput(bool blockForPrintChar) {
g_system->updateScreen();
g_system->delayMillis(_vm->_delay);
}
+ return 0;
}
Common::EventType GameManager::getMouseInput() {
@@ -1758,6 +1759,8 @@ void GameManager::edit(Common::String &input, int x, int y, uint length) {
}
getKeyInput(true);
+ if (_vm->shouldQuit())
+ break;
switch (_key.keycode) {
case Common::KEYCODE_RETURN:
case Common::KEYCODE_ESCAPE:
Commit: ac609c91dbb26111396abfc22016e91967dca6d9
https://github.com/scummvm/scummvm/commit/ac609c91dbb26111396abfc22016e91967dca6d9
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:47Z
Commit Message:
SUPERNOVA: Make _event a local variable
Changed paths:
engines/supernova/supernova.cpp
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 177d581..cb3a096 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -218,20 +218,21 @@ void SupernovaEngine::updateEvents() {
_gm->_mouseClicked = false;
_gm->_keyPressed = false;
- while (g_system->getEventManager()->pollEvent(_event)) {
- switch (_event.type) {
+ Common::Event event;
+ while (g_system->getEventManager()->pollEvent(event)) {
+ switch (event.type) {
case Common::EVENT_KEYDOWN:
_gm->_keyPressed = true;
- if (_event.kbd.keycode == Common::KEYCODE_d &&
- (_event.kbd.flags & Common::KBD_CTRL)) {
+ if (event.kbd.keycode == Common::KEYCODE_d &&
+ (event.kbd.flags & Common::KBD_CTRL)) {
_console->attach();
}
- if (_event.kbd.keycode == Common::KEYCODE_x &&
- (_event.kbd.flags & Common::KBD_CTRL)) {
+ if (event.kbd.keycode == Common::KEYCODE_x &&
+ (event.kbd.flags & Common::KBD_CTRL)) {
// TODO: Draw exit box
}
- _gm->processInput(_event.kbd);
+ _gm->processInput(event.kbd);
break;
case Common::EVENT_LBUTTONUP:
@@ -242,9 +243,9 @@ void SupernovaEngine::updateEvents() {
_gm->_mouseClicked = true;
// fallthrough
case Common::EVENT_MOUSEMOVE:
- _gm->_mouseClickType = _event.type;
- _gm->_mouseX = _event.mouse.x;
- _gm->_mouseY = _event.mouse.y;
+ _gm->_mouseClickType = event.type;
+ _gm->_mouseX = event.mouse.x;
+ _gm->_mouseY = event.mouse.y;
if (_gm->_guiEnabled)
_gm->processInput();
break;
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 7cf6f54..8f0a8ee 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -108,7 +108,6 @@ public:
SoundSample _soundSamples[kAudioNumSamples];
Common::MemoryReadStream *_soundMusicIntro;
Common::MemoryReadStream *_soundMusicOutro;
- Common::Event _event;
int _screenWidth;
int _screenHeight;
bool _allowLoadGame;
Commit: eafd739c6611c11d99fb1e41577412174e4d034b
https://github.com/scummvm/scummvm/commit/eafd739c6611c11d99fb1e41577412174e4d034b
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T02:15:47Z
Commit Message:
SUPERNOVA: Improve waiting until a sound has finished playing
Changed paths:
engines/supernova/rooms.cpp
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 5893c48..d8b138f 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -181,7 +181,8 @@ void Intro::titleScreen() {
_gm->getInput();
// TODO: render animated text
_vm->playSound(kAudioVoiceYeah);
- while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle));
+ while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
+ _gm->wait2(1);
_vm->paletteFadeOut();
}
@@ -463,15 +464,15 @@ void Intro::cutscene() {
exitOnEscape(10);
_vm->playSound(kAudioSnoring);
while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
- ;
+ _gm->wait2(1);
exitOnEscape(10);
_vm->playSound(kAudioSnoring);
while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
- ;
+ _gm->wait2(1);
exitOnEscape(10);
_vm->playSound(kAudioSnoring);
while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
- ;
+ _gm->wait2(1);
exitOnEscape(30);
CursorMan.showMouse(true);
Commit: 26b5522463c289790feda5124959eb8cbfdfe48a
https://github.com/scummvm/scummvm/commit/26b5522463c289790feda5124959eb8cbfdfe48a
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:47Z
Commit Message:
SUPERNOVA: Adds ModeList
Changed paths:
engines/supernova/supernova.cpp
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index cb3a096..a9f2974 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -135,6 +135,10 @@ SupernovaEngine::~SupernovaEngine() {
}
Common::Error SupernovaEngine::run() {
+ Graphics::ModeList modes;
+ modes.push_back(Graphics::Mode(320, 200));
+ modes.push_back(Graphics::Mode(640, 480));
+ initGraphicsModes(modes);
initGraphics(_screenWidth, _screenHeight);
Common::Error status = loadGameStrings();
Commit: ccd4e20e3264f24eca5ff674e5a0d5fc0b262d36
https://github.com/scummvm/scummvm/commit/ccd4e20e3264f24eca5ff674e5a0d5fc0b262d36
Author: Joseph-Eugene Winzer (joewinzer at googlemail.com)
Date: 2018-01-23T02:15:47Z
Commit Message:
SUPERNOVA: Fixes destruction of SoundSample buffer
Changed paths:
engines/supernova/supernova.h
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 8f0a8ee..90ea884 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -83,7 +83,7 @@ struct SoundSample {
{}
~SoundSample() {
- delete _buffer;
+ delete[] _buffer;
}
byte *_buffer;
Commit: 2db8fbcb9de08a36fd1aa22d2c925ea47a4ddd36
https://github.com/scummvm/scummvm/commit/2db8fbcb9de08a36fd1aa22d2c925ea47a4ddd36
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2018-01-23T21:53:11Z
Commit Message:
Merge branch 'supernova'
Changed paths:
A devtools/create_supernova/create_supernova.cpp
A devtools/create_supernova/create_supernova.h
A devtools/create_supernova/file.cpp
A devtools/create_supernova/file.h
A devtools/create_supernova/gametext.h
A devtools/create_supernova/img1-en.pbm
A devtools/create_supernova/img1-en.xcf
A devtools/create_supernova/module.mk
A devtools/create_supernova/po_parser.cpp
A devtools/create_supernova/po_parser.h
A devtools/create_supernova/strings-en.po
A dists/engine-data/supernova.dat
A engines/supernova/NOTES
A engines/supernova/POTFILES
A engines/supernova/configure.engine
A engines/supernova/console.cpp
A engines/supernova/console.h
A engines/supernova/detection.cpp
A engines/supernova/graphics.cpp
A engines/supernova/graphics.h
A engines/supernova/module.mk
A engines/supernova/msn_def.h
A engines/supernova/rooms.cpp
A engines/supernova/rooms.h
A engines/supernova/state.cpp
A engines/supernova/state.h
A engines/supernova/supernova.cpp
A engines/supernova/supernova.h
More information about the Scummvm-git-logs
mailing list