[Scummvm-git-logs] scummvm master -> 63845705a0fa306ca490ba27bdf41d2130b7e2b0
bluegr
noreply at scummvm.org
Thu Mar 17 23:37:12 UTC 2022
This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
b4c829db21 CHEWY: Use enum for load_atds()
63845705a0 CHEWY: Refactor the functionality for hiding dialog options
Commit: b4c829db212bcba4f5933e730de848e1e6205a40
https://github.com/scummvm/scummvm/commit/b4c829db212bcba4f5933e730de848e1e6205a40
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2022-03-17T23:55:32+02:00
Commit Message:
CHEWY: Use enum for load_atds()
Changed paths:
engines/chewy/dialogs/cinema.cpp
diff --git a/engines/chewy/dialogs/cinema.cpp b/engines/chewy/dialogs/cinema.cpp
index 758a14d3dc7..4840dd8e0ca 100644
--- a/engines/chewy/dialogs/cinema.cpp
+++ b/engines/chewy/dialogs/cinema.cpp
@@ -56,7 +56,7 @@ void Cinema::execute() {
getCutscenes(cutscenes);
_G(fontMgr)->setFont(_G(font6));
- _G(atds)->load_atds(98, 1);
+ _G(atds)->load_atds(98, ATS_DATA);
_G(room)->load_tgp(4, &_G(room_blk), 1, 0, GBOOK);
showCur();
Commit: 63845705a0fa306ca490ba27bdf41d2130b7e2b0
https://github.com/scummvm/scummvm/commit/63845705a0fa306ca490ba27bdf41d2130b7e2b0
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2022-03-18T00:51:03+02:00
Commit Message:
CHEWY: Refactor the functionality for hiding dialog options
Changed paths:
engines/chewy/atds.cpp
engines/chewy/atds.h
engines/chewy/inits.cpp
engines/chewy/menus.cpp
engines/chewy/resource.cpp
engines/chewy/resource.h
engines/chewy/t_event.cpp
diff --git a/engines/chewy/atds.cpp b/engines/chewy/atds.cpp
index 536359ca998..83340dab6b5 100644
--- a/engines/chewy/atds.cpp
+++ b/engines/chewy/atds.cpp
@@ -126,9 +126,6 @@ Atdsys::Atdsys() {
Atdsys::~Atdsys() {
for (int16 i = 0; i < MAX_HANDLE; i++) {
- if (i == ADH_HANDLE)
- continue;
-
close_handle(i);
}
@@ -373,18 +370,6 @@ 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 == ADH_DATA) {
- if (_atdsMem[mode])
- free(_atdsMem[mode]);
-
- // Set to nullptr on purpose, this shouldn't be used
- _atdsHandle[mode] = nullptr;
- // +3 bytes to signify the end of the stream (BLOCKENDE)
- _atdsMem[mode] = (char *)MALLOC(MAX_DIALOG_DATA_SIZE + 3);
- _adsBlock = (AdsBlock *)_atdsMem[mode];
- return;
- }
-
if (mode != INV_IDX_DATA)
tmp_adr = atds_adr(fname, 0, 20000);
@@ -409,9 +394,6 @@ void Atdsys::close_handle(int16 mode) {
_atdsHandle[mode] = nullptr;
for (int i = 0; i < MAX_HANDLE; ++i) {
- if (i == ADH_HANDLE)
- continue;
-
if (_atdsHandle[i] == stream)
_atdsHandle[i] = nullptr;
}
@@ -435,20 +417,6 @@ char *Atdsys::atds_adr(const char *fname, int16 chunkStart, int16 chunkNr) {
void Atdsys::load_atds(int16 chunkNr, int16 mode) {
char *txt_adr = _atdsMem[mode];
- if (mode == ADH_DATA) {
- Chunk *chunk = _dialogResource->getChunk(chunkNr);
- uint8 *chunkData = _dialogResource->getChunkData(chunkNr);
-
- assert(chunk->size <= MAX_DIALOG_DATA_SIZE);
- memcpy(_atdsMem[ADH_HANDLE], chunkData, chunk->size);
- delete[] chunkData;
-
- txt_adr[chunk->size] = (char)BLOCKENDE;
- txt_adr[chunk->size + 1] = (char)BLOCKENDE;
- txt_adr[chunk->size + 2] = (char)BLOCKENDE;
- return;
- }
-
ChunkHead Ch;
Common::SeekableReadStream *stream = dynamic_cast<Common::SeekableReadStream *>(_atdsHandle[mode]);
@@ -461,7 +429,7 @@ void Atdsys::load_atds(int16 chunkNr, int16 mode) {
if (Ch.size) {
if (stream->read(txt_adr, Ch.size) != Ch.size) {
error("load_atds error");
- } else if (mode != ADH_DATA) {
+ } else {
crypt(txt_adr, Ch.size);
}
}
@@ -474,10 +442,6 @@ void Atdsys::load_atds(int16 chunkNr, int16 mode) {
}
}
-void Atdsys::save_ads_header(int16 diaNr) {
- _dialogResource->updateChunk(diaNr, (byte *)_atdsMem[ADH_HANDLE]);
-}
-
void Atdsys::crypt(char *txt, uint32 size) {
uint8 *sp = (uint8 *)txt;
for (uint32 i = 0; i < size; i++) {
@@ -1186,20 +1150,7 @@ int16 Atdsys::ads_get_status() {
return _adsv._dialog;
}
-int16 Atdsys::check_item(int16 blockNr, int16 itemNr) {
- int16 ret = true;
- char *tmp_adr = _adsv._ptr;
- ads_search_block(blockNr, &tmp_adr);
- if (tmp_adr) {
- ads_search_item(itemNr, &tmp_adr);
- if (tmp_adr) {
- ret = true;
- }
- }
- return ret;
-}
-
-char **Atdsys::ads_item_ptr(int16 blockNr, int16 *retNr) {
+char **Atdsys::ads_item_ptr(uint16 dialogNum, int16 blockNr, int16 *retNr) {
*retNr = 0;
memset(_ePtr, 0, sizeof(char *) * ADS_MAX_BL_EIN);
if (_adsv._dialog != -1) {
@@ -1212,7 +1163,7 @@ char **Atdsys::ads_item_ptr(int16 blockNr, int16 *retNr) {
if (tmp_adr) {
char nr = tmp_adr[-1];
tmp_adr += sizeof(AadStrHeader);
- if (_adsBlock[blockNr]._show[(int16)nr] == true) {
+ if (_dialogResource->isItemShown(dialogNum, blockNr, (int16)nr)) {
_ePtr[*retNr] = tmp_adr;
_eNr[*retNr] = (int16)nr;
++(*retNr);
@@ -1225,7 +1176,7 @@ char **Atdsys::ads_item_ptr(int16 blockNr, int16 *retNr) {
return _ePtr;
}
-AdsNextBlk *Atdsys::ads_item_choice(int16 blockNr, int16 itemNr) {
+AdsNextBlk *Atdsys::ads_item_choice(uint16 dialogNum, int16 blockNr, int16 itemNr) {
_adsnb._blkNr = blockNr;
if (!_aadv._dialog) {
if (!_adsv._autoDia) {
@@ -1233,7 +1184,7 @@ AdsNextBlk *Atdsys::ads_item_choice(int16 blockNr, int16 itemNr) {
if (_adsv._blkPtr) {
if (start_ads_auto_dia(_adsv._blkPtr))
_adsv._autoDia = true;
- if (_G(bit)->is_bit((uint8)_adsBlock[blockNr]._control[_eNr[itemNr]], ADS_EXIT_BIT) == true) {
+ if (_dialogResource->hasExitBit(dialogNum, blockNr, _eNr[itemNr])) {
stop_ads();
_adsnb._endNr = _eNr[itemNr];
_adsnb._blkNr = -1;
@@ -1245,29 +1196,31 @@ AdsNextBlk *Atdsys::ads_item_choice(int16 blockNr, int16 itemNr) {
return &_adsnb;
}
-AdsNextBlk *Atdsys::calc_next_block(int16 blockNr, int16 itemNr) {
- if (_G(bit)->is_bit((uint8)_adsBlock[blockNr]._control[_eNr[itemNr]], ADS_SHOW_BIT) == false)
- _adsBlock[blockNr]._show[_eNr[itemNr]] = false;
+AdsNextBlk *Atdsys::calc_next_block(uint16 dialogNum, int16 blockNr, int16 itemNr) {
+ if (!_dialogResource->hasShowBit(dialogNum, blockNr, _eNr[itemNr]))
+ _dialogResource->setItemShown(dialogNum, blockNr, _eNr[itemNr], false);
_adsnb._endNr = _eNr[itemNr];
- if (_G(bit)->is_bit((uint8)_adsBlock[blockNr]._control[_eNr[itemNr]], ADS_RESTART_BIT) == true) {
+
+ if (_dialogResource->hasRestartBit(dialogNum, blockNr, _eNr[itemNr])) {
_adsnb._blkNr = 0;
_adsStackPtr = 0;
} else {
- if (_adsBlock[blockNr]._next[_eNr[itemNr]]) {
- _adsnb._blkNr = _adsBlock[blockNr]._next[_eNr[itemNr]];
+ const uint8 nextBlock = _dialogResource->getNextBlock(dialogNum, blockNr, _eNr[itemNr]);
+ if (nextBlock) {
+ _adsnb._blkNr = nextBlock;
int16 anzahl = 0;
while (!anzahl && _adsnb._blkNr != -1) {
anzahl = 0;
- ads_item_ptr(_adsnb._blkNr, &anzahl);
+ ads_item_ptr(dialogNum, _adsnb._blkNr, &anzahl);
if (!anzahl) {
- _adsnb._blkNr = return_block(_adsBlock);
+ _adsnb._blkNr = return_block(dialogNum);
}
}
} else {
- _adsnb._blkNr = return_block(_adsBlock);
+ _adsnb._blkNr = return_block(dialogNum);
}
}
_adsStack[_adsStackPtr] = _adsnb._blkNr;
@@ -1276,14 +1229,14 @@ AdsNextBlk *Atdsys::calc_next_block(int16 blockNr, int16 itemNr) {
return &_adsnb;
}
-int16 Atdsys::return_block(AdsBlock *ab) {
+int16 Atdsys::return_block(uint16 dialogNum) {
_adsStackPtr -= 1;
int16 ret = -1;
bool ende = false;
while (_adsStackPtr >= 0 && !ende) {
short blk_nr = _adsStack[_adsStackPtr];
int16 anz;
- ads_item_ptr(blk_nr, &anz);
+ ads_item_ptr(dialogNum, blk_nr, &anz);
if (anz) {
ret = blk_nr;
ende = true;
@@ -1359,27 +1312,11 @@ int16 Atdsys::start_ads_auto_dia(char *itemAdr) {
}
void Atdsys::hide_item(int16 diaNr, int16 blockNr, int16 itemNr) {
- if (_adsv._dialog == diaNr) {
- if (check_item(blockNr, itemNr))
- _adsBlock[blockNr]._show[itemNr] = false;
- } else {
- load_atds(diaNr, ADH_DATA);
- if (check_item(blockNr, itemNr))
- _adsBlock[blockNr]._show[itemNr] = false;
- save_ads_header(diaNr);
- }
+ _dialogResource->setItemShown(diaNr, blockNr, itemNr, false);
}
void Atdsys::show_item(int16 diaNr, int16 blockNr, int16 itemNr) {
- if (_adsv._dialog == diaNr) {
- if (check_item(blockNr, itemNr))
- _adsBlock[blockNr]._show[itemNr] = true;
- } else {
- load_atds(diaNr, ADH_DATA);
- if (check_item(blockNr, itemNr))
- _adsBlock[blockNr]._show[itemNr] = true;
- save_ads_header(diaNr);
- }
+ _dialogResource->setItemShown(diaNr, blockNr, itemNr, true);
}
int16 Atdsys::calc_inv_no_use(int16 curInv, int16 testNr, int16 mode) {
diff --git a/engines/chewy/atds.h b/engines/chewy/atds.h
index fec5cb88e12..afbab25150d 100644
--- a/engines/chewy/atds.h
+++ b/engines/chewy/atds.h
@@ -35,7 +35,6 @@ namespace Chewy {
#define AAD_DATA 0
#define ATS_DATA 1
#define ADS_DATA 2
-#define ADH_DATA 3
#define INV_USE_DATA 4
#define INV_IDX_DATA 5
#define INV_ATS_DATA 6
@@ -44,7 +43,6 @@ namespace Chewy {
#define AAD_HANDLE 0
#define ATS_HANDLE 1
#define ADS_HANDLE 2
-#define ADH_HANDLE 3
#define INV_USE_HANDLE 4
#define INV_IDX_HANDLE 5
#define INV_ATS_HANDLE 6
@@ -100,15 +98,6 @@ struct AdsDiaHeaders {
int16 _nr;
};
-#include "common/pack-start.h" // START STRUCT PACKING
-struct AdsBlock {
- bool _show[ADS_MAX_BL_EIN];
-
- uint8 _next[ADS_MAX_BL_EIN];
- uint8 _control[ADS_MAX_BL_EIN];
-} PACKED_STRUCT;
-#include "common/pack-end.h" // END STRUCT PACKING
-
struct AtdsVar {
int16 _silent = 0;
int16 *_delay = nullptr;
@@ -278,7 +267,6 @@ public:
void str_null2leer(char *strStart, char *strEnd);
char *atds_adr(const char *fname, int16 chunkStart, int16 chunkNr);
void load_atds(int16 chunkNr, int16 mode);
- void save_ads_header(int16 diaNr);
Common::Stream *pool_handle(const char *fname);
void set_handle(const char *fname, int16 mode, Common::Stream *handle, int16 chunkStart, int16 chunkNr);
@@ -310,17 +298,16 @@ public:
int16 aad_get_zeilen(char *str, int16 *txtLen);
bool ads_start(int16 diaNr);
void stop_ads();
- char **ads_item_ptr(int16 blockNr, int16 *retNr);
- AdsNextBlk *ads_item_choice(int16 blockNr, int16 itemNr);
- AdsNextBlk *calc_next_block(int16 blockNr, int16 itemNr);
+ char **ads_item_ptr(uint16 dialogNum, int16 blockNr, int16 *retNr);
+ AdsNextBlk *ads_item_choice(uint16 dialogNum, int16 blockNr, int16 itemNr);
+ AdsNextBlk *calc_next_block(uint16 dialogNum, int16 blockNr, int16 itemNr);
int16 ads_get_status();
void hide_item(int16 diaNr, int16 blockNr, int16 itemNr);
void show_item(int16 diaNr, int16 blockNr, int16 itemNr);
- int16 return_block(AdsBlock *ab);
+ int16 return_block(uint16 dialogNum);
void ads_search_block(int16 blockNr, char **ptr);
void ads_search_item(int16 itemNr, char **blkAdr);
int16 start_ads_auto_dia(char *itemAdr);
- int16 check_item(int16 blockNr, int16 itemNr);
int16 calc_inv_no_use(int16 curInv, int16 testNr, int16 mode);
int16 getStereoPos(int16 x);
void enableEvents(bool nr) {
@@ -350,7 +337,6 @@ private:
AtdsVar _atdsv;
char *_ePtr[ADS_MAX_BL_EIN] = { nullptr };
int16 _eNr[ADS_MAX_BL_EIN] = { 0 };
- AdsBlock *_adsBlock = nullptr;
AdsNextBlk _adsnb;
uint8 _adsStack[ADS_STACK_SIZE] = { 0 };
int16 _adsStackPtr;
diff --git a/engines/chewy/inits.cpp b/engines/chewy/inits.cpp
index 60424f65016..3ad100c4ab9 100644
--- a/engines/chewy/inits.cpp
+++ b/engines/chewy/inits.cpp
@@ -189,7 +189,6 @@ void init_atds() {
_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(atds)->open_handle("", ADH_DATA);
_G(spieler).AadSilent = 10;
_G(spieler).DelaySpeed = 5;
_G(spieler_vector)[P_CHEWY].Delay = _G(spieler).DelaySpeed;
diff --git a/engines/chewy/menus.cpp b/engines/chewy/menus.cpp
index f1719d9dcbe..f69418e3b44 100644
--- a/engines/chewy/menus.cpp
+++ b/engines/chewy/menus.cpp
@@ -271,24 +271,21 @@ void adsMenu() {
_G(cur_display) = false;
_G(ads_push) = true;
g_events->_mousePos.y = 159;
- AdsNextBlk *an_blk = _G(atds)->ads_item_choice(_G(ads_blk_nr), curY);
+ AdsNextBlk *an_blk = _G(atds)->ads_item_choice(_G(ads_dia_nr), _G(ads_blk_nr), curY);
if (an_blk->_blkNr == -1) {
selectDialogOption(_G(ads_dia_nr), _G(ads_blk_nr), an_blk->_endNr);
ads_ende(_G(ads_dia_nr), _G(ads_blk_nr), an_blk->_endNr);
stop_ads_dialog();
} else {
- an_blk = _G(atds)->calc_next_block(_G(ads_blk_nr), curY);
+ an_blk = _G(atds)->calc_next_block(_G(ads_dia_nr), _G(ads_blk_nr), curY);
selectDialogOption(_G(ads_dia_nr), _G(ads_blk_nr), an_blk->_endNr);
_G(ads_blk_nr) = an_blk->_blkNr;
- _G(ads_item_ptr) = _G(atds)->ads_item_ptr(_G(ads_blk_nr), &_G(ads_item_nr));
+ _G(ads_item_ptr) = _G(atds)->ads_item_ptr(_G(ads_dia_nr), _G(ads_blk_nr), &_G(ads_item_nr));
}
_G(det)->stop_detail(_G(talk_start_ani));
_G(det)->showStaticSpr(_G(talk_hide_static));
_G(talk_start_ani) = -1;
_G(talk_hide_static) = -1;
- if (_G(flags).AdsDialog == false) {
- _G(atds)->save_ads_header(_G(ads_dia_nr));
- }
}
break;
diff --git a/engines/chewy/resource.cpp b/engines/chewy/resource.cpp
index eeba93a1225..dffc771f300 100644
--- a/engines/chewy/resource.cpp
+++ b/engines/chewy/resource.cpp
@@ -335,11 +335,11 @@ DialogResource::~DialogResource() {
delete _dialogBuffer;
}
-DialogChunk *DialogResource::getDialog(uint block) {
- Chunk *chunk = &_chunkList[block];
+DialogChunk *DialogResource::getDialog(uint dialog, uint block) {
+ Chunk *chunk = &_chunkList[dialog];
DialogChunk *item = new DialogChunk();
- _dialogStream->seek(chunk->pos, SEEK_SET);
+ _dialogStream->seek(chunk->pos + 3 * 6 * block, SEEK_SET);
_dialogStream->read(item->show, 6);
_dialogStream->read(item->next, 6);
@@ -348,48 +348,55 @@ DialogChunk *DialogResource::getDialog(uint block) {
return item;
}
-bool DialogResource::isItemShown(uint block, uint num) {
- Chunk *chunk = &_chunkList[block];
-
- _dialogStream->seek(chunk->pos, SEEK_SET);
+bool DialogResource::isItemShown(uint dialog, uint block, uint num) {
+ DialogChunk *item = getDialog(dialog, block);
+ bool isShown = item->show[num];
+ delete item;
- _dialogStream->skip(num);
- return _dialogStream->readByte();
+ return isShown;
}
-void DialogResource::setItemShown(uint block, uint num, bool shown) {
- Chunk *chunk = &_chunkList[block];
+void DialogResource::setItemShown(uint dialog, uint block, uint num, bool shown) {
+ Chunk *chunk = &_chunkList[dialog];
- _dialogStream->seek(chunk->pos, SEEK_SET);
+ _dialogStream->seek(chunk->pos + 3 * 6 * block, SEEK_SET);
_dialogStream->skip(num);
_dialogStream->writeByte(shown ? 1 : 0);
}
-bool DialogResource::hasExitBit(uint block, uint num) {
- DialogChunk *item = getDialog(block);
+bool DialogResource::hasExitBit(uint dialog, uint block, uint num) {
+ DialogChunk *item = getDialog(dialog, block);
const bool isExit = (item->flags[num] & ADS_EXIT_BIT) != 0;
delete item;
return isExit;
}
-bool DialogResource::hasRestartBit(uint block, uint num) {
- DialogChunk *item = getDialog(block);
+bool DialogResource::hasRestartBit(uint dialog, uint block, uint num) {
+ DialogChunk *item = getDialog(dialog, block);
const bool isRestart = (item->flags[num] & ADS_RESTART_BIT) != 0;
delete item;
return isRestart;
}
-bool DialogResource::hasShowBit(uint block, uint num) {
- DialogChunk *item = getDialog(block);
+bool DialogResource::hasShowBit(uint dialog, uint block, uint num) {
+ DialogChunk *item = getDialog(dialog, block);
const bool isShown = (item->flags[num] & ADS_SHOW_BIT) != 0;
delete item;
return isShown;
}
+uint8 DialogResource::getNextBlock(uint dialog, uint block, uint num) {
+ DialogChunk *item = getDialog(dialog, block);
+ const uint8 next = item->next[num];
+ delete item;
+
+ return next;
+}
+
void DialogResource::loadStream(Common::SeekableReadStream *s) {
_dialogStream->seek(0, SEEK_SET);
_dialogStream->writeStream(s, _stream.size());
@@ -400,13 +407,4 @@ void DialogResource::saveStream(Common::WriteStream* s) {
s->writeStream(_dialogStream, _stream.size());
}
-void DialogResource::updateChunk(uint num, byte *data) {
- assert(num < _chunkList.size());
-
- Chunk *chunk = &_chunkList[num];
-
- _stream.seek(chunk->pos, SEEK_SET);
- _dialogStream->write(data, chunk->size);
-}
-
}
diff --git a/engines/chewy/resource.h b/engines/chewy/resource.h
index e6e64660cb1..cb746dc0738 100644
--- a/engines/chewy/resource.h
+++ b/engines/chewy/resource.h
@@ -208,12 +208,13 @@ public:
DialogResource(Common::String filename);
virtual ~DialogResource();
- DialogChunk *getDialog(uint block);
- bool isItemShown(uint block, uint num);
- void setItemShown(uint block, uint num, bool shown);
- bool hasExitBit(uint block, uint num);
- bool hasRestartBit(uint block, uint num);
- bool hasShowBit(uint block, uint num);
+ DialogChunk *getDialog(uint dialog, uint block);
+ bool isItemShown(uint dialog, uint block, uint num);
+ void setItemShown(uint dialog, uint block, uint num, bool shown);
+ bool hasExitBit(uint dialog, uint block, uint num);
+ bool hasRestartBit(uint dialog, uint block, uint num);
+ bool hasShowBit(uint dialog, uint block, uint num);
+ uint8 getNextBlock(uint dialog, uint block, uint num);
void loadStream(Common::SeekableReadStream *s);
void saveStream(Common::WriteStream *s);
@@ -222,10 +223,6 @@ public:
return _stream.size();
}
- // HACK: The following function allows direct access
- // to the stream, and should be removed
- void updateChunk(uint num, byte *data);
-
private:
Common::MemorySeekableReadWriteStream *_dialogStream;
byte *_dialogBuffer;
diff --git a/engines/chewy/t_event.cpp b/engines/chewy/t_event.cpp
index 3ab79707097..e4d3615fb02 100644
--- a/engines/chewy/t_event.cpp
+++ b/engines/chewy/t_event.cpp
@@ -34,10 +34,9 @@ int16 loadAdsDia(int16 diaNr) {
if (_G(flags).AdsDialog == false) {
bool tmp = _G(atds)->ads_start(diaNr);
if (tmp == true) {
- _G(atds)->load_atds(diaNr, ADH_DATA);
ret = true;
_G(ads_blk_nr) = 0;
- _G(ads_item_ptr) = _G(atds)->ads_item_ptr(_G(ads_blk_nr), &_G(ads_item_nr));
+ _G(ads_item_ptr) = _G(atds)->ads_item_ptr(diaNr, _G(ads_blk_nr), &_G(ads_item_nr));
_G(flags).AdsDialog = true;
_G(ads_push) = true;
_G(ads_tmp_dsp) = _G(spieler).DispFlag;
More information about the Scummvm-git-logs
mailing list