diff options
| -rw-r--r-- | engines/prince/prince.cpp | 98 | ||||
| -rw-r--r-- | engines/prince/prince.h | 20 | ||||
| -rw-r--r-- | engines/prince/script.cpp | 85 | ||||
| -rw-r--r-- | engines/prince/script.h | 1 | 
4 files changed, 102 insertions, 102 deletions
| diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp index b91155344b..101af7b35c 100644 --- a/engines/prince/prince.cpp +++ b/engines/prince/prince.cpp @@ -87,7 +87,8 @@ PrinceEngine::PrinceEngine(OSystem *syst, const PrinceGameDescription *gameDesc)  	_optionsMob(-1), _currentPointerNumber(1), _selectedMob(-1), _selectedItem(0), _selectedMode(0),  	_optionsWidth(210), _optionsHeight(170), _invOptionsWidth(210), _invOptionsHeight(130), _optionsStep(20),  	_invOptionsStep(20), _optionsNumber(7), _invOptionsNumber(5), _optionsColor1(236), _optionsColor2(252), -	_dialogWidth(600), _dialogHeight(0), _dialogLineSpace(10), _dialogColor1(220), _dialogColor2(223), _dialogFlag(false) { +	_dialogWidth(600), _dialogHeight(0), _dialogLineSpace(10), _dialogColor1(220), _dialogColor2(223), +	_dialogFlag(false), _dialogLines(0), _dialogText(nullptr) {  	// Debug/console setup  	DebugMan.addDebugChannel(DebugChannel::kScript, "script", "Prince Script debug channel"); @@ -2229,22 +2230,36 @@ void PrinceEngine::displayInventory() {  	}  } -void PrinceEngine::createDialogBox(Common::Array<DialogLine> &dialogData) { -	int amountOfDialogLines = 0; -	int amountOfDialogOptions = dialogData.size(); +void PrinceEngine::createDialogBox(int dialogBoxNr) { +	_dialogLines = 0; +	int amountOfDialogOptions = 0; +	int dialogDataValue = (int)READ_UINT32(_dialogData); -	for (int i = 0; i < amountOfDialogOptions; i++) { -		amountOfDialogLines += calcText(dialogData[i]._line.c_str()); +	byte c; +	int sentenceNumber; +	_dialogText = _dialogBoxAddr[dialogBoxNr]; +	byte *dialogText = _dialogText; + +	while ((sentenceNumber = *dialogText) != 0xFF) { +		dialogText++; +		if (!(dialogDataValue & (1 << sentenceNumber))) { +			_dialogLines += calcText((const char *)dialogText); +			amountOfDialogOptions++; +		} +		do { +			c = *dialogText; +			dialogText++; +		} while (c);  	} -	_dialogHeight = _font->getFontHeight() * amountOfDialogLines + _dialogLineSpace * (amountOfDialogOptions + 1); +	_dialogHeight = _font->getFontHeight() * _dialogLines + _dialogLineSpace * (amountOfDialogOptions + 1);  	_dialogImage = new Graphics::Surface();  	_dialogImage->create(_dialogWidth, _dialogHeight, Graphics::PixelFormat::createFormatCLUT8());  	Common::Rect dBoxRect(0, 0, _dialogWidth, _dialogHeight);  	_dialogImage->fillRect(dBoxRect, _graph->kShadowColor);  } -void PrinceEngine::runDialog(Common::Array<DialogLine> &dialogData) { +void PrinceEngine::runDialog() {  	_dialogFlag = true; @@ -2265,27 +2280,38 @@ void PrinceEngine::runDialog(Common::Array<DialogLine> &dialogData) {  		Common::Point mousePos = _system->getEventManager()->getMousePos(); +		byte c; +		int sentenceNumber; +		byte *dialogText = _dialogText; +		byte *dialogCurrentText = nullptr;  		int dialogSelected = -1; -		int dialogSelectedText = -1; +		int dialogDataValue = (int)READ_UINT32(_dialogData); -		for (uint i = 0; i < dialogData.size(); i++) { +		while ((sentenceNumber = *dialogText) != 0xFF) { +			dialogText++;  			int actualColor = _dialogColor1; -			Common::Array<Common::String> lines; -			_font->wordWrapText(dialogData[i]._line, _graph->_frontScreen->w, lines); +			if (!(dialogDataValue & (1 << sentenceNumber))) { +				Common::Array<Common::String> lines; +				_font->wordWrapText((const char *)dialogText, _graph->_frontScreen->w, lines); -			Common::Rect dialogOption(dialogTextX, dialogTextY - dialogSkipUp / 2, dialogX + _dialogWidth - dialogSkipLeft, dialogTextY + lines.size() * _font->getFontHeight() + dialogSkipUp / 2 - 1); -			if (dialogOption.contains(mousePos)) { -				actualColor = _dialogColor2; -				dialogSelected = dialogData[i]._nr; -				dialogSelectedText = i; -			} +				Common::Rect dialogOption(dialogTextX, dialogTextY - dialogSkipUp / 2, dialogX + _dialogWidth - dialogSkipLeft, dialogTextY + lines.size() * _font->getFontHeight() + dialogSkipUp / 2 - 1); +				if (dialogOption.contains(mousePos)) { +					actualColor = _dialogColor2; +					dialogSelected = sentenceNumber; +					dialogCurrentText = dialogText; +				} -			for (uint j = 0; j < lines.size(); j++) { -				_font->drawString(_graph->_frontScreen, lines[j], dialogTextX, dialogTextY, _graph->_frontScreen->w, actualColor); -				dialogTextY += _font->getFontHeight(); +				for (uint j = 0; j < lines.size(); j++) { +					_font->drawString(_graph->_frontScreen, lines[j], dialogTextX, dialogTextY, _graph->_frontScreen->w, actualColor); +					dialogTextY += _font->getFontHeight(); +				} +				dialogTextY += _dialogLineSpace;  			} -			dialogTextY += _dialogLineSpace; +			do { +				c = *dialogText; +				dialogText++; +			} while (c);  		}  		Common::Event event; @@ -2301,7 +2327,7 @@ void PrinceEngine::runDialog(Common::Array<DialogLine> &dialogData) {  				break;  			case Common::EVENT_LBUTTONDOWN:  				if (dialogSelected != -1) { -					dialogLeftMouseButton(dialogSelected, dialogData[dialogSelectedText]._line.c_str()); +					dialogLeftMouseButton(dialogCurrentText, dialogSelected);  					_dialogFlag = false;  				}  				break; @@ -2336,15 +2362,29 @@ void PrinceEngine::runDialog(Common::Array<DialogLine> &dialogData) {  	// cursor?  } -void PrinceEngine::dialogLeftMouseButton(int dialogSelected, const char *s) { -	//TODO @@showa_dialoga: -	talkHero(0, s); +void PrinceEngine::dialogLeftMouseButton(byte *string, int dialogSelected) { +	_interpreter->setString(string); +	talkHero(0); + +	int dialogDataValue = (int)READ_UINT32(_dialogData); +	int newValue = (dialogDataValue & (1 << dialogSelected)); // FIXME +	WRITE_UINT32(_dialogData, newValue); // FIXME + +	_flags->setFlagValue(Flags::BOXSEL, dialogSelected + 1); +	setVoice(0, 28, dialogSelected + 1); + +	int dialogOpt = dialogSelected << 4; +	_flags->setFlagValue(Flags::VOICE_H_LINE, _dialogOptLines[dialogOpt]); +	_flags->setFlagValue(Flags::VOICE_A_LINE, _dialogOptLines[dialogOpt + 1]); +	_flags->setFlagValue(Flags::VOICE_B_LINE, _dialogOptLines[dialogOpt + 2]); + +	_interpreter->setString(_dialogOptAddr[dialogSelected]);  } -void PrinceEngine::talkHero(int slot, const char *s) { +void PrinceEngine::talkHero(int slot) {  	// heroSlot = textSlot  	Text &text = _textSlots[slot]; -	int lines = calcText(s); +	int lines = calcText((const char *)_interpreter->getString());  	int time = lines * 30;  	if (slot == 0) { @@ -2361,7 +2401,7 @@ void PrinceEngine::talkHero(int slot, const char *s) {  		text._y = _secondHero->_middleY - _secondHero->_scaledFrameYSize;  	}  	text._time = time; // changed by SETSPECVOICE? -	text._str = s; +	text._str = (const char *)_interpreter->getString();  	_interpreter->increaseString();  } diff --git a/engines/prince/prince.h b/engines/prince/prince.h index 3110d6d9a5..d59a888815 100644 --- a/engines/prince/prince.h +++ b/engines/prince/prince.h @@ -234,11 +234,6 @@ struct DrawNode {  	void (*drawFunction)(Graphics::Surface *, DrawNode *);  }; -struct DialogLine { -	int _nr; -	Common::String _line; -}; -  struct DebugChannel {  enum Type { @@ -309,7 +304,6 @@ public:  	Common::Array<AnimListItem> _animList;  	Common::Array<BackgroundAnim> _backAnimList;  	Common::Array<Anim> _normAnimList; -	Common::Array<Common::Array<DialogLine>> _dialogBoxList;  	Common::Array<Mob> _mobList;  	void freeNormAnim(int slot); @@ -396,12 +390,18 @@ public:  	void rightMouseButton();  	void inventoryLeftMouseButton();  	void inventoryRightMouseButton(); -	void dialogLeftMouseButton(int dialogSelected, const char *s); +	void dialogLeftMouseButton(byte *string, int dialogSelected);  	uint32 _dialogDatSize;  	byte *_dialogDat;  	byte *_dialogData; // on, off flags for lines of dialog text +	byte *_dialogBoxAddr[32]; // adresses of dialog windows +	byte *_dialogOptAddr[32]; // adresses of dialog options +	int _dialogOptLines[4 * 32]; // numbers of initial dialog lines + +	byte *_dialogText; +	int _dialogLines;  	bool _dialogFlag;  	int _dialogWidth;  	int _dialogHeight; @@ -410,9 +410,9 @@ public:  	int _dialogColor2; // color for selected option  	Graphics::Surface *_dialogImage; -	void createDialogBox(Common::Array<DialogLine> &dialogData); -	void runDialog(Common::Array<DialogLine> &dialogData); -	void talkHero(int slot, const char *s); +	void createDialogBox(int dialogBoxNr); +	void runDialog(); +	void talkHero(int slot);  	void doTalkAnim(int animNumber, int slot, AnimType animType);  	int testAnimNr; diff --git a/engines/prince/script.cpp b/engines/prince/script.cpp index ec31cda739..3fe03e8c1d 100644 --- a/engines/prince/script.cpp +++ b/engines/prince/script.cpp @@ -526,6 +526,10 @@ byte *Interpreter::getString() {  	return _string;  } +void Interpreter::setString(byte *newString) { +	_string = newString; +} +  void Interpreter::increaseString() {  	while (*_string) {  		_string++; @@ -1125,7 +1129,7 @@ void Interpreter::O_CHECKINV() {  void Interpreter::O_TALKHERO() {  	uint16 hero = readScriptFlagValue();  	debugInterpreter("O_TALKHERO hero %d", hero); -	_vm->talkHero(hero, (const char *)_string); +	_vm->talkHero(hero);  }  void Interpreter::O_WAITTEXT() { @@ -1371,22 +1375,13 @@ void Interpreter::O_INITDIALOG() {  		stringCurrOff += 2;  		_string = string + adressOfFirstSequence; -		for (uint i = 0; i < _vm->_dialogBoxList.size(); i++) { -			_vm->_dialogBoxList[i].clear(); -		} -		_vm->_dialogBoxList.clear(); - -		byte *dialogBoxAddr[32]; // adresses of dialog windows -		byte *dialogOptAddr[32]; // adresses of dialog options -		int dialogOptLines[4 * 32]; // numbers of initial dialog lines -  		for (int i = 0; i < 32; i++) { -			dialogBoxAddr[i] = 0; -			dialogOptAddr[i] = 0; +			_vm->_dialogBoxAddr[i] = 0; +			_vm->_dialogOptAddr[i] = 0;  		}  		for (int i = 0; i < 4 * 32; i++) { -			dialogOptLines[i] = 0; +			_vm->_dialogOptLines[i] = 0;  		}  		int16 off; @@ -1398,7 +1393,7 @@ void Interpreter::O_INITDIALOG() {  			if (off) {  				line = string + off;  			} -			dialogBoxAddr[dialogBox] = line; +			_vm->_dialogBoxAddr[dialogBox] = line;  			dialogBox++;  		}  		stringCurrOff += 2; @@ -1409,49 +1404,16 @@ void Interpreter::O_INITDIALOG() {  			if (off) {  				line = string + off;  			} -			dialogOptAddr[dialogOpt] = line; +			_vm->_dialogOptAddr[dialogOpt] = line;  			dialogOpt++;  		} -		dialogBox = 0; -		byte c; -		int sentenceNumber; -		DialogLine tempDialogLine; -		Common::Array<DialogLine> tempDialogBox; - -		while (dialogBoxAddr[dialogBox]) { -			tempDialogBox.clear(); -			byte *boxAddr = dialogBoxAddr[dialogBox]; -			int dialogDataValue = (int)READ_UINT32(_vm->_dialogData); -			while ((sentenceNumber = *boxAddr) != 0xFF) { -				boxAddr++; -				if (!(dialogDataValue & (1 << sentenceNumber))) { -					tempDialogLine._line.clear(); -					tempDialogLine._nr = sentenceNumber; -					while ((c = *boxAddr)) { -						tempDialogLine._line += c; -						boxAddr++; -					} -					boxAddr++; -					tempDialogBox.push_back(tempDialogLine); -				} else { -					do { -						c = *boxAddr; -						boxAddr++; -					} while (c); -				} -			} -			_vm->_dialogBoxList.push_back(tempDialogBox); -			dialogBox++; -		} - -		// TODO - dialogOptAddr, dialogOptLines  		_flags->setFlagValue(Flags::VOICE_A_LINE, 0);  		_flags->setFlagValue(Flags::VOICE_B_LINE, 0); // bx in original?  		int freeHSlot = 0;  		for (int i = 31; i >= 0; i--) { -			if (dialogOptAddr[i] != 0) { +			if (_vm->_dialogOptAddr[i] != 0) {  				i++;  				freeHSlot = i;  				_flags->setFlagValue(Flags::VOICE_H_LINE, i); @@ -1462,11 +1424,11 @@ void Interpreter::O_INITDIALOG() {  		freeHSlot += checkSeq(_string);  		for (int i = 0; i < 32; i++) { -			dialogOptLines[i * 4] = freeHSlot; -			dialogOptLines[i * 4 + 1] = freeHSlot; -			dialogOptLines[i * 4 + 2] = freeHSlot; -			if (dialogOptAddr[i]) { -				freeHSlot += checkSeq(dialogOptAddr[i]); +			_vm->_dialogOptLines[i * 4] = freeHSlot; +			_vm->_dialogOptLines[i * 4 + 1] = freeHSlot; +			_vm->_dialogOptLines[i * 4 + 2] = freeHSlot; +			if (_vm->_dialogOptAddr[i]) { +				freeHSlot += checkSeq(_vm->_dialogOptAddr[i]);  			}  		}  	} @@ -1485,15 +1447,12 @@ void Interpreter::O_DISABLEDIALOGOPT() {  void Interpreter::O_SHOWDIALOGBOX() {  	uint16 box = readScriptFlagValue();  	debugInterpreter("O_SHOWDIALOGBOX box %d", box); -	if (box < _vm->_dialogBoxList.size()) { -		_vm->createDialogBox(_vm->_dialogBoxList[box]); -		int dialogLines = _vm->_dialogBoxList[box].size(); -		_flags->setFlagValue(Flags::DIALINES, dialogLines); -		if (dialogLines != 0) { -			_vm->changeCursor(1); -			_vm->runDialog(_vm->_dialogBoxList[box]); -			_vm->changeCursor(0); -		} +	_vm->createDialogBox(box); +	_flags->setFlagValue(Flags::DIALINES, _vm->_dialogLines); +	if (_vm->_dialogLines != 0) { +		_vm->changeCursor(1); +		_vm->runDialog(); +		_vm->changeCursor(0);  	}  } diff --git a/engines/prince/script.h b/engines/prince/script.h index a822b44ccb..5f9cdc3ab3 100644 --- a/engines/prince/script.h +++ b/engines/prince/script.h @@ -186,6 +186,7 @@ public:  	void setCurrentString(uint32 value);  	byte *getString(); +	void setString(byte *newString);  	void increaseString(); | 
