[Scummvm-git-logs] scummvm master -> 7cf410a3e9087b599902f7464139b4416ebcf5cd
mduggan
mgithub at guarana.org
Tue Jul 14 06:43:56 UTC 2020
This automated email contains information about 11 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
2ad1ef4173 ULTIMA8: Implement turn-to-dir intrinsic
522df88bde ULTIMA8: Slightly better debug messages
d7aaab8bea ULTIMA8: Silence a too-noisy debug message
f38eddae42 ULTIMA8: Teleport Crusader to the right egg on startup
2f9191579c ULTIMA8: Only show crusader reticle in combat
96df6b8eae ULTIMA8: Correct intrinsic call for Crusader
55f299ef74 ULTIMA8: Initialize global 0x3C to 1 in Crusader
e536a6f44c ULTIMA8: Implement more Crusader intrinsics
3347700301 ULTIMA8: Add recent keydown intrinsic for remote cameras in Crusader
5aed3fb26c ULTIMA8: Correct process type for GuardProcess
7cf410a3e9 ULTIMA8: Support equip usecode event with parameter (fixes valves in Crusader)
Commit: 2ad1ef4173cbd711642ea02f0f5cfda24bda50ef
https://github.com/scummvm/scummvm/commit/2ad1ef4173cbd711642ea02f0f5cfda24bda50ef
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-07-14T12:48:24+09:00
Commit Message:
ULTIMA8: Implement turn-to-dir intrinsic
Changed paths:
engines/ultima/ultima8/graphics/anim_dat.cpp
engines/ultima/ultima8/usecode/remorse_intrinsics.h
engines/ultima/ultima8/world/actors/actor.cpp
engines/ultima/ultima8/world/actors/actor.h
diff --git a/engines/ultima/ultima8/graphics/anim_dat.cpp b/engines/ultima/ultima8/graphics/anim_dat.cpp
index 2e780647a1..3f47ad402b 100644
--- a/engines/ultima/ultima8/graphics/anim_dat.cpp
+++ b/engines/ultima/ultima8/graphics/anim_dat.cpp
@@ -101,9 +101,9 @@ uint32 AnimDat::getActionNumberForSequence(Animation::Sequence action) {
return 46; // 47 is knee with a larger weapon
// 48 is nothing for avatar
case Animation::lookLeft:
- return 14;
+ return 0x3c;
case Animation::lookRight:
- return 14;
+ return 0x3c;
default:
return static_cast<uint32>(action);;
}
diff --git a/engines/ultima/ultima8/usecode/remorse_intrinsics.h b/engines/ultima/ultima8/usecode/remorse_intrinsics.h
index c8b3a81c42..f7df91f109 100644
--- a/engines/ultima/ultima8/usecode/remorse_intrinsics.h
+++ b/engines/ultima/ultima8/usecode/remorse_intrinsics.h
@@ -49,7 +49,7 @@ Intrinsic RemorseIntrinsics[] = {
Actor::I_getUnkByte, // get something about npcdata - struct byte 0x63 (99)
Ultima8Engine::I_setAvatarInStasis, // void Intrinsic00C(2 bytes)
Item::I_getDirToItem, // byte Intrinsic00D(6 bytes)
- 0, // TODO: Actor::I_turnToward(Actor *, direction, unk)
+ Actor::I_turnToward, // TODO: Actor::I_turnToward(Actor *, direction, unk)
0, // TODO: VideoGump::I_playVideo(item, vidname, int16 sizex, int16 sizey)
// 0x010
Item::I_getQLo, // Based on having same coff as 02B
diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index 9f1eef5240..8375231d2d 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -542,6 +542,41 @@ Animation::Result Actor::tryAnim(Animation::Sequence anim, int dir,
return Animation::END_OFF_LAND;
}
+uint16 Actor::turnTowardDir(uint16 targetdir) {
+ uint16 curdir = _direction;
+ if (targetdir == curdir)
+ return 0;
+
+ // TODO; this should support 16 dirs too
+ int stepDelta;
+ Animation::Sequence turnanim;
+ if ((curdir - targetdir + 8) % 8 < 4) {
+ stepDelta = -1;
+ turnanim = Animation::lookLeft;
+ } else {
+ stepDelta = 1;
+ turnanim = Animation::lookRight;
+ }
+
+ ProcId prevpid = 0;
+
+ // Create a sequence of turn animations from
+ // our current direction to the new one
+ for (int dir = curdir; dir != targetdir;) {
+ ProcId animpid = doAnim(turnanim, dir);
+ if (prevpid) {
+ Process *proc = Kernel::get_instance()->getProcess(animpid);
+ assert(proc);
+ proc->waitFor(prevpid);
+ }
+
+ prevpid = animpid;
+ dir = (dir + stepDelta + 8) % 8;
+ }
+
+ return prevpid;
+}
+
uint16 Actor::setActivity(int activity) {
if (GAME_IS_CRUSADER)
return setActivityCru(activity);
@@ -1981,5 +2016,17 @@ uint32 Actor::I_getLastActivityNo(const uint8 *args, unsigned int /*argsize*/) {
return actor->getLastActivityNo();
}
+uint32 Actor::I_turnToward(const uint8 *args, unsigned int /*argsize*/) {
+ ARG_ACTOR_FROM_PTR(actor);
+ if (!actor) return 0;
+
+ ARG_UINT16(dir);
+ ARG_UINT16(unk);
+
+ // TODO: This is hacked to be the 8 dir version..
+ return actor->turnTowardDir(dir / 2);
+}
+
+
} // End of namespace Ultima8
} // End of namespace Ultima
diff --git a/engines/ultima/ultima8/world/actors/actor.h b/engines/ultima/ultima8/world/actors/actor.h
index 5729f9824b..f6e7ecf46c 100644
--- a/engines/ultima/ultima8/world/actors/actor.h
+++ b/engines/ultima/ultima8/world/actors/actor.h
@@ -242,6 +242,10 @@ public:
int32 collideMove(int32 x, int32 y, int32 z, bool teleport, bool force,
ObjId *hititem = 0, uint8 *dirs = 0) override;
+ //! Turn one step toward the given direction. If the current direction is already the same,
+ //! do nothing. Returns an anim process or 0 if no move needed.
+ uint16 turnTowardDir(uint16 dir);
+
//! create an actor, assign objid, make it ethereal and load monster stats.
static Actor *createActor(uint32 shape, uint32 frame);
@@ -316,6 +320,7 @@ public:
INTRINSIC(I_getUnkByte);
INTRINSIC(I_getLastActivityNo);
INTRINSIC(I_getCurrentActivityNo);
+ INTRINSIC(I_turnToward);
enum ActorFlags {
ACT_INVINCIBLE = 0x000001, // flags from npcdata byte 0x1B
Commit: 522df88bdeb68792d90628d4a0ecbbe951407a96
https://github.com/scummvm/scummvm/commit/522df88bdeb68792d90628d4a0ecbbe951407a96
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-07-14T12:48:24+09:00
Commit Message:
ULTIMA8: Slightly better debug messages
Changed paths:
engines/ultima/ultima8/audio/audio_process.cpp
diff --git a/engines/ultima/ultima8/audio/audio_process.cpp b/engines/ultima/ultima8/audio/audio_process.cpp
index dfc9a7059b..3bac702e0a 100644
--- a/engines/ultima/ultima8/audio/audio_process.cpp
+++ b/engines/ultima/ultima8/audio/audio_process.cpp
@@ -532,7 +532,7 @@ uint32 AudioProcess::I_playSFXCru(const uint8 *args, unsigned int argsize) {
ARG_SINT16(sfxNum);
if (!item) {
- warning("I_playSFXCru: Couldn't get item");
+ warning("I_playSFXCru: Couldn't get item %d", id_item);
} else {
AudioProcess *ap = AudioProcess::get_instance();
if (ap) {
@@ -553,7 +553,7 @@ uint32 AudioProcess::I_playAmbientSFXCru(const uint8 *args, unsigned int argsize
ARG_SINT16(sfxNum);
if (!item) {
- warning("I_playAmbientSFXCru: Couldn't get item");
+ warning("I_playAmbientSFXCru: Couldn't get item %d", id_item);
} else {
AudioProcess *ap = AudioProcess::get_instance();
if (ap)
Commit: d7aaab8bead8efc97462b9997dd69ce441939b47
https://github.com/scummvm/scummvm/commit/d7aaab8bead8efc97462b9997dd69ce441939b47
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-07-14T12:48:24+09:00
Commit Message:
ULTIMA8: Silence a too-noisy debug message
Changed paths:
engines/ultima/ultima8/world/item_sorter.cpp
diff --git a/engines/ultima/ultima8/world/item_sorter.cpp b/engines/ultima/ultima8/world/item_sorter.cpp
index 773de3c0f4..126e8f2573 100644
--- a/engines/ultima/ultima8/world/item_sorter.cpp
+++ b/engines/ultima/ultima8/world/item_sorter.cpp
@@ -827,8 +827,8 @@ bool ItemSorter::PaintSortItem(SortItem *si) {
SortItem::DependsList::iterator end = si->_depends.end();
while (it != end) {
if ((*it)->_order == -2) {
- warning("cycle in paint dependency graph %d -> %d -> ... -> %d",
- si->_shapeNum, (*it)->_shapeNum, si->_shapeNum);
+ //warning("cycle in paint dependency graph %d -> %d -> ... -> %d",
+ // si->_shapeNum, (*it)->_shapeNum, si->_shapeNum);
break;
}
else if ((*it)->_order == -1) {
Commit: f38eddae4291429556667c24d173075c98f44586
https://github.com/scummvm/scummvm/commit/f38eddae4291429556667c24d173075c98f44586
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-07-14T12:48:24+09:00
Commit Message:
ULTIMA8: Teleport Crusader to the right egg on startup
Changed paths:
engines/ultima/ultima8/games/remorse_game.cpp
engines/ultima/ultima8/games/start_crusader_process.cpp
engines/ultima/ultima8/world/actors/teleport_to_egg_process.cpp
engines/ultima/ultima8/world/actors/teleport_to_egg_process.h
diff --git a/engines/ultima/ultima8/games/remorse_game.cpp b/engines/ultima/ultima8/games/remorse_game.cpp
index 97ef21150d..7ff3fa8ed1 100644
--- a/engines/ultima/ultima8/games/remorse_game.cpp
+++ b/engines/ultima/ultima8/games/remorse_game.cpp
@@ -123,7 +123,8 @@ bool RemorseGame::startGame() {
if (GAME_IS_REMORSE) {
// Some useful points to warp into for testing..
- actor->setLocation(60716, 59400, 16); // Map 1 (mission 1)
+ actor->setLocation(0, 0, 0); // Map 1 (mission 1)
+ //actor->setLocation(60716, 59400, 16); // Map 1 (mission 1)
//actor->setLocation(42493, 26621, 16); // Map 2 (mission 1 / level 4)
//actor->setLocation(34302, 32254, 16); // Map 3 (mission 2)
//actor->setLocation(34813, 33789, 16); // Map 4
@@ -138,7 +139,7 @@ bool RemorseGame::startGame() {
actor->setLocation(58174, 56606, 16);
}
- World::get_instance()->switchMap(1);
+ World::get_instance()->switchMap(0);
return true;
}
diff --git a/engines/ultima/ultima8/games/start_crusader_process.cpp b/engines/ultima/ultima8/games/start_crusader_process.cpp
index 2fecf30af3..755ce37e9b 100644
--- a/engines/ultima/ultima8/games/start_crusader_process.cpp
+++ b/engines/ultima/ultima8/games/start_crusader_process.cpp
@@ -40,6 +40,7 @@
#include "ultima/ultima8/conf/setting_manager.h"
#include "ultima/ultima8/world/get_object.h"
#include "ultima/ultima8/world/item_factory.h"
+#include "ultima/ultima8/world/actors/teleport_to_egg_process.h"
#include "ultima/ultima8/graphics/palette_fader_process.h"
#include "ultima/ultima8/audio/music_process.h"
@@ -82,42 +83,19 @@ void StartCrusaderProcess::run() {
cruPickupAreaGump->InitGump(nullptr, false);
// Try to load the save game, if succeeded this pointer will no longer be valid
- if (_saveSlot >= 0 &&Ultima8Engine::get_instance()->loadGameState(_saveSlot).getCode() == Common::kNoError) {
+ if (_saveSlot >= 0 && Ultima8Engine::get_instance()->loadGameState(_saveSlot).getCode() == Common::kNoError) {
//PaletteFaderProcess::I_fadeFromBlack(0, 0);
return;
}
Ultima8Engine::get_instance()->setCheatMode(true);
- //CurrentMap *currentmap = World::get_instance()->getCurrentMap();
- //UCList uclist(2);
-
if (!_skipStart) {
- // TODO:
- // * Give avatar item 0x4d4 and item 0x598
- // TODO: Find the first MISS1EGG egg like in U8 - should teleport in
- //Kernel::get_instance()->addProcess(new TeleportToEggProcess(1, 0x1e));
-
- /*
- LOOPSCRIPT(script, LS_AND(LS_SHAPE_EQUAL1(0x90D), LS_Q_EQUAL(36)));
- currentmap->areaSearch(&uclist, script, sizeof(script),
- 0, 256, false, 16188, 7500);
- if (uclist.getSize() < 1) {
- perr << "Unable to find FIRST egg!" << Std::endl;
- return;
- }
-
- uint16 objid = uclist.getuint16(0);
- Egg *egg = dynamic_cast<Egg *>(getObject(objid));
- int32 ix, iy, iz;
- egg->getLocation(ix, iy, iz);
- // Center on egg
- CameraProcess::SetCameraProcess(new CameraProcess(ix, iy, iz));
- egg->hatch();
- */
-
MainActor *avatar = getMainActor();
int mapnum = avatar->getMapNum();
+ // The game doesn't do the weapon this way, but it's the same for our purposes..
+ Item *weapon = ItemFactory::createItem(0x32E, 0, 0, 0, 0, mapnum, 0, true);
+ avatar->addItemCru(weapon, false);
Item *datalink = ItemFactory::createItem(0x4d4, 0, 0, 0, 0, mapnum, 0, true);
avatar->addItemCru(datalink, false);
Item *smiley = ItemFactory::createItem(0x598, 0, 0, 0, 0, mapnum, 0, true);
@@ -129,6 +107,12 @@ void StartCrusaderProcess::run() {
miss1egg->setMapNum(mapnum);
miss1egg->assignObjId();
miss1egg->callUsecodeEvent_hatch();
+
+ avatar->setDir(2);
+
+ // TODO: The game actually teleports to egg 0x1f (31) which has another
+ // egg to teleport to egg 99. Is there any purpose to that?
+ Kernel::get_instance()->addProcess(new TeleportToEggProcess(1, 99));
}
//MusicProcess::get_instance()->playMusic(2);
diff --git a/engines/ultima/ultima8/world/actors/teleport_to_egg_process.cpp b/engines/ultima/ultima8/world/actors/teleport_to_egg_process.cpp
index a34bbb89ba..ccd9b3a078 100644
--- a/engines/ultima/ultima8/world/actors/teleport_to_egg_process.cpp
+++ b/engines/ultima/ultima8/world/actors/teleport_to_egg_process.cpp
@@ -32,12 +32,12 @@ namespace Ultima8 {
DEFINE_RUNTIME_CLASSTYPE_CODE(TeleportToEggProcess)
TeleportToEggProcess::TeleportToEggProcess() : Process(),
- _mapNum(0), _teleportId(0) {
+ _mapNum(0), _teleportId(0), _arrivalAnim(0) {
}
-TeleportToEggProcess::TeleportToEggProcess(int mapNum, int teleportId)
- : _mapNum(mapNum), _teleportId(teleportId) {
+TeleportToEggProcess::TeleportToEggProcess(int mapNum, int teleportId, int arrivalAnim)
+ : _mapNum(mapNum), _teleportId(teleportId), _arrivalAnim(0) {
_type = 1; // CONSTANT! (type 1 = persistent)
}
@@ -47,6 +47,9 @@ void TeleportToEggProcess::run() {
av->teleport(_mapNum, _teleportId);
+ if (_arrivalAnim)
+ av->doAnim(static_cast<Animation::Sequence>(_arrivalAnim), av->getDir());
+
terminate();
}
diff --git a/engines/ultima/ultima8/world/actors/teleport_to_egg_process.h b/engines/ultima/ultima8/world/actors/teleport_to_egg_process.h
index f3207a5d03..0ac39aa970 100644
--- a/engines/ultima/ultima8/world/actors/teleport_to_egg_process.h
+++ b/engines/ultima/ultima8/world/actors/teleport_to_egg_process.h
@@ -32,7 +32,7 @@ namespace Ultima8 {
class TeleportToEggProcess : public Process {
public:
TeleportToEggProcess();
- TeleportToEggProcess(int mapnum_, int teleport_id_);
+ TeleportToEggProcess(int mapnum, int teleportId, int arrivalAnim = 0);
// p_dynamic_cast stuff
ENABLE_RUNTIME_CLASSTYPE()
@@ -46,6 +46,7 @@ public:
protected:
int _mapNum;
int _teleportId;
+ int _arrivalAnim;
};
} // End of namespace Ultima8
Commit: 2f9191579c8169de2ca23b616b4f33f832f43e72
https://github.com/scummvm/scummvm/commit/2f9191579c8169de2ca23b616b4f33f832f43e72
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-07-14T12:48:24+09:00
Commit Message:
ULTIMA8: Only show crusader reticle in combat
Changed paths:
engines/ultima/ultima8/misc/debugger.cpp
engines/ultima/ultima8/world/target_reticle_process.cpp
engines/ultima/ultima8/world/target_reticle_process.h
diff --git a/engines/ultima/ultima8/misc/debugger.cpp b/engines/ultima/ultima8/misc/debugger.cpp
index 954232b9e3..beec3e5849 100644
--- a/engines/ultima/ultima8/misc/debugger.cpp
+++ b/engines/ultima/ultima8/misc/debugger.cpp
@@ -47,6 +47,7 @@
#include "ultima/ultima8/world/item_factory.h"
#include "ultima/ultima8/world/actors/quick_avatar_mover_process.h"
#include "ultima/ultima8/world/actors/avatar_mover_process.h"
+#include "ultima/ultima8/world/target_reticle_process.h"
#include "ultima/ultima8/world/actors/main_actor.h"
#include "ultima/ultima8/world/actors/pathfinder.h"
@@ -1145,7 +1146,14 @@ bool Debugger::cmdUseInventory(int argc, const char **argv) {
bool Debugger::cmdUseRecall(int argc, const char **argv) {
MainActor *av = getMainActor();
- av->useInventoryItem(833);
+ if (GAME_IS_U8)
+ av->useInventoryItem(833);
+ else {
+ TargetReticleProcess *reticle = TargetReticleProcess::get_instance();
+ if (reticle) {
+ reticle->toggle();
+ }
+ }
return false;
}
diff --git a/engines/ultima/ultima8/world/target_reticle_process.cpp b/engines/ultima/ultima8/world/target_reticle_process.cpp
index 2e1023c6ab..96b027dc44 100644
--- a/engines/ultima/ultima8/world/target_reticle_process.cpp
+++ b/engines/ultima/ultima8/world/target_reticle_process.cpp
@@ -22,6 +22,8 @@
#include "ultima/ultima8/misc/pent_include.h"
+#include "ultima/ultima8/gumps/message_box_gump.h"
+#include "ultima/ultima8/games/game_data.h"
#include "ultima/ultima8/kernel/kernel.h"
#include "ultima/ultima8/world/actors/main_actor.h"
#include "ultima/ultima8/world/target_reticle_process.h"
@@ -48,12 +50,13 @@ void TargetReticleProcess::run() {
Kernel *kernel = Kernel::get_instance();
assert(kernel);
uint32 frameno = kernel->getFrameNum();
+ Actor *mainactor = getMainActor();
Process *spriteProc = nullptr;
if (_reticleSpriteProcess != 0) {
spriteProc = kernel->getProcess(_reticleSpriteProcess);
}
- if (!_reticleEnabled) {
+ if (!_reticleEnabled || (mainactor && !mainactor->isInCombat())) {
if (spriteProc) {
spriteProc->terminate();
}
@@ -130,9 +133,6 @@ void TargetReticleProcess::putTargetReticleOnItem(Item *item) {
void TargetReticleProcess::itemMoved(Item *item) {
assert(item);
if (!_reticleSpriteProcess || item->getObjId() != _lastTargetItem) {
- // Shouldn't happen, but to be sure..
- warning("TargetReticleProcess: no active reticle or notified by the wrong item (%d, expected %d, process %d)",
- item->getObjId(), _lastTargetItem, _reticleSpriteProcess);
clearSprite();
return;
}
@@ -172,6 +172,13 @@ void TargetReticleProcess::clearSprite() {
_lastTargetDir = 0x10;
}
+void TargetReticleProcess::toggle() {
+ bool newstate = !getEnabled();
+ Std::string msg = newstate ? _TL_("TARGETING RETICLE ACTIVE") : _TL_("TARGETING RETICLE INACTIVE");
+ MessageBoxGump::Show("", msg, 0xFF707070);
+ setEnabled(newstate);
+}
+
void TargetReticleProcess::saveData(Common::WriteStream *ws) {
Process::saveData(ws);
diff --git a/engines/ultima/ultima8/world/target_reticle_process.h b/engines/ultima/ultima8/world/target_reticle_process.h
index b69239c0ce..b44e1a8ae9 100644
--- a/engines/ultima/ultima8/world/target_reticle_process.h
+++ b/engines/ultima/ultima8/world/target_reticle_process.h
@@ -57,6 +57,19 @@ public:
return _instance;
}
+ void setEnabled(bool val) {
+ _reticleEnabled = val;
+ }
+ bool getEnabled() const {
+ return _reticleEnabled;
+ }
+
+ void toggle();
+
+ static TargetReticleProcess *get_instance() {
+ return _instance;
+ }
+
private:
bool findTargetItem();
void putTargetReticleOnItem(Item *);
Commit: 96df6b8eae84478b275234b5b2c31a88f594769f
https://github.com/scummvm/scummvm/commit/96df6b8eae84478b275234b5b2c31a88f594769f
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-07-14T12:48:24+09:00
Commit Message:
ULTIMA8: Correct intrinsic call for Crusader
Changed paths:
engines/ultima/ultima8/usecode/remorse_intrinsics.h
diff --git a/engines/ultima/ultima8/usecode/remorse_intrinsics.h b/engines/ultima/ultima8/usecode/remorse_intrinsics.h
index f7df91f109..43629b54d1 100644
--- a/engines/ultima/ultima8/usecode/remorse_intrinsics.h
+++ b/engines/ultima/ultima8/usecode/remorse_intrinsics.h
@@ -249,7 +249,7 @@ Intrinsic RemorseIntrinsics[] = {
Item::I_getDirFromItem, // int Intrinsic0C7(6 bytes)
Item::I_hurl, // void Intrinsic0C8(12 bytes)
Item::I_getQHi, // based on same coff set as 026
- Actor::I_setHp, // int Intrinsic0CA(6 bytes)
+ Actor::I_addHp, // int Intrinsic0CA(6 bytes)
0, // 0CB void I_createMapJumpProcess(int16 mapnum)", // TODO: Implement me
Actor::I_isInCombat, // int Intrinsic0CC(4 bytes)
Actor::I_setActivity, // void Intrinsic0CD(6 bytes)
Commit: 55f299ef743a74b2035bbef6f3a9409eb92a0099
https://github.com/scummvm/scummvm/commit/55f299ef743a74b2035bbef6f3a9409eb92a0099
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-07-14T12:48:24+09:00
Commit Message:
ULTIMA8: Initialize global 0x3C to 1 in Crusader
Changed paths:
engines/ultima/ultima8/usecode/uc_machine.cpp
diff --git a/engines/ultima/ultima8/usecode/uc_machine.cpp b/engines/ultima/ultima8/usecode/uc_machine.cpp
index cd2cf1c498..4c117c6829 100644
--- a/engines/ultima/ultima8/usecode/uc_machine.cpp
+++ b/engines/ultima/ultima8/usecode/uc_machine.cpp
@@ -94,9 +94,13 @@ UCMachine::UCMachine(Intrinsic *iset, unsigned int icount) {
_convUse = new ConvertUsecodeU8();
} else if (GAME_IS_REMORSE) {
_globals = new ByteSet(0x1000);
+ // slight hack: set global 003C to start as avatar number.
+ _globals->setEntries(0x3C, 2, 1);
_convUse = new ConvertUsecodeCrusader();
} else {
_globals = new ByteSet(0x1000);
+ // slight hack: set global 003C to start as avatar number.
+ _globals->setEntries(0x3C, 2, 1);
// TODO: Need a separate convertor for Regret
_convUse = new ConvertUsecodeCrusader();
}
@@ -129,6 +133,11 @@ void UCMachine::reset() {
// clear _globals
_globals->setSize(0x1000);
+ if (GAME_IS_CRUSADER) {
+ // slight hack: set global 003C to start as avatar number.
+ _globals->setEntries(0x3C, 2, 1);
+ }
+
// clear strings, lists
Std::map<uint16, UCList *>::iterator iter;
for (iter = _listHeap.begin(); iter != _listHeap.end(); ++iter)
@@ -1983,7 +1992,7 @@ void UCMachine::execProcess(UCProcess *p) {
// assigns item number and ProcessType
p->setItemNum(p->_stack.pop2());
p->setType(p->_stack.pop2());
- LOGPF(("set info\n"));
+ LOGPF(("set info itemno: %d type: %d\n", p->getItemNum(), p->getType()));
break;
case 0x78:
@@ -2013,6 +2022,7 @@ void UCMachine::execProcess(UCProcess *p) {
ui16a = cs.readUint16LE(); // global address
ui32a = globalToPtr(ui16a);
p->_stack.push4(ui32a);
+ LOGPF(("push global 0x%x (value: %x)\n", ui16a, ui32a));
break;
case 0x7A:
@@ -2308,8 +2318,10 @@ uint16 UCMachine::ptrToObject(uint32 ptr) {
} else {
return proc->_stack.access2(offset);
}
- } else if (segment == SEG_OBJ || segment == SEG_STRING || segment == SEG_GLOBAL) {
+ } else if (segment == SEG_OBJ || segment == SEG_STRING) {
return offset;
+ } else if (segment == SEG_GLOBAL) {
+ return get_instance()->_globals->getEntries(offset, 2);
} else {
perr << "Trying to access segment " << Std::hex
<< segment << Std::dec << Std::endl;
Commit: e536a6f44ca78221483fd460eab098794927cbd0
https://github.com/scummvm/scummvm/commit/e536a6f44ca78221483fd460eab098794927cbd0
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-07-14T15:38:50+09:00
Commit Message:
ULTIMA8: Implement more Crusader intrinsics
Changed paths:
engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
engines/ultima/ultima8/graphics/palette_fader_process.cpp
engines/ultima/ultima8/graphics/palette_fader_process.h
engines/ultima/ultima8/graphics/palette_manager.cpp
engines/ultima/ultima8/graphics/palette_manager.h
engines/ultima/ultima8/usecode/remorse_intrinsics.h
diff --git a/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h b/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
index 436ce6d5d0..6479316dbf 100644
--- a/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
+++ b/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
@@ -165,9 +165,9 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"int16 Actor::I_getLastAnimSet(4 bytes)", // part of same coff set 01D, 05A, 0B9, 0D7, 0E4, 124
"byte Item::I_legalCreateAtPoint(Item *, int16 shape, int16 frame, Point *)", // see PEPSIEW::use
"void Item::I_getPoint(Item *, Point *)",
- "void I_mouseSomethingOffMaybe05D(void)",
+ "void I_mouseSomethingOffMaybe05D(void)", // Probably hides gumps at the bottom, among other things.
"int16 I_playFlicsomething(uint32, char *, int16 a, int16 b)", // Play video (as texture? parameters like (150, 250, "MVA11A") and other mvas)
- "void I_mouseSomethingResume05F(void)",
+ "void I_mouseSomethingResume05F(void)", // Probably shows gumps at the bottom, among other things.
// 0060
"void Actor::I_setDead(4 bytes)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
"void Actor::I_create(8 bytes)",
@@ -218,7 +218,7 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"void Item::I_setIsBroken(Item *)", // same coff as 119, 12A
"int16 Item::I_hurl(Item *,8 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
"int16 Item::I_getNPCNum(Item *)", // part of same coff set 067, 06D, 089, 08E, 0AD, 0F8, 100, 102, 105, 107, 109, 10B, 10D, 10F, 111, 115, 11C, 123, 129
- "void PaletteFaderProcess::I_setPalToAllBlack(void)",
+ "void PaletteFaderProcess::I_jumpToAllBlack(void)",
// 0090
"void MusicProcess::I_musicStop(void)",
"void I_setSomeMovieGlobal(void)", // sets some global (cleared by 93)
@@ -227,7 +227,7 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"void Game::I_playCredits(void)",
"byte Kernel::I_getCurrentKeyDown(void)", // get global - something about keyboard (by disasm)
"int16 MainActor::I_teleportToEgg(int, int)", // a bit different to the U8 one - uses main actor map by default.
- "void PaletteFaderProcess:I_setScreenGreyscale(void)", // TODO: Implement this - converts all colors to their Y values on each channel.
+ "void PaletteFaderProcess:I_jumpToGreyScale(void)",
"void I_resetVargasHealthTo500(void)", // TODO: look how this is used in disasm and usecode .. seems weird.
"void Item::I_andStatus(Item *, uint16 status)", // part of same coff set 01A, 031, 069, 06E, 099, 0B2, 0BF, 0C1, 0C3, 0E9, 0FC, 101, 104, 106, 108, 10A, 10C, 10E, 110, 114, 117, 11A, 128, 132
"void PaletteFaderProcess::I_stopFadesAndResetToGamePal(void)", // TODO: Implement this.
diff --git a/engines/ultima/ultima8/graphics/palette_fader_process.cpp b/engines/ultima/ultima8/graphics/palette_fader_process.cpp
index d6082ed774..24c2014458 100644
--- a/engines/ultima/ultima8/graphics/palette_fader_process.cpp
+++ b/engines/ultima/ultima8/graphics/palette_fader_process.cpp
@@ -68,7 +68,7 @@ PaletteFaderProcess::PaletteFaderProcess(uint32 col32, bool from,
}
}
-PaletteFaderProcess::PaletteFaderProcess(int16 from[12], int16 to[12],
+PaletteFaderProcess::PaletteFaderProcess(const int16 from[12], const int16 to[12],
int priority_, int frames) : _priority(priority_),
_counter(frames), _maxCounter(frames) {
int i;
@@ -199,5 +199,60 @@ uint32 PaletteFaderProcess::I_lightningBolt(const uint8 * /*args*/,
return Kernel::get_instance()->addProcess(_fader);
}
+static const int16 NoFadeMatrix[] = {0x800, 0, 0, 0,
+ 0, 0x800, 0, 0,
+ 0, 0, 0x800, 0
+};
+// Transform used in Crusader is Yib. We only care about Y:
+// Y = (r * 0.299 + g * 0.587 + b * 0.114)
+static const int16 GreyFadeMatrix[] = {612, 1202, 233, 0,
+ 612, 1202, 233, 0,
+ 612, 1202, 233, 0
+};
+static const int16 AllBlackMatrix[] = {0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0
+};
+
+uint32 PaletteFaderProcess::I_fadeToGreyScale(const uint8 * /*args*/,
+unsigned int /*argsize*/) {
+ if (_fader && _fader->_priority > 0x7FFF) return 0;
+ else if (_fader) _fader->terminate();
+
+ _fader = new PaletteFaderProcess(NoFadeMatrix, GreyFadeMatrix, 0x7FFF, 1);
+ return Kernel::get_instance()->addProcess(_fader);
+}
+
+uint32 PaletteFaderProcess::I_jumpToGreyScale(const uint8 * /*args*/,
+ unsigned int /*argsize*/) {
+ if (_fader && _fader->_priority > 0x7FFF) return 0;
+ else if (_fader) _fader->terminate();
+
+ PaletteManager::get_instance()->transformPalette(PaletteManager::Pal_Game,
+ GreyFadeMatrix);
+ return 0;
+}
+
+uint32 PaletteFaderProcess::I_jumpToAllBlack(const uint8 * /*args*/,
+ unsigned int /*argsize*/) {
+ if (_fader && _fader->_priority > 0x7FFF) return 0;
+ else if (_fader) _fader->terminate();
+
+ PaletteManager::get_instance()->transformPalette(PaletteManager::Pal_Game,
+ AllBlackMatrix);
+ return 0;
+}
+
+uint32 PaletteFaderProcess::I_jumpToNormalPalette(const uint8 * /*args*/,
+ unsigned int /*argsize*/) {
+ if (_fader && _fader->_priority > 0x7FFF) return 0;
+ else if (_fader) _fader->terminate();
+
+ PaletteManager::get_instance()->transformPalette(PaletteManager::Pal_Game,
+ NoFadeMatrix);
+ return 0;
+}
+
+
} // End of namespace Ultima8
} // End of namespace Ultima
diff --git a/engines/ultima/ultima8/graphics/palette_fader_process.h b/engines/ultima/ultima8/graphics/palette_fader_process.h
index 05855db645..5056183106 100644
--- a/engines/ultima/ultima8/graphics/palette_fader_process.h
+++ b/engines/ultima/ultima8/graphics/palette_fader_process.h
@@ -45,7 +45,7 @@ public:
PaletteFaderProcess();
PaletteFaderProcess(PalTransforms trans, int priority, int frames);
PaletteFaderProcess(uint32 rgba, bool from, int priority, int frames, bool current);
- PaletteFaderProcess(int16 from[12], int16 to[12], int priority, int frames);
+ PaletteFaderProcess(const int16 from[12], const int16 to[12], int priority, int frames);
~PaletteFaderProcess(void) override;
void run() override;
@@ -56,6 +56,10 @@ public:
INTRINSIC(I_fadeToWhite);
INTRINSIC(I_fadeFromBlack);
INTRINSIC(I_lightningBolt);
+ INTRINSIC(I_fadeToGreyScale);
+ INTRINSIC(I_jumpToGreyScale);
+ INTRINSIC(I_jumpToAllBlack);
+ INTRINSIC(I_jumpToNormalPalette);
bool loadData(Common::ReadStream *rs, uint32 version);
void saveData(Common::WriteStream *ws) override;
diff --git a/engines/ultima/ultima8/graphics/palette_manager.cpp b/engines/ultima/ultima8/graphics/palette_manager.cpp
index d73f66c6c8..b6aa0a0d77 100644
--- a/engines/ultima/ultima8/graphics/palette_manager.cpp
+++ b/engines/ultima/ultima8/graphics/palette_manager.cpp
@@ -136,7 +136,7 @@ Palette *PaletteManager::getPalette(PalIndex index) {
return _palettes[index];
}
-void PaletteManager::transformPalette(PalIndex index, int16 matrix[12]) {
+void PaletteManager::transformPalette(PalIndex index, const int16 matrix[12]) {
Palette *pal = getPalette(index);
if (!pal) return;
diff --git a/engines/ultima/ultima8/graphics/palette_manager.h b/engines/ultima/ultima8/graphics/palette_manager.h
index 012f5d1bd9..4e6828b71d 100644
--- a/engines/ultima/ultima8/graphics/palette_manager.h
+++ b/engines/ultima/ultima8/graphics/palette_manager.h
@@ -62,7 +62,7 @@ public:
void updatedPalette(PalIndex index, int maxindex = 0);
//! Apply a transform matrix to a palette (-4.11 fixed)
- void transformPalette(PalIndex index, int16 matrix[12]);
+ void transformPalette(PalIndex index, const int16 matrix[12]);
//! reset the transformation matrix of a palette
void untransformPalette(PalIndex index);
diff --git a/engines/ultima/ultima8/usecode/remorse_intrinsics.h b/engines/ultima/ultima8/usecode/remorse_intrinsics.h
index 43629b54d1..46227fd701 100644
--- a/engines/ultima/ultima8/usecode/remorse_intrinsics.h
+++ b/engines/ultima/ultima8/usecode/remorse_intrinsics.h
@@ -186,19 +186,19 @@ Intrinsic RemorseIntrinsics[] = {
Item::I_setBroken, // void Intrinsic08C(4 bytes)
Item::I_hurl, // void Intrinsic08D(12 bytes)
Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
- 0, // TODO: PaletteFaderProcess::I_setPalToAllBlack - should also resume cycle process.
+ PaletteFaderProcess::I_jumpToAllBlack, // TODO: PaletteFaderProcess::I_setPalToAllBlack - should also resume cycle process.
// 0x090
MusicProcess::I_musicStop, // void Intrinsic090(void)
0, // void Intrinsic091(void)
0, // TODO: I_playFlic(char *)? void Intrinsic092(void)
0, // void Intrinsic093(void)
Game::I_playCredits, // TODO: Implement this
- 0, // TODO: Kernel::I_getCurrentKeyDown
+ Ultima8Engine::I_moveKeyDownRecently,
MainActor::I_teleportToEgg, // void Intrinsic096(4 bytes)
- 0, // TODO: PaletteFaderProcess:I_setScreenGreyscale(void) (converts all colors to their Y values on each channel)
+ PaletteFaderProcess::I_jumpToGreyScale,
0, // void Intrinsic098(void) // TODO: reset vargas health to 500.. weird.
Item::I_andStatus, // void Intrinsic099(6 bytes)
- 0, // TODO: PaletteFaderProcess::I_stopFadesAndResetToGamePal(void), - should also stop cycle process.
+ PaletteFaderProcess::I_jumpToNormalPalette, // TODO: should also stop cycle process?
PaletteFaderProcess::I_fadeFromBlack, // fade to game pal with number of steps
0, // TODO: PaletteFaderProcess::I_fadeFromBlackWithParam
PaletteFaderProcess::I_fadeToBlack, // fade to black with number of steps
Commit: 3347700301b2daa99041156169f7a3048d510630
https://github.com/scummvm/scummvm/commit/3347700301b2daa99041156169f7a3048d510630
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-07-14T15:40:39+09:00
Commit Message:
ULTIMA8: Add recent keydown intrinsic for remote cameras in Crusader
Changed paths:
engines/ultima/ultima8/misc/debugger.cpp
engines/ultima/ultima8/ultima8.cpp
engines/ultima/ultima8/ultima8.h
diff --git a/engines/ultima/ultima8/misc/debugger.cpp b/engines/ultima/ultima8/misc/debugger.cpp
index beec3e5849..7bf6315fa8 100644
--- a/engines/ultima/ultima8/misc/debugger.cpp
+++ b/engines/ultima/ultima8/misc/debugger.cpp
@@ -1170,11 +1170,13 @@ bool Debugger::cmdUseKeyring(int argc, const char **argv) {
}
bool Debugger::cmdStartJump(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
+ Ultima8Engine *engine = Ultima8Engine::get_instance();
+ engine->moveKeyEvent();
+ if (engine->isAvatarInStasis()) {
debugPrintf("Can't jump: avatarInStasis\n");
return false;
}
- AvatarMoverProcess *proc = Ultima8Engine::get_instance()->getAvatarMoverProcess();
+ AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
if (proc) {
proc->setMovementFlag(AvatarMoverProcess::MOVE_JUMP);
@@ -1184,11 +1186,12 @@ bool Debugger::cmdStartJump(int argc, const char **argv) {
bool Debugger::cmdStopJump(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
+ Ultima8Engine *engine = Ultima8Engine::get_instance();
+ if (engine->isAvatarInStasis()) {
debugPrintf("Can't jump: avatarInStasis\n");
return false;
}
- AvatarMoverProcess *proc = Ultima8Engine::get_instance()->getAvatarMoverProcess();
+ AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
if (proc) {
proc->clearMovementFlag(AvatarMoverProcess::MOVE_JUMP);
@@ -1197,11 +1200,13 @@ bool Debugger::cmdStopJump(int argc, const char **argv) {
}
bool Debugger::cmdStartTurnLeft(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
+ Ultima8Engine *engine = Ultima8Engine::get_instance();
+ engine->moveKeyEvent();
+ if (engine->isAvatarInStasis()) {
debugPrintf("Can't turn left: avatarInStasis\n");
return false;
}
- AvatarMoverProcess *proc = Ultima8Engine::get_instance()->getAvatarMoverProcess();
+ AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
if (proc) {
proc->setMovementFlag(AvatarMoverProcess::MOVE_TURN_LEFT);
@@ -1210,11 +1215,13 @@ bool Debugger::cmdStartTurnLeft(int argc, const char **argv) {
}
bool Debugger::cmdStartTurnRight(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
+ Ultima8Engine *engine = Ultima8Engine::get_instance();
+ engine->moveKeyEvent();
+ if (engine->isAvatarInStasis()) {
debugPrintf("Can't turn right: avatarInStasis\n");
return false;
}
- AvatarMoverProcess *proc = Ultima8Engine::get_instance()->getAvatarMoverProcess();
+ AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
if (proc) {
proc->setMovementFlag(AvatarMoverProcess::MOVE_TURN_RIGHT);
@@ -1223,11 +1230,13 @@ bool Debugger::cmdStartTurnRight(int argc, const char **argv) {
}
bool Debugger::cmdStartMoveForward(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
+ Ultima8Engine *engine = Ultima8Engine::get_instance();
+ engine->moveKeyEvent();
+ if (engine->isAvatarInStasis()) {
debugPrintf("Can't move forward: avatarInStasis\n");
return false;
}
- AvatarMoverProcess *proc = Ultima8Engine::get_instance()->getAvatarMoverProcess();
+ AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
if (proc) {
proc->setMovementFlag(AvatarMoverProcess::MOVE_FORWARD);
@@ -1236,11 +1245,13 @@ bool Debugger::cmdStartMoveForward(int argc, const char **argv) {
}
bool Debugger::cmdStartMoveBack(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
+ Ultima8Engine *engine = Ultima8Engine::get_instance();
+ engine->moveKeyEvent();
+ if (engine->isAvatarInStasis()) {
debugPrintf("Can't move back: avatarInStasis\n");
return false;
}
- AvatarMoverProcess *proc = Ultima8Engine::get_instance()->getAvatarMoverProcess();
+ AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
if (proc) {
proc->setMovementFlag(AvatarMoverProcess::MOVE_BACK);
@@ -1249,11 +1260,13 @@ bool Debugger::cmdStartMoveBack(int argc, const char **argv) {
}
bool Debugger::cmdStartMoveLeft(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
+ Ultima8Engine *engine = Ultima8Engine::get_instance();
+ engine->moveKeyEvent();
+ if (engine->isAvatarInStasis()) {
debugPrintf("Can't move left: avatarInStasis\n");
return false;
}
- AvatarMoverProcess *proc = Ultima8Engine::get_instance()->getAvatarMoverProcess();
+ AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
if (proc) {
proc->setMovementFlag(AvatarMoverProcess::MOVE_LEFT);
@@ -1262,11 +1275,13 @@ bool Debugger::cmdStartMoveLeft(int argc, const char **argv) {
}
bool Debugger::cmdStartMoveRight(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
+ Ultima8Engine *engine = Ultima8Engine::get_instance();
+ engine->moveKeyEvent();
+ if (engine->isAvatarInStasis()) {
debugPrintf("Can't move right: avatarInStasis\n");
return false;
}
- AvatarMoverProcess *proc = Ultima8Engine::get_instance()->getAvatarMoverProcess();
+ AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
if (proc) {
proc->setMovementFlag(AvatarMoverProcess::MOVE_RIGHT);
@@ -1275,11 +1290,13 @@ bool Debugger::cmdStartMoveRight(int argc, const char **argv) {
}
bool Debugger::cmdStartMoveUp(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
+ Ultima8Engine *engine = Ultima8Engine::get_instance();
+ engine->moveKeyEvent();
+ if (engine->isAvatarInStasis()) {
debugPrintf("Can't move up: avatarInStasis\n");
return false;
}
- AvatarMoverProcess *proc = Ultima8Engine::get_instance()->getAvatarMoverProcess();
+ AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
if (proc) {
proc->setMovementFlag(AvatarMoverProcess::MOVE_UP);
@@ -1288,11 +1305,13 @@ bool Debugger::cmdStartMoveUp(int argc, const char **argv) {
}
bool Debugger::cmdStartMoveDown(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
+ Ultima8Engine *engine = Ultima8Engine::get_instance();
+ engine->moveKeyEvent();
+ if (engine->isAvatarInStasis()) {
debugPrintf("Can't move down: avatarInStasis\n");
return false;
}
- AvatarMoverProcess *proc = Ultima8Engine::get_instance()->getAvatarMoverProcess();
+ AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
if (proc) {
proc->setMovementFlag(AvatarMoverProcess::MOVE_DOWN);
@@ -1301,11 +1320,13 @@ bool Debugger::cmdStartMoveDown(int argc, const char **argv) {
}
bool Debugger::cmdStopTurnLeft(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
+ Ultima8Engine *engine = Ultima8Engine::get_instance();
+ engine->moveKeyEvent();
+ if (engine->isAvatarInStasis()) {
debugPrintf("Can't turn left: avatarInStasis\n");
return false;
}
- AvatarMoverProcess *proc = Ultima8Engine::get_instance()->getAvatarMoverProcess();
+ AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
if (proc) {
proc->clearMovementFlag(AvatarMoverProcess::MOVE_TURN_LEFT);
@@ -1314,11 +1335,13 @@ bool Debugger::cmdStopTurnLeft(int argc, const char **argv) {
}
bool Debugger::cmdStopTurnRight(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
+ Ultima8Engine *engine = Ultima8Engine::get_instance();
+ engine->moveKeyEvent();
+ if (engine->isAvatarInStasis()) {
debugPrintf("Can't turn right: avatarInStasis\n");
return false;
}
- AvatarMoverProcess *proc = Ultima8Engine::get_instance()->getAvatarMoverProcess();
+ AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
if (proc) {
proc->clearMovementFlag(AvatarMoverProcess::MOVE_TURN_RIGHT);
@@ -1327,11 +1350,13 @@ bool Debugger::cmdStopTurnRight(int argc, const char **argv) {
}
bool Debugger::cmdStopMoveForward(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
+ Ultima8Engine *engine = Ultima8Engine::get_instance();
+ engine->moveKeyEvent();
+ if (engine->isAvatarInStasis()) {
debugPrintf("Can't move forward: avatarInStasis\n");
return false;
}
- AvatarMoverProcess *proc = Ultima8Engine::get_instance()->getAvatarMoverProcess();
+ AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
if (proc) {
proc->clearMovementFlag(AvatarMoverProcess::MOVE_FORWARD);
@@ -1340,11 +1365,13 @@ bool Debugger::cmdStopMoveForward(int argc, const char **argv) {
}
bool Debugger::cmdStopMoveBack(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
+ Ultima8Engine *engine = Ultima8Engine::get_instance();
+ engine->moveKeyEvent();
+ if (engine->isAvatarInStasis()) {
debugPrintf("Can't move back: avatarInStasis\n");
return false;
}
- AvatarMoverProcess *proc = Ultima8Engine::get_instance()->getAvatarMoverProcess();
+ AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
if (proc) {
// Clear both back and forward as avatar turns then moves forward when not in combat
@@ -1354,11 +1381,13 @@ bool Debugger::cmdStopMoveBack(int argc, const char **argv) {
}
bool Debugger::cmdStopMoveLeft(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
+ Ultima8Engine *engine = Ultima8Engine::get_instance();
+ engine->moveKeyEvent();
+ if (engine->isAvatarInStasis()) {
debugPrintf("Can't move left: avatarInStasis\n");
return false;
}
- AvatarMoverProcess *proc = Ultima8Engine::get_instance()->getAvatarMoverProcess();
+ AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
if (proc) {
proc->clearMovementFlag(AvatarMoverProcess::MOVE_LEFT);
@@ -1367,11 +1396,13 @@ bool Debugger::cmdStopMoveLeft(int argc, const char **argv) {
}
bool Debugger::cmdStopMoveRight(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
+ Ultima8Engine *engine = Ultima8Engine::get_instance();
+ engine->moveKeyEvent();
+ if (engine->isAvatarInStasis()) {
debugPrintf("Can't move right: avatarInStasis\n");
return false;
}
- AvatarMoverProcess *proc = Ultima8Engine::get_instance()->getAvatarMoverProcess();
+ AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
if (proc) {
proc->clearMovementFlag(AvatarMoverProcess::MOVE_RIGHT);
@@ -1380,11 +1411,13 @@ bool Debugger::cmdStopMoveRight(int argc, const char **argv) {
}
bool Debugger::cmdStopMoveUp(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
+ Ultima8Engine *engine = Ultima8Engine::get_instance();
+ engine->moveKeyEvent();
+ if (engine->isAvatarInStasis()) {
debugPrintf("Can't move up: avatarInStasis\n");
return false;
}
- AvatarMoverProcess *proc = Ultima8Engine::get_instance()->getAvatarMoverProcess();
+ AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
if (proc) {
proc->clearMovementFlag(AvatarMoverProcess::MOVE_UP);
@@ -1393,11 +1426,13 @@ bool Debugger::cmdStopMoveUp(int argc, const char **argv) {
}
bool Debugger::cmdStopMoveDown(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
+ Ultima8Engine *engine = Ultima8Engine::get_instance();
+ engine->moveKeyEvent();
+ if (engine->isAvatarInStasis()) {
debugPrintf("Can't move down: avatarInStasis\n");
return false;
}
- AvatarMoverProcess *proc = Ultima8Engine::get_instance()->getAvatarMoverProcess();
+ AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
if (proc) {
proc->clearMovementFlag(AvatarMoverProcess::MOVE_DOWN);
@@ -1406,11 +1441,13 @@ bool Debugger::cmdStopMoveDown(int argc, const char **argv) {
}
bool Debugger::cmdStartMoveRun(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
+ Ultima8Engine *engine = Ultima8Engine::get_instance();
+ engine->moveKeyEvent();
+ if (engine->isAvatarInStasis()) {
debugPrintf("Can't run: avatarInStasis\n");
return false;
}
- AvatarMoverProcess *proc = Ultima8Engine::get_instance()->getAvatarMoverProcess();
+ AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
if (proc) {
proc->setMovementFlag(AvatarMoverProcess::MOVE_RUN);
@@ -1419,11 +1456,13 @@ bool Debugger::cmdStartMoveRun(int argc, const char **argv) {
}
bool Debugger::cmdStopMoveRun(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
+ Ultima8Engine *engine = Ultima8Engine::get_instance();
+ engine->moveKeyEvent();
+ if (engine->isAvatarInStasis()) {
debugPrintf("Can't run: avatarInStasis\n");
return false;
}
- AvatarMoverProcess *proc = Ultima8Engine::get_instance()->getAvatarMoverProcess();
+ AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
if (proc) {
proc->clearMovementFlag(AvatarMoverProcess::MOVE_RUN);
@@ -1432,11 +1471,13 @@ bool Debugger::cmdStopMoveRun(int argc, const char **argv) {
}
bool Debugger::cmdStartMoveStep(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
+ Ultima8Engine *engine = Ultima8Engine::get_instance();
+ engine->moveKeyEvent();
+ if (engine->isAvatarInStasis()) {
debugPrintf("Can't step: avatarInStasis\n");
return false;
}
- AvatarMoverProcess *proc = Ultima8Engine::get_instance()->getAvatarMoverProcess();
+ AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
if (proc) {
proc->setMovementFlag(AvatarMoverProcess::MOVE_STEP);
@@ -1445,11 +1486,13 @@ bool Debugger::cmdStartMoveStep(int argc, const char **argv) {
}
bool Debugger::cmdStopMoveStep(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
+ Ultima8Engine *engine = Ultima8Engine::get_instance();
+ engine->moveKeyEvent();
+ if (engine->isAvatarInStasis()) {
debugPrintf("Can't step: avatarInStasis\n");
return false;
}
- AvatarMoverProcess *proc = Ultima8Engine::get_instance()->getAvatarMoverProcess();
+ AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
if (proc) {
proc->clearMovementFlag(AvatarMoverProcess::MOVE_STEP);
diff --git a/engines/ultima/ultima8/ultima8.cpp b/engines/ultima/ultima8/ultima8.cpp
index 83f15645e9..15b98b3a98 100644
--- a/engines/ultima/ultima8/ultima8.cpp
+++ b/engines/ultima/ultima8/ultima8.cpp
@@ -151,7 +151,7 @@ Ultima8Engine::Ultima8Engine(OSystem *syst, const Ultima::UltimaGameDescription
_showTouching(false), _timeOffset(0), _hasCheated(false), _cheatsEnabled(false),
_ttfOverrides(false), _audioMixer(0), _scalerGump(nullptr),
_inverterGump(nullptr), _lerpFactor(256), _inBetweenFrame(false),
- _unkCrusaderFlag(false) {
+ _unkCrusaderFlag(false), _moveKeyFrame(0) {
_application = this;
}
@@ -1353,6 +1353,14 @@ uint32 Ultima8Engine::getGameTimeInSeconds() {
return (Kernel::get_instance()->getFrameNum() + _timeOffset) / 30; // constant!
}
+void Ultima8Engine::moveKeyEvent() {
+ _moveKeyFrame = Kernel::get_instance()->getFrameNum();
+}
+
+bool Ultima8Engine::moveKeyDownRecently() {
+ uint32 nowframe = Kernel::get_instance()->getFrameNum();
+ return (nowframe - _moveKeyFrame) < 60;
+}
void Ultima8Engine::save(Common::WriteStream *ws) {
uint8 s = (_avatarInStasis ? 1 : 0);
@@ -1501,6 +1509,11 @@ uint32 Ultima8Engine::I_closeItemGumps(const uint8 *args, unsigned int /*argsize
return 0;
}
+uint32 Ultima8Engine::I_moveKeyDownRecently(const uint8 *args, unsigned int /*argsize*/) {
+ Ultima8Engine *g = Ultima8Engine::get_instance();
+ return g->moveKeyDownRecently() ? 1 : 0;
+}
+
bool Ultima8Engine::isDataRequired(Common::String &folder, int &majorVersion, int &minorVersion) {
folder = "ultima8";
majorVersion = 1;
diff --git a/engines/ultima/ultima8/ultima8.h b/engines/ultima/ultima8/ultima8.h
index 21c2e1a5df..be8f34cf71 100644
--- a/engines/ultima/ultima8/ultima8.h
+++ b/engines/ultima/ultima8/ultima8.h
@@ -122,6 +122,7 @@ private:
bool _cheatsEnabled;
unsigned int _inversion;
bool _unkCrusaderFlag; //!< not sure what this is but it's only used in usecode for crusader, so just keep track of it..
+ uint32 _moveKeyFrame; //!< An imperfect way for the Crusader usecode to stop remote camera viewing.
private:
/**
* Does engine deinitialization
@@ -226,6 +227,7 @@ public:
INTRINSIC(I_closeItemGumps);
INTRINSIC(I_setCruStasis);
INTRINSIC(I_clrCruStasis);
+ INTRINSIC(I_moveKeyDownRecently);
void setAvatarInStasis(bool stat) {
_avatarInStasis = stat;
@@ -256,6 +258,9 @@ public:
_unkCrusaderFlag = flag;
}
+ void moveKeyEvent();
+ bool moveKeyDownRecently();
+
uint32 getGameTimeInSeconds();
GameMapGump *getGameMapGump() {
Commit: 5aed3fb26c8a6e7f0399abdf6a16859d4e86b773
https://github.com/scummvm/scummvm/commit/5aed3fb26c8a6e7f0399abdf6a16859d4e86b773
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-07-14T15:41:54+09:00
Commit Message:
ULTIMA8: Correct process type for GuardProcess
Changed paths:
engines/ultima/ultima8/world/actors/guard_process.cpp
diff --git a/engines/ultima/ultima8/world/actors/guard_process.cpp b/engines/ultima/ultima8/world/actors/guard_process.cpp
index 6ab51b2962..71ce6e38ee 100644
--- a/engines/ultima/ultima8/world/actors/guard_process.cpp
+++ b/engines/ultima/ultima8/world/actors/guard_process.cpp
@@ -43,7 +43,7 @@ GuardProcess::GuardProcess() : Process() {
GuardProcess::GuardProcess(Actor *actor) {
assert(actor);
_itemNum = actor->getObjId();
- _type = 0x255;
+ _type = 0x25e;
}
void GuardProcess::run() {
@@ -54,6 +54,7 @@ void GuardProcess::run() {
return;
}
+ // Do nothing if busy
int activeanim = Kernel::get_instance()->getNumProcesses(a->getObjId(), ActorAnimProcess::ACTOR_ANIM_PROC_TYPE);
if (activeanim > 0)
return;
@@ -71,6 +72,7 @@ void GuardProcess::run() {
return;
} else {
// TODO: What animation happens in here?
+ //int animno = (getRandom() % 2 ? 0x1e : 0x1f);
//a->tryAnim(0x1e, a->getDir());
}
return;
Commit: 7cf410a3e9087b599902f7464139b4416ebcf5cd
https://github.com/scummvm/scummvm/commit/7cf410a3e9087b599902f7464139b4416ebcf5cd
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-07-14T15:43:16+09:00
Commit Message:
ULTIMA8: Support equip usecode event with parameter (fixes valves in Crusader)
Changed paths:
engines/ultima/ultima8/world/actors/actor.cpp
engines/ultima/ultima8/world/item.cpp
engines/ultima/ultima8/world/item.h
diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index 8375231d2d..24e5200cc2 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -1172,6 +1172,7 @@ void Actor::notifyNearbyItems() {
For now this is a temporary hack to trigger some usecode events so we can
debug more of the game.
*/
+ /*
UCList uclist(2);
LOOPSCRIPT(script, LS_TOKEN_TRUE); // we want all items
CurrentMap *currentmap = World::get_instance()->getCurrentMap();
@@ -1181,9 +1182,9 @@ void Actor::notifyNearbyItems() {
Item *item = getItem(uclist.getuint16(i));
if (_notifiedItems.find(item->getObjId()) != _notifiedItems.end())
continue;
- item->callUsecodeEvent_npcNearby(_objId);
+ item->callUsecodeEvent_equipWithParam(_objId);
_notifiedItems.insert(item->getObjId());
- }
+ }*/
}
bool Actor::areEnemiesNear() {
diff --git a/engines/ultima/ultima8/world/item.cpp b/engines/ultima/ultima8/world/item.cpp
index 351faadafc..aca69101f8 100644
--- a/engines/ultima/ultima8/world/item.cpp
+++ b/engines/ultima/ultima8/world/item.cpp
@@ -1227,17 +1227,17 @@ uint32 Item::callUsecodeEvent_release() { // event 9
return callUsecodeEvent(9); // CONSTANT
}
-uint32 Item::callUsecodeEvent_equip() { // event A
+uint32 Item::callUsecodeEvent_equip() { // event A
return callUsecodeEvent(0xA); // CONSTANT
}
-uint32 Item::callUsecodeEvent_npcNearby(ObjId npc) { // event A
+uint32 Item::callUsecodeEvent_equipWithParam(ObjId param) { // event A
DynamicUCStack arg_stack(2);
- arg_stack.push2(npc);
+ arg_stack.push2(param);
return callUsecodeEvent(0xA, arg_stack.access(), 2);
}
-uint32 Item::callUsecodeEvent_unequip() { // event B
+uint32 Item::callUsecodeEvent_unequip() { // event B
return callUsecodeEvent(0xB); // CONSTANT
}
@@ -2488,9 +2488,10 @@ uint32 Item::I_gotHit(const uint8 *args, unsigned int /*argsize*/) {
uint32 Item::I_equip(const uint8 *args, unsigned int /*argsize*/) {
ARG_ITEM_FROM_PTR(item);
+ ARG_UINT16(unk);
if (!item) return 0;
- return item->callUsecodeEvent_equip();
+ return item->callUsecodeEvent_equipWithParam(unk);
}
uint32 Item::I_unequip(const uint8 *args, unsigned int /*argsize*/) {
diff --git a/engines/ultima/ultima8/world/item.h b/engines/ultima/ultima8/world/item.h
index dec7d85a45..ce365201f7 100644
--- a/engines/ultima/ultima8/world/item.h
+++ b/engines/ultima/ultima8/world/item.h
@@ -401,7 +401,7 @@ public:
uint32 callUsecodeEvent_schedule(uint32 time); // event 8
uint32 callUsecodeEvent_release(); // event 9
uint32 callUsecodeEvent_equip(); // event A
- uint32 callUsecodeEvent_npcNearby(ObjId npc); // event A
+ uint32 callUsecodeEvent_equipWithParam(ObjId param); // event A
uint32 callUsecodeEvent_unequip(); // event B
uint32 callUsecodeEvent_combine(); // event C
uint32 callUsecodeEvent_enterFastArea(); // event F
More information about the Scummvm-git-logs
mailing list