aboutsummaryrefslogtreecommitdiff
path: root/sword1/objectman.cpp
diff options
context:
space:
mode:
authorRobert Göffringmann2003-12-16 02:10:15 +0000
committerRobert Göffringmann2003-12-16 02:10:15 +0000
commit189e08bc7985fc5664e7ab95195bbade07488f48 (patch)
treef12049da0a8e600bcdd425e4c314c50b5c9922f7 /sword1/objectman.cpp
parentc3a9b2df6789055325b7fea6dd591cea1d419682 (diff)
downloadscummvm-rg350-189e08bc7985fc5664e7ab95195bbade07488f48.tar.gz
scummvm-rg350-189e08bc7985fc5664e7ab95195bbade07488f48.tar.bz2
scummvm-rg350-189e08bc7985fc5664e7ab95195bbade07488f48.zip
Broken Sword 1: initial import
svn-id: r11664
Diffstat (limited to 'sword1/objectman.cpp')
-rw-r--r--sword1/objectman.cpp133
1 files changed, 133 insertions, 0 deletions
diff --git a/sword1/objectman.cpp b/sword1/objectman.cpp
new file mode 100644
index 0000000000..94fa4b65dd
--- /dev/null
+++ b/sword1/objectman.cpp
@@ -0,0 +1,133 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2003 The ScummVM project
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Header$
+ *
+ */
+
+#include "stdafx.h"
+#include "objectman.h"
+#include "scummsys.h"
+#include "common/util.h"
+#include "sworddefs.h"
+#include "swordres.h"
+#include "sword1.h"
+
+ObjectMan::ObjectMan(ResMan *pResourceMan) {
+ _resMan = pResourceMan;
+ for (uint16 cnt = 0; cnt < TOTAL_SECTIONS; cnt++)
+ _liveList[cnt] = 0;
+
+ _liveList[128] = _liveList[129] = _liveList[130] = _liveList[131] = _liveList[133] =
+ _liveList[134] = _liveList[145] = _liveList[146] = _liveList[TEXT_sect] = 1;
+
+ for (uint16 cnt = 0; cnt < TOTAL_SECTIONS; cnt++) {
+ if (_liveList[cnt])
+ _cptData[cnt] = (uint8*)_resMan->cptResOpen(_objectList[cnt]) + sizeof(Header);
+ else
+ _cptData[cnt] = NULL;
+ }
+
+}
+
+ObjectMan::~ObjectMan(void) {
+ for (uint16 cnt = 0; cnt < TOTAL_SECTIONS; cnt++)
+ if (_liveList[cnt])
+ _resMan->resClose(_objectList[cnt]);
+}
+
+bool ObjectMan::sectionAlive(uint16 section) {
+ return (_liveList[section] > 0);
+}
+
+void ObjectMan::megaEntering(uint16 section) {
+ _liveList[section]++;
+ if (_liveList[section] == 1)
+ _cptData[section] = ((uint8*)_resMan->cptResOpen(_objectList[section])) + sizeof(Header);
+}
+
+void ObjectMan::megaLeaving(uint16 section, int id) {
+ if (_liveList[section] == 0)
+ error("mega %d is leaving empty section %d", id, section);
+ _liveList[section]--;
+ if ((_liveList[section] == 0) && (id != PLAYER)) {
+ _resMan->resClose(_liveList[section]);
+ _cptData[section] = NULL;
+ }
+ /* if the player is leaving the section then we have to close the resources after
+ mainloop ends, because the screen will still need the resources*/
+}
+
+uint8 ObjectMan::fnCheckForTextLine(uint32 textId) {
+ uint8 retVal = 0;
+ if (!_textList[textId / ITM_PER_SEC][0])
+ return 0; // section does not exist
+
+ uint8 lang = SwordEngine::_systemVars.language;
+ uint32 *textData = (uint32*)((uint8*)_resMan->openFetchRes(_textList[textId / ITM_PER_SEC][lang]) + sizeof(Header));
+ if ((textId & ITM_ID) < READ_LE_UINT32(textData)) {
+ textData++;
+ if (textData[textId & ITM_ID])
+ retVal = 1;
+ }
+ _resMan->resClose(_textList[textId / ITM_PER_SEC][lang]);
+ return retVal;
+}
+
+char *ObjectMan::lockText(uint32 textId) {
+ uint8 lang = SwordEngine::_systemVars.language;
+ char *addr = (char*)_resMan->openFetchRes(_textList[textId / ITM_PER_SEC][lang]) + sizeof(Header);
+ if ((textId & ITM_ID) >= READ_LE_UINT32(addr)) {
+ warning("ObjectMan::lockText(%d): only %d texts in file", textId & ITM_ID, READ_LE_UINT32(addr));
+ textId = 0; // get first line instead
+ }
+ uint32 offset = READ_LE_UINT32(addr + ((textId & ITM_ID) + 1)* 4);
+ if (offset == 0)
+ warning("ObjectMan::lockText(%d): text number has no text lines", textId);
+ return addr + offset;
+}
+
+void ObjectMan::unlockText(uint32 textId) {
+ _resMan->resClose(_textList[textId / ITM_PER_SEC][SwordEngine::_systemVars.language]);
+}
+
+uint32 ObjectMan::lastTextNumber(int section) {
+ uint8 *data = (uint8*)_resMan->openFetchRes(_textList[section][SwordEngine::_systemVars.language]) + sizeof(Header);
+ uint32 result = READ_LE_UINT32(data) - 1;
+ _resMan->resClose(_textList[section][SwordEngine::_systemVars.language]);
+ return result;
+}
+
+BsObject *ObjectMan::fetchObject(uint32 id) {
+ uint8 *addr = _cptData[id / ITM_PER_SEC];
+ if (!addr)
+ error("fetchObject: section %d is not open!", id / ITM_PER_SEC);
+ id &= ITM_ID;
+ // DON'T do endian conversion here. it's already done.
+ return (BsObject*)(addr + *(uint32*)(addr + (id + 1)*4));
+}
+
+uint32 ObjectMan::fetchNoObjects(int section) {
+ if (_cptData[section] == NULL)
+ error("fetchNoObjects: section %d is not open!", section);
+ return *(uint32*)_cptData[section];
+}
+
+void ObjectMan::closeSection(uint32 screen) {
+ if (_liveList[screen] == 0) // close the section that PLAYER has just left, if it's empty now
+ _resMan->resClose(_objectList[screen]);
+}