aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorTravis Howell2006-10-08 01:46:38 +0000
committerTravis Howell2006-10-08 01:46:38 +0000
commit56153086e5be87cd0542c620cd5417b1d4779f41 (patch)
treea287e8f00cc82f5be76b08e38e7b32db53a769b9 /engines
parentc9245a0ffea03f33b3b4bed09068af915c30d2d7 (diff)
downloadscummvm-rg350-56153086e5be87cd0542c620cd5417b1d4779f41.tar.gz
scummvm-rg350-56153086e5be87cd0542c620cd5417b1d4779f41.tar.bz2
scummvm-rg350-56153086e5be87cd0542c620cd5417b1d4779f41.zip
Add code for displaying stastics in Elvira 1
svn-id: r24188
Diffstat (limited to 'engines')
-rw-r--r--engines/agos/agos.cpp2
-rw-r--r--engines/agos/agos.h13
-rw-r--r--engines/agos/debug.h10
-rw-r--r--engines/agos/items.cpp46
-rw-r--r--engines/agos/string.cpp130
5 files changed, 191 insertions, 10 deletions
diff --git a/engines/agos/agos.cpp b/engines/agos/agos.cpp
index 5cb721534f..f4e1ff24d7 100644
--- a/engines/agos/agos.cpp
+++ b/engines/agos/agos.cpp
@@ -378,6 +378,7 @@ AGOSEngine::AGOSEngine(OSystem *syst)
memset(_videoBuf1, 0, sizeof(_videoBuf1));
+ _dummyWindow = new WindowBlock;
_windowList = new WindowBlock[16];
memset(_lettersToPrintBuf, 0, sizeof(_lettersToPrintBuf));
@@ -724,6 +725,7 @@ AGOSEngine::~AGOSEngine() {
delete _dummyItem2;
delete _dummyItem3;
+ delete [] _dummyWindow;
delete [] _windowList;
delete _debugger;
diff --git a/engines/agos/agos.h b/engines/agos/agos.h
index b277087651..fece720eaf 100644
--- a/engines/agos/agos.h
+++ b/engines/agos/agos.h
@@ -439,6 +439,7 @@ protected:
int16 *_variableArray2;
int16 *_variableArrayPtr;
+ WindowBlock *_dummyWindow;
WindowBlock *_windowArray[8];
byte _fcsData1[8];
@@ -773,6 +774,13 @@ protected:
uint16 getBoxSize();
uint16 checkFit(char *Ptr, int width, int lines);
+ void printMonsterDamage();
+ void printPlayerDamage();
+ void printMonsterHit();
+ void printPlayerHit();
+ void printStats();
+ void writeChar(WindowBlock *window, int x, int y, int offs, int val);
+
byte *allocBlock(uint32 size);
void checkNoOverWrite();
void checkRunningAnims();
@@ -1062,11 +1070,16 @@ public:
void oe1_findMaster();
void oe1_nextMaster();
void oe1_setTime();
+ void oe1_ifTime();
void oe1_bitClear();
void oe1_bitSet();
void oe1_bitTest();
void oe1_zoneDisk();
void oe1_printStats();
+ void oe1_printPlayerDamage();
+ void oe1_printMonsterDamage();
+ void oe1_printPlayerHit();
+ void oe1_printMonsterHit();
void oe1_setStore();
// Opcodes, Elvira 2 only
diff --git a/engines/agos/debug.h b/engines/agos/debug.h
index 7b076f813e..ea74d4847a 100644
--- a/engines/agos/debug.h
+++ b/engines/agos/debug.h
@@ -353,7 +353,7 @@ static const char *const elvira1_opcodeNameTable[300] = {
NULL,
"|SET_TIME",
/* 260 */
- NULL,
+ "WJ|IF_TIME",
"IJ|IS_SIBLING_WITH_A",
"IWW|DO_CLASS_ICONS",
"WW|PLAY_TUNE",
@@ -368,14 +368,14 @@ static const char *const elvira1_opcodeNameTable[300] = {
"|PRINT_STATS",
"|STOP_TUNE",
/* 272 */
- NULL,
- NULL,
+ "|PRINT_PLAYER_DAMAGE",
+ "|PRINT_MONSTER_DAMAGE",
"|PAUSE",
"IW|COPY_SF",
/* 276 */
"W|RESTORE_ICONS",
- NULL,
- NULL,
+ "|PRINT_PLAYER_HIT",
+ "|PRINT_MONSTER_HIT",
"|FREEZE_ZONES",
/* 280 */
"II|SET_PARENT_SPECIAL",
diff --git a/engines/agos/items.cpp b/engines/agos/items.cpp
index 6d17693868..1f5c01a77b 100644
--- a/engines/agos/items.cpp
+++ b/engines/agos/items.cpp
@@ -306,12 +306,12 @@ void AGOSEngine::setupElvira1Opcodes(OpcodeProc *op) {
op[252] = &AGOSEngine::oe1_bitSet;
op[253] = &AGOSEngine::oe1_bitTest;
- op[259] = &AGOSEngine::oe1_setTime;
-
op[255] = &AGOSEngine::o_waitSync;
op[256] = &AGOSEngine::o_sync;
op[257] = &AGOSEngine::o_defObj;
+ op[259] = &AGOSEngine::oe1_setTime;
+ op[260] = &AGOSEngine::oe1_ifTime;
op[261] = &AGOSEngine::o_here;
op[262] = &AGOSEngine::o_doClassIcons;
op[263] = &AGOSEngine::o1_playTune;
@@ -323,15 +323,17 @@ void AGOSEngine::setupElvira1Opcodes(OpcodeProc *op) {
op[269] = &AGOSEngine::o_loadUserGame;
op[270] = &AGOSEngine::oe1_printStats;
op[271] = &AGOSEngine::o_stopTune;
-
+ op[272] = &AGOSEngine::oe1_printPlayerDamage;
+ op[273] = &AGOSEngine::oe1_printMonsterDamage;
op[274] = &AGOSEngine::o_pauseGame;
op[275] = &AGOSEngine::o_copysf;
op[276] = &AGOSEngine::o_restoreIcons;
-
+ op[277] = &AGOSEngine::oe1_printPlayerHit;
+ op[278] = &AGOSEngine::oe1_printMonsterHit;
op[279] = &AGOSEngine::o_freezeZones;
op[280] = &AGOSEngine::o_placeNoIcons;
op[281] = &AGOSEngine::o_clearTimers;
-
+ op[282] = &AGOSEngine::oe1_setStore;
op[283] = &AGOSEngine::o_isBox;
}
@@ -2025,6 +2027,19 @@ void AGOSEngine::oe1_setTime() {
time(&_timeStore);
}
+void AGOSEngine::oe1_ifTime() {
+ // 260: if time
+ time_t t;
+
+ uint a = getVarOrWord();
+ time(&t);
+ t -= a;
+ if (t >= _timeStore)
+ setScriptCondition(true);
+ else
+ setScriptCondition(false);
+}
+
void AGOSEngine::oe1_zoneDisk() {
// 267: set disk number of each zone
getVarOrWord();
@@ -2033,6 +2048,27 @@ void AGOSEngine::oe1_zoneDisk() {
void AGOSEngine::oe1_printStats() {
// 270: print stats
+ printStats();
+}
+
+void AGOSEngine::oe1_printPlayerDamage() {
+ // 272: print player damage
+ printStats();
+}
+
+void AGOSEngine::oe1_printMonsterDamage() {
+ // 273: print monster damage
+ printStats();
+}
+
+void AGOSEngine::oe1_printPlayerHit() {
+ // 277: print player hit
+ printStats();
+}
+
+void AGOSEngine::oe1_printMonsterHit() {
+ // 278: print monster hit
+ printStats();
}
void AGOSEngine::oe1_setStore() {
diff --git a/engines/agos/string.cpp b/engines/agos/string.cpp
index e47b6d2d87..63ed36e099 100644
--- a/engines/agos/string.cpp
+++ b/engines/agos/string.cpp
@@ -725,4 +725,134 @@ void AGOSEngine::printBox() {
changeWindow(0);
}
+// String code for statistics in Elvira 1
+void AGOSEngine::printMonsterDamage() {
+ WindowBlock *window = _dummyWindow;
+ window->flags = 1;
+
+ mouseOff();
+ writeChar(window, 36, 88, 2, _variableArray[442]);
+ mouseOn();
+}
+
+void AGOSEngine::printPlayerDamage() {
+ WindowBlock *window = _dummyWindow;
+ window->flags = 1;
+
+ mouseOff();
+ writeChar(window, 36, 38, 2, _variableArray[441]);
+ mouseOn();
+}
+
+void AGOSEngine::printMonsterHit() {
+ WindowBlock *window = _dummyWindow;
+ window->flags = 1;
+
+ mouseOff();
+ writeChar(window, 35, 166, 4, _variableArray[415]);
+ mouseOn();
+}
+
+void AGOSEngine::printPlayerHit() {
+ WindowBlock *window = _dummyWindow;
+ window->flags = 1;
+
+ mouseOff();
+ writeChar(window, 3, 166, 0, _variableArray[414]);
+ mouseOn();
+}
+
+void AGOSEngine::printStats() {
+ WindowBlock *window = _dummyWindow;
+ int val;
+
+ window->flags = 1;
+
+ mouseOff();
+
+ // Strength
+ val = _variableArray[0];
+ if (val < -99)
+ val = -99;
+ if (val > 99)
+ val = 99;
+ writeChar(window, 5, 133, 6, val);
+
+ // Resolution
+ val = _variableArray[1];
+ if (val < -99)
+ val = -99;
+ if (val > 99)
+ val = 99;
+ writeChar(window, 11, 133, 6, val);
+
+ // Dexterity
+ val = _variableArray[2];
+ if (val < -99)
+ val = -99;
+ if (val > 99)
+ val = 99;
+ writeChar(window, 18, 133, 0, val);
+
+ // Skill
+ val = _variableArray[3];
+ if (val < -99)
+ val = -99;
+ if (val > 99)
+ val = 99;
+ writeChar(window, 24, 133, 0, val);
+
+ // Life
+ val = _variableArray[5];
+ if (val < -99)
+ val = -99;
+ if (val > 99)
+ val = 99;
+ writeChar(window, 30, 133, 2, val);
+
+ // Experience
+ val = _variableArray[6];
+ if (val < -99)
+ val = -99;
+ if (val > 99)
+ val = 99;
+ writeChar(window, 36, 133, 4, val);
+
+ mouseOn();
+}
+
+void AGOSEngine::writeChar(WindowBlock *window, int x, int y, int offs, int val) {
+ int chr;
+
+ // Clear background of first digit
+ window->textColumnOffset = offs;
+ window->text_color = 0;
+ video_putchar_drawchar(window, x, y, 129);
+
+ if (val != -1) {
+ // Print first digit
+ chr = val / 10 + 48;
+ window->text_color = 15;
+ video_putchar_drawchar(window, x, y, chr);
+ }
+
+ offs += 6;
+ if (offs >= 7) {
+ offs -= 8;
+ x++;
+ }
+
+ // Clear background of second digit
+ window->textColumnOffset = offs;
+ window->text_color = 0;
+ video_putchar_drawchar(window, x, y, 129);
+
+ if (val != -1) {
+ // Print second digit
+ chr = val % 10 + 48;
+ window->text_color = 15;
+ video_putchar_drawchar(window, x, y, chr);
+ }
+}
+
} // End of namespace AGOS