mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-13 12:39:56 +00:00
271 lines
6.8 KiB
C++
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
|