VCRUISE: Add some more handling of unusual animations

This commit is contained in:
elasota 2024-02-10 11:14:33 -05:00
parent fa2dfbcd7b
commit b66044f2e7
3 changed files with 25 additions and 3 deletions

View File

@ -549,7 +549,7 @@ void AD2044MapLoader::unload() {
ScriptEnvironmentVars::ScriptEnvironmentVars() : lmb(false), lmbDrag(false), esc(false), exitToMenu(false), animChangeSet(false), isEntryScript(false), puzzleWasSet(false),
panInteractionID(0), fpsOverride(0), lastHighlightedItem(0), animChangeFrameOffset(0), animChangeNumFrames(0) {
panInteractionID(0), clickInteractionID(0), fpsOverride(0), lastHighlightedItem(0), animChangeFrameOffset(0), animChangeNumFrames(0) {
}
OSEvent::OSEvent() : type(kOSEventTypeInvalid), keyCode(static_cast<Common::KeyCode>(0)), keymappedEvent(kKeymappedEventNone), timestamp(0) {
@ -4154,7 +4154,9 @@ bool Runtime::dischargeIdleMouseMove() {
Common::SharedPtr<Script> script = findScriptForInteraction(interactionID);
if (script) {
activateScript(script, false, ScriptEnvironmentVars());
ScriptEnvironmentVars envVars;
envVars.clickInteractionID = interactionID;
activateScript(script, false, envVars);
return true;
}
}
@ -4186,6 +4188,7 @@ bool Runtime::dischargeIdleMouseDown() {
if (script) {
ScriptEnvironmentVars vars;
vars.lmbDrag = true;
vars.clickInteractionID = _idleInteractionID;
activateScript(script, false, vars);
return true;
@ -4233,6 +4236,7 @@ bool Runtime::dischargeIdleClick() {
if (script) {
ScriptEnvironmentVars vars;
vars.lmb = true;
vars.clickInteractionID = _idleInteractionID;
activateScript(script, false, vars);
return true;

View File

@ -179,6 +179,7 @@ struct ScriptEnvironmentVars {
ScriptEnvironmentVars();
uint panInteractionID;
uint clickInteractionID;
uint fpsOverride;
uint lastHighlightedItem;
uint animChangeFrameOffset;

View File

@ -34,6 +34,7 @@ struct AD2044UnusualAnimationRules {
enum Type {
kTypeLoop, // Loop the animation
kTypePlayFirstFrameOnly,
kTypeSkip,
};
uint roomNumber;
@ -44,7 +45,10 @@ struct AD2044UnusualAnimationRules {
};
AD2044UnusualAnimationRules g_unusualAnimationRules[] = {
{87, 0x69, 0xa3, 0xa5, AD2044UnusualAnimationRules::kTypePlayFirstFrameOnly},
// Room, screen, interaction, animation lookup ID, rule
{87, 0x24, 0xa4, 0xa7, AD2044UnusualAnimationRules::kTypePlayFirstFrameOnly}, // Taking cigarette, don't play box spin
{87, 0x68, 0xa3, 0xa5, AD2044UnusualAnimationRules::kTypeLoop}, // Loop lit cigarette animation
{87, 0x69, 0xa3, 0xa5, AD2044UnusualAnimationRules::kTypeSkip}, // Taking lit cigarette, don't play cycling animation
};
#ifdef PEEK_STACK
@ -2120,6 +2124,19 @@ void Runtime::scriptOpAnimAD2044(bool isForward) {
animDef.firstFrame = animRangeIt->_value.firstFrame;
animDef.lastFrame = animRangeIt->_value.lastFrame;
for (const AD2044UnusualAnimationRules &unusualAnimRule : g_unusualAnimationRules) {
if (static_cast<StackInt_t>(unusualAnimRule.animLookupID) == stackArgs[0] && unusualAnimRule.interactionID == _scriptEnv.clickInteractionID && unusualAnimRule.roomNumber == _roomNumber && unusualAnimRule.screenNumber == _screenNumber) {
switch (unusualAnimRule.ruleType) {
case AD2044UnusualAnimationRules::kTypePlayFirstFrameOnly:
animDef.lastFrame = animDef.firstFrame;
break;
default:
error("Unknown unusual animation rule");
}
break;
}
}
changeAnimation(animDef, animDef.firstFrame, true, _animSpeedDefault);
_gameState = kGameStateWaitingForAnimation;