diff options
| -rw-r--r-- | engines/mads/nebular/menu_nebular.cpp | 151 | ||||
| -rw-r--r-- | engines/mads/nebular/menu_nebular.h | 18 | 
2 files changed, 160 insertions, 9 deletions
| diff --git a/engines/mads/nebular/menu_nebular.cpp b/engines/mads/nebular/menu_nebular.cpp index e3f68862a4..c15cd1d283 100644 --- a/engines/mads/nebular/menu_nebular.cpp +++ b/engines/mads/nebular/menu_nebular.cpp @@ -405,7 +405,6 @@ void TextView::load() {  	processLines();  } -  void TextView::processLines() {  	if (_script.eos())  		error("Attempted to read past end of response file"); @@ -447,7 +446,6 @@ void TextView::processLines() {  	}  } -  void TextView::processCommand() {  	Scene &scene = _vm->_game->_scene;  	Common::String scriptLine(_currentLine + 1); @@ -472,14 +470,15 @@ void TextView::processCommand() {  		_vm->_palette->grabPalette(destPalette, 0, 256);  		// Copy the loaded background, if any, to the view surface -		int yp = 22; -		//scene._backgroundSurface.copyTo(this, 0, yp); +		//int yp = 22; +		//scene._backgroundSurface.copyTo(this, 0, 22);  		// Handle fade-in -		byte srcPalette[768]; -		Common::fill(&srcPalette[0], &srcPalette[PALETTE_SIZE], 0); -		_vm->_palette->fadeIn(srcPalette, destPalette, 0, PALETTE_COUNT, 0, 0, -			TV_FADE_DELAY_MILLI, TV_NUM_FADE_STEPS); +		//byte srcPalette[768]; +		//Common::fill(&srcPalette[0], &srcPalette[PALETTE_SIZE], 0); +		//_vm->_palette->fadeIn(srcPalette, destPalette, 0, PALETTE_COUNT, 0, 0, +		//	TV_FADE_DELAY_MILLI, TV_NUM_FADE_STEPS); +		_vm->_game->_fx = kTransitionFadeIn;  	} else if (!strncmp(commandStr, "PAN", 3)) {  		// Set panning values @@ -604,6 +603,142 @@ void AnimationView::execute(const Common::String &resName) {  	strcpy(_resourceName, resName.c_str());  } +AnimationView::AnimationView(MADSEngine *vm) : MenuView(vm) { +	_soundDriverLoaded = false; +} + +void AnimationView::load() { +	Common::String resName(_resourceName); +	if (!resName.hasSuffix(".")) +		resName += ".res"; + +	if (!_script.open(resName)) +		error("Could not open resource %s", resName); + +	processLines(); +} + +bool AnimationView::onEvent(Common::Event &event) { +	// Wait for the Escape key or a mouse press +	if (((event.type == Common::EVENT_KEYDOWN) && (event.kbd.keycode == Common::KEYCODE_ESCAPE)) || +			(event.type == Common::EVENT_RBUTTONUP)) { +		scriptDone(); +		return true; +	} + +	return false; +} + +void AnimationView::doFrame() { +	Scene &scene = _vm->_game->_scene; +	int bgNumber = 0; + +	// Only update state if wait period has expired +	if (_previousUpdate > 0) { +		if (g_system->getMillis() - _previousUpdate < 3000) { +			return; +		} else { +			// time for an update +			_previousUpdate = g_system->getMillis(); +		} +	} else { +		_previousUpdate = g_system->getMillis(); +		return; +	} + +	char bgFile[10]; +	strncpy(bgFile, _currentFile, 5); +	bgFile[0] = bgFile[2]; +	bgFile[1] = bgFile[3]; +	bgFile[2] = bgFile[4]; +	bgFile[3] = '\0'; +	bgNumber = atoi(bgFile); +	sprintf(bgFile, "rm%i.art", bgNumber); + +	// Not all scenes have a background. If there is one, refresh it +	if (Common::File::exists(bgFile)) { +		_vm->_palette->resetGamePalette(4, 8); +		SceneInfo *sceneInfo = SceneInfo::init(_vm); +		sceneInfo->load(bgNumber, 0, Common::String(), 0, scene._depthSurface, +			scene._backgroundSurface); +	} + +	// Read next line +	processLines(); +} + +void AnimationView::scriptDone() { +	_breakFlag = true; +	_vm->_dialogs->_pendingDialog = DIALOG_MAIN_MENU; +} + +void AnimationView::processLines() { +	if (_script.eos()) { +		// end of script, end animation +		scriptDone(); +		return; +	} + +	while (!_script.eos()) { +		_script.readLine(_currentLine, 79); + +		// Process the line +		char *cStart = strchr(_currentLine, '-'); +		if (cStart) { +			while (cStart) { +				// Loop for possible multiple commands on one line +				char *cEnd = strchr(_currentLine, ' '); +				if (!cEnd) +					error("Unterminated command '%s' in response file", _currentLine); + +				*cEnd = '\0'; +				processCommand(); + +				// Copy rest of line (if any) to start of buffer +				// Don't use strcpy() here, because if the +				// rest of the line is the longer of the two +				// strings, the memory areas will overlap. +				memmove(_currentLine, cEnd + 1, strlen(cEnd + 1) + 1); + +				cStart = strchr(_currentLine, '-'); +			} + +			if (_currentLine[0]) { +				sprintf(_currentFile, "%s", _currentLine); +				//printf("File: %s\n", _currentLine); +				break; +			} + +		} else { +			sprintf(_currentFile, "%s", _currentLine); +			warning("File: %s\n", _currentLine); +			break; +		} +	} +} + +void AnimationView::processCommand() { +	Common::String commandLine(_currentLine + 1); +	commandLine.toUppercase(); +	const char *commandStr = commandLine.c_str(); +	const char *param = commandStr; + +	if (!strncmp(commandStr, "X", 1)) { +		//printf("X "); +	} else if (!strncmp(commandStr, "W", 1)) { +		//printf("W "); +	} else if (!strncmp(commandStr, "R", 1)) { +		param = param + 2; +		//printf("R:%s ", param); +	} else if (!strncmp(commandStr, "O", 1)) { +		// Set the transition effect +		param = param + 2; +		_vm->_game->_fx = (ScreenTransition)atoi(param); +	} else { +		error("Unknown response command: '%s'", commandStr); +	} +} +  } // End of namespace Nebular  } // End of namespace MADS diff --git a/engines/mads/nebular/menu_nebular.h b/engines/mads/nebular/menu_nebular.h index 7e11e78e27..e1abbe2c52 100644 --- a/engines/mads/nebular/menu_nebular.h +++ b/engines/mads/nebular/menu_nebular.h @@ -179,14 +179,30 @@ class AnimationView : public MenuView {  private:  	static char _resourceName[100]; +	Common::File _script; +	uint32 _previousUpdate; +	char _currentLine[80]; +	char _currentFile[10]; +	bool _soundDriverLoaded; +private: +	void load(); + +	void processLines(); +	void processCommand(); + +	void scriptDone(); + +	void doFrame(); +protected: +	virtual bool onEvent(Common::Event &event);  public:  	/**  	* Queue the given text resource for display  	*/  	static void execute(const Common::String &resName); -	AnimationView(MADSEngine *vm) : MenuView(vm) {} +	AnimationView(MADSEngine *vm);  	virtual ~AnimationView() {}  }; | 
