aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/costume.cpp2
-rw-r--r--scumm/player_nes.cpp50
-rw-r--r--scumm/player_nes.h1
-rw-r--r--scumm/script_v2.cpp12
-rw-r--r--scumm/script_v5.cpp2
5 files changed, 31 insertions, 36 deletions
diff --git a/scumm/costume.cpp b/scumm/costume.cpp
index 9e55779e14..1af14ea2cf 100644
--- a/scumm/costume.cpp
+++ b/scumm/costume.cpp
@@ -642,7 +642,7 @@ byte NESCostumeRenderer::drawLimb(const Actor *a, int limb) {
if (cost.curpos[limb] == 0xFFFF)
return 0;
- if (_vm->VAR(_vm->VAR_CURRENT_LIGHTS) & LIGHTMODE_actor_color)
+ if (_vm->VAR(_vm->VAR_CURRENT_LIGHTS) & LIGHTMODE_actor_base)
palette = _vm->_NESPalette[1];
else
palette = darkpalette;
diff --git a/scumm/player_nes.cpp b/scumm/player_nes.cpp
index 8dd8615259..278e763978 100644
--- a/scumm/player_nes.cpp
+++ b/scumm/player_nes.cpp
@@ -579,32 +579,27 @@ void APU_Reset (void) {
Frame.Cycles = 1;
}
-int16 sample_pos = 0;
-bool sample_ok = false;
-
-void APU_Run(void) {
- static int sampcycles = 0, samppos = 0;
- int NewBufPos = APU.SampleRate * ++APU.Cycles / 1789773;
-
- if (NewBufPos == APU.SampleRate) /* we've generated 1 second, so we can reset our counters now */
- APU.Cycles = NewBufPos = 0;
+int16 APU_GetSample(void) {
+ int sampcycles = 0, samppos = 0;
+ int NewBufPos = APU.BufPos;
+ while (NewBufPos == APU.BufPos) {
+ NewBufPos = APU.SampleRate * ++APU.Cycles / 1789773;
+ if (APU.Cycles == 1789773) // we've generated 1 second, so we can reset our counters now
+ APU.Cycles = NewBufPos = 0;
+
+ Frame_Run();
+ Square0_Run();
+ Square1_Run();
+ Triangle_Run();
+ Noise_Run();
+
+ samppos += Square0.Pos + Square1.Pos + Triangle.Pos + Noise.Pos;
+ sampcycles++;
+ }
- Frame_Run();
- Square0_Run();
- Square1_Run();
- Triangle_Run();
- Noise_Run();
+ APU.BufPos = NewBufPos;
- samppos += Square0.Pos + Square1.Pos + Triangle.Pos + Noise.Pos;
- sampcycles++;
-
- if (NewBufPos != APU.BufPos) {
- APU.BufPos = NewBufPos;
- samppos = (samppos << 6) / sampcycles;
- sample_pos = samppos;
- sample_ok = true;
- samppos = sampcycles = 0;
- }
+ return (samppos << 6) / sampcycles;
}
}
@@ -652,15 +647,12 @@ Player_NES::~Player_NES() {
}
void Player_NES::setMusicVolume (int vol) {
+ _maxvol = vol;
}
int Player_NES::readBuffer(int16 *buffer, const int numSamples) {
for (int n = 0; n < numSamples; n++) {
- while (!APUe::sample_ok)
- APUe::APU_Run();
-
- APUe::sample_ok = false;
- buffer[n] = APUe::sample_pos;
+ buffer[n] = APUe::APU_GetSample() * _maxvol / 255;
_current_sample++;
if (_current_sample == _samples_per_frame) {
diff --git a/scumm/player_nes.h b/scumm/player_nes.h
index c3132b6fdc..6674ff080a 100644
--- a/scumm/player_nes.h
+++ b/scumm/player_nes.h
@@ -73,6 +73,7 @@ private:
int _sample_rate;
int _samples_per_frame;
int _current_sample;
+ int _maxvol;
static const int MAXVOLUME = 0x7F;
static const int NUMSLOTS = 3;
diff --git a/scumm/script_v2.cpp b/scumm/script_v2.cpp
index d8657854a7..8696a355be 100644
--- a/scumm/script_v2.cpp
+++ b/scumm/script_v2.cpp
@@ -519,6 +519,9 @@ void ScummEngine_v2::o2_assignVarByte() {
void ScummEngine_v2::o2_setObjPreposition() {
int obj = getVarOrDirectWord(PARAM_1);
int unk = fetchScriptByte();
+
+ if (_features & GF_NES)
+ return;
if (whereIsObject(obj) != WIO_NOT_FOUND) {
// FIXME: this might not work properly the moment we save and restore the game.
@@ -1280,16 +1283,15 @@ void ScummEngine_v2::o2_lights() {
c = fetchScriptByte();
if (c == 0) {
- if (_gameId == GID_MANIAC && _version == 1) {
+ if (_gameId == GID_MANIAC && _version == 1 && !(_features & GF_NES)) {
// Convert older light mode values into
// equivalent values.of later games
// 0 Darkness
// 1 Flashlight
// 2 Lighted area
- // 11 and 12 are used by NES version
- if (a == 2 || a == 11)
+ if (a == 2)
VAR(VAR_CURRENT_LIGHTS) = 11;
- else if (a == 1 || a == 12)
+ else if (a == 1)
VAR(VAR_CURRENT_LIGHTS) = 4;
else
VAR(VAR_CURRENT_LIGHTS) = 0;
@@ -1353,7 +1355,7 @@ void ScummEngine_v2::o2_delay() {
delay = 0xFFFFFF - delay;
vm.slot[_currentScript].delay = delay;
- vm.slot[_currentScript].status = 1;
+ vm.slot[_currentScript].status = ssPaused;
o5_breakHere();
}
diff --git a/scumm/script_v5.cpp b/scumm/script_v5.cpp
index 57fc2bfefa..513f74c1a8 100644
--- a/scumm/script_v5.cpp
+++ b/scumm/script_v5.cpp
@@ -1136,7 +1136,7 @@ void ScummEngine_v5::o5_saveLoadGame() {
slot = 1;
if (a == 1)
_opcode = 0x40;
- else if (a == 2)
+ else if ((a == 2) || (_features & GF_NES))
_opcode = 0x80;
} else {
_opcode = a & 0xE0;