scummvm/engines/toon/state.cpp

271 lines
6.8 KiB
C++

/* 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 <http://www.gnu.org/licenses/>.
*
*
* This file is dual-licensed.
* In addition to the GPLv3 license mentioned above, MojoTouch has
* exclusively licensed this code on March 23th, 2024, to be used in
* closed-source products.
* Therefore, any contributions (commits) to it will also be dual-licensed.
*
*/
#include "common/debug.h"
#include "toon/state.h"
#include "toon/toon.h"
namespace Toon {
void Location::save(Common::WriteStream *stream) {
stream->write(_cutaway, 64);
stream->write(_music, 64);
stream->write(_name, 64);
stream->writeSint16BE(_numRifBoxes);
stream->writeSint16BE(_numSceneAnimations);
stream->writeSByte(_visited);
for (int32 i = 0; i < _numRifBoxes * 2; i++) {
stream->writeSint16BE(_rifBoxesFlags[i]);
}
}
void Location::load(Common::ReadStream *stream) {
stream->read(_cutaway, 64);
stream->read(_music, 64);
stream->read(_name, 64);
_numRifBoxes = stream->readSint16BE();
_numSceneAnimations = stream->readSint16BE();
_visited = stream->readSByte();
for (int32 i = 0; i < _numRifBoxes * 2; i++) {
_rifBoxesFlags[i] = stream->readSint16BE();
}
}
State::State(void) {
for (int32 i = 0; i < 256; i++) {
_locations[i]._visited = false;
_locations[i]._numSceneAnimations = 0;
_locations[i]._numRifBoxes = 0;
}
memset(_gameFlag, 0, sizeof(_gameFlag));
memset(_gameGlobalData, -1, sizeof(_gameGlobalData));
for (int32 i = 0; i < 2; i++) {
_timerEnabled[i] = false;
_timerTimeout[i] = 0;
_timerDelay[i] = -1;
}
_lastVisitedScene = -1;
_currentScene = -1;
_currentScrollLock = false;
_currentScrollValue = 0;
_gameTimer = 0;
_currentChapter = 1;
_showConversationIcons = false;
_inMenu = false;
_inCloseUp = false;
_inConversation = false;
_mouseState = -1;
_mouseHidden = false;
_firstConverstationLine = false;
_sackVisible = false; // to change
_inCutaway = false;
_inInventory = false;
_numInventoryItems = 0; //To chhange
_numConfiscatedInventoryItems = 0;
_nextSpecialEnterX = -1;
_nextSpecialEnterY = -1;
#if 0
for (int i = 0; i < 30; i++) {
_inventory[i] = 90 + i;
if (_inventory[i] == 41)
_inventory[i] = 42;
}
_inventory[0] = 53;
_inventory[1] = 22;
_inventory[2] = 93;
_inventory[3] = 49;
_inventory[4] = 47;
_inventory[5] = 14;
_numInventoryItems = 6; //To change
#endif
memset(_conversationState, 0, sizeof(Conversation) * 60);
_conversationData = nullptr;
_currentConversationId = -1;
_exitConversation = true;
}
State::~State(void) {
}
int32 State::getGameFlag(int32 flagId) {
return (_gameFlag[flagId >> 3] & (1 << (flagId & 7))) != 0;
}
bool State::hasItemInInventory(int32 item) {
debugC(1, kDebugState, "hasItemInInventory(%d)", item);
for (int32 i = 0; i < _numInventoryItems; i++) {
if (_inventory[i] == item)
return true;
}
return false;
}
void State::save(Common::WriteStream *stream) {
for (int32 i = 0; i < 256; i++) {
_locations[i].save(stream);
}
for (int32 i = 0; i < 256; i++) {
stream->writeSint16BE(_gameGlobalData[i]);
}
for (int32 i = 0; i < 256; i++) {
stream->writeSint16BE(_gameFlag[i]);
}
stream->writeSint16BE(_lastVisitedScene);
stream->writeSint16BE(_currentScene);
stream->writeSint16BE(_currentScrollValue);
stream->writeSByte(_currentScrollLock);
for (int32 i = 0; i < 35; i++) {
stream->writeSint16BE(_inventory[i]);
}
for (int32 i = 0; i < 35; i++) {
stream->writeSint16BE(_confiscatedInventory[i]);
}
stream->writeSint32BE(_numInventoryItems);
stream->writeSint32BE(_numConfiscatedInventoryItems);
stream->writeSByte(_inCloseUp);
stream->writeSByte(_inCutaway);
stream->writeSByte(_inConversation);
stream->writeSByte(_inInventory);
stream->writeSByte(_showConversationIcons);
stream->writeSint16BE(_mouseState);
stream->writeSint16BE(_currentConversationId);
stream->writeSByte(_firstConverstationLine);
stream->writeSByte(_exitConversation);
stream->writeSByte(_mouseHidden);
stream->writeSByte(_sackVisible);
stream->writeSint32BE(_gameTimer);
stream->writeSByte(_currentChapter);
stream->writeByte(_timerEnabled[0]);
stream->writeByte(_timerEnabled[1]);
stream->writeSint32BE(_timerTimeout[0]);
stream->writeSint32BE(_timerTimeout[1]);
stream->writeSint32BE(_timerDelay[0]);
stream->writeSint32BE(_timerDelay[1]);
}
void State::load(Common::ReadStream *stream) {
for (int32 i = 0; i < 256; i++) {
_locations[i].load(stream);
}
for (int32 i = 0; i < 256; i++) {
_gameGlobalData[i] = stream->readSint16BE();
}
for (int32 i = 0; i < 256; i++) {
_gameFlag[i] = stream->readSint16BE();
}
_lastVisitedScene = stream->readSint16BE();
_currentScene = stream->readSint16BE();
_currentScrollValue = stream->readSint16BE();
_currentScrollLock = stream->readSByte();
for (int32 i = 0; i < 35; i++) {
_inventory[i] = stream->readSint16BE();
}
for (int32 i = 0; i < 35; i++) {
_confiscatedInventory[i] = stream->readSint16BE();
}
_numInventoryItems = stream->readSint32BE();
_numConfiscatedInventoryItems = stream->readSint32BE();
_inCloseUp = stream->readSByte();
_inCutaway = stream->readSByte();
_inConversation = stream->readSByte();
_inInventory = stream->readSByte();
_showConversationIcons = stream->readSByte();
_mouseState = stream->readSint16BE();
_currentConversationId = stream->readSint16BE();
_firstConverstationLine = stream->readSByte();
_exitConversation = stream->readSByte();
_mouseHidden = stream->readSByte();
_sackVisible = stream->readSByte();
_gameTimer = stream->readSint32BE();
_currentChapter = stream->readSByte();
_timerEnabled[0] = stream->readByte();
_timerEnabled[1] = stream->readByte();
_timerTimeout[0] = stream->readSint32BE();
_timerTimeout[1] = stream->readSint32BE();
_timerDelay[0] = stream->readSint32BE();
_timerDelay[1] = stream->readSint32BE();
}
void State::loadConversations(Common::ReadStream *stream) {
for (int32 i = 0; i < 60; i++) {
_conversationState[i].load(stream, _conversationData);
}
}
void State::saveConversations(Common::WriteStream *stream) {
for (int32 i = 0; i < 60; i++) {
_conversationState[i].save(stream, _conversationData);
}
}
} // End of namespace Toon