ref: 55a7efa90416c78bf95e5d552b05e4b6303e0e8f
parent: 02c7144d97be44cc37dbcaeea27ab47cf79b7575
parent: ec5b192d831ba72c4b4dcd9b0e1f2dce6396668d
author: Simon Howard <fraggle@soulsphere.org>
date: Sun Jun 12 20:45:20 EDT 2016
Merge branch 'master' of github.com:chocolate-doom/chocolate-doom
--- a/opl/opl3.c
+++ b/opl/opl3.c
@@ -21,38 +21,8 @@
// OPLx decapsulated(Matthew Gambrell, Olli Niemitalo):
// OPL2 ROMs.
//
-// version: 1.7
+// version: 1.7.2
//
-// Changelog:
-//
-// v1.1:
-// Vibrato's sign fix.
-// v1.2:
-// Operator key fix.
-// Corrected 4-operator mode.
-// Corrected rhythm mode.
-// Some small fixes.
-// v1.2.1:
-// Small envelope generator fix.
-// Removed EX_Get function(not used)
-// v1.3:
-// Complete rewrite.
-// v1.4:
-// New envelope and waveform generator.
-// Some small fixes.
-// v1.4.1:
-// Envelope generator rate calculation fix.
-// v1.4.2:
-// Version for ZDoom.
-// v1.5:
-// Optimizations.
-// v1.6:
-// Improved emulation output.
-// v1.6.1:
-// Simple YMF289(OPL3-L) emulation.
-// v1.7:
-// Version for Chocolate Doom.
-//
#include <stdio.h>
#include <stdlib.h>
@@ -537,16 +507,13 @@
if (!slot->key)
{
slot->eg_gen = envelope_gen_num_attack;
- if ((slot->eg_rate >> 2) != 0x0f)
+ OPL3_EnvelopeUpdateRate(slot);
+ if ((slot->eg_rate >> 2) == 0x0f)
{
- slot->eg_gen = envelope_gen_num_attack;
- }
- else
- {
slot->eg_gen = envelope_gen_num_decay;
+ OPL3_EnvelopeUpdateRate(slot);
slot->eg_rout = 0x00;
}
- OPL3_EnvelopeUpdateRate(slot);
slot->pg_phase = 0x00;
}
slot->key |= type;
@@ -683,7 +650,7 @@
static void OPL3_SlotGenerateZM(opl3_slot *slot)
{
- OPL3_SlotGeneratePhase(slot, 0);
+ OPL3_SlotGeneratePhase(slot, (Bit16u)(slot->pg_phase >> 9));
}
static void OPL3_SlotCalcFB(opl3_slot *slot)
@@ -789,6 +756,8 @@
{
chip->channel[chnum].chtype = ch_2op;
OPL3_ChannelSetupAlg(&chip->channel[chnum]);
+ OPL3_EnvelopeKeyOff(chip->channel[chnum].slots[0], egk_drum);
+ OPL3_EnvelopeKeyOff(chip->channel[chnum].slots[1], egk_drum);
}
}
}
@@ -1084,7 +1053,7 @@
| (((phase17 >> 2) ^ phase17) & 0x08)) ? 0x01 : 0x00;
//hh
phase = (phasebit << 9)
- | (0x34 << ((phasebit ^ (chip->noise & 0x01) << 1)));
+ | (0x34 << ((phasebit ^ (chip->noise & 0x01)) << 1));
OPL3_SlotGeneratePhase(channel7->slots[0], phase);
//tt
OPL3_SlotGenerateZM(channel8->slots[0]);
--- a/opl/opl3.h
+++ b/opl/opl3.h
@@ -21,7 +21,7 @@
// OPLx decapsulated(Matthew Gambrell, Olli Niemitalo):
// OPL2 ROMs.
//
-// version: 1.7
+// version: 1.7.2
//
#ifndef OPL_OPL3_H
--- a/src/doom/am_map.c
+++ b/src/doom/am_map.c
@@ -697,11 +697,12 @@
rc = false;
}
- if (!deathmatch && cht_CheckCheat(&cheat_amap, ev->data2))
- {
- rc = false;
- cheating = (cheating+1) % 3;
- }
+ if ((!deathmatch || gameversion <= exe_doom_1_8)
+ && cht_CheckCheat(&cheat_amap, ev->data2))
+ {
+ rc = false;
+ cheating = (cheating + 1) % 3;
+ }
}
else if (ev->type == ev_keyup)
{
--- a/src/doom/d_main.c
+++ b/src/doom/d_main.c
@@ -581,7 +581,7 @@
{
pagetic = 200;
- if ( gamemode == retail )
+ if (gameversion >= exe_ultimate)
pagename = DEH_String("CREDIT");
else
pagename = DEH_String("HELP2");
--- a/src/doom/f_finale.c
+++ b/src/doom/f_finale.c
@@ -671,7 +671,7 @@
switch (gameepisode)
{
case 1:
- if (gamemode == retail)
+ if (gameversion >= exe_ultimate)
{
lumpname = "CREDIT";
}
--- a/src/doom/m_menu.c
+++ b/src/doom/m_menu.c
@@ -742,74 +742,9 @@
//
void M_DrawReadThis1(void)
{
- char *lumpname = "CREDIT";
- int skullx = 330, skully = 175;
-
inhelpscreens = true;
-
- // Different versions of Doom 1.9 work differently
- switch (gameversion)
- {
- case exe_doom_1_666:
- case exe_doom_1_7:
- case exe_doom_1_8:
- case exe_doom_1_9:
- case exe_hacx:
-
- if (gamemode == commercial)
- {
- // Doom 2
-
- lumpname = "HELP";
-
- skullx = 330;
- skully = 165;
- }
- else
- {
- // Doom 1
- // HELP2 is the first screen shown in Doom 1
-
- lumpname = "HELP2";
-
- skullx = 280;
- skully = 185;
- }
- break;
-
- case exe_ultimate:
- case exe_chex:
-
- // Ultimate Doom always displays "HELP1".
-
- // Chex Quest version also uses "HELP1", even though it is based
- // on Final Doom.
-
- lumpname = "HELP1";
-
- break;
-
- case exe_final:
- case exe_final2:
-
- // Final Doom always displays "HELP".
-
- lumpname = "HELP";
-
- break;
-
- default:
- I_Error("Unhandled game version");
- break;
- }
-
- lumpname = DEH_String(lumpname);
-
- V_DrawPatchDirect (0, 0, W_CacheLumpName(lumpname, PU_CACHE));
-
- ReadDef1.x = skullx;
- ReadDef1.y = skully;
+ V_DrawPatchDirect(0, 0, W_CacheLumpName(DEH_String("HELP2"), PU_CACHE));
}
@@ -827,7 +762,14 @@
V_DrawPatchDirect(0, 0, W_CacheLumpName(DEH_String("HELP1"), PU_CACHE));
}
+void M_DrawReadThisCommercial(void)
+{
+ inhelpscreens = true;
+ V_DrawPatchDirect(0, 0, W_CacheLumpName(DEH_String("HELP"), PU_CACHE));
+}
+
+
//
// Change Sfx & Music volumes
//
@@ -963,15 +905,6 @@
return;
}
- // Yet another hack...
- if ( (gamemode == registered)
- && (choice > 2))
- {
- fprintf( stderr,
- "M_Episode: 4th episode requires UltimateDOOM\n");
- choice = 0;
- }
-
epi = choice;
M_SetupNextMenu(&NewDef);
}
@@ -1074,20 +1007,8 @@
void M_ReadThis2(int choice)
{
- // Doom 1.9 had two menus when playing Doom 1
- // All others had only one
-
- if (gameversion <= exe_doom_1_9 && gamemode != commercial)
- {
- choice = 0;
- M_SetupNextMenu(&ReadDef2);
- }
- else
- {
- // Close the menu
-
- M_FinishReadThis(0);
- }
+ choice = 0;
+ M_SetupNextMenu(&ReadDef2);
}
void M_FinishReadThis(int choice)
@@ -1673,7 +1594,7 @@
{
M_StartControlPanel ();
- if ( gamemode == retail )
+ if (gameversion >= exe_ultimate)
currentMenu = &ReadDef2;
else
currentMenu = &ReadDef1;
@@ -2088,27 +2009,31 @@
// Here we could catch other version dependencies,
// like HELP1/2, and four episodes.
-
- switch ( gamemode )
+ // The same hacks were used in the original Doom EXEs.
+
+ if (gameversion >= exe_ultimate)
{
- case commercial:
- // Commercial has no "read this" entry.
- MainMenu[readthis] = MainMenu[quitdoom];
- MainDef.numitems--;
- MainDef.y += 8;
- NewDef.prevMenu = &MainDef;
- break;
- case shareware:
- // Episode 2 and 3 are handled,
- // branching to an ad screen.
- case registered:
- break;
- case retail:
- // We are fine.
- default:
- break;
+ MainMenu[readthis].routine = M_ReadThis2;
+ ReadDef2.prevMenu = NULL;
}
+ if (gameversion >= exe_final && gameversion <= exe_final2)
+ {
+ ReadDef2.routine = M_DrawReadThisCommercial;
+ }
+
+ if (gamemode == commercial)
+ {
+ MainMenu[readthis] = MainMenu[quitdoom];
+ MainDef.numitems--;
+ MainDef.y += 8;
+ NewDef.prevMenu = &MainDef;
+ ReadDef1.routine = M_DrawReadThisCommercial;
+ ReadDef1.x = 330;
+ ReadDef1.y = 165;
+ ReadMenu1[rdthsempty1].routine = M_FinishReadThis;
+ }
+
// Versions of doom.exe before the Ultimate Doom release only had
// three episodes; if we're emulating one of those then don't try
// to show episode four. If we are, then do show episode four
@@ -2115,7 +2040,12 @@
// (should crash if missing).
if (gameversion < exe_ultimate)
{
- EpiDef.numitems--;
+ EpiDef.numitems--;
+ }
+ // chex.exe shows only one episode.
+ else if (gameversion == exe_chex)
+ {
+ EpiDef.numitems = 1;
}
opldev = M_CheckParm("-opldev") > 0;
--- a/src/doom/wi_stuff.c
+++ b/src/doom/wi_stuff.c
@@ -1687,7 +1687,7 @@
{
M_StringCopy(name, DEH_String("INTERPIC"), sizeof(name));
}
- else if (gamemode == retail && wbs->epsd == 3)
+ else if (gameversion >= exe_ultimate && wbs->epsd == 3)
{
M_StringCopy(name, DEH_String("INTERPIC"), sizeof(name));
}
@@ -1781,7 +1781,7 @@
#ifdef RANGECHECKING
if (gamemode != commercial)
{
- if ( gamemode == retail )
+ if (gameversion >= exe_ultimate)
RNGCHECK(wbs->epsd, 0, 3);
else
RNGCHECK(wbs->epsd, 0, 2);