diff options
Diffstat (limited to 'engines/agi/logic.cpp')
-rw-r--r-- | engines/agi/logic.cpp | 52 |
1 files changed, 26 insertions, 26 deletions
diff --git a/engines/agi/logic.cpp b/engines/agi/logic.cpp index 7429b117c8..c6dd04b814 100644 --- a/engines/agi/logic.cpp +++ b/engines/agi/logic.cpp @@ -30,56 +30,57 @@ namespace Agi { * into a message list. * @param n The number of the logic resource to decode. */ -int AgiEngine::decodeLogic(int n) { +int AgiEngine::decodeLogic(int16 logicNr) { int ec = errOK; int mstart, mend, mc; uint8 *m0; + AgiLogic *curLogic = &_game.logics[logicNr]; // decrypt messages at end of logic + build message list // report ("decoding logic #%d\n", n); - m0 = _game.logics[n].data; + m0 = curLogic->data; mstart = READ_LE_UINT16(m0) + 2; mc = *(m0 + mstart); mend = READ_LE_UINT16(m0 + mstart + 1); - m0 += mstart + 3; // cover header info + m0 += mstart + 3; // cover header info mstart = mc << 1; // if the logic was not compressed, decrypt the text messages // only if there are more than 0 messages - if ((~_game.dirLogic[n].flags & RES_COMPRESSED) && mc > 0) - decrypt(m0 + mstart, mend - mstart); // decrypt messages + if ((~_game.dirLogic[logicNr].flags & RES_COMPRESSED) && mc > 0) + decrypt(m0 + mstart, mend - mstart); // decrypt messages // build message list - m0 = _game.logics[n].data; - mstart = READ_LE_UINT16(m0) + 2; // +2 covers pointer - _game.logics[n].numTexts = *(m0 + mstart); + m0 = curLogic->data; + mstart = READ_LE_UINT16(m0) + 2; // +2 covers pointer + _game.logics[logicNr].numTexts = *(m0 + mstart); // resetp logic pointers - _game.logics[n].sIP = 2; - _game.logics[n].cIP = 2; - _game.logics[n].size = READ_LE_UINT16(m0) + 2; // logic end pointer + curLogic->sIP = 2; + curLogic->cIP = 2; + curLogic->size = READ_LE_UINT16(m0) + 2; // logic end pointer // allocate list of pointers to point into our data - _game.logics[n].texts = (const char **)calloc(1 + _game.logics[n].numTexts, sizeof(char *)); + curLogic->texts = (const char **)calloc(1 + curLogic->numTexts, sizeof(char *)); // cover header info m0 += mstart + 3; - if (_game.logics[n].texts != NULL) { + if (curLogic->texts != NULL) { // move list of strings into list to make real pointers - for (mc = 0; mc < _game.logics[n].numTexts; mc++) { + for (mc = 0; mc < curLogic->numTexts; mc++) { mend = READ_LE_UINT16(m0 + mc * 2); - _game.logics[n].texts[mc] = mend ? (const char *)m0 + mend - 2 : (const char *)""; + _game.logics[logicNr].texts[mc] = mend ? (const char *)m0 + mend - 2 : (const char *)""; } // set loaded flag now its all completly loaded - _game.dirLogic[n].flags |= RES_LOADED; + _game.dirLogic[logicNr].flags |= RES_LOADED; } else { // unload data // Note that not every logic has text - free(_game.logics[n].data); + free(curLogic->data); ec = errNotEnoughMemory; } @@ -92,18 +93,17 @@ int AgiEngine::decodeLogic(int n) { * memory chunks allocated for this resource. * @param n The number of the logic resource to unload */ -void AgiEngine::unloadLogic(int n) { - if (_game.dirLogic[n].flags & RES_LOADED) { - free(_game.logics[n].data); - if (_game.logics[n].numTexts) - free(_game.logics[n].texts); - _game.logics[n].numTexts = 0; - _game.dirLogic[n].flags &= ~RES_LOADED; +void AgiEngine::unloadLogic(int16 logicNr) { + if (_game.dirLogic[logicNr].flags & RES_LOADED) { + free(_game.logics[logicNr].data); + free(_game.logics[logicNr].texts); + _game.logics[logicNr].numTexts = 0; + _game.dirLogic[logicNr].flags &= ~RES_LOADED; } // if cached, we end up here - _game.logics[n].sIP = 2; - _game.logics[n].cIP = 2; + _game.logics[logicNr].sIP = 2; + _game.logics[logicNr].cIP = 2; } } // End of namespace Agi |