[Scummvm-git-logs] scummvm master -> 5fe1c35fe0878a5b7a4170db5ebd646463f7096a

mduggan noreply at scummvm.org
Mon Jan 3 10:17:41 UTC 2022


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
99261d855e ULTIMA8: Add Crusader single-key steps and rolls
5fe1c35fe0 ULTIMA8: Add No Regret easteregg ini option


Commit: 99261d855ef2ec7693f272a33afd2be1bdf76ffc
    https://github.com/scummvm/scummvm/commit/99261d855ef2ec7693f272a33afd2be1bdf76ffc
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2022-01-03T19:02:53+09:00

Commit Message:
ULTIMA8: Add Crusader single-key steps and rolls

Changed paths:
    engines/ultima/ultima8/meta_engine.cpp
    engines/ultima/ultima8/meta_engine.h
    engines/ultima/ultima8/misc/debugger.cpp
    engines/ultima/ultima8/misc/debugger.h
    engines/ultima/ultima8/world/actors/avatar_mover_process.h
    engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
    engines/ultima/ultima8/world/actors/cru_avatar_mover_process.h


diff --git a/engines/ultima/ultima8/meta_engine.cpp b/engines/ultima/ultima8/meta_engine.cpp
index e3d05b81209..26610d1000d 100644
--- a/engines/ultima/ultima8/meta_engine.cpp
+++ b/engines/ultima/ultima8/meta_engine.cpp
@@ -89,16 +89,21 @@ static const KeybindingRecord CRUSADER_KEYS[] = {
 	{ ACTION_ATTACK, "ATTACK", "Attack", "AvatarMoverProcess::startAttack", "AvatarMoverProcess::stopAttack", "SPACE", "KP0" },
 	{ ACTION_CAMERA_AVATAR, "CAMERA_AVATAR", "Focus Camera on Silencer", "CameraProcess::moveToAvatar", nullptr, "z", nullptr },
 	{ ACTION_JUMP, "JUMP", "Jump / Roll / Crouch", "AvatarMoverProcess::startJump", "AvatarMoverProcess::stopJump", "LCTRL", nullptr },
-	{ ACTION_SHORT_JUMP, "SHORT_JUMP", "Short Jump", "AvatarMoverProcess::shortJump", nullptr, "TAB", nullptr },
-	// TODO: MOVE_STEP should also be mapped to KP_DIVIDE?? Actually original key was advance, slightly different
+	{ ACTION_SHORT_JUMP, "SHORT_JUMP", "Short Jump", "AvatarMoverProcess::shortJump", nullptr, "TAB", "j" },
+	{ ACTION_STEP_LEFT, "STEP_LEFT", "Sidestep Left", "AvatarMoverProcess::stepLeft", nullptr, "DELETE", "KP7" },
+	{ ACTION_STEP_RIGHT, "STEP_RIGHT", "Sidestep Rgiht", "AvatarMoverProcess::stepRight", nullptr, "PAGEDOWN", "KP9" },
+	{ ACTION_STEP_FORWARD, "STEP_FORWARD", "Step Forward", "AvatarMoverProcess::stepForward", nullptr, "HOME", "KP_DIVIDE" },
+	{ ACTION_STEP_BACK, "STEP_BACK", "Step Back", "AvatarMoverProcess::stepBack", nullptr, "END", "KP2" },
+	{ ACTION_ROLL_LEFT, "ROLL_LEFT", "Roll Left", "AvatarMoverProcess::rollLeft", nullptr, "INSERT", "KP1" },
+	{ ACTION_ROLL_RIGHT, "ROLL_RIGHT", "Roll Right", "AvatarMoverProcess::rollRight", nullptr, "PAGEUP", "KP3" },
 	{ ACTION_MOVE_STEP, "MOVE_STEP", "Side Step / Advance / Retreat", "AvatarMoverProcess::startMoveStep", "AvatarMoverProcess::stopMoveStep", "LALT", "JOY_RIGHT_SHOULDER" },
 	{ ACTION_NONE, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }
 };
 
 static const KeybindingRecord CHEAT_KEYS[] = {
-	{ ACTION_CLIPPING, "CLIPPING", "Toggle Clipping", "QuickAvatarMoverProcess::toggleClipping", nullptr, "INSERT", nullptr },
-	{ ACTION_QUICK_MOVE_ASCEND, "ASCEND", "Ascend", "QuickAvatarMoverProcess::startAscend", "QuickAvatarMoverProcess::stopAscend", "HOME", nullptr },
-	{ ACTION_QUICK_MOVE_DESCEND, "DESCEND", "Descend", "QuickAvatarMoverProcess::startDescend", "QuickAvatarMoverProcess::stopDescend", "END", nullptr },
+	{ ACTION_CLIPPING, "CLIPPING", "Toggle Clipping", "QuickAvatarMoverProcess::toggleClipping", nullptr, "M+INSERT", nullptr },
+	{ ACTION_QUICK_MOVE_ASCEND, "ASCEND", "Ascend", "QuickAvatarMoverProcess::startAscend", "QuickAvatarMoverProcess::stopAscend", "M+HOME", nullptr },
+	{ ACTION_QUICK_MOVE_DESCEND, "DESCEND", "Descend", "QuickAvatarMoverProcess::startDescend", "QuickAvatarMoverProcess::stopDescend", "M+END", nullptr },
 	{ ACTION_QUICK_MOVE_UP, "MOVE_UP", "Move Up", "QuickAvatarMoverProcess::startMoveUp", "QuickAvatarMoverProcess::stopMoveUp", "M+UP", nullptr },
 	{ ACTION_QUICK_MOVE_DOWN, "MOVE_DOWN", "Move Down", "QuickAvatarMoverProcess::startMoveDown", "QuickAvatarMoverProcess::stopMoveDown", "M+DOWN", nullptr },
 	{ ACTION_QUICK_MOVE_LEFT, "MOVE_LEFT", "Move Left", "QuickAvatarMoverProcess::startMoveLeft", "QuickAvatarMoverProcess::stopMoveLeft", "M+LEFT", nullptr },
diff --git a/engines/ultima/ultima8/meta_engine.h b/engines/ultima/ultima8/meta_engine.h
index 5b6c5e00314..d862588e9d8 100644
--- a/engines/ultima/ultima8/meta_engine.h
+++ b/engines/ultima/ultima8/meta_engine.h
@@ -39,7 +39,8 @@ enum KeybindingAction {
 	ACTION_SHORT_JUMP, ACTION_TURN_LEFT, ACTION_TURN_RIGHT, ACTION_MOVE_FORWARD,
 	ACTION_MOVE_BACK, ACTION_MOVE_UP, ACTION_MOVE_DOWN, ACTION_MOVE_LEFT,
 	ACTION_MOVE_RIGHT, ACTION_MOVE_RUN, ACTION_MOVE_STEP, ACTION_ATTACK,
-	ACTION_CAMERA_AVATAR,
+	ACTION_STEP_LEFT, ACTION_STEP_RIGHT, ACTION_STEP_FORWARD,
+	ACTION_STEP_BACK, ACTION_ROLL_LEFT, ACTION_ROLL_RIGHT, ACTION_CAMERA_AVATAR,
 
 	ACTION_CLIPPING, ACTION_DEC_SORT_ORDER,
 	ACTION_INC_SORT_ORDER, ACTION_QUICK_MOVE_ASCEND, ACTION_QUICK_MOVE_DESCEND,
diff --git a/engines/ultima/ultima8/misc/debugger.cpp b/engines/ultima/ultima8/misc/debugger.cpp
index b9d8cf2df48..4883092ca20 100644
--- a/engines/ultima/ultima8/misc/debugger.cpp
+++ b/engines/ultima/ultima8/misc/debugger.cpp
@@ -89,7 +89,6 @@ Debugger::Debugger() : Shared::Debugger() {
 
 	registerCmd("AvatarMoverProcess::startJump", WRAP_METHOD(Debugger, cmdStartJump));
 	registerCmd("AvatarMoverProcess::stopJump", WRAP_METHOD(Debugger, cmdStopJump));
-	registerCmd("AvatarMoverProcess::shortJump", WRAP_METHOD(Debugger, cmdShortJump));
 	registerCmd("AvatarMoverProcess::startTurnLeft", WRAP_METHOD(Debugger, cmdStartTurnLeft));
 	registerCmd("AvatarMoverProcess::startTurnRight", WRAP_METHOD(Debugger, cmdStartTurnRight));
 	registerCmd("AvatarMoverProcess::startMoveForward", WRAP_METHOD(Debugger, cmdStartMoveForward));
@@ -115,6 +114,14 @@ Debugger::Debugger() : Shared::Debugger() {
 	registerCmd("AvatarMoverProcess::startAttack", WRAP_METHOD(Debugger, cmdStartAttack));
 	registerCmd("AvatarMoverProcess::stopAttack", WRAP_METHOD(Debugger, cmdStopAttack));
 
+	registerCmd("AvatarMoverProcess::shortJump", WRAP_METHOD(Debugger, cmdShortJump));
+	registerCmd("AvatarMoverProcess::stepLeft", WRAP_METHOD(Debugger, cmdStepLeft));
+	registerCmd("AvatarMoverProcess::stepRight", WRAP_METHOD(Debugger, cmdStepRight));
+	registerCmd("AvatarMoverProcess::stepForward", WRAP_METHOD(Debugger, cmdStepForward));
+	registerCmd("AvatarMoverProcess::stepBack", WRAP_METHOD(Debugger, cmdStepBack));
+	registerCmd("AvatarMoverProcess::rollLeft", WRAP_METHOD(Debugger, cmdRollLeft));
+	registerCmd("AvatarMoverProcess::rollRight", WRAP_METHOD(Debugger, cmdRollRight));
+
 	registerCmd("CameraProcess::moveToAvatar", WRAP_METHOD(Debugger, cmdCameraOnAvatar));
 
 	registerCmd("AudioProcess::listSFX", WRAP_METHOD(Debugger, cmdListSFX));
@@ -1201,28 +1208,6 @@ bool Debugger::cmdUseKeyring(int argc, const char **argv) {
 	return false;
 }
 
-bool Debugger::cmdStartAttack(int argc, const char **argv) {
-	Ultima8Engine *engine = Ultima8Engine::get_instance();
-	if (engine->isAvatarInStasis()) {
-		debugPrintf("Can't attack: avatarInStasis\n");
-		return false;
-	}
-	AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
-	if (proc) {
-		proc->setMovementFlag(AvatarMoverProcess::MOVE_ATTACKING);
-	}
-	return false;
-}
-
-bool Debugger::cmdStopAttack(int argc, const char **argv) {
-	Ultima8Engine *engine = Ultima8Engine::get_instance();
-	AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
-	if (proc) {
-		proc->clearMovementFlag(AvatarMoverProcess::MOVE_ATTACKING);
-	}
-	return false;
-}
-
 bool Debugger::cmdCameraOnAvatar(int argc, const char **argv) {
 	if (Ultima8Engine::get_instance()->isCruStasis()) {
 		debugPrintf("Can't move camera: cruStasis\n");
@@ -1238,302 +1223,155 @@ bool Debugger::cmdCameraOnAvatar(int argc, const char **argv) {
 	return false;
 }
 
-bool Debugger::cmdStartJump(int argc, const char **argv) {
+static bool _avatarMoveKey(uint32 flag, const char *debugname) {
 	Ultima8Engine *engine = Ultima8Engine::get_instance();
 	engine->moveKeyEvent();
 	if (engine->isAvatarInStasis()) {
-		debugPrintf("Can't jump: avatarInStasis\n");
+		debug("Can't %s: avatarInStasis\n", debugname);
 		return false;
 	}
 	AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
 
 	if (proc) {
-		proc->setMovementFlag(AvatarMoverProcess::MOVE_JUMP);
+		proc->setMovementFlag(flag);
 	}
 	return false;
 }
 
-
-bool Debugger::cmdStopJump(int argc, const char **argv) {
+static bool _avatarMoveKeyEnd(uint32 flag) {
 	Ultima8Engine *engine = Ultima8Engine::get_instance();
+	engine->moveKeyEvent();
 
 	AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
 	if (proc) {
-		proc->clearMovementFlag(AvatarMoverProcess::MOVE_JUMP);
+		proc->clearMovementFlag(flag);
 	}
 	return false;
 }
 
-bool Debugger::cmdShortJump(int argc, const char **argv) {
-	Ultima8Engine *engine = Ultima8Engine::get_instance();
+bool Debugger::cmdStartAttack(int argc, const char **argv) {
+	return _avatarMoveKey(AvatarMoverProcess::MOVE_ATTACKING, "attack");
+}
 
-	AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
-	if (proc) {
-		proc->setMovementFlag(AvatarMoverProcess::MOVE_SHORT_JUMP);
-	}
-	return false;
+bool Debugger::cmdStopAttack(int argc, const char **argv) {
+	return _avatarMoveKeyEnd(AvatarMoverProcess::MOVE_ATTACKING);
 }
 
+bool Debugger::cmdStartJump(int argc, const char **argv) {
+	return _avatarMoveKey(AvatarMoverProcess::MOVE_JUMP, "jump");
+}
 
-bool Debugger::cmdStartTurnLeft(int argc, const char **argv) {
-	Ultima8Engine *engine = Ultima8Engine::get_instance();
-	engine->moveKeyEvent();
-	if (engine->isAvatarInStasis()) {
-		debugPrintf("Can't turn left: avatarInStasis\n");
-		return false;
-	}
-	AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
+bool Debugger::cmdStopJump(int argc, const char **argv) {
+	return _avatarMoveKeyEnd(AvatarMoverProcess::MOVE_JUMP);
+}
 
-	if (proc) {
-		proc->setMovementFlag(AvatarMoverProcess::MOVE_TURN_LEFT);
-	}
-	return false;
+bool Debugger::cmdStartTurnLeft(int argc, const char **argv) {
+	return _avatarMoveKey(AvatarMoverProcess::MOVE_TURN_LEFT, "turn left");
 }
 
 bool Debugger::cmdStartTurnRight(int argc, const char **argv) {
-	Ultima8Engine *engine = Ultima8Engine::get_instance();
-	engine->moveKeyEvent();
-	if (engine->isAvatarInStasis()) {
-		debugPrintf("Can't turn right: avatarInStasis\n");
-		return false;
-	}
-	AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
-
-	if (proc) {
-		proc->setMovementFlag(AvatarMoverProcess::MOVE_TURN_RIGHT);
-	}
-	return false;
+	return _avatarMoveKey(AvatarMoverProcess::MOVE_TURN_RIGHT, "turn right");
 }
 
 bool Debugger::cmdStartMoveForward(int argc, const char **argv) {
-	Ultima8Engine *engine = Ultima8Engine::get_instance();
-	engine->moveKeyEvent();
-	if (engine->isAvatarInStasis()) {
-		debugPrintf("Can't move forward: avatarInStasis\n");
-		return false;
-	}
-	AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
-
-	if (proc) {
-		proc->setMovementFlag(AvatarMoverProcess::MOVE_FORWARD);
-	}
-	return false;
+	return _avatarMoveKey(AvatarMoverProcess::MOVE_FORWARD, "move forward");
 }
 
 bool Debugger::cmdStartMoveBack(int argc, const char **argv) {
-	Ultima8Engine *engine = Ultima8Engine::get_instance();
-	engine->moveKeyEvent();
-	if (engine->isAvatarInStasis()) {
-		debugPrintf("Can't move back: avatarInStasis\n");
-		return false;
-	}
-	AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
-
-	if (proc) {
-		proc->setMovementFlag(AvatarMoverProcess::MOVE_BACK);
-	}
-	return false;
+	return _avatarMoveKey(AvatarMoverProcess::MOVE_BACK, "move back");
 }
 
 bool Debugger::cmdStartMoveLeft(int argc, const char **argv) {
-	Ultima8Engine *engine = Ultima8Engine::get_instance();
-	engine->moveKeyEvent();
-	if (engine->isAvatarInStasis()) {
-		debugPrintf("Can't move left: avatarInStasis\n");
-		return false;
-	}
-	AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
-
-	if (proc) {
-		proc->setMovementFlag(AvatarMoverProcess::MOVE_LEFT);
-	}
-	return false;
+	return _avatarMoveKey(AvatarMoverProcess::MOVE_LEFT, "move left");
 }
 
 bool Debugger::cmdStartMoveRight(int argc, const char **argv) {
-	Ultima8Engine *engine = Ultima8Engine::get_instance();
-	engine->moveKeyEvent();
-	if (engine->isAvatarInStasis()) {
-		debugPrintf("Can't move right: avatarInStasis\n");
-		return false;
-	}
-	AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
-
-	if (proc) {
-		proc->setMovementFlag(AvatarMoverProcess::MOVE_RIGHT);
-	}
-	return false;
+	return _avatarMoveKey(AvatarMoverProcess::MOVE_RIGHT, "move right");
 }
 
 bool Debugger::cmdStartMoveUp(int argc, const char **argv) {
-	Ultima8Engine *engine = Ultima8Engine::get_instance();
-	engine->moveKeyEvent();
-	if (engine->isAvatarInStasis()) {
-		debugPrintf("Can't move up: avatarInStasis\n");
-		return false;
-	}
-	AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
-
-	if (proc) {
-		proc->setMovementFlag(AvatarMoverProcess::MOVE_UP);
-	}
-	return false;
+	return _avatarMoveKey(AvatarMoverProcess::MOVE_UP, "move up");
 }
 
 bool Debugger::cmdStartMoveDown(int argc, const char **argv) {
-	Ultima8Engine *engine = Ultima8Engine::get_instance();
-	engine->moveKeyEvent();
-	if (engine->isAvatarInStasis()) {
-		debugPrintf("Can't move down: avatarInStasis\n");
-		return false;
-	}
-	AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
-
-	if (proc) {
-		proc->setMovementFlag(AvatarMoverProcess::MOVE_DOWN);
-	}
-	return false;
+	return _avatarMoveKey(AvatarMoverProcess::MOVE_DOWN, "move down");
 }
 
 bool Debugger::cmdStopTurnLeft(int argc, const char **argv) {
-	Ultima8Engine *engine = Ultima8Engine::get_instance();
-	engine->moveKeyEvent();
-
-	AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
-	if (proc) {
-		proc->clearMovementFlag(AvatarMoverProcess::MOVE_TURN_LEFT);
-	}
-	return false;
+	return _avatarMoveKeyEnd(AvatarMoverProcess::MOVE_TURN_LEFT);
 }
 
 bool Debugger::cmdStopTurnRight(int argc, const char **argv) {
-	Ultima8Engine *engine = Ultima8Engine::get_instance();
-	engine->moveKeyEvent();
-
-	AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
-	if (proc) {
-		proc->clearMovementFlag(AvatarMoverProcess::MOVE_TURN_RIGHT);
-	}
-	return false;
+	return _avatarMoveKeyEnd(AvatarMoverProcess::MOVE_TURN_RIGHT);
 }
 
 bool Debugger::cmdStopMoveForward(int argc, const char **argv) {
-	Ultima8Engine *engine = Ultima8Engine::get_instance();
-	engine->moveKeyEvent();
-
-	AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
-	if (proc) {
-		proc->clearMovementFlag(AvatarMoverProcess::MOVE_FORWARD);
-	}
-	return false;
+	return _avatarMoveKeyEnd(AvatarMoverProcess::MOVE_FORWARD);
 }
 
 bool Debugger::cmdStopMoveBack(int argc, const char **argv) {
-	Ultima8Engine *engine = Ultima8Engine::get_instance();
-	engine->moveKeyEvent();
-
-	AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
-	if (proc) {
-		// Clear both back and forward as avatar turns then moves forward when not in combat
-		proc->clearMovementFlag(AvatarMoverProcess::MOVE_BACK | AvatarMoverProcess::MOVE_FORWARD);
-	}
-	return false;
+	// Clear both back and forward as avatar turns then moves forward when not in combat
+	return _avatarMoveKeyEnd(AvatarMoverProcess::MOVE_BACK | AvatarMoverProcess::MOVE_FORWARD);
 }
 
 bool Debugger::cmdStopMoveLeft(int argc, const char **argv) {
-	Ultima8Engine *engine = Ultima8Engine::get_instance();
-	engine->moveKeyEvent();
-
-	AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
-	if (proc) {
-		proc->clearMovementFlag(AvatarMoverProcess::MOVE_LEFT);
-	}
-	return false;
+	return _avatarMoveKeyEnd(AvatarMoverProcess::MOVE_LEFT);
 }
 
 bool Debugger::cmdStopMoveRight(int argc, const char **argv) {
-	Ultima8Engine *engine = Ultima8Engine::get_instance();
-	engine->moveKeyEvent();
-
-	AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
-	if (proc) {
-		proc->clearMovementFlag(AvatarMoverProcess::MOVE_RIGHT);
-	}
-	return false;
+	return _avatarMoveKeyEnd(AvatarMoverProcess::MOVE_RIGHT);
 }
 
 bool Debugger::cmdStopMoveUp(int argc, const char **argv) {
-	Ultima8Engine *engine = Ultima8Engine::get_instance();
-	engine->moveKeyEvent();
-
-	AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
-	if (proc) {
-		proc->clearMovementFlag(AvatarMoverProcess::MOVE_UP);
-	}
-	return false;
+	return _avatarMoveKeyEnd(AvatarMoverProcess::MOVE_UP);
 }
 
 bool Debugger::cmdStopMoveDown(int argc, const char **argv) {
-	Ultima8Engine *engine = Ultima8Engine::get_instance();
-	engine->moveKeyEvent();
-
-	AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
-	if (proc) {
-		proc->clearMovementFlag(AvatarMoverProcess::MOVE_DOWN);
-	}
-	return false;
+	return _avatarMoveKeyEnd(AvatarMoverProcess::MOVE_DOWN);
 }
 
 bool Debugger::cmdStartMoveRun(int argc, const char **argv) {
-	Ultima8Engine *engine = Ultima8Engine::get_instance();
-	engine->moveKeyEvent();
-	if (engine->isAvatarInStasis()) {
-		debugPrintf("Can't run: avatarInStasis\n");
-		return false;
-	}
-	AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
-
-	if (proc) {
-		proc->setMovementFlag(AvatarMoverProcess::MOVE_RUN);
-	}
-	return false;
+	return _avatarMoveKey(AvatarMoverProcess::MOVE_RUN, "run");
 }
 
 bool Debugger::cmdStopMoveRun(int argc, const char **argv) {
-	Ultima8Engine *engine = Ultima8Engine::get_instance();
-	engine->moveKeyEvent();
-
-	AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
-	if (proc) {
-		proc->clearMovementFlag(AvatarMoverProcess::MOVE_RUN);
-	}
-	return false;
+	return _avatarMoveKeyEnd(AvatarMoverProcess::MOVE_RUN);
 }
 
 bool Debugger::cmdStartMoveStep(int argc, const char **argv) {
-	Ultima8Engine *engine = Ultima8Engine::get_instance();
-	engine->moveKeyEvent();
-	if (engine->isAvatarInStasis()) {
-		debugPrintf("Can't step: avatarInStasis\n");
-		return false;
-	}
-	AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
-
-	if (proc) {
-		proc->setMovementFlag(AvatarMoverProcess::MOVE_STEP);
-	}
-	return false;
+	return _avatarMoveKey(AvatarMoverProcess::MOVE_STEP, "step");
 }
 
 bool Debugger::cmdStopMoveStep(int argc, const char **argv) {
-	Ultima8Engine *engine = Ultima8Engine::get_instance();
-	engine->moveKeyEvent();
+	return _avatarMoveKeyEnd(AvatarMoverProcess::MOVE_STEP);
+}
 
-	AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
-	if (proc) {
-		proc->clearMovementFlag(AvatarMoverProcess::MOVE_STEP);
-	}
-	return false;
+bool Debugger::cmdShortJump(int argc, const char **argv) {
+	return _avatarMoveKey(AvatarMoverProcess::MOVE_SHORT_JUMP, "short jump");
+}
+
+bool Debugger::cmdStepLeft(int argc, const char **argv) {
+	return _avatarMoveKey(AvatarMoverProcess::MOVE_STEP_LEFT, "step left");
+}
+
+bool Debugger::cmdStepRight(int argc, const char **argv) {
+	return _avatarMoveKey(AvatarMoverProcess::MOVE_STEP_RIGHT, "step right");
+}
+
+bool Debugger::cmdStepForward(int argc, const char **argv) {
+	return _avatarMoveKey(AvatarMoverProcess::MOVE_STEP_FORWARD, "step forward");
+}
+
+bool Debugger::cmdStepBack(int argc, const char **argv) {
+	return _avatarMoveKey(AvatarMoverProcess::MOVE_STEP_BACK, "step back");
+}
+
+bool Debugger::cmdRollLeft(int argc, const char **argv) {
+	return _avatarMoveKey(AvatarMoverProcess::MOVE_ROLL_LEFT, "roll left");
+}
+
+bool Debugger::cmdRollRight(int argc, const char **argv) {
+	return _avatarMoveKey(AvatarMoverProcess::MOVE_ROLL_RIGHT, "roll right");
 }
 
 bool Debugger::cmdToggleCombat(int argc, const char **argv) {
diff --git a/engines/ultima/ultima8/misc/debugger.h b/engines/ultima/ultima8/misc/debugger.h
index b2d541c4b1d..1f7c4a8fd97 100644
--- a/engines/ultima/ultima8/misc/debugger.h
+++ b/engines/ultima/ultima8/misc/debugger.h
@@ -149,7 +149,6 @@ private:
 	// Avatar mover
 	bool cmdStartJump(int argc, const char **argv);
 	bool cmdStopJump(int argc, const char **argv);
-	bool cmdShortJump(int argc, const char **argv);
 	bool cmdStartTurnLeft(int argc, const char **argv);
 	bool cmdStartTurnRight(int argc, const char **argv);
 	bool cmdStartMoveForward(int argc, const char **argv);
@@ -174,6 +173,15 @@ private:
 	bool cmdStartAttack(int argc, const char **argv);
 	bool cmdStopAttack(int argc, const char **argv);
 
+	// One-shot Avatar mover commands
+	bool cmdShortJump(int argc, const char **argv);
+	bool cmdStepLeft(int argc, const char **argv);
+	bool cmdStepRight(int argc, const char **argv);
+	bool cmdStepForward(int argc, const char **argv);
+	bool cmdStepBack(int argc, const char **argv);
+	bool cmdRollLeft(int argc, const char **argv);
+	bool cmdRollRight(int argc, const char **argv);
+
 	bool cmdCameraOnAvatar(int argc, const char **argv);
 
 	// Audio Process
diff --git a/engines/ultima/ultima8/world/actors/avatar_mover_process.h b/engines/ultima/ultima8/world/actors/avatar_mover_process.h
index bc880fc84ee..44917b24dc5 100644
--- a/engines/ultima/ultima8/world/actors/avatar_mover_process.h
+++ b/engines/ultima/ultima8/world/actors/avatar_mover_process.h
@@ -86,7 +86,14 @@ public:
 		MOVE_PENDING_TURN_LEFT  = 0x2000,
 		MOVE_PENDING_TURN_RIGHT = 0x4000,
 
-		MOVE_SHORT_JUMP = 0x8000, // Crusader only
+		// Single-button moves (Crusader only)
+		MOVE_SHORT_JUMP   = 0x008000,
+		MOVE_ROLL_LEFT    = 0x010000,
+		MOVE_ROLL_RIGHT   = 0x020000,
+		MOVE_STEP_LEFT    = 0x040000,
+		MOVE_STEP_RIGHT   = 0x080000,
+		MOVE_STEP_FORWARD = 0x100000,
+		MOVE_STEP_BACK    = 0x200000,
 
 		MOVE_ANY_DIRECTION = MOVE_MOUSE_DIRECTION | MOVE_FORWARD | MOVE_BACK | MOVE_LEFT | MOVE_RIGHT | MOVE_UP | MOVE_DOWN
 	};
diff --git a/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp b/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
index 254e4050c4c..1ae8f6c21c3 100644
--- a/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
@@ -142,6 +142,50 @@ static bool _isAnimStartRunning(Animation::Sequence anim) {
 			anim == Animation::startRunLargeWeapon*/);
 }
 
+bool CruAvatarMoverProcess::checkOneShotMove(Direction direction) {
+	Actor *avatar = getControlledActor();
+
+	static const MovementFlags oneShotFlags[] = {
+		MOVE_ROLL_LEFT, MOVE_ROLL_RIGHT,
+		MOVE_STEP_LEFT, MOVE_STEP_RIGHT,
+		MOVE_STEP_FORWARD, MOVE_STEP_BACK,
+		MOVE_SHORT_JUMP
+	};
+
+	static const Animation::Sequence oneShotAnims[] = {
+		Animation::combatRollLeft, Animation::combatRollRight,
+		Animation::slideLeft, Animation::slideRight,
+		Animation::advance, Animation::retreat,
+		Animation::jumpForward
+	};
+
+	for (int i = 0; i < ARRAYSIZE(oneShotFlags); i++) {
+		if (hasMovementFlags(oneShotFlags[i])) {
+			clearMovementFlag(oneShotFlags[i]);
+			Animation::Sequence anim = oneShotAnims[i];
+			if (avatar->isKneeling()) {
+				// TODO: check what should advance/retreat do here?
+				if (anim == Animation::combatRollLeft)
+					avatar->doAnim(Animation::kneelCombatRollLeft, direction);
+				else if (anim == Animation::combatRollLeft)
+					avatar->doAnim(Animation::kneelCombatRollRight, direction);
+				else if (anim == Animation::advance)
+					step(Animation::kneelingAdvance, direction);
+				else if (anim == Animation::retreat)
+					step(Animation::kneelingRetreat, direction);
+			} else {
+				if (anim == Animation::advance || anim == Animation::retreat)
+					step(anim, direction);
+				else
+					avatar->doAnim(anim, direction);
+			}
+			return true;
+		}
+	}
+
+	return false;
+}
+
 void CruAvatarMoverProcess::handleCombatMode() {
 	Actor *avatar = getControlledActor();
 	MainActor *mainactor = dynamic_cast<MainActor *>(avatar);
@@ -161,11 +205,10 @@ void CruAvatarMoverProcess::handleCombatMode() {
 	if (stasis)
 		return;
 
-	if (hasMovementFlags(MOVE_SHORT_JUMP)) {
-		clearMovementFlag(MOVE_SHORT_JUMP);
-		avatar->doAnim(Animation::jumpForward, direction);
+	if (checkOneShotMove(direction))
 		return;
-	} else if (hasMovementFlags(MOVE_FORWARD)) {
+
+	if (hasMovementFlags(MOVE_FORWARD)) {
 		Animation::Sequence nextanim;
 		if (hasMovementFlags(MOVE_STEP)) {
 			nextanim = avatar->isKneeling() ?
@@ -325,12 +368,6 @@ void CruAvatarMoverProcess::handleNormalMode() {
 			mainactor->toggleInCombat();
 	}
 
-	if (hasMovementFlags(MOVE_SHORT_JUMP)) {
-		clearMovementFlag(MOVE_SHORT_JUMP);
-		avatar->doAnim(Animation::jumpForward, direction);
-		return;
-	}
-
 	if (!hasMovementFlags(MOVE_ANY_DIRECTION) && lastanim == Animation::run) {
 		// if we were running, slow to a walk before stopping
 		// (even in stasis)
@@ -352,6 +389,9 @@ void CruAvatarMoverProcess::handleNormalMode() {
 	if (stasis)
 		return;
 
+	if (checkOneShotMove(direction))
+		return;
+
 	bool moving = (lastanim == Animation::step || lastanim == Animation::run || lastanim == Animation::walk);
 
 	DirectionMode dirmode = avatar->animDirMode(Animation::step);
diff --git a/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.h b/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.h
index 55219b76424..8f97d8843db 100644
--- a/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.h
+++ b/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.h
@@ -87,6 +87,7 @@ private:
 
 	void step(Animation::Sequence action, Direction direction, bool adjusted = false);
 
+	bool checkOneShotMove(Direction direction);
 };
 
 } // End of namespace Ultima8


Commit: 5fe1c35fe0878a5b7a4170db5ebd646463f7096a
    https://github.com/scummvm/scummvm/commit/5fe1c35fe0878a5b7a4170db5ebd646463f7096a
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2022-01-03T19:15:49+09:00

Commit Message:
ULTIMA8: Add No Regret easteregg ini option

Gives players a ways to enjoy festive music at any time of year.

Changed paths:
    engines/ultima/ultima8/audio/cru_music_process.cpp


diff --git a/engines/ultima/ultima8/audio/cru_music_process.cpp b/engines/ultima/ultima8/audio/cru_music_process.cpp
index b25310ad2f8..c0f8a515dbc 100644
--- a/engines/ultima/ultima8/audio/cru_music_process.cpp
+++ b/engines/ultima/ultima8/audio/cru_music_process.cpp
@@ -20,6 +20,8 @@
  */
 
 #include "common/system.h"
+#include "common/config-manager.h"
+
 #include "ultima/ultima8/ultima8.h"
 #include "ultima/ultima8/audio/cru_music_process.h"
 #include "ultima/ultima8/filesys/file_system.h"
@@ -119,7 +121,7 @@ void CruMusicProcess::playMusic(int track) {
 		// Regret has a Christmas music easter egg.
 		TimeDate t;
 		g_system->getTimeAndDate(t);
-		if (t.tm_mon == 11 && t.tm_mday >= 24) {
+		if ((t.tm_mon == 11 && t.tm_mday >= 24) || ConfMan.getBool("always_christmas")) {
 			track = 22;
 		}
 	}




More information about the Scummvm-git-logs mailing list