[Scummvm-git-logs] scummvm master -> 5607de83a0c6a648f6f139b76a527d6883e6d5df
mduggan
noreply at scummvm.org
Sat Mar 15 06:51:37 UTC 2025
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
5607de83a0 DGDS: Fix implementation of a few HoC globals
Commit: 5607de83a0c6a648f6f139b76a527d6883e6d5df
https://github.com/scummvm/scummvm/commit/5607de83a0c6a648f6f139b76a527d6883e6d5df
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2025-03-15T17:45:17+11:00
Commit Message:
DGDS: Fix implementation of a few HoC globals
Implement difficulty level and pal fade globals.
Changed paths:
engines/dgds/globals.cpp
engines/dgds/globals.h
diff --git a/engines/dgds/globals.cpp b/engines/dgds/globals.cpp
index 22c564bece3..bb650cfacfe 100644
--- a/engines/dgds/globals.cpp
+++ b/engines/dgds/globals.cpp
@@ -237,16 +237,65 @@ public:
}
};
+class HocDifficultyGlobal : public Global {
+public:
+ HocDifficultyGlobal(uint16 num) : Global(num) {}
+ int16 get() override { return DgdsEngine::getInstance()->getDifficulty(); }
+ int16 set(int16 val) override {
+ DgdsEngine::getInstance()->setDifficulty(val);
+ return DgdsEngine::getInstance()->getDetailLevel();
+ }
+ void setRaw(int16 val) override {
+ DgdsEngine::getInstance()->setDifficulty(val);
+ }
+};
-HocGlobals::HocGlobals(Clock &clock) : Globals(clock), _difficultyLevel(1), _unk55(0),
- _unkDlgFileNum(0), _unkDlgDlgNum(0), _currentCharacter2(0), _currentCharacter(0),
- _tankFinished(0), _nativeGameState(0), _tankState(0), _unk47(0), _unk46(0), _unk45(0x3f), _sheckels(0),
+
+class HocPalFadeGlobal : public RWI16Global {
+public:
+ HocPalFadeGlobal(uint16 num, int16 *val) : RWI16Global(num, val), _lastWas0x41(false) {}
+ int16 set(int16 val) override {
+ const int16 oldVal = RWI16Global::get();
+ if (val < 0x40) {
+ if (oldVal == val)
+ return val;
+
+ const int step = (oldVal < val) ? 1 : -1;
+ for (int16 fade = oldVal; val + step != fade; fade = fade + step) {
+ int16 ncols;
+ int16 colno;
+ if (!_lastWas0x41) {
+ ncols = 0xc0;
+ colno = 0x40;
+ } else {
+ ncols = 0xe0;
+ colno = 0x20;
+ }
+ DgdsEngine::getInstance()->getGamePals()->setFade(colno, ncols, 0, fade * 4);
+ g_system->updateScreen();
+ g_system->delayMillis(5);
+ }
+ } else {
+ _lastWas0x41 = (val == 0x41);
+ val = 0x3f;
+ }
+ return RWI16Global::set(val);
+ }
+
+private:
+ bool _lastWas0x41;
+};
+
+
+HocGlobals::HocGlobals(Clock &clock) : Globals(clock), _unk55(0),
+ _partnerDlgFileNum(0), _partnerDlgDlgNum(0), _currentCharacter2(0), _currentCharacter(0),
+ _tankFinished(0), _nativeGameState(0), _tankState(0), _unk47(0), _unk46(0), _palFade(0x3f), _sheckels(0),
_shellBet(0), _shellPea(0), _trainState(0), _startScene(3), _introState(0) {
_globals.push_back(new DetailLevelROGlobal(0x53));
- _globals.push_back(new RWI16Global(0x52, &_difficultyLevel)); // TODO: Sync with difficulty in menu
+ _globals.push_back(new HocDifficultyGlobal(0x52));
_globals.push_back(new RWI16Global(0x37, &_unk55)); // TODO: Special update function FUN_1407_080d, sound init related.. sound bank?
- _globals.push_back(new RWI16Global(0x36, &_unkDlgFileNum));
- _globals.push_back(new RWI16Global(0x35, &_unkDlgDlgNum));
+ _globals.push_back(new RWI16Global(0x36, &_partnerDlgFileNum));
+ _globals.push_back(new RWI16Global(0x35, &_partnerDlgDlgNum));
_globals.push_back(new HocCharacterGlobal(0x34, &_currentCharacter));
_globals.push_back(new HocCharacterGlobal(0x33, &_currentCharacter2));
_globals.push_back(new RWI16Global(0x32, &_tankFinished));
@@ -254,7 +303,7 @@ HocGlobals::HocGlobals(Clock &clock) : Globals(clock), _difficultyLevel(1), _unk
_globals.push_back(new RWI16Global(0x30, &_tankState));
_globals.push_back(new RWI16Global(0x2F, &_unk47)); // tank related.. cows?
_globals.push_back(new RWI16Global(0x2E, &_unk46)); // tank related.. start point?
- _globals.push_back(new RWI16Global(0x2D, &_unk45)); // TODO: Special update function FUN_1407_0784, palette related?
+ _globals.push_back(new HocPalFadeGlobal(0x2D, &_palFade));
_globals.push_back(new RWI16Global(0x2C, &_sheckels)); // used as currency in Istanbul
_globals.push_back(new RWI16Global(0x2B, &_shellBet));
_globals.push_back(new RWI16Global(0x2A, &_shellPea));
@@ -272,7 +321,7 @@ Common::Error HocGlobals::syncState(Common::Serializer &s) {
s.syncAsSint16LE(_shellPea);
s.syncAsSint16LE(_shellBet);
s.syncAsSint16LE(_sheckels);
- s.syncAsSint16LE(_unk45);
+ s.syncAsSint16LE(_palFade);
s.syncAsSint16LE(_unk46);
s.syncAsSint16LE(_unk47);
s.syncAsSint16LE(_tankState);
@@ -280,10 +329,13 @@ Common::Error HocGlobals::syncState(Common::Serializer &s) {
s.syncAsSint16LE(_tankFinished);
s.syncAsSint16LE(_currentCharacter);
s.syncAsSint16LE(_currentCharacter2);
- s.syncAsSint16LE(_unkDlgDlgNum);
- s.syncAsSint16LE(_unkDlgFileNum);
+ s.syncAsSint16LE(_partnerDlgDlgNum);
+ s.syncAsSint16LE(_partnerDlgFileNum);
s.syncAsSint16LE(_unk55);
- s.syncAsSint16LE(_difficultyLevel);
+
+ // This was a duplicate of difficulty level (replaced by HocDifficultyGlobal).
+ // Sync a 16-bit int for backward compatibility.
+ s.skip(2);
return Common::kNoError;
}
diff --git a/engines/dgds/globals.h b/engines/dgds/globals.h
index d8bcd23d4b9..8c896493c11 100644
--- a/engines/dgds/globals.h
+++ b/engines/dgds/globals.h
@@ -178,7 +178,7 @@ private:
int16 _shellPea;
int16 _shellBet;
int16 _sheckels;
- int16 _unk45;
+ int16 _palFade;
int16 _unk46;
int16 _unk47;
int16 _tankState;
@@ -186,10 +186,9 @@ private:
int16 _tankFinished;
int16 _currentCharacter;
int16 _currentCharacter2;
- int16 _unkDlgDlgNum;
- int16 _unkDlgFileNum;
+ int16 _partnerDlgDlgNum; // Dialog shown when right-clicking
+ int16 _partnerDlgFileNum; // on character swap button
int16 _unk55;
- int16 _difficultyLevel;
Common::Error syncState(Common::Serializer &s) override;
};
More information about the Scummvm-git-logs
mailing list