/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* 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 3 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, see .
*
*/
#ifndef CHEWY_ATDS_H
#define CHEWY_ATDS_H
#include "common/str.h"
#include "common/str-array.h"
#include "chewy/resource.h"
#include "chewy/text.h"
namespace Chewy {
#define ATDS_VOC_OFFSET 20
#define AAD_MAX_PERSON 10
#define AAD_STR_START 0
#define AAD_STR_END 1
#define AAD_DATA 0
#define ATS_DATA 1
#define DIALOG_CLOSEUP_DATA 2 // ADS_DATA
#define INV_USE_DATA 4
#define INV_ATS_DATA 6
#define MAX_HANDLE 8
#define AAD_HANDLE 0
#define ADS_HANDLE 2
#define MAX_STR_SPLIT 10
#define SPLIT_CENTER 1
#define SPLIT_LEFT 2
#define ATDS_END_LINE 0
#define ATDS_END_BLOCK 0x0b
#define ATDS_END_ENTRY 0x0c
#define ATDS_END_TEXT 0x0d
#define ATDS_END 0x0e
#define BLOCKENDE 0x0f
#define MAX_ATS_ROOM 100
#define ATS_ACTIVE_BIT 1
#define ATS_COUNT_BIT 2
#define ATS_RESET_BIT 4
#define ATS_ACTION_BIT 8
#define MAX_ATS_STATUS 3
#define TXT_MARK_NAME 0
#define TXT_MARK_LOOK 1
#define TXT_MARK_USE 2
#define TXT_MARK_WALK 3
#define TXT_MARK_TALK 4
#define CONTROL_BYTE 0xff
#define DIALOG_CLOSEUP_MAX 6
#define DIALOG_CLOSEUP_STACK_SIZE 50
#define ADS_EXIT_BIT 1
#define ADS_SHOW_BIT 2
#define ADS_RESTART_BIT 4
struct KbdMouseInfo;
class Text;
struct AtdsVar {
int16 _silent = 0;
int16 _delay = 1;
int16 _diaNr = 0;
bool _eventsEnabled = false;
int16 _vocNr = 0;
void (*aad_str)(int16 diaNr, int16 strNr, int16 personNr, int16 mode) = nullptr;
};
#define IUID_IIB 0
#define IUID_SIB 1
#define IUID_REC 2
#define IUID_AUTO 3
#define IUID_DET 4
#define IUID_PLAYER 5
#define INV_USE_DEF 16
struct AadInfo {
int16 _x;
int16 _y;
int16 _color;
AadInfo() : _x(0), _y(0), _color(0) {}
void load(Common::SeekableReadStream *src);
static constexpr int SIZE() { return 6; }
};
class AadInfoArray : public Common::Array {
public:
void load(const void *data, size_t count);
};
struct AadStrHeader {
int16 _akPerson;
int16 _vocNr;
};
// ADS (dialog closeup) header
struct DialogCloseupTxtHeader {
int16 _diaNr;
int16 _perNr;
int16 _aMov;
int16 _curNr;
bool load(const void *src);
static constexpr int SIZE() { return 8; }
};
struct DialogCloseupVariables {
int16 _dialog;
int16 _autoDia;
DialogCloseupTxtHeader _txtHeader;
AadInfoArray _person;
char *_ptr;
char *_blockPtr;
int16 _strNr;
int16 _delayCount;
int16 _silentCount;
};
struct DialogCloseupNextBlock {
int16 _blkNr;
int16 _endNr;
};
struct AadVar {
int16 _dialog;
DialogCloseupTxtHeader *_txtHeader;
AadStrHeader *_strHeader;
AadInfoArray _person;
char *_ptr;
int16 _strNr;
int16 _delayCount;
int16 _silentCount;
};
struct AtsTxtHeader {
uint16 _txtNr = 0;
int16 _aMov = 0;
int16 _curNr = 0;
bool load(Common::SeekableReadStream *src);
static constexpr int SIZE() { return 8; }
};
struct AtsVar {
AtsTxtHeader _txtHeader;
uint16 vocNum;
Common::String text;
int16 _delayCount;
int16 _silentCount;
int16 _color;
int16 _txtMode;
bool shown;
};
struct SplitStringRet {
char **_strPtr;
int16 *_x;
int16 _y;
short _nr;
int16 _next;
SplitStringRet() {
_strPtr = nullptr;
_x = nullptr;
_y = 0;
_nr = 0;
_next = 0;
}
};
struct SplitStringInit {
char *_str;
int16 _x;
int16 _y;
};
class Atdsys {
public:
Atdsys();
~Atdsys();
void set_delay(int16 *delay, int16 silent);
void set_split_win(int16 nr, int16 x, int16 y);
void split_string(SplitStringInit *ssi, SplitStringRet *ret);
void calc_txt_win(SplitStringInit *ssi);
void str_null2leer(char *strStart, char *strEnd);
void load_atds(int16 chunkNr, int16 mode);
void set_handle(int16 mode, int16 chunkStart, int16 chunkNr);
bool start_ats(int16 txtNr, int16 txtMode, int16 color, int16 mode, int16 *vocNr);
void stop_ats();
bool atsShown() { return _atsv.shown; }
void print_ats(int16 x, int16 y, int16 scrX, int16 scrY);
int16 getControlBit(int16 txtNr, int16 bitIdx);
void setControlBit(int16 txtNr, int16 bitIdx);
void delControlBit(int16 txtNr, int16 bitIdx);
void set_ats_str(int16 txtNr, int16 txtMode, int16 strNr, int16 mode);
void set_all_ats_str(int16 txtNr, int16 strNr, int16 mode);
int16 start_aad(int16 diaNr, bool continueWhenSpeechEnds = false);
void stopAad();
void print_aad(int16 scrX, int16 scrY);
int16 aadGetStatus();
void set_string_end_func(void (*strFunc)(int16 diaNr, int16 strNr, int16 personNr, int16 mode));
void aad_search_dia(int16 diaNr, char **ptr);
int16 aadGetTxtLen(char *str);
bool startDialogCloseup(int16 diaNr);
void stopDialogCloseup();
char **dialogCloseupItemPtr(uint16 dialogNum, int16 blockNr, int16 *retNr);
DialogCloseupNextBlock *dialogCloseupItemChoice(uint16 dialogNum, int16 blockNr, int16 itemNr);
DialogCloseupNextBlock *calcNextDialogCloseupBlock(uint16 dialogNum, int16 blockNr, int16 itemNr);
int16 getDialogCloseupStatus();
void hideDialogCloseupItem(int16 diaNr, int16 blockNr, int16 itemNr);
void showDialogCloseupItem(int16 diaNr, int16 blockNr, int16 itemNr);
int16 getDialogCloseupBlock(uint16 dialogNum);
void dialogCloseupSearchBlock(int16 blockNr, char **ptr);
void dialogCloseupSearchItem(int16 itemNr, char **blkAdr);
int16 startAutoDialogCloseup(char *itemAdr);
int16 calc_inv_no_use(int16 curInv, int16 testNr);
int8 getStereoPos(int16 x);
void enableEvents(bool nr) {
_atdsv._eventsEnabled = nr;
}
void saveAtdsStream(Common::WriteStream *stream);
void loadAtdsStream(Common::SeekableReadStream *stream);
uint32 getAtdsStreamSize() const;
Common::StringArray getTextArray(uint dialogNum, uint entryNum, int type, int subEntry = -1);
Common::String getTextEntry(uint dialogNum, uint entryNum, int type, int subEntry = -1);
int16 getLastSpeechId();
private:
void init();
int16 get_delay(int16 txt_len);
void initItemUseWith();
char *_atdsMem[MAX_HANDLE] = { nullptr };
int16 _atdsPoolOff[MAX_HANDLE] = { 0 };
AadVar _aadv;
AtsVar _atsv;
DialogCloseupVariables _dialogCloseup;
AtdsVar _atdsv;
char *_ePtr[DIALOG_CLOSEUP_MAX] = { nullptr };
int16 _eNr[DIALOG_CLOSEUP_MAX] = { 0 };
DialogCloseupNextBlock _dialogCloseupNextBlock;
uint8 _dialogCloseupStack[DIALOG_CLOSEUP_STACK_SIZE] = { 0 };
int16 _dialogCloseupStackPtr;
bool _continueWhenSpeechEnds = false;
SplitStringInit _ssi[AAD_MAX_PERSON] = {
{ nullptr, 100, 0 },
{ nullptr, 100, 0 },
{ nullptr, 100, 0 },
{ nullptr, 100, 0 },
{ nullptr, 100, 0 },
{ nullptr, 100, 0 },
{ nullptr, 100, 0 },
{ nullptr, 100, 0 },
{ nullptr, 100, 0 },
{ nullptr, 100, 0 },
};
char *_splitPtr[MAX_STR_SPLIT] = { nullptr };
int16 _splitX[MAX_STR_SPLIT] = { 0 };
int16 _invBlockNr;
int16 _mousePush = 0;
int _printDelayCount1 = 0;
DialogResource *_dialogResource;
Text *_text;
Common::HashMap _itemUseWithDesc;
};
} // namespace Chewy
#endif