[Scummvm-cvs-logs] CVS: scummvm/sword2 anims.cpp,1.66,1.67 build_display.cpp,1.68,1.69 console.cpp,1.51,1.52 controls.cpp,1.82,1.83 events.cpp,1.34,1.35 function.cpp,1.74,1.75 icons.cpp,1.39,1.40 layers.cpp,1.33,1.34 logic.cpp,1.49,1.50 logic.h,1.40,1.41 mouse.cpp,1.64,1.65 resman.cpp,1.103,1.104 save_rest.cpp,1.64,1.65 scroll.cpp,1.21,1.22 sound.cpp,1.50,1.51 sound.h,1.11,1.12 speech.cpp,1.69,1.70 startup.cpp,1.46,1.47 sword2.cpp,1.132,1.133 sword2.h,1.74,1.75 sync.cpp,1.22,1.23 walker.cpp,1.43,1.44 startup.h,1.8,NONE
Torbjörn Andersson
eriktorbjorn at users.sourceforge.net
Fri Jan 28 09:45:48 CET 2005
- Previous message: [Scummvm-cvs-logs] CVS: scummvm/scumm/imuse_digi dimuse_sndmgr.cpp,1.63,1.64
- Next message: [Scummvm-cvs-logs] CVS: scummvm/sword2/driver animation.cpp,1.51,1.52 animation.h,1.32,1.33 d_sound.cpp,1.137,1.138 d_sound.h,1.61,NONE
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Update of /cvsroot/scummvm/scummvm/sword2
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18982
Modified Files:
anims.cpp build_display.cpp console.cpp controls.cpp
events.cpp function.cpp icons.cpp layers.cpp logic.cpp logic.h
mouse.cpp resman.cpp save_rest.cpp scroll.cpp sound.cpp
sound.h speech.cpp startup.cpp sword2.cpp sword2.h sync.cpp
walker.cpp
Removed Files:
startup.h
Log Message:
Began what I hope is the final major restructuring of the BS2 engine.
In this first step, I have moved all opcode functions into functions.cpp,
instead of having them scattered all over the place.
To get things to compile again, I had to rewrite the overly complicated
sound effects handling. It's much simpler now.
The next step will be to move any non-trivial code out of the opcode
functions and into the appropriate object. This, I hope, will make it
easier to create well-separated objects, instead of the current mess.
I also want to tear down the artificial boundary between the main directory
and the "driver" directory. We already have a cross-platform layer; there's
no need to have yet another one. (Actually, the rewriting of the sound
effects code took one first step in this direction.)
At the final stage, I'd like to get rid of the "drivers" directory
completely, but I'll probably need some help with that if I want to
preserve the CVS history of the code.
Things will probably be a bit bumpy along the way, but I seem to have
reached a point of relative stability again, which is why I'm commiting
this now.
Index: anims.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword2/anims.cpp,v
retrieving revision 1.66
retrieving revision 1.67
diff -u -d -r1.66 -r1.67
--- anims.cpp 17 Jan 2005 10:57:10 -0000 1.66
+++ anims.cpp 28 Jan 2005 16:33:07 -0000 1.67
@@ -34,50 +34,12 @@
#include "sword2/maketext.h"
#include "sword2/memory.h"
#include "sword2/resman.h"
+#include "sword2/sound.h"
#include "sword2/driver/animation.h"
#include "sword2/driver/d_draw.h"
-#include "sword2/driver/d_sound.h"
namespace Sword2 {
-int32 Logic::fnAnim(int32 *params) {
- // params: 0 pointer to object's logic structure
- // 1 pointer to object's graphic structure
- // 2 resource id of animation file
-
- // 0 means normal forward anim
- return animate(params, false);
-}
-
-int32 Logic::fnReverseAnim(int32 *params) {
- // params: 0 pointer to object's logic structure
- // 1 pointer to object's graphic structure
- // 2 resource id of animation file
-
- // 1 means reverse anim
- return animate(params, true);
-}
-
-int32 Logic::fnMegaTableAnim(int32 *params) {
- // params: 0 pointer to object's logic structure
- // 1 pointer to object's graphic structure
- // 2 pointer to object's mega structure
- // 3 pointer to animation table
-
- // 0 means normal forward anim
- return megaTableAnimate(params, false);
-}
-
-int32 Logic::fnReverseMegaTableAnim(int32 *params) {
- // params: 0 pointer to object's logic structure
- // 1 pointer to object's graphic structure
- // 2 pointer to object's mega structure
- // 3 pointer to animation table
-
- // 1 means reverse anim
- return megaTableAnimate(params, true);
-}
-
int32 Logic::animate(int32 *params, bool reverse) {
// params: 0 pointer to object's logic structure
// 1 pointer to object's graphic structure
@@ -217,34 +179,6 @@
return animate(pars, reverse);
}
-int32 Logic::fnSetFrame(int32 *params) {
- // params: 0 pointer to object's graphic structure
- // 1 resource id of animation file
- // 2 frame flag (0=first 1=last)
-
- int32 res = params[1];
- assert(res);
-
- // open the resource (& check it's valid)
- byte *anim_file = _vm->_resman->openResource(res);
-
- StandardHeader *head = (StandardHeader *) anim_file;
- assert(head->fileType == ANIMATION_FILE);
-
- // set up pointer to the animation header
- AnimHeader *anim_head = _vm->fetchAnimHeader(anim_file);
-
- // set up anim resource in graphic object
- ObjectGraphic *ob_graphic = (ObjectGraphic *) _vm->_memory->decodePtr(params[0]);
-
- ob_graphic->anim_resource = res;
- ob_graphic->anim_pc = params[2] ? anim_head->noAnimFrames - 1 : 0;
-
- // Close the anim file and drop out of script
- _vm->_resman->closeResource(ob_graphic->anim_resource);
- return IR_CONT;
-}
-
void Logic::setSpriteStatus(uint32 sprite, uint32 type) {
ObjectGraphic *ob_graphic = (ObjectGraphic *) _vm->_memory->decodePtr(sprite);
@@ -261,80 +195,6 @@
ob_graphic->type = (ob_graphic->type & 0x0000ffff) | type;
}
-int32 Logic::fnNoSprite(int32 *params) {
- // params: 0 pointer to object's graphic structure
- setSpriteStatus(params[0], NO_SPRITE);
- return IR_CONT;
-}
-
-int32 Logic::fnBackPar0Sprite(int32 *params) {
- // params: 0 pointer to object's graphic structure
- setSpriteStatus(params[0], BGP0_SPRITE);
- return IR_CONT;
-}
-
-int32 Logic::fnBackPar1Sprite(int32 *params) {
- // params: 0 pointer to object's graphic structure
- setSpriteStatus(params[0], BGP1_SPRITE);
- return IR_CONT;
-}
-
-int32 Logic::fnBackSprite(int32 *params) {
- // params: 0 pointer to object's graphic structure
- setSpriteStatus(params[0], BACK_SPRITE);
- return IR_CONT;
-}
-
-int32 Logic::fnSortSprite(int32 *params) {
- // params: 0 pointer to object's graphic structure
- setSpriteStatus(params[0], SORT_SPRITE);
- return IR_CONT;
-}
-
-int32 Logic::fnForeSprite(int32 *params) {
- // params: 0 pointer to object's graphic structure
- setSpriteStatus(params[0], FORE_SPRITE);
- return IR_CONT;
-}
-
-int32 Logic::fnForePar0Sprite(int32 *params) {
- // params: 0 pointer to object's graphic structure
- setSpriteStatus(params[0], FGP0_SPRITE);
- return IR_CONT;
-}
-
-int32 Logic::fnForePar1Sprite(int32 *params) {
- // params: 0 pointer to object's graphic structure
- setSpriteStatus(params[0], FGP1_SPRITE);
- return IR_CONT;
-}
-
-int32 Logic::fnShadedSprite(int32 *params) {
- // params: 0 pointer to object's graphic structure
- setSpriteShading(params[0], SHADED_SPRITE);
- return IR_CONT;
-}
-
-int32 Logic::fnUnshadedSprite(int32 *params) {
- // params: 0 pointer to object's graphic structure
- setSpriteShading(params[0], UNSHADED_SPRITE);
- return IR_CONT;
-}
-
-int32 Logic::fnAddSequenceText(int32 *params) {
- // params: 0 text number
- // 1 frame number to start the text displaying
- // 2 frame number to stop the text dispalying
-
- assert(_sequenceTextLines < MAX_SEQUENCE_TEXT_LINES);
-
- _sequenceTextList[_sequenceTextLines].textNumber = params[0];
- _sequenceTextList[_sequenceTextLines].startFrame = params[1];
- _sequenceTextList[_sequenceTextLines].endFrame = params[2];
- _sequenceTextLines++;
- return IR_CONT;
-}
-
void Logic::createSequenceSpeech(MovieTextObject *sequenceText[]) {
uint32 line;
FrameHeader *frame;
@@ -462,124 +322,4 @@
_sequenceTextLines = 0;
}
-int32 Logic::fnSmackerLeadIn(int32 *params) {
- // params: 0 id of lead-in music
- byte *leadIn = _vm->_resman->openResource(params[0]);
-
- StandardHeader *header = (StandardHeader *) leadIn;
- assert(header->fileType == WAV_FILE);
-
- leadIn += sizeof(StandardHeader);
-
- uint32 len = _vm->_resman->fetchLen(params[0]) - sizeof(StandardHeader);
- uint32 rv = _vm->_sound->playFx(0, len, leadIn, 0, 0, RDSE_FXLEADIN);
-
- if (rv)
- debug(5, "SFX ERROR: playFx() returned %.8x", rv);
-
- _vm->_resman->closeResource(params[0]);
-
- // fade out any music that is currently playing
- fnStopMusic(NULL);
- return IR_CONT;
-}
-
-int32 Logic::fnSmackerLeadOut(int32 *params) {
- // params: 0 id of lead-out music
-
- // ready for use in fnPlaySequence
- _smackerLeadOut = params[0];
- return IR_CONT;
-}
-
-int32 Logic::fnPlaySequence(int32 *params) {
- // params: 0 pointer to null-terminated ascii filename
- // 1 number of frames in the sequence, used for PSX.
-
- char filename[30];
- MovieTextObject *sequenceSpeechArray[MAX_SEQUENCE_TEXT_LINES + 1];
- byte *leadOut = NULL;
- uint32 leadOutLen = 0;
-
- // The original code had some #ifdef blocks for skipping or muting the
- // cutscenes - fondly described as "the biggest fudge in the history
- // of computer games" - but at the very least we want to show the
- // cutscene subtitles, so I removed them.
-
- debug(5, "fnPlaySequence(\"%s\");", (const char *) _vm->_memory->decodePtr(params[0]));
-
- // add the appropriate file extension & play it
-
- strcpy(filename, (const char *) _vm->_memory->decodePtr(params[0]));
-
- // Write to walkthrough file (zebug0.txt)
- debug(5, "PLAYING SEQUENCE \"%s\"", filename);
-
- // now create the text sprites, if any
-
- if (_sequenceTextLines)
- createSequenceSpeech(sequenceSpeechArray);
-
- // open the lead-out music resource, if there is one
-
- if (_smackerLeadOut) {
- leadOut = _vm->_resman->openResource(_smackerLeadOut);
-
- StandardHeader *header = (StandardHeader *) leadOut;
- assert(header->fileType == WAV_FILE);
-
- leadOut += sizeof(StandardHeader);
-
- leadOutLen = _vm->_resman->fetchLen(_smackerLeadOut) - sizeof(StandardHeader);
- }
-
- // don't want to carry on streaming game music when smacker starts!
- fnStopMusic(NULL);
-
- // pause sfx during sequence, except the one used for lead-in music
- _vm->_sound->pauseFxForSequence();
-
- MoviePlayer player(_vm);
- uint32 rv;
-
- if (_sequenceTextLines && !_scriptVars[DEMO])
- rv = player.play(filename, sequenceSpeechArray, leadOut, leadOutLen);
- else
- rv = player.play(filename, NULL, leadOut, leadOutLen);
-
- // check the error return-value
- if (rv)
- debug(5, "MoviePlayer.play(\"%s\") returned 0x%.8x", filename, rv);
-
- // unpause sound fx again, in case we're staying in same location
- _vm->_sound->unpauseFx();
-
- // close the lead-out music resource
-
- if (_smackerLeadOut) {
- _vm->_resman->closeResource(_smackerLeadOut);
- _smackerLeadOut = 0;
- }
-
- // now clear the text sprites, if any
-
- if (_sequenceTextLines)
- clearSequenceSpeech(sequenceSpeechArray);
-
- // now clear the screen in case the Sequence was quitted (using ESC)
- // rather than fading down to black
-
- _vm->_graphics->clearScene();
-
- // zero the entire palette in case we're about to fade up!
-
- byte pal[4 * 256];
-
- memset(pal, 0, sizeof(pal));
- _vm->_graphics->setPalette(0, 256, pal, RDPAL_INSTANT);
-
- debug(5, "fnPlaySequence FINISHED");
- return IR_CONT;
-}
-
} // End of namespace Sword2
Index: build_display.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword2/build_display.cpp,v
retrieving revision 1.68
retrieving revision 1.69
diff -u -d -r1.68 -r1.69
--- build_display.cpp 17 Jan 2005 10:57:10 -0000 1.68
+++ build_display.cpp 28 Jan 2005 16:33:08 -0000 1.69
@@ -557,18 +557,6 @@
_resman->closeResource(ob_graph->anim_resource);
}
-int32 Logic::fnRegisterFrame(int32 *params) {
- // this call would be made from an objects service script 0
-
- // params: 0 pointer to mouse structure or NULL for no write to
- // mouse list (non-zero means write sprite-shape to
- // mouse list)
- // 1 pointer to graphic structure
- // 2 pointer to mega structure or NULL if not a mega
-
- return _vm->registerFrame(params);
-}
-
int32 Sword2Engine::registerFrame(int32 *params) {
ObjectGraphic *ob_graph = (ObjectGraphic *) _memory->decodePtr(params[1]);
@@ -640,58 +628,6 @@
_thisScreen.new_palette = 0;
}
-int32 Logic::fnUpdatePlayerStats(int32 *params) {
- // engine needs to know certain info about the player
-
- // params: 0 pointer to mega structure
-
- ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->decodePtr(params[0]);
-
- _vm->_thisScreen.player_feet_x = ob_mega->feet_x;
- _vm->_thisScreen.player_feet_y = ob_mega->feet_y;
-
- // for the script
- _scriptVars[PLAYER_FEET_X] = ob_mega->feet_x;
- _scriptVars[PLAYER_FEET_Y] = ob_mega->feet_y;
- _scriptVars[PLAYER_CUR_DIR] = ob_mega->current_dir;
- _scriptVars[SCROLL_OFFSET_X] = _vm->_thisScreen.scroll_offset_x;
-
- debug(5, "fnUpdatePlayerStats: %d %d", ob_mega->feet_x, ob_mega->feet_y);
-
- return IR_CONT;
-}
-
-int32 Logic::fnFadeDown(int32 *params) {
- // NONE means up! can only be called when screen is fully faded up -
- // multiple calls wont have strange effects
-
- // params: none
-
- if (_vm->_graphics->getFadeStatus() == RDFADE_NONE)
- _vm->_graphics->fadeDown();
-
- return IR_CONT;
-}
-
-int32 Logic::fnFadeUp(int32 *params) {
- // params: none
-
- _vm->_graphics->waitForFade();
-
- if (_vm->_graphics->getFadeStatus() == RDFADE_BLACK)
- _vm->_graphics->fadeUp();
-
- return IR_CONT;
-}
-
-int32 Logic::fnSetPalette(int32 *params) {
- // params: 0 resource number of palette file, or 0 if it's to be
- // the palette from the current screen
-
- _vm->setFullPalette(params[0]);
- return IR_CONT;
-}
-
void Sword2Engine::setFullPalette(int32 palRes) {
// fudge for hut interior
// - unpausing should restore last palette as normal (could be screen
@@ -763,23 +699,4 @@
_lastPaletteRes = palRes;
}
-int32 Logic::fnRestoreGame(int32 *params) {
- // params: none
- return IR_CONT;
-}
-
-int32 Logic::fnChangeShadows(int32 *params) {
- // params: none
-
- // if last screen was using a shading mask (see below)
- if (_vm->_thisScreen.mask_flag) {
- uint32 rv = _vm->_graphics->closeLightMask();
- if (rv)
- error("Driver Error %.8x", rv);
- _vm->_thisScreen.mask_flag = false;
- }
-
- return IR_CONT;
-}
-
} // End of namespace Sword2
Index: console.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword2/console.cpp,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -d -r1.51 -r1.52
--- console.cpp 17 Jan 2005 10:57:10 -0000 1.51
+++ console.cpp 28 Jan 2005 16:33:08 -0000 1.52
@@ -26,8 +26,8 @@
#include "sword2/maketext.h"
#include "sword2/memory.h"
#include "sword2/resman.h"
+#include "sword2/sound.h"
#include "sword2/driver/d_draw.h"
-#include "sword2/driver/d_sound.h"
#include "common/debugger.cpp"
@@ -206,7 +206,7 @@
}
bool Debugger::Cmd_Starts(int argc, const char **argv) {
- _vm->_logic->conPrintStartMenu();
+ _vm->conPrintStartMenu();
return true;
}
@@ -218,7 +218,7 @@
return true;
}
- _vm->_logic->conStart(atoi(argv[1]));
+ _vm->conStart(atoi(argv[1]));
_vm->_graphics->setPalette(187, 1, pal, RDPAL_INSTANT);
return true;
}
@@ -466,7 +466,7 @@
}
// Automatically do "s 32" to run the animation testing start script
- _vm->_logic->conStart(32);
+ _vm->conStart(32);
// Same as typing "VAR 912 <value>" at the console
varSet(912, atoi(argv[1]));
@@ -482,7 +482,7 @@
}
// Automatically do "s 33" to run the text/speech testing start script
- _vm->_logic->conStart(33);
+ _vm->conStart(33);
// Same as typing "VAR 1230 <value>" at the console
varSet(1230, atoi(argv[1]));
@@ -501,7 +501,7 @@
}
// Automatically do "s 33" to run the text/speech testing start script
- _vm->_logic->conStart(33);
+ _vm->conStart(33);
// Same as typing "VAR 1230 <value>" at the console
varSet(1230, atoi(argv[1]));
Index: controls.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword2/controls.cpp,v
retrieving revision 1.82
retrieving revision 1.83
diff -u -d -r1.82 -r1.83
--- controls.cpp 25 Jan 2005 07:27:14 -0000 1.82
+++ controls.cpp 28 Jan 2005 16:33:08 -0000 1.83
@@ -28,8 +28,8 @@
#include "sword2/logic.h"
#include "sword2/resman.h"
#include "sword2/router.h"
+#include "sword2/sound.h"
#include "sword2/driver/d_draw.h"
-#include "sword2/driver/d_sound.h"
#define MAX_STRING_LEN 64 // 20 was too low; better to be safe ;)
#define CHARACTER_OVERLAP 2 // overlap characters by 3 pixels
@@ -1029,7 +1029,6 @@
_mixer->setVolumeForSoundType(SoundMixer::kMusicAudioDataType, _musicSlider->getValue());
_mixer->setVolumeForSoundType(SoundMixer::kSpeechAudioDataType, _speechSlider->getValue());
_mixer->setVolumeForSoundType(SoundMixer::kSFXAudioDataType, _fxSlider->getValue());
- _gui->_vm->_sound->buildPanTable(_gui->_stereoReversed);
_gui->updateGraphicsLevel(_gfxSlider->getValue());
@@ -1515,7 +1514,6 @@
_vm->_sound->muteMusic(ConfMan.getBool("music_mute"));
_vm->_sound->muteSpeech(ConfMan.getBool("speech_mute"));
_vm->_sound->muteFx(ConfMan.getBool("sfx_mute"));
- _vm->_sound->buildPanTable(_stereoReversed);
}
void Gui::writeOptionSettings(void) {
@@ -1588,7 +1586,7 @@
// Restart the game. To do this, we must...
// Stop music instantly!
- _vm->killMusic();
+ _vm->_sound->stopMusic();
// In case we were dead - well we're not anymore!
Logic::_scriptVars[DEAD] = 0;
Index: events.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword2/events.cpp,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -d -r1.34 -r1.35
--- events.cpp 17 Jan 2005 10:57:10 -0000 1.34
+++ events.cpp 28 Jan 2005 16:33:09 -0000 1.35
@@ -88,96 +88,6 @@
}
}
-int32 Logic::fnRequestSpeech(int32 *params) {
- // change current script - must be followed by a TERMINATE script
- // directive
-
- // params: 0 id of target to catch the event and startup speech
- // servicing
-
- // Full script id to interact with - megas run their own 7th script
- sendEvent(params[0], (params[0] << 16) | 6);
- return IR_CONT;
-}
-
-int32 Logic::fnSetPlayerActionEvent(int32 *params) {
- // we want to intercept the player character and have him interact
- // with an object - from script this code is the same as the mouse
- // engine calls when you click on an object - here, a third party
- // does the clicking IYSWIM
-
- // note - this routine used CUR_PLAYER_ID as the target
-
- // params: 0 id to interact with
-
- setPlayerActionEvent(CUR_PLAYER_ID, params[0]);
- return IR_CONT;
-}
-
-int32 Logic::fnSendEvent(int32 *params) {
- // we want to intercept the player character and have him interact
- // with an object - from script
-
- // params: 0 id to receive event
- // 1 script to run
-
- sendEvent(params[0], params[1]);
- return IR_CONT;
-}
-
-int32 Logic::fnCheckEventWaiting(int32 *params) {
- // params: none
-
- _scriptVars[RESULT] = checkEventWaiting();
- return IR_CONT;
-}
-
-// like fnCheckEventWaiting, but starts the event rather than setting RESULT
-// to 1
-
-int32 Logic::fnCheckForEvent(int32 *params) {
- // params: none
-
- if (checkEventWaiting()) {
- startEvent();
- return IR_TERMINATE;
- }
-
- return IR_CONT;
-}
-
-// combination of fnPause and fnCheckForEvent
-// - ie. does a pause, but also checks for event each cycle
-
-int32 Logic::fnPauseForEvent(int32 *params) {
- // params: 0 pointer to object's logic structure
- // 1 number of game-cycles to pause
-
- ObjectLogic *ob_logic = (ObjectLogic *) _vm->_memory->decodePtr(params[0]);
-
- if (checkEventWaiting()) {
- ob_logic->looping = 0;
- startEvent();
- return IR_TERMINATE;
- }
-
- return fnPause(params);
-}
-
-int32 Logic::fnClearEvent(int32 *params) {
- // params: none
-
- clearEvent(_scriptVars[ID]);
- return IR_CONT;
-}
-
-int32 Logic::fnStartEvent(int32 *params) {
- // params: none
-
- startEvent();
- return IR_TERMINATE;
-}
-
// For the debugger
uint32 Logic::countEvents(void) {
Index: function.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword2/function.cpp,v
retrieving revision 1.74
retrieving revision 1.75
diff -u -d -r1.74 -r1.75
--- function.cpp 20 Jan 2005 07:32:37 -0000 1.74
+++ function.cpp 28 Jan 2005 16:33:09 -0000 1.75
@@ -23,14 +23,17 @@
#include "common/system.h"
#include "sword2/sword2.h"
#include "sword2/defs.h"
+#include "sword2/console.h"
+#include "sword2/controls.h"
#include "sword2/interpreter.h"
#include "sword2/logic.h"
#include "sword2/maketext.h"
#include "sword2/memory.h"
#include "sword2/resman.h"
+#include "sword2/router.h"
[...2954 lines suppressed...]
+ _vm->_examiningMenuIcon = false;
+
+ return IR_CONT;
+}
+
+int32 Logic::fnChangeShadows(int32 *params) {
+ // params: none
+
+ // if last screen was using a shading mask (see below)
+ if (_vm->_thisScreen.mask_flag) {
+ uint32 rv = _vm->_graphics->closeLightMask();
+ if (rv)
+ error("Driver Error %.8x", rv);
+ _vm->_thisScreen.mask_flag = false;
+ }
+
+ return IR_CONT;
+}
+
} // End of namespace Sword2
Index: icons.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword2/icons.cpp,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -d -r1.39 -r1.40
--- icons.cpp 17 Jan 2005 10:57:10 -0000 1.39
+++ icons.cpp 28 Jan 2005 16:33:09 -0000 1.40
@@ -29,33 +29,6 @@
namespace Sword2 {
-int32 Logic::fnAddMenuObject(int32 *params) {
- // params: 0 pointer to a MenuObject structure to copy down
-
- _vm->addMenuObject((MenuObject *) _vm->_memory->decodePtr(params[0]));
- return IR_CONT;
-}
-
-int32 Logic::fnRefreshInventory(int32 *params) {
- // called from 'menu_look_or_combine' script in 'menu_master' object
- // to update the menu to display a combined object while George runs
- // voice-over. Note that 'object_held' must be set to the graphic of
- // the combined object
-
- // params: none
-
- // can reset this now
- _scriptVars[COMBINE_BASE] = 0;
-
- // so that the icon in 'object_held' is coloured while the rest are
- // grey
- _vm->_examiningMenuIcon = true;
- _vm->buildMenu();
- _vm->_examiningMenuIcon = false;
-
- return IR_CONT;
-}
-
void Sword2Engine::addMenuObject(MenuObject *obj) {
assert(_totalTemp < TOTAL_engine_pockets);
memcpy(&_tempList[_totalTemp], obj, sizeof(MenuObject));
Index: layers.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword2/layers.cpp,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -d -r1.33 -r1.34
--- layers.cpp 17 Jan 2005 10:57:10 -0000 1.33
+++ layers.cpp 28 Jan 2005 16:33:09 -0000 1.34
@@ -31,19 +31,11 @@
#include "sword2/interpreter.h"
#include "sword2/logic.h"
#include "sword2/resman.h"
+#include "sword2/sound.h"
#include "sword2/driver/d_draw.h"
namespace Sword2 {
-int32 Logic::fnInitBackground(int32 *params) {
- // this screen defines the size of the back buffer
-
- // params: 0 res id of normal background layer - cannot be 0
- // 1 1 yes 0 no for a new palette
-
- return _vm->initBackground(params[0], params[1]);
-}
-
/**
* This function is called when entering a new room.
* @param res resource id of the normal background layer
@@ -60,7 +52,7 @@
_resman->passTime();
_resman->expireOldResources();
- clearFxQueue();
+ _sound->clearFxQueue();
_graphics->waitForFade();
debug(1, "CHANGED TO LOCATION \"%s\"", fetchObjectName(res, buf));
Index: logic.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword2/logic.cpp,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -d -r1.49 -r1.50
--- logic.cpp 17 Jan 2005 10:57:10 -0000 1.49
+++ logic.cpp 28 Jan 2005 16:33:10 -0000 1.50
@@ -26,6 +26,7 @@
#include "sword2/logic.h"
#include "sword2/resman.h"
#include "sword2/router.h"
+#include "sword2/sound.h"
#define LEVEL (_curObjectHub->logic_level)
@@ -36,15 +37,14 @@
Logic::Logic(Sword2Engine *vm) :
_vm(vm), _kills(0), _smackerLeadOut(0), _sequenceTextLines(0),
_speechTime(0), _animId(0), _speechAnimType(0), _leftClickDelay(0),
- _rightClickDelay(0), _defaultResponseId(0), _totalStartups(0),
- _totalScreenManagers(0), _officialTextNumber(0), _speechTextBlocNo(0),
+ _rightClickDelay(0), _defaultResponseId(0), _officialTextNumber(0),
+ _speechTextBlocNo(0),
_choosing(false) {
_scriptVars = NULL;
memset(_subjectList, 0, sizeof(_subjectList));
memset(_eventList, 0, sizeof(_eventList));
memset(_syncList, 0, sizeof(_syncList));
_router = new Router(_vm);
- initStartMenu();
}
Logic::~Logic() {
@@ -212,7 +212,7 @@
// Various clean-ups
_router->clearWalkGridList();
- _vm->clearFxQueue();
+ _vm->_sound->clearFxQueue();
_router->freeAllRouteMem();
}
@@ -225,34 +225,6 @@
}
/**
- * This function is by start scripts.
- */
-
-int32 Logic::fnSetSession(int32 *params) {
- // params: 0 id of new run list
-
- expressChangeSession(params[0]);
- return IR_CONT;
-}
-
-/**
- * Causes no more objects in this logic loop to be processed. The logic engine
- * will restart at the beginning of the new list. The current screen will not
- * be drawn!
- */
-
-int32 Logic::fnEndSession(int32 *params) {
- // params: 0 id of new run-list
-
- // terminate current and change to next run-list
- expressChangeSession(params[0]);
-
- // stop the script - logic engine will now go around and the new
- // screen will begin
- return IR_STOP;
-}
-
-/**
* Move the current object up a level. Called by fnGosub command. Remember:
* only the logic object has access to _curObjectHub.
*/
@@ -307,59 +279,6 @@
Debug_Printf("No run list set\n");
}
-/**
- * Reset the object and restart script 1 on level 0
- */
-
-int32 Logic::fnTotalRestart(int32 *params) {
- // mega runs this to restart its base logic again - like being cached
- // in again
-
- // params: none
-
- LEVEL = 0;
- _curObjectHub->script_pc[0] = 1;
- return IR_TERMINATE;
-}
-
-/**
- * Mark this object for killing - to be killed when player leaves this screen.
- * Object reloads and script restarts upon re-entry to screen, which causes
- * this object's startup logic to be re-run every time we enter the screen.
- * "Which is nice."
- *
- * @note Call ONCE from object's logic script, i.e. in startup code, so not
- * re-called every time script frops off and restarts!
- */
-
-int32 Logic::fnAddToKillList(int32 *params) {
- // params: none
-
- // DON'T EVER KILL GEORGE!
- if (_scriptVars[ID] == CUR_PLAYER_ID)
- return IR_CONT;
-
- // Scan the list to see if it's already included
-
- for (uint32 i = 0; i < _kills; i++) {
- if (_objectKillList[i] == _scriptVars[ID])
- return IR_CONT;
- }
-
- assert(_kills < OBJECT_KILL_LIST_SIZE); // no room at the inn
-
- _objectKillList[_kills++] = _scriptVars[ID];
-
- // "another one bites the dust"
-
- // When we leave the screen, all these object resources are to be
- // cleaned out of memory and the kill list emptied by doing
- // '_kills = 0', ensuring that all resources are in fact still in
- // memory and, more importantly, closed before killing!
-
- return IR_CONT;
-}
-
void Logic::resetKillList(void) {
_kills = 0;
}
Index: logic.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword2/logic.h,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -d -r1.40 -r1.41
--- logic.h 17 Jan 2005 10:57:10 -0000 1.40
+++ logic.h 28 Jan 2005 16:33:10 -0000 1.41
@@ -24,7 +24,6 @@
#define _LOGIC
#include "sword2/speech.h"
-#include "sword2/startup.h"
namespace Sword2 {
@@ -68,7 +67,8 @@
EventUnit _eventList[MAX_events];
- // Stores resource id of the wav to use as lead-out from smacker
+ // Resource id of the wav to use as lead-in/lead-out from smacker
+ uint32 _smackerLeadIn;
uint32 _smackerLeadOut;
int32 animate(int32 *params, bool reverse);
@@ -133,26 +133,6 @@
void formText(int32 *params);
bool wantSpeechForLine(uint32 wavId);
- uint32 _totalStartups;
- uint32 _totalScreenManagers;
- uint32 _startRes;
-
- struct StartUp {
- char description[MAX_description];
-
- // id of screen manager object
- uint32 start_res_id;
-
- // tell the manager which startup you want (if there are more
- // than 1) (i.e more than 1 entrance to a screen and/or
- // separate game boots)
- uint32 key;
- };
-
- StartUp _startList[MAX_starts];
-
- bool initStartMenu(void);
-
int16 _standbyX; // see fnSetStandbyCoords()
int16 _standbyY;
int16 _standbyDir;
@@ -180,9 +160,6 @@
// could alternately use logic->looping of course
bool _choosing;
- void conPrintStartMenu(void);
- void conStart(int start);
-
int runScript(char *scriptData, char *objectData, uint32 *offset);
void sendEvent(uint32 id, uint32 interact_id);
Index: mouse.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword2/mouse.cpp,v
retrieving revision 1.64
retrieving revision 1.65
diff -u -d -r1.64 -r1.65
--- mouse.cpp 17 Jan 2005 10:57:11 -0000 1.64
+++ mouse.cpp 28 Jan 2005 16:33:10 -0000 1.65
@@ -30,7 +30,6 @@
#include "sword2/resman.h"
#include "sword2/sound.h"
#include "sword2/driver/d_draw.h"
-#include "sword2/driver/d_sound.h"
namespace Sword2 {
@@ -199,14 +198,14 @@
// playing when returning from control panels because control panel
// music will overwrite it!
- safe_looping_music_id = _loopingMusicId;
+ safe_looping_music_id = _sound->getLoopingMusicId();
pars[0] = 221;
pars[1] = FX_LOOP;
_logic->fnPlayMusic(pars);
- // restore proper looping_music_id
- _loopingMusicId = safe_looping_music_id;
+ // HACK: Restore proper looping_music_id
+ _sound->setLoopingMusicId(safe_looping_music_id);
_graphics->processMenu();
@@ -262,8 +261,8 @@
// then restart it! NB. If a game has been restored the music will be
// restarted twice, but this shouldn't cause any harm.
- if (_loopingMusicId) {
- pars[0] = _loopingMusicId;
+ if (_sound->getLoopingMusicId()) {
+ pars[0] = _sound->getLoopingMusicId();
pars[1] = FX_LOOP;
_logic->fnPlayMusic(pars);
} else
@@ -1081,250 +1080,4 @@
}
}
-int32 Logic::fnNoHuman(int32 *params) {
- // params: none
-
- _vm->noHuman();
- _vm->clearPointerText();
-
- // must be normal mouse situation or a largely neutral situation -
- // special menus use noHuman
-
- // dont hide menu in conversations
- if (_scriptVars[TALK_FLAG] == 0)
- _vm->_graphics->hideMenu(RDMENU_BOTTOM);
-
- if (_vm->_mouseMode == MOUSE_system_menu) {
- // close menu
- _vm->_mouseMode = MOUSE_normal;
- _vm->_graphics->hideMenu(RDMENU_TOP);
- }
-
- return IR_CONT;
-}
-
-int32 Logic::fnAddHuman(int32 *params) {
- // params: none
-
- // for logic scripts
- _scriptVars[MOUSE_AVAILABLE] = 1;
-
- // off
- if (_vm->_mouseStatus) {
- _vm->_mouseStatus = false; // on
- _vm->_mouseTouching = 1; // forces engine to choose a cursor
- }
-
- // clear this to reset no-second-click system
- _scriptVars[CLICKED_ID] = 0;
-
- // this is now done outside the OBJECT_HELD check in case it's set to
- // zero before now!
-
- // unlock the mouse from possible large object lock situtations - see
- // syphon in rm 3
-
- _vm->_mouseModeLocked = false;
-
- if (_scriptVars[OBJECT_HELD]) {
- // was dragging something around
- // need to clear this again
- _scriptVars[OBJECT_HELD] = 0;
-
- // and these may also need clearing, just in case
- _vm->_examiningMenuIcon = false;
- Logic::_scriptVars[COMBINE_BASE] = 0;
-
- _vm->setLuggage(0);
- }
-
- // if mouse is over menu area
- if (_vm->_mouseY > 399) {
- if (_vm->_mouseMode != MOUSE_holding) {
- // VITAL - reset things & rebuild the menu
- _vm->_mouseMode = MOUSE_normal;
- _vm->setMouse(NORMAL_MOUSE_ID);
- } else
- _vm->setMouse(NORMAL_MOUSE_ID);
- }
-
- // enabled/disabled from console; status printed with on-screen debug
- // info
-
- if (_vm->_debugger->_testingSnR) {
- uint8 black[4] = { 0, 0, 0, 0 };
- uint8 white[4] = { 255, 255, 255, 0 };
-
- // testing logic scripts by simulating an instant Save &
- // Restore
-
- _vm->_graphics->setPalette(0, 1, white, RDPAL_INSTANT);
-
- // stops all fx & clears the queue - eg. when leaving a
- // location
-
- _vm->clearFxQueue();
-
- // Trash all object resources so they load in fresh & restart
- // their logic scripts
-
- _vm->_resman->killAllObjects(false);
-
- _vm->_graphics->setPalette(0, 1, black, RDPAL_INSTANT);
- }
-
- return IR_CONT;
-}
-
-int32 Logic::fnRegisterMouse(int32 *params) {
- // this call would be made from an objects service script 0
- // the object would be one with no graphic but with a mouse - i.e. a
- // floor or one whose mouse area is manually defined rather than
- // intended to fit sprite shape
-
- // params: 0 pointer to ObjectMouse or 0 for no write to mouse
- // list
-
- _vm->registerMouse((ObjectMouse *) _vm->_memory->decodePtr(params[0]));
- return IR_CONT;
-}
-
-// use this in the object's service script prior to registering the mouse area
-// ie. before fnRegisterMouse or fnRegisterFrame
-// - best if kept at very top of service script
-
-int32 Logic::fnRegisterPointerText(int32 *params) {
- // params: 0 local id of text line to use as pointer text
-
- assert(_vm->_curMouse < TOTAL_mouse_list);
-
- // current object id - used for checking pointer_text when mouse area
- // registered (in fnRegisterMouse and fnRegisterFrame)
-
- _vm->_mouseList[_vm->_curMouse].id = _scriptVars[ID];
- _vm->_mouseList[_vm->_curMouse].pointer_text = params[0];
- return IR_CONT;
-}
-
-int32 Logic::fnInitFloorMouse(int32 *params) {
- // params: 0 pointer to object's mouse structure
-
- ObjectMouse *ob_mouse = (ObjectMouse *) _vm->_memory->decodePtr(params[0]);
-
- // floor is always lowest priority
-
- ob_mouse->x1 = 0;
- ob_mouse->y1 = 0;
- ob_mouse->x2 = _vm->_thisScreen.screen_wide - 1;
- ob_mouse->y2 = _vm->_thisScreen.screen_deep - 1;
- ob_mouse->priority = 9;
- ob_mouse->pointer = NORMAL_MOUSE_ID;
- return IR_CONT;
-}
-
-#define SCROLL_MOUSE_WIDTH 20
-
-int32 Logic::fnSetScrollLeftMouse(int32 *params) {
- // params: 0 pointer to object's mouse structure
-
- ObjectMouse *ob_mouse = (ObjectMouse *) _vm->_memory->decodePtr(params[0]);
-
- // Highest priority
-
- ob_mouse->x1 = 0;
- ob_mouse->y1 = 0;
- ob_mouse->x2 = _vm->_thisScreen.scroll_offset_x + SCROLL_MOUSE_WIDTH;
- ob_mouse->y2 = _vm->_thisScreen.screen_deep - 1;
- ob_mouse->priority = 0;
-
- if (_vm->_thisScreen.scroll_offset_x > 0) {
- // not fully scrolled to the left
- ob_mouse->pointer = SCROLL_LEFT_MOUSE_ID;
- } else {
- // so the mouse area doesn't get registered
- ob_mouse->pointer = 0;
- }
-
- return IR_CONT;
-}
-
-int32 Logic::fnSetScrollRightMouse(int32 *params) {
- // params: 0 pointer to object's mouse structure
-
- ObjectMouse *ob_mouse = (ObjectMouse *) _vm->_memory->decodePtr(params[0]);
-
- // Highest priority
-
- ob_mouse->x1 = _vm->_thisScreen.scroll_offset_x + _vm->_graphics->_screenWide - SCROLL_MOUSE_WIDTH;
- ob_mouse->y1 = 0;
- ob_mouse->x2 = _vm->_thisScreen.screen_wide - 1;
- ob_mouse->y2 = _vm->_thisScreen.screen_deep - 1;
- ob_mouse->priority = 0;
-
- if (_vm->_thisScreen.scroll_offset_x < _vm->_thisScreen.max_scroll_offset_x) {
- // not fully scrolled to the right
- ob_mouse->pointer = SCROLL_RIGHT_MOUSE_ID;
- } else {
- // so the mouse area doesn't get registered
- ob_mouse->pointer = 0;
- }
-
- return IR_CONT;
-}
-
-int32 Logic::fnSetObjectHeld(int32 *params) {
- // params: 0 luggage icon to set
-
- _vm->setLuggage(params[0]);
-
- _scriptVars[OBJECT_HELD] = params[0];
- _vm->_currentLuggageResource = params[0];
-
- // mode locked - no menu available
- _vm->_mouseModeLocked = true;
- return IR_CONT;
-}
-
-// called from speech scripts to remove the chooser bar when it's not
-// appropriate to keep it displayed
-
-int32 Logic::fnRemoveChooser(int32 *params) {
- // params: none
-
- _vm->_graphics->hideMenu(RDMENU_BOTTOM);
- return IR_CONT;
-}
-
-int32 Logic::fnCheckPlayerActivity(int32 *params) {
- // Used to decide when to trigger music cues described as "no player
- // activity for a while"
-
- // params: 0 threshold delay in seconds, ie. what we want to
- // check the actual delay against
-
- uint32 threshold = params[0] * 12; // in game cycles
-
- // if the actual delay is at or above the given threshold
- if (_vm->_playerActivityDelay >= threshold) {
- // reset activity delay counter, now that we've got a
- // positive check
-
- _vm->_playerActivityDelay = 0;
- _scriptVars[RESULT] = 1;
- } else
- _scriptVars[RESULT] = 0;
-
- return IR_CONT;
-}
-
-int32 Logic::fnResetPlayerActivityDelay(int32 *params) {
- // Use if you want to deliberately reset the "no player activity"
- // counter for any reason
-
- // params: none
-
- _vm->_playerActivityDelay = 0;
- return IR_CONT;
-}
-
} // End of namespace Sword2
Index: resman.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword2/resman.cpp,v
retrieving revision 1.103
retrieving revision 1.104
diff -u -d -r1.103 -r1.104
--- resman.cpp 17 Jan 2005 10:57:11 -0000 1.103
+++ resman.cpp 28 Jan 2005 16:33:10 -0000 1.104
@@ -27,6 +27,7 @@
#include "sword2/memory.h"
#include "sword2/resman.h"
#include "sword2/router.h"
+#include "sword2/sound.h"
#include "sword2/driver/d_draw.h"
#define Debug_Printf _vm->_debugger->DebugPrintf
@@ -786,7 +787,7 @@
// will still believe that the sound resources are in memory, and that
// it's ok to close them.
- _vm->clearFxQueue();
+ _vm->_sound->clearFxQueue();
for (uint i = 0; i < _totalResFiles; i++)
remove(i);
@@ -803,7 +804,7 @@
// will still believe that the sound resources are in memory, and that
// it's ok to close them.
- _vm->clearFxQueue();
+ _vm->_sound->clearFxQueue();
for (uint i = 0; i < _totalResFiles; i++) {
// Don't nuke the global variables or the player object!
Index: save_rest.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword2/save_rest.cpp,v
retrieving revision 1.64
retrieving revision 1.65
diff -u -d -r1.64 -r1.65
--- save_rest.cpp 25 Jan 2005 07:55:09 -0000 1.64
+++ save_rest.cpp 28 Jan 2005 16:33:11 -0000 1.65
@@ -122,7 +122,7 @@
_saveGameHeader.runListId = _logic->getRunList();
_saveGameHeader.feet_x = _thisScreen.feet_x;
_saveGameHeader.feet_y = _thisScreen.feet_y;
- _saveGameHeader.music_id = _loopingMusicId;
+ _saveGameHeader.music_id = _sound->getLoopingMusicId();
memcpy(&_saveGameHeader.player_hub, _resman->openResource(CUR_PLAYER_ID) + sizeof(StandardHeader), sizeof(ObjectHub));
@@ -334,14 +334,12 @@
// Any music required will be started after we've returned from
// restoreControl() - see systemMenuMouse() in mouse.cpp!
- _loopingMusicId = _saveGameHeader.music_id;
-
// Restart any looping music. Originally this was - and still is - done
// in systemMenuMouse(), but with ScummVM we have other ways of
// restoring savegames so it's easier to put it here as well.
- if (_loopingMusicId) {
- pars[0] = _loopingMusicId;
+ if (_saveGameHeader.music_id) {
+ pars[0] = _saveGameHeader.music_id;
pars[1] = FX_LOOP;
_logic->fnPlayMusic(pars);
} else
@@ -470,70 +468,4 @@
return total;
}
-/**
- * Copies the 4 essential player structures into the savegame header - run
- * script 7 of player object to request this.
- *
- * Remember, we cannot simply read a compact any longer but instead must
- * request it from the object itself.
- */
-
-int32 Logic::fnPassPlayerSaveData(int32 *params) {
- // params: 0 pointer to object's logic structure
- // 1 pointer to object's graphic structure
- // 2 pointer to object's mega structure
-
- // Copy from player object to savegame header
-
- memcpy(&_vm->_saveGameHeader.logic, _vm->_memory->decodePtr(params[0]), sizeof(ObjectLogic));
- memcpy(&_vm->_saveGameHeader.graphic, _vm->_memory->decodePtr(params[1]), sizeof(ObjectGraphic));
- memcpy(&_vm->_saveGameHeader.mega, _vm->_memory->decodePtr(params[2]), sizeof(ObjectMega));
-
- return IR_CONT;
-}
-
-/**
- * Reverse of fnPassPlayerSaveData() - run script 8 of player object.
- */
-
-int32 Logic::fnGetPlayerSaveData(int32 *params) {
- // params: 0 pointer to object's logic structure
- // 1 pointer to object's graphic structure
- // 2 pointer to object's mega structure
-
- byte *logic_ptr = _vm->_memory->decodePtr(params[0]);
- byte *graphic_ptr = _vm->_memory->decodePtr(params[1]);
- byte *mega_ptr = _vm->_memory->decodePtr(params[2]);
-
- // Copy from savegame header to player object
-
- memcpy(logic_ptr, &_vm->_saveGameHeader.logic, sizeof(ObjectLogic));
- memcpy(graphic_ptr, &_vm->_saveGameHeader.graphic, sizeof(ObjectGraphic));
- memcpy(mega_ptr, &_vm->_saveGameHeader.mega, sizeof(ObjectMega));
-
- // Any walk-data must be cleared - the player will be set to stand if
- // he was walking when saved.
-
- ObjectMega *ob_mega = (ObjectMega *) mega_ptr;
-
- if (ob_mega->currently_walking) {
- ob_mega->currently_walking = 0;
-
- int32 pars[3];
-
- pars[0] = params[1]; // ob_graphic;
- pars[1] = params[2]; // ob_mega
- pars[2] = ob_mega->current_dir;
-
- fnStand(pars);
-
- // Reset looping flag (which would have been 1 during fnWalk)
- ObjectLogic *ob_logic = (ObjectLogic *) logic_ptr;
-
- ob_logic->looping = 0;
- }
-
- return IR_CONT;
-}
-
} // End of namespace Sword2
Index: scroll.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword2/scroll.cpp,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -d -r1.21 -r1.22
--- scroll.cpp 17 Jan 2005 10:57:12 -0000 1.21
+++ scroll.cpp 28 Jan 2005 16:33:11 -0000 1.22
@@ -135,41 +135,4 @@
}
}
-/**
- * Set the special scroll offset variables
- *
- * Call when starting screens and to change the camera within screens
- *
- * call AFTER fnInitBackground() to override the defaults
- */
-
-int32 Logic::fnSetScrollCoordinate(int32 *params) {
- // params: 0 feet_x value
- // 1 feet_y value
-
- // Called feet_x and feet_y to retain intellectual compatibility with
- // Sword1!
- //
- // feet_x & feet_y refer to the physical screen coords where the
- // system will try to maintain George's feet
-
- _vm->_thisScreen.feet_x = params[0];
- _vm->_thisScreen.feet_y = params[1];
- return IR_CONT;
-}
-
-int32 Logic::fnSetScrollSpeedNormal(int32 *params) {
- // params: none
-
- _vm->_scrollFraction = 16;
- return IR_CONT;
-}
-
-int32 Logic::fnSetScrollSpeedSlow(int32 *params) {
- // params: none
-
- _vm->_scrollFraction = 32;
- return IR_CONT;
-}
-
} // End of namespace Sword2
Index: sound.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword2/sound.cpp,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -d -r1.50 -r1.51
--- sound.cpp 17 Jan 2005 10:57:12 -0000 1.50
+++ sound.cpp 28 Jan 2005 16:33:11 -0000 1.51
@@ -30,87 +30,104 @@
#include "common/stdafx.h"
#include "common/file.h"
+#include "common/system.h"
+
#include "sword2/sword2.h"
#include "sword2/defs.h"
-#include "sword2/interpreter.h"
#include "sword2/logic.h"
#include "sword2/resman.h"
#include "sword2/sound.h"
-#include "sword2/driver/d_sound.h"
+
+#include "sound/wave.h"
namespace Sword2 {
-struct FxQueueEntry {
- uint32 resource; // resource id of sample
- byte *data; // pointer to WAV data
- uint16 delay; // cycles to wait before playing (or 'random chance' if FX_RANDOM)
- uint8 volume; // 0..16
- int8 pan; // -16..16
- uint8 type; // FX_SPOT, FX_RANDOM or FX_LOOP
-};
+Sound::Sound(Sword2Engine *vm) {
+ int i;
-// FIXME: Should be in one of the classes, I guess...
+ _vm = vm;
+ _mutex = _vm->_system->createMutex();
-static FxQueueEntry fxQueue[FXQ_LENGTH];
+ for (i = 0; i < FXQ_LENGTH; i++)
+ _fxQueue[i].resource = 0;
-/**
- * Initialise the FX queue by clearing all the entries. This is only used at
- * the start of the game. Later when we need to clear the queue we must also
- * stop the sound and close the resource.
- */
+ for (i = 0; i < MAXMUS; i++)
+ _music[i] = NULL;
-void Sword2Engine::initFxQueue(void) {
- for (int i = 0; i < FXQ_LENGTH; i++)
- fxQueue[i].resource = 0;
+ _speechPaused = false;
+ _musicPaused = false;
+ _fxPaused = false;
+
+ _speechMuted = false;
+ _musicMuted = false;
+ _fxMuted = false;
+
+ _mixBuffer = NULL;
+ _mixBufferLen = 0;
+
+ _vm->_mixer->setupPremix(this, SoundMixer::kMusicAudioDataType);
+}
+
+Sound::~Sound() {
+ _vm->_mixer->setupPremix(0);
+
+ clearFxQueue();
+ stopMusic();
+ stopSpeech();
+
+ for (int i = 0; i < MAXMUS; i++)
+ delete _music[i];
+
+ free(_mixBuffer);
+
+ if (_mutex)
+ _vm->_system->deleteMutex(_mutex);
}
/**
* Stop all sounds, close their resources and clear the FX queue.
*/
-void Sword2Engine::clearFxQueue(void) {
+void Sound::clearFxQueue() {
for (int i = 0; i < FXQ_LENGTH; i++) {
- if (fxQueue[i].resource) {
- _sound->stopFx(i + 1);
- _resman->closeResource(fxQueue[i].resource);
- fxQueue[i].resource = 0;
+ if (_fxQueue[i].resource) {
+ stopFx(i);
}
}
}
/**
- * Process the FX queue once every game cycle
+ * Process the FX queue. This function is called once every game cycle.
*/
-void Sword2Engine::processFxQueue(void) {
+void Sound::processFxQueue() {
for (int i = 0; i < FXQ_LENGTH; i++) {
- if (!fxQueue[i].resource)
+ if (!_fxQueue[i].resource)
continue;
- switch (fxQueue[i].type) {
+ switch (_fxQueue[i].type) {
case FX_RANDOM:
// 1 in 'delay' chance of this fx occurring
- if (_rnd.getRandomNumber(fxQueue[i].delay) == 0)
- triggerFx(i);
+ if (_vm->_rnd.getRandomNumber(_fxQueue[i].delay) == 0)
+ playFx(&_fxQueue[i]);
break;
case FX_SPOT:
- if (fxQueue[i].delay)
- fxQueue[i].delay--;
+ if (_fxQueue[i].delay)
+ _fxQueue[i].delay--;
else {
- triggerFx(i);
- fxQueue[i].type = FX_SPOT2;
+ playFx(&_fxQueue[i]);
+ _fxQueue[i].type = FX_SPOT2;
}
break;
case FX_LOOP:
- triggerFx(i);
- fxQueue[i].type = FX_LOOPING;
+ playFx(&_fxQueue[i]);
+ _fxQueue[i].type = FX_LOOPING;
break;
case FX_SPOT2:
// Once the FX has finished remove it from the queue.
- if (!_sound->isFxPlaying(i + 1)) {
- _sound->stopFx(i + 1);
- _resman->closeResource(fxQueue[i].resource);
- fxQueue[i].resource = 0;
+ if (!_fxQueue[i].handle.isActive()) {
+ _vm->_resman->closeResource(_fxQueue[i].resource);
+ _fxQueue[i].resource = 0;
}
break;
case FX_LOOPING:
@@ -121,241 +138,139 @@
}
}
-void Sword2Engine::triggerFx(uint8 i) {
- int type;
-
- if (fxQueue[i].type == FX_LOOP)
- type = RDSE_FXLOOP;
- else
- type = RDSE_FXSPOT;
-
- uint32 len = _resman->fetchLen(fxQueue[i].resource) - sizeof(StandardHeader);
- uint32 rv = _sound->playFx(i + 1, len, fxQueue[i].data, fxQueue[i].volume, fxQueue[i].pan, type);
-
- if (rv)
- debug(5, "SFX ERROR: playFx() returned %.8x", rv);
-}
-
-void Sword2Engine::killMusic(void) {
- _loopingMusicId = 0; // clear the 'looping' flag
- _sound->stopMusic();
-}
-
-void Sword2Engine::pauseAllSound(void) {
- _sound->pauseMusic();
- _sound->pauseSpeech();
- _sound->pauseFx();
-}
-
-void Sword2Engine::unpauseAllSound(void) {
- _sound->unpauseMusic();
- _sound->unpauseSpeech();
- _sound->unpauseFx();
-}
-
-int32 Logic::fnPlayFx(int32 *params) {
- // params: 0 sample resource id
- // 1 type (FX_SPOT, FX_RANDOM, FX_LOOP)
- // 2 delay (0..65535)
- // 3 volume (0..16)
- // 4 pan (-16..16)
-
- // example script:
- // fnPlayFx (FXWATER, FX_LOOP, 0, 10, 15);
- // // fx_water is just a local script flag
- // fx_water = result;
- // .
- // .
- // .
- // fnStopFx (fx_water);
+/**
+ * Queue a sound effect for playing later.
+ * @param res the sound resource number
+ * @param type the type of sound effect
+ * @param delay when to play the sound effect
+ * @param volume the sound effect volume (0 through 16)
+ * @param pan the sound effect panning (-16 through 16)
+ */
+void Sound::queueFx(int32 res, int32 type, int32 delay, int32 volume, int32 pan) {
if (_vm->_wantSfxDebug) {
- char type[10];
+ const char *typeStr;
- switch (params[1]) {
+ switch (type) {
case FX_SPOT:
- strcpy(type, "SPOT");
+ typeStr = "SPOT";
break;
case FX_LOOP:
- strcpy(type, "LOOPED");
+ typeStr = "LOOPED";
break;
case FX_RANDOM:
- strcpy(type, "RANDOM");
+ typeStr = "RANDOM";
break;
default:
- strcpy(type, "INVALID");
+ typeStr = "INVALID";
break;
}
byte buf[NAME_LEN];
- debug(0, "SFX (sample=\"%s\", vol=%d, pan=%d, delay=%d, type=%s)", _vm->fetchObjectName(params[0], buf), params[3], params[4], params[2], type);
- }
-
- int i;
-
- // Find a free slot in the FX queue
-
- for (i = 0; i < FXQ_LENGTH; i++) {
- if (!fxQueue[i].resource)
- break;
- }
-
- if (i == FXQ_LENGTH) {
- warning("No free slot in FX queue");
- return IR_CONT;
- }
-
- fxQueue[i].resource = params[0];
- fxQueue[i].type = params[1];
- fxQueue[i].delay = params[2];
-
- if (fxQueue[i].type == FX_RANDOM) {
- // For spot effects and loops the dela is the number of frames
- // to wait. For random effects, however, it's the average
- // number of seconds between playing the sound, so we have to
- // multiply by the frame rate.
- fxQueue[i].delay *= 12;
+ debug(0, "SFX (sample=\"%s\", vol=%d, pan=%d, delay=%d, type=%s)", _vm->fetchObjectName(res, buf), volume, pan, delay, typeStr);
}
- fxQueue[i].volume = params[3];
- fxQueue[i].pan = params[4];
-
- byte *data = _vm->_resman->openResource(params[0]);
- StandardHeader *header = (StandardHeader *) data;
-
- assert(header->fileType == WAV_FILE);
+ for (int i = 0; i < FXQ_LENGTH; i++) {
+ if (!_fxQueue[i].resource) {
+ byte *data = _vm->_resman->openResource(res);
+ StandardHeader *header = (StandardHeader *) data;
- fxQueue[i].data = data + sizeof(StandardHeader);
+ assert(header->fileType == WAV_FILE);
- // Keep track of the index in the loop so that fnStopFx() can be used
- // later to kill this sound. Mainly for FX_LOOP and FX_RANDOM.
+ uint32 len = _vm->_resman->fetchLen(res) - sizeof(StandardHeader);
- _scriptVars[RESULT] = i;
- return IR_CONT;
-}
+ if (type == FX_RANDOM) {
+ // For spot effects and loops the delay is the
+ // number of frames to wait. For random
+ // effects, however, it's the average number of
+ // seconds between playing the sound, so we
+ // have to multiply by the frame rate.
+ delay *= 12;
+ }
-int32 Logic::fnSoundFetch(int32 *params) {
- // params: 0 id of sound to fetch [guess]
- return IR_CONT;
-}
+ volume = (volume * SoundMixer::kMaxChannelVolume) / 16;
+ pan = (pan * 127) / 16;
-/**
- * Alter the volume and pan of a currently playing FX
- */
+ _fxQueue[i].resource = res;
+ _fxQueue[i].data = data + sizeof(StandardHeader);
+ _fxQueue[i].len = len;
+ _fxQueue[i].delay = delay;
+ _fxQueue[i].volume = volume;
+ _fxQueue[i].pan = pan;
+ _fxQueue[i].type = type;
-int32 Logic::fnSetFxVolAndPan(int32 *params) {
- // params: 0 id of fx (ie. the id returned in 'result' from
- // fnPlayFx
- // 1 new volume (0..16)
- // 2 new pan (-16..16)
+ // Keep track of the index in the loop so that
+ // fnStopFx() can be used later to kill this sound.
+ // Mainly for FX_LOOP and FX_RANDOM.
- debug(5, "fnSetFxVolAndPan(%d, %d, %d)", params[0], params[1], params[2]);
+ Logic::_scriptVars[RESULT] = i;
+ return;
+ }
+ }
- _vm->_sound->setFxIdVolumePan(params[0] + 1, params[1], params[2]);
- return IR_CONT;
+ warning("No free slot in FX queue");
}
-/**
- * Alter the volume of a currently playing FX
- */
-
-int32 Logic::fnSetFxVol(int32 *params) {
- // params: 0 id of fx (ie. the id returned in 'result' from
- // fnPlayFx
- // 1 new volume (0..16)
-
- _vm->_sound->setFxIdVolume(params[0] + 1, params[1]);
- return IR_CONT;
+int32 Sound::playFx(FxQueueEntry *fx) {
+ return playFx(&fx->handle, fx->data, fx->len, fx->volume, fx->pan, (fx->type == FX_LOOP), SoundMixer::kSFXAudioDataType);
}
-int32 Logic::fnStopFx(int32 *params) {
- // params: 0 position in queue
+int32 Sound::playFx(PlayingSoundHandle *handle, byte *data, uint32 len, uint8 vol, int8 pan, bool loop, SoundMixer::SoundType soundType) {
+ if (_fxMuted)
+ return RD_OK;
- int32 i = params[0];
- uint32 rv = _vm->_sound->stopFx(i + 1);
+ if (handle->isActive())
+ return RDERR_FXALREADYOPEN;
- if (rv)
- debug(5, "SFX ERROR: closeFx() returned %.8x", rv);
+ Common::MemoryReadStream stream(data, len);
+ int rate, size;
+ byte flags;
- // Remove from queue
- if (fxQueue[i].resource) {
- _vm->_resman->closeResource(fxQueue[i].resource);
- fxQueue[i].resource = 0;
+ if (!loadWAVFromStream(stream, size, rate, flags)) {
+ warning("playFX: Not a valid WAV file");
+ return RDERR_INVALIDWAV;
}
- return IR_CONT;
-}
-
-/**
- * Stops all FX and clears the entire FX queue.
- */
-
-int32 Logic::fnStopAllFx(int32 *params) {
- // params: none
+ if (isReverseStereo())
+ flags |= SoundMixer::FLAG_REVERSE_STEREO;
- _vm->clearFxQueue();
- return IR_CONT;
-}
+ if (loop)
+ flags |= SoundMixer::FLAG_LOOP;
-int32 Logic::fnPrepareMusic(int32 *params) {
- // params: 1 id of music to prepare [guess]
- return IR_CONT;
+ _vm->_mixer->playRaw(handle, data + stream.pos(), size, rate, flags, -1, vol, pan, 0, 0, soundType);
+ return RD_OK;
}
/**
- * Start a tune playing, to play once or to loop until stopped or next one
- * played.
+ * This function closes a sound effect which has been previously opened for
+ * playing. Sound effects must be closed when they are finished with, otherwise
+ * you will run out of sound effect buffers.
+ * @param i the index of the sound to close
*/
-int32 Logic::fnPlayMusic(int32 *params) {
- // params: 0 tune id
- // 1 loop flag (0 or 1)
-
- char filename[128];
- bool loopFlag;
- uint32 rv;
-
- if (params[1] == FX_LOOP) {
- loopFlag = true;
-
- // keep a note of the id, for restarting after an
- // interruption to gameplay
- _vm->_loopingMusicId = params[0];
- } else {
- loopFlag = false;
-
- // don't need to restart this tune after control panel or
- // restore
- _vm->_loopingMusicId = 0;
- }
-
- rv = _vm->_sound->streamCompMusic(params[0], loopFlag);
+int32 Sound::stopFx(int32 i) {
+ if (!_fxQueue[i].resource)
+ return RDERR_FXNOTOPEN;
- if (rv)
- debug(5, "ERROR: streamCompMusic(%s, %d, %d) returned error 0x%.8x", filename, params[0], loopFlag, rv);
+ if (_fxQueue[i].handle.isActive())
+ _vm->_mixer->stopHandle(_fxQueue[i].handle);
- return IR_CONT;
+ _vm->_resman->closeResource(_fxQueue[i].resource);
+ _fxQueue[i].resource = 0;
+ return RD_OK;
}
-int32 Logic::fnStopMusic(int32 *params) {
- // params: none
-
- _vm->_loopingMusicId = 0; // clear the 'looping' flag
- _vm->_sound->stopMusic();
- return IR_CONT;
+void Sound::pauseAllSound() {
+ pauseMusic();
+ pauseSpeech();
+ pauseFx();
}
-int32 Logic::fnCheckMusicPlaying(int32 *params) {
- // params: none
-
- // sets result to no. of seconds of current tune remaining
- // or 0 if no music playing
-
- // in seconds, rounded up to the nearest second
- _scriptVars[RESULT] = _vm->_sound->musicTimeRemaining();
-
- return IR_CONT;
+void Sound::unpauseAllSound() {
+ unpauseMusic();
+ unpauseSpeech();
+ unpauseFx();
}
} // End of namespace Sword2
Index: sound.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword2/sound.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- sound.h 17 Jan 2005 10:57:12 -0000 1.11
+++ sound.h 28 Jan 2005 16:33:11 -0000 1.12
@@ -31,12 +31,25 @@
#ifndef SOUND_H
#define SOUND_H
-// max number of fx in queue at once [DO NOT EXCEED 255]
+#include "sound/audiostream.h"
+#include "sound/mixer.h"
+
+// Max number of sound fx
+#define MAXMUS 2
+
+// Max number of fx in queue at once
#define FXQ_LENGTH 32
+#define BUFFER_SIZE 4096
+
namespace Sword2 {
-// fx types
+enum {
+ kCLUMode = 1,
+ kMP3Mode,
+ kVorbisMode,
+ kFlacMode
+};
enum {
// These three types correspond to types set by the scripts
@@ -49,6 +62,181 @@
FX_LOOPING = 4
};
+extern void sword2_sound_handler(void *refCon);
+
+class CLUInputStream : public AudioStream {
+private:
+ File *_file;
+ bool _firstTime;
+ uint32 _file_pos;
+ uint32 _end_pos;
+ int16 _outbuf[BUFFER_SIZE];
+ byte _inbuf[BUFFER_SIZE];
+ const int16 *_bufferEnd;
+ const int16 *_pos;
+
+ uint16 _prev;
+
+ void refill();
+
+ inline bool eosIntern() const {
+ return _pos >= _bufferEnd;
+ }
+
+public:
+ CLUInputStream(File *file, int size);
+ ~CLUInputStream();
+
+ int readBuffer(int16 *buffer, const int numSamples);
+
+ bool endOfData() const { return eosIntern(); }
+ bool isStereo() const { return false; }
+ int getRate() const { return 22050; }
+};
+
+class MusicInputStream : public AudioStream {
+private:
+ int _cd;
+ uint32 _musicId;
+ AudioStream *_decoder;
+ int16 _buffer[BUFFER_SIZE];
+ const int16 *_bufferEnd;
+ const int16 *_pos;
+ bool _remove;
+ uint32 _numSamples;
+ uint32 _samplesLeft;
+ bool _looping;
+ int32 _fading;
+ int32 _fadeSamples;
+ bool _paused;
+
+ void refill();
+
+ inline bool eosIntern() const {
+ if (_looping)
+ return false;
+ return _remove || _pos >= _bufferEnd;
+ }
+
+public:
+ MusicInputStream(int cd, uint32 musicId, bool looping);
+ ~MusicInputStream();
+
+ int readBuffer(int16 *buffer, const int numSamples);
+
+ bool endOfData() const { return eosIntern(); }
+ bool isStereo() const { return _decoder->isStereo(); }
+ int getRate() const { return _decoder->getRate(); }
+
+ void fadeUp();
+ void fadeDown();
+
+ bool isReady() { return _decoder != NULL; }
+ int32 isFading() { return _fading; }
+
+ bool readyToRemove();
+ int32 getTimeRemaining();
+};
+
+class Sound : public AudioStream {
+private:
+ Sword2Engine *_vm;
+
+ Common::MutexRef _mutex;
+
+ struct FxQueueEntry {
+ PlayingSoundHandle handle; // sound handle
+ uint32 resource; // resource id of sample
+ byte *data; // pointer to WAV data
+ uint32 len; // WAV data length
+ uint16 delay; // cycles to wait before playing (or 'random chance' if FX_RANDOM)
+ uint8 volume; // sound volume
+ int8 pan; // sound panning
+ uint8 type; // FX_SPOT, FX_RANDOM, FX_LOOP
+ };
+
+ FxQueueEntry _fxQueue[FXQ_LENGTH];
+
+ void triggerFx(uint8 i);
+
+ bool _reverseStereo;
+
+ bool _speechMuted;
+ bool _fxMuted;
+ bool _musicMuted;
+
+ bool _speechPaused;
+ bool _fxPaused;
+ bool _musicPaused;
+
+ int32 _loopingMusicId;
+
+ PlayingSoundHandle _soundHandleSpeech;
+
+ MusicInputStream *_music[MAXMUS];
+ int16 *_mixBuffer;
+ int _mixBufferLen;
+
+public:
+ Sound(Sword2Engine *vm);
+ ~Sound();
+
+ // AudioStream API
+
+ int readBuffer(int16 *buffer, const int numSamples);
+ bool isStereo() const;
+ bool endOfData() const;
+ int getRate() const;
+
+ // End of AudioStream API
+
+ void clearFxQueue();
+ void processFxQueue();
+
+ void setReverseStereo(bool reverse) { _reverseStereo = reverse; }
+ bool isReverseStereo() const { return _reverseStereo; }
+
+ void muteSpeech(bool mute);
+ bool isSpeechMute() const { return _speechMuted; }
+
+ void muteFx(bool mute);
+ bool isFxMute() const { return _fxMuted; }
+
+ void muteMusic(bool mute) { _musicMuted = mute; }
+ bool isMusicMute() const { return _musicMuted; }
+
+ void setLoopingMusicId(int32 id) { _loopingMusicId = id; }
+ int32 getLoopingMusicId() const { return _loopingMusicId; }
+
+ void pauseSpeech();
+ void unpauseSpeech();
+
+ void pauseFx();
+ void unpauseFx();
+
+ void pauseMusic();
+ void unpauseMusic();
+
+ void pauseAllSound();
+ void unpauseAllSound();
+
+ void queueFx(int32 res, int32 type, int32 delay, int32 volume, int32 pan);
+ int32 playFx(FxQueueEntry *fx);
+ int32 playFx(PlayingSoundHandle *handle, byte *data, uint32 len, uint8 vol, int8 pan, bool loop, SoundMixer::SoundType soundType);
+ int32 stopFx(int32 i);
+ int32 setFxIdVolumePan(int32 id, int vol, int pan = -1);
+
+ int32 getSpeechStatus();
+ int32 amISpeaking();
+ int32 playCompSpeech(uint32 speechId, uint8 vol, int8 pan);
+ uint32 preFetchCompSpeech(uint32 speechId, uint16 **buf);
+ int32 stopSpeech();
+
+ int32 streamCompMusic(uint32 musicId, bool loop);
+ void stopMusic();
+ int32 musicTimeRemaining();
+};
+
} // End of namespace Sword2
#endif
Index: speech.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword2/speech.cpp,v
retrieving revision 1.69
retrieving revision 1.70
diff -u -d -r1.69 -r1.70
--- speech.cpp 17 Jan 2005 10:57:12 -0000 1.69
+++ speech.cpp 28 Jan 2005 16:33:11 -0000 1.70
@@ -31,667 +31,15 @@
#include "sword2/memory.h"
#include "sword2/resman.h"
#include "sword2/driver/d_draw.h"
-#include "sword2/driver/d_sound.h"
namespace Sword2 {
-int32 Logic::fnAddSubject(int32 *params) {
- // params: 0 id
- // 1 daves reference number
-
[...1004 lines suppressed...]
-
- // Speech still going, so decrement the click_delay if it's still
- // active
-
- if (_leftClickDelay)
- _leftClickDelay--;
-
- if (_rightClickDelay)
- _rightClickDelay--;
-
- return IR_REPEAT;
-}
-
-// Distance kept above talking sprite
-#define GAP_ABOVE_HEAD 20
-
-/**
* Sets _textX and _textY for position of text sprite. Note that _textX is
* also used to calculate speech pan.
*/
Index: startup.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword2/startup.cpp,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -d -r1.46 -r1.47
--- startup.cpp 17 Jan 2005 10:57:12 -0000 1.46
+++ startup.cpp 28 Jan 2005 16:33:12 -0000 1.47
@@ -30,13 +30,13 @@
#include "sword2/memory.h"
#include "sword2/resman.h"
#include "sword2/router.h"
-#include "sword2/driver/d_sound.h"
+#include "sword2/sound.h"
-#define Debug_Printf _vm->_debugger->DebugPrintf
+#define Debug_Printf _debugger->DebugPrintf
namespace Sword2 {
-bool Logic::initStartMenu(void) {
+bool Sword2Engine::initStartMenu() {
// Print out a list of all the start points available.
// There should be a linc produced file called startup.txt.
// This file should contain ascii numbers of all the resource game
@@ -49,6 +49,7 @@
// ok, load in the master screen manager file
_totalStartups = 0;
+ _totalScreenManagers = 0;
if (!fp.open("startup.inf")) {
warning("Cannot open startup.inf - the debugger won't have a start menu");
@@ -119,12 +120,12 @@
// - need to check in case un-built sections included in
// start list
- if (_vm->_resman->checkValid(_startRes)) {
- char *raw_script = (char *) _vm->_resman->openResource(_startRes);
+ if (_resman->checkValid(_startRes)) {
+ char *raw_script = (char *) _resman->openResource(_startRes);
uint32 null_pc = 0;
- runScript(raw_script, raw_script, &null_pc);
- _vm->_resman->closeResource(_startRes);
+ _logic->runScript(raw_script, raw_script, &null_pc);
+ _resman->closeResource(_startRes);
} else
warning("Start menu resource %d invalid", _startRes);
}
@@ -132,22 +133,16 @@
return 1;
}
-int32 Logic::fnRegisterStartPoint(int32 *params) {
- // params: 0 id of startup script to call - key
- // 1 pointer to ascii message
-
+void Sword2Engine::registerStartPoint(int32 key, char *name) {
assert(_totalStartups < MAX_starts);
- char *name = (char *) _vm->_memory->decodePtr(params[1]);
-
_startList[_totalStartups].start_res_id = _startRes;
- _startList[_totalStartups].key = params[0];
+ _startList[_totalStartups].key = key;
strncpy(_startList[_totalStartups].description, name, MAX_description);
_startList[_totalStartups].description[MAX_description - 1] = 0;
_totalStartups++;
- return IR_CONT;
}
/**
@@ -155,7 +150,7 @@
* start points in the game.
*/
-void Logic::conPrintStartMenu(void) {
+void Sword2Engine::conPrintStartMenu() {
if (!_totalStartups) {
Debug_Printf("Sorry - no startup positions registered?\n");
@@ -170,7 +165,7 @@
Debug_Printf("%d (%s)\n", i, _startList[i].description);
}
-void Logic::conStart(int start) {
+void Sword2Engine::conStart(int start) {
if (!_totalStartups) {
Debug_Printf("Sorry - there are no startups!\n");
return;
@@ -183,44 +178,44 @@
// Restarting - stop sfx, music & speech!
- _vm->clearFxQueue();
- fnStopMusic(NULL);
- _vm->_sound->unpauseSpeech();
- _vm->_sound->stopSpeech();
+ _sound->clearFxQueue();
+ _logic->fnStopMusic(NULL);
+ _sound->unpauseSpeech();
+ _sound->stopSpeech();
// Remove all resources from memory, including player object and global
// variables
- _vm->_resman->removeAll();
+ _resman->removeAll();
// Reopen global variables resource and player object
- _vm->setupPersistentResources();
+ setupPersistentResources();
// Free all the route memory blocks from previous game
- _router->freeAllRouteMem();
+ _logic->_router->freeAllRouteMem();
// If there was speech text, kill the text block
- if (_speechTextBlocNo) {
- _vm->_fontRenderer->killTextBloc(_speechTextBlocNo);
- _speechTextBlocNo = 0;
+ if (_logic->_speechTextBlocNo) {
+ _fontRenderer->killTextBloc(_logic->_speechTextBlocNo);
+ _logic->_speechTextBlocNo = 0;
}
// Open George
- char *raw_data_ad = (char *) _vm->_resman->openResource(CUR_PLAYER_ID);
- char *raw_script = (char *) _vm->_resman->openResource(_startList[start].start_res_id);
+ char *raw_data_ad = (char *) _resman->openResource(CUR_PLAYER_ID);
+ char *raw_script = (char *) _resman->openResource(_startList[start].start_res_id);
// Denotes script to run
uint32 null_pc = _startList[start].key & 0xffff;
Debug_Printf("Running start %d\n", start);
- runScript(raw_script, raw_data_ad, &null_pc);
+ _logic->runScript(raw_script, raw_data_ad, &null_pc);
- _vm->_resman->closeResource(_startList[start].start_res_id);
- _vm->_resman->closeResource(CUR_PLAYER_ID);
+ _resman->closeResource(_startList[start].start_res_id);
+ _resman->closeResource(CUR_PLAYER_ID);
// Make sure there's a mouse, in case restarting while mouse not
// available
- fnAddHuman(NULL);
+ _logic->fnAddHuman(NULL);
}
} // End of namespace Sword2
Index: sword2.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword2/sword2.cpp,v
retrieving revision 1.132
retrieving revision 1.133
diff -u -d -r1.132 -r1.133
--- sword2.cpp 17 Jan 2005 10:57:12 -0000 1.132
+++ sword2.cpp 28 Jan 2005 16:33:12 -0000 1.133
@@ -39,7 +39,6 @@
#include "sword2/resman.h"
#include "sword2/sound.h"
#include "sword2/driver/d_draw.h"
-#include "sword2/driver/d_sound.h"
#ifdef _WIN32_WCE
extern bool isSmartphone(void);
@@ -190,8 +189,6 @@
}
Sword2Engine::~Sword2Engine() {
- killMusic();
-
delete _debugger;
delete _graphics;
delete _sound;
@@ -261,13 +258,14 @@
_mixer->setVolumeForSoundType(SoundMixer::kSpeechAudioDataType, ConfMan.getInt("speech_volume"));
_mixer->setVolumeForSoundType(SoundMixer::kSFXAudioDataType, ConfMan.getInt("sfx_volume"));
+ initStartMenu();
+
// During normal gameplay, we care neither about mouse button releases
// nor the scroll wheel.
setEventFilter(RD_LEFTBUTTONUP | RD_RIGHTBUTTONUP | RD_WHEELUP | RD_WHEELDOWN);
setupPersistentResources();
initialiseFontResourceFlags();
- initFxQueue();
if (_features & GF_DEMO)
Logic::_scriptVars[DEMO] = 1;
@@ -511,7 +509,7 @@
setScrolling();
mouseEngine();
- processFxQueue();
+ _sound->processFxQueue();
}
void Sword2Engine::startGame() {
@@ -564,7 +562,7 @@
if (_graphics->getFadeStatus() != RDFADE_NONE)
return;
- pauseAllSound();
+ _sound->pauseAllSound();
// Make the mouse cursor normal. This is the only place where we are
// allowed to clear the luggage this way.
@@ -599,7 +597,7 @@
if (Logic::_scriptVars[OBJECT_HELD] && _realLuggageItem)
setLuggage(_realLuggageItem);
- unpauseAllSound();
+ _sound->unpauseAllSound();
// Put back game screen palette; see build_display.cpp
setFullPalette(-1);
Index: sword2.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword2/sword2.h,v
retrieving revision 1.74
retrieving revision 1.75
diff -u -d -r1.74 -r1.75
--- sword2.h 17 Jan 2005 10:57:12 -0000 1.74
+++ sword2.h 28 Jan 2005 16:33:12 -0000 1.75
@@ -41,6 +41,9 @@
#include "sword2/object.h"
#include "sword2/save_rest.h"
+#define MAX_starts 100
+#define MAX_description 100
+
class GameDetector;
class OSystem;
@@ -171,6 +174,24 @@
MenuObject _masterMenuList[TOTAL_engine_pockets];
uint32 _totalMasters;
+ uint32 _totalStartups;
+ uint32 _totalScreenManagers;
+ uint32 _startRes;
+
+ struct StartUp {
+ char description[MAX_description];
+
+ // id of screen manager object
+ uint32 start_res_id;
+
+ // tell the manager which startup you want (if there are more
+ // than 1) (i.e more than 1 entrance to a screen and/or
+ // separate game boots)
+ uint32 key;
+ };
+
+ StartUp _startList[MAX_starts];
+
public:
Sword2Engine(GameDetector *detector, OSystem *syst);
~Sword2Engine();
@@ -378,25 +399,6 @@
void setScrolling();
- // used to store id of tunes that loop, for save & restore
- uint32 _loopingMusicId;
-
- // to be called during system initialisation
- void initFxQueue();
-
- // to be called from the main loop, once per cycle
- void processFxQueue();
-
- // stops all fx & clears the queue - eg. when leaving a location
- void clearFxQueue();
-
- void pauseAllSound();
- void unpauseAllSound();
-
- void killMusic();
-
- void triggerFx(uint8 j);
-
bool _gamePaused;
bool _graphicsLevelFudged;
@@ -410,6 +412,10 @@
void initialiseFontResourceFlags();
void initialiseFontResourceFlags(uint8 language);
+ bool initStartMenu();
+ void registerStartPoint(int32 key, char *name);
+ void conPrintStartMenu();
+ void conStart(int start);
// Convenience alias for OSystem::getMillis().
// This is a bit hackish, of course :-).
Index: sync.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword2/sync.cpp,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- sync.cpp 17 Jan 2005 10:57:12 -0000 1.22
+++ sync.cpp 28 Jan 2005 16:33:12 -0000 1.23
@@ -26,26 +26,6 @@
namespace Sword2 {
-int32 Logic::fnSendSync(int32 *params) {
- // params: 0 sync's recipient
- // 1 sync value
-
- for (int i = 0; i < MAX_syncs; i++) {
- if (_syncList[i].id == 0) {
- debug(5, "%d sends sync %d to %d", _scriptVars[ID], params[1], params[0]);
- _syncList[i].id = params[0];
- _syncList[i].sync = params[1];
- return IR_CONT;
- }
- }
-
- // The original code didn't even check for this condition, so maybe
- // it should be a fatal error?
-
- warning("No free sync slot");
- return IR_CONT;
-}
-
/**
* Clear any syncs registered for this id. Call this just after the id has been
* processed. Theoretically there could be more than one sync waiting for us,
@@ -75,38 +55,4 @@
return -1;
}
-/**
- * Like getSync(), but called from scripts. Sets the RESULT variable to
- * the sync value, or 0 if none is found.
- */
-
-int32 Logic::fnGetSync(int32 *params) {
- // params: none
-
- int slot = getSync();
-
- _scriptVars[RESULT] = (slot != -1) ? _syncList[slot].sync : 0;
- return IR_CONT;
-}
-
-/**
- * Wait for sync to happen. Sets the RESULT variable to the sync value, once
- * it has been found.
- */
-
-int32 Logic::fnWaitSync(int32 *params) {
- // params: none
-
- debug(6, "fnWaitSync: %d waits", _scriptVars[ID]);
-
- int slot = getSync();
-
- if (slot == -1)
- return IR_REPEAT;
-
- debug(5, "fnWaitSync: %d got sync %d", _scriptVars[ID], _syncList[slot].sync);
- _scriptVars[RESULT] = _syncList[slot].sync;
- return IR_CONT;
-}
-
} // End of namespace Sword2
Index: walker.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword2/walker.cpp,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -d -r1.43 -r1.44
--- walker.cpp 17 Jan 2005 10:57:12 -0000 1.43
+++ walker.cpp 28 Jan 2005 16:33:12 -0000 1.44
@@ -36,405 +36,6 @@
namespace Sword2 {
/**
- * Walk mega to (x,y,dir). Set RESULT to 0 if it succeeded. Otherwise, set
- * RESULT to 1.
- */
-
-int32 Logic::fnWalk(int32 *params) {
- // params: 0 pointer to object's logic structure
- // 1 pointer to object's graphic structure
- // 2 pointer to object's mega structure
- // 3 pointer to object's walkdata structure
- // 4 target x-coord
- // 5 target y-coord
- // 6 target direction (8 means end walk on ANY direction)
-
- ObjectLogic *ob_logic = (ObjectLogic *) _vm->_memory->decodePtr(params[0]);
- ObjectGraphic *ob_graph = (ObjectGraphic *) _vm->_memory->decodePtr(params[1]);
- ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->decodePtr(params[2]);
-
- int16 target_x = (int16) params[4];
- int16 target_y = (int16) params[5];
- uint8 target_dir = (uint8) params[6];
-
- ObjectWalkdata *ob_walkdata;
-
- // If this is the start of the walk, calculate the route.
-
- if (!ob_logic->looping) {
- // If we're already there, don't even bother allocating
- // memory and calling the router, just quit back & continue
- // the script! This avoids an embarassing mega stand frame
- // appearing for one cycle when we're already in position for
- // an anim eg. repeatedly clicking on same object to repeat
- // an anim - no mega frame will appear in between runs of the
- // anim.
-
- if (ob_mega->feet_x == target_x && ob_mega->feet_y == target_y && ob_mega->current_dir == target_dir) {
- _scriptVars[RESULT] = 0;
- return IR_CONT;
- }
-
- assert(params[6] >= 0 && params[6] <= 8);
-
- ob_walkdata = (ObjectWalkdata *) _vm->_memory->decodePtr(params[3]);
-
- ob_mega->walk_pc = 0;
-
- // Set up mem for _walkData in route_slots[] & set mega's
- // 'route_slot_id' accordingly
-
- _router->allocateRouteMem();
-
- int32 route = _router->routeFinder(ob_mega, ob_walkdata, target_x, target_y, target_dir);
-
- // 0 = can't make route to target
- // 1 = created route
- // 2 = zero route but may need to turn
-
- if (route == 1 || route == 2) {
- // so script fnWalk loop continues until end of
- // walk-anim
-
- ob_logic->looping = 1;
-
- // need to animate the route now, so don't set result
- // or return yet!
-
- // started walk
- ob_mega->currently_walking = 1;
-
- // (see fnGetPlayerSaveData() in save_rest.cpp
- } else {
- _router->freeRouteMem();
- _scriptVars[RESULT] = 1;
- return IR_CONT;
- }
-
- // Walk is about to start, so set the mega's graphic resource
- ob_graph->anim_resource = ob_mega->megaset_res;
- } else if (_scriptVars[EXIT_FADING] && _vm->_graphics->getFadeStatus() == RDFADE_BLACK) {
- // Double clicked an exit so quit the walk when screen is black
- // ok, thats it - back to script and change screen
-
- ob_logic->looping = 0;
- _router->freeRouteMem();
-
- // Must clear in-case on the new screen there's a walk
- // instruction (which would get cut short)
- _scriptVars[EXIT_CLICK_ID] = 0;
-
- // finished walk
- ob_mega->currently_walking = 0;
-
- // see fnGetPlayerSaveData() in save_rest.cpp
-
- _scriptVars[RESULT] = 0;
-
- // continue the script so that RESULT can be checked!
- return IR_CONT;
- }
-
- // get pointer to walkanim & current frame position
-
- WalkData *walkAnim = _router->getRouteMem();
- int32 walk_pc = ob_mega->walk_pc;
-
- // If stopping the walk early, overwrite the next step with a
- // slow-out, then finish
-
- if (checkEventWaiting()) {
- if (walkAnim[walk_pc].step == 0 && walkAnim[walk_pc + 1].step == 1) {
- // At the beginning of a step
- ob_walkdata = (ObjectWalkdata *) _vm->_memory->decodePtr(params[3]);
- _router->earlySlowOut(ob_mega, ob_walkdata);
- }
- }
-
- // Get new frame of walk
-
- ob_graph->anim_pc = walkAnim[walk_pc].frame;
- ob_mega->current_dir = walkAnim[walk_pc].dir;
- ob_mega->feet_x = walkAnim[walk_pc].x;
- ob_mega->feet_y = walkAnim[walk_pc].y;
-
- // Check if NEXT frame is in fact the end-marker of the walk sequence
- // so we can return to script just as the final (stand) frame of the
- // walk is set - so that if followed by an anim, the anim's first
- // frame replaces the final stand-frame of the walk (see below)
-
- // '512' is end-marker
- if (walkAnim[walk_pc + 1].frame == 512) {
- ob_logic->looping = 0;
- _router->freeRouteMem();
-
- // finished walk
- ob_mega->currently_walking = 0;
-
- // (see fnGetPlayerSaveData() in save_rest.cpp
-
- // if George's walk has been interrupted to run a new action
- // script for instance or Nico's walk has been interrupted by
- // player clicking on her to talk
-
- // There used to be code here for checking if two megas were
- // colliding, but that code had been commented out, and it
- // was only run if a function that always returned zero
- // returned non-zero.
-
- if (checkEventWaiting()) {
- startEvent();
- _scriptVars[RESULT] = 1;
- return IR_TERMINATE;
- } else {
- _scriptVars[RESULT] = 0;
-
- // CONTINUE the script so that RESULT can be checked!
- // Also, if an anim command follows the fnWalk command,
- // the 1st frame of the anim (which is always a stand
- // frame itself) can replace the final stand frame of
- // the walk, to hide the slight difference between the
- // shrinking on the mega frames and the pre-shrunk anim
- // start-frame.
-
- return IR_CONT;
- }
- }
-
- // Increment the walkanim frame number and come back next cycle
-
- ob_mega->walk_pc++;
- return IR_REPEAT;
-}
-
-/**
- * Walk mega to start position of anim
- */
-
-int32 Logic::fnWalkToAnim(int32 *params) {
- // params: 0 pointer to object's logic structure
- // 1 pointer to object's graphic structure
- // 2 pointer to object's mega structure
- // 3 pointer to object's walkdata structure
- // 4 anim resource id
-
- int32 pars[7];
-
- // Walkdata is needed for earlySlowOut if player clicks elsewhere
- // during the walk.
-
- pars[0] = params[0];
- pars[1] = params[1];
- pars[2] = params[2];
- pars[3] = params[3];
-
- ObjectLogic *ob_logic = (ObjectLogic *) _vm->_memory->decodePtr(params[0]);
-
- // If this is the start of the walk, read anim file to get start coords
-
- if (!ob_logic->looping) {
- byte *anim_file = _vm->_resman->openResource(params[4]);
- AnimHeader *anim_head = _vm->fetchAnimHeader( anim_file );
-
- pars[4] = anim_head->feetStartX;
- pars[5] = anim_head->feetStartY;
- pars[6] = anim_head->feetStartDir;
-
- _vm->_resman->closeResource(params[4]);
-
- // If start coords not yet set in anim header, use the standby
- // coords (which should be set beforehand in the script).
-
- if (pars[4] == 0 && pars[5] == 0) {
- byte buf[NAME_LEN];
-
- pars[4] = _standbyX;
- pars[5] = _standbyY;
- pars[6] = _standbyDir;
-
- debug(3, "WARNING: fnWalkToAnim(%s) used standby coords", _vm->fetchObjectName(params[4], buf));
- }
-
- assert(pars[6] >= 0 && pars[6] <= 7);
- }
-
- return fnWalk(pars);
-}
-
-/**
- * Turn mega to the specified direction. Just needs to call fnWalk() with
- * current feet coords, so router can produce anim of turn frames.
- */
-
-int32 Logic::fnTurn(int32 *params) {
- // params: 0 pointer to object's logic structure
- // 1 pointer to object's graphic structure
- // 2 pointer to object's mega structure
- // 3 pointer to object's walkdata structure
- // 4 target direction
-
- int32 pars[7];
-
- pars[0] = params[0];
- pars[1] = params[1];
- pars[2] = params[2];
- pars[3] = params[3];
-
- ObjectLogic *ob_logic = (ObjectLogic *) _vm->_memory->decodePtr(params[0]);
-
- // If this is the start of the turn, get the mega's current feet
- // coords + the required direction
-
- if (!ob_logic->looping) {
- assert(params[4] >= 0 && params[4] <= 7);
-
- ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->decodePtr(params[2]);
-
- pars[4] = ob_mega->feet_x;
- pars[5] = ob_mega->feet_y;
- pars[6] = params[4];
- }
-
- return fnWalk(pars);
-}
-
-/**
- * Stand mega at (x,y,dir)
- * Sets up the graphic object, but also needs to set the new 'current_dir' in
- * the mega object, so the router knows in future
- */
-
-int32 Logic::fnStandAt(int32 *params) {
- // params: 0 pointer to object's graphic structure
- // 1 pointer to object's mega structure
- // 2 target x-coord
- // 3 target y-coord
- // 4 target direction
-
- assert(params[4] >= 0 && params[4] <= 7);
-
- ObjectGraphic *ob_graph = (ObjectGraphic *) _vm->_memory->decodePtr(params[0]);
- ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->decodePtr(params[1]);
-
- // set up the stand frame & set the mega's new direction
-
- ob_mega->feet_x = params[2];
- ob_mega->feet_y = params[3];
- ob_mega->current_dir = params[4];
-
- // mega-set animation file
- ob_graph->anim_resource = ob_mega->megaset_res;
-
- // dir + first stand frame (always frame 96)
- ob_graph->anim_pc = params[4] + 96;
-
- return IR_CONT;
-}
-
-/**
- * Stand mega into the specified direction at current feet coords.
- * Just needs to call fnStandAt() with current feet coords.
- */
-
-int32 Logic::fnStand(int32 *params) {
- // params: 0 pointer to object's graphic structure
- // 1 pointer to object's mega structure
- // 2 target direction
-
- ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->decodePtr(params[1]);
-
- int32 pars[5];
-
- pars[0] = params[0];
- pars[1] = params[1];
- pars[2] = ob_mega->feet_x;
- pars[3] = ob_mega->feet_y;
- pars[4] = params[2];
-
- return fnStandAt(pars);
-}
-
-/**
- * stand mega at end position of anim
- */
-
-int32 Logic::fnStandAfterAnim(int32 *params) {
- // params: 0 pointer to object's graphic structure
- // 1 pointer to object's mega structure
- // 2 anim resource id
-
- byte *anim_file = _vm->_resman->openResource(params[2]);
- AnimHeader *anim_head = _vm->fetchAnimHeader(anim_file);
-
- int32 pars[5];
-
- pars[0] = params[0];
- pars[1] = params[1];
-
- pars[2] = anim_head->feetEndX;
- pars[3] = anim_head->feetEndY;
- pars[4] = anim_head->feetEndDir;
-
- // If start coords not available either use the standby coords (which
- // should be set beforehand in the script)
-
- if (pars[2] == 0 && pars[3] == 0) {
- byte buf[NAME_LEN];
-
- pars[2] = _standbyX;
- pars[3] = _standbyY;
- pars[4] = _standbyDir;
-
- debug(3, "WARNING: fnStandAfterAnim(%s) used standby coords", _vm->fetchObjectName(params[2], buf));
- }
-
- assert(pars[4] >= 0 && pars[4] <= 7);
-
- _vm->_resman->closeResource(params[2]);
- return fnStandAt(pars);
-}
-
-/**
- * Stand mega at start position of anim
- */
-
-int32 Logic::fnStandAtAnim(int32 *params) {
- // params: 0 pointer to object's graphic structure
- // 1 pointer to object's mega structure
- // 2 anim resource id
-
- byte *anim_file = _vm->_resman->openResource(params[2]);
- AnimHeader *anim_head = _vm->fetchAnimHeader(anim_file);
-
- int32 pars[5];
-
- pars[0] = params[0];
- pars[1] = params[1];
-
- pars[2] = anim_head->feetStartX;
- pars[3] = anim_head->feetStartY;
- pars[4] = anim_head->feetStartDir;
-
- // If start coords not available use the standby coords (which should
- // be set beforehand in the script)
-
- if (pars[2] == 0 && pars[3] == 0) {
- byte buf[NAME_LEN];
-
- pars[2] = _standbyX;
- pars[3] = _standbyY;
- pars[4] = _standbyDir;
-
- debug(3, "WARNING: fnStandAtAnim(%s) used standby coords", _vm->fetchObjectName(params[2], buf));
- }
-
- assert(pars[4] >= 0 && pars[4] <= 7);
-
- _vm->_resman->closeResource(params[2]);
- return fnStandAt(pars);
-}
-
-/**
* Work out direction from start to dest.
*/
@@ -468,244 +69,4 @@
return (deltaY > 0) ? 5 : 7;
}
-/**
- * Turn mega to face point (x,y) on the floor
- * Just needs to call fnWalk() with current feet coords & direction computed
- * by whatTarget()
- */
-
-int32 Logic::fnFaceXY(int32 *params) {
- // params: 0 pointer to object's logic structure
- // 1 pointer to object's graphic structure
- // 2 pointer to object's mega structure
- // 3 pointer to object's walkdata structure
- // 4 target x-coord
- // 5 target y-coord
-
- int32 pars[7];
-
- pars[0] = params[0];
- pars[1] = params[1];
- pars[2] = params[2];
- pars[3] = params[3];
-
- ObjectLogic *ob_logic = (ObjectLogic *) _vm->_memory->decodePtr(params[0]);
-
- // If this is the start of the turn, get the mega's current feet
- // coords + the required direction
-
- if (!ob_logic->looping) {
- ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->decodePtr(params[2]);
-
- pars[4] = ob_mega->feet_x;
- pars[5] = ob_mega->feet_y;
- pars[6] = whatTarget(ob_mega->feet_x, ob_mega->feet_y, params[4], params[5]);
- }
-
- return fnWalk(pars);
-}
-
-int32 Logic::fnFaceMega(int32 *params) {
- // params: 0 pointer to object's logic structure
- // 1 pointer to object's graphic structure
- // 2 pointer to object's mega structure
- // 3 pointer to object's walkdata structure
- // 4 id of target mega to face
-
- int32 pars[7];
-
- pars[0] = params[0];
- pars[1] = params[1];
- pars[2] = params[2];
- pars[3] = params[3];
-
- ObjectLogic *ob_logic = (ObjectLogic *) _vm->_memory->decodePtr(params[0]);
-
- // If this is the start of the walk, decide where to walk to.
-
- if (!ob_logic->looping) {
- StandardHeader *head = (StandardHeader *) _vm->_resman->openResource(params[4]);
-
- assert(head->fileType == GAME_OBJECT);
-
- // Call the base script. This is the graphic/mouse service
- // call, and will set _engineMega to the ObjectMega of mega we
- // want to turn to face.
-
- char *raw_script_ad = (char *) head;
- uint32 null_pc = 3;
-
- runScript(raw_script_ad, raw_script_ad, &null_pc);
-
- _vm->_resman->closeResource(params[4]);
-
- ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->decodePtr(params[2]);
-
- pars[3] = params[3];
- pars[4] = ob_mega->feet_x;
- pars[5] = ob_mega->feet_y;
- pars[6] = whatTarget(ob_mega->feet_x, ob_mega->feet_y, _engineMega.feet_x, _engineMega.feet_y);
- }
-
- return fnWalk(pars);
-}
-
-/**
- * Route to the left or right hand side of target id, if possible.
- */
-
-int32 Logic::fnWalkToTalkToMega(int32 *params) {
- // params: 0 pointer to object's logic structure
- // 1 pointer to object's graphic structure
- // 2 pointer to object's mega structure
- // 3 pointer to object's walkdata structure
- // 4 id of target mega to face
- // 5 distance
-
- int32 pars[7];
-
- pars[0] = params[0];
- pars[1] = params[1];
- pars[2] = params[2];
- pars[3] = params[3];
-
- ObjectLogic *ob_logic = (ObjectLogic *) _vm->_memory->decodePtr(params[0]);
-
- // If this is the start of the walk, calculate the route.
-
- if (!ob_logic->looping) {
- StandardHeader *head = (StandardHeader *) _vm->_resman->openResource(params[4]);
-
- assert(head->fileType == GAME_OBJECT);
-
- // Call the base script. This is the graphic/mouse service
- // call, and will set _engineMega to the ObjectMega of mega we
- // want to route to.
-
- char *raw_script_ad = (char *) head;
- uint32 null_pc = 3;
-
- runScript(raw_script_ad, raw_script_ad, &null_pc);
-
- _vm->_resman->closeResource(params[4]);
-
- // Stand exactly beside the mega, ie. at same y-coord
- pars[5] = _engineMega.feet_y;
-
- ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->decodePtr(params[2]);
-
- // Apply scale factor to walk distance. Ay+B gives 256 * scale
- // ie. 256 * 256 * true_scale for even better accuracy, ie.
- // scale = (Ay + B) / 256
-
- int scale = (ob_mega->scale_a * ob_mega->feet_y + ob_mega->scale_b) / 256;
- int mega_separation = (params[5] * scale) / 256;
-
- debug(4, "Target is at (%d, %d), separation %d", _engineMega.feet_x, _engineMega.feet_y, mega_separation);
-
- if (_engineMega.feet_x < ob_mega->feet_x) {
- // Target is left of us, so aim to stand to their
- // right. Face down_left
-
- pars[4] = _engineMega.feet_x + mega_separation;
- pars[6] = 5;
- } else {
- // Ok, must be right of us so aim to stand to their
- // left. Face down_right.
-
- pars[4] = _engineMega.feet_x - mega_separation;
- pars[6] = 3;
- }
- }
-
- return fnWalk(pars);
-}
-
-int32 Logic::fnSetWalkGrid(int32 *params) {
- // params: none
-
- error("fnSetWalkGrid() is no longer a valid opcode");
- return IR_CONT;
-}
-
-/**
- * Add this walkgrid resource to the list of those used for routing in this
- * location. Note that this is ignored if the resource is already in the list.
- */
-
-int32 Logic::fnAddWalkGrid(int32 *params) {
- // params: 0 id of walkgrid resource
-
- // All objects that add walkgrids must be restarted whenever we
- // re-enter a location.
-
- // DON'T EVER KILL GEORGE!
- if (_scriptVars[ID] != 8) {
- // Need to call this in case it wasn't called in script!
- fnAddToKillList(NULL);
- }
-
- _router->addWalkGrid(params[0]);
- fnPreLoad(params);
- return IR_CONT;
-}
-
-/**
- * Remove this walkgrid resource from the list of those used for routing in
- * this location. Note that this is ignored if the resource isn't actually
- * in the list.
- */
-
-int32 Logic::fnRemoveWalkGrid(int32 *params) {
- // params: 0 id of walkgrid resource
-
- _router->removeWalkGrid(params[0]);
- return IR_CONT;
-}
-
-int32 Logic::fnRegisterWalkGrid(int32 *params) {
- // params: none
-
- error("fnRegisterWalkGrid() is no longer a valid opcode");
- return IR_CONT;
-}
-
-int32 Logic::fnSetScaling(int32 *params) {
- // params: 0 pointer to object's mega structure
- // 1 scale constant A
- // 2 scale constant B
-
- // 256 * s = A * y + B
-
- // Where s is system scale, which itself is (256 * actual_scale) ie.
- // s == 128 is half size
-
- ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->decodePtr(params[0]);
-
- ob_mega->scale_a = params[1];
- ob_mega->scale_b = params[2];
-
- return IR_CONT;
-}
-
-/**
- * Set the standby walk coords to be used by fnWalkToAnim() and
- * fnStandAfterAnim() when the anim header's start/end coords are zero.
- * Useful during development; can stay in final game anyway.
- */
-
-int32 Logic::fnSetStandbyCoords(int32 *params) {
- // params: 0 x-coord
- // 1 y-coord
- // 2 direction (0..7)
-
- assert(params[2] >= 0 && params[2] <= 7);
-
- _standbyX = (int16) params[0];
- _standbyY = (int16) params[1];
- _standbyDir = (uint8) params[2];
-
- return IR_CONT;
-}
-
} // End of namespace Sword2
--- startup.h DELETED ---
- Previous message: [Scummvm-cvs-logs] CVS: scummvm/scumm/imuse_digi dimuse_sndmgr.cpp,1.63,1.64
- Next message: [Scummvm-cvs-logs] CVS: scummvm/sword2/driver animation.cpp,1.51,1.52 animation.h,1.32,1.33 d_sound.cpp,1.137,1.138 d_sound.h,1.61,NONE
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the Scummvm-git-logs
mailing list