[Scummvm-git-logs] scummvm master -> da4adbb1d3ad1c2ff5acee04109403ff6e949b7c
mduggan
mgithub at guarana.org
Mon Jun 15 08:04:18 UTC 2020
This automated email contains information about 5 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
66cdc78c5b ULTIMA8: More crusader decoding
a1e67a1703 ULTIMA: Switch Crusader detection from commented-out to debug-build-only
43fa6e603a ULTIMA8: More support for Crusader intrinsics
f2832cc5b3 ULTIMA8: More Crusader usecode decoding
da4adbb1d3 ULTIMA8: More Crusader intrinsics supported
Commit: 66cdc78c5b449a3460564f47b4927056fbcdfd7e
https://github.com/scummvm/scummvm/commit/66cdc78c5b449a3460564f47b4927056fbcdfd7e
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-06-15T16:54:23+09:00
Commit Message:
ULTIMA8: More crusader decoding
Changed paths:
engines/ultima/detection_tables.h
engines/ultima/ultima8/audio/audio_process.cpp
engines/ultima/ultima8/audio/remorse_music_process.cpp
engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
engines/ultima/ultima8/games/game_data.cpp
engines/ultima/ultima8/games/start_crusader_process.cpp
engines/ultima/ultima8/gumps/cru_stat_gump.cpp
engines/ultima/ultima8/misc/encoding.h
engines/ultima/ultima8/usecode/remorse_intrinsics.h
engines/ultima/ultima8/usecode/uc_machine.cpp
engines/ultima/ultima8/world/item.cpp
engines/ultima/ultima8/world/item.h
diff --git a/engines/ultima/detection_tables.h b/engines/ultima/detection_tables.h
index a0136ca8df..99bf2abe96 100644
--- a/engines/ultima/detection_tables.h
+++ b/engines/ultima/detection_tables.h
@@ -285,7 +285,6 @@ static const UltimaGameDescription GAME_DESCRIPTIONS[] = {
0
},
- /*
// Crusader games use basically the same engine as ultima8, but still
// need a lot of work.
@@ -333,7 +332,6 @@ static const UltimaGameDescription GAME_DESCRIPTIONS[] = {
GAME_CRUSADER_REG,
0
},
- */
// GOG Martian Dreams
{
diff --git a/engines/ultima/ultima8/audio/audio_process.cpp b/engines/ultima/ultima8/audio/audio_process.cpp
index 4575afd841..1a6559ffaf 100644
--- a/engines/ultima/ultima8/audio/audio_process.cpp
+++ b/engines/ultima/ultima8/audio/audio_process.cpp
@@ -76,15 +76,9 @@ bool AudioProcess::calculateSoundVolume(ObjId objId, int16 &lVol, int16 &rVol) c
int x = (ix - iy) / 4;
int y = (ix + iy) / 8 - iz;
- // Fall off over 350 pixels, or 700 for crusader
- // (double resolution)..
+ // Fall off over 350 pixels
+ int limit = 350 * 350;
- int limit;
- if (GAME_IS_U8) {
- limit = 350 * 350;
- } else {
- limit = 700 * 700;
- }
int dist = limit - (x * x + y * y);
if (dist < 0) dist = 0;
dist = (dist * 256) / limit;
diff --git a/engines/ultima/ultima8/audio/remorse_music_process.cpp b/engines/ultima/ultima8/audio/remorse_music_process.cpp
index 9006b58581..fb05d8f372 100644
--- a/engines/ultima/ultima8/audio/remorse_music_process.cpp
+++ b/engines/ultima/ultima8/audio/remorse_music_process.cpp
@@ -120,8 +120,10 @@ void RemorseMusicProcess::playMusic_internal(int track) {
assert(mixer);
mixer->stopHandle(_soundHandle);
_soundHandle = Audio::SoundHandle();
- if (_playingStream)
+ if (_playingStream) {
delete _playingStream;
+ _playingStream = nullptr;
+ }
if (track > 0) {
// TODO: It's a bit ugly having this here. Should be in GameData.
diff --git a/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h b/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
index 5879fe167d..78e6846a33 100644
--- a/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
+++ b/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
@@ -70,29 +70,29 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"byte Ultima8Engine::I_getAlertActive(void)",
"int16 Item::I_getFrame(Item *)",
"void Item::I_setFrame(Item *, frame)",
- "int16 Item::I_getSOMETHING_03(Item *)", // used to get passcode highbyte from valueboxes..
+ "int16 Item::I_getMapArray(Item *)", // See TRIGGER::ordinal21 - stored in a variable 'mapNum'
"int16 Item::I_getStatus(Item *)",
- "void I_orStatus(Item *, uint16 flags)",
+ "void Item::I_orStatus(Item *, uint16 flags)",
"int16 Intrinsic006(6 bytes)", // same coff as 0B5
"byte Item::I_getSOMETHING_07(Item *)", // called for gattling guns and camera
- "byte Intrinsic008(4 bytes)",
+ "byte Actor::I_isNPC(Item *)", // proably - actually checks is itemno < 256?
"byte Item::I_getZ(Item *)",
- "void Intrinsic00A(4 bytes)",
- "int16 I_getSOMETHING_09(MainActor *?)",
+ "void Item::I_destroy(Item *)", // probably? often called after creating a replacement object and setting it to the same position (eg, LUGGAGE::gotHit)
+ "int16 I_getSOMETHING_0B(MainActor *?)", // could be getNPCNum? Called from ANDROID::calledFromAnim, goes to NPCDEATH
"void Intrinsic00C(2 bytes)",
- "byte Intrinsic00D(6 bytes)",
+ "byte Item::Intrinsic00D(Item *, itemno)",
"int16 Intrinsic00E(8 bytes)",
"void I_playFlic(void), int16 I_playFlic(Item *, char *name, int16 sizex, int16 sizey)",
// 0010
"int16 Item::I_getQLo(Item *)", // same as 02B based on same coff as 02B, 066, 084, 0A1, 0AE, 0D9, 0EA
"int16 Intrinsic011(4 bytes)",
"void Intrinsic012(2 bytes)",
- "int16 Item::getX(Item *)",
- "int16 Item::getY(Item *)",
+ "int16 Item::I_getX(Item *)",
+ "int16 Item::I_getY(Item *)",
"void AudioProcess::I_playSFXCru(Item *, uint16 sfxnum)",
"int16 Item::I_getShape(Item *)", // in STEAMBOX::func0A, is compared to 0x511 (the STEAM2 shape number) to determine direction
"void Intrinsic017(8 bytes)",
- "int16 Intrinsic018(4 bytes not Item *)",
+ "int16 UCMachine::I_rndRange(uint16 x, uint16 y)", // // probably.. always called with 2 constants, then result often compared to some number between
"byte Item::I_legalCreateAtCoords(Item *, int16 shapeno, int16 frame, int16 x, int16 y, int16 z)", // probably, see usage in DOOR2::ordinal37
"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. Always associated with a bitwise-not or bitmask
"int16 Intrinsic01B(void)",
@@ -103,22 +103,22 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
// 0020
"void Item::I_popToCoords(Item *, uint16 x, uint16 y, uint16 z)", // set coords, used after creating blood spills in NPCDEATH
"void Intrinsic021(4 bytes)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
- "void Intrinsic022(Item *)",
- "int16 Intrinsic023(void)",
- "void Intrinsic024(Item *, int16 shapeno)", // maybe setShape?
- "void Intrinsic025(4 bytes)",
+ "void Intrinsic022(Item *)", // I_push??
+ "int16 Intrinsic023(void)", // returns some ItemCache global in disassembly
+ "void Item::I_setShape(Item *, int16 shapeno)", // probably. See PEPSIEW::gotHit.
+ "void I_maybeTouch025(4 bytes)", // I_touch??
"int16 Item::I_getQHi(Item *)", // guess, based on variable name in BOUNCBOX::gotHit
"int16 Intrinsic027(14 bytes)",
"int16 Intrinsic028(12 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
- "int16 Intrinsic029(void)",
+ "int16 Intrinsic029([pid, [byte]])",
"void AudioProcess::I_playAmbientSFXCru(Item *, sndno)",
"int16 Item::I_getQLo(Item *)", // guess, based on variable name in BOUNCBOX::gotHit
- "byte Intrinsic02C(4 bytes)",
- "void Item::I_setQHi(Item *, uint16 unk)", // probably setQHi, see usage in FREE::ordinal2E where object position is copied
+ "byte Item::I_inFastArea(Item *)",
+ "void Item::I_setQHi(Item *, uint16 qhi)", // probably setQHi, see usage in FREE::ordinal2E where object position is copied
"byte Intrinsic02E(Item *, 8 bytes)",
"byte Intrinsic02F(10 bytes)",
// 0030
- "void Intrinsic030(4 bytes)",
+ "void I_maybePop030(4 bytes)", // I_pop??
"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 Intrinsic032(12 bytes)",
"byte Intrinsic033(4 bytes)",
@@ -126,11 +126,11 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"byte Intrinsic035(4 bytes)",
"int16 Intrinsic036(12 bytes)",
"byte Intrinsic037(4 bytes)", // same coff as 0B8
- "void Intrinsic038(Item *, int16)",
+ "void AudioProcess::Intrinsic038(Item *, int16 sndno)",
"byte Intrinsic039(4 bytes)", // same coff as 122, 12E
- "byte Intrinsic03A(Item *, int16 unk)",
- "void Item::I_setQLo(Item *, int16 qlo)", // probably setQLo, see usage in FREE::ordinal2E where object position is copied
- "int16 Intrinsic03C(4 bytes)",
+ "byte AudioProcess::Intrinsic03A(Item *, int16 unk)",
+ "void Item::I_setQLo(Item *, int16 qlo)", // probably setQLo, see usage in FREE::ordinal2E where object position is copied. Disassembly confirms.
+ "int16 Item::I_getSomethingShapey(Item *)", // something shape related according to disasm
"void Intrinsic03D(4 bytes)",
"void Intrinsic03E(4 bytes)",
"int16 Intrinsic03F(4 bytes)",
@@ -138,18 +138,18 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"void Intrinsic040(8 bytes)",
"void Intrinsic041(2 bytes)",
"byte Intrinsic042(6 bytes)",
- "void Intrinsic043(6 bytes)",
- "byte Intrinsic044(6 bytes)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
+ "void AudioProcess::Intrinsic043(Item *, soundno)", // something with sound, probably Item *, soundno based on disassembly, maybe stopSFX?
+ "byte Item::Intrinsic044(Item *, uint16 itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
"int16 Item::I_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
- "byte Intrinsic046(6 bytes)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
+ "byte Item::Intrinsic046(Item *, uint16 itemno))", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
"int16 Item::I_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
- "byte Intrinsic048(6 bytes)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
+ "byte Item::Intrinsic048(Item *, uint16 itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
"int16 Item::I_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
- "byte Intrinsic04A(6 bytes)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
+ "byte Item::Intrinsic04A(Item *, uint16 itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
"int16 Item::I_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
- "byte Intrinsic04C(6 bytes)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
+ "byte Item::Intrinsic04C(Item *, uint16 itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
"int16 Item::I_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
- "byte Intrinsic04E(6 bytes)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
+ "byte Item::Intrinsic04E(Item *, uint16 itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
"int16 Item::I_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
// 0050
"int16 Intrinsic050(4 bytes)",
@@ -163,26 +163,26 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"byte Item::I_doSOMETHING_58(Item *, uint16 unk)",
"void Item::I_setFrame(Item *, frame)", // based on same coff as 002
"int16 Intrinsic05A(4 bytes)", // part of same coff set 01D, 05A, 0B9, 0D7, 0E4, 124
- "byte Item::I_legalCreateAtPoint(Item *, int16 shape, int16 frame, Item *)", // see PEPSIEW::use
- "void Intrinsic05C(8 bytes)",
+ "byte Item::I_legalCreateAtPoint(Item *, int16 shape, int16 frame, Point *)", // see PEPSIEW::use
+ "void Item::I_getPoint(Item *, Point *)",
"void Intrinsic05D(void)",
- "int16 Intrinsic05E(uint32, char *, int16 a, int16 b)", // Play video (as texture? parameters like (150, 250, "MVA11A") and other mvas)
+ "int16 I_playFlicsomething(uint32, char *, int16 a, int16 b)", // Play video (as texture? parameters like (150, 250, "MVA11A") and other mvas)
"void Intrinsic05F(void)",
// 0060
"void Intrinsic060(4 bytes)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
"void Intrinsic061(8 bytes)",
"void Intrinsic062(void)",
"void Intrinsic063(12 bytes)",
- "void Intrinsic064(16 bytes)", // same coff as 12D
+ "void Item::Intrinsic064(Item *, uint *, uint *, uint *)", // same coff as 12D
"byte Intrinsic065(4 bytes)",
- "int16 Item::I_getQLo(Item *)", // same as 02B based on same coff set 010, 02B, 066, 084, 0A1, 0AE, 0D9, 0EA
- "int16 Intrinsic067(4 bytes)", // 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 Item::I_setQLo(Item *, uint16 qlow)", // probably, see VALUEBOX::ordinal20
+ "int16 Item::I_getQLo(Item *)", // same as 02B based on same coff set 010, 02B, 066, 084, 0A1, 0AE, 0D9, 0EA
+ "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 Item::I_setNpcNum(Item *, uint16 npcnum)", // maybe, see EVENT::func0A or VALUEBOX::ordinal20.. right next to getNPCNum in coff (confirmed by disassembly)
"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 Intrinsic06A(10 bytes)",
+ "void Item::Intrinsic06A(Item *, int16 x, int16 y, uint16 z)",
"int16 Intrinsic06B(void)",
"void Intrinsic06C(sometimes Item *)", // TODO: when param not item, what is it?
- "int16 Intrinsic06D(4 bytes)", // part of same coff set 067, 06D, 089, 08E, 0AD, 0F8, 100, 102, 105, 107, 109, 10B, 10D, 10F, 111, 115, 11C, 123, 129
+ "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 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
"byte Intrinsic06F(6 bytes)",
// 0070
@@ -192,15 +192,15 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"void Intrinsic073(4 bytes)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
"void Intrinsic074(void)",
"void Intrinsic075(void)",
- "void Intrinsic076(4 bytes)",
- "int16 Intrinsic077(void)",
+ "void AudioProcess::Intrinsic076(Item *)",
+ "int16 Intrinsic077_Fade(void)", // something about fades
"void Intrinsic078(void)",
"int16 Intrinsic079(6 bytes)",
- "int16 Intrinsic07A(void)",
+ "int16 Intrinsic07A_Fade(void)", // something about fades
"void Intrinsic07B(4 bytes)", // same coff as 130
"int16 Intrinsic07C(4 bytes)",
"void Intrinsic07D(6 bytes)", // part of same coff set 055, 07D, 0CD, 0DB, 0F2, 131
- "int16 Intrinsic07E(Item *)",
+ "int16 I_getQIfSomething(Item *)", // based on disassembly
"void Intrinsic07F(6 bytes)", // same coff as 0BA, 125
// 0080
"int16 Intrinsic080(4 bytes)", // same coff as 0D0, 0D5
@@ -211,46 +211,46 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"void Intrinsic085(4 bytes)",
"int16 Intrinsic086(void)",
"int16 Intrinsic087(void)",
- "void Item::I_setQHi(Item *, uint16 qhi)", // slightly suspicious of this one.. see VALUEBOX:ordinal20
- "int16 Intrinsic089(4 bytes)", // 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 Item::I_setMapArray(Item *, uint16 maparray)", // based on decompile - sets same value as read by getmaparray .. see VALUEBOX:ordinal20
+ "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 Intrinsic08A(12 bytes)",
- "int16 Intrinsic08B(4 bytes)",
- "void Intrinsic08C(4 bytes)", // same coff as 119, 12A
+ "int16 Item::I_enterFastArea(Item *)", // maybe.. based on disasm
+ "void Item::I_DoSomethingAndSetStatusFlag0x8000(Item *)", // same coff as 119, 12A
"int16 Intrinsic08D(12 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
- "int16 Intrinsic08E(4 bytes)", // 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 Intrinsic08F(void)",
+ "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 Intrinsic08F_Fade(void)", // something about fades
// 0090
"void Intrinsic090(void)",
- "void Intrinsic091(void)",
- "void Intrinsic092(void)", // same coff as 0A9
- "void Intrinsic093(void)",
+ "void Intrinsic091(void)", // sets some global (cleared by 93)
+ "void I_playFlic092(char *)", // same coff as 0A9
+ "void Intrinsic093(void)", // clears som global (set by 91)
"UNUSEDInt0094()",
- "byte Intrinsic095(void)",
+ "byte Intrinsic095(void)", // get global - something about keyboard (by disasm)
"int16 Intrinsic096(4 bytes)",
"void Intrinsic097(void)",
"void Intrinsic098(void)",
"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 Intrinsic09A(void)",
- "int16 Intrinsic09B(2 bytes)",
- "int16 Intrinsic09C(4 bytes)",
- "int16 Intrinsic09D(2 bytes)",
- "int16 Intrinsic09E(4 bytes)",
- "int16 Intrinsic09F(10 bytes)",
+ "void Intrinsic09A_Fade(void)", // something about fades
+ "int16 Intrinsic09B_Fade(2 bytes)", // something about fades
+ "int16 Intrinsic09C_Fade(4 bytes)", // something about fades
+ "int16 Intrinsic09D_Fade(2 bytes)", // something about fades
+ "int16 Intrinsic09E_Fade(4 bytes)", // something about fades
+ "int16 Intrinsic09F_Fade(10 bytes)", // something about fades
// 00A0
"void Intrinsic0A0(4 bytes)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
"int16 Item::I_getQLo(Item *)", // same as 02B based on same coff set 010, 02B, 066, 084, 0A1, 0AE, 0D9, 0EA
- "int16 Intrinsic0A2(4 bytes)",
+ "int16 Item::getQLoIfSomething(Item *)", // based on disassembly
"void Intrinsic0A3(6 bytes)",
- "byte Intrinsic0A4(6 bytes)",
+ "byte Item::Intrinsic0A4(Item *, uint16 unk)",
"byte Intrinsic0A5(6 bytes)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
"int16 Intrinsic0A6(void)",
"int16 Intrinsic0A7(4 bytes)",
"void Intrinsic0A8(4 bytes)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
- "void Intrinsic0A9(void)", // same coff as 092
- "void Intrinsic0AA(2 bytes)", // same coff as 0D4
+ "void I_playFlic0A9(char *)", // same coff as 092
+ "void I_playSFX(2 bytes)", // same coff as 0D4
"byte Intrinsic0AB(4 bytes)",
- "int16 Intrinsic0AC(2 bytes)",
- "int16 Intrinsic0AD(4 bytes)", // part of same coff set 067, 06D, 089, 08E, 0AD, 0F8, 100, 102, 105, 107, 109, 10B, 10D, 10F, 111, 115, 11C, 123, 129
+ "int16 I_maybeGetFamilyOfType(2 bytes)", // per pentagram notes
+ "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
"int16 Item::I_getQLo(Item *)", // same as 02B based on same coff set 010, 02B, 066, 084, 0A1, 0AE, 0D9, 0EA
"int16 Item::I_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
// 00B0
@@ -258,9 +258,9 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"int16 Intrinsic0B1(6 bytes)",
"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
"int32 I_getCurrentTimerTick(void)",
- "void Intrinsic0B4(void)",
+ "void Intrinsic0B4(void)", // set or clear alert? (based on coff)
"int16 Intrinsic0B5(6 bytes)",
- "void Intrinsic0B6(void)",
+ "void Intrinsic0B6(void)", // set or clear alert? (based on coff)
"int16 Intrinsic0B7(void)",
"byte Intrinsic0B8(4 bytes)", // same coff as 037
"int16 Intrinsic0B9(4 bytes)", // part of same coff set 01D, 05A, 0B9, 0D7, 0E4, 124
@@ -274,11 +274,11 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"int16 Intrinsic0C0(12 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
"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
"int16 Intrinsic0C2(12 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
- "void Item::I_andStatus(Item *, int16 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 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
"int16 Intrinsic0C4(2 bytes)",
"byte Intrinsic0C5(6 bytes)",
"void Intrinsic0C6(14 bytes)",
- "byte Intrinsic0C7(6 bytes)",
+ "byte Item::Intrinsic0C7(Item *, itemno)", // does something with the x/y from itemno
"int16 Intrinsic0C8(12 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
"int16 Item::I_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
"byte Intrinsic0CA(6 bytes)",
@@ -286,19 +286,19 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"byte Intrinsic0CC(4 bytes)",
"void Intrinsic0CD(6 bytes)", // part of same coff set 055, 07D, 0CD, 0DB, 0F2, 131
"int16 Intrinsic0CE(void)",
- "void Intrinsic0CF(6 bytes)",
+ "void Item::setQAndCallSomething(Item *, int16 q)", // based on disassembly
// 00D0
"int16 Intrinsic0D0(4 bytes)", // same coff as 080, 0D5
- "UNUSEDInt00D1()",
- "void Intrinsic0D2(void)",
+ "UNUSEDInt00D1()", // I_StopAllSFX (unused so not implmeneted)
+ "void Intrinsic0D2(int *item,char *flicname,word sizex,word sizey)", // play flic
"UNUSEDInt00D3()",
- "void Intrinsic0D4(2 bytes)", // same coff as 0AA
+ "void I_playSFX(2 bytes)", // same coff as 0AA. Based on disasm.
"int16 Intrinsic0D5(4 bytes)", // same coff as 080, 0D0
"byte Intrinsic0D6(void)",
"int16 Intrinsic0D7(4 bytes)", // part of same coff set 01D, 05A, 0B9, 0D7, 0E4, 124
"void Intrinsic0D8(4 bytes)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
"int16 Item::I_getQLo(Item *)", // same as 02B based on same coff set 010, 02B, 066, 084, 0A1, 0AE, 0D9, 0EA
- "void Intrinsic0DA(void)",
+ "void Intrinsic0DA_Fade(void)", // something about fades
"void Intrinsic0DB(6 bytes)", // part of same coff set 055, 07D, 0CD, 0DB, 0F2, 131
"byte Intrinsic0DC(6 bytes)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
"int16 Intrinsic0DD(4 bytes)",
@@ -314,11 +314,11 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"void Intrinsic0E6(6 bytes)",
"void Intrinsic0E7(4 bytes)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
"int16 Intrinsic0E8(6 bytes)",
- "void Item::I_andStatus(Item *, int16 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 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
"int16 Item::I_getQLo(Item *)", // same as 02B based on same coff set 010, 02B, 066, 084, 0A1, 0AE, 0D9, 0EA
"int16 Intrinsic0EB(void)",
"void Intrinsic0EC(6 bytes)",
- "void Intrinsic0ED(6 bytes)",
+ "void Intrinsic0ED(6 bytes)", // poptocontainer??
"void Intrinsic0EE(void)",
"int16 Intrinsic0EF(4 bytes not Item *)",
// 00F0
@@ -326,73 +326,73 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"byte Intrinsic0F1(6 bytes)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
"void Intrinsic0F2(6 bytes)", // part of same coff set 055, 07D, 0CD, 0DB, 0F2, 131
"int16 Item::I_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
- "int16 Item::I_getSOMETHING_F4(Item *)",
- "void Item::I_setSOMETHING_F5(Item *, uint16 unk)",
+ "int16 Item::I_getQ(Item *)", // based on disassembly
+ "void Item::I_setQ(Item *, uint16 q)", // based on disassembly
"void Intrinsic0F6(void)",
"int16 Intrinsic0F7(12 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
- "int16 Intrinsic0F8(4 bytes)", // part of same coff set 067, 06D, 089, 08E, 0AD, 0F8, 100, 102, 105, 107, 109, 10B, 10D, 10F, 111, 115, 11C, 123, 129
+ "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
"int16 Intrinsic0F9(12 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
"byte Intrinsic0FA(6 bytes)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
"int16 Item::I_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
- "void Item::I_andStatus(Item *, int16 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 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
"byte Intrinsic0FD(2 bytes)",
"void Intrinsic0FE(4 bytes)",
"int16 UCMachine::I_numToStr(int16 num)", // same as 113 based on same coff set 0FF, 113, 126
// 0100
- "int16 Intrinsic100(4 bytes)", // 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 Item::I_andStatus(Item *, int16 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
- "int16 Intrinsic102(4 bytes)", // part of same coff set 067, 06D, 089, 08E, 0AD, 0F8, 100, 102, 105, 107, 109, 10B, 10D, 10F, 111, 115, 11C, 123, 129
+ "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 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
+ "int16 Item::I_getNPCNum(Item *)", // Based on variable name in TRIGGER::ordinal21. Part of same coff set 067, 06D, 089, 08E, 0AD, 0F8, 100, 102, 105, 107, 109, 10B, 10D, 10F, 111, 115, 11C, 123, 129
"byte Intrinsic103(uint16 shapenum)",
- "void Item::I_andStatus(Item *, int16 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
- "int16 Intrinsic105(4 bytes)", // 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 Item::I_andStatus(Item *, int16 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
- "int16 Intrinsic107(4 bytes)", // 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 Item::I_andStatus(Item *, int16 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
- "int16 Intrinsic109(4 bytes)", // 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 Item::I_andStatus(Item *, int16 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
- "int16 Intrinsic10B(4 bytes)", // 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 Item::I_andStatus(Item *, int16 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
- "int16 Intrinsic10D(4 bytes)", // 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 Item::I_andStatus(Item *, int16 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
- "int16 Intrinsic10F(4 bytes)", // 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 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
+ "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 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
+ "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 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
+ "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 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
+ "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 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
+ "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 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
+ "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
// 0110
- "void Item::I_andStatus(Item *, int16 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
- "int16 Item::I_getSOMETHING_111(Item *)", // used to get passcode lowbyte from valueboxes.. // 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 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
+ "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
"byte Intrinsic112(4 bytes)", // same coff as 01C, 121
"int16 UCMachine::I_numToStr(int16 num)", // based on VMAIL::func0A example usage
- "void Item::I_andStatus(Item *, int16 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
- "int16 Item::I_getSOMETHING_115(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 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
+ "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
"byte Intrinsic116(14 bytes)",
- "void Item::I_andStatus(Item *, int16 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 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
"int16 Intrinsic118(12 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
- "void Intrinsic119(4 bytes)", // same coff as 08C, 12A
- "void Item::I_andStatus(Item *, int16 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
- "byte Intrinsic11B(6 bytes)",
- "int16 Intrinsic11C(4 bytes)", // 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 Item::I_DoSomethingAndSetStatusFlag0x8000(Item *)", // same coff as 08C, 12A
+ "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
+ "byte Item::I_getSomeFlag(Item *, uint16 unk)",
+ "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
"int16 Intrinsic11D(12 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
- "int16 Intrinsic11E(4 bytes)", // same coff as 12B
- "byte Intrinsic11F(4 bytes)",
+ "int16 Intrinsic11E(Item *)", // same coff as 12B
+ "byte Intrinsic11F(Item *)",
// 0120
- "int16 Intrinsic120(4 bytes)",
+ "int16 Intrinsic120(Item *)",
"byte Intrinsic121(4 bytes)", // same coff as 01C, 112
"byte Intrinsic122(4 bytes)", // same coff as 12E, 039
- "int16 Intrinsic123(4 bytes)", // part of same coff set 067, 06D, 089, 08E, 0AD, 0F8, 100, 102, 105, 107, 109, 10B, 10D, 10F, 111, 115, 11C, 123, 129
+ "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
"int16 Intrinsic124(4 bytes)", // part of same coff set 01D, 05A, 0B9, 0D7, 0E4, 124
"void Intrinsic125(6 bytes)", // same coff as 07F, 0BA
"int16 UCMachine::I_numToStr(int16 num)", // same as 113 based on same coff set 0FF, 113, 126
- "byte Intrinsic127(8 bytes)",
- "void Item::I_andStatus(Item *, int16 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
- "int16 Intrinsic129(4 bytes)", // 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 Intrinsic12A(4 bytes)", // same coff as 08C, 119
- "int16 Intrinsic12B(4 bytes)", // same coff as 11E
+ "byte Item::Intrinsic127(Item *, uin16 x, uint16 y)", // based on disassembly
+ "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
+ "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 Item::I_DoSomethingAndSetStatusFlag0x8000(Item *)", // same coff as 08C, 119
+ "int16 Intrinsic12B(Item *)", // same coff as 11E
"byte Intrinsic12C(6 bytes)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
- "void Intrinsic12D(16 bytes)", // same coff as 064
+ "void Item::Intrinsic12D(Item *, uint *, uint *, uint *)", // same coff as 064
"byte Intrinsic12E(4 bytes)", // same coff as 122, 039
"int16 Intrinsic12F(Item *, uint16 unk)",
// 0130
"void Intrinsic130(4 bytes)", // same coff as 07B
"void Intrinsic131(6 bytes)", // part of same coff set 055, 07D, 0CD, 0DB, 0F2, 131
- "void Item::I_andStatus(Item *, int16 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 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
"int16 Item::I_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
"void Intrinsic134(2 bytes)",
"void UNUSEDInt135(4 bytes)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
diff --git a/engines/ultima/ultima8/games/game_data.cpp b/engines/ultima/ultima8/games/game_data.cpp
index db189bca77..08c6d02726 100644
--- a/engines/ultima/ultima8/games/game_data.cpp
+++ b/engines/ultima/ultima8/games/game_data.cpp
@@ -184,6 +184,7 @@ Std::string GameData::translate(const Std::string &text) {
Std::string trans;
config->get(key, trans);
+
return trans;
}
diff --git a/engines/ultima/ultima8/games/start_crusader_process.cpp b/engines/ultima/ultima8/games/start_crusader_process.cpp
index cbc7eb21b7..f27e302d7b 100644
--- a/engines/ultima/ultima8/games/start_crusader_process.cpp
+++ b/engines/ultima/ultima8/games/start_crusader_process.cpp
@@ -88,6 +88,7 @@ void StartCrusaderProcess::run() {
if (!_skipStart) {
// TODO: Find the first MISS1EGG egg like in U8 - should teleport in
+ // Maybe just teleport straight to Item 9115 (class TeleportEgg, shape 404, 1, (60656,59312,16) q:99, m:0, n:0, f: 0x2000, ef:0x3 shapeinfo f:1009, fam:8, et:0)
/*
LOOPSCRIPT(script, LS_AND(LS_SHAPE_EQUAL1(73), LS_Q_EQUAL(36)));
currentmap->areaSearch(&uclist, script, sizeof(script),
@@ -108,7 +109,7 @@ void StartCrusaderProcess::run() {
}
- MusicProcess::get_instance()->playMusic(2);
+ //MusicProcess::get_instance()->playMusic(2);
Ultima8Engine::get_instance()->setAvatarInStasis(false);
diff --git a/engines/ultima/ultima8/gumps/cru_stat_gump.cpp b/engines/ultima/ultima8/gumps/cru_stat_gump.cpp
index b2b586d44d..b61b3afed7 100644
--- a/engines/ultima/ultima8/gumps/cru_stat_gump.cpp
+++ b/engines/ultima/ultima8/gumps/cru_stat_gump.cpp
@@ -43,10 +43,8 @@ CruStatGump::CruStatGump() : Gump() {
}
CruStatGump::CruStatGump(Shape *shape, int x)
- : Gump(0, 0, 5, 5, 0) {
+ : Gump(x, 0, 5, 5, 0) {
_shape = shape;
- _x = x;
- _y = 0;
}
CruStatGump::~CruStatGump() {
diff --git a/engines/ultima/ultima8/misc/encoding.h b/engines/ultima/ultima8/misc/encoding.h
index 70915490af..668e247ac6 100644
--- a/engines/ultima/ultima8/misc/encoding.h
+++ b/engines/ultima/ultima8/misc/encoding.h
@@ -36,6 +36,7 @@ extern uint16 encoding[256];
uint16 shiftjis_to_ultima8(uint16 sjis);
uint32 shiftjis_to_unicode(uint16 sjis);
+
} // End of namespace Ultima8
} // End of namespace Ultima
diff --git a/engines/ultima/ultima8/usecode/remorse_intrinsics.h b/engines/ultima/ultima8/usecode/remorse_intrinsics.h
index 3302d779f9..95d9f87df4 100644
--- a/engines/ultima/ultima8/usecode/remorse_intrinsics.h
+++ b/engines/ultima/ultima8/usecode/remorse_intrinsics.h
@@ -38,14 +38,14 @@ Intrinsic RemorseIntrinsics[] = {
Ultima8Engine::I_getAlertActive, // basically confirmed.. see eg, ALARM_NS::enterFastArea - set frame for alert siren based on value.
Item::I_getFrame, // ? int Intrinsic001(4 bytes)
Item::I_setFrame, // basically confirmed..
- 0, //int16 Item::I_getSOMETHING_03(Item *), // get passcode highbyte from valueboxes??, and called on MONSTER objects too
+ Item::I_getMapArray, // See TRIGGER::ordinal21 - stored in a variable 'mapNum'
Item::I_getStatus, // probably - see usage in GATGUNEW::enterFastArea - always followed by an AND against a single bit
Item::I_orStatus, // probably - see usage in GATGUNEW::enterFastArea
0, // void Intrinsic006(6 bytes)
0, // ? byte Item::I_getSOMETHING_07(Item *)
- 0, // ? byte Intrinsic008(4 bytes)
+ Actor::I_isNPC, // byte Intrinsic008(Item *) // probably.. disasm checks for < 256
Item::I_getZ, // byte Intrinsic009(4 bytes) // probably, see PEPSIEW::use() variable names
- 0, // void Intrinsic00A(4 bytes)
+ Item::I_destroy, // void Intrinsic00A(4 bytes) // probably, often called after creating replacement object in same position eg, LUGGAGE::gotHit
0, // something with npcdata void Intrinsic00B(4 bytes)
0, // void Intrinsic00C(2 bytes)
0, // byte Intrinsic00D(6 bytes)
@@ -60,7 +60,7 @@ Intrinsic RemorseIntrinsics[] = {
AudioProcess::I_playSFXCru, // pretty sure, see SWITCH::ordinal21 which plays various sfx related to access status
Item::I_getShape, // in STEAMBOX::func0A, is compared to 0x511 (the STEAM2 shape number) to determine direction
0, // void Intrinsic017(8 bytes)
- 0, // int16 Intrinsic018(4 bytes) // FIXME: Can get stuck in a loop calling this, waiting for some status?
+ UCMachine::I_rndRange, // int16 Intrinsic018(4 bytes) // probably.. always called with 2 constants, then result compared to some number between
Item::I_legalCreateAtCoords, // byte Intrinsic019(14 bytes), probably, see usage in DOOR2::ordinal37
Item::I_andStatus, // void Intrinsic01A(6 bytes)
0, // // different than U8's? int Intrinsic01B(void)
@@ -73,7 +73,7 @@ Intrinsic RemorseIntrinsics[] = {
0, // void Intrinsic021(4 bytes)
0, // ? Item::I_push, void Intrinsic022(4 bytes)
0, // int Intrinsic023(void)
- 0, // ? Item::I_setShape, // different than U8's? void Intrinsic024(6 bytes)
+ Item::I_setShape, // Probably, see PEPSIEW::gotHit
0, // ? Item::I_touch, void Intrinsic025(4 bytes)
Item::I_getQHi, // int16 Intrinsic026(Item *), // guess, based on variable name in BOUNCBOX::gotHit
0, // int Intrinsic027(14 bytes)
@@ -81,7 +81,7 @@ Intrinsic RemorseIntrinsics[] = {
0, // int Intrinsic029(void)
AudioProcess::I_playAmbientSFXCru, // Confirmed!
Item::I_getQLo, // int16 Intrinsic02B(4 bytes), // guess, based on variable name in BOUNCBOX::gotHit
- 0, // byte Intrinsic02C(4 bytes)
+ Item::I_inFastArea, // byte Intrinsic02C(4 bytes) // based on disassembly - checks for flag 0x2000
Item::I_setQHi, // ? Item::I_setQHi, void Intrinsic02D(6 bytes) -- see usage in FREE::ordinal2E where object position is also copied
0, // byte Intrinsic02E(12 bytes)
0, // byte Intrinsic02F(10 bytes)
@@ -106,7 +106,7 @@ Intrinsic RemorseIntrinsics[] = {
0, // void Intrinsic040(8 bytes)
0, // void Intrinsic041(2 bytes)
0, // int Intrinsic042(6 bytes)
- 0, // void Intrinsic043(6 bytes)
+ 0, // void Intrinsic043(6 bytes) // maybe stopSFX (based on coff)
0, // int Intrinsic044(6 bytes)
Item::I_getQHi, // based on same coff set as 026
0, // int Intrinsic046(6 bytes)
@@ -132,7 +132,7 @@ Intrinsic RemorseIntrinsics[] = {
Item::I_setFrame, // based on same coff as 002
0, // ? Item::I_legalCreateAtPoint, void Intrinsic05A(4 bytes)
Item::I_legalCreateAtPoint, // probably. see PEPSIEW::use
- 0, // void Intrinsic05C(8 bytes)
+ Item::I_getPoint, // void Intrinsic05C(8 bytes)
0, // void Intrinsic05D(void)
0, // int16 Intrinsic05E(uint32, char *, int16 a, int16 b) // Play video (as texture? parameters like (150, 250, "MVA11A") and other mvas)
0, // void Intrinsic05F(void)
@@ -142,15 +142,15 @@ Intrinsic RemorseIntrinsics[] = {
0, // void Intrinsic062(void)
0, // void Intrinsic063(12 bytes)
0, // ? Item::I_legalCreateAtCoords, void Intrinsic064(16 bytes)
- 0, // ? Item::I_getNpcNum, int Intrinsic065(4 bytes)
+ 0, // int Intrinsic065(4 bytes)
Item::I_getQLo, // based on same coff set as 02B
- 0, // ? Item::I_andStatus, void Intrinsic067(4 bytes)
- Item::I_setQLo, // see VALUEBOX:ordinal20
+ Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
+ Item::I_setNpcNum, // void Item::I_setSomething068(Item *, int16 something) , see VALUEBOX:ordinal20
Item::I_andStatus, // void Intrinsic069(6 bytes)
0, // void Intrinsic06A(10 bytes)
- 0, // ? Item::I_getNpcNum, int16 Intrinsic06B(void)
- 0, // ? Item::I_andStatus, void Intrinsic06C(4 bytes)
- 0, // void Intrinsic06D(4 bytes)
+ 0, // int16 Intrinsic06B(void)
+ 0, // void Intrinsic06C(4 bytes)
+ Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
Item::I_andStatus, // void Intrinsic06E(6 bytes)
0, // int Intrinsic06F(6 bytes)
// 0x070
@@ -166,7 +166,7 @@ Intrinsic RemorseIntrinsics[] = {
0, // ? Item::I_use, // different than U8's? void Intrinsic079(6 bytes)
0, // void Intrinsic07A(void)
0, // void Intrinsic07B(4 bytes)
- 0, // void Intrinsic07C(4 bytes)
+ 0, // void Intrinsic07C(4 bytes) // I_getQIfSomething, see disassembly
0, // ? Item::I_getQLo, void Intrinsic07D(6 bytes)
0, // void Intrinsic07E(4 bytes)
0, // void Intrinsic07F(6 bytes)
@@ -178,22 +178,22 @@ Intrinsic RemorseIntrinsics[] = {
Item::I_getQLo, // based on same coff set as 02B
0, // void Intrinsic085(4 bytes)
0, // void Intrinsic086(void)
- 0, // ? Item::I_getNpcNum, void Intrinsic087(void)
- Item::I_setQHi, // void Intrinsic088(6 bytes) // setSomethingHighByte(something *, byte highbyte) (see VALUEBOX:ordinal20)
- 0, // void Intrinsic089(4 bytes)
+ 0, // void Intrinsic087(void)
+ Item::I_setMapArray, // maybe I_setNpcNum -- based on use for VALUEBOX (like getNPCNum is) and coff being right next to getNPCNum.. see VALUEBOX:ordinal20. Could also be I_setMapArray??
+ Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
0, // void Intrinsic08A(12 bytes)
- 0, // void Intrinsic08B(4 bytes)
+ Item::I_enterFastArea, // void Intrinsic08B(4 bytes) - maybe.. based on disasm
0, // void Intrinsic08C(4 bytes)
0, // void Intrinsic08D(12 bytes)
- 0, // void Intrinsic08E(4 bytes)
+ Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
0, // void Intrinsic08F(void)
// 0x090
0, // void Intrinsic090(void)
0, // void Intrinsic091(void)
- 0, // ? Item::I_andStatus, void Intrinsic092(void)
+ 0, // I_playFlic(char *)? void Intrinsic092(void)
0, // void Intrinsic093(void)
0, // UNUSEDInt0094()
- 0, // int Intrinsic095(void)
+ 0, // int Intrinsic095(void) // get global - something about keyboard (by disasm)
0, // void Intrinsic096(4 bytes)
0, // void Intrinsic097(void)
0, // void Intrinsic098(void)
@@ -214,11 +214,11 @@ Intrinsic RemorseIntrinsics[] = {
0, // ? Item::I_getNpcNum, void Intrinsic0A6(void)
0, // ? Item::I_getQLo, void Intrinsic0A7(4 bytes)
0, // ? Item::I_getQHi, void Intrinsic0A8(4 bytes)
- 0, // call usecode event B void Intrinsic0A9(void)
- 0, // void Intrinsic0AA(2 bytes)
+ 0, // I_playFlic(char *) Intrinsic0A9(void)
+ AudioProcess::I_playSFX, // void Intrinsic0AA(2 bytes)
0, // ? Item::I_andStatus, int Intrinsic0AB(4 bytes)
0, // ? Ultima8Engine::I_getCurrentTimerTick, void Intrinsic0AC(2 bytes)
- 0, // void Intrinsic0AD(4 bytes)
+ Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
Item::I_getQLo, // based on same coff set as 02B
Item::I_getQHi, // based on same coff set as 026
// 0x0B0
@@ -257,10 +257,10 @@ Intrinsic RemorseIntrinsics[] = {
0, // void Intrinsic0CF(6 bytes)
// 0x0D0
0, // void Intrinsic0D0(4 bytes)
- 0, // UNUSEDInt00D1()
- 0, // void Intrinsic0D2(void)
+ 0, // 0D1 - I_StopAllSFX (unused so not implmeneted)
+ 0, // void I_playFlic(int *item,char *flicname,word sizex,word sizey) // play flic
0, // UNUSEDInt00D3()
- 0, // void Intrinsic0D4(2 bytes)
+ AudioProcess::I_playSFX, // void Intrinsic0D4(2 bytes)
0, // void Intrinsic0D5(4 bytes)
0, // int Intrinsic0D6(void)
0, // void Intrinsic0D7(4 bytes)
@@ -294,11 +294,11 @@ Intrinsic RemorseIntrinsics[] = {
0, // ? Item::I_getNpcNum, int Intrinsic0F1(6 bytes)
0, // void Intrinsic0F2(6 bytes)
Item::I_getQHi, // based on same coff set as 026
- 0, // ? Item::I_getQHi, void Intrinsic0F4(4 bytes)
- 0, // ? Item::I_andStatus, void Intrinsic0F5(6 bytes)
+ Item::I_getQ, // void Intrinsic0F4(4 bytes)
+ Item::I_setQ, // void Intrinsic0F5(6 bytes)
0, // void Intrinsic0F6(void)
0, // void Intrinsic0F7(12 bytes)
- 0, // void Intrinsic0F8(4 bytes)
+ Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
0, // void Intrinsic0F9(12 bytes)
0, // FA = integer to string int Intrinsic0FA(6 bytes)
Item::I_getQHi, // based on same coff set as 026
@@ -307,37 +307,37 @@ Intrinsic RemorseIntrinsics[] = {
0, // void Intrinsic0FE(4 bytes)
UCMachine::I_numToStr, // same as 113 based on same coff set 0FF, 113, 126
// 0x100
- 0, // ? Item::I_andStatus, void Intrinsic100(4 bytes)
+ Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
Item::I_andStatus, // ? Item::I_getNpcNum, void Intrinsic101(6 bytes)
- 0, // ? Item::I_andStatus, void Intrinsic102(4 bytes)
+ Item::I_getNpcNum, // Based on variable name in TRIGGER::ordinal21
0, // ? Item::I_getNpcNum, // byte Intrinsic103(uint16 shapenum),
- Item::I_andStatus, // ? Item::I_andStatus, void Intrinsic104(6 bytes)
- 0, // ? Item::I_getNpcNum, void Intrinsic105(4 bytes)
- Item::I_andStatus, // ? Item::I_andStatus, void Intrinsic106(6 bytes)
- 0, // ? Item::I_getNpcNum, void Intrinsic107(4 bytes)
- Item::I_andStatus, // ? Item::I_andStatus, void Intrinsic108(6 bytes)
- 0, // ? Item::I_getNpcNum, void Intrinsic109(4 bytes)
- Item::I_andStatus, // ? Item::I_andStatus, void Intrinsic10A(6 bytes)
- 0, // ? Item::I_getNpcNum, void Intrinsic10B(4 bytes)
- Item::I_andStatus, // ? Item::I_andStatus, void Intrinsic10C(6 bytes)
- 0, // ? Item::I_getNpcNum, void Intrinsic10D(4 bytes)
+ Item::I_andStatus, // void Intrinsic104(6 bytes)
+ Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
+ Item::I_andStatus, // void Intrinsic106(6 bytes)
+ Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
+ Item::I_andStatus, // void Intrinsic108(6 bytes)
+ Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
+ Item::I_andStatus, // void Intrinsic10A(6 bytes)
+ Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
+ Item::I_andStatus, // void Intrinsic10C(6 bytes)
+ Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
Item::I_andStatus, // void Intrinsic10E(6 bytes)
- 0, // ? Item::I_andStatus, void Intrinsic10F(4 bytes)
+ Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
// 0x110
- Item::I_andStatus, // ? Item::I_getNpcNum, void Intrinsic110(6 bytes)
- 0, // int16 Intrinsic111(4 bytes)
+ Item::I_andStatus, // void Intrinsic110(6 bytes)
+ Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
0, // ? Item::I_andStatus, byte Intrinsic112(4 bytes)
UCMachine::I_numToStr, // see VMAIL::func0A for example usage
Item::I_andStatus, // void Intrinsic114(6 bytes)
- 0, // ? Item::I_andStatus, int16 Intrinsic115(4 bytes)
+ Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
0, // ? Item::I_getTypeFlag, byte Intrinsic116(14 bytes)
Item::I_andStatus, // ? Item::I_getNpcNum, void Intrinsic117(6 bytes)
0, // int16 Intrinsic118(12 bytes)
0, // void Intrinsic119(4 bytes)
Item::I_andStatus, // void Intrinsic11A(6 bytes)
0, // byte Intrinsic11B(6 bytes)
- 0, // int16 Intrinsic11C(4 bytes)
+ Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
0, // int16 Intrinsic11D(12 bytes)
0, // int16 Intrinsic11E(4 bytes)
0, // ? Item::I_getNpcNum, byte Intrinsic11F(4 bytes)
@@ -345,13 +345,13 @@ Intrinsic RemorseIntrinsics[] = {
0, // void Intrinsic120(4 bytes)
0, // int Intrinsic121(4 bytes)
0, // int Intrinsic122(4 bytes)
- 0, // void Intrinsic123(4 bytes)
+ Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
0, // ? Item::I_andStatus, void Intrinsic124(4 bytes)
0, // ? Item::I_getNpcNum, void Intrinsic125(6 bytes)
UCMachine::I_numToStr, // same as 113 based on same coff set 0FF, 113, 126
0, // int Intrinsic127(8 bytes)
Item::I_andStatus, // void Intrinsic128(6 bytes) // maybe Item::andStatus?? see ITEM::ordinal22
- 0, // void Intrinsic129(4 bytes)
+ Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
0, // void Intrinsic12A(4 bytes)
0, // void Intrinsic12B(4 bytes)
0, // int Intrinsic12C(6 bytes)
diff --git a/engines/ultima/ultima8/usecode/uc_machine.cpp b/engines/ultima/ultima8/usecode/uc_machine.cpp
index 516d29c67d..b4032e215b 100644
--- a/engines/ultima/ultima8/usecode/uc_machine.cpp
+++ b/engines/ultima/ultima8/usecode/uc_machine.cpp
@@ -366,13 +366,14 @@ void UCMachine::execProcess(UCProcess *p) {
if (arg_bytes >= 4) {
// HACKHACKHACK to check what the argument is.
- uint8 *args = new uint8[arg_bytes];
+ uint8 *argmem = new uint8[arg_bytes];
+ uint8 *args = argmem;
p->_stack.pop(args, 4);
p->_stack.addSP(-4); // don't really pop the args
ARG_UC_PTR(iptr);
uint16 testItemId = ptrToObject(iptr);
testItem = getItem(testItemId);
- delete [] args;
+ delete [] argmem;
}
perr << "Unhandled intrinsic << " << func << " \'" << _convUse->intrinsics()[func] << "\'? (";
if (testItem) {
@@ -2264,6 +2265,11 @@ uint16 UCMachine::ptrToObject(uint32 ptr) {
perr << "Trying to access stack of non-existent "
<< "process (pid: " << segment << ")" << Std::endl;
return 0;
+ } else if (proc->_stack.getSize() < offset + 2) {
+ perr << "Trying to access past end of stack offset " << offset
+ << " (size: " << proc->_stack.getSize()
+ << ") process (pid: " << segment << ")" << Std::endl;
+ return 0;
} else {
return proc->_stack.access2(offset);
}
diff --git a/engines/ultima/ultima8/world/item.cpp b/engines/ultima/ultima8/world/item.cpp
index 8400a18466..cea487764b 100644
--- a/engines/ultima/ultima8/world/item.cpp
+++ b/engines/ultima/ultima8/world/item.cpp
@@ -2167,7 +2167,7 @@ uint32 Item::I_orStatus(const uint8 *args, unsigned int argsize) {
ARG_UINT16(mask);
if (!item) return 0;
- item->_flags |= mask;
+ item->setFlag(mask);
return 0;
}
@@ -2673,6 +2673,15 @@ uint32 Item::I_getNpcNum(const uint8 *args, unsigned int /*argsize*/) {
return item->getNpcNum();
}
+uint32 Item::I_setNpcNum(const uint8 *args, unsigned int /*argsize*/) {
+ ARG_ITEM_FROM_PTR(item);
+ ARG_UINT16(npcNum);
+ if (!item) return 0;
+
+ item->setNpcNum(npcNum);
+ return 0;
+}
+
uint32 Item::I_getDirToCoords(const uint8 *args, unsigned int /*argsize*/) {
ARG_ITEM_FROM_PTR(item);
ARG_UINT16(x);
@@ -2922,5 +2931,23 @@ uint32 Item::I_isCrusTypeNPC(const uint8 *args, unsigned int /*argsize*/) {
return 0;
}
+uint32 Item::I_doSomethingAndSetUnkCruFlag(const uint8 *args, unsigned int /*argsize*/) {
+ ARG_ITEM_FROM_PTR(item);
+
+ // TODO: Do something.. (to match disassembly)
+
+ item->setFlag(FLG_UNK_CRU);
+ return 0;
+}
+
+uint32 Item::I_inFastArea(const uint8 *args, unsigned int /*argsize*/) {
+ ARG_ITEM_FROM_PTR(item);
+
+ if (!item)
+ return 0;
+
+ return item->hasFlags(FLG_FASTAREA);
+}
+
} // End of namespace Ultima8
} // End of namespace Ultima
diff --git a/engines/ultima/ultima8/world/item.h b/engines/ultima/ultima8/world/item.h
index a52e482b6b..fd12c88ccf 100644
--- a/engines/ultima/ultima8/world/item.h
+++ b/engines/ultima/ultima8/world/item.h
@@ -493,6 +493,7 @@ public:
INTRINSIC(I_getMapArray);
INTRINSIC(I_setMapArray);
INTRINSIC(I_getNpcNum);
+ INTRINSIC(I_setNpcNum);
INTRINSIC(I_getDirToCoords);
INTRINSIC(I_getDirFromCoords);
INTRINSIC(I_getDirToItem);
@@ -533,6 +534,8 @@ public:
INTRINSIC(I_canReach);
INTRINSIC(I_getRange);
INTRINSIC(I_isCrusTypeNPC);
+ INTRINSIC(I_doSomethingAndSetUnkCruFlag);
+ INTRINSIC(I_inFastArea);
private:
uint32 _shape; // DO NOT modify this directly! Always use setShape()!
@@ -590,10 +593,11 @@ public:
FLG_GUMP_OPEN = 0x0100, //!< Item has a gump open
FLG_EQUIPPED = 0x0200, //!< Item is equipped
FLG_BOUNCING = 0x0400, //!< Item has bounced
- FLG_ETHEREAL = 0x0800, //!< Item is in the ethereal list
+ FLG_ETHEREAL = 0x0800, //!< Item is in the ethereal list - confirmed same meaning in crusader
FLG_HANGING = 0x1000, //!< Item is suspended in the air
FLG_FASTAREA = 0x2000, //!< Item is in the fast area
- FLG_LOW_FRICTION = 0x4000 //!< Item has low friction
+ FLG_LOW_FRICTION = 0x4000, //!< Item has low friction
+ FLG_UNK_CRU = 0x8000 //!< Unknown crusader flag
};
enum extflags {
Commit: a1e67a170310407256590d4cf89ff95231d66370
https://github.com/scummvm/scummvm/commit/a1e67a170310407256590d4cf89ff95231d66370
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-06-15T16:54:23+09:00
Commit Message:
ULTIMA: Switch Crusader detection from commented-out to debug-build-only
Changed paths:
engines/ultima/detection_tables.h
diff --git a/engines/ultima/detection_tables.h b/engines/ultima/detection_tables.h
index 99bf2abe96..946db367ef 100644
--- a/engines/ultima/detection_tables.h
+++ b/engines/ultima/detection_tables.h
@@ -285,6 +285,7 @@ static const UltimaGameDescription GAME_DESCRIPTIONS[] = {
0
},
+#ifndef RELEASE_BUILD
// Crusader games use basically the same engine as ultima8, but still
// need a lot of work.
@@ -332,6 +333,7 @@ static const UltimaGameDescription GAME_DESCRIPTIONS[] = {
GAME_CRUSADER_REG,
0
},
+#endif
// GOG Martian Dreams
{
Commit: 43fa6e603a1f59612a77e56c92fb6b9ab553ce43
https://github.com/scummvm/scummvm/commit/43fa6e603a1f59612a77e56c92fb6b9ab553ce43
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-06-15T16:54:23+09:00
Commit Message:
ULTIMA8: More support for Crusader intrinsics
Changed paths:
engines/ultima/ultima8/audio/audio_process.cpp
engines/ultima/ultima8/audio/audio_process.h
engines/ultima/ultima8/audio/remorse_music_process.cpp
engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
engines/ultima/ultima8/convert/u8/convert_usecode_u8.h
engines/ultima/ultima8/games/game_data.cpp
engines/ultima/ultima8/usecode/remorse_intrinsics.h
engines/ultima/ultima8/world/actors/actor.cpp
engines/ultima/ultima8/world/actors/main_actor.cpp
engines/ultima/ultima8/world/camera_process.cpp
engines/ultima/ultima8/world/item.cpp
engines/ultima/ultima8/world/item.h
engines/ultima/ultima8/world/item_factory.cpp
diff --git a/engines/ultima/ultima8/audio/audio_process.cpp b/engines/ultima/ultima8/audio/audio_process.cpp
index 1a6559ffaf..eb497005ed 100644
--- a/engines/ultima/ultima8/audio/audio_process.cpp
+++ b/engines/ultima/ultima8/audio/audio_process.cpp
@@ -299,7 +299,8 @@ void AudioProcess::stopSFX(int sfxNum, ObjId objId) {
Std::list<SampleInfo>::iterator it;
for (it = _sampleInfo.begin(); it != _sampleInfo.end();) {
- if (it->_sfxNum == sfxNum && it->_objId == objId) {
+ if ((sfxNum == -1 || it->_sfxNum == sfxNum)
+ && it->_objId == objId) {
if (mixer->isPlaying(it->_channel)) mixer->stopSample(it->_channel);
it = _sampleInfo.erase(it);
} else {
@@ -588,5 +589,27 @@ uint32 AudioProcess::I_stopSFX(const uint8 *args, unsigned int argsize) {
return 0;
}
+uint32 AudioProcess::I_stopSFXCru(const uint8 *args, unsigned int argsize) {
+ int16 sfxNum = -1;
+ ARG_ITEM_FROM_PTR(item);
+
+ if (!item) {
+ perr << "Invalid item in I_stopSFXCru";
+ return 0;
+ }
+
+ if (argsize == 6) {
+ ARG_SINT16(sfxNumber);
+ sfxNum = sfxNumber;
+ }
+
+ AudioProcess *ap = AudioProcess::get_instance();
+ if (ap) ap->stopSFX(sfxNum, item->getObjId());
+ else perr << "Error: No AudioProcess" << Std::endl;
+
+ return 0;
+}
+
+
} // End of namespace Ultima8
} // End of namespace Ultima
diff --git a/engines/ultima/ultima8/audio/audio_process.h b/engines/ultima/ultima8/audio/audio_process.h
index 4641c80e20..a839e9a38a 100644
--- a/engines/ultima/ultima8/audio/audio_process.h
+++ b/engines/ultima/ultima8/audio/audio_process.h
@@ -81,6 +81,7 @@ public:
INTRINSIC(I_isSFXPlaying);
INTRINSIC(I_setVolumeSFX);
INTRINSIC(I_stopSFX);
+ INTRINSIC(I_stopSFXCru);
void run() override;
@@ -94,6 +95,7 @@ public:
playSFX(sfxNum, priority, objId, loops, no_duplicates, pitchShift, volume, -1, -1);
}
+ //! stop sfx on object. set sfxNum = -1 to stop all for object.
void stopSFX(int sfxNum, ObjId objId);
bool isSFXPlaying(int sfxNum);
void setVolumeSFX(int sfxNum, uint8 volume);
diff --git a/engines/ultima/ultima8/audio/remorse_music_process.cpp b/engines/ultima/ultima8/audio/remorse_music_process.cpp
index fb05d8f372..a02d5826f0 100644
--- a/engines/ultima/ultima8/audio/remorse_music_process.cpp
+++ b/engines/ultima/ultima8/audio/remorse_music_process.cpp
@@ -121,7 +121,8 @@ void RemorseMusicProcess::playMusic_internal(int track) {
mixer->stopHandle(_soundHandle);
_soundHandle = Audio::SoundHandle();
if (_playingStream) {
- delete _playingStream;
+ // FIXME: This gets use-after-free.. is it deleted already?
+ //delete _playingStream;
_playingStream = nullptr;
}
diff --git a/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h b/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
index 78e6846a33..0a471a3a1e 100644
--- a/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
+++ b/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
@@ -78,14 +78,14 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"byte Actor::I_isNPC(Item *)", // proably - actually checks is itemno < 256?
"byte Item::I_getZ(Item *)",
"void Item::I_destroy(Item *)", // probably? often called after creating a replacement object and setting it to the same position (eg, LUGGAGE::gotHit)
- "int16 I_getSOMETHING_0B(MainActor *?)", // could be getNPCNum? Called from ANDROID::calledFromAnim, goes to NPCDEATH
- "void Intrinsic00C(2 bytes)",
- "byte Item::Intrinsic00D(Item *, itemno)",
- "int16 Intrinsic00E(8 bytes)",
+ "int16 I_GetNPCDataField0x63_00B(Actor *)", // could be getNPCNum? Called from ANDROID::calledFromAnim, goes to NPCDEATH
+ "void I_NPCsetSomething_00C(int)",
+ "byte Item::I_getDirToItem(Item *, itemno)", // based on disasm
+ "int16 I_NPCSomething00E(Actor *, int, int)",
"void I_playFlic(void), int16 I_playFlic(Item *, char *name, int16 sizex, int16 sizey)",
// 0010
"int16 Item::I_getQLo(Item *)", // same as 02B based on same coff as 02B, 066, 084, 0A1, 0AE, 0D9, 0EA
- "int16 Intrinsic011(4 bytes)",
+ "int16 Actor::I_getMap(4 bytes)", // based on disasm.
"void Intrinsic012(2 bytes)",
"int16 Item::I_getX(Item *)",
"int16 Item::I_getY(Item *)",
@@ -96,127 +96,127 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"byte Item::I_legalCreateAtCoords(Item *, int16 shapeno, int16 frame, int16 x, int16 y, int16 z)", // probably, see usage in DOOR2::ordinal37
"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. Always associated with a bitwise-not or bitmask
"int16 Intrinsic01B(void)",
- "byte Intrinsic01C(4 bytes)", // same coff as 112, 121
- "int16 Intrinsic01D(4 bytes)", // part of same coff set 01D, 05A, 0B9, 0D7, 0E4, 124
+ "byte Actor::I_getDir(4 bytes)", // based on disasm. same coff as 112, 121
+ "int16 Actor::I_getLastAnimSet(4 bytes)", // based on disasm. part of same coff set 01D, 05A, 0B9, 0D7, 0E4, 124
"int16 Intrinsic01E(16 bytes)",
"byte Item::I_create(Item *, uint16 shapenum, uint16 framenum)", // probably - used in MISS1EGG referencing keycards and NPCDEATH in creating blood spills
// 0020
"void Item::I_popToCoords(Item *, uint16 x, uint16 y, uint16 z)", // set coords, used after creating blood spills in NPCDEATH
- "void Intrinsic021(4 bytes)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
- "void Intrinsic022(Item *)", // I_push??
+ "void Actor::I_setDead(4 bytes)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
+ "void I_push(Item *)", // same code as U8
"int16 Intrinsic023(void)", // returns some ItemCache global in disassembly
"void Item::I_setShape(Item *, int16 shapeno)", // probably. See PEPSIEW::gotHit.
- "void I_maybeTouch025(4 bytes)", // I_touch??
+ "void Item::I_touch(Item *)", // same code as U8
"int16 Item::I_getQHi(Item *)", // guess, based on variable name in BOUNCBOX::gotHit
- "int16 Intrinsic027(14 bytes)",
- "int16 Intrinsic028(12 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
- "int16 Intrinsic029([pid, [byte]])",
+ "int16 I_getDirectionSomething(x1, y1, x2, y2, numdirs, aa, bb)", // TODO: understand the decompile of this better.. what is it doing with aa and bb?
+ "int16 Item::I_hurl(Item *,8 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
+ "int16 I_GetGlobal7e2d_029(void)",
"void AudioProcess::I_playAmbientSFXCru(Item *, sndno)",
"int16 Item::I_getQLo(Item *)", // guess, based on variable name in BOUNCBOX::gotHit
"byte Item::I_inFastArea(Item *)",
"void Item::I_setQHi(Item *, uint16 qhi)", // probably setQHi, see usage in FREE::ordinal2E where object position is copied
- "byte Intrinsic02E(Item *, 8 bytes)",
+ "byte I_legalMoveToPoint(Item *, Point *, int16 force)", // based on disasm
"byte Intrinsic02F(10 bytes)",
// 0030
- "void I_maybePop030(4 bytes)", // I_pop??
+ "void Item::I_pop(Item *)", // same code as U8
"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 Intrinsic032(12 bytes)",
- "byte Intrinsic033(4 bytes)",
- "int16 Intrinsic034(8 bytes)",
- "byte Intrinsic035(4 bytes)",
- "int16 Intrinsic036(12 bytes)",
+ "byte Actor::I_isBusy(4 bytes)", // same code as U8
+ "int16 Actor::I_getDir16(x1, y1, x2, y2)",
+ "byte Actor::I_getSomeFlagMaybeCrouch(Item *)",
+ "int16 Actor::I_doAnim(12 bytes)", // v. similar code to U8
"byte Intrinsic037(4 bytes)", // same coff as 0B8
"void AudioProcess::Intrinsic038(Item *, int16 sndno)",
- "byte Intrinsic039(4 bytes)", // same coff as 122, 12E
+ "byte Actor::I_isDead(Item *)", // same coff as 122, 12E
"byte AudioProcess::Intrinsic03A(Item *, int16 unk)",
"void Item::I_setQLo(Item *, int16 qlo)", // probably setQLo, see usage in FREE::ordinal2E where object position is copied. Disassembly confirms.
- "int16 Item::I_getSomethingShapey(Item *)", // something shape related according to disasm
- "void Intrinsic03D(4 bytes)",
- "void Intrinsic03E(4 bytes)",
- "int16 Intrinsic03F(4 bytes)",
+ "int16 Item::I_getItemFamily(Item *)", // based on disasm
+ "void Container::I_destroyContents(Item *)",
+ "void Item::I_fallProbably(Item *)", // similar disasm to U8, but not totally the same.
+ "int16 Egg::I_getEggId(Item *)", // from disasm
// 0040
- "void Intrinsic040(8 bytes)",
- "void Intrinsic041(2 bytes)",
+ "void CameraProcess::I_move_to(x, y, z)",
+ "void CameraProcess::I_setCenterOn(objid)",
"byte Intrinsic042(6 bytes)",
"void AudioProcess::Intrinsic043(Item *, soundno)", // something with sound, probably Item *, soundno based on disassembly, maybe stopSFX?
- "byte Item::Intrinsic044(Item *, uint16 itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
+ "byte Item::I_IsOn(Item *, uint16 itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
"int16 Item::I_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
- "byte Item::Intrinsic046(Item *, uint16 itemno))", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
+ "byte Item::I_IsOn(Item *, uint16 itemno))", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
"int16 Item::I_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
- "byte Item::Intrinsic048(Item *, uint16 itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
+ "byte Item::I_IsOn(Item *, uint16 itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
"int16 Item::I_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
- "byte Item::Intrinsic04A(Item *, uint16 itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
+ "byte Item::I_IsOn(Item *, uint16 itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
"int16 Item::I_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
- "byte Item::Intrinsic04C(Item *, uint16 itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
+ "byte Item::I_IsOn(Item *, uint16 itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
"int16 Item::I_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
- "byte Item::Intrinsic04E(Item *, uint16 itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
+ "byte Item::I_IsOn(Item *, uint16 itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
"int16 Item::I_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
// 0050
- "int16 Intrinsic050(4 bytes)",
- "void Intrinsic051(4 bytes)",
+ "int16 I_GetNPCDataField0x2_050(Actor *)",
+ "void I_NPCSomething_051(Actor *)",
"void Intrinsic052(6 bytes)",
- "void Intrinsic053(6 bytes)",
- "void Intrinsic054(6 bytes)",
- "void Intrinsic055(6 bytes)", // part of same coff set 055, 07D, 0CD, 0DB, 0F2, 131
+ "void I_SetNPCDataField0x8_053(Actor *, int)",
+ "void I_SetNPCDataField0xA_054(Actor *, int)",
+ "void I_NPCSetActivityProbably_055(Actor *, int)", // part of same coff set 055, 07D, 0CD, 0DB, 0F2, 131
"void Intrinsic056(2 bytes)",
"int16 Item::I_getSOMETHING_57(Item *)",
"byte Item::I_doSOMETHING_58(Item *, uint16 unk)",
"void Item::I_setFrame(Item *, frame)", // based on same coff as 002
- "int16 Intrinsic05A(4 bytes)", // part of same coff set 01D, 05A, 0B9, 0D7, 0E4, 124
+ "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 Intrinsic05D(void)",
"int16 I_playFlicsomething(uint32, char *, int16 a, int16 b)", // Play video (as texture? parameters like (150, 250, "MVA11A") and other mvas)
"void Intrinsic05F(void)",
// 0060
- "void Intrinsic060(4 bytes)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
- "void Intrinsic061(8 bytes)",
+ "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)",
"void Intrinsic062(void)",
- "void Intrinsic063(12 bytes)",
- "void Item::Intrinsic064(Item *, uint *, uint *, uint *)", // same coff as 12D
- "byte Intrinsic065(4 bytes)",
- "int16 Item::I_getQLo(Item *)", // same as 02B based on same coff set 010, 02B, 066, 084, 0A1, 0AE, 0D9, 0EA
+ "void Actor::I_teleport(12 bytes)", // based on disasm same as U8
+ "void Item::I_getFootpad(Item *, uint *, uint *, uint *)", // based on disasm. same coff as 12D
+ "byte Item::I_isInNPC(Item *)", // based on disasm - following parent containers, is one of them an NPC
+ "int16 Item::I_getQLo(Item *)", // same as 02B based on same coff set 010, 02B, 066, 084, 0A1, 0AE, 0D9, 0EA
"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 Item::I_setNpcNum(Item *, uint16 npcnum)", // maybe, see EVENT::func0A or VALUEBOX::ordinal20.. right next to getNPCNum in coff (confirmed by disassembly)
"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 Item::Intrinsic06A(Item *, int16 x, int16 y, uint16 z)",
+ "void Item::I_move(Item *, int16 x, int16 y, uint16 z)",
"int16 Intrinsic06B(void)",
"void Intrinsic06C(sometimes Item *)", // TODO: when param not item, what is it?
"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 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
- "byte Intrinsic06F(6 bytes)",
+ "byte Item::I_isCompletelyOn(Item *, uint16 other)",
// 0070
"byte Intrinsic070(void)",
"void Intrinsic071(void)",
"void Intrinsic072(void)",
- "void Intrinsic073(4 bytes)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
+ "void Actor::I_setDead(4 bytes)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
"void Intrinsic074(void)",
"void Intrinsic075(void)",
- "void AudioProcess::Intrinsic076(Item *)",
+ "void AudioProcess::I_stopSFX(Item *)",
"int16 Intrinsic077_Fade(void)", // something about fades
"void Intrinsic078(void)",
- "int16 Intrinsic079(6 bytes)",
+ "int16 MainActor::I_teleportToEgg(int, int, int)",
"int16 Intrinsic07A_Fade(void)", // something about fades
- "void Intrinsic07B(4 bytes)", // same coff as 130
- "int16 Intrinsic07C(4 bytes)",
- "void Intrinsic07D(6 bytes)", // part of same coff set 055, 07D, 0CD, 0DB, 0F2, 131
- "int16 I_getQIfSomething(Item *)", // based on disassembly
- "void Intrinsic07F(6 bytes)", // same coff as 0BA, 125
+ "void Actor::I_clrImmortal(Actor *)", // same coff as 130
+ "int16 I_GetNPCDataField0_07C(Actor *)",
+ "void I_NPCSetActivityProbably_07D(Actor *, int)", // part of same coff set 055, 07D, 0CD, 0DB, 0F2, 131
+ "int16 Item::I_getQuality(Item *)", // based on disassembly
+ "void Item::I_setQuality(Item *, int)", // based on disassembly. same coff as 0BA, 125
// 0080
- "int16 Intrinsic080(4 bytes)", // same coff as 0D0, 0D5
+ "int16 Item::I_use(Item *)", // same coff as 0D0, 0D5
"int16 Intrinsic081(4 bytes)",
- "int16 Intrinsic082(4 bytes)",
- "void Intrinsic083(6 bytes)",
+ "int16 I_GetNPCDataField0x57_082(Actor *)",
+ "void I_SetNPCDataField0x57_083(Actor *, int)",
"int16 Item::I_getQLo(Item *)", // same as 02B based on same coff set 010, 02B, 066, 084, 0A1, 0AE, 0D9, 0EA
- "void Intrinsic085(4 bytes)",
+ "void Actor::I_setImmortal(Actor *)",
"int16 Intrinsic086(void)",
"int16 Intrinsic087(void)",
"void Item::I_setMapArray(Item *, uint16 maparray)", // based on decompile - sets same value as read by getmaparray .. see VALUEBOX:ordinal20
"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 Intrinsic08A(12 bytes)",
- "int16 Item::I_enterFastArea(Item *)", // maybe.. based on disasm
+ "int16 Item::I_enterFastArea(Item *)", // based on disasm, v similar to U8
"void Item::I_DoSomethingAndSetStatusFlag0x8000(Item *)", // same coff as 119, 12A
- "int16 Intrinsic08D(12 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
+ "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 Intrinsic08F_Fade(void)", // something about fades
// 0090
@@ -226,9 +226,9 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"void Intrinsic093(void)", // clears som global (set by 91)
"UNUSEDInt0094()",
"byte Intrinsic095(void)", // get global - something about keyboard (by disasm)
- "int16 Intrinsic096(4 bytes)",
+ "int16 MainActor::I_teleportToEgg(int, int)", // a bit different to the U8 one - uses main actor map by default.
"void Intrinsic097(void)",
- "void Intrinsic098(void)",
+ "void I_ProcessDeathSilence_098(void)",
"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 Intrinsic09A_Fade(void)", // something about fades
"int16 Intrinsic09B_Fade(2 bytes)", // something about fades
@@ -237,105 +237,105 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"int16 Intrinsic09E_Fade(4 bytes)", // something about fades
"int16 Intrinsic09F_Fade(10 bytes)", // something about fades
// 00A0
- "void Intrinsic0A0(4 bytes)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
+ "void I_SetItemFlag0x8000AndNPCField0x13Flag0_0A0(Actor *)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
"int16 Item::I_getQLo(Item *)", // same as 02B based on same coff set 010, 02B, 066, 084, 0A1, 0AE, 0D9, 0EA
- "int16 Item::getQLoIfSomething(Item *)", // based on disassembly
- "void Intrinsic0A3(6 bytes)",
- "byte Item::Intrinsic0A4(Item *, uint16 unk)",
- "byte Intrinsic0A5(6 bytes)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
+ "int16 Item::I_getUnkEggType(Item *)", // based on disassembly, same as U8
+ "void Egg::I_setEggXRange(Egg *, int)", // based on disasm
+ "byte Item::I_overlaps(Item *, uint16 unk)", // same disasm as U8
+ "byte Item::I_isOn(Item *, itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
"int16 Intrinsic0A6(void)",
- "int16 Intrinsic0A7(4 bytes)",
- "void Intrinsic0A8(4 bytes)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
+ "int16 Egg::I_getEggXRange(Egg *)", // based on disasm
+ "void Actor::I_setDead(Actor *)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
"void I_playFlic0A9(char *)", // same coff as 092
"void I_playSFX(2 bytes)", // same coff as 0D4
- "byte Intrinsic0AB(4 bytes)",
+ "byte I_NPCGetField0x59Flag1_0AB(Actor *)",
"int16 I_maybeGetFamilyOfType(2 bytes)", // per pentagram notes
"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
"int16 Item::I_getQLo(Item *)", // same as 02B based on same coff set 010, 02B, 066, 084, 0A1, 0AE, 0D9, 0EA
"int16 Item::I_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
// 00B0
- "int16 Intrinsic0B0(6 bytes)",
- "int16 Intrinsic0B1(6 bytes)",
+ "int16 Item::I_unequip(6 bytes)",
+ "int16 Item::I_spawnUsecodeEvent0x13(Item *, 2 bytes)", // based on disasm - what is event 0x13? "avatar stole something" in U8..
"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
"int32 I_getCurrentTimerTick(void)",
"void Intrinsic0B4(void)", // set or clear alert? (based on coff)
- "int16 Intrinsic0B5(6 bytes)",
+ "int16 Item::I_equip(6 bytes)",
"void Intrinsic0B6(void)", // set or clear alert? (based on coff)
- "int16 Intrinsic0B7(void)",
+ "int16 I_GetNPCGlobal0x7e24_0B7(void)",
"byte Intrinsic0B8(4 bytes)", // same coff as 037
- "int16 Intrinsic0B9(4 bytes)", // part of same coff set 01D, 05A, 0B9, 0D7, 0E4, 124
- "void Intrinsic0BA(6 bytes)", // same coff as 07F, 125
+ "int16 Actor::I_getLastAnimSet(4 bytes)", // part of same coff set 01D, 05A, 0B9, 0D7, 0E4, 124
+ "void Item::I_setQuality(Item *, int)", // same coff as 07F, 125
"byte Intrinsic0BB(8 bytes)",
- "byte Intrinsic0BC(6 bytes)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
- "int16 Intrinsic0BD(12 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
+ "byte Item::I_isOn(Item *, itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
+ "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_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
"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
// 00C0
- "int16 Intrinsic0C0(12 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
+ "int16 Item::I_hurl(Item *,8 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
"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
- "int16 Intrinsic0C2(12 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
+ "int16 Item::I_hurl(Item *,8 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
"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
"int16 Intrinsic0C4(2 bytes)",
- "byte Intrinsic0C5(6 bytes)",
- "void Intrinsic0C6(14 bytes)",
- "byte Item::Intrinsic0C7(Item *, itemno)", // does something with the x/y from itemno
- "int16 Intrinsic0C8(12 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
+ "byte Item::I_isOn(Item *, itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
+ "void SpriteProcess::I_createSprite(word, word, word, word, uword, uword, ubyte)",
+ "byte Item::I_getDirFromItem(Item *, itemno)", // same disasm as U8
+ "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_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
- "byte Intrinsic0CA(6 bytes)",
+ "byte I_NPCSomething_0CA(Actor *, int)",
"void Intrinsic0CB(2 bytes)",
- "byte Intrinsic0CC(4 bytes)",
- "void Intrinsic0CD(6 bytes)", // part of same coff set 055, 07D, 0CD, 0DB, 0F2, 131
+ "byte I_GetNPCDataField0x59Flag3_0CC(Actor *)",
+ "void I_NPCSetActivityProbably_0CD(Actor *, int)", // part of same coff set 055, 07D, 0CD, 0DB, 0F2, 131
"int16 Intrinsic0CE(void)",
"void Item::setQAndCallSomething(Item *, int16 q)", // based on disassembly
// 00D0
- "int16 Intrinsic0D0(4 bytes)", // same coff as 080, 0D5
+ "int16 Item::I_use(Item *)", // same coff as 080, 0D5
"UNUSEDInt00D1()", // I_StopAllSFX (unused so not implmeneted)
"void Intrinsic0D2(int *item,char *flicname,word sizex,word sizey)", // play flic
"UNUSEDInt00D3()",
"void I_playSFX(2 bytes)", // same coff as 0AA. Based on disasm.
- "int16 Intrinsic0D5(4 bytes)", // same coff as 080, 0D0
+ "int16 Item::I_use(Item *)", // same coff as 080, 0D0
"byte Intrinsic0D6(void)",
- "int16 Intrinsic0D7(4 bytes)", // part of same coff set 01D, 05A, 0B9, 0D7, 0E4, 124
- "void Intrinsic0D8(4 bytes)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
+ "int16 Actor::I_getLastAnimSet(4 bytes)", // part of same coff set 01D, 05A, 0B9, 0D7, 0E4, 124
+ "void Actor::I_setDead(4 bytes)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
"int16 Item::I_getQLo(Item *)", // same as 02B based on same coff set 010, 02B, 066, 084, 0A1, 0AE, 0D9, 0EA
"void Intrinsic0DA_Fade(void)", // something about fades
- "void Intrinsic0DB(6 bytes)", // part of same coff set 055, 07D, 0CD, 0DB, 0F2, 131
- "byte Intrinsic0DC(6 bytes)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
- "int16 Intrinsic0DD(4 bytes)",
- "void Intrinsic0DE(6 bytes)",
- "int16 Intrinsic0DF(6 bytes)",
+ "void I_NPCSetActivityProbably_0DB(Actor *, int)", // part of same coff set 055, 07D, 0CD, 0DB, 0F2, 131
+ "byte Item::I_isOn(Item *, itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
+ "int16 I_GetNPCDataField0x4_0DD(Actor *)",
+ "void I_SetNPCDataField0x5c_0DE(Actor *, int)",
+ "int16 Actor::I_getEquip(6 bytes)", // based on disasm
// 00E0
- "void Intrinsic0E0(8 bytes)",
- "int16 Intrinsic0E1(4 bytes)",
- "int16 Intrinsic0E2(4 bytes)",
- "int16 Intrinsic0E3(4 bytes)",
- "int16 Intrinsic0E4(4 bytes)", // part of same coff set 01D, 05A, 0B9, 0D7, 0E4, 124
- "void Intrinsic0E5(6 bytes)",
- "void Intrinsic0E6(6 bytes)",
- "void Intrinsic0E7(4 bytes)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
- "int16 Intrinsic0E8(6 bytes)",
+ "void Actor::I_setEquip(8 bytes)",
+ "int16 I_GetNPCDataField0x6_0E1(Actor *)",
+ "int16 I_GetNPCDataField0x8_0E2(Actor *)",
+ "int16 I_GetNPCDataField0xa_0E3(Actor *)",
+ "int16 Actor::I_getLastAnimSet(4 bytes)", // part of same coff set 01D, 05A, 0B9, 0D7, 0E4, 124
+ "void I_NPCSomething0E5(Actor *, uint16)",
+ "void 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)",
"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
"int16 Item::I_getQLo(Item *)", // same as 02B based on same coff set 010, 02B, 066, 084, 0A1, 0AE, 0D9, 0EA
- "int16 Intrinsic0EB(void)",
- "void Intrinsic0EC(6 bytes)",
- "void Intrinsic0ED(6 bytes)", // poptocontainer??
+ "int16 I_GetQOfAvatarInventoryItem0x4ed_0EB(void)",
+ "void Item::I_popToEnd(Item*, int)", // similar code to U8
+ "void Item::I_popToContainer(Item*, int)", // same code as U8
"void Intrinsic0EE(void)",
"int16 Intrinsic0EF(4 bytes not Item *)",
// 00F0
"int16 Item::I_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
- "byte Intrinsic0F1(6 bytes)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
- "void Intrinsic0F2(6 bytes)", // part of same coff set 055, 07D, 0CD, 0DB, 0F2, 131
+ "byte Item::I_isOn(Item *, itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
+ "void I_NPCSetActivityProbably_0F2(Actor *, int)(6 bytes)", // part of same coff set 055, 07D, 0CD, 0DB, 0F2, 131
"int16 Item::I_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
"int16 Item::I_getQ(Item *)", // based on disassembly
"void Item::I_setQ(Item *, uint16 q)", // based on disassembly
"void Intrinsic0F6(void)",
- "int16 Intrinsic0F7(12 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
+ "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
- "int16 Intrinsic0F9(12 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
- "byte Intrinsic0FA(6 bytes)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
+ "int16 Item::I_hurl(Item *,8 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
+ "byte Item::I_isOn(Item *, itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
"int16 Item::I_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
"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
- "byte Intrinsic0FD(2 bytes)",
+ "byte I_SomethingAboutGlobal7e2f_0FD(int)",
"void Intrinsic0FE(4 bytes)",
"int16 UCMachine::I_numToStr(int16 num)", // same as 113 based on same coff set 0FF, 113, 126
// 0100
@@ -358,44 +358,44 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
// 0110
"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
"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
- "byte Intrinsic112(4 bytes)", // same coff as 01C, 121
+ "byte Actor::I_getDir(4 bytes)", // same coff as 01C, 121
"int16 UCMachine::I_numToStr(int16 num)", // based on VMAIL::func0A example usage
"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
"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
"byte Intrinsic116(14 bytes)",
"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
- "int16 Intrinsic118(12 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
+ "int16 Item::I_hurl(Item *,8 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
"void Item::I_DoSomethingAndSetStatusFlag0x8000(Item *)", // same coff as 08C, 12A
"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
"byte Item::I_getSomeFlag(Item *, uint16 unk)",
"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
- "int16 Intrinsic11D(12 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
+ "int16 Item::I_hurl(Item *,8 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
"int16 Intrinsic11E(Item *)", // same coff as 12B
"byte Intrinsic11F(Item *)",
// 0120
"int16 Intrinsic120(Item *)",
- "byte Intrinsic121(4 bytes)", // same coff as 01C, 112
- "byte Intrinsic122(4 bytes)", // same coff as 12E, 039
+ "byte Actor::I_getDir(4 bytes)", // same coff as 01C, 112
+ "byte Actor::I_isDead(Item *)", // same coff as 12E, 039
"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
- "int16 Intrinsic124(4 bytes)", // part of same coff set 01D, 05A, 0B9, 0D7, 0E4, 124
- "void Intrinsic125(6 bytes)", // same coff as 07F, 0BA
+ "int16 Actor::I_getLastAnimSet(4 bytes)", // part of same coff set 01D, 05A, 0B9, 0D7, 0E4, 124
+ "void Item::I_setQuality(Item *, int)", // same coff as 07F, 0BA
"int16 UCMachine::I_numToStr(int16 num)", // same as 113 based on same coff set 0FF, 113, 126
- "byte Item::Intrinsic127(Item *, uin16 x, uint16 y)", // based on disassembly
+ "byte Item::I_getDirToCoords(Item *, uin16 x, uint16 y)", // based on disassembly - FIXME: returns 2* values from U8
"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
"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 Item::I_DoSomethingAndSetStatusFlag0x8000(Item *)", // same coff as 08C, 119
"int16 Intrinsic12B(Item *)", // same coff as 11E
- "byte Intrinsic12C(6 bytes)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
- "void Item::Intrinsic12D(Item *, uint *, uint *, uint *)", // same coff as 064
- "byte Intrinsic12E(4 bytes)", // same coff as 122, 039
+ "byte Item::I_isOn(Item *, itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
+ "void Item::I_getFootpadData(Item *, uint *, uint *, uint *)", // same coff as 064
+ "byte Actor::I_isDead(Item *)", // same coff as 122, 039
"int16 Intrinsic12F(Item *, uint16 unk)",
// 0130
- "void Intrinsic130(4 bytes)", // same coff as 07B
- "void Intrinsic131(6 bytes)", // part of same coff set 055, 07D, 0CD, 0DB, 0F2, 131
- "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 Actor::I_clrImmortal(Actor *)", // same coff as 07B
+ "void I_NPCSetActivityProbably_131(Actor *, int)", // part of same coff set 055, 07D, 0CD, 0DB, 0F2, 131
+ "void Item::I_andStatus(Item *, int16 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
"int16 Item::I_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
"void Intrinsic134(2 bytes)",
- "void UNUSEDInt135(4 bytes)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
+ "void Actor::I_setDead(Actor *)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
"void UNUSEDInt136()",
"void UNUSEDInt137()"
};
@@ -421,7 +421,7 @@ const char * const ConvertUsecodeCrusader::_event_names[] = {
"leaveFastArea()", // 0x10
"cast(uword)", // 0x11
"justMoved()", // 0x12
- "AvatarStoleSomething(uword)", // 0x13
+ "avatarStoleSomething(uword)", // 0x13
"animGetHit()", // 0x14
"guardianBark(word)", // 0x15
"func16", // 0x16
diff --git a/engines/ultima/ultima8/convert/u8/convert_usecode_u8.h b/engines/ultima/ultima8/convert/u8/convert_usecode_u8.h
index 16988f0e12..3f23813001 100644
--- a/engines/ultima/ultima8/convert/u8/convert_usecode_u8.h
+++ b/engines/ultima/ultima8/convert/u8/convert_usecode_u8.h
@@ -152,8 +152,8 @@ const char* const ConvertUsecodeU8::_intrinsics[] = {
"Item::legal_create(uword, uword, WorldPoint*)",
"Item::legal_create(uword, uword, uword, word)",
"Item::push()",
- "Item::pop(uword, uword, ubyte)",
- "Item::pop(uword)",
+ "Item::popToCoords(uword, uword, ubyte)",
+ "Item::popToContainer(uword)",
"Item::pop()",
"Item::popToEnd(uword)",
"Item::destroy()",
diff --git a/engines/ultima/ultima8/games/game_data.cpp b/engines/ultima/ultima8/games/game_data.cpp
index 08c6d02726..c16a7fedb0 100644
--- a/engines/ultima/ultima8/games/game_data.cpp
+++ b/engines/ultima/ultima8/games/game_data.cpp
@@ -597,7 +597,7 @@ void GameData::loadRemorseData() {
RawArchive *dtableflex = new RawArchive(dtableds);
// TODO: What's in this flex file?
- // Object 1: 35 * 142 byte blocks of .. something
+ // Object 1: 35 * 142-byte blocks of .. something. Shapeno at 0x3E (based on disasm)
// Object 2: 35 * 32-byte long names of NPCs?
//_dtable = new DtableDat();
//_dtable->load(dtableflex);
diff --git a/engines/ultima/ultima8/usecode/remorse_intrinsics.h b/engines/ultima/ultima8/usecode/remorse_intrinsics.h
index 95d9f87df4..9dec77caf2 100644
--- a/engines/ultima/ultima8/usecode/remorse_intrinsics.h
+++ b/engines/ultima/ultima8/usecode/remorse_intrinsics.h
@@ -41,19 +41,19 @@ Intrinsic RemorseIntrinsics[] = {
Item::I_getMapArray, // See TRIGGER::ordinal21 - stored in a variable 'mapNum'
Item::I_getStatus, // probably - see usage in GATGUNEW::enterFastArea - always followed by an AND against a single bit
Item::I_orStatus, // probably - see usage in GATGUNEW::enterFastArea
- 0, // void Intrinsic006(6 bytes)
+ Item::I_equip, // void Intrinsic006(6 bytes)
0, // ? byte Item::I_getSOMETHING_07(Item *)
Actor::I_isNPC, // byte Intrinsic008(Item *) // probably.. disasm checks for < 256
Item::I_getZ, // byte Intrinsic009(4 bytes) // probably, see PEPSIEW::use() variable names
Item::I_destroy, // void Intrinsic00A(4 bytes) // probably, often called after creating replacement object in same position eg, LUGGAGE::gotHit
0, // something with npcdata void Intrinsic00B(4 bytes)
0, // void Intrinsic00C(2 bytes)
- 0, // byte Intrinsic00D(6 bytes)
+ Item::I_getDirToItem, // byte Intrinsic00D(6 bytes)
0, // int Intrinsic00E(8 bytes)
0, // based on TESTFLIC, appears to be I_playVideo(item*, char *vidname, int16 sizex, int16 sizey)
// 0x010
Item::I_getQLo, // Based on having same coff as 02B
- 0, // int Intrinsic011(4 bytes)
+ Actor::I_getMap, // int Intrinsic011(4 bytes)
0, // void Intrinsic012(2 bytes)
Item::I_getX, //int Intrinsic013(4 bytes) // probably - see FREE::ordinal34
Item::I_getY, //int Intrinsic014(4 bytes) // probably - see FREE::ordinal34
@@ -64,60 +64,60 @@ Intrinsic RemorseIntrinsics[] = {
Item::I_legalCreateAtCoords, // byte Intrinsic019(14 bytes), probably, see usage in DOOR2::ordinal37
Item::I_andStatus, // void Intrinsic01A(6 bytes)
0, // // different than U8's? int Intrinsic01B(void)
- 0, // byte Intrinsic01C(4 bytes)
- 0, // int Intrinsic01D(4 bytes)
+ Actor::I_getDir, // byte Intrinsic01C(4 bytes)
+ Actor::I_getLastAnimSet, // int Intrinsic01D(4 bytes)
0, // int Intrinsic01E(16 bytes)
Item::I_create, // probably - used in MISS1EGG creating keycards and NPCDEATH in creating blood spills
// 0x020
Item::I_popToCoords, // void Intrinsic020(10 bytes)
- 0, // void Intrinsic021(4 bytes)
- 0, // ? Item::I_push, void Intrinsic022(4 bytes)
+ Actor::I_setDead, // void Intrinsic021(4 bytes)
+ Item::I_push,
0, // int Intrinsic023(void)
Item::I_setShape, // Probably, see PEPSIEW::gotHit
- 0, // ? Item::I_touch, void Intrinsic025(4 bytes)
+ Item::I_touch,
Item::I_getQHi, // int16 Intrinsic026(Item *), // guess, based on variable name in BOUNCBOX::gotHit
0, // int Intrinsic027(14 bytes)
- 0, // int Intrinsic028(12 bytes)
+ Item::I_hurl, // int Intrinsic028(12 bytes)
0, // int Intrinsic029(void)
AudioProcess::I_playAmbientSFXCru, // Confirmed!
Item::I_getQLo, // int16 Intrinsic02B(4 bytes), // guess, based on variable name in BOUNCBOX::gotHit
Item::I_inFastArea, // byte Intrinsic02C(4 bytes) // based on disassembly - checks for flag 0x2000
- Item::I_setQHi, // ? Item::I_setQHi, void Intrinsic02D(6 bytes) -- see usage in FREE::ordinal2E where object position is also copied
- 0, // byte Intrinsic02E(12 bytes)
+ Item::I_setQHi,
+ Item::I_legalMoveToPoint, // byte Intrinsic02E(12 bytes)
0, // byte Intrinsic02F(10 bytes)
// 0x030
- 0, // ? Item::I_pop, void Intrinsic030(4 bytes)
- Item::I_andStatus, // void Intrinsic031(6 bytes)
+ Item::I_pop,
+ Item::I_andStatus,
0, // void Intrinsic032(12 bytes)
- 0, // int Intrinsic033(4 bytes)
- 0, // void Intrinsic034(8 bytes)
+ Actor::I_isBusy, // int Intrinsic033(4 bytes)
+ 0, // TODO: void Actor::I_getDir16(8 bytes)
0, // int Intrinsic035(4 bytes)
- 0, // void Intrinsic036(12 bytes)
+ Actor::I_doAnim, // void Intrinsic036(12 bytes)
0, // int Intrinsic037(4 bytes)
- 0, // void Intrinsic038(6 bytes)
- 0, // int Intrinsic039(4 bytes)
+ AudioProcess::I_stopSFXCru, // takes Item *, sndno (from disasm)
+ Actor::I_isDead, // int Intrinsic039(4 bytes)
0, // something with sound maybe? int Intrinsic03A(6 bytes)
- Item::I_setQLo, // probably setQLo, see usage in FREE::ordinal2E where object position is copied void Intrinsic03B(6 bytes)
- 0, // void Intrinsic03C(4 bytes)
- 0, // void Intrinsic03D(4 bytes)
+ Item::I_setQLo,
+ Item::I_getFamily,
+ Container::I_destroyContents,
0, // void Intrinsic03E(4 bytes)
- 0, // void Intrinsic03F(4 bytes)
+ Egg::I_getEggId, // void Intrinsic03F(4 bytes)
// 0x040
- 0, // void Intrinsic040(8 bytes)
- 0, // void Intrinsic041(2 bytes)
+ CameraProcess::I_move_to, // void Intrinsic040(8 bytes)
+ CameraProcess::I_setCenterOn, // void Intrinsic041(2 bytes)
0, // int Intrinsic042(6 bytes)
0, // void Intrinsic043(6 bytes) // maybe stopSFX (based on coff)
- 0, // int Intrinsic044(6 bytes)
+ Item::I_isOn,
Item::I_getQHi, // based on same coff set as 026
- 0, // int Intrinsic046(6 bytes)
+ Item::I_isOn,
Item::I_getQHi, // based on same coff set as 026
- 0, // int Intrinsic048(6 bytes)
+ Item::I_isOn,
Item::I_getQHi, // based on same coff set as 026
- 0, // int Intrinsic04A(6 bytes)
+ Item::I_isOn,
Item::I_getQHi, // based on same coff set as 026
- 0, // int Intrinsic04C(6 bytes)
+ Item::I_isOn,
Item::I_getQHi, // based on same coff set as 026
- 0, // int Intrinsic04E(6 bytes)
+ Item::I_isOn,
Item::I_getQHi, // based on same coff set as 026
// 0x050
0, // void Intrinsic050(4 bytes)
@@ -130,61 +130,61 @@ Intrinsic RemorseIntrinsics[] = {
0, // void Intrinsic057(4 bytes)
0, // ? Item::I_setFrame, int Intrinsic058(6 bytes)
Item::I_setFrame, // based on same coff as 002
- 0, // ? Item::I_legalCreateAtPoint, void Intrinsic05A(4 bytes)
+ Actor::I_getLastAnimSet, // void Intrinsic05A(4 bytes)
Item::I_legalCreateAtPoint, // probably. see PEPSIEW::use
Item::I_getPoint, // void Intrinsic05C(8 bytes)
0, // void Intrinsic05D(void)
0, // int16 Intrinsic05E(uint32, char *, int16 a, int16 b) // Play video (as texture? parameters like (150, 250, "MVA11A") and other mvas)
0, // void Intrinsic05F(void)
// 0x060
- 0, // void Intrinsic060(4 bytes)
- 0, // void Intrinsic061(8 bytes)
+ Actor::I_setDead, // void Intrinsic060(4 bytes)
+ Actor::I_create, // void Intrinsic061(8 bytes)
0, // void Intrinsic062(void)
- 0, // void Intrinsic063(12 bytes)
- 0, // ? Item::I_legalCreateAtCoords, void Intrinsic064(16 bytes)
- 0, // int Intrinsic065(4 bytes)
+ Actor::I_teleport, // void Intrinsic063(12 bytes)
+ Item::I_getFootpadData, // void Intrinsic064(16 bytes)
+ 0, // TODO: Item::I_isInNPC
Item::I_getQLo, // based on same coff set as 02B
Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
Item::I_setNpcNum, // void Item::I_setSomething068(Item *, int16 something) , see VALUEBOX:ordinal20
Item::I_andStatus, // void Intrinsic069(6 bytes)
- 0, // void Intrinsic06A(10 bytes)
+ Item::I_move, // void Intrinsic06A(10 bytes)
0, // int16 Intrinsic06B(void)
0, // void Intrinsic06C(4 bytes)
Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
Item::I_andStatus, // void Intrinsic06E(6 bytes)
- 0, // int Intrinsic06F(6 bytes)
+ 0, // TODO: Item::I_isCompletelyOn int Intrinsic06F(6 bytes)
// 0x070
0, // int Intrinsic070(void)
0, // void Intrinsic071(void)
0, // void Intrinsic072(void)
- 0, // void Intrinsic073(4 bytes)
+ Actor::I_setDead,
0, // void Intrinsic074(void)
0, // void Intrinsic075(void)
- 0, // void Intrinsic076(4 bytes)
+ AudioProcess::I_stopSFXCru, // takes Item *, from disasm
0, // ? Item::I_getQuality, void Intrinsic077(void)
0, // ? Item::I_setQuality, void Intrinsic078(void)
- 0, // ? Item::I_use, // different than U8's? void Intrinsic079(6 bytes)
+ MainActor::I_teleportToEgg, // different than U8's? void Intrinsic079(6 bytes)
0, // void Intrinsic07A(void)
- 0, // void Intrinsic07B(4 bytes)
+ Actor::I_clrImmortal, // based on disasm
0, // void Intrinsic07C(4 bytes) // I_getQIfSomething, see disassembly
0, // ? Item::I_getQLo, void Intrinsic07D(6 bytes)
- 0, // void Intrinsic07E(4 bytes)
- 0, // void Intrinsic07F(6 bytes)
+ Item::I_getQuality,
+ Item::I_setQuality,
// 0x080
- 0, // void Intrinsic080(4 bytes)
+ Item::I_use, // void Intrinsic080(4 bytes)
0, // void Intrinsic081(4 bytes)
0, // ? Item::I_getNpcNum, void Intrinsic082(4 bytes)
0, // void Intrinsic083(6 bytes)
Item::I_getQLo, // based on same coff set as 02B
- 0, // void Intrinsic085(4 bytes)
+ Actor::I_setImmortal, // void Intrinsic085(4 bytes)
0, // void Intrinsic086(void)
0, // void Intrinsic087(void)
Item::I_setMapArray, // maybe I_setNpcNum -- based on use for VALUEBOX (like getNPCNum is) and coff being right next to getNPCNum.. see VALUEBOX:ordinal20. Could also be I_setMapArray??
Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
0, // void Intrinsic08A(12 bytes)
- Item::I_enterFastArea, // void Intrinsic08B(4 bytes) - maybe.. based on disasm
+ Item::I_enterFastArea, // void Intrinsic08B(4 bytes)
0, // void Intrinsic08C(4 bytes)
- 0, // void Intrinsic08D(12 bytes)
+ Item::I_hurl, // void Intrinsic08D(12 bytes)
Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
0, // void Intrinsic08F(void)
// 0x090
@@ -194,7 +194,7 @@ Intrinsic RemorseIntrinsics[] = {
0, // void Intrinsic093(void)
0, // UNUSEDInt0094()
0, // int Intrinsic095(void) // get global - something about keyboard (by disasm)
- 0, // void Intrinsic096(4 bytes)
+ MainActor::I_teleportToEgg, // void Intrinsic096(4 bytes)
0, // void Intrinsic097(void)
0, // void Intrinsic098(void)
Item::I_andStatus, // void Intrinsic099(6 bytes)
@@ -205,15 +205,15 @@ Intrinsic RemorseIntrinsics[] = {
0, // void Intrinsic09E(4 bytes)
0, // void Intrinsic09F(10 bytes)
// 0x0A0
- 0, // void Intrinsic0A0(4 bytes)
+ Actor::I_setDead,
Item::I_getQLo, // based on same coff set as 02B
- 0, // void Intrinsic0A2(4 bytes)
- 0, // void Intrinsic0A3(6 bytes)
- 0, // int Intrinsic0A4(6 bytes)
- 0, // ? Item::I_getFamilyOfType, int Intrinsic0A5(6 bytes)
+ Item::I_getUnkEggType,
+ Egg::I_setEggXRange, // void Intrinsic0A3(6 bytes)
+ Item::I_overlaps,
+ Item::I_isOn,
0, // ? Item::I_getNpcNum, void Intrinsic0A6(void)
- 0, // ? Item::I_getQLo, void Intrinsic0A7(4 bytes)
- 0, // ? Item::I_getQHi, void Intrinsic0A8(4 bytes)
+ Egg::I_getEggXRange, // ? Item::I_getQLo, void Intrinsic0A7(4 bytes)
+ Actor::I_setDead,
0, // I_playFlic(char *) Intrinsic0A9(void)
AudioProcess::I_playSFX, // void Intrinsic0AA(2 bytes)
0, // ? Item::I_andStatus, int Intrinsic0AB(4 bytes)
@@ -222,32 +222,32 @@ Intrinsic RemorseIntrinsics[] = {
Item::I_getQLo, // based on same coff set as 02B
Item::I_getQHi, // based on same coff set as 026
// 0x0B0
- 0, // void Intrinsic0B0(6 bytes)
- 0, // void Intrinsic0B1(6 bytes)
+ Item::I_unequip, // void Intrinsic0B0(6 bytes)
+ Item::I_avatarStoleSomething, // void Intrinsic0B1(6 bytes)
Item::I_andStatus, // void Intrinsic0B2(6 bytes)
Ultima8Engine::I_getCurrentTimerTick, // int32 Intrinsic0B3(void), probably, see FREE::ordinal32
0, // void Intrinsic0B4(void)
- 0, // void Intrinsic0B5(6 bytes)
+ Item::I_equip, // void Intrinsic0B5(6 bytes)
0, // ? Item::I_getQHi, void Intrinsic0B6(void)
0, // ? Item::I_andStatus, void Intrinsic0B7(void)
0, // int Intrinsic0B8(4 bytes)
- 0, // ? Item::I_andStatus, void Intrinsic0B9(4 bytes)
- 0, // void Intrinsic0BA(6 bytes)
+ Actor::I_getLastAnimSet, // void Intrinsic0B9(4 bytes)
+ Item::I_setQuality,
0, // ? Item::I_andStatus, int Intrinsic0BB(8 bytes)
- 0, // int Intrinsic0BC(6 bytes)
- 0, // void Intrinsic0BD(12 bytes)
+ Item::I_isOn,
+ Item::I_hurl, // void Intrinsic0BD(12 bytes)
Item::I_getQHi, // based on same coff set as 026
Item::I_andStatus, // void Intrinsic0BF(6 bytes)
// 0x0C0
- 0, // void Intrinsic0C0(12 bytes)
+ Item::I_hurl, // void Intrinsic0C0(12 bytes)
Item::I_andStatus, // void Intrinsic0C1(6 bytes)
- 0, // void Intrinsic0C2(12 bytes)
+ Item::I_hurl, // void Intrinsic0C2(12 bytes)
Item::I_andStatus, // void Intrinsic0C3(6 bytes)
0, // void Intrinsic0C4(2 bytes)
- 0, // int Intrinsic0C5(6 bytes)
- 0, // void Intrinsic0C6(14 bytes)
- 0, // int Intrinsic0C7(6 bytes)
- 0, // void Intrinsic0C8(12 bytes)
+ Item::I_isOn,
+ SpriteProcess::I_createSprite, // void Intrinsic0C6(14 bytes)
+ Item::I_getDirFromItem, // int Intrinsic0C7(6 bytes)
+ Item::I_hurl, // void Intrinsic0C8(12 bytes)
Item::I_getQHi, // based on same coff set as 026
0, // int Intrinsic0CA(6 bytes)
0, // void Intrinsic0CB(2 bytes)
@@ -256,51 +256,51 @@ Intrinsic RemorseIntrinsics[] = {
0, // void Intrinsic0CE(void)
0, // void Intrinsic0CF(6 bytes)
// 0x0D0
- 0, // void Intrinsic0D0(4 bytes)
+ Item::I_use, // void Intrinsic0D0(4 bytes)
0, // 0D1 - I_StopAllSFX (unused so not implmeneted)
0, // void I_playFlic(int *item,char *flicname,word sizex,word sizey) // play flic
0, // UNUSEDInt00D3()
AudioProcess::I_playSFX, // void Intrinsic0D4(2 bytes)
- 0, // void Intrinsic0D5(4 bytes)
+ Item::I_use, // void Intrinsic0D5(4 bytes)
0, // int Intrinsic0D6(void)
- 0, // void Intrinsic0D7(4 bytes)
- 0, // void Intrinsic0D8(4 bytes)
+ Actor::I_getLastAnimSet, // void Intrinsic0D7(4 bytes)
+ Actor::I_setDead,
Item::I_getQLo, // based on same coff set as 02B
0, // void Intrinsic0DA(void)
0, // void Intrinsic0DB(6 bytes)
- 0, // int Intrinsic0DC(6 bytes)
+ Item::I_isOn,
0, // void Intrinsic0DD(4 bytes)
0, // void Intrinsic0DE(6 bytes)
- 0, // void Intrinsic0DF(6 bytes)
+ Actor::I_getEquip, // void Intrinsic0DF(6 bytes)
// 0x0E0
- 0, // void Intrinsic0E0(8 bytes)
+ Actor::I_setEquip, // void Intrinsic0E0(8 bytes)
0, // void Intrinsic0E1(4 bytes)
0, // ? Item::I_andStatus, void Intrinsic0E2(4 bytes)
0, // ? Item::I_getQLo, void Intrinsic0E3(4 bytes)
- 0, // void Intrinsic0E4(4 bytes)
+ Actor::I_getLastAnimSet, // void Intrinsic0E4(4 bytes)
0, // void Intrinsic0E5(6 bytes)
0, // ? Item::I_popToContainer, void Intrinsic0E6(6 bytes)
- 0, // void Intrinsic0E7(4 bytes)
- 0, // void Intrinsic0E8(6 bytes)
+ Actor::I_setDead,
+ Item::I_cast, // void Intrinsic0E8(6 bytes)
Item::I_andStatus, // void Intrinsic0E9(6 bytes)
Item::I_getQLo, // based on same coff set as 02B
0, // void Intrinsic0EB(void)
- 0, // ? Item::I_getQHi, void Intrinsic0EC(6 bytes)
- 0, // ? Item::I_getQ, void Intrinsic0ED(6 bytes)
+ Item::I_popToEnd,
+ Item::I_popToContainer,
0, // ? Item::I_setQ, void Intrinsic0EE(void)
0, // void Intrinsic0EF(4 bytes)
// 0x0F0
Item::I_getQHi, // based on same coff set as 026
- 0, // ? Item::I_getNpcNum, int Intrinsic0F1(6 bytes)
+ Item::I_isOn,
0, // void Intrinsic0F2(6 bytes)
Item::I_getQHi, // based on same coff set as 026
Item::I_getQ, // void Intrinsic0F4(4 bytes)
Item::I_setQ, // void Intrinsic0F5(6 bytes)
0, // void Intrinsic0F6(void)
- 0, // void Intrinsic0F7(12 bytes)
+ Item::I_hurl, // void Intrinsic0F7(12 bytes)
Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
- 0, // void Intrinsic0F9(12 bytes)
- 0, // FA = integer to string int Intrinsic0FA(6 bytes)
+ Item::I_hurl, // void Intrinsic0F9(12 bytes)
+ Item::I_isOn,
Item::I_getQHi, // based on same coff set as 026
Item::I_andStatus, // void Intrinsic0FC(6 bytes)
0, // ? Item::I_getNpcNum, int Intrinsic0FD(2 bytes)
@@ -327,44 +327,44 @@ Intrinsic RemorseIntrinsics[] = {
// 0x110
Item::I_andStatus, // void Intrinsic110(6 bytes)
Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
- 0, // ? Item::I_andStatus, byte Intrinsic112(4 bytes)
+ Actor::I_getDir, // byte Intrinsic112(4 bytes)
UCMachine::I_numToStr, // see VMAIL::func0A for example usage
Item::I_andStatus, // void Intrinsic114(6 bytes)
Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
0, // ? Item::I_getTypeFlag, byte Intrinsic116(14 bytes)
Item::I_andStatus, // ? Item::I_getNpcNum, void Intrinsic117(6 bytes)
- 0, // int16 Intrinsic118(12 bytes)
+ Item::I_hurl, // int16 Intrinsic118(12 bytes)
0, // void Intrinsic119(4 bytes)
Item::I_andStatus, // void Intrinsic11A(6 bytes)
0, // byte Intrinsic11B(6 bytes)
Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
- 0, // int16 Intrinsic11D(12 bytes)
+ Item::I_hurl, // int16 Intrinsic11D(12 bytes)
0, // int16 Intrinsic11E(4 bytes)
0, // ? Item::I_getNpcNum, byte Intrinsic11F(4 bytes)
// 0x120
0, // void Intrinsic120(4 bytes)
- 0, // int Intrinsic121(4 bytes)
- 0, // int Intrinsic122(4 bytes)
+ Actor::I_getDir, // int Intrinsic121(4 bytes)
+ Actor::I_isDead, // int Intrinsic122(4 bytes)
Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
- 0, // ? Item::I_andStatus, void Intrinsic124(4 bytes)
- 0, // ? Item::I_getNpcNum, void Intrinsic125(6 bytes)
+ Actor::I_getLastAnimSet, // void Intrinsic124(4 bytes)
+ Item::I_setQuality,
UCMachine::I_numToStr, // same as 113 based on same coff set 0FF, 113, 126
- 0, // int Intrinsic127(8 bytes)
+ Item::I_getDirToCoords, // int Intrinsic127(8 bytes)
Item::I_andStatus, // void Intrinsic128(6 bytes) // maybe Item::andStatus?? see ITEM::ordinal22
Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
0, // void Intrinsic12A(4 bytes)
0, // void Intrinsic12B(4 bytes)
- 0, // int Intrinsic12C(6 bytes)
- 0, // void Intrinsic12D(16 bytes)
- 0, // int Intrinsic12E(4 bytes)
+ Item::I_isOn,
+ Item::I_getFootpadData, // void Intrinsic12D(16 bytes)
+ Actor::I_isDead, // int Intrinsic12E(4 bytes)
0, // ? Item::I_getQHi, void Intrinsic12F(6 bytes)
// 0x130
- 0, // ? Item::I_andStatus, void Intrinsic130(4 bytes)
+ Actor::I_clrImmortal, // void Intrinsic130(4 bytes)
0, // void Intrinsic131(6 bytes)
Item::I_andStatus, // void Intrinsic132(6 bytes)
Item::I_getQHi, // based on same coff set as 026
0, // void Intrinsic134(2 bytes)
- 0, // void UNUSEDInt135()
+ Actor::I_setDead,
0, // void UNUSEDInt136()
0 // void UNUSEDInt137()
};
diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index e260c593d7..d8396f8bd4 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -1359,6 +1359,8 @@ uint32 Actor::I_setDead(const uint8 *args, unsigned int /*argsize*/) {
ARG_ACTOR_FROM_PTR(actor);
if (!actor) return 0;
+ // TODO: In crusader this function also sets flag 0x8000 on
+ // the actor. Do we need to do that here?
actor->setActorFlag(ACT_DEAD);
return 0;
diff --git a/engines/ultima/ultima8/world/actors/main_actor.cpp b/engines/ultima/ultima8/world/actors/main_actor.cpp
index 090bc1e80d..34fe442c3c 100644
--- a/engines/ultima/ultima8/world/actors/main_actor.cpp
+++ b/engines/ultima/ultima8/world/actors/main_actor.cpp
@@ -421,8 +421,19 @@ bool MainActor::loadData(Common::ReadStream *rs, uint32 version) {
return true;
}
-uint32 MainActor::I_teleportToEgg(const uint8 *args, unsigned int /*argsize*/) {
- ARG_UINT16(mapnum);
+uint32 MainActor::I_teleportToEgg(const uint8 *args, unsigned int argsize) {
+ uint16 mapnum;
+ if (argsize == 12) {
+ ARG_UINT16(map);
+ mapnum = map;
+ } else {
+ // TODO: Confirm this works right.
+ // Crusader teleport uses main actor map.
+ assert(argsize == 8);
+ MainActor *av = getMainActor();
+ mapnum = av->getMapNum();
+ }
+
ARG_UINT16(teleport_id);
ARG_UINT16(unknown); // 0/1
diff --git a/engines/ultima/ultima8/world/camera_process.cpp b/engines/ultima/ultima8/world/camera_process.cpp
index 406ff3cb13..02db2facaf 100644
--- a/engines/ultima/ultima8/world/camera_process.cpp
+++ b/engines/ultima/ultima8/world/camera_process.cpp
@@ -313,11 +313,13 @@ bool CameraProcess::loadData(Common::ReadStream *rs, uint32 version) {
}
// "Camera::move_to(uword, uword, ubyte, word)",
-uint32 CameraProcess::I_move_to(const uint8 *args, unsigned int /*argsize*/) {
+uint32 CameraProcess::I_move_to(const uint8 *args, unsigned int argsize) {
ARG_UINT16(x);
ARG_UINT16(y);
ARG_UINT8(z);
- ARG_SINT16(unk);
+ if (argsize > 6) {
+ ARG_SINT16(unk);
+ }
CameraProcess::SetCameraProcess(new CameraProcess(x, y, z));
return 0;
}
diff --git a/engines/ultima/ultima8/world/item.cpp b/engines/ultima/ultima8/world/item.cpp
index cea487764b..8c20e0e25b 100644
--- a/engines/ultima/ultima8/world/item.cpp
+++ b/engines/ultima/ultima8/world/item.cpp
@@ -1114,6 +1114,14 @@ uint32 Item::callUsecodeEvent_release() { // event 9
return callUsecodeEvent(9); // CONSTANT
}
+uint32 Item::callUsecodeEvent_equip() { // event A
+ return callUsecodeEvent(0xA); // CONSTANT
+}
+
+uint32 Item::callUsecodeEvent_unequip() { // event B
+ return callUsecodeEvent(0xB); // CONSTANT
+}
+
uint32 Item::callUsecodeEvent_combine() { // event C
return callUsecodeEvent(0xC); // CONSTANT
}
@@ -2253,6 +2261,19 @@ uint32 Item::I_gotHit(const uint8 *args, unsigned int /*argsize*/) {
return item->callUsecodeEvent_gotHit(hitter, unk);
}
+uint32 Item::I_equip(const uint8 *args, unsigned int /*argsize*/) {
+ ARG_ITEM_FROM_PTR(item);
+ if (!item) return 0;
+
+ return item->callUsecodeEvent_equip();
+}
+
+uint32 Item::I_unequip(const uint8 *args, unsigned int /*argsize*/) {
+ ARG_ITEM_FROM_PTR(item);
+ if (!item) return 0;
+
+ return item->callUsecodeEvent_unequip();
+}
uint32 Item::I_enterFastArea(const uint8 *args, unsigned int /*argsize*/) {
ARG_ITEM_FROM_PTR(item);
@@ -2261,6 +2282,28 @@ uint32 Item::I_enterFastArea(const uint8 *args, unsigned int /*argsize*/) {
return item->callUsecodeEvent_enterFastArea();
}
+uint32 Item::I_cast(const uint8 *args, unsigned int /*argsize*/) {
+ ARG_ITEM_FROM_PTR(item);
+ if (!item) return 0;
+ ARG_UINT16(arg);
+
+ return item->callUsecodeEvent_cast(arg);
+}
+
+uint32 Item::I_avatarStoleSomething(const uint8 *args, unsigned int /*argsize*/) {
+ ARG_ITEM_FROM_PTR(item);
+ if (!item) return 0;
+
+ // Check if dead to match original game behavior here..
+ Actor *actor = dynamic_cast<Actor *>(item);
+ if (!actor || actor->isDead())
+ return 0;
+
+ ARG_UINT16(arg);
+
+ return item->callUsecodeEvent_AvatarStoleSomething(arg);
+}
+
uint32 Item::I_ask(const uint8 *args, unsigned int /*argsize*/) {
ARG_NULL32(); // ARG_ITEM_FROM_PTR(item); // currently unused.
ARG_LIST(answers);
@@ -2392,6 +2435,8 @@ uint32 Item::I_getFootpadData(const uint8 *args, unsigned int /*argsize*/) {
ARG_UC_PTR(zptr);
if (!item) return 0;
+ // TODO: Data is packed differently in Crusader - check that this still works.
+
uint8 buf[2];
int32 x, y, z;
item->getFootpadData(x, y, z);
@@ -2615,7 +2660,7 @@ uint32 Item::I_move(const uint8 *args, unsigned int /*argsize*/) {
return 0;
}
-uint32 Item::I_legalMoveToPoint(const uint8 *args, unsigned int /*argsize*/) {
+uint32 Item::I_legalMoveToPoint(const uint8 *args, unsigned int argsize) {
ARG_ITEM_FROM_PTR(item);
ARG_WORLDPOINT(point);
ARG_UINT16(force); // 0/1
@@ -2691,6 +2736,8 @@ uint32 Item::I_getDirToCoords(const uint8 *args, unsigned int /*argsize*/) {
int32 ix, iy, iz;
item->getLocationAbsolute(ix, iy, iz);
+ // FIXME: Crusader directions have double value
+ // - does that make any difference here?
return Get_WorldDirection(y - iy, x - ix);
}
diff --git a/engines/ultima/ultima8/world/item.h b/engines/ultima/ultima8/world/item.h
index fd12c88ccf..aa02961970 100644
--- a/engines/ultima/ultima8/world/item.h
+++ b/engines/ultima/ultima8/world/item.h
@@ -388,6 +388,8 @@ public:
uint32 callUsecodeEvent_hatch(); // event 7
uint32 callUsecodeEvent_schedule(uint32 time); // event 8
uint32 callUsecodeEvent_release(); // event 9
+ uint32 callUsecodeEvent_equip(); // event A
+ uint32 callUsecodeEvent_unequip(); // event B
uint32 callUsecodeEvent_combine(); // event C
uint32 callUsecodeEvent_enterFastArea(); // event F
uint32 callUsecodeEvent_leaveFastArea(); // event 10
@@ -502,6 +504,7 @@ public:
INTRINSIC(I_use);
INTRINSIC(I_gotHit);
INTRINSIC(I_enterFastArea);
+ INTRINSIC(I_cast);
INTRINSIC(I_ask);
INTRINSIC(I_getSliderInput);
INTRINSIC(I_openGump);
@@ -536,6 +539,9 @@ public:
INTRINSIC(I_isCrusTypeNPC);
INTRINSIC(I_doSomethingAndSetUnkCruFlag);
INTRINSIC(I_inFastArea);
+ INTRINSIC(I_equip);
+ INTRINSIC(I_unequip);
+ INTRINSIC(I_avatarStoleSomething);
private:
uint32 _shape; // DO NOT modify this directly! Always use setShape()!
diff --git a/engines/ultima/ultima8/world/item_factory.cpp b/engines/ultima/ultima8/world/item_factory.cpp
index 4cb3d4f574..d7da73ced5 100644
--- a/engines/ultima/ultima8/world/item_factory.cpp
+++ b/engines/ultima/ultima8/world/item_factory.cpp
@@ -65,6 +65,9 @@ static Item *getItemForFamily(uint32 family) {
return new Egg();
case ShapeInfo::SF_MONSTEREGG:
+ // FIXME: For crusader, item family 7 is also treated like a container
+ // (it can have contents, and the contents can be destroyed.
+ // Is it not the same as monster egg?
return new MonsterEgg();
case ShapeInfo::SF_TELEPORTEGG:
Commit: f2832cc5b35aae6053e05ce6b73e993b15c8271a
https://github.com/scummvm/scummvm/commit/f2832cc5b35aae6053e05ce6b73e993b15c8271a
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-06-15T16:54:23+09:00
Commit Message:
ULTIMA8: More Crusader usecode decoding
Changed paths:
engines/ultima/ultima8/audio/audio_process.cpp
engines/ultima/ultima8/audio/audio_process.h
engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
engines/ultima/ultima8/games/game.cpp
engines/ultima/ultima8/games/game.h
engines/ultima/ultima8/graphics/shape_info.h
engines/ultima/ultima8/ultima8.cpp
engines/ultima/ultima8/ultima8.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/main_actor.cpp
engines/ultima/ultima8/world/actors/main_actor.h
diff --git a/engines/ultima/ultima8/audio/audio_process.cpp b/engines/ultima/ultima8/audio/audio_process.cpp
index eb497005ed..00408a563c 100644
--- a/engines/ultima/ultima8/audio/audio_process.cpp
+++ b/engines/ultima/ultima8/audio/audio_process.cpp
@@ -319,6 +319,16 @@ bool AudioProcess::isSFXPlaying(int sfxNum) {
return false;
}
+bool AudioProcess::isSFXPlayingForObject(int sfxNum, ObjId objId) {
+ Std::list<SampleInfo>::iterator it;
+ for (it = _sampleInfo.begin(); it != _sampleInfo.end(); ++it) {
+ if (it->_sfxNum == sfxNum && (objId == it->_objId))
+ return true;
+ }
+
+ return false;
+}
+
void AudioProcess::setVolumeSFX(int sfxNum, uint8 volume) {
AudioMixer *mixer = AudioMixer::get_instance();
@@ -561,6 +571,22 @@ uint32 AudioProcess::I_isSFXPlaying(const uint8 *args, unsigned int argsize) {
return 0;
}
+uint32 AudioProcess::I_isSFXPlayingForObject(const uint8 *args, unsigned int argsize) {
+ ARG_ITEM_FROM_PTR(item)
+ ARG_SINT16(sfxNum);
+
+ if (!item) {
+ warning("I_isSFXPlayingForObject: Couldn't get item");
+ } else {
+ AudioProcess *ap = AudioProcess::get_instance();
+ if (ap)
+ return ap->isSFXPlayingForObject(sfxNum, item->getObjId());
+ else
+ warning("I_isSFXPlayingForObject Error: No AudioProcess");
+ }
+ return 0;
+}
+
uint32 AudioProcess::I_setVolumeSFX(const uint8 *args, unsigned int /*argsize*/) {
// Sets volume for last played instances of sfxNum (???)
ARG_SINT16(sfxNum);
@@ -610,6 +636,14 @@ uint32 AudioProcess::I_stopSFXCru(const uint8 *args, unsigned int argsize) {
return 0;
}
+uint32 AudioProcess::I_stopAllSFX(const uint8 */*args*/, unsigned int /*argsize*/) {
+ AudioProcess *ap = AudioProcess::get_instance();
+ // Not *exactly* the same, but close enough for this intrinsic.
+ if (ap) ap->stopAllExceptSpeech();
+ else perr << "Error: No AudioProcess" << Std::endl;
+
+ return 0;
+}
} // End of namespace Ultima8
} // End of namespace Ultima
diff --git a/engines/ultima/ultima8/audio/audio_process.h b/engines/ultima/ultima8/audio/audio_process.h
index a839e9a38a..4f329674c5 100644
--- a/engines/ultima/ultima8/audio/audio_process.h
+++ b/engines/ultima/ultima8/audio/audio_process.h
@@ -79,9 +79,11 @@ public:
INTRINSIC(I_playSFXCru);
INTRINSIC(I_playAmbientSFXCru);
INTRINSIC(I_isSFXPlaying);
+ INTRINSIC(I_isSFXPlayingForObject);
INTRINSIC(I_setVolumeSFX);
INTRINSIC(I_stopSFX);
INTRINSIC(I_stopSFXCru);
+ INTRINSIC(I_stopAllSFX);
void run() override;
@@ -98,6 +100,7 @@ public:
//! stop sfx on object. set sfxNum = -1 to stop all for object.
void stopSFX(int sfxNum, ObjId objId);
bool isSFXPlaying(int sfxNum);
+ bool isSFXPlayingForObject(int sfxNum, ObjId objId);
void setVolumeSFX(int sfxNum, uint8 volume);
bool playSpeech(const Std::string &barked, int shapenum, ObjId objId,
diff --git a/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h b/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
index 0a471a3a1e..8f453518b3 100644
--- a/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
+++ b/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
@@ -175,7 +175,7 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"void Actor::I_teleport(12 bytes)", // based on disasm same as U8
"void Item::I_getFootpad(Item *, uint *, uint *, uint *)", // based on disasm. same coff as 12D
"byte Item::I_isInNPC(Item *)", // based on disasm - following parent containers, is one of them an NPC
- "int16 Item::I_getQLo(Item *)", // same as 02B based on same coff set 010, 02B, 066, 084, 0A1, 0AE, 0D9, 0EA
+ "int16 Item::I_getQLo(Item *)", // same as 02B based on same coff set 010, 02B, 066, 084, 0A1, 0AE, 0D9, 0EA
"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 Item::I_setNpcNum(Item *, uint16 npcnum)", // maybe, see EVENT::func0A or VALUEBOX::ordinal20.. right next to getNPCNum in coff (confirmed by disassembly)
"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
@@ -186,12 +186,12 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"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
"byte Item::I_isCompletelyOn(Item *, uint16 other)",
// 0070
- "byte Intrinsic070(void)",
- "void Intrinsic071(void)",
- "void Intrinsic072(void)",
+ "byte Ultima8Engine::I_getUnkCrusaderFlag(void)",
+ "void Ultima8Engine::I_setUnkCrusaderFlag(void)",
+ "void Ultima8Engine::I_setAvatarInStasis(void)",
"void Actor::I_setDead(4 bytes)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
- "void Intrinsic074(void)",
- "void Intrinsic075(void)",
+ "void Ultima8Engine::I_clrUnkCrusaderFlag(void)",
+ "void Ultima8Engine::I_clrAvatarInStasis(void)",
"void AudioProcess::I_stopSFX(Item *)",
"int16 Intrinsic077_Fade(void)", // something about fades
"void Intrinsic078(void)",
@@ -204,9 +204,9 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"void Item::I_setQuality(Item *, int)", // based on disassembly. same coff as 0BA, 125
// 0080
"int16 Item::I_use(Item *)", // same coff as 0D0, 0D5
- "int16 Intrinsic081(4 bytes)",
- "int16 I_GetNPCDataField0x57_082(Actor *)",
- "void I_SetNPCDataField0x57_083(Actor *, int)",
+ "int16 MainActor::I_getMaxEnergy(Actor *)",
+ "int16 Actor::I_getMana(Actor *)",
+ "void Actor::I_setMana(Actor *, int)",
"int16 Item::I_getQLo(Item *)", // same as 02B based on same coff set 010, 02B, 066, 084, 0A1, 0AE, 0D9, 0EA
"void Actor::I_setImmortal(Actor *)",
"int16 Intrinsic086(void)",
@@ -221,10 +221,10 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"void Intrinsic08F_Fade(void)", // something about fades
// 0090
"void Intrinsic090(void)",
- "void Intrinsic091(void)", // sets some global (cleared by 93)
+ "void I_setSomeMovieGlobal(void)", // sets some global (cleared by 93)
"void I_playFlic092(char *)", // same coff as 0A9
- "void Intrinsic093(void)", // clears som global (set by 91)
- "UNUSEDInt0094()",
+ "void I_clearSomeMovieGlobal(void)", // clears som global (set by 91)
+ "void Intrinsic094(void)",
"byte Intrinsic095(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 Intrinsic097(void)",
@@ -243,13 +243,13 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"void Egg::I_setEggXRange(Egg *, int)", // based on disasm
"byte Item::I_overlaps(Item *, uint16 unk)", // same disasm as U8
"byte Item::I_isOn(Item *, itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
- "int16 Intrinsic0A6(void)",
+ "int16 I_getAnimationsDiabled(void)", // From disasm. Not implemented, that's ok..
"int16 Egg::I_getEggXRange(Egg *)", // based on disasm
"void Actor::I_setDead(Actor *)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
"void I_playFlic0A9(char *)", // same coff as 092
"void I_playSFX(2 bytes)", // same coff as 0D4
"byte I_NPCGetField0x59Flag1_0AB(Actor *)",
- "int16 I_maybeGetFamilyOfType(2 bytes)", // per pentagram notes
+ "int16 I_maybeGetFamilyOfType_0AC(2 bytes)", // per pentagram notes
"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
"int16 Item::I_getQLo(Item *)", // same as 02B based on same coff set 010, 02B, 066, 084, 0A1, 0AE, 0D9, 0EA
"int16 Item::I_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
@@ -281,7 +281,7 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"byte Item::I_getDirFromItem(Item *, itemno)", // same disasm as U8
"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_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
- "byte I_NPCSomething_0CA(Actor *, int)",
+ "byte Actor::I_addHp(Actor *, int)",
"void Intrinsic0CB(2 bytes)",
"byte I_GetNPCDataField0x59Flag3_0CC(Actor *)",
"void I_NPCSetActivityProbably_0CD(Actor *, int)", // part of same coff set 055, 07D, 0CD, 0DB, 0F2, 131
@@ -289,9 +289,9 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"void Item::setQAndCallSomething(Item *, int16 q)", // based on disassembly
// 00D0
"int16 Item::I_use(Item *)", // same coff as 080, 0D5
- "UNUSEDInt00D1()", // I_StopAllSFX (unused so not implmeneted)
- "void Intrinsic0D2(int *item,char *flicname,word sizex,word sizey)", // play flic
- "UNUSEDInt00D3()",
+ "void AudioProcess:I_stopAllSFX(void)", // based on disasm.
+ "void I_playFlic0D2(int *item,char *flicname,word sizex,word sizey)", // play flic
+ "void Intrinsic0D3()",
"void I_playSFX(2 bytes)", // same coff as 0AA. Based on disasm.
"int16 Item::I_use(Item *)", // same coff as 080, 0D0
"byte Intrinsic0D6(void)",
@@ -367,7 +367,7 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"int16 Item::I_hurl(Item *,8 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
"void Item::I_DoSomethingAndSetStatusFlag0x8000(Item *)", // same coff as 08C, 12A
"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
- "byte Item::I_getSomeFlag(Item *, uint16 unk)",
+ "byte Item::I_getTypeFlag(Item *, uint16 shift)",
"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
"int16 Item::I_hurl(Item *,8 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
"int16 Intrinsic11E(Item *)", // same coff as 12B
@@ -388,7 +388,7 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"byte Item::I_isOn(Item *, itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
"void Item::I_getFootpadData(Item *, uint *, uint *, uint *)", // same coff as 064
"byte Actor::I_isDead(Item *)", // same coff as 122, 039
- "int16 Intrinsic12F(Item *, uint16 unk)",
+ "int16 Intrinsic12F(Item *, uint16 other_itemno)",
// 0130
"void Actor::I_clrImmortal(Actor *)", // same coff as 07B
"void I_NPCSetActivityProbably_131(Actor *, int)", // part of same coff set 055, 07D, 0CD, 0DB, 0F2, 131
diff --git a/engines/ultima/ultima8/games/game.cpp b/engines/ultima/ultima8/games/game.cpp
index ea2e168867..b52c417245 100644
--- a/engines/ultima/ultima8/games/game.cpp
+++ b/engines/ultima/ultima8/games/game.cpp
@@ -79,5 +79,16 @@ uint32 Game::I_playEndgame(const uint8 *args, unsigned int /*argsize*/) {
return 0;
}
+uint32 Game::I_playCredits(const uint8 *args, unsigned int /*argsize*/) {
+ perr << "TODO: Implement I_playCredits";
+ // TODO: need a process to wait for here.
+ // Should fade out, credits, fade in.
+ // Double-check in the disasm that this should just play credits and
+ // not also endgame movie.
+ // Game::get_instance()->playCredits();
+
+ return 0;
+}
+
} // End of namespace Ultima8
} // End of namespace Ultima
diff --git a/engines/ultima/ultima8/games/game.h b/engines/ultima/ultima8/games/game.h
index 19f3b4b49c..e29166d5ee 100644
--- a/engines/ultima/ultima8/games/game.h
+++ b/engines/ultima/ultima8/games/game.h
@@ -58,6 +58,7 @@ public:
static Game *createGame(const GameInfo *info);
INTRINSIC(I_playEndgame);
+ INTRINSIC(I_playCredits);
protected:
static Game *_game;
diff --git a/engines/ultima/ultima8/graphics/shape_info.h b/engines/ultima/ultima8/graphics/shape_info.h
index bca7eac9be..73e2ec27df 100644
--- a/engines/ultima/ultima8/graphics/shape_info.h
+++ b/engines/ultima/ultima8/graphics/shape_info.h
@@ -69,7 +69,7 @@ public:
SF_MONSTEREGG = 7,
SF_TELEPORTEGG = 8,
SF_REAGENT = 9,
- SF_10 = 10, // ?? Used in Crusader
+ SF_10 = 10, // Used in Crusader .. weapon?
SF_11 = 11, // ?? Used in Crusader
SF_12 = 12, // ?? Used in Crusader
SF_13 = 13, // ?? Used in Crusader
diff --git a/engines/ultima/ultima8/ultima8.cpp b/engines/ultima/ultima8/ultima8.cpp
index a135e432e4..b1ca9b3719 100644
--- a/engines/ultima/ultima8/ultima8.cpp
+++ b/engines/ultima/ultima8/ultima8.cpp
@@ -139,7 +139,8 @@ Ultima8Engine::Ultima8Engine(OSystem *syst, const Ultima::UltimaGameDescription
_avatarInStasis(false), _paintEditorItems(false), _inversion(0), _painting(false),
_showTouching(false), _timeOffset(0), _hasCheated(false), _cheatsEnabled(false),
_ttfOverrides(false), _audioMixer(0), _scalerGump(nullptr),
- _inverterGump(nullptr), _lerpFactor(256), _inBetweenFrame(false), _alertActive(false) {
+ _inverterGump(nullptr), _lerpFactor(256), _inBetweenFrame(false), _alertActive(false),
+ _unkCrusaderFlag(false) {
_application = this;
}
@@ -1404,9 +1405,19 @@ uint32 Ultima8Engine::I_getCurrentTimerTick(const uint8 * /*args*/,
return Kernel::get_instance()->getFrameNum() * 2;
}
-uint32 Ultima8Engine::I_setAvatarInStasis(const uint8 *args, unsigned int /*argsize*/) {
- ARG_SINT16(stasis);
- get_instance()->setAvatarInStasis(stasis != 0);
+uint32 Ultima8Engine::I_setAvatarInStasis(const uint8 *args, unsigned int argsize) {
+ if (argsize) {
+ ARG_SINT16(stasis);
+ get_instance()->setAvatarInStasis(stasis != 0);
+ } else {
+ // TODO: this is for crusader - does it have the same meaning?
+ get_instance()->setAvatarInStasis(true);
+ }
+ return 0;
+}
+
+uint32 Ultima8Engine::I_clrAvatarInStasis(const uint8 *args, unsigned int argsize) {
+ get_instance()->setAvatarInStasis(false);
return 0;
}
@@ -1428,6 +1439,23 @@ uint32 Ultima8Engine::I_getAlertActive(const uint8 * /*args*/,
return get_instance()->isAlertActive() ? 1 : 0;
}
+uint32 Ultima8Engine::I_getUnkCrusaderFlag(const uint8 * /*args*/,
+ unsigned int /*argsize*/) {
+ return get_instance()->isUnkCrusaderFlag() ? 1 : 0;
+}
+
+uint32 Ultima8Engine::I_setUnkCrusaderFlag(const uint8 * /*args*/,
+ unsigned int /*argsize*/) {
+ get_instance()->setUnkCrusaderFlag(true);
+ return 0;
+}
+
+uint32 Ultima8Engine::I_clrUnkCrusaderFlag(const uint8 * /*args*/,
+ unsigned int /*argsize*/) {
+ get_instance()->setUnkCrusaderFlag(false);
+ return 0;
+}
+
uint32 Ultima8Engine::I_getTimeInMinutes(const uint8 * /*args*/,
unsigned int /*argsize*/) {
// 60 seconds per minute
diff --git a/engines/ultima/ultima8/ultima8.h b/engines/ultima/ultima8/ultima8.h
index 8e125dbe27..8f95972e4e 100644
--- a/engines/ultima/ultima8/ultima8.h
+++ b/engines/ultima/ultima8/ultima8.h
@@ -122,6 +122,7 @@ private:
bool _cheatsEnabled;
unsigned int _inversion;
bool _alertActive; //!< is intruder alert active (Crusader)
+ bool _unkCrusaderFlag; //!< not sure what this is but it's only used in usecode for crusader, so just keep track of it..
private:
/**
* Does engine deinitialization
@@ -213,12 +214,16 @@ public:
INTRINSIC(I_getCurrentTimerTick);
INTRINSIC(I_setAvatarInStasis);
+ INTRINSIC(I_clrAvatarInStasis);
INTRINSIC(I_getAvatarInStasis);
INTRINSIC(I_getTimeInGameHours);
INTRINSIC(I_getTimeInMinutes);
INTRINSIC(I_getTimeInSeconds);
INTRINSIC(I_setTimeInGameHours);
INTRINSIC(I_avatarCanCheat);
+ INTRINSIC(I_getUnkCrusaderFlag);
+ INTRINSIC(I_setUnkCrusaderFlag);
+ INTRINSIC(I_clrUnkCrusaderFlag);
INTRINSIC(I_makeAvatarACheater);
INTRINSIC(I_closeItemGumps);
INTRINSIC(I_getAlertActive); // for Crusader
@@ -252,6 +257,13 @@ public:
_alertActive = active;
}
+ bool isUnkCrusaderFlag() const {
+ return _unkCrusaderFlag;
+ }
+ void setUnkCrusaderFlag(bool flag) {
+ _unkCrusaderFlag = flag;
+ }
+
uint32 getGameTimeInSeconds();
GameMapGump *getGameMapGump() {
diff --git a/engines/ultima/ultima8/usecode/remorse_intrinsics.h b/engines/ultima/ultima8/usecode/remorse_intrinsics.h
index 9dec77caf2..3dbfa436dc 100644
--- a/engines/ultima/ultima8/usecode/remorse_intrinsics.h
+++ b/engines/ultima/ultima8/usecode/remorse_intrinsics.h
@@ -36,7 +36,7 @@ namespace Ultima8 {
Intrinsic RemorseIntrinsics[] = {
// 0x000
Ultima8Engine::I_getAlertActive, // basically confirmed.. see eg, ALARM_NS::enterFastArea - set frame for alert siren based on value.
- Item::I_getFrame, // ? int Intrinsic001(4 bytes)
+ Item::I_getFrame, // int Intrinsic001(4 bytes)
Item::I_setFrame, // basically confirmed..
Item::I_getMapArray, // See TRIGGER::ordinal21 - stored in a variable 'mapNum'
Item::I_getStatus, // probably - see usage in GATGUNEW::enterFastArea - always followed by an AND against a single bit
@@ -106,7 +106,7 @@ Intrinsic RemorseIntrinsics[] = {
CameraProcess::I_move_to, // void Intrinsic040(8 bytes)
CameraProcess::I_setCenterOn, // void Intrinsic041(2 bytes)
0, // int Intrinsic042(6 bytes)
- 0, // void Intrinsic043(6 bytes) // maybe stopSFX (based on coff)
+ AudioProcess::I_isSFXPlaying, // void Intrinsic043(6 bytes) // maybe isPlaying (based on coff)
Item::I_isOn,
Item::I_getQHi, // based on same coff set as 026
Item::I_isOn,
@@ -128,7 +128,7 @@ Intrinsic RemorseIntrinsics[] = {
0, // void Intrinsic055(6 bytes)
0, // void Intrinsic056(2 bytes)
0, // void Intrinsic057(4 bytes)
- 0, // ? Item::I_setFrame, int Intrinsic058(6 bytes)
+ 0, // int Intrinsic058(6 bytes)
Item::I_setFrame, // based on same coff as 002
Actor::I_getLastAnimSet, // void Intrinsic05A(4 bytes)
Item::I_legalCreateAtPoint, // probably. see PEPSIEW::use
@@ -154,27 +154,27 @@ Intrinsic RemorseIntrinsics[] = {
Item::I_andStatus, // void Intrinsic06E(6 bytes)
0, // TODO: Item::I_isCompletelyOn int Intrinsic06F(6 bytes)
// 0x070
- 0, // int Intrinsic070(void)
- 0, // void Intrinsic071(void)
- 0, // void Intrinsic072(void)
+ Ultima8Engine::I_getUnkCrusaderFlag, // int Intrinsic070(void)
+ Ultima8Engine::I_setUnkCrusaderFlag, // void Intrinsic071(void)
+ Ultima8Engine::I_setAvatarInStasis,
Actor::I_setDead,
- 0, // void Intrinsic074(void)
- 0, // void Intrinsic075(void)
+ Ultima8Engine::I_clrUnkCrusaderFlag, // void Intrinsic074(void)
+ Ultima8Engine::I_clrAvatarInStasis,
AudioProcess::I_stopSFXCru, // takes Item *, from disasm
- 0, // ? Item::I_getQuality, void Intrinsic077(void)
- 0, // ? Item::I_setQuality, void Intrinsic078(void)
+ 0, // void Intrinsic077(void)
+ 0, // void Intrinsic078(void)
MainActor::I_teleportToEgg, // different than U8's? void Intrinsic079(6 bytes)
0, // void Intrinsic07A(void)
Actor::I_clrImmortal, // based on disasm
0, // void Intrinsic07C(4 bytes) // I_getQIfSomething, see disassembly
- 0, // ? Item::I_getQLo, void Intrinsic07D(6 bytes)
+ 0, // void Intrinsic07D(6 bytes)
Item::I_getQuality,
Item::I_setQuality,
// 0x080
Item::I_use, // void Intrinsic080(4 bytes)
- 0, // void Intrinsic081(4 bytes)
- 0, // ? Item::I_getNpcNum, void Intrinsic082(4 bytes)
- 0, // void Intrinsic083(6 bytes)
+ MainActor::I_getMaxEnergy, // void Intrinsic081(4 bytes)
+ Actor::I_getMana, // Actually energy, but map to mana as we don't need that in Crusader.
+ Actor::I_setMana, //
Item::I_getQLo, // based on same coff set as 02B
Actor::I_setImmortal, // void Intrinsic085(4 bytes)
0, // void Intrinsic086(void)
@@ -192,14 +192,14 @@ Intrinsic RemorseIntrinsics[] = {
0, // void Intrinsic091(void)
0, // I_playFlic(char *)? void Intrinsic092(void)
0, // void Intrinsic093(void)
- 0, // UNUSEDInt0094()
+ Game::I_playCredits,
0, // int Intrinsic095(void) // get global - something about keyboard (by disasm)
MainActor::I_teleportToEgg, // void Intrinsic096(4 bytes)
0, // void Intrinsic097(void)
0, // void Intrinsic098(void)
Item::I_andStatus, // void Intrinsic099(6 bytes)
- 0, // ? Item::I_getQLo, void Intrinsic09A(void)
- 0, // ? Item::I_getUnkEggType, void Intrinsic09B(2 bytes)
+ 0, // void Intrinsic09A(void)
+ 0, // void Intrinsic09B(2 bytes)
0, // void Intrinsic09C(4 bytes)
0, // void Intrinsic09D(2 bytes)
0, // void Intrinsic09E(4 bytes)
@@ -211,13 +211,13 @@ Intrinsic RemorseIntrinsics[] = {
Egg::I_setEggXRange, // void Intrinsic0A3(6 bytes)
Item::I_overlaps,
Item::I_isOn,
- 0, // ? Item::I_getNpcNum, void Intrinsic0A6(void)
- Egg::I_getEggXRange, // ? Item::I_getQLo, void Intrinsic0A7(4 bytes)
+ 0, // ? TODO: I_getAnimationsDiabled -> default to 0 (it's fine..)
+ Egg::I_getEggXRange, // void Intrinsic0A7(4 bytes)
Actor::I_setDead,
0, // I_playFlic(char *) Intrinsic0A9(void)
AudioProcess::I_playSFX, // void Intrinsic0AA(2 bytes)
- 0, // ? Item::I_andStatus, int Intrinsic0AB(4 bytes)
- 0, // ? Ultima8Engine::I_getCurrentTimerTick, void Intrinsic0AC(2 bytes)
+ 0, // int Intrinsic0AB(4 bytes)
+ 0, // void Intrinsic0AC(2 bytes)
Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
Item::I_getQLo, // based on same coff set as 02B
Item::I_getQHi, // based on same coff set as 026
@@ -228,12 +228,12 @@ Intrinsic RemorseIntrinsics[] = {
Ultima8Engine::I_getCurrentTimerTick, // int32 Intrinsic0B3(void), probably, see FREE::ordinal32
0, // void Intrinsic0B4(void)
Item::I_equip, // void Intrinsic0B5(6 bytes)
- 0, // ? Item::I_getQHi, void Intrinsic0B6(void)
- 0, // ? Item::I_andStatus, void Intrinsic0B7(void)
+ 0, // void Intrinsic0B6(void)
+ 0, // void Intrinsic0B7(void)
0, // int Intrinsic0B8(4 bytes)
Actor::I_getLastAnimSet, // void Intrinsic0B9(4 bytes)
Item::I_setQuality,
- 0, // ? Item::I_andStatus, int Intrinsic0BB(8 bytes)
+ 0, // int Intrinsic0BB(8 bytes)
Item::I_isOn,
Item::I_hurl, // void Intrinsic0BD(12 bytes)
Item::I_getQHi, // based on same coff set as 026
@@ -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
- 0, // int Intrinsic0CA(6 bytes)
+ Actor::I_setHp, // int Intrinsic0CA(6 bytes)
0, // void Intrinsic0CB(2 bytes)
0, // int Intrinsic0CC(4 bytes)
0, // void Intrinsic0CD(6 bytes)
@@ -257,7 +257,7 @@ Intrinsic RemorseIntrinsics[] = {
0, // void Intrinsic0CF(6 bytes)
// 0x0D0
Item::I_use, // void Intrinsic0D0(4 bytes)
- 0, // 0D1 - I_StopAllSFX (unused so not implmeneted)
+ AudioProcess::I_stopAllSFX,
0, // void I_playFlic(int *item,char *flicname,word sizex,word sizey) // play flic
0, // UNUSEDInt00D3()
AudioProcess::I_playSFX, // void Intrinsic0D4(2 bytes)
@@ -275,11 +275,11 @@ Intrinsic RemorseIntrinsics[] = {
// 0x0E0
Actor::I_setEquip, // void Intrinsic0E0(8 bytes)
0, // void Intrinsic0E1(4 bytes)
- 0, // ? Item::I_andStatus, void Intrinsic0E2(4 bytes)
- 0, // ? Item::I_getQLo, void Intrinsic0E3(4 bytes)
+ 0, // void Intrinsic0E2(4 bytes)
+ 0, // void Intrinsic0E3(4 bytes)
Actor::I_getLastAnimSet, // void Intrinsic0E4(4 bytes)
0, // void Intrinsic0E5(6 bytes)
- 0, // ? Item::I_popToContainer, void Intrinsic0E6(6 bytes)
+ 0, // void Intrinsic0E6(6 bytes)
Actor::I_setDead,
Item::I_cast, // void Intrinsic0E8(6 bytes)
Item::I_andStatus, // void Intrinsic0E9(6 bytes)
@@ -287,7 +287,7 @@ Intrinsic RemorseIntrinsics[] = {
0, // void Intrinsic0EB(void)
Item::I_popToEnd,
Item::I_popToContainer,
- 0, // ? Item::I_setQ, void Intrinsic0EE(void)
+ 0, // void Intrinsic0EE(void)
0, // void Intrinsic0EF(4 bytes)
// 0x0F0
Item::I_getQHi, // based on same coff set as 026
@@ -303,15 +303,14 @@ Intrinsic RemorseIntrinsics[] = {
Item::I_isOn,
Item::I_getQHi, // based on same coff set as 026
Item::I_andStatus, // void Intrinsic0FC(6 bytes)
- 0, // ? Item::I_getNpcNum, int Intrinsic0FD(2 bytes)
+ 0, // int Intrinsic0FD(2 bytes)
0, // void Intrinsic0FE(4 bytes)
UCMachine::I_numToStr, // same as 113 based on same coff set 0FF, 113, 126
// 0x100
Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
- Item::I_andStatus, // ? Item::I_getNpcNum, void Intrinsic101(6 bytes)
+ Item::I_andStatus, // void Intrinsic101(6 bytes)
Item::I_getNpcNum, // Based on variable name in TRIGGER::ordinal21
- 0, // ? Item::I_getNpcNum, // byte Intrinsic103(uint16 shapenum),
-
+ 0, // // byte Intrinsic103(uint16 shapenum)
Item::I_andStatus, // void Intrinsic104(6 bytes)
Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
Item::I_andStatus, // void Intrinsic106(6 bytes)
@@ -332,15 +331,15 @@ Intrinsic RemorseIntrinsics[] = {
Item::I_andStatus, // void Intrinsic114(6 bytes)
Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
0, // ? Item::I_getTypeFlag, byte Intrinsic116(14 bytes)
- Item::I_andStatus, // ? Item::I_getNpcNum, void Intrinsic117(6 bytes)
+ Item::I_andStatus, // void Intrinsic117(6 bytes)
Item::I_hurl, // int16 Intrinsic118(12 bytes)
0, // void Intrinsic119(4 bytes)
Item::I_andStatus, // void Intrinsic11A(6 bytes)
- 0, // byte Intrinsic11B(6 bytes)
+ Item::I_getTypeFlag, // byte Intrinsic11B(6 bytes)
Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
Item::I_hurl, // int16 Intrinsic11D(12 bytes)
0, // int16 Intrinsic11E(4 bytes)
- 0, // ? Item::I_getNpcNum, byte Intrinsic11F(4 bytes)
+ 0, // byte Intrinsic11F(4 bytes)
// 0x120
0, // void Intrinsic120(4 bytes)
Actor::I_getDir, // int Intrinsic121(4 bytes)
@@ -357,7 +356,7 @@ Intrinsic RemorseIntrinsics[] = {
Item::I_isOn,
Item::I_getFootpadData, // void Intrinsic12D(16 bytes)
Actor::I_isDead, // int Intrinsic12E(4 bytes)
- 0, // ? Item::I_getQHi, void Intrinsic12F(6 bytes)
+ 0, // void Intrinsic12F(6 bytes)
// 0x130
Actor::I_clrImmortal, // void Intrinsic130(4 bytes)
0, // void Intrinsic131(6 bytes)
diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index d8396f8bd4..3cacac59fe 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -24,6 +24,7 @@
#include "ultima/ultima8/world/actors/actor.h"
#include "ultima/ultima8/kernel/object_manager.h"
#include "ultima/ultima8/kernel/kernel.h"
+#include "ultima/ultima8/kernel/core_app.h"
#include "ultima/ultima8/usecode/uc_machine.h"
#include "ultima/ultima8/usecode/uc_list.h"
#include "ultima/ultima8/world/world.h"
@@ -1245,6 +1246,21 @@ uint32 Actor::I_setHp(const uint8 *args, unsigned int /*argsize*/) {
return 0;
}
+uint32 Actor::I_addHp(const uint8 *args, unsigned int /*argsize*/) {
+ ARG_ACTOR_FROM_PTR(actor);
+ ARG_UINT16(hp);
+
+ if (actor) {
+ int max = actor->getMaxHP();
+ int cur = actor->getHP();
+ if (cur < max) {
+ actor->setHP(MIN(max, cur + hp));
+ return 1;
+ }
+ }
+ return 0;
+}
+
uint32 Actor::I_setMana(const uint8 *args, unsigned int /*argsize*/) {
ARG_ACTOR_FROM_PTR(actor);
ARG_SINT16(mp);
diff --git a/engines/ultima/ultima8/world/actors/actor.h b/engines/ultima/ultima8/world/actors/actor.h
index 0c74e91f8e..90b89840d5 100644
--- a/engines/ultima/ultima8/world/actors/actor.h
+++ b/engines/ultima/ultima8/world/actors/actor.h
@@ -241,6 +241,7 @@ public:
INTRINSIC(I_setAlignment);
INTRINSIC(I_setEnemyAlignment);
INTRINSIC(I_getMap);
+ INTRINSIC(I_addHp);
INTRINSIC(I_teleport);
INTRINSIC(I_doAnim);
INTRINSIC(I_isInCombat);
diff --git a/engines/ultima/ultima8/world/actors/main_actor.cpp b/engines/ultima/ultima8/world/actors/main_actor.cpp
index 34fe442c3c..87a0a227d6 100644
--- a/engines/ultima/ultima8/world/actors/main_actor.cpp
+++ b/engines/ultima/ultima8/world/actors/main_actor.cpp
@@ -41,6 +41,7 @@
#include "ultima/ultima8/world/world.h"
#include "ultima/ultima8/world/get_object.h"
#include "ultima/ultima8/usecode/uc_list.h"
+#include "ultima/ultima8/usecode/uc_machine.h"
#include "ultima/ultima8/world/loop_script.h"
#include "ultima/ultima8/world/actors/avatar_gravity_process.h"
#include "ultima/ultima8/audio/music_process.h"
@@ -52,7 +53,7 @@ namespace Ultima8 {
DEFINE_RUNTIME_CLASSTYPE_CODE(MainActor)
MainActor::MainActor() : _justTeleported(false), _accumStr(0), _accumDex(0),
- _accumInt(0) {
+ _accumInt(0), _cruBatteryType(ChemicalBattery) {
}
MainActor::~MainActor() {
@@ -391,6 +392,19 @@ void MainActor::getWeaponOverlay(const WeaponOverlayFrame *&frame_, uint32 &shap
if (frame_ == 0) shape_ = 0;
}
+int16 MainActor::getMaxEnergy() {
+ switch (_cruBatteryType) {
+ case ChemicalBattery:
+ return 0x9c4; // docs say 2500, code says otherwise..
+ case FissionBattery:
+ return 5000;
+ case FusionBattery:
+ return 10000;
+ default:
+ return 0;
+ }
+}
+
void MainActor::saveData(Common::WriteStream *ws) {
Actor::saveData(ws);
uint8 jt = _justTeleported ? 1 : 0;
@@ -493,6 +507,16 @@ uint32 MainActor::I_isAvatarInCombat(const uint8 * /*args*/,
return 0;
}
+uint32 MainActor::I_getMaxEnergy(const uint8 *args,
+ unsigned int /*argsize*/) {
+ ARG_ACTOR_FROM_PTR(actor);
+ MainActor *av = getMainActor();
+ if (actor != av) {
+ return 0;
+ }
+ return av->getMaxEnergy();
+}
+
void MainActor::useInventoryItem(uint32 shapenum) {
if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
pout << "Can't use item: avatarInStasis" << Std::endl;
diff --git a/engines/ultima/ultima8/world/actors/main_actor.h b/engines/ultima/ultima8/world/actors/main_actor.h
index 4035cb731d..ccc91a91c9 100644
--- a/engines/ultima/ultima8/world/actors/main_actor.h
+++ b/engines/ultima/ultima8/world/actors/main_actor.h
@@ -34,6 +34,13 @@ struct WeaponOverlayFrame;
class MainActor : public Actor {
friend class Debugger;
public:
+ enum CruBatteryType {
+ NoBattery = 0,
+ ChemicalBattery = 1,
+ FissionBattery = 2,
+ FusionBattery = 3
+ };
+
MainActor();
~MainActor() override;
@@ -90,6 +97,8 @@ public:
_name = name;
}
+ int16 getMaxEnergy();
+
bool loadData(Common::ReadStream *rs, uint32 version);
void saveData(Common::WriteStream *ws) override;
@@ -102,6 +111,7 @@ public:
INTRINSIC(I_clrAvatarInCombat);
INTRINSIC(I_setAvatarInCombat);
INTRINSIC(I_isAvatarInCombat);
+ INTRINSIC(I_getMaxEnergy);
void getWeaponOverlay(const WeaponOverlayFrame *&frame_, uint32 &shape_);
@@ -115,6 +125,8 @@ protected:
int _accumDex;
int _accumInt;
+ CruBatteryType _cruBatteryType;
+
Std::string _name;
};
Commit: da4adbb1d3ad1c2ff5acee04109403ff6e949b7c
https://github.com/scummvm/scummvm/commit/da4adbb1d3ad1c2ff5acee04109403ff6e949b7c
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-06-15T17:03:00+09:00
Commit Message:
ULTIMA8: More Crusader intrinsics supported
Changed paths:
engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
engines/ultima/ultima8/games/remorse_game.cpp
engines/ultima/ultima8/games/start_crusader_process.cpp
engines/ultima/ultima8/graphics/shape_info.h
engines/ultima/ultima8/usecode/remorse_intrinsics.h
engines/ultima/ultima8/usecode/uc_machine.cpp
engines/ultima/ultima8/world/actors/actor.cpp
diff --git a/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h b/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
index 8f453518b3..2cee3110f5 100644
--- a/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
+++ b/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
@@ -110,7 +110,7 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"int16 Item::I_getQHi(Item *)", // guess, based on variable name in BOUNCBOX::gotHit
"int16 I_getDirectionSomething(x1, y1, x2, y2, numdirs, aa, bb)", // TODO: understand the decompile of this better.. what is it doing with aa and bb?
"int16 Item::I_hurl(Item *,8 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
- "int16 I_GetGlobal7e2d_029(void)",
+ "int16 Game::I_getDifficultyLevel(void)",
"void AudioProcess::I_playAmbientSFXCru(Item *, sndno)",
"int16 Item::I_getQLo(Item *)", // guess, based on variable name in BOUNCBOX::gotHit
"byte Item::I_inFastArea(Item *)",
@@ -120,15 +120,15 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
// 0030
"void Item::I_pop(Item *)", // same code as U8
"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 Intrinsic032(12 bytes)",
+ "void Item::I_receiveHit(Item *, other, dir, damage, damagetype)", // based on disasm
"byte Actor::I_isBusy(4 bytes)", // same code as U8
"int16 Actor::I_getDir16(x1, y1, x2, y2)",
"byte Actor::I_getSomeFlagMaybeCrouch(Item *)",
"int16 Actor::I_doAnim(12 bytes)", // v. similar code to U8
"byte Intrinsic037(4 bytes)", // same coff as 0B8
- "void AudioProcess::Intrinsic038(Item *, int16 sndno)",
+ "void AudioProcess::I_stopSFXCru(Item *, int16 sndno)",
"byte Actor::I_isDead(Item *)", // same coff as 122, 12E
- "byte AudioProcess::Intrinsic03A(Item *, int16 unk)",
+ "byte AudioProcess::I_isSFXPlayingForObject(Item *, int16 unk)",
"void Item::I_setQLo(Item *, int16 qlo)", // probably setQLo, see usage in FREE::ordinal2E where object position is copied. Disassembly confirms.
"int16 Item::I_getItemFamily(Item *)", // based on disasm
"void Container::I_destroyContents(Item *)",
@@ -138,7 +138,7 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"void CameraProcess::I_move_to(x, y, z)",
"void CameraProcess::I_setCenterOn(objid)",
"byte Intrinsic042(6 bytes)",
- "void AudioProcess::Intrinsic043(Item *, soundno)", // something with sound, probably Item *, soundno based on disassembly, maybe stopSFX?
+ "void AudioProcess::I_playSFXCru(Item *, soundno)", // TODO: Work out how this is different from Int015 - to a first approximation they are quite similar.
"byte Item::I_IsOn(Item *, uint16 itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
"int16 Item::I_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
"byte Item::I_IsOn(Item *, uint16 itemno))", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
@@ -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 Intrinsic05D(void)",
+ "void I_mouseSomethingOffMaybe05D(void)",
"int16 I_playFlicsomething(uint32, char *, int16 a, int16 b)", // Play video (as texture? parameters like (150, 250, "MVA11A") and other mvas)
- "void Intrinsic05F(void)",
+ "void I_mouseSomethingResume05F(void)",
// 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)",
@@ -180,8 +180,8 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"void Item::I_setNpcNum(Item *, uint16 npcnum)", // maybe, see EVENT::func0A or VALUEBOX::ordinal20.. right next to getNPCNum in coff (confirmed by disassembly)
"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 Item::I_move(Item *, int16 x, int16 y, uint16 z)",
- "int16 Intrinsic06B(void)",
- "void Intrinsic06C(sometimes Item *)", // TODO: when param not item, what is it?
+ "int16 Game::I_isViolenceEnabled(void)",
+ "void Kernel::I_resetRef(int16, int16)", // same disasm as U8
"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 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
"byte Item::I_isCompletelyOn(Item *, uint16 other)",
@@ -215,7 +215,7 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"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 Intrinsic08A(12 bytes)",
"int16 Item::I_enterFastArea(Item *)", // based on disasm, v similar to U8
- "void Item::I_DoSomethingAndSetStatusFlag0x8000(Item *)", // same coff as 119, 12A
+ "void Item::I_doSomethingAndSetStatusFlag0x8000(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 Intrinsic08F_Fade(void)", // something about fades
@@ -228,7 +228,7 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"byte Intrinsic095(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 Intrinsic097(void)",
- "void I_ProcessDeathSilence_098(void)",
+ "void I_resetVargasHealthTo500(void)",
"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 Intrinsic09A_Fade(void)", // something about fades
"int16 Intrinsic09B_Fade(2 bytes)", // something about fades
@@ -249,7 +249,7 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"void I_playFlic0A9(char *)", // same coff as 092
"void I_playSFX(2 bytes)", // same coff as 0D4
"byte I_NPCGetField0x59Flag1_0AB(Actor *)",
- "int16 I_maybeGetFamilyOfType_0AC(2 bytes)", // per pentagram notes
+ "int16 Item::I_getFamilyOfType(Item *)", // per pentagram notes, matches disasm.
"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
"int16 Item::I_getQLo(Item *)", // same as 02B based on same coff set 010, 02B, 066, 084, 0A1, 0AE, 0D9, 0EA
"int16 Item::I_getQHi(Item *)", // same as 026 based on same coff set 026, 045, 047, 049, 04B, 04D, 04F, 0AF, 0BE, 0C9, 0F0, 0F3, 0FB, 133
@@ -285,7 +285,7 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"void Intrinsic0CB(2 bytes)",
"byte I_GetNPCDataField0x59Flag3_0CC(Actor *)",
"void I_NPCSetActivityProbably_0CD(Actor *, int)", // part of same coff set 055, 07D, 0CD, 0DB, 0F2, 131
- "int16 Intrinsic0CE(void)",
+ "int16 Game::I_isReleaseBuild(void)", // whether the string "GAME COMPILE=1" has the 1. Might be interesting to see what this does..
"void Item::setQAndCallSomething(Item *, int16 q)", // based on disassembly
// 00D0
"int16 Item::I_use(Item *)", // same coff as 080, 0D5
@@ -342,7 +342,7 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"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 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
"int16 Item::I_getNPCNum(Item *)", // Based on variable name in TRIGGER::ordinal21. Part of same coff set 067, 06D, 089, 08E, 0AD, 0F8, 100, 102, 105, 107, 109, 10B, 10D, 10F, 111, 115, 11C, 123, 129
- "byte Intrinsic103(uint16 shapenum)",
+ "byte Item::I_isCrusTypeNPC(uint16 shapenum)",
"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
"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 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
@@ -365,15 +365,15 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"byte Intrinsic116(14 bytes)",
"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
"int16 Item::I_hurl(Item *,8 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
- "void Item::I_DoSomethingAndSetStatusFlag0x8000(Item *)", // same coff as 08C, 12A
+ "void Item::I_doSomethingAndSetStatusFlag0x8000(Item *)", // same coff as 08C, 12A
"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
"byte Item::I_getTypeFlag(Item *, uint16 shift)",
"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
"int16 Item::I_hurl(Item *,8 bytes)", // part of same coff set 028, 08D, 0BD, 0C0, 0C2, 0C8, 0F7, 0F9, 118, 11D
- "int16 Intrinsic11E(Item *)", // same coff as 12B
- "byte Intrinsic11F(Item *)",
+ "int16 Item::I_getCY(Item *)", // same coff as 12B
+ "byte Item::I_getCZ(Item *)", // based on disasm
// 0120
- "int16 Intrinsic120(Item *)",
+ "int16 Item::I_getCX(Item *)",
"byte Actor::I_getDir(4 bytes)", // same coff as 01C, 112
"byte Actor::I_isDead(Item *)", // same coff as 12E, 039
"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
@@ -383,8 +383,8 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
"byte Item::I_getDirToCoords(Item *, uin16 x, uint16 y)", // based on disassembly - FIXME: returns 2* values from U8
"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
"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 Item::I_DoSomethingAndSetStatusFlag0x8000(Item *)", // same coff as 08C, 119
- "int16 Intrinsic12B(Item *)", // same coff as 11E
+ "void Item::I_doSomethingAndSetStatusFlag0x8000(Item *)", // same coff as 08C, 119
+ "int16 IItem::I_getCY(Item *)", // same coff as 11E
"byte Item::I_isOn(Item *, itemno)", // part of same coff set 044, 046, 048, 04A, 04C, 04E, 0A5, 0BC, 0C5, 0DC, 0F1, 0FA, 12C
"void Item::I_getFootpadData(Item *, uint *, uint *, uint *)", // same coff as 064
"byte Actor::I_isDead(Item *)", // same coff as 122, 039
diff --git a/engines/ultima/ultima8/games/remorse_game.cpp b/engines/ultima/ultima8/games/remorse_game.cpp
index dfa4fd8f2f..9dfd65623c 100644
--- a/engines/ultima/ultima8/games/remorse_game.cpp
+++ b/engines/ultima/ultima8/games/remorse_game.cpp
@@ -113,6 +113,12 @@ bool RemorseGame::startGame() {
if (!actor)
error("Couldn't create MainActor");
+ // TODO: these should be read from DTable data.
+ actor->setStr(75);
+ actor->setHP(150);
+ actor->setInt(5000);
+ actor->setMana(2500);
+
ObjectManager::get_instance()->assignActorObjId(actor, 1);
if (GAME_IS_REMORSE) {
diff --git a/engines/ultima/ultima8/games/start_crusader_process.cpp b/engines/ultima/ultima8/games/start_crusader_process.cpp
index f27e302d7b..55f90a9978 100644
--- a/engines/ultima/ultima8/games/start_crusader_process.cpp
+++ b/engines/ultima/ultima8/games/start_crusader_process.cpp
@@ -88,7 +88,8 @@ void StartCrusaderProcess::run() {
if (!_skipStart) {
// TODO: Find the first MISS1EGG egg like in U8 - should teleport in
- // Maybe just teleport straight to Item 9115 (class TeleportEgg, shape 404, 1, (60656,59312,16) q:99, m:0, n:0, f: 0x2000, ef:0x3 shapeinfo f:1009, fam:8, et:0)
+ // Game starts a teleport process to Egg 0x1e:
+ // Item 9115 (class TeleportEgg, shape 404, 1, (60656,59312,16) q:99, m:0, n:0, f: 0x2000, ef:0x3 shapeinfo f:1009, fam:8, et:0)
/*
LOOPSCRIPT(script, LS_AND(LS_SHAPE_EQUAL1(73), LS_Q_EQUAL(36)));
currentmap->areaSearch(&uclist, script, sizeof(script),
diff --git a/engines/ultima/ultima8/graphics/shape_info.h b/engines/ultima/ultima8/graphics/shape_info.h
index 73e2ec27df..b03c4b0f2b 100644
--- a/engines/ultima/ultima8/graphics/shape_info.h
+++ b/engines/ultima/ultima8/graphics/shape_info.h
@@ -70,7 +70,7 @@ public:
SF_TELEPORTEGG = 8,
SF_REAGENT = 9,
SF_10 = 10, // Used in Crusader .. weapon?
- SF_11 = 11, // ?? Used in Crusader
+ SF_11 = 11, // Used in Crusader .. inventory item?
SF_12 = 12, // ?? Used in Crusader
SF_13 = 13, // ?? Used in Crusader
SF_15 = 15
diff --git a/engines/ultima/ultima8/usecode/remorse_intrinsics.h b/engines/ultima/ultima8/usecode/remorse_intrinsics.h
index 3dbfa436dc..4063561c76 100644
--- a/engines/ultima/ultima8/usecode/remorse_intrinsics.h
+++ b/engines/ultima/ultima8/usecode/remorse_intrinsics.h
@@ -63,7 +63,7 @@ Intrinsic RemorseIntrinsics[] = {
UCMachine::I_rndRange, // int16 Intrinsic018(4 bytes) // probably.. always called with 2 constants, then result compared to some number between
Item::I_legalCreateAtCoords, // byte Intrinsic019(14 bytes), probably, see usage in DOOR2::ordinal37
Item::I_andStatus, // void Intrinsic01A(6 bytes)
- 0, // // different than U8's? int Intrinsic01B(void)
+ UCMachine::I_true, // FIXME: get the num of some npc - maybe currently controlled NPC? For now default to 1 (avatar).
Actor::I_getDir, // byte Intrinsic01C(4 bytes)
Actor::I_getLastAnimSet, // int Intrinsic01D(4 bytes)
0, // int Intrinsic01E(16 bytes)
@@ -78,7 +78,7 @@ Intrinsic RemorseIntrinsics[] = {
Item::I_getQHi, // int16 Intrinsic026(Item *), // guess, based on variable name in BOUNCBOX::gotHit
0, // int Intrinsic027(14 bytes)
Item::I_hurl, // int Intrinsic028(12 bytes)
- 0, // int Intrinsic029(void)
+ UCMachine::I_true, // TODO: This is actually game difficulty level. Make an intrinsic for that once it's implemented (for now return 1, easiest difficulty).
AudioProcess::I_playAmbientSFXCru, // Confirmed!
Item::I_getQLo, // int16 Intrinsic02B(4 bytes), // guess, based on variable name in BOUNCBOX::gotHit
Item::I_inFastArea, // byte Intrinsic02C(4 bytes) // based on disassembly - checks for flag 0x2000
@@ -88,7 +88,7 @@ Intrinsic RemorseIntrinsics[] = {
// 0x030
Item::I_pop,
Item::I_andStatus,
- 0, // void Intrinsic032(12 bytes)
+ Item::I_receiveHit, // void Intrinsic032(12 bytes)
Actor::I_isBusy, // int Intrinsic033(4 bytes)
0, // TODO: void Actor::I_getDir16(8 bytes)
0, // int Intrinsic035(4 bytes)
@@ -96,7 +96,7 @@ Intrinsic RemorseIntrinsics[] = {
0, // int Intrinsic037(4 bytes)
AudioProcess::I_stopSFXCru, // takes Item *, sndno (from disasm)
Actor::I_isDead, // int Intrinsic039(4 bytes)
- 0, // something with sound maybe? int Intrinsic03A(6 bytes)
+ AudioProcess::I_isSFXPlayingForObject,
Item::I_setQLo,
Item::I_getFamily,
Container::I_destroyContents,
@@ -106,7 +106,7 @@ Intrinsic RemorseIntrinsics[] = {
CameraProcess::I_move_to, // void Intrinsic040(8 bytes)
CameraProcess::I_setCenterOn, // void Intrinsic041(2 bytes)
0, // int Intrinsic042(6 bytes)
- AudioProcess::I_isSFXPlaying, // void Intrinsic043(6 bytes) // maybe isPlaying (based on coff)
+ AudioProcess::I_playSFXCru, // TODO: Work out how this is different from Int015 - to a first approximation they are quite similar.
Item::I_isOn,
Item::I_getQHi, // based on same coff set as 026
Item::I_isOn,
@@ -148,8 +148,8 @@ Intrinsic RemorseIntrinsics[] = {
Item::I_setNpcNum, // void Item::I_setSomething068(Item *, int16 something) , see VALUEBOX:ordinal20
Item::I_andStatus, // void Intrinsic069(6 bytes)
Item::I_move, // void Intrinsic06A(10 bytes)
- 0, // int16 Intrinsic06B(void)
- 0, // void Intrinsic06C(4 bytes)
+ UCMachine::I_true, // TODO: This is actualy "is compiled with VIOLENCE=1" (was set to 0 in germany). For now just always say yes.
+ Kernel::I_resetRef, // void Intrinsic06C(4 bytes)
Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
Item::I_andStatus, // void Intrinsic06E(6 bytes)
0, // TODO: Item::I_isCompletelyOn int Intrinsic06F(6 bytes)
@@ -179,11 +179,11 @@ Intrinsic RemorseIntrinsics[] = {
Actor::I_setImmortal, // void Intrinsic085(4 bytes)
0, // void Intrinsic086(void)
0, // void Intrinsic087(void)
- Item::I_setMapArray, // maybe I_setNpcNum -- based on use for VALUEBOX (like getNPCNum is) and coff being right next to getNPCNum.. see VALUEBOX:ordinal20. Could also be I_setMapArray??
+ Item::I_setMapArray,
Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
0, // void Intrinsic08A(12 bytes)
Item::I_enterFastArea, // void Intrinsic08B(4 bytes)
- 0, // void Intrinsic08C(4 bytes)
+ Item::I_doSomethingAndSetUnkCruFlag, // 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, // void Intrinsic08F(void)
@@ -217,7 +217,7 @@ Intrinsic RemorseIntrinsics[] = {
0, // I_playFlic(char *) Intrinsic0A9(void)
AudioProcess::I_playSFX, // void Intrinsic0AA(2 bytes)
0, // int Intrinsic0AB(4 bytes)
- 0, // void Intrinsic0AC(2 bytes)
+ Item::I_getFamilyOfType, // void Intrinsic0AC(2 bytes)
Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
Item::I_getQLo, // based on same coff set as 02B
Item::I_getQHi, // based on same coff set as 026
@@ -253,7 +253,7 @@ Intrinsic RemorseIntrinsics[] = {
0, // void Intrinsic0CB(2 bytes)
0, // int Intrinsic0CC(4 bytes)
0, // void Intrinsic0CD(6 bytes)
- 0, // void Intrinsic0CE(void)
+ UCMachine::I_true, // whether the string "GAME COMPILE=1" has the 1. Might be interesting to see how this changes the game.. for now just set to true.
0, // void Intrinsic0CF(6 bytes)
// 0x0D0
Item::I_use, // void Intrinsic0D0(4 bytes)
@@ -310,7 +310,7 @@ Intrinsic RemorseIntrinsics[] = {
Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
Item::I_andStatus, // void Intrinsic101(6 bytes)
Item::I_getNpcNum, // Based on variable name in TRIGGER::ordinal21
- 0, // // byte Intrinsic103(uint16 shapenum)
+ Item::I_isCrusTypeNPC,
Item::I_andStatus, // void Intrinsic104(6 bytes)
Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
Item::I_andStatus, // void Intrinsic106(6 bytes)
@@ -333,15 +333,15 @@ Intrinsic RemorseIntrinsics[] = {
0, // ? Item::I_getTypeFlag, byte Intrinsic116(14 bytes)
Item::I_andStatus, // void Intrinsic117(6 bytes)
Item::I_hurl, // int16 Intrinsic118(12 bytes)
- 0, // void Intrinsic119(4 bytes)
+ Item::I_doSomethingAndSetUnkCruFlag, // void Intrinsic119(4 bytes)
Item::I_andStatus, // void Intrinsic11A(6 bytes)
Item::I_getTypeFlag, // byte Intrinsic11B(6 bytes)
Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
Item::I_hurl, // int16 Intrinsic11D(12 bytes)
- 0, // int16 Intrinsic11E(4 bytes)
- 0, // byte Intrinsic11F(4 bytes)
+ Item::I_getCY, // int16 Intrinsic11E(4 bytes)
+ Item::I_getCZ, // byte Intrinsic11F(4 bytes)
// 0x120
- 0, // void Intrinsic120(4 bytes)
+ Item::I_getCX, // void Intrinsic120(4 bytes)
Actor::I_getDir, // int Intrinsic121(4 bytes)
Actor::I_isDead, // int Intrinsic122(4 bytes)
Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
@@ -351,8 +351,8 @@ Intrinsic RemorseIntrinsics[] = {
Item::I_getDirToCoords, // int Intrinsic127(8 bytes)
Item::I_andStatus, // void Intrinsic128(6 bytes) // maybe Item::andStatus?? see ITEM::ordinal22
Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
- 0, // void Intrinsic12A(4 bytes)
- 0, // void Intrinsic12B(4 bytes)
+ Item::I_doSomethingAndSetUnkCruFlag, // void Intrinsic12A(4 bytes)
+ Item::I_getCY, // void Intrinsic12B(4 bytes)
Item::I_isOn,
Item::I_getFootpadData, // void Intrinsic12D(16 bytes)
Actor::I_isDead, // int Intrinsic12E(4 bytes)
diff --git a/engines/ultima/ultima8/usecode/uc_machine.cpp b/engines/ultima/ultima8/usecode/uc_machine.cpp
index b4032e215b..b9f6e5bbb7 100644
--- a/engines/ultima/ultima8/usecode/uc_machine.cpp
+++ b/engines/ultima/ultima8/usecode/uc_machine.cpp
@@ -1240,7 +1240,8 @@ void UCMachine::execProcess(UCProcess *p) {
_globals->setBits(ui16a, ui16b, ui32a);
if (ui32a & ~(((1 << ui16b) - 1))) {
- perr << "Warning: value popped into a bitflag it doesn't fit in" << Std::endl;
+ perr << "Warning: value popped into a bitflag it doesn't fit in (" << Std::hex
+ << ui16a << " " << ui16b << " " << ui32a << ")" << Std::endl;
}
// paranoid :-)
diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index 3cacac59fe..65c1eaf84e 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -24,7 +24,6 @@
#include "ultima/ultima8/world/actors/actor.h"
#include "ultima/ultima8/kernel/object_manager.h"
#include "ultima/ultima8/kernel/kernel.h"
-#include "ultima/ultima8/kernel/core_app.h"
#include "ultima/ultima8/usecode/uc_machine.h"
#include "ultima/ultima8/usecode/uc_list.h"
#include "ultima/ultima8/world/world.h"
More information about the Scummvm-git-logs
mailing list