diff options
| -rw-r--r-- | queen/cutaway.cpp | 44 | ||||
| -rw-r--r-- | queen/cutaway.h | 3 | ||||
| -rw-r--r-- | queen/defs.h | 18 | ||||
| -rw-r--r-- | queen/display.cpp | 2 | ||||
| -rw-r--r-- | queen/graphics.cpp | 19 | ||||
| -rw-r--r-- | queen/graphics.h | 9 | ||||
| -rw-r--r-- | queen/input.cpp | 116 | ||||
| -rw-r--r-- | queen/input.h | 116 | ||||
| -rw-r--r-- | queen/logic.cpp | 36 | ||||
| -rw-r--r-- | queen/logic.h | 6 | ||||
| -rw-r--r-- | queen/module.mk | 1 | ||||
| -rw-r--r-- | queen/queen.cpp | 105 | ||||
| -rw-r--r-- | queen/queen.h | 9 | ||||
| -rw-r--r-- | queen/sound.cpp | 19 | ||||
| -rw-r--r-- | queen/sound.h | 12 | ||||
| -rw-r--r-- | queen/talk.cpp | 28 | ||||
| -rw-r--r-- | queen/talk.h | 5 | ||||
| -rw-r--r-- | queen/walk.cpp | 4 | ||||
| -rw-r--r-- | queen/xref.txt | 6 | 
19 files changed, 371 insertions, 187 deletions
| diff --git a/queen/cutaway.cpp b/queen/cutaway.cpp index afb4861a05..4ae3ab50a9 100644 --- a/queen/cutaway.cpp +++ b/queen/cutaway.cpp @@ -23,6 +23,7 @@  #include "cutaway.h"  #include "display.h"  #include "graphics.h" +#include "input.h"  #include "sound.h"  #include "talk.h"  #include "walk.h" @@ -64,10 +65,11 @@ void Cutaway::run(  		const char *filename,   		char *nextFilename,  		Graphics *graphics, +		Input *input,  		Logic *logic,  		Resource *resource,  		Sound *sound) { -	Cutaway *cutaway = new Cutaway(filename, graphics, logic, resource, sound); +	Cutaway *cutaway = new Cutaway(filename, graphics, input, logic, resource, sound);  	cutaway->run(nextFilename);  	delete cutaway;  } @@ -75,10 +77,11 @@ void Cutaway::run(  Cutaway::Cutaway(  		const char *filename,   		Graphics *graphics, +		Input *input,  		Logic *logic,  		Resource *resource,  		Sound *sound)  -: _graphics(graphics), _logic(logic), _resource(resource), _sound(sound), _walk(logic->walk()), +: _graphics(graphics), _input(input), _logic(logic), _resource(resource), _sound(sound), _walk(logic->walk()),  	_quit(false), _personDataCount(0), _personFaceCount(0), _lastSong(0), _songBeforeComic(0) {  	memset(&_bankNames, 0, sizeof(_bankNames));  	load(filename);  @@ -304,7 +307,7 @@ void Cutaway::actionSpecialMove(int index) {  				for (i = 5; i <= 100; i +=5) {  					bob->scale = i;  					bob->y -= 4; -					_graphics->update(); +					_logic->update();  				}  			}  			break; @@ -324,9 +327,8 @@ void Cutaway::actionSpecialMove(int index) {  				BobSlot *bob_thugB2 = _graphics->bob(26);  				_graphics->cameraBob(-1); -				// XXX fastmode = 1; - -				_graphics->update(true); +				_input->fastMode(true); +				_logic->update();  				int i = 4, k = 160; @@ -372,14 +374,14 @@ void Cutaway::actionSpecialMove(int index) {  					bob_thugB1->x -= i * 4;  					bob_thugB2->x -= i * 4; -					_graphics->update(true); +					_logic->update();  					if (_quit)  						return;  				} -				// XXX fastmode = 0; +				_input->fastMode(false);  			}  			break; @@ -400,9 +402,9 @@ void Cutaway::actionSpecialMove(int index) {  				BobSlot *bob_hands = _graphics->bob(24);  				_graphics->cameraBob(-1); -				// XXX fastmode = 1; +				_input->fastMode(true); -				_graphics->update(true); +				_logic->update();  				bob_box  ->x += 280 * 2;  				bob_beam ->x += 30; @@ -427,14 +429,14 @@ void Cutaway::actionSpecialMove(int index) {  					bob_clock->x -= i * 2;  					bob_hands->x -= i * 2; -					_graphics->update(true); +					_logic->update();  					if (_quit)  						return;  				} -				// XXX fastmode = 0; +				_input->fastMode(false);  			}  			break; @@ -447,7 +449,7 @@ void Cutaway::actionSpecialMove(int index) {  				BobSlot *bob22 = _graphics->bob(22);  				_graphics->cameraBob(-1); -				// XXX fastmode = 1; +				_input->fastMode(true);  				int horizontalScroll = display->horizontalScroll(); @@ -466,14 +468,14 @@ void Cutaway::actionSpecialMove(int index) {  					bob22->x += i; -					_graphics->update(true); +					_logic->update();  					if (_quit)  						return;  				} -				// XXX fastmode = 0; +				_input->fastMode(false);  			}  			break; @@ -928,7 +930,7 @@ byte *Cutaway::handleAnimation(byte *ptr, CutawayObject &object) {  				int j;  				for (j = 0; j < objAnim[i].speed; j++) -					_graphics->update(); +					_logic->update();  			}  			if (_quit) @@ -951,7 +953,7 @@ byte *Cutaway::handleAnimation(byte *ptr, CutawayObject &object) {  	while (moving) {  		moving = false; -		_graphics->update(); +		_logic->update();  		for (i = 0; i < frameCount; i++) {  			BobSlot *bob = _graphics->bob(objAnim[i].object); @@ -1043,7 +1045,7 @@ void Cutaway::handlePersonRecord(  			char voiceFilePrefix[MAX_STRING_SIZE];  			findCdCut(_basename, index, voiceFilePrefix);  			Talk::speak(sentence, (object.objectNumber == OBJECT_JOE) ? NULL : &p, voiceFilePrefix, -				_graphics, _logic, _resource, _sound); +				_graphics, _input, _logic, _resource, _sound);  		}  	} @@ -1401,7 +1403,7 @@ void Cutaway::talk(char *nextFilename) {  	if (0 == scumm_stricmp(right(_talkFile, 4), ".dog")) {  		nextFilename[0] = '\0'; -		Talk::talk(_talkFile, 0 /* XXX */, nextFilename, _graphics, _logic, _resource, _sound); +		Talk::talk(_talkFile, 0 /* XXX */, nextFilename, _graphics, _input, _logic, _resource, _sound);  	}  } @@ -1487,7 +1489,7 @@ void Cutaway::handleText(  	int i;  	for (i = 0; i < spaces; i++) { -		_graphics->update(); +		_logic->update();  		if (OBJECT_TYPE_TEXT_SPEAK == type || OBJECT_TYPE_TEXT_DISPLAY_AND_SPEAK == type) {  			// XXX: see if speaking is finished @@ -1504,7 +1506,7 @@ void Cutaway::handleText(  	}  	_graphics->textClear(0,198); -	_graphics->update(); +	_logic->update();  }  int Cutaway::countSpaces(ObjectType type, const char *segment) { diff --git a/queen/cutaway.h b/queen/cutaway.h index 00dbe594e1..abe32923ed 100644 --- a/queen/cutaway.h +++ b/queen/cutaway.h @@ -41,6 +41,7 @@ class Cutaway {  				const char *filename,  				char *nextFilename,  				Graphics *graphics, +				Input *input,  				Logic *logic,  				Resource *resource,  				Sound *sound); @@ -136,6 +137,7 @@ class Cutaway {  		};  		Graphics    *_graphics; +		Input       *_input;  		Logic       *_logic;  		Resource    *_resource;  		Sound       *_sound; @@ -214,6 +216,7 @@ class Cutaway {  		Cutaway(  				const char *filename,   				Graphics *graphics, +				Input *input,  				Logic *logic,  				Resource *resource,  				Sound *sound); diff --git a/queen/defs.h b/queen/defs.h index 13339946f2..a8864b2d9e 100644 --- a/queen/defs.h +++ b/queen/defs.h @@ -108,21 +108,31 @@ enum Language {  enum Verb { +	VERB_NONE = 0, + +	VERB_PANEL_COMMAND_FIRST = 1,  	VERB_OPEN        = 1,  	VERB_CLOSE       = 2,  	VERB_MOVE        = 3, +	// no verb 4  	VERB_GIVE        = 5,  	VERB_USE         = 6,  	VERB_PICK_UP     = 7,  	VERB_LOOK_AT     = 9,  	VERB_TALK_TO     = 8, +	VERB_PANEL_COMMAND_LAST = 8, +  	VERB_WALK_TO     = 10,  	VERB_SCROLL_UP   = 11,  	VERB_SCROLL_DOWN = 12, -	VERB_INV_ITEM1   = 13, -	VERB_INV_ITEM2   = 14, -	VERB_INV_ITEM3   = 15, -	VERB_INV_ITEM4   = 16, + +	VERB_DIGIT_FIRST = 13, +	VERB_KEY_1   = 13, +	VERB_KEY_2   = 14, +	VERB_KEY_3   = 15, +	VERB_KEY_4   = 16, +	VERB_DIGIT_LAST = 16, +	  	VERB_USE_JOURNAL = 20,  	VERB_SKIP_TEXT   = 101  }; diff --git a/queen/display.cpp b/queen/display.cpp index 6643f3bd4a..0b29b1c2cc 100644 --- a/queen/display.cpp +++ b/queen/display.cpp @@ -592,7 +592,7 @@ void Display::palCustomFlash() {  	// set flash palette  	palSet(tempPal, 0, 255, true);  	// restore original palette -	palSet(_pals.screen, 0, 255, true); +	// palSet(_pals.screen, 0, 255, true);  } diff --git a/queen/graphics.cpp b/queen/graphics.cpp index 359795f92f..24b05a9fb6 100644 --- a/queen/graphics.cpp +++ b/queen/graphics.cpp @@ -27,8 +27,8 @@  namespace Queen { -Graphics::Graphics(Display *display, Resource *resource) -	: _cameraBob(0), _display(display), _resource(resource) { +Graphics::Graphics(Display *display, Input *input, Resource *resource) +	: _cameraBob(0), _display(display), _input(input), _resource(resource) {  	memset(_frames, 0, sizeof(_frames));  	memset(_banks, 0, sizeof(_banks)); @@ -727,7 +727,6 @@ void Graphics::loadBackdrop(const char* name, uint16 room) {  	if (room >= 90) {  		_cameraBob = 0;  	} -	_lastRoom = room; // TEMP  } @@ -806,26 +805,16 @@ void Graphics::cameraBob(int bobNum) {  } -void Graphics::update(bool fastmode) { +void Graphics::update(uint16 room) {  	// FIXME: temporary code, move to Logic::update()  	bobSortAll();  	if (_cameraBob >= 0) {  		_display->horizontalScrollUpdate(_bobs[_cameraBob].x);  	} -	// FIXME: currently, we use the _lastRoom variable only -	// to know in which current room we are. This is necessary -	// for the parallax stuff as it relies on the room number. -	// When we switch to the Logic::update() method, we will be -	// able to get rid of this variable... -	bobCustomParallax(_lastRoom); +	bobCustomParallax(room);  	_display->prepareUpdate();  	bobDrawAll();  	textDrawAll(); -	if (!fastmode) { -		g_queen->delay(100); -	} -	_display->palCustomScroll(_lastRoom); -	_display->update(_bobs[0].active, _bobs[0].x, _bobs[0].y);  }  void Graphics::bobSetText( diff --git a/queen/graphics.h b/queen/graphics.h index 78bc765591..dda8229734 100644 --- a/queen/graphics.h +++ b/queen/graphics.h @@ -23,6 +23,7 @@  #define QUEENGRAPHICS_H  #include "queen/queen.h" +#include "queen/input.h"  #include "queen/defs.h"  #include "queen/structs.h" @@ -105,11 +106,12 @@ struct TextSlot {  class Display; +class Input;  class Graphics {  public: -	Graphics(Display *display, Resource *resource); +	Graphics(Display *display, Input *input, Resource *resource);  	~Graphics();  	void bankLoad(const char *bankname, uint32 bankslot); // loadbank() @@ -161,7 +163,7 @@ public:  	void cameraBob(int bobNum);  	int cameraBob() { return _cameraBob; } -	void update(bool fastmode = false); +	void update(uint16 room);  private: @@ -199,9 +201,8 @@ private:  	int _cameraBob; // cambob -	uint16 _lastRoom; // TEMP -  	Display *_display; +	Input *_input;  	Resource *_resource;  }; diff --git a/queen/input.cpp b/queen/input.cpp new file mode 100644 index 0000000000..79b3e22aa8 --- /dev/null +++ b/queen/input.cpp @@ -0,0 +1,116 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2003 The ScummVM project + * + * 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. + * + * $Header$ + * + */ + +#include "stdafx.h" +#include "queen/input.h" +#include "common/system.h" +#include "common/util.h" + +namespace Queen { + + +Input::Input(OSystem *system) :  +	_system(system), _fastMode(false), _keyVerb(VERB_NONE),  +	_cutawayRunning(false), _cutQuit(false), _talkQuit(false) { +} + +void Input::delay() { +	delay(_fastMode ? DELAY_SHORT : DELAY_NORMAL); +} + +void Input::delay(uint amount) {  + +	OSystem::Event event; + +	uint32 start = _system->get_msecs(); +	uint32 cur = start; +	_key_pressed = 0;	//reset + +	do { +		while (_system->poll_event(&event)) { +			switch (event.event_code) { +				case OSystem::EVENT_KEYDOWN: +					if (event.kbd.flags == OSystem::KBD_CTRL) { +						if (event.kbd.keycode == 'f') { +							_fastMode ^= 1; +							break; +						} +						if (event.kbd.keycode == 'g') { +							_fastMode ^= 2; +							break; +						} +					} + +					debug(1, "event.kbd.keycode = %i (%c)",  +							event.kbd.keycode, +							isprint(event.kbd.keycode) ? event.kbd.keycode : '.'); + +					// Make sure backspace works right (this fixes a small issue on OS X) +					if (event.kbd.keycode == 8) +						_key_pressed = 8; +					else +						_key_pressed = (byte)event.kbd.ascii; +					break; + +				case OSystem::EVENT_MOUSEMOVE: +					_sdl_mouse_x = event.mouse.x; +					_sdl_mouse_y = event.mouse.y; +					 +					break; + +				case OSystem::EVENT_LBUTTONDOWN: +#ifdef _WIN32_WCE +					_sdl_mouse_x = event.mouse.x; +					_sdl_mouse_y = event.mouse.y; +#endif +					break; + +				case OSystem::EVENT_RBUTTONDOWN: +					break; + +				case OSystem::EVENT_QUIT: +					_system->quit(); +					break; + +				default: +					break; +			} +		} + +		if (amount == 0) +			break; + +		{ +			uint this_delay = 20; // 1? +			if (this_delay > amount) +				this_delay = amount; +			_system->delay_msecs(this_delay); +		} +		cur = _system->get_msecs(); +	} while (cur < start + amount); +} + +void Input::checkKeys() { +} + +   +} // End of namespace Queen + diff --git a/queen/input.h b/queen/input.h new file mode 100644 index 0000000000..a218aef28e --- /dev/null +++ b/queen/input.h @@ -0,0 +1,116 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2003 The ScummVM project + * + * 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. + * + * $Header$ + * + */ + +#ifndef INPUT_H +#define INPUT_H + +#include "queen/defs.h" + +class OSystem; + +namespace Queen { + +class Input { + +	public: + +		//! Adjust here to change delays! +		enum { +			DELAY_SHORT = 10, +			DELAY_NORMAL = 100 +		}; + +		Input(OSystem *system); + +		//! calls the other delay() with a value adjusted depending on _fastMode +		void delay(); + +		//! moved QueenEngine::delay() here +		void delay(uint amount); + +		//! convert input to verb +		void checkKeys(); + +		//! use instead of KEYVERB=0 +		void clearKeyVerb()  { _keyVerb = VERB_NONE; } + +		//! _keyVerb is open/close/move/give/look at/pick up/talk to +		bool verbIsPanelCommand() { +			return  +				_keyVerb >= VERB_PANEL_COMMAND_FIRST && +				_keyVerb <= VERB_PANEL_COMMAND_LAST; +		} + +		//! return _keyVerb if isPanelCommand() is true, otherwise VERB_NONE +		Verb verbPanelCommand(); + +		//! If _keyVerb is VERB_USE_JOURNAL +		bool verbUseJournal() { return _keyVerb == VERB_USE_JOURNAL; } + +		//! If _keyVerb is VERB_KEY_1 to VERB_KEY_4 +		bool verbIsDigit() { +			return  +				_keyVerb >= VERB_DIGIT_FIRST && +				_keyVerb <= VERB_DIGIT_LAST; +		} + +		//! Returns 1-4 if keyDigit() is true, otherwise -1 +		int verbDigit(); + +		bool cutQuit()        { return _cutQuit; } +		void cutQuitReset()   { _cutQuit = false; } + +		bool talkQuit()       { return _talkQuit; } +		void talkQuitReset()  { _talkQuit = false; } + +		void fastMode(bool fm)	{ _fastMode = fm; } + +	private: +		 +		//! Used to get keyboard and mouse events +		OSystem *_system; + +		//! Some cutaways require update() run faster +		bool _fastMode; + +		//! The current verb received from keyboard +		Verb _keyVerb;          // KEYVERB + +		//! set if a cutaway is running +		bool _cutawayRunning;   // CUTON + +		//! moved Cutaway::_quit here +		bool _cutQuit;          // CUTQUIT + +		//! moved Talk::_quit here  +		bool _talkQuit;         // TALKQUIT + +		//! Set by delay(); +		int _key_pressed; + +		//! Set by delay(); +		int _sdl_mouse_x, _sdl_mouse_y; + +}; + +} // End of namespace Queen + +#endif diff --git a/queen/logic.cpp b/queen/logic.cpp index 5edcb329d3..29f4d5ed54 100644 --- a/queen/logic.cpp +++ b/queen/logic.cpp @@ -25,13 +25,15 @@  #include "queen/defs.h"  #include "queen/display.h"  #include "queen/graphics.h" +#include "queen/input.h"  #include "queen/walk.h"  namespace Queen { -Logic::Logic(Resource *resource, Graphics *graphics, Display *theDisplay, Sound *sound) -	: _resource(resource), _graphics(graphics), _display(theDisplay), _sound(sound), _talkSpeed(DEFAULT_TALK_SPEED) { +Logic::Logic(Resource *resource, Graphics *graphics, Display *theDisplay, Input *input, Sound *sound) +	: _resource(resource), _graphics(graphics), _display(theDisplay),  +	_input(input), _sound(sound), _talkSpeed(DEFAULT_TALK_SPEED) {  	_jas = _resource->loadFile("QUEEN.JAS", 20);  	_joe.x = _joe.y = 0;  	_joe.scale = 100; @@ -1124,7 +1126,7 @@ void Logic::roomDisplay(const char* room, RoomDisplayMode mode, uint16 scale, in  	// FIXME: commented for now, to avoid color glitches when  	// switching rooms during cutaway  //	if (mode != RDM_NOFADE_JOE) { -		_graphics->update(); +		update();  		if (_currentRoom >= 114) {  			_display->palFadeIn(0, 255, _currentRoom);  		} @@ -1609,26 +1611,26 @@ uint16 Logic::joeFace() {  		if (_joe.facing == DIR_FRONT) {  			if (_joe.prevFacing == DIR_BACK) {  				pbs->frameNum = 33 + FRAMES_JOE_XTRA; -				_graphics->update(); +				update();  			}  			frame = 34;  		}  		else if (_joe.facing == DIR_BACK) {  			if (_joe.prevFacing == DIR_FRONT) {  				pbs->frameNum = 33 + FRAMES_JOE_XTRA; -				_graphics->update(); +				update();  			}  			frame = 35;  		}  		else if ((_joe.facing == DIR_LEFT && _joe.prevFacing == DIR_RIGHT)   			|| 	(_joe.facing == DIR_RIGHT && _joe.prevFacing == DIR_LEFT)) {  			pbs->frameNum = 34 + FRAMES_JOE_XTRA; -			_graphics->update(); +			update();  		}  		pbs->frameNum = frame + FRAMES_JOE_XTRA;  		pbs->scale = _joe.scale;  		pbs->xflip = (_joe.facing == DIR_LEFT); -		_graphics->update(); +		update();  		_joe.prevFacing = _joe.facing;  		switch (frame) {  		case 33: frame = 1; break; @@ -1755,12 +1757,12 @@ void Logic::joeGrabDirection(StateGrab grab, uint16 speed) {  		_graphics->bankUnpack(5, 29 + FRAMES_JOE_XTRA, 7);  		bobJoe->xflip = (_joe.facing == DIR_LEFT);  		bobJoe->scale = _joe.scale; -		_graphics->update(); +		update();  		// grab up          _graphics->bankUnpack(7, 29 + FRAMES_JOE_XTRA, 7);  		bobJoe->xflip = (_joe.facing == DIR_LEFT);  		bobJoe->scale = _joe.scale; -        _graphics->update(); +        update();  		// turn back  		if (speed == 0) {  			frame = 7; @@ -1775,12 +1777,12 @@ void Logic::joeGrabDirection(StateGrab grab, uint16 speed) {  		_graphics->bankUnpack(frame, 29 + FRAMES_JOE_XTRA, 7);  		bobJoe->xflip = (_joe.facing == DIR_LEFT);  		bobJoe->scale = _joe.scale; -		_graphics->update(); +		update();  		// extra delay for grab down  		if (grab == STATE_GRAB_DOWN) { -			_graphics->update(); -			_graphics->update(); +			update(); +			update();  		}  		if (speed > 0) { @@ -1838,9 +1840,17 @@ void Logic::joeUseUnderwear() {  void Logic::playCutaway(const char* cutFile) {  	char next[20]; -	Cutaway::run(cutFile, next, _graphics, this, _resource, _sound); +	Cutaway::run(cutFile, next, _graphics, _input, this, _resource, _sound);  } +void Logic::update() { +	_graphics->update(_currentRoom); +	_input->delay(); +	_display->palCustomScroll(_currentRoom); +	BobSlot *joe = _graphics->bob(0); +	_display->update(joe->active, joe->x, joe->y); +	_input->checkKeys(); +}  } // End of namespace Queen diff --git a/queen/logic.h b/queen/logic.h index c1db94ebea..c731bc4a53 100644 --- a/queen/logic.h +++ b/queen/logic.h @@ -54,13 +54,14 @@ struct Command {  class Graphics;  class Resource;  class Display; +class Input;  class Sound;  class Walk;  class Logic {  public: -	Logic(Resource *resource, Graphics *graphics, Display *display, Sound *sound); +	Logic(Resource *resource, Graphics *graphics, Display *display, Input *input, Sound *sound);  	~Logic();  	uint16 currentRoom(); @@ -182,6 +183,8 @@ public:  	Display *display() { return _display; } +	void update(); +  protected:  	bool _textToggle;  	bool _speechToggle; @@ -277,6 +280,7 @@ protected:  	Resource *_resource;  	Graphics *_graphics;  	Display *_display; +	Input *_input;  	Sound *_sound;  	Walk *_walk; diff --git a/queen/module.mk b/queen/module.mk index 97cf76f38e..0836a5fe05 100644 --- a/queen/module.mk +++ b/queen/module.mk @@ -4,6 +4,7 @@ MODULE_OBJS = \  	queen/cutaway.o \  	queen/display.o \  	queen/graphics.o \ +	queen/input.o \  	queen/logic.o \  	queen/queen.o \  	queen/resource.o \ diff --git a/queen/queen.cpp b/queen/queen.cpp index df0e319937..60f3668439 100644 --- a/queen/queen.cpp +++ b/queen/queen.cpp @@ -28,6 +28,7 @@  #include "queen/cutaway.h"  #include "queen/display.h"  #include "queen/graphics.h" +#include "queen/input.h"  #include "queen/queen.h"  #include "queen/sound.h"  #include "queen/talk.h" @@ -85,13 +86,9 @@ REGISTER_PLUGIN("Flight of the Amazon Queen", Engine_QUEEN_gameList, Engine_QUEE  namespace Queen { -QueenEngine *g_queen; -  QueenEngine::QueenEngine(GameDetector *detector, OSystem *syst)  	: Engine(detector, syst) { -	g_queen = this; -	  	_game = detector->_game.id;  	if (!_mixer->bindToSystem(syst)) @@ -111,8 +108,10 @@ QueenEngine::QueenEngine(GameDetector *detector, OSystem *syst)  QueenEngine::~QueenEngine() {  	delete _resource;  	delete _display; +	delete _logic;  	delete _graphics;  	delete _logic; +	delete _input;  }  void QueenEngine::errorString(const char *buf1, char *buf2) { @@ -132,35 +131,33 @@ void QueenEngine::roomChanged() {  		// XXX fadeout(0,223);  	}  	else if (_logic->currentRoom() == 95 && _logic->gameState(VAR_INTRO_PLAYED) == 0) { -		char nextFilename[20]; -  		_logic->roomDisplay(_logic->roomName(_logic->currentRoom()), RDM_FADE_NOJOE, 100, 2, true);  		if (_resource->isDemo()) {  			if (_resource->exists("pclogo.cut")) -				Cutaway::run("pclogo.cut", nextFilename, _graphics, _logic, _resource, _sound); +				_logic->playCutaway("pclogo.cut");  			else -				Cutaway::run("clogo.cut",  nextFilename, _graphics, _logic, _resource, _sound); +				_logic->playCutaway("clogo.cut");  		}  		else { -			Cutaway::run("copy.cut",  nextFilename, _graphics, _logic, _resource, _sound); -			Cutaway::run("clogo.cut", nextFilename, _graphics, _logic, _resource, _sound); +			_logic->playCutaway("copy.cut"); +			_logic->playCutaway("clogo.cut");  			// TODO enable talking for talkie version -			Cutaway::run("cdint.cut", nextFilename, _graphics, _logic, _resource, _sound); +			_logic->playCutaway("cdint.cut");  			// restore palette colors ranging from 144 to 256  			_graphics->loadPanel(); -			Cutaway::run("cred.cut",  nextFilename, _graphics, _logic, _resource, _sound); +			_logic->playCutaway("cred.cut");  		}  		_logic->currentRoom(73);  		_logic->entryObj(584);  		_logic->roomDisplay(_logic->roomName(_logic->currentRoom()), RDM_FADE_JOE, 100, 2, true); -		Cutaway::run("c70d.cut", nextFilename, _graphics, _logic, _resource, _sound); +		_logic->playCutaway("c70d.cut");  		_logic->gameState(VAR_INTRO_PLAYED, 1); @@ -188,7 +185,7 @@ void QueenEngine::go() {  		// queen.c lines 4080-4104  		if (_logic->newRoom() > 0) {  			_graphics->textClear(151, 151); -			_graphics->update(); +			_logic->update();  			_logic->oldRoom(_logic->currentRoom());  			_logic->currentRoom(_logic->newRoom());  			roomChanged(); @@ -211,18 +208,15 @@ void QueenEngine::go() {  		break; // XXX don't loop yet  	} - -	while (1) { //main loop -		delay(1000); -	}  }  void QueenEngine::initialise(void) {  	_resource = new Resource(_gameDataPath, _detector->_game.detectname);  	_display = new Display(_system); -	_graphics = new Graphics(_display, _resource); -	_sound = Sound::giveSound(_mixer, _resource, _resource->compression()); -	_logic = new Logic(_resource, _graphics, _display, _sound); +	_input = new Input(_system); +	_graphics = new Graphics(_display, _input, _resource); +	_sound = Sound::giveSound(_mixer, _input, _resource, _resource->compression()); +	_logic = new Logic(_resource, _graphics, _display, _input, _sound);  	_timer->installTimerProc(&timerHandler, 1000000 / 50, this); //call 50 times per second  } @@ -238,73 +232,4 @@ void QueenEngine::gotTimerTick() {  	_display->handleTimer();  } - -void QueenEngine::delay(uint amount) {  - -	OSystem::Event event; - -	uint32 start = _system->get_msecs(); -	uint32 cur = start; -	_key_pressed = 0;	//reset - -	do { -		while (_system->poll_event(&event)) { -			switch (event.event_code) { -				case OSystem::EVENT_KEYDOWN: -					if (event.kbd.flags == OSystem::KBD_CTRL) { -						if (event.kbd.keycode == 'f') { -							_fastMode ^= 1; -							break; -						} -						if (event.kbd.keycode == 'g') { -							_fastMode ^= 2; -							break; -						} -					} - -					// Make sure backspace works right (this fixes a small issue on OS X) -					if (event.kbd.keycode == 8) -						_key_pressed = 8; -					else -						_key_pressed = (byte)event.kbd.ascii; -					break; - -				case OSystem::EVENT_MOUSEMOVE: -					_sdl_mouse_x = event.mouse.x; -					_sdl_mouse_y = event.mouse.y; -					 -					break; - -				case OSystem::EVENT_LBUTTONDOWN: -#ifdef _WIN32_WCE -					_sdl_mouse_x = event.mouse.x; -					_sdl_mouse_y = event.mouse.y; -#endif -					break; - -				case OSystem::EVENT_RBUTTONDOWN: -					break; - -				case OSystem::EVENT_QUIT: -					_system->quit(); -					break; - -				default: -					break; -			} -		} - -		if (amount == 0) -			break; - -		{ -			uint this_delay = 20; // 1? -			if (this_delay > amount) -				this_delay = amount; -			_system->delay_msecs(this_delay); -		} -		cur = _system->get_msecs(); -	} while (cur < start + amount); -} -  } // End of namespace Queen diff --git a/queen/queen.h b/queen/queen.h index 70d6f92eca..d5dae15af3 100644 --- a/queen/queen.h +++ b/queen/queen.h @@ -33,6 +33,7 @@  namespace Queen {  class Graphics; +class Input;  class Logic;  class Display;  class Sound; @@ -41,18 +42,17 @@ class QueenEngine : public Engine {  	void errorString(const char *buf_input, char *buf_output);  protected:  	byte _game; -	byte _key_pressed;  	bool _quickLaunch; // set when starting with -x  	uint16 _debugMode;  	int _numScreenUpdates;  	int _number_of_savegames; -	int _sdl_mouse_x, _sdl_mouse_y;  	FILE *_dump_file;  	Graphics *_graphics; +	Input *_input;  	Resource *_resource;  	Logic *_logic;  	Display *_display; @@ -64,8 +64,6 @@ public:  	QueenEngine(GameDetector *detector, OSystem *syst);  	virtual ~QueenEngine(); -	void delay(uint amount); -  protected:  	byte _fastMode; @@ -80,9 +78,6 @@ protected:  	void gotTimerTick();  }; -// XXX: Temporary hack to allow Graphics to call delay() -extern QueenEngine *g_queen; -  } // End of namespace Queen  #endif diff --git a/queen/sound.cpp b/queen/sound.cpp index 3a9df8d8aa..15a831b89e 100644 --- a/queen/sound.cpp +++ b/queen/sound.cpp @@ -22,37 +22,38 @@  #include "stdafx.h"  #include "common/file.h"  #include "common/util.h" +#include "queen/input.h"  #include "queen/resource.h"  #include "queen/sound.h" -#include "queen/queen.h"	//g_queen (temporary)  #define	SB_HEADER_SIZE	110  namespace Queen { -Sound::Sound(SoundMixer *mixer, Resource  *resource) : _mixer(mixer), _resource(resource), _sfxHandle(0) { +Sound::Sound(SoundMixer *mixer, Input *input, Resource  *resource) :  +  _mixer(mixer), _input(input), _resource(resource), _sfxHandle(0) {  }  Sound::~Sound() {  } -Sound *Sound::giveSound(SoundMixer *mixer, Resource *resource, uint8 compression) { +Sound *Sound::giveSound(SoundMixer *mixer, Input *input, Resource *resource, uint8 compression) {  	switch(compression) {  		case COMPRESSION_NONE: -				return new SBSound(mixer, resource); +				return new SBSound(mixer, input, resource);  				break;  		case COMPRESSION_MP3:  				#ifndef USE_MAD  					warning("Using MP3 compressed datafile, but MP3 support not compiled in"); -					return new SilentSound(mixer, resource); +					return new SilentSound(mixer, input, resource);  				#else -					return new MP3Sound(mixer, resource); +					return new MP3Sound(mixer, input, resource);  				#endif  				break;  		default:  				warning("Unknown compression type"); -				return new SilentSound(mixer, resource); +				return new SilentSound(mixer, input, resource);  	}  } @@ -76,7 +77,7 @@ void SBSound::sfxPlay(const char *base) {  	strcat(name, ".SB");  	while(isPlaying()) -		g_queen->delay(10); +	  _input->delay(10);  	if (_resource->exists(name))   		playSound(_resource->loadFile(name, SB_HEADER_SIZE), _resource->fileSize(name) - SB_HEADER_SIZE); @@ -94,7 +95,7 @@ void MP3Sound::sfxPlay(const char *base) {  	strcat(name, ".SB");  	while(isPlaying()) -		g_queen->delay(10); +		_input->delay(10);  	if (_resource->exists(name))   		_mixer->playMP3(&_sfxHandle, _resource->giveMP3(name), _resource->fileSize(name)); diff --git a/queen/sound.h b/queen/sound.h index c64443cf99..f6a4cb164e 100644 --- a/queen/sound.h +++ b/queen/sound.h @@ -28,18 +28,20 @@  namespace Queen { +class Input;  class Resource;  class Sound {  public: -	Sound(SoundMixer *mixer, Resource *resource); +	Sound(SoundMixer *mixer, Input *input, Resource *resource);  	virtual ~Sound();   	virtual void sfxPlay(const char *base) = 0; -	static Sound *giveSound(SoundMixer *mixer, Resource *resource, uint8 compression); +	static Sound *giveSound(SoundMixer *mixer, Input *input, Resource *resource, uint8 compression);  	bool isPlaying();  protected:  	SoundMixer *_mixer; +  Input *_input;  	Resource *_resource;  	PlayingSoundHandle _sfxHandle; @@ -47,13 +49,13 @@ protected:  class SilentSound : public Sound {  public: -	SilentSound(SoundMixer *mixer, Resource *resource) : Sound(mixer, resource) {}; +	SilentSound(SoundMixer *mixer, Input *input, Resource *resource) : Sound(mixer, input, resource) {};  	void sfxPlay(const char *base) { }  };  class SBSound : public Sound {  public: -	SBSound(SoundMixer *mixer, Resource *resource) : Sound(mixer, resource) {}; +	SBSound(SoundMixer *mixer, Input *input, Resource *resource) : Sound(mixer, input, resource) {};  	int playSound(byte *sound, uint32 size);  	void sfxPlay(const char *base);  }; @@ -61,7 +63,7 @@ public:  #ifdef USE_MAD  class MP3Sound : public Sound {  public: -	MP3Sound(SoundMixer *mixer, Resource *resource) : Sound(mixer, resource) {}; +	MP3Sound(SoundMixer *mixer, Input *input, Resource *resource) : Sound(mixer, input, resource) {};  	void sfxPlay(const char *base);  };  #endif diff --git a/queen/talk.cpp b/queen/talk.cpp index 4226885dbe..dfa9f22ba5 100644 --- a/queen/talk.cpp +++ b/queen/talk.cpp @@ -38,10 +38,11 @@ void Talk::talk(  		int personInRoom,  		char *cutawayFilename,  		Graphics *graphics, +		Input *input,  		Logic *logic,  		Resource *resource,  		Sound *sound) { -	Talk *talk = new Talk(graphics, logic, resource, sound); +	Talk *talk = new Talk(graphics, input, logic, resource, sound);  	talk->talk(filename, personInRoom, cutawayFilename);  	delete talk;  } @@ -51,10 +52,11 @@ bool Talk::speak(  		Person *person,  		const char *voiceFilePrefix,  		Graphics *graphics, +		Input *input,  		Logic *logic,  		Resource *resource,  	       	Sound *sound) { -	Talk *talk = new Talk(graphics, logic, resource, sound); +	Talk *talk = new Talk(graphics, input, logic, resource, sound);  	bool result = talk->speak(sentence, person, voiceFilePrefix);  	delete talk;  	return result; @@ -62,10 +64,12 @@ bool Talk::speak(  Talk::Talk(  		Graphics *graphics, +		Input *input,  		Logic *logic,  		Resource *resource, -		Sound *sound)  -: _graphics(graphics), _logic(logic), _resource(resource), _sound(sound), _fileData(NULL), _quit(false) { +		Sound *sound) :  +	_graphics(graphics), _input(input), _logic(logic), _resource(resource),  +	_sound(sound), _fileData(NULL), _quit(false) {  	//! TODO Move this to the Logic class later!  	memset(_talkSelected, 0, sizeof(_talkSelected)); @@ -649,7 +653,7 @@ void Talk::speakSegment(  			for (i = 0; i < 10; i++) {  				if (_quit)  					break; -				_graphics->update(); +				_logic->update();  			}  			return; @@ -775,7 +779,7 @@ void Talk::speakSegment(  		if (length == 0 && !isJoe && parameters->bf > 0) {  			_graphics->bankOverpack(parameters->bf, startFrame, bankNum); -			_graphics->update(); +			_logic->update();  		}  		/* A12 = the frame pointer for the full body frame, well use this  */ @@ -860,23 +864,23 @@ void Talk::speakSegment(  				}  				if (!_talkHead) -					_graphics->update(); +					_logic->update();  			}  			else -				_graphics->update(); +				_logic->update();  			if (_logic->joeWalk() == 3) {  				if (_quit)  					break; -				_graphics->update(); +				_logic->update();  			}  			else {  				if (_quit)  					break;  				// XXX CHECK_PLAYER(); -				_graphics->update(); // XXX call it ourselves as CHECK_PLAYER is not called +				_logic->update(); // XXX call it ourselves as CHECK_PLAYER is not called  				if (_logic->joeWalk() == 2)  					// Selected a command, so exit @@ -939,7 +943,7 @@ void Talk::speakSegment(  		}  	} -	_graphics->update(); +	_logic->update();  }  const Talk::SpeechParameters *Talk::findSpeechParameters( @@ -1120,7 +1124,7 @@ int16 Talk::selectSentence() {  				if (_quit)  					break; -				_graphics->update(); +				_logic->update();  				// XXX zone = zone(1, mouseX, mouseY); diff --git a/queen/talk.h b/queen/talk.h index 48d493f8af..982af88a30 100644 --- a/queen/talk.h +++ b/queen/talk.h @@ -41,6 +41,7 @@ class Talk {  		int personInRoom,  		char *cutawayFilename,   		Graphics *graphics, +		Input *input,  		Logic *logic,  		Resource *resource,  		Sound *sound); @@ -51,6 +52,7 @@ class Talk {  		Person *person,   		const char *voiceFilePrefix,  		Graphics *graphics, +		Input *input,  		Logic *logic,  		Resource *resource,  		Sound *sound); @@ -108,6 +110,7 @@ class Talk {  	Common::RandomSource _randomizer;  	Graphics  *_graphics; +	Input     *_input;  	Logic     *_logic;  	Resource  *_resource;  	Sound     *_sound; @@ -159,7 +162,7 @@ class Talk {  	static const SpeechParameters _speechParameters[]; -	Talk(Graphics *graphics, Logic *logic, Resource *resource, Sound *sound); +	Talk(Graphics *graphics, Input *input, Logic *logic, Resource *resource, Sound *sound);  	~Talk();  	//! Perform talk in file and return a cutaway filename diff --git a/queen/walk.cpp b/queen/walk.cpp index 3e8223e873..73aa161384 100644 --- a/queen/walk.cpp +++ b/queen/walk.cpp @@ -156,7 +156,7 @@ bool Walk::animateJoe() {  			if (pbs->speed == 0) {  				pbs->speed = 1;  			} -			_graphics->update(); // CHECK_PLAYER(); +			_logic->update(); // CHECK_PLAYER();  			if (_logic->joeWalk() == 2) { // || cutQuit   				// we are about to do something else, so stop walking  				interrupted = true; @@ -290,7 +290,7 @@ void Walk::animatePerson(const MovePersonData *mpd, uint16 image, uint16 bobNum,  		}  		while (pbs->moving) { -			_graphics->update(); +			_logic->update();  			uint16 scale = pwd->area->calcScale(pbs->y);  			pbs->scale = scale;  			if (pbs->xmajor) { diff --git a/queen/xref.txt b/queen/xref.txt index b6c835dad8..2bc9c818aa 100644 --- a/queen/xref.txt +++ b/queen/xref.txt @@ -142,15 +142,17 @@ scrollx						Display::_horizontalScroll  INPUT  ===== +check_keys()				Input::checkKeys() +get_key()					*not needed*  -  drawmouseflag  key_commands  key_language -KEYVERB +KEYVERB						Input::_keyVerb  MKEY  MouseButton  mouseflag -no_check_keys +no_check_keys				Input::_noCheckKeys  INVENTORY | 
