aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorEugene Sandulenko2007-09-18 19:06:05 +0000
committerEugene Sandulenko2007-09-18 19:06:05 +0000
commit55b19a1fd410d45ba677c186746d68e697bf7890 (patch)
tree6613c885dc1c76274373569b67415679122a5414 /engines
parent34ceaf208fc03ac738be1ef022177815f78a9a2c (diff)
downloadscummvm-rg350-55b19a1fd410d45ba677c186746d68e697bf7890.tar.gz
scummvm-rg350-55b19a1fd410d45ba677c186746d68e697bf7890.tar.bz2
scummvm-rg350-55b19a1fd410d45ba677c186746d68e697bf7890.zip
First room is shown.
svn-id: r28942
Diffstat (limited to 'engines')
-rw-r--r--engines/agi/preagi_troll.cpp144
-rw-r--r--engines/agi/preagi_troll.h36
2 files changed, 137 insertions, 43 deletions
diff --git a/engines/agi/preagi_troll.cpp b/engines/agi/preagi_troll.cpp
index 2d45c2de19..59a87c6295 100644
--- a/engines/agi/preagi_troll.cpp
+++ b/engines/agi/preagi_troll.cpp
@@ -206,21 +206,17 @@ void Troll::credits() {
_vm->drawStr(1, 2, kColorDefault, IDS_TRO_CREDITS_0);
- _vm->drawStr(7, 19, 10, "T");
- _vm->drawStr(7, 20, 11, "R");
- _vm->drawStr(7, 21, 12, "O");
- _vm->drawStr(7, 22, 13, "L");
- _vm->drawStr(7, 23, 14, "L");
- _vm->drawStr(7, 24, 15, "'");
- _vm->drawStr(7, 25, 9, "S");
- _vm->drawStr(7, 27, 11, "T");
- _vm->drawStr(7, 28, 12, "A");
- _vm->drawStr(7, 29, 13, "L");
- _vm->drawStr(7, 30, 14, "E");
- _vm->drawStr(7, 32, 9, "(");
- _vm->drawStr(7, 33, 10, "t");
- _vm->drawStr(7, 34, 11, "m");
- _vm->drawStr(7, 35, 12, ")");
+ int color = 10;
+ char str[2];
+
+ str[1] = 0;
+
+ for (uint i = 0; i < strlen(IDS_TRO_CREDITS_1); i++) {
+ str[0] = IDS_TRO_CREDITS_1[i];
+ _vm->drawStr(7, 19 + i, color++, str);
+ if (color > 15)
+ color = 9;
+ }
_vm->drawStr(8, 19, kColorDefault, IDS_TRO_CREDITS_2);
@@ -331,9 +327,7 @@ void Troll::intro() {
_vm->drawStr(14, 15, kColorDefault, IDS_TRO_INTRO_1);
_vm->_gfx->doUpdate();
_vm->_system->updateScreen();
-
- // draw troll picture
- _vm->_system->delayMillis(320);
+ _vm->_system->delayMillis(3200);
// Draw logo
drawPic(45, false, true);
@@ -371,22 +365,53 @@ void Troll::gameOver() {
pressAnyKey();
}
+int Troll::drawRoom(char *menu) {
+ int n;
+
+ drawPic(_currentRoom - 1, false, true);
+ _vm->_gfx->doUpdate();
+
+ // TODO: Troll
+
+ char tmp[10];
+ strncat(menu, (char*)_gameData + IDO_TRO_LOCMESSAGES + _locationDescIndex * 39, 39);
+
+ for (int i = 0; i < 3; i++) {
+ if (_roomDescs[_currentRoom - 1].options[i]) {
+ sprintf(tmp, "\n %d.", i);
+ strcat(menu, tmp);
+
+ strncat(menu, (char *)_gameData + _options[_roomDescs[_currentRoom - 1].options[i]], 35);
+
+ n = i + 1;
+ }
+ }
+
+ return n;
+}
+
void Troll::gameLoop() {
- int iSel;
- //int nSel;
bool done = false;
- //char szMsg[161];
- //char szMenu[161];
+ char menu[160+5];
+ int currentOption, numberOfOptions;
+
+ _moves = 0;
+ _currentRoom = 1;
+ _treasuresLeft = IDI_TRO_MAX_TREASURE;
+ _haveFlashlight = false;
+ _locationDescIndex = 0;
while (!done) {
-// Troll_DrawRoomPic(_currentRoom);
-// Troll_ReadRoomText(_currentRoom, szMsg, szMenu, &nSel);
+ *menu = 0;
+
+ currentOption = 0;
- iSel = 0;
- //getMenuSel(szMsg, szMenu, &iSel, nSel);
+ numberOfOptions = drawRoom(menu);
+
+ getMenuSel(menu, &currentOption, numberOfOptions);
_moves++;
- switch(iSel) {
+ switch(_roomDescs[_currentRoom - 1].optionTypes[currentOption]) {
case IDI_TRO_SEL_OPTION_1:
break;
case IDI_TRO_SEL_OPTION_2:
@@ -398,20 +423,57 @@ void Troll::gameLoop() {
}
-void Troll::fillPicOffsets() {
- for (int i = 0; i < IDI_TRO_PICNUM; i++)
- _pictureOffsets[i] = READ_LE_UINT16(_gameData + IDO_TRO_PIC_START + i * 2)
- + IDO_TRO_DATA_START;
+void Troll::fillOffsets() {
+ int i;
+
+ for (i = 0; i < IDI_TRO_PICNUM; i++)
+ _pictureOffsets[i] = READ_LE_UINT16(_gameData + IDO_TRO_PIC_START + i * 2);
+
+ for (i = 0; i < IDI_TRO_NUM_OPTIONS; i++)
+ _options[i] = READ_LE_UINT16(_gameData + IDO_TRO_OPTIONS + i * 2);
+}
+
+void Troll::fillRoomDescs() {
+ int start = READ_LE_UINT16(_gameData + IDO_TRO_ROOMDESCS);
+ int ptr;
+ int j;
+
+ for (int i = 0; i < IDI_TRO_NUM_ROOMDESCS; i++) {
+ ptr = READ_LE_UINT16(_gameData + start);
+
+ for (j = 0; j < 3; j++)
+ _roomDescs[i].options[j] = _gameData[ptr++];
+
+ for (j = 0; j < 3; j++) {
+ switch (_gameData[ptr++]) {
+ case 0:
+ _roomDescs[i].optionTypes[j] = OT_GO;
+ break;
+ case 1:
+ _roomDescs[i].optionTypes[j] = OT_GET;
+ break;
+ case 2:
+ _roomDescs[i].optionTypes[j] = OT_WIN;
+ break;
+ case 3:
+ _roomDescs[i].optionTypes[j] = OT_UNKN;
+ break;
+ default:
+ error("Bad data @ (%x) %d", ptr - 1, i);
+ }
+ }
+
+ for (j = 0; j < 3; j++)
+ _roomDescs[i].roomDescIndex[j] = _gameData[ptr++];
+
+ start += 2;
+ }
}
// Init
void Troll::init() {
- _moves = 0;
- _currentRoom = 1;
- _treasuresLeft = IDI_TRO_MAX_TREASURE;
-
- _vm->_picture->setPictureVersion(AGIPIC_V15);
+ _vm->_picture->setPictureVersion(AGIPIC_V15);
//SetScreenPar(320, 200, (char*)ibm_fontdata);
Common::File infile;
@@ -419,15 +481,19 @@ void Troll::init() {
return;
_gameData = (byte *)malloc(infile.size());
- infile.read(_gameData, infile.size());
+ infile.seek(IDO_TRO_DATA_START);
+ infile.read(_gameData, infile.size() - IDO_TRO_DATA_START);
infile.close();
- fillPicOffsets();
+ fillOffsets();
+ fillRoomDescs();
}
void Troll::run() {
intro();
- //gameLoop();
+
+ gameLoop();
+
gameOver();
}
diff --git a/engines/agi/preagi_troll.h b/engines/agi/preagi_troll.h
index 681f3f07b4..ef458afb41 100644
--- a/engines/agi/preagi_troll.h
+++ b/engines/agi/preagi_troll.h
@@ -117,18 +117,36 @@ const char IDS_TRO_NAME_TREASURE[][16] = {
#define IDI_TRO_MAX_ROW_PIC 21
+#define IDI_TRO_NUM_ROOMDESCS 65
+#define IDI_TRO_NUM_OPTIONS 129
+
// offsets
#define IDA_TRO_BINNAME "troll.exe"
-#define IDO_TRO_DATA_START (0x5855-0x3ef5)
-#define IDO_TRO_PIC_START 0x5855
+#define IDO_TRO_DATA_START 0x1960
+#define IDO_TRO_PIC_START 0x3EF5
+#define IDO_TRO_LOCMESSAGES 0x1F7C
+#define IDO_TRO_ROOMDESCS 0x0082
+#define IDO_TRO_OPTIONS 0x0364
+
+enum OptionType {
+ OT_GO,
+ OT_GET,
+ OT_WIN,
+ OT_UNKN
+};
+
+struct RoomDesc {
+ int options[3];
+ OptionType optionTypes[3];
+ int roomDescIndex[3];
+};
class Troll {
friend class PreAgiEngine;
public:
Troll(PreAgiEngine *vm);
- //~Winnie();
void init();
void run();
@@ -137,6 +155,13 @@ private:
int _currentRoom;
int _moves;
int _treasuresLeft;
+ int _locationDescIndex;
+ int _numberOfOptions;
+
+ bool _haveFlashlight;
+
+ RoomDesc _roomDescs[IDI_TRO_NUM_ROOMDESCS];
+ int _options[IDI_TRO_NUM_OPTIONS];
byte *_gameData;
@@ -151,6 +176,8 @@ private:
void inventory();
+ int drawRoom(char *menu);
+
void pressAnyKey();
void waitAnyKeyIntro();
@@ -158,7 +185,8 @@ private:
void drawMenu(const char *szMenu, int iSel);
- void fillPicOffsets();
+ void fillOffsets();
+ void fillRoomDescs();
private:
int _pictureOffsets[IDI_TRO_PICNUM];