mirror of
https://github.com/scummvm/scummvm.git
synced 2026-06-20 05:45:29 +00:00
Added support for a short variant of Hot1FrSceneChange, which combines all the directional scene changes into one. Due to the weird way the data is combined, significant changes to the way ActionRecords are created had to be made.
286 lines
6.7 KiB
C++
286 lines
6.7 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/>.
|
|
*
|
|
*/
|
|
|
|
#include "engines/nancy/nancy.h"
|
|
#include "engines/nancy/util.h"
|
|
|
|
#include "engines/nancy/action/navigationrecords.h"
|
|
|
|
#include "engines/nancy/state/scene.h"
|
|
|
|
namespace Nancy {
|
|
namespace Action {
|
|
|
|
void SceneChange::readData(Common::SeekableReadStream &stream) {
|
|
_sceneChange.readData(stream);
|
|
}
|
|
|
|
void SceneChange::execute() {
|
|
NancySceneState.changeScene(_sceneChange);
|
|
_isDone = true;
|
|
}
|
|
|
|
void HotMultiframeSceneChange::readData(Common::SeekableReadStream &stream) {
|
|
SceneChange::readData(stream);
|
|
uint16 numHotspots = stream.readUint16LE();
|
|
|
|
_hotspots.reserve(numHotspots);
|
|
for (uint i = 0; i < numHotspots; ++i) {
|
|
_hotspots.push_back(HotspotDescription());
|
|
HotspotDescription &newDesc = _hotspots[i];
|
|
newDesc.readData(stream);
|
|
}
|
|
}
|
|
|
|
void HotMultiframeSceneChange::execute() {
|
|
switch (_state) {
|
|
case kBegin:
|
|
// turn main rendering on
|
|
_state = kRun;
|
|
// fall through
|
|
case kRun:
|
|
_hasHotspot = false;
|
|
for (uint i = 0; i < _hotspots.size(); ++i) {
|
|
if (_hotspots[i].frameID == NancySceneState.getSceneInfo().frameID) {
|
|
_hasHotspot = true;
|
|
_hotspot = _hotspots[i].coords;
|
|
}
|
|
}
|
|
break;
|
|
case kActionTrigger:
|
|
SceneChange::execute();
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Hot1FrSceneChange::readData(Common::SeekableReadStream &stream) {
|
|
if (!_isTerse) {
|
|
SceneChange::readData(stream);
|
|
_hotspotDesc.readData(stream);
|
|
} else {
|
|
_sceneChange.sceneID = stream.readUint16LE();
|
|
_sceneChange.continueSceneSound = kContinueSceneSound;
|
|
_sceneChange.listenerFrontVector.set(0, 0, 1);
|
|
readRect(stream, _hotspotDesc.coords);
|
|
}
|
|
}
|
|
|
|
void Hot1FrSceneChange::execute() {
|
|
switch (_state) {
|
|
case kBegin:
|
|
_hotspot = _hotspotDesc.coords;
|
|
_state = kRun;
|
|
// fall through
|
|
case kRun:
|
|
if (_hotspotDesc.frameID == NancySceneState.getSceneInfo().frameID) {
|
|
_hasHotspot = true;
|
|
} else {
|
|
_hasHotspot = false;
|
|
}
|
|
break;
|
|
case kActionTrigger:
|
|
SceneChange::execute();
|
|
break;
|
|
}
|
|
}
|
|
|
|
void HotMultiframeMultisceneChange::readData(Common::SeekableReadStream &stream) {
|
|
if (g_nancy->getGameType() <= kGameTypeNancy2) {
|
|
_onTrue._sceneChange.readData(stream);
|
|
_onFalse._sceneChange.readData(stream);
|
|
} else {
|
|
_onTrue.readData(stream, true);
|
|
_onFalse.readData(stream, true);
|
|
}
|
|
|
|
_condType = stream.readByte();
|
|
_conditionID = stream.readUint16LE();
|
|
_conditionPayload = stream.readByte();
|
|
uint numHotspots = stream.readUint16LE();
|
|
|
|
_hotspots.resize(numHotspots);
|
|
|
|
for (uint i = 0; i < numHotspots; ++i) {
|
|
_hotspots[i].readData(stream);
|
|
}
|
|
}
|
|
|
|
void HotMultiframeMultisceneChange::execute() {
|
|
switch (_state) {
|
|
case kBegin:
|
|
// set something to 1
|
|
_state = kRun;
|
|
// fall through
|
|
case kRun:
|
|
_hasHotspot = false;
|
|
|
|
for (HotspotDescription &desc : _hotspots) {
|
|
if (desc.frameID == NancySceneState.getSceneInfo().frameID) {
|
|
_hotspot = desc.coords;
|
|
_hasHotspot = true;
|
|
}
|
|
}
|
|
|
|
break;
|
|
case kActionTrigger: {
|
|
bool conditionMet = false;
|
|
switch (_condType) {
|
|
case kFlagEvent:
|
|
if (NancySceneState.getEventFlag(_conditionID, _conditionPayload)) {
|
|
conditionMet = true;
|
|
}
|
|
break;
|
|
case kFlagInventory:
|
|
if (NancySceneState.hasItem(_conditionID) == _conditionPayload) {
|
|
conditionMet = true;
|
|
}
|
|
break;
|
|
case kFlagCursor:
|
|
if (NancySceneState.getHeldItem() == _conditionPayload) {
|
|
conditionMet = true;
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (conditionMet) {
|
|
_onTrue.execute();
|
|
} else {
|
|
_onFalse.execute();
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void HotMultiframeMultisceneCursorTypeSceneChange::readData(Common::SeekableReadStream &stream) {
|
|
uint16 numScenes = stream.readUint16LE();
|
|
_scenes.resize(numScenes);
|
|
_cursorTypes.resize(numScenes);
|
|
for (uint i = 0; i < numScenes; ++i) {
|
|
_cursorTypes[i] = stream.readUint16LE();
|
|
_scenes[i].readData(stream);
|
|
}
|
|
|
|
stream.skip(2);
|
|
_defaultScene.readData(stream);
|
|
|
|
uint16 numHotspots = stream.readUint16LE();
|
|
_hotspots.resize(numHotspots);
|
|
for (uint i = 0; i < numHotspots; ++i) {
|
|
_hotspots[i].readData(stream);
|
|
}
|
|
}
|
|
|
|
void HotMultiframeMultisceneCursorTypeSceneChange::execute() {
|
|
switch (_state) {
|
|
case kBegin:
|
|
// turn main rendering on
|
|
_state = kRun;
|
|
// fall through
|
|
case kRun:
|
|
_hasHotspot = false;
|
|
for (uint i = 0; i < _hotspots.size(); ++i) {
|
|
if (_hotspots[i].frameID == NancySceneState.getSceneInfo().frameID) {
|
|
_hasHotspot = true;
|
|
_hotspot = _hotspots[i].coords;
|
|
}
|
|
}
|
|
break;
|
|
case kActionTrigger:
|
|
for (uint i = 0; i < _cursorTypes.size(); ++i) {
|
|
if (NancySceneState.getHeldItem() == _cursorTypes[i]) {
|
|
NancySceneState.changeScene(_scenes[i]);
|
|
|
|
_isDone = true;
|
|
return;
|
|
}
|
|
}
|
|
|
|
NancySceneState.changeScene(_defaultScene);
|
|
_isDone = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void MapCall::readData(Common::SeekableReadStream &stream) {
|
|
stream.skip(1);
|
|
}
|
|
|
|
void MapCall::execute() {
|
|
_execType = kRepeating;
|
|
NancySceneState.requestStateChange(NancyState::kMap);
|
|
finishExecution();
|
|
}
|
|
|
|
void MapCallHot1Fr::readData(Common::SeekableReadStream &stream) {
|
|
_hotspotDesc.readData(stream);
|
|
}
|
|
|
|
void MapCallHot1Fr::execute() {
|
|
switch (_state) {
|
|
case kBegin:
|
|
_hotspot = _hotspotDesc.coords;
|
|
_state = kRun;
|
|
// fall through
|
|
case kRun:
|
|
if (_hotspotDesc.frameID == NancySceneState.getSceneInfo().frameID) {
|
|
_hasHotspot = true;
|
|
}
|
|
break;
|
|
case kActionTrigger:
|
|
MapCall::execute();
|
|
break;
|
|
}
|
|
}
|
|
|
|
void MapCallHotMultiframe::readData(Common::SeekableReadStream &stream) {
|
|
uint16 numDescs = stream.readUint16LE();
|
|
_hotspots.reserve(numDescs);
|
|
for (uint i = 0; i < numDescs; ++i) {
|
|
_hotspots.push_back(HotspotDescription());
|
|
_hotspots[i].readData(stream);
|
|
}
|
|
}
|
|
|
|
void MapCallHotMultiframe::execute() {
|
|
switch (_state) {
|
|
case kBegin:
|
|
_state = kRun;
|
|
// fall through
|
|
case kRun:
|
|
_hasHotspot = false;
|
|
for (uint i = 0; i < _hotspots.size(); ++i) {
|
|
if (_hotspots[i].frameID == NancySceneState.getSceneInfo().frameID) {
|
|
_hasHotspot = true;
|
|
_hotspot = _hotspots[i].coords;
|
|
}
|
|
}
|
|
break;
|
|
case kActionTrigger:
|
|
MapCall::execute();
|
|
break;
|
|
}
|
|
}
|
|
|
|
} // End of namespace Action
|
|
} // End of namespace Nancy
|