aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sword2/console.cpp12
-rw-r--r--sword2/console.h1
-rw-r--r--sword2/controls.cpp5
-rw-r--r--sword2/layers.cpp2
-rw-r--r--sword2/logic.cpp10
-rw-r--r--sword2/logic.h2
-rw-r--r--sword2/resman.cpp11
-rw-r--r--sword2/resman.h3
-rw-r--r--sword2/startup.cpp9
-rw-r--r--sword2/sword2.cpp27
-rw-r--r--sword2/sword2.h1
11 files changed, 48 insertions, 35 deletions
diff --git a/sword2/console.cpp b/sword2/console.cpp
index fdb0088751..990807712c 100644
--- a/sword2/console.cpp
+++ b/sword2/console.cpp
@@ -80,6 +80,7 @@ Debugger::Debugger(Sword2Engine *vm)
DCmd_Register("mem", &Debugger::Cmd_Mem);
DCmd_Register("tony", &Debugger::Cmd_Tony);
DCmd_Register("res", &Debugger::Cmd_Res);
+ DCmd_Register("reslist", &Debugger::Cmd_ResList);
DCmd_Register("starts", &Debugger::Cmd_Starts);
DCmd_Register("start", &Debugger::Cmd_Start);
DCmd_Register("s", &Debugger::Cmd_Start);
@@ -191,6 +192,17 @@ bool Debugger::Cmd_Res(int argc, const char **argv) {
return true;
}
+bool Debugger::Cmd_ResList(int argc, const char **argv) {
+ // By default, list only resources that are being held open.
+ uint minCount = 1;
+
+ if (argc > 1)
+ minCount = atoi(argv[1]);
+
+ _vm->_resman->listResources(minCount);
+ return true;
+}
+
bool Debugger::Cmd_Starts(int argc, const char **argv) {
_vm->_logic->conPrintStartMenu();
return true;
diff --git a/sword2/console.h b/sword2/console.h
index 396f7e5de4..dd95670264 100644
--- a/sword2/console.h
+++ b/sword2/console.h
@@ -87,6 +87,7 @@ protected:
bool Cmd_Mem(int argc, const char **argv);
bool Cmd_Tony(int argc, const char **argv);
bool Cmd_Res(int argc, const char **argv);
+ bool Cmd_ResList(int argc, const char **argv);
bool Cmd_Starts(int argc, const char **argv);
bool Cmd_Start(int argc, const char **argv);
bool Cmd_Info(int argc, const char **argv);
diff --git a/sword2/controls.cpp b/sword2/controls.cpp
index 6b8b5462b7..452dff64f4 100644
--- a/sword2/controls.cpp
+++ b/sword2/controls.cpp
@@ -1598,9 +1598,8 @@ void Gui::restartControl(void) {
// global variables
_vm->_resman->removeAll();
- // Reopen global variables resource & send address to interpreter -
- // it won't be moving
- _vm->_logic->resetScriptVars();
+ // Reopen global variables resource and player object
+ _vm->setupPersistentResources();
Logic::_scriptVars[DEMO] = temp_demo_flag;
diff --git a/sword2/layers.cpp b/sword2/layers.cpp
index b5070e7b32..c4cc23e085 100644
--- a/sword2/layers.cpp
+++ b/sword2/layers.cpp
@@ -58,7 +58,7 @@ int32 Sword2Engine::initBackground(int32 res, int32 new_palette) {
// The resources age every time a new room is entered.
_resman->passTime();
- _resman->expelOldResources();
+ _resman->expireOldResources();
clearFxQueue();
_graphics->waitForFade();
diff --git a/sword2/logic.cpp b/sword2/logic.cpp
index ef6855dc35..aa5f3c7627 100644
--- a/sword2/logic.cpp
+++ b/sword2/logic.cpp
@@ -32,16 +32,6 @@
namespace Sword2 {
/**
- * Reset the script variables. If the resource is already open, this won't do
- * anything, I beleive.
- */
-
-void Logic::resetScriptVars(void) {
- _scriptVars = (uint32 *) (_vm->_resman->openResource(1) + sizeof(StandardHeader));
- _vm->_resman->closeResource(1);
-}
-
-/**
* Do one cycle of the current session.
*/
diff --git a/sword2/logic.h b/sword2/logic.h
index 90992c7a6a..aac49a7404 100644
--- a/sword2/logic.h
+++ b/sword2/logic.h
@@ -197,8 +197,6 @@ public:
// could alternately use logic->looping of course
bool _choosing;
- void resetScriptVars(void);
-
void conPrintStartMenu(void);
void conStart(int start);
diff --git a/sword2/resman.cpp b/sword2/resman.cpp
index bd4eddd450..1882fa045e 100644
--- a/sword2/resman.cpp
+++ b/sword2/resman.cpp
@@ -633,7 +633,7 @@ uint32 ResourceManager::fetchLen(uint32 res) {
return file.readUint32LE();
}
-void ResourceManager::expelOldResources() {
+void ResourceManager::expireOldResources() {
int nuked = 0;
for (uint i = 0; i < _totalResFiles; i++) {
@@ -673,6 +673,15 @@ void ResourceManager::printConsoleClusters(void) {
Debug_Printf("Argh! No resources!\n");
}
+void ResourceManager::listResources(uint minCount) {
+ for (uint i = 0; i < _totalResFiles; i++) {
+ if (_resList[i].ptr && _resList[i].refCount >= minCount) {
+ StandardHeader *head = (StandardHeader *) _resList[i].ptr;
+ Debug_Printf("%-4d: %-35s refCount: %-3d age: %-2d\n", i, head->name, _resList[i].refCount, _resTime - _resList[i].refTime);
+ }
+ }
+}
+
void ResourceManager::examine(int res) {
if (res < 0 || res >= (int) _totalResFiles)
Debug_Printf("Illegal resource %d (there are %d resources 0-%d)\n", res, _totalResFiles, _totalResFiles - 1);
diff --git a/sword2/resman.h b/sword2/resman.h
index 35cca72ef2..e90b38916e 100644
--- a/sword2/resman.h
+++ b/sword2/resman.h
@@ -44,7 +44,7 @@ public:
bool checkValid(uint32 res);
uint32 fetchLen(uint32 res);
- void expelOldResources(void);
+ void expireOldResources(void);
void passTime(void);
@@ -60,6 +60,7 @@ public:
// ----console commands
void printConsoleClusters(void);
+ void listResources(uint minCount);
void examine(int res);
void kill(int res);
void killAll(bool wantInfo);
diff --git a/sword2/startup.cpp b/sword2/startup.cpp
index f5899c1dc9..c7b5a49ac3 100644
--- a/sword2/startup.cpp
+++ b/sword2/startup.cpp
@@ -21,6 +21,7 @@
#include "common/file.h"
#include "sword2/sword2.h"
#include "sword2/console.h"
+#include "sword2/defs.h"
#include "sword2/interpreter.h"
#include "sword2/logic.h"
#include "sword2/maketext.h"
@@ -188,8 +189,8 @@ void Logic::conStart(int start) {
_vm->_resman->removeAll();
- // Reopen global variables resource and send address to interpreter
- _vm->_logic->resetScriptVars();
+ // Reopen global variables resource and player object
+ _vm->setupPersistentResources();
// Free all the route memory blocks from previous game
_router->freeAllRouteMem();
@@ -201,7 +202,7 @@ void Logic::conStart(int start) {
}
// Open George
- char *raw_data_ad = (char *) _vm->_resman->openResource(8);
+ char *raw_data_ad = (char *) _vm->_resman->openResource(CUR_PLAYER_ID);
char *raw_script = (char *) _vm->_resman->openResource(_startList[start].start_res_id);
// Denotes script to run
@@ -211,7 +212,7 @@ void Logic::conStart(int start) {
runScript(raw_script, raw_data_ad, &null_pc);
_vm->_resman->closeResource(_startList[start].start_res_id);
- _vm->_resman->closeResource(8);
+ _vm->_resman->closeResource(CUR_PLAYER_ID);
// Make sure there's a mouse, in case restarting while mouse not
// available
diff --git a/sword2/sword2.cpp b/sword2/sword2.cpp
index e91ead0895..45a0f75edc 100644
--- a/sword2/sword2.cpp
+++ b/sword2/sword2.cpp
@@ -232,22 +232,23 @@ void Sword2Engine::errorString(const char *buf1, char *buf2) {
}
}
+/**
+ * The global script variables and player object should be kept open throughout
+ * the game, so that they are never expelled by the resource manager.
+ */
+
+void Sword2Engine::setupPersistentResources(void) {
+ Logic::_scriptVars = (uint32 *) (_resman->openResource(1) + sizeof(StandardHeader));
+ _resman->openResource(CUR_PLAYER_ID);
+}
+
int32 Sword2Engine::initialiseGame(void) {
// During normal gameplay, we care neither about mouse button releases
// nor the scroll wheel.
setEventFilter(RD_LEFTBUTTONUP | RD_RIGHTBUTTONUP | RD_WHEELUP | RD_WHEELDOWN);
- // initialise global script variables
- // res 1 is the globals list
- Logic::_scriptVars = (uint32 *) (_resman->openResource(1) + sizeof(StandardHeader));
-
- // DON'T CLOSE VARIABLES RESOURCE - KEEP IT OPEN AT VERY START OF
- // MEMORY SO IT CAN'T MOVE!
-
- // DON'T CLOSE PLAYER OBJECT RESOURCE - KEEP IT OPEN IN MEMORY SO IT
- // CAN'T MOVE!
-
- _resman->openResource(8);
+ // Initialise global script variables and player object
+ setupPersistentResources();
// Set up font resource variables for this language version
@@ -555,7 +556,7 @@ void Sword2Engine::startGame(void) {
uint32 null_pc = 1;
// open george object, ready for start script to reference
- raw_data_ad = (char *) _resman->openResource(8);
+ raw_data_ad = (char *) _resman->openResource(CUR_PLAYER_ID);
// open the ScreenManager object
raw_script = (char *) _resman->openResource(screen_manager_id);
@@ -567,7 +568,7 @@ void Sword2Engine::startGame(void) {
_resman->closeResource(screen_manager_id);
// close george
- _resman->closeResource(8);
+ _resman->closeResource(CUR_PLAYER_ID);
debug(5, "startGame() DONE.");
}
diff --git a/sword2/sword2.h b/sword2/sword2.h
index 0c7027847b..69cbc42b45 100644
--- a/sword2/sword2.h
+++ b/sword2/sword2.h
@@ -173,6 +173,7 @@ public:
Sword2Engine(GameDetector *detector, OSystem *syst);
~Sword2Engine();
void go(void);
+ void setupPersistentResources(void);
int32 initialiseGame(void);
bool _quit;