aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/prince/prince.cpp60
-rw-r--r--engines/prince/prince.h1
-rw-r--r--engines/prince/script.cpp18
-rw-r--r--engines/prince/script.h5
4 files changed, 68 insertions, 16 deletions
diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp
index 4f3be5f98e..f7cc1c7065 100644
--- a/engines/prince/prince.cpp
+++ b/engines/prince/prince.cpp
@@ -32,6 +32,7 @@
#include "common/keyboard.h"
#include "common/substream.h"
#include "common/str.h"
+#include "common/str-array.h"
#include "graphics/cursorman.h"
#include "graphics/surface.h"
@@ -86,8 +87,8 @@ PrinceEngine::PrinceEngine(OSystem *syst, const PrinceGameDescription *gameDesc)
_invCurInside(false), _optionsFlag(false), _optionEnabled(0), _invExamY(120),
_optionsMob(0), _currentPointerNumber(1), _selectedMob(0), _selectedItem(0), _selectedMode(0),
_optionsWidth(210), _optionsHeight(170), _invOptionsWidth(210), _invOptionsHeight(130), _optionsStep(20),
- _invOptionsStep(20), _optionsNumber(7), _invOptionsNumber(5), _optionsColor1(0xFF00EC), _optionsColor2(0xFF00FC),
- _dialogWidth(600), _dialogHeight(0), _dialogLineSpace(10), _dialogColor1(0xFF00DC), _dialogColor2(0xFF00DF) {
+ _invOptionsStep(20), _optionsNumber(7), _invOptionsNumber(5), _optionsColor1(236), _optionsColor2(252),
+ _dialogWidth(600), _dialogHeight(0), _dialogLineSpace(10), _dialogColor1(220), _dialogColor2(223) {
// Debug/console setup
DebugMan.addDebugChannel(DebugChannel::kScript, "script", "Prince Script debug channel");
@@ -1645,6 +1646,38 @@ void PrinceEngine::drawInvItems() {
}
}
+void PrinceEngine::leftMouseButton() {
+ if (_optionsFlag) {
+ if (_optionEnabled < _optionsNumber) {
+ _optionsFlag = 0;
+ } else {
+ return;
+ }
+ } else {
+ _optionsMob = _selectedMob;
+ if (!_selectedMob) {
+ // @@walkto
+ }
+ }
+ // edi = optionsMob
+ // ebp = optionsMobNumber
+ // selectedMob = optionsMobNumber
+ if (_currentPointerNumber != 2) {
+ //skip_use_code
+ }
+ if (_selectedMode != 0) {
+ //give_item
+ }
+
+ if (_room->_itemUse == 0) {
+ //standard_useitem
+ //_script->_scriptInfo.stdUse;
+ } else {
+ debug("selectedMob: %d", _selectedMob);
+ _script->scanMobItemEvents(_mobList[_selectedMob]._mask, _room->_itemUse);
+ }
+}
+
void PrinceEngine::rightMouseButton() {
if (_currentPointerNumber < 2) {
enableOptions();
@@ -1980,12 +2013,8 @@ void PrinceEngine::createDialogBox(Common::Array<DialogLine> &dialogData) {
int amountOfDialogLines = 0;
int amountOfDialogOptions = dialogData.size();
- // change this to sth simpler?
- Common::Array<Common::String> lines;
for (int i = 0; i < amountOfDialogOptions; i++) {
- _font->wordWrapText(dialogData[i]._line, _graph->_frontScreen->w, lines);
- amountOfDialogLines += lines.size();
- lines.clear();
+ amountOfDialogLines += calcText(dialogData[i]._line.c_str());
}
_dialogHeight = _font->getFontHeight() * amountOfDialogLines + _dialogLineSpace * (amountOfDialogOptions + 1);
@@ -2048,8 +2077,10 @@ void PrinceEngine::runDialog(Common::Array<DialogLine> &dialogData) {
case Common::EVENT_MOUSEMOVE:
break;
case Common::EVENT_LBUTTONDOWN:
- dialogLeftMouseButton(dialogSelected, dialogData[dialogSelectedText]._line.c_str());
- return;
+ if (dialogSelected != -1) {
+ dialogLeftMouseButton(dialogSelected, dialogData[dialogSelectedText]._line.c_str());
+ return;
+ }
break;
case Common::EVENT_RBUTTONDOWN:
break;
@@ -2076,10 +2107,8 @@ void PrinceEngine::runDialog(Common::Array<DialogLine> &dialogData) {
}
void PrinceEngine::dialogLeftMouseButton(int dialogSelected, const char *s) {
- if (dialogSelected != -1) {
- //TODO @@showa_dialoga:
- talkHero(0, s);
- }
+ //TODO @@showa_dialoga:
+ talkHero(0, s);
}
void PrinceEngine::talkHero(int slot, const char *s) {
@@ -2090,13 +2119,13 @@ void PrinceEngine::talkHero(int slot, const char *s) {
int x, y;
if (slot == 0) {
- text._color = 0xFF00DC; // test this
+ text._color = 220; // test this
_mainHero->_state = Hero::TALK;
_mainHero->_talkTime = time;
x = _mainHero->_middleX - _picWindowX;
y = _mainHero->_middleY - _mainHero->_scaledFrameYSize - 10;
} else {
- text._color = 0xFF00DC; // test this !
+ text._color = 220; // test this !
_secondHero->_state = Hero::TALK;
_secondHero->_talkTime = time;
x = _secondHero->_middleX - _picWindowX;
@@ -2158,6 +2187,7 @@ void PrinceEngine::mainLoop() {
case Common::EVENT_MOUSEMOVE:
break;
case Common::EVENT_LBUTTONDOWN:
+ leftMouseButton();
break;
case Common::EVENT_RBUTTONDOWN:
rightMouseButton();
diff --git a/engines/prince/prince.h b/engines/prince/prince.h
index 5e04eecb1c..4ffedaed6f 100644
--- a/engines/prince/prince.h
+++ b/engines/prince/prince.h
@@ -343,6 +343,7 @@ public:
void checkOptions();
void checkInvOptions();
+ void leftMouseButton();
void rightMouseButton();
void inventoryLeftMouseButton();
void inventoryRightMouseButton();
diff --git a/engines/prince/script.cpp b/engines/prince/script.cpp
index 29566b7fb7..02234adcfa 100644
--- a/engines/prince/script.cpp
+++ b/engines/prince/script.cpp
@@ -242,6 +242,23 @@ int Script::scanInvObjUseEvents(int mobMask) {
return -1; // or sth else?
}
+int Script::scanMobItemEvents(int mobMask, int roomEventOffset) {
+ debug("mobMask: %d", mobMask);
+ RE tempRE;
+ int i = 0;
+ do {
+ tempRE._mob = (int)READ_UINT16(&_data[roomEventOffset + i * 6]);
+ debug("mob: %d", tempRE._mob);
+ tempRE._code = (int)READ_UINT32(&_data[roomEventOffset + i * 6 + 2]);
+ debug("code: %d", tempRE._code);
+ if (tempRE._mob == mobMask) {
+ return tempRE._code;
+ }
+ i++;
+ } while (tempRE._mob != -1); //?? || i <= 1 or without this (no items there)
+ return -1; // or sth else?
+}
+
void Script::installSingleBackAnim(Common::Array<BackgroundAnim> &_backanimList, int offset) {
BackgroundAnim newBackgroundAnim;
@@ -1003,6 +1020,7 @@ void Interpreter::O_CHECKINV() {
void Interpreter::O_TALKHERO() {
uint16 hero = readScriptFlagValue();
debugInterpreter("O_TALKHERO hero %d", hero);
+ _vm->talkHero(hero, (const char *)_string);
}
void Interpreter::O_WAITTEXT() {
diff --git a/engines/prince/script.h b/engines/prince/script.h
index d53f951859..e7e444de13 100644
--- a/engines/prince/script.h
+++ b/engines/prince/script.h
@@ -120,6 +120,8 @@ public:
int goTester;
};
+ ScriptInfo _scriptInfo;
+
bool loadFromStream(Common::SeekableReadStream &stream);
template <typename T>
@@ -129,6 +131,7 @@ public:
}
uint32 getStartGameOffset();
+ uint32 getStdUseItem();
int16 getLightX(int locationNr);
int16 getLightY(int locationNr);
int32 getShadowScale(int locationNr);
@@ -139,6 +142,7 @@ public:
int scanInvObjExamEvents(int mobMask);
int scanInvObjUseEvents(int mobMask);
+ int scanMobItemEvents(int mobMask, int roomEventOffset);
const char *getString(uint32 offset) {
return (const char *)(&_data[offset]);
@@ -149,7 +153,6 @@ private:
uint8 *_data;
uint32 _dataSize;
Common::Array<Room> _roomList;
- ScriptInfo _scriptInfo;
};
class InterpreterFlags {