[Scummvm-git-logs] scummvm master -> 9cab6a68dac43f6e34b49c006babbdca7bc1e433
bluegr
noreply at scummvm.org
Fri Mar 18 07:22:04 UTC 2022
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
9cab6a68da CHEWY: Refactor the functionality for item usage descriptions
Commit: 9cab6a68dac43f6e34b49c006babbdca7bc1e433
https://github.com/scummvm/scummvm/commit/9cab6a68dac43f6e34b49c006babbdca7bc1e433
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2022-03-18T09:21:37+02:00
Commit Message:
CHEWY: Refactor the functionality for item usage descriptions
Changed paths:
engines/chewy/atds.cpp
engines/chewy/atds.h
engines/chewy/inits.cpp
diff --git a/engines/chewy/atds.cpp b/engines/chewy/atds.cpp
index 83340dab6b5..1bddd63ad53 100644
--- a/engines/chewy/atds.cpp
+++ b/engines/chewy/atds.cpp
@@ -41,13 +41,6 @@ bool AtsTxtHeader::load(Common::SeekableReadStream *src) {
return true;
}
-bool InvUse::load(Common::SeekableReadStream *src) {
- _objId = src->readSint16LE();
- _objNr = src->readSint16LE();
- _txtNr = src->readSint16LE();
- return true;
-}
-
void AadInfo::load(Common::SeekableReadStream *src) {
_x = src->readSint16LE();
_y = src->readSint16LE();
@@ -122,6 +115,8 @@ Atdsys::Atdsys() {
_adsnb._blkNr = 0;
_adsnb._endNr = 0;
_adsStackPtr = 0;
+
+ initItemUseWith();
}
Atdsys::~Atdsys() {
@@ -135,6 +130,29 @@ Atdsys::~Atdsys() {
delete _dialogResource;
}
+void Atdsys::initItemUseWith() {
+ int16 objA, objB, txtNum;
+
+ Common::File f;
+ f.open(INV_USE_IDX);
+
+ // The file is 25200 bytes, and contains 25200 / 50 / 6 = 84 blocks
+ int totalEntries = f.size() / 6;
+
+ for (int entry = 0; entry < totalEntries; entry++) {
+ objA = f.readSint16LE();
+ objB = f.readSint16LE();
+ txtNum = f.readSint16LE();
+
+ assert(objA <= 255 && objB <= 65535);
+
+ const uint32 key = (objA & 0xff) << 16 | objB;
+ _itemUseWithDesc[key] = txtNum;
+ }
+
+ f.close();
+}
+
void Atdsys::set_delay(int16 *delay, int16 silent) {
_atdsv._delay = delay;
_atdsv._silent = silent;
@@ -368,20 +386,13 @@ void Atdsys::set_handle(const char *fname, int16 mode, Common::Stream *handle, i
}
void Atdsys::open_handle(const char *fname, int16 mode) {
- char *tmp_adr = nullptr;
-
- if (mode != INV_IDX_DATA)
- tmp_adr = atds_adr(fname, 0, 20000);
+ _atdsMem[mode] = atds_adr(fname, 0, 20000);
Common::File *f = new Common::File();
f->open(fname);
if (f->isOpen()) {
close_handle(mode);
_atdsHandle[mode] = f;
- _atdsMem[mode] = tmp_adr;
-
- if (mode == INV_IDX_DATA)
- _atdsMem[INV_IDX_HANDLE] = (char *)MALLOC(INV_STRC_NR * sizeof(InvUse));
} else {
error("Error reading from %s", fname);
}
@@ -1320,44 +1331,17 @@ void Atdsys::show_item(int16 diaNr, int16 blockNr, int16 itemNr) {
}
int16 Atdsys::calc_inv_no_use(int16 curInv, int16 testNr, int16 mode) {
- int16 txt_nr = -1;
if (curInv != -1) {
if (_invBlockNr != curInv) {
_invBlockNr = curInv + 1;
load_atds(_invBlockNr + _atdsPoolOff[mode], INV_USE_DATA);
-
- Common::SeekableReadStream *rs = dynamic_cast<Common::SeekableReadStream *>(
- _atdsHandle[INV_IDX_HANDLE]);
- if (rs) {
- rs->seek(InvUse::SIZE() * _invBlockNr
- * INV_STRC_NR, SEEK_SET);
-
- InvUse *iu = (InvUse *)_atdsMem[INV_IDX_HANDLE];
- for (int16 i = 0; i < INV_STRC_NR; ++i, ++iu) {
- if (!iu->load(rs)) {
- error("calc_inv_no_use error");
- break;
- }
- }
- } else {
- error("calc_inv_no_use error");
- }
- }
-
- InvUse *iu = (InvUse *)_atdsMem[INV_IDX_HANDLE];
- bool ok = false;
-
- for (int16 i = 0; i < INV_STRC_NR && !ok; i++) {
- if (iu[i]._objId == mode) {
- if (iu[i]._objNr == testNr) {
- txt_nr = iu[i]._txtNr;
- ok = true;
- }
- }
}
}
- return txt_nr;
+ assert(mode <= 255 && testNr <= 65535);
+
+ const uint32 key = (mode & 0xff) << 16 | testNr;
+ return (_itemUseWithDesc.contains(key)) ? _itemUseWithDesc[key] : -1;
}
int16 Atdsys::getStereoPos(int16 x) {
diff --git a/engines/chewy/atds.h b/engines/chewy/atds.h
index afbab25150d..2c315d19931 100644
--- a/engines/chewy/atds.h
+++ b/engines/chewy/atds.h
@@ -36,7 +36,6 @@ namespace Chewy {
#define ATS_DATA 1
#define ADS_DATA 2
#define INV_USE_DATA 4
-#define INV_IDX_DATA 5
#define INV_ATS_DATA 6
#define MAX_HANDLE 8
@@ -44,7 +43,6 @@ namespace Chewy {
#define ATS_HANDLE 1
#define ADS_HANDLE 2
#define INV_USE_HANDLE 4
-#define INV_IDX_HANDLE 5
#define INV_ATS_HANDLE 6
#define ATDS_HANDLE 7
@@ -117,16 +115,6 @@ struct AtdsVar {
#define IUID_DET 4
#define IUID_PLAYER 5
#define INV_USE_DEF 16
-#define INV_STRC_NR 30
-
-struct InvUse {
- int16 _objId;
- int16 _objNr;
- int16 _txtNr;
-
- bool load(Common::SeekableReadStream *src);
- static constexpr int SIZE() { return 6; }
-};
struct AadInfo {
int16 _x;
@@ -323,6 +311,7 @@ public:
private:
int16 get_delay(int16 txt_len);
+ void initItemUseWith();
Common::Stream *_atdsHandle[MAX_HANDLE] = { nullptr };
char *_atdsMem[MAX_HANDLE] = { nullptr };
@@ -365,6 +354,8 @@ private:
int16 _mousePush = 0;
int _printDelayCount1 = 0;
DialogResource *_dialogResource;
+
+ Common::HashMap<uint32, uint16> _itemUseWithDesc;
};
} // namespace Chewy
diff --git a/engines/chewy/inits.cpp b/engines/chewy/inits.cpp
index 3ad100c4ab9..f8a16f5b8fb 100644
--- a/engines/chewy/inits.cpp
+++ b/engines/chewy/inits.cpp
@@ -188,7 +188,6 @@ void init_atds() {
_G(atds)->set_handle(ATDS_TXT, INV_USE_DATA, handle, USE_TAP_OFF, USE_TAP_MAX);
_G(atds)->init_ats_mode(INV_USE_DATA, _G(spieler).InvUse);
_G(atds)->init_ats_mode(INV_USE_DEF, _G(spieler).InvUseDef);
- _G(atds)->open_handle(INV_USE_IDX, INV_IDX_DATA);
_G(spieler).AadSilent = 10;
_G(spieler).DelaySpeed = 5;
_G(spieler_vector)[P_CHEWY].Delay = _G(spieler).DelaySpeed;
More information about the Scummvm-git-logs
mailing list