[Scummvm-git-logs] scummvm master -> f0427000562cc7c3c653a28eab087c8249ebde29
mduggan
mgithub at guarana.org
Mon Mar 29 12:24:32 UTC 2021
This automated email contains information about 3 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
3b618a0f1c ULTIMA8: Implement I_setTarget and I_isFalling for Crusader
3d1fa4b6eb ULTIMA8: Wire up I_shoot intrinsic for Crusader
f042700056 ULTIMA8: Wire up more No Regret intrinsics
Commit: 3b618a0f1cdcea418cfd29d7743dfd4b7898bccc
https://github.com/scummvm/scummvm/commit/3b618a0f1cdcea418cfd29d7743dfd4b7898bccc
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-03-29T19:49:31+09:00
Commit Message:
ULTIMA8: Implement I_setTarget and I_isFalling for Crusader
Changed paths:
engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
engines/ultima/ultima8/usecode/regret_intrinsics.h
engines/ultima/ultima8/usecode/remorse_intrinsics.h
engines/ultima/ultima8/world/actors/actor.cpp
engines/ultima/ultima8/world/actors/actor.h
engines/ultima/ultima8/world/actors/attack_process.h
diff --git a/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h b/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
index edf27b0c2c..574c304446 100644
--- a/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
+++ b/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
@@ -284,7 +284,7 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"int16 Actor::I_getDefaultActivity1(Actor *)",
"int16 Actor::I_getDefaultActivity2(Actor *)",
"int16 Actor::I_getLastAnimSet(4 bytes)", // part of same coff set 01D, 05A, 0B9, 0D7, 0E4, 124
- "void Actor::I_attack(Actor *, uint16 target)",
+ "void Actor::I_setTarget(Actor *, uint16 target)",
"void Actor::I_SetNPCDataField0x63_0E6(Actor *, int)",
"void Actor::I_setDead(4 bytes)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
"int16 Item::I_cast(6 bytes)",
diff --git a/engines/ultima/ultima8/usecode/regret_intrinsics.h b/engines/ultima/ultima8/usecode/regret_intrinsics.h
index f6f95f3959..30ff85a660 100644
--- a/engines/ultima/ultima8/usecode/regret_intrinsics.h
+++ b/engines/ultima/ultima8/usecode/regret_intrinsics.h
@@ -263,7 +263,7 @@ Intrinsic RegretIntrinsics[] = {
Actor::I_getDefaultActivity1, // Intrinsic0D8()
Actor::I_getDefaultActivity2, // Intrinsic0D9()
Actor::I_getLastAnimSet, // Intrinsic0DA()
- 0, // Actor::I_isFalling()
+ Actor::I_isFalling, // Actor::I_isFalling()
Item::I_getQLo, // Intrinsic0DC()
Item::I_getQHi, // Intrinsic0DD()
Actor::I_getNpcNum, // Intrinsic0DE()
diff --git a/engines/ultima/ultima8/usecode/remorse_intrinsics.h b/engines/ultima/ultima8/usecode/remorse_intrinsics.h
index 824785c8b6..79ee5d4879 100644
--- a/engines/ultima/ultima8/usecode/remorse_intrinsics.h
+++ b/engines/ultima/ultima8/usecode/remorse_intrinsics.h
@@ -278,7 +278,7 @@ Intrinsic RemorseIntrinsics[] = {
Actor::I_getDefaultActivity1, // void Intrinsic0E2(4 bytes)
Actor::I_getDefaultActivity2, // void Intrinsic0E3(4 bytes)
Actor::I_getLastAnimSet, // void Intrinsic0E4(4 bytes)
- 0, // TODO: Actor::I_attack(Actor *, uint16 target) (implement me)
+ Actor::I_setTarget,
Actor::I_setUnkByte, // void Intrinsic0E6(6 bytes)
Actor::I_setDead,
Item::I_cast, // void Intrinsic0E8(6 bytes)
diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index 1331eb6c72..e8a6d60df8 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -55,6 +55,7 @@
#include "ultima/ultima8/world/loop_script.h"
#include "ultima/ultima8/audio/audio_process.h"
#include "ultima/ultima8/audio/music_process.h"
+#include "ultima/ultima8/world/gravity_process.h"
namespace Ultima {
namespace Ultima8 {
@@ -1405,6 +1406,17 @@ int Actor::calculateAttackDamage(uint16 other, int damage, uint16 damage_type) {
return damage;
}
+bool Actor::isFalling() const {
+ ProcId gravitypid = getGravityPID();
+ if (!gravitypid)
+ return false;
+
+ // TODO: this is not exactly the same as the Crusader implementation,
+ // but pretty close. Is that ok?
+ GravityProcess *proc = dynamic_cast<GravityProcess *>(Kernel::get_instance()->getProcess(gravitypid));
+ return (proc && proc->is_active());
+}
+
CombatProcess *Actor::getCombatProcess() {
Process *p = Kernel::get_instance()->findProcess(_objId, 0xF2); // CONSTANT!
if (!p)
@@ -1888,21 +1900,31 @@ uint32 Actor::I_setTarget(const uint8 *args, unsigned int /*argsize*/) {
ARG_UINT16(target);
if (!actor) return 0;
- assert(GAME_IS_U8);
+ if (GAME_IS_U8) {
+ CombatProcess *cp = actor->getCombatProcess();
+ if (!cp) {
+ actor->setInCombatU8();
+ cp = actor->getCombatProcess();
+ }
+ if (!cp) {
+ warning("Actor::I_setTarget: failed to enter combat mode");
+ return 0;
+ }
- CombatProcess *cp = actor->getCombatProcess();
- if (!cp) {
- actor->setInCombatU8();
- cp = actor->getCombatProcess();
- }
- if (!cp) {
- perr << "Actor::I_setTarget: failed to enter combat mode"
- << Std::endl;
- return 0;
+ cp->setTarget(target);
+ } else {
+ if (actor->isDead() || actor->getObjId() == 1)
+ return 0;
+
+ actor->setActivityCru(5);
+ AttackProcess *ap = actor->getAttackProcess();
+ if (!ap) {
+ warning("Actor::I_setTarget: failed to enter attack mode");
+ return 0;
+ }
+ ap->setTarget(target);
}
- cp->setTarget(target);
-
return 0;
}
@@ -2416,5 +2438,12 @@ uint32 Actor::I_isKneeling(const uint8 *args, unsigned int /*argsize*/) {
return actor->isKneeling() ? 1 : 0;
}
+uint32 Actor::I_isFalling(const uint8 *args, unsigned int /*argsize*/) {
+ ARG_ACTOR_FROM_PTR(actor);
+ if (!actor) return 0;
+
+ return actor->isFalling() ? 1 : 0;
+}
+
} // 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 e8cbe9c637..2326976b39 100644
--- a/engines/ultima/ultima8/world/actors/actor.h
+++ b/engines/ultima/ultima8/world/actors/actor.h
@@ -88,6 +88,8 @@ public:
return (_actorFlags & ACT_KNEELING) != 0;
}
+ bool isFalling() const;
+
CombatProcess *getCombatProcess(); // in U8
AttackProcess *getAttackProcess(); // in Crusader
virtual void setInCombat(int activity);
@@ -357,6 +359,7 @@ public:
INTRINSIC(I_getCurrentActivityNo);
INTRINSIC(I_turnToward);
INTRINSIC(I_isKneeling);
+ INTRINSIC(I_isFalling);
enum ActorFlags {
ACT_INVINCIBLE = 0x000001, // flags from npcdata byte 0x1B
diff --git a/engines/ultima/ultima8/world/actors/attack_process.h b/engines/ultima/ultima8/world/actors/attack_process.h
index 73a8650ce7..e3019974cd 100644
--- a/engines/ultima/ultima8/world/actors/attack_process.h
+++ b/engines/ultima/ultima8/world/actors/attack_process.h
@@ -73,6 +73,10 @@ public:
return _target;
}
+ void setTarget(uint16 target) {
+ _target = target;
+ }
+
bool loadData(Common::ReadStream *rs, uint32 version);
void saveData(Common::WriteStream *ws) override;
Commit: 3d1fa4b6eb3541f022ebe4b759b5b9259a4dda02
https://github.com/scummvm/scummvm/commit/3d1fa4b6eb3541f022ebe4b759b5b9259a4dda02
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-03-29T19:49:31+09:00
Commit Message:
ULTIMA8: Wire up I_shoot intrinsic for Crusader
Changed paths:
engines/ultima/ultima8/usecode/remorse_intrinsics.h
engines/ultima/ultima8/world/item.cpp
diff --git a/engines/ultima/ultima8/usecode/remorse_intrinsics.h b/engines/ultima/ultima8/usecode/remorse_intrinsics.h
index 79ee5d4879..d1d54a7e25 100644
--- a/engines/ultima/ultima8/usecode/remorse_intrinsics.h
+++ b/engines/ultima/ultima8/usecode/remorse_intrinsics.h
@@ -181,7 +181,7 @@ Intrinsic RemorseIntrinsics[] = {
CameraProcess::I_getCameraY, // void Intrinsic087(void)
Item::I_setMapArray,
Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
- 0, // void Intrinsic08A(12 bytes)
+ Item::I_shoot, // void Intrinsic08A(12 bytes)
Item::I_enterFastArea, // void Intrinsic08B(4 bytes)
Item::I_setBroken, // void Intrinsic08C(4 bytes)
Item::I_hurl, // void Intrinsic08D(12 bytes)
diff --git a/engines/ultima/ultima8/world/item.cpp b/engines/ultima/ultima8/world/item.cpp
index b2c957af68..3753e5e91a 100644
--- a/engines/ultima/ultima8/world/item.cpp
+++ b/engines/ultima/ultima8/world/item.cpp
@@ -3613,7 +3613,6 @@ uint32 Item::I_shoot(const uint8 *args, unsigned int /*argsize*/) {
ARG_UINT16(gravity); // either 2 (fish) or 1 (death disk, dart)
if (!item) return 0;
- assert(GAME_IS_U8);
MissileTracker tracker(item, point.getX(), point.getY(), point.getZ(),
speed, gravity);
tracker.launchItem();
Commit: f0427000562cc7c3c653a28eab087c8249ebde29
https://github.com/scummvm/scummvm/commit/f0427000562cc7c3c653a28eab087c8249ebde29
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-03-29T19:49:31+09:00
Commit Message:
ULTIMA8: Wire up more No Regret intrinsics
Changed paths:
engines/ultima/ultima8/convert/crusader/convert_usecode_regret.h
engines/ultima/ultima8/gumps/movie_gump.cpp
engines/ultima/ultima8/gumps/movie_gump.h
engines/ultima/ultima8/usecode/regret_intrinsics.h
engines/ultima/ultima8/world/item.cpp
engines/ultima/ultima8/world/item.h
diff --git a/engines/ultima/ultima8/convert/crusader/convert_usecode_regret.h b/engines/ultima/ultima8/convert/crusader/convert_usecode_regret.h
index 571cb58288..dfc92e2f6d 100644
--- a/engines/ultima/ultima8/convert/crusader/convert_usecode_regret.h
+++ b/engines/ultima/ultima8/convert/crusader/convert_usecode_regret.h
@@ -106,7 +106,7 @@ const char* const ConvertUsecodeRegret::_intrinsics[] = {
"MainActor::I_addItemCru()",
"Actor::I_getMap()",
"Item::callEvent11(sint16)",
- "Intrinsic003F()",
+ "CameraProcess::I_somethingAboutCameraUpdate()",
// 0040
"AudioProcess::I_stopSFXCru()",
"Item::isOn(uint16)",
@@ -130,7 +130,7 @@ const char* const ConvertUsecodeRegret::_intrinsics[] = {
"Actor::I_setDefaultActivity2()",
"Actor::I_setActivity()",
"World::I_setControlledNPCNum()",
- "Intrinsic0055()",
+ "Item::I_receiveHit()",
"Game::I_isReleaseBuild()",
"MainActor::I_setMana()",
"Item::use(void)",
@@ -152,16 +152,16 @@ const char* const ConvertUsecodeRegret::_intrinsics[] = {
"Item::hurl(sint16,sint16,sint16,sint16)",
"Kernel::getNumProcesses(uint16,ProcessType)",
"Item::getCY(void)",
- "Intrinsic006A()",
+ "U8Engine::I_isCfgAnimationOff()",
"Intrinsic006B()",
"MusicProcess::I_pauseMusic()",
- "Intrinsic006D()",
+ "MovieGump::I_playMovieCutsceneRegret()",
"MusicProcess::I_unpauseMusic()",
"Item::isInNpc(void)",
// 0070
"Ultima8Engine::I_setCruStasis()",
"Ultima8Engine::I_clrCruStasis()",
- "Intrinsic0072()",
+ "PaletteFaderProcess::I_jumpToColor()",
"PaletteFaderProcess::I_fadeFromBlack()",
"Actor::isDead(void)",
"Item::getNpcNum(void)",
@@ -276,7 +276,7 @@ const char* const ConvertUsecodeRegret::_intrinsics[] = {
"Item::getQLo(void)",
"Item::getQHi(void)",
"Item::getNpcNum(void)",
- "Intrinsic00DF()",
+ "Item::I_setField0x81()",
// 00E0
"Item::hurl(sint16,sint16,sint16,sint16)",
"Actor::I_setDead()",
@@ -385,7 +385,7 @@ const char* const ConvertUsecodeRegret::_intrinsics[] = {
"PaletteFaderProcess::I_fadeToGivenColor()",
"Actor::isDead(void)",
"Actor::I_setDead()",
- "Intrinsic0145()",
+ "I_maybeShowCredits()",
"PaletteFaderProcess::I_jumpToAllGrey()",
"Item::I_getFamilyOfType()",
"Item::getNpcNum(void)",
@@ -398,7 +398,7 @@ const char* const ConvertUsecodeRegret::_intrinsics[] = {
"Egg::getEggXRange(void)",
// 0150
"Actor::I_clrInCombat()",
- "Intrinsic0072()",
+ "PaletteFaderProcess::I_jumpToColor()",
"Item::setFrame(uint16)",
"UCMachine::I_numToStr()",
"Actor::I_getDir()",
diff --git a/engines/ultima/ultima8/gumps/movie_gump.cpp b/engines/ultima/ultima8/gumps/movie_gump.cpp
index c77705fc61..78cabc8c3a 100644
--- a/engines/ultima/ultima8/gumps/movie_gump.cpp
+++ b/engines/ultima/ultima8/gumps/movie_gump.cpp
@@ -250,6 +250,21 @@ uint32 MovieGump::I_playMovieCutsceneAlt(const uint8 *args, unsigned int /*argsi
return 0;
}
+uint32 MovieGump::I_playMovieCutsceneRegret(const uint8 *args, unsigned int /*argsize*/) {
+ ARG_STRING(name);
+ ARG_UINT8(fade);
+
+ warning("MovieGump::I_playMovieCutsceneRegret: TODO: use fade argument %d", fade);
+
+ Common::SeekableReadStream *rs = _tryLoadCruMovie(name);
+ if (rs) {
+ Gump *gump = new MovieGump(640, 480, rs, false, false);
+ gump->InitGump(nullptr, true);
+ gump->setRelativePosition(CENTER);
+ }
+
+ return 0;
+}
} // End of namespace Ultima8
} // End of namespace Ultima
diff --git a/engines/ultima/ultima8/gumps/movie_gump.h b/engines/ultima/ultima8/gumps/movie_gump.h
index ee00741710..3ea99e0275 100644
--- a/engines/ultima/ultima8/gumps/movie_gump.h
+++ b/engines/ultima/ultima8/gumps/movie_gump.h
@@ -63,6 +63,7 @@ public:
INTRINSIC(I_playMovieOverlay);
INTRINSIC(I_playMovieCutscene);
INTRINSIC(I_playMovieCutsceneAlt);
+ INTRINSIC(I_playMovieCutsceneRegret);
protected:
MoviePlayer *_player;
diff --git a/engines/ultima/ultima8/usecode/regret_intrinsics.h b/engines/ultima/ultima8/usecode/regret_intrinsics.h
index 30ff85a660..e24fc7c285 100644
--- a/engines/ultima/ultima8/usecode/regret_intrinsics.h
+++ b/engines/ultima/ultima8/usecode/regret_intrinsics.h
@@ -125,7 +125,7 @@ Intrinsic RegretIntrinsics[] = {
UCMachine::I_true, // Actually Game::I_isReleaseBuild
MainActor::I_setMana, // Intrinsic057()
Item::I_use, // Intrinsic058()
- 0, // Intrinsic059()
+ Item::I_setUnkEggType, // Intrinsic059()
MusicProcess::I_playMusic, // Intrinsic05A()
Item::I_getSurfaceWeight, // Intrinsic05B()
Item::I_isCentreOn, // Intrinsic05C()
@@ -143,20 +143,20 @@ Intrinsic RegretIntrinsics[] = {
Item::I_hurl, // Intrinsic067()
Kernel::I_getNumProcesses, // Intrinsic068()
Item::I_getCY, // Intrinsic069()
- 0, // Intrinsic06A()
+ 0, // Intrinsic06A() I_isAnimDisabled
0, // Intrinsic06B()
MusicProcess::I_pauseMusic, // Intrinsic06C()
- 0, // Intrinsic06D()
+ MovieGump::I_playMovieCutsceneRegret, // Intrinsic06D()
MusicProcess::I_unpauseMusic, // Intrinsic06E()
Item::I_isInNpc, // Intrinsic06F()
// 0070
Ultima8Engine::I_setCruStasis, // Intrinsic070()
Ultima8Engine::I_clrCruStasis, // Intrinsic071()
- 0, // Intrinsic072()
+ 0, // Intrinsic072() PaletteFaderProcess::I_jumpToColor
PaletteFaderProcess::I_fadeFromBlack, // Intrinsic073()
Actor::I_isDead, // Intrinsic074()
Actor::I_getNpcNum, // Intrinsic075()
- 0, // Intrinsic076()
+ 0, // Intrinsic076() - null intrinsic
UCMachine::I_true, // Actually Game::I_isViolenceEnabled
Item::I_unequip, // Intrinsic078()
Item::I_andStatus, // Intrinsic079()
@@ -187,7 +187,7 @@ Intrinsic RegretIntrinsics[] = {
CameraProcess::I_getCameraY, // Intrinsic090()
Item::I_setMapArray, // Intrinsic091()
Actor::I_getNpcNum, // Intrinsic092()
- 0, // Intrinsic093()
+ Item::I_shoot, // Intrinsic093()
CameraProcess::I_setCenterOn, // Intrinsic094()
Item::I_enterFastArea, // Intrinsic095()
Item::I_setBroken, // Intrinsic096()
@@ -199,7 +199,7 @@ Intrinsic RegretIntrinsics[] = {
Actor::I_clrInCombat, // Intrinsic09C()
PaletteFaderProcess::I_jumpToGreyScale, // Intrinsic09D()
PaletteFaderProcess::I_jumpToNormalPalette, // Intrinsic09E()
- 0, // Intrinsic09F(), same as Int05F in Remorse
+ CruStatusGump::I_showStatusGump, // Intrinsic09F(), same as Int05F in Remorse
// 00A0
Item::I_andStatus, // Intrinsic0A0()
Egg::I_getUnkEggType, // Intrinsic0A1()
@@ -267,7 +267,7 @@ Intrinsic RegretIntrinsics[] = {
Item::I_getQLo, // Intrinsic0DC()
Item::I_getQHi, // Intrinsic0DD()
Actor::I_getNpcNum, // Intrinsic0DE()
- 0, // Intrinsic0DF()
+ 0, // Intrinsic0DF() Item::I_setField0x81
// 00E0
Item::I_hurl, // Intrinsic0E0()
Actor::I_setDead, // Intrinsic0E1()
@@ -355,13 +355,13 @@ Intrinsic RegretIntrinsics[] = {
Item::I_andStatus, // Intrinsic12F()
// 0130
Actor::I_getNpcNum, // Intrinsic130()
- 0, // Intrinsic131() - same as Intrinsic 116 in No Remorse
+ Item::I_fireDistance, // Intrinsic131() - same as Intrinsic 116 in No Remorse
Item::I_andStatus, // Intrinsic132()
Item::I_hurl, // Intrinsic133()
Item::I_andStatus, // Intrinsic134()
CameraProcess::I_getCameraY, // Intrinsic135()
CameraProcess::I_getCameraZ, // Intrinsic136()
- 0, // Intrinsic137(), same as Int05D in Remorse
+ CruStatusGump::I_hideStatusGump, // Intrinsic137(), same as Int05D in Remorse
Actor::I_clrInCombat, // Intrinsic138()
Item::I_getTypeFlag, // Intrinsic139()
Actor::I_getNpcNum, // Intrinsic13A()
@@ -376,7 +376,7 @@ Intrinsic RegretIntrinsics[] = {
PaletteFaderProcess::I_fadeToGivenColor, // Intrinsic142()
Actor::I_isDead, // Intrinsic143()
Actor::I_setDead, // Intrinsic144()
- 0, // Intrinsic145()
+ 0, // Intrinsic145() - I_maybeShowCredits
PaletteFaderProcess::I_jumpToAllGrey, // Intrinsic146()
Item::I_getFamilyOfType, // Intrinsic147()
Actor::I_getNpcNum, // Intrinsic148()
@@ -389,7 +389,7 @@ Intrinsic RegretIntrinsics[] = {
Egg::I_getEggXRange, // Intrinsic14F()
// 0150
Actor::I_clrInCombat, // Intrinsic150()
- 0, // Intrinsic151()
+ 0, // Intrinsic151() PaletteFaderProcess::I_jumpToColor
Item::I_setFrame, // Intrinsic152()
UCMachine::I_numToStr, // Intrinsic153()
Actor::I_getDir, // Intrinsic154()
diff --git a/engines/ultima/ultima8/world/item.cpp b/engines/ultima/ultima8/world/item.cpp
index 3753e5e91a..7fd2df1857 100644
--- a/engines/ultima/ultima8/world/item.cpp
+++ b/engines/ultima/ultima8/world/item.cpp
@@ -2694,6 +2694,17 @@ uint32 Item::I_getUnkEggType(const uint8 *args, unsigned int /*argsize*/) {
}
}
+uint32 Item::I_setUnkEggType(const uint8 *args, unsigned int /*argsize*/) {
+ ARG_ITEM_FROM_PTR(item);
+ ARG_UINT16(val);
+ if (!item) return 0;
+
+ if (item->getFamily() == ShapeInfo::SF_UNKEGG) {
+ item->setQuality(val);
+ }
+ return 0;
+}
+
uint32 Item::I_getQuantity(const uint8 *args, unsigned int /*argsize*/) {
ARG_ITEM_FROM_PTR(item);
if (!item) return 0;
diff --git a/engines/ultima/ultima8/world/item.h b/engines/ultima/ultima8/world/item.h
index 41b0a13087..42268561e1 100644
--- a/engines/ultima/ultima8/world/item.h
+++ b/engines/ultima/ultima8/world/item.h
@@ -515,6 +515,7 @@ public:
INTRINSIC(I_setFrame);
INTRINSIC(I_getQuality);
INTRINSIC(I_getUnkEggType);
+ INTRINSIC(I_setUnkEggType);
INTRINSIC(I_getQuantity);
INTRINSIC(I_getContainer);
INTRINSIC(I_getRootContainer);
More information about the Scummvm-git-logs
mailing list