diff --git a/docs/rh-log.txt b/docs/rh-log.txt index f778dc3e4f..ed76662309 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,3 +1,8 @@ +December 18, 2009 +- A_FreezeDeath() now removes fuzz effects. +- In mus2midi.cpp, added range checking to MUS_SYSEVENT and MUS_CTRLCHANGE, + and masking for note-off keys, note-on velocities, and program changes. + December 18, 2009 (Changes by Graf Zahl) - added all known maps requiring inverted sprite sorting to compatibility.txt. - added compatibility option to invert sprite sorting. Apparently Doom.exe diff --git a/src/g_shared/a_action.cpp b/src/g_shared/a_action.cpp index 5dcdd0c283..571b7bf1f8 100644 --- a/src/g_shared/a_action.cpp +++ b/src/g_shared/a_action.cpp @@ -163,6 +163,12 @@ DEFINE_ACTION_FUNCTION(AActor, A_FreezeDeath) self->flags2 |= MF2_PUSHABLE|MF2_TELESTOMP|MF2_PASSMOBJ|MF2_SLIDE; self->flags3 |= MF3_CRASHED; self->height = self->GetDefault()->height; + // Remove fuzz effects from frozen actors. + if (self->RenderStyle.BlendOp >= STYLEOP_Fuzz && self->RenderStyle.BlendOp <= STYLEOP_FuzzOrRevSub) + { + self->RenderStyle = STYLE_Normal; + } + S_Sound (self, CHAN_BODY, "misc/freeze", 1, ATTN_NORM); // [RH] Andy Baker's stealth monsters @@ -178,7 +184,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_FreezeDeath) self->player->poisoncount = 0; self->player->bonuscount = 0; } - else if (self->flags3&MF3_ISMONSTER && self->special) + else if (self->flags3 & MF3_ISMONSTER && self->special) { // Initiate monster death actions LineSpecials [self->special] (NULL, self, false, self->args[0], self->args[1], self->args[2], self->args[3], self->args[4]); diff --git a/src/mus2midi.cpp b/src/mus2midi.cpp index 9dafcaabf1..beef4ffa42 100644 --- a/src/mus2midi.cpp +++ b/src/mus2midi.cpp @@ -121,7 +121,8 @@ bool ProduceMIDI (const BYTE *musBuf, TArray &outFile) BYTE chanUsed[16]; BYTE lastVel[16]; long trackLen; - + bool no_op; + // Do some validation of the MUS file if (MUSMagic != musHead->Magic) return false; @@ -178,12 +179,13 @@ bool ProduceMIDI (const BYTE *musBuf, TArray &outFile) midStatus = channel; midArgs = 0; // Most events have two args (0 means 2, 1 means 1) - + no_op = false; + switch (event & 0x70) { case MUS_NOTEOFF: midStatus |= MIDI_NOTEOFF; - mid1 = t; + mid1 = t & 127; mid2 = 64; break; @@ -192,7 +194,7 @@ bool ProduceMIDI (const BYTE *musBuf, TArray &outFile) mid1 = t & 127; if (t & 128) { - lastVel[channel] = musBuf[mus_p++];; + lastVel[channel] = musBuf[mus_p++] & 127; } mid2 = lastVel[channel]; break; @@ -204,9 +206,16 @@ bool ProduceMIDI (const BYTE *musBuf, TArray &outFile) break; case MUS_SYSEVENT: - midStatus |= MIDI_CTRLCHANGE; - mid1 = CtrlTranslate[t]; - mid2 = t == 12 ? LittleShort(musHead->NumChans) : 0; + if (t < 10 || t > 14) + { + no_op = true; + } + else + { + midStatus |= MIDI_CTRLCHANGE; + mid1 = CtrlTranslate[t]; + mid2 = t == 12 /* Mono */ ? LittleShort(musHead->NumChans) : 0; + } break; case MUS_CTRLCHANGE: @@ -214,27 +223,39 @@ bool ProduceMIDI (const BYTE *musBuf, TArray &outFile) { // program change midArgs = 1; midStatus |= MIDI_PRGMCHANGE; - mid1 = musBuf[mus_p++]; + mid1 = musBuf[mus_p++] & 127; mid2 = 0; // Assign mid2 just to make GCC happy } - else + else if (t > 0 && t < 10) { midStatus |= MIDI_CTRLCHANGE; mid1 = CtrlTranslate[t]; mid2 = musBuf[mus_p++]; } + else + { + no_op = true; + } break; case MUS_SCOREEND: - midStatus = 0xff; - mid1 = 0x2f; - mid2 = 0x00; + midStatus = MIDI_META; + mid1 = MIDI_META_EOT; + mid2 = 0; break; default: return false; } + if (no_op) + { + // A system-specific event with no data is a no-op. + midStatus = MIDI_META; + mid1 = MIDI_META_SSPEC; + mid2 = 0; + } + WriteVarLen (outFile, deltaTime); if (midStatus != status) diff --git a/src/mus2midi.h b/src/mus2midi.h index 79b4100788..6780bdf47c 100644 --- a/src/mus2midi.h +++ b/src/mus2midi.h @@ -46,6 +46,7 @@ #define MIDI_META ((BYTE)0xFF) // Meta event begin #define MIDI_META_TEMPO ((BYTE)0x51) #define MIDI_META_EOT ((BYTE)0x2F) // End-of-track +#define MIDI_META_SSPEC ((BYTE)0x7F) // System-specific event #define MIDI_NOTEOFF ((BYTE)0x80) // + note + velocity #define MIDI_NOTEON ((BYTE)0x90) // + note + velocity