Merge branch 'master' of git@git.magicalgirl.moe:STJr/SRB2Internal.git

This commit is contained in:
Monster Iestyn 2016-02-29 14:47:03 +00:00
commit 653299388f
35 changed files with 511 additions and 2028 deletions

View file

@ -11,7 +11,7 @@ compiler:
cache: cache:
directories: directories:
- $HOME/srb2_cache - $HOME/srb2_cache
addons: addons:
apt: apt:
@ -24,8 +24,8 @@ addons:
before_script: before_script:
- mkdir $HOME/srb2_cache - mkdir $HOME/srb2_cache
- wget http://rosenthalcastle.org/srb2/SRB2-v2114-Installer.exe -c -O $HOME/srb2_cache/SRB2-v2114-Installer.exe - wget --verbose --server-response -c http://rosenthalcastle.org/srb2/SRB2-v2114-assets.7z -O $HOME/srb2_cache/SRB2-v2114-assets.7z
- 7z x $HOME/srb2_cache/SRB2-v2114-Installer.exe -oassets - 7z x $HOME/srb2_cache/SRB2-v2114-assets.7z -oassets
- mkdir build - mkdir build
- cd build - cd build
- cmake .. - cmake ..

View file

@ -23,13 +23,13 @@ endfunction()
# Macro to add OSX framework # Macro to add OSX framework
macro(add_framework fwname appname) macro(add_framework fwname appname)
find_library(FRAMEWORK_${fwname} find_library(FRAMEWORK_${fwname}
NAMES ${fwname} NAMES ${fwname}
PATHS ${CMAKE_OSX_SYSROOT}/System/Library PATHS ${CMAKE_OSX_SYSROOT}/System/Library
${CMAKE_OSX_SYSROOT}/Library ${CMAKE_OSX_SYSROOT}/Library
/System/Library /System/Library
/Library /Library
PATH_SUFFIXES Frameworks ATH_SUFFIXES Frameworks
NO_DEFAULT_PATH) NO_DEFAULT_PATH)
if( ${FRAMEWORK_${fwname}} STREQUAL FRAMEWORK_${fwname}-NOTFOUND) if( ${FRAMEWORK_${fwname}} STREQUAL FRAMEWORK_${fwname}-NOTFOUND)
MESSAGE(ERROR ": Framework ${fwname} not found") MESSAGE(ERROR ": Framework ${fwname} not found")
else() else()

View file

@ -310,7 +310,7 @@ static void CON_SetupBackColormap(void)
yellowmap[9] = (UINT8)66; yellowmap[9] = (UINT8)66;
purplemap[3] = (UINT8)184; purplemap[3] = (UINT8)184;
purplemap[9] = (UINT8)186; purplemap[9] = (UINT8)186;
lgreenmap[3] = (UINT8)102; lgreenmap[3] = (UINT8)98;
lgreenmap[9] = (UINT8)106; lgreenmap[9] = (UINT8)106;
bluemap[3] = (UINT8)147; bluemap[3] = (UINT8)147;
bluemap[9] = (UINT8)158; bluemap[9] = (UINT8)158;

View file

@ -3187,6 +3187,12 @@ static void readwipes(MYFILE *f)
else if (fastcmp(pword, "FINAL")) else if (fastcmp(pword, "FINAL"))
wipeoffset = wipe_gameend_final; wipeoffset = wipe_gameend_final;
} }
else if (fastncmp(word, "SPECLEVEL_", 10))
{
pword = word + 10;
if (fastcmp(pword, "TOWHITE"))
wipeoffset = wipe_speclevel_towhite;
}
if (wipeoffset < 0) if (wipeoffset < 0)
{ {
@ -3194,9 +3200,11 @@ static void readwipes(MYFILE *f)
continue; continue;
} }
if (value == UINT8_MAX // Cannot disable non-toblack wipes (or the level toblack wipe) if (value == UINT8_MAX
&& (wipeoffset <= wipe_level_toblack || wipeoffset >= wipe_level_final)) && (wipeoffset <= wipe_level_toblack || wipeoffset >= wipe_speclevel_towhite))
{ {
// Cannot disable non-toblack wipes
// (or the level toblack wipe, or the special towhite wipe)
deh_warning("Wipes: can't disable wipe of type '%s'", word); deh_warning("Wipes: can't disable wipe of type '%s'", word);
continue; continue;
} }
@ -4586,30 +4594,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_MSSHIELD_F12", "S_MSSHIELD_F12",
// Ring // Ring
"S_RING1", "S_RING",
"S_RING2",
"S_RING3",
"S_RING4",
"S_RING5",
"S_RING6",
"S_RING7",
"S_RING8",
"S_RING9",
"S_RING10",
"S_RING11",
"S_RING12",
"S_RING13",
"S_RING14",
"S_RING15",
"S_RING16",
"S_RING17",
"S_RING18",
"S_RING19",
"S_RING20",
"S_RING21",
"S_RING22",
"S_RING23",
"S_RING24",
// Blue Sphere for special stages // Blue Sphere for special stages
"S_BLUEBALL", "S_BLUEBALL",
@ -4625,39 +4610,10 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_GRAVWELLRED3", "S_GRAVWELLRED3",
// Individual Team Rings // Individual Team Rings
"S_TEAMRING1", "S_TEAMRING",
"S_TEAMRING2",
"S_TEAMRING3",
"S_TEAMRING4",
"S_TEAMRING5",
"S_TEAMRING6",
"S_TEAMRING7",
"S_TEAMRING8",
"S_TEAMRING9",
"S_TEAMRING10",
"S_TEAMRING11",
"S_TEAMRING12",
"S_TEAMRING13",
"S_TEAMRING14",
"S_TEAMRING15",
"S_TEAMRING16",
"S_TEAMRING17",
"S_TEAMRING18",
"S_TEAMRING19",
"S_TEAMRING20",
"S_TEAMRING21",
"S_TEAMRING22",
"S_TEAMRING23",
"S_TEAMRING24",
// Special Stage Token // Special Stage Token
"S_EMMY1", "S_EMMY",
"S_EMMY2",
"S_EMMY3",
"S_EMMY4",
"S_EMMY5",
"S_EMMY6",
"S_EMMY7",
// Special Stage Token // Special Stage Token
"S_TOKEN", "S_TOKEN",
@ -4811,40 +4767,9 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_SPIKED2", "S_SPIKED2",
// Starpost // Starpost
"S_STARPOST1", "S_STARPOST_IDLE",
"S_STARPOST2", "S_STARPOST_FLASH",
"S_STARPOST3", "S_STARPOST_SPIN",
"S_STARPOST4",
"S_STARPOST5",
"S_STARPOST6",
"S_STARPOST7",
"S_STARPOST8",
"S_STARPOST9",
"S_STARPOST10",
"S_STARPOST11",
"S_STARPOST12",
"S_STARPOST13",
"S_STARPOST14",
"S_STARPOST15",
"S_STARPOST16",
"S_STARPOST17",
"S_STARPOST18",
"S_STARPOST19",
"S_STARPOST20",
"S_STARPOST21",
"S_STARPOST22",
"S_STARPOST23",
"S_STARPOST24",
"S_STARPOST25",
"S_STARPOST26",
"S_STARPOST27",
"S_STARPOST28",
"S_STARPOST29",
"S_STARPOST30",
"S_STARPOST31",
"S_STARPOST32",
"S_STARPOST33",
"S_STARPOST34",
// Big floating mine // Big floating mine
"S_BIGMINE1", "S_BIGMINE1",
@ -5452,38 +5377,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_PITY10", "S_PITY10",
// Invincibility Sparkles // Invincibility Sparkles
"S_IVSP1", "S_IVSP",
"S_IVSP2",
"S_IVSP3",
"S_IVSP4",
"S_IVSP5",
"S_IVSP6",
"S_IVSP7",
"S_IVSP8",
"S_IVSP9",
"S_IVSP10",
"S_IVSP11",
"S_IVSP12",
"S_IVSP13",
"S_IVSP14",
"S_IVSP15",
"S_IVSP16",
"S_IVSP17",
"S_IVSP18",
"S_IVSP19",
"S_IVSP20",
"S_IVSP21",
"S_IVSP22",
"S_IVSP23",
"S_IVSP24",
"S_IVSP25",
"S_IVSP26",
"S_IVSP27",
"S_IVSP28",
"S_IVSP29",
"S_IVSP30",
"S_IVSP31",
"S_IVSP32",
// Super Sonic Spark // Super Sonic Spark
"S_SSPK1", "S_SSPK1",
@ -5670,283 +5564,17 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_RRNG6", "S_RRNG6",
"S_RRNG7", "S_RRNG7",
// Bounce Ring // Weapon Ring Ammo
"S_BOUNCERING1", "S_BOUNCERINGAMMO",
"S_BOUNCERING2", "S_RAILRINGAMMO",
"S_BOUNCERING3", "S_INFINITYRINGAMMO",
"S_BOUNCERING4", "S_AUTOMATICRINGAMMO",
"S_BOUNCERING5", "S_EXPLOSIONRINGAMMO",
"S_BOUNCERING6", "S_SCATTERRINGAMMO",
"S_BOUNCERING7", "S_GRENADERINGAMMO",
"S_BOUNCERING8",
"S_BOUNCERING9",
"S_BOUNCERING10",
"S_BOUNCERING11",
"S_BOUNCERING12",
"S_BOUNCERING13",
"S_BOUNCERING14",
"S_BOUNCERING15",
"S_BOUNCERING16",
"S_BOUNCERING17",
"S_BOUNCERING18",
"S_BOUNCERING19",
"S_BOUNCERING20",
"S_BOUNCERING21",
"S_BOUNCERING22",
"S_BOUNCERING23",
"S_BOUNCERING24",
"S_BOUNCERING25",
"S_BOUNCERING26",
"S_BOUNCERING27",
"S_BOUNCERING28",
"S_BOUNCERING29",
"S_BOUNCERING30",
"S_BOUNCERING31",
"S_BOUNCERING32",
"S_BOUNCERING33",
"S_BOUNCERING34",
"S_BOUNCERING35",
// Rail Ring
"S_RAILRING1",
"S_RAILRING2",
"S_RAILRING3",
"S_RAILRING4",
"S_RAILRING5",
"S_RAILRING6",
"S_RAILRING7",
"S_RAILRING8",
"S_RAILRING9",
"S_RAILRING10",
"S_RAILRING11",
"S_RAILRING12",
"S_RAILRING13",
"S_RAILRING14",
"S_RAILRING15",
"S_RAILRING16",
"S_RAILRING17",
"S_RAILRING18",
"S_RAILRING19",
"S_RAILRING20",
"S_RAILRING21",
"S_RAILRING22",
"S_RAILRING23",
"S_RAILRING24",
"S_RAILRING25",
"S_RAILRING26",
"S_RAILRING27",
"S_RAILRING28",
"S_RAILRING29",
"S_RAILRING30",
"S_RAILRING31",
"S_RAILRING32",
"S_RAILRING33",
"S_RAILRING34",
"S_RAILRING35",
// Infinity ring
"S_INFINITYRING1",
"S_INFINITYRING2",
"S_INFINITYRING3",
"S_INFINITYRING4",
"S_INFINITYRING5",
"S_INFINITYRING6",
"S_INFINITYRING7",
"S_INFINITYRING8",
"S_INFINITYRING9",
"S_INFINITYRING10",
"S_INFINITYRING11",
"S_INFINITYRING12",
"S_INFINITYRING13",
"S_INFINITYRING14",
"S_INFINITYRING15",
"S_INFINITYRING16",
"S_INFINITYRING17",
"S_INFINITYRING18",
"S_INFINITYRING19",
"S_INFINITYRING20",
"S_INFINITYRING21",
"S_INFINITYRING22",
"S_INFINITYRING23",
"S_INFINITYRING24",
"S_INFINITYRING25",
"S_INFINITYRING26",
"S_INFINITYRING27",
"S_INFINITYRING28",
"S_INFINITYRING29",
"S_INFINITYRING30",
"S_INFINITYRING31",
"S_INFINITYRING32",
"S_INFINITYRING33",
"S_INFINITYRING34",
"S_INFINITYRING35",
// Automatic Ring
"S_AUTOMATICRING1",
"S_AUTOMATICRING2",
"S_AUTOMATICRING3",
"S_AUTOMATICRING4",
"S_AUTOMATICRING5",
"S_AUTOMATICRING6",
"S_AUTOMATICRING7",
"S_AUTOMATICRING8",
"S_AUTOMATICRING9",
"S_AUTOMATICRING10",
"S_AUTOMATICRING11",
"S_AUTOMATICRING12",
"S_AUTOMATICRING13",
"S_AUTOMATICRING14",
"S_AUTOMATICRING15",
"S_AUTOMATICRING16",
"S_AUTOMATICRING17",
"S_AUTOMATICRING18",
"S_AUTOMATICRING19",
"S_AUTOMATICRING20",
"S_AUTOMATICRING21",
"S_AUTOMATICRING22",
"S_AUTOMATICRING23",
"S_AUTOMATICRING24",
"S_AUTOMATICRING25",
"S_AUTOMATICRING26",
"S_AUTOMATICRING27",
"S_AUTOMATICRING28",
"S_AUTOMATICRING29",
"S_AUTOMATICRING30",
"S_AUTOMATICRING31",
"S_AUTOMATICRING32",
"S_AUTOMATICRING33",
"S_AUTOMATICRING34",
"S_AUTOMATICRING35",
// Explosion Ring
"S_EXPLOSIONRING1",
"S_EXPLOSIONRING2",
"S_EXPLOSIONRING3",
"S_EXPLOSIONRING4",
"S_EXPLOSIONRING5",
"S_EXPLOSIONRING6",
"S_EXPLOSIONRING7",
"S_EXPLOSIONRING8",
"S_EXPLOSIONRING9",
"S_EXPLOSIONRING10",
"S_EXPLOSIONRING11",
"S_EXPLOSIONRING12",
"S_EXPLOSIONRING13",
"S_EXPLOSIONRING14",
"S_EXPLOSIONRING15",
"S_EXPLOSIONRING16",
"S_EXPLOSIONRING17",
"S_EXPLOSIONRING18",
"S_EXPLOSIONRING19",
"S_EXPLOSIONRING20",
"S_EXPLOSIONRING21",
"S_EXPLOSIONRING22",
"S_EXPLOSIONRING23",
"S_EXPLOSIONRING24",
"S_EXPLOSIONRING25",
"S_EXPLOSIONRING26",
"S_EXPLOSIONRING27",
"S_EXPLOSIONRING28",
"S_EXPLOSIONRING29",
"S_EXPLOSIONRING30",
"S_EXPLOSIONRING31",
"S_EXPLOSIONRING32",
"S_EXPLOSIONRING33",
"S_EXPLOSIONRING34",
"S_EXPLOSIONRING35",
// Scatter Ring
"S_SCATTERRING1",
"S_SCATTERRING2",
"S_SCATTERRING3",
"S_SCATTERRING4",
"S_SCATTERRING5",
"S_SCATTERRING6",
"S_SCATTERRING7",
"S_SCATTERRING8",
"S_SCATTERRING9",
"S_SCATTERRING10",
"S_SCATTERRING11",
"S_SCATTERRING12",
"S_SCATTERRING13",
"S_SCATTERRING14",
"S_SCATTERRING15",
"S_SCATTERRING16",
"S_SCATTERRING17",
"S_SCATTERRING18",
"S_SCATTERRING19",
"S_SCATTERRING20",
"S_SCATTERRING21",
"S_SCATTERRING22",
"S_SCATTERRING23",
"S_SCATTERRING24",
"S_SCATTERRING25",
"S_SCATTERRING26",
"S_SCATTERRING27",
"S_SCATTERRING28",
"S_SCATTERRING29",
"S_SCATTERRING30",
"S_SCATTERRING31",
"S_SCATTERRING32",
"S_SCATTERRING33",
"S_SCATTERRING34",
"S_SCATTERRING35",
// Grenade Ring
"S_GRENADERING1",
"S_GRENADERING2",
"S_GRENADERING3",
"S_GRENADERING4",
"S_GRENADERING5",
"S_GRENADERING6",
"S_GRENADERING7",
"S_GRENADERING8",
"S_GRENADERING9",
"S_GRENADERING10",
"S_GRENADERING11",
"S_GRENADERING12",
"S_GRENADERING13",
"S_GRENADERING14",
"S_GRENADERING15",
"S_GRENADERING16",
"S_GRENADERING17",
"S_GRENADERING18",
"S_GRENADERING19",
"S_GRENADERING20",
"S_GRENADERING21",
"S_GRENADERING22",
"S_GRENADERING23",
"S_GRENADERING24",
"S_GRENADERING25",
"S_GRENADERING26",
"S_GRENADERING27",
"S_GRENADERING28",
"S_GRENADERING29",
"S_GRENADERING30",
"S_GRENADERING31",
"S_GRENADERING32",
"S_GRENADERING33",
"S_GRENADERING34",
"S_GRENADERING35",
// Weapon pickup // Weapon pickup
"S_BOUNCEPICKUP1", "S_BOUNCEPICKUP",
"S_BOUNCEPICKUP2",
"S_BOUNCEPICKUP3",
"S_BOUNCEPICKUP4",
"S_BOUNCEPICKUP5",
"S_BOUNCEPICKUP6",
"S_BOUNCEPICKUP7",
"S_BOUNCEPICKUP8",
"S_BOUNCEPICKUP9",
"S_BOUNCEPICKUP10",
"S_BOUNCEPICKUP11",
"S_BOUNCEPICKUP12",
"S_BOUNCEPICKUP13",
"S_BOUNCEPICKUP14",
"S_BOUNCEPICKUP15",
"S_BOUNCEPICKUP16",
"S_BOUNCEPICKUPFADE1", "S_BOUNCEPICKUPFADE1",
"S_BOUNCEPICKUPFADE2", "S_BOUNCEPICKUPFADE2",
"S_BOUNCEPICKUPFADE3", "S_BOUNCEPICKUPFADE3",
@ -5956,23 +5584,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_BOUNCEPICKUPFADE7", "S_BOUNCEPICKUPFADE7",
"S_BOUNCEPICKUPFADE8", "S_BOUNCEPICKUPFADE8",
"S_RAILPICKUP1", "S_RAILPICKUP",
"S_RAILPICKUP2",
"S_RAILPICKUP3",
"S_RAILPICKUP4",
"S_RAILPICKUP5",
"S_RAILPICKUP6",
"S_RAILPICKUP7",
"S_RAILPICKUP8",
"S_RAILPICKUP9",
"S_RAILPICKUP10",
"S_RAILPICKUP11",
"S_RAILPICKUP12",
"S_RAILPICKUP13",
"S_RAILPICKUP14",
"S_RAILPICKUP15",
"S_RAILPICKUP16",
"S_RAILPICKUPFADE1", "S_RAILPICKUPFADE1",
"S_RAILPICKUPFADE2", "S_RAILPICKUPFADE2",
"S_RAILPICKUPFADE3", "S_RAILPICKUPFADE3",
@ -5982,23 +5594,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_RAILPICKUPFADE7", "S_RAILPICKUPFADE7",
"S_RAILPICKUPFADE8", "S_RAILPICKUPFADE8",
"S_AUTOPICKUP1", "S_AUTOPICKUP",
"S_AUTOPICKUP2",
"S_AUTOPICKUP3",
"S_AUTOPICKUP4",
"S_AUTOPICKUP5",
"S_AUTOPICKUP6",
"S_AUTOPICKUP7",
"S_AUTOPICKUP8",
"S_AUTOPICKUP9",
"S_AUTOPICKUP10",
"S_AUTOPICKUP11",
"S_AUTOPICKUP12",
"S_AUTOPICKUP13",
"S_AUTOPICKUP14",
"S_AUTOPICKUP15",
"S_AUTOPICKUP16",
"S_AUTOPICKUPFADE1", "S_AUTOPICKUPFADE1",
"S_AUTOPICKUPFADE2", "S_AUTOPICKUPFADE2",
"S_AUTOPICKUPFADE3", "S_AUTOPICKUPFADE3",
@ -6008,23 +5604,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_AUTOPICKUPFADE7", "S_AUTOPICKUPFADE7",
"S_AUTOPICKUPFADE8", "S_AUTOPICKUPFADE8",
"S_EXPLODEPICKUP1", "S_EXPLODEPICKUP",
"S_EXPLODEPICKUP2",
"S_EXPLODEPICKUP3",
"S_EXPLODEPICKUP4",
"S_EXPLODEPICKUP5",
"S_EXPLODEPICKUP6",
"S_EXPLODEPICKUP7",
"S_EXPLODEPICKUP8",
"S_EXPLODEPICKUP9",
"S_EXPLODEPICKUP10",
"S_EXPLODEPICKUP11",
"S_EXPLODEPICKUP12",
"S_EXPLODEPICKUP13",
"S_EXPLODEPICKUP14",
"S_EXPLODEPICKUP15",
"S_EXPLODEPICKUP16",
"S_EXPLODEPICKUPFADE1", "S_EXPLODEPICKUPFADE1",
"S_EXPLODEPICKUPFADE2", "S_EXPLODEPICKUPFADE2",
"S_EXPLODEPICKUPFADE3", "S_EXPLODEPICKUPFADE3",
@ -6034,23 +5614,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_EXPLODEPICKUPFADE7", "S_EXPLODEPICKUPFADE7",
"S_EXPLODEPICKUPFADE8", "S_EXPLODEPICKUPFADE8",
"S_SCATTERPICKUP1", "S_SCATTERPICKUP",
"S_SCATTERPICKUP2",
"S_SCATTERPICKUP3",
"S_SCATTERPICKUP4",
"S_SCATTERPICKUP5",
"S_SCATTERPICKUP6",
"S_SCATTERPICKUP7",
"S_SCATTERPICKUP8",
"S_SCATTERPICKUP9",
"S_SCATTERPICKUP10",
"S_SCATTERPICKUP11",
"S_SCATTERPICKUP12",
"S_SCATTERPICKUP13",
"S_SCATTERPICKUP14",
"S_SCATTERPICKUP15",
"S_SCATTERPICKUP16",
"S_SCATTERPICKUPFADE1", "S_SCATTERPICKUPFADE1",
"S_SCATTERPICKUPFADE2", "S_SCATTERPICKUPFADE2",
"S_SCATTERPICKUPFADE3", "S_SCATTERPICKUPFADE3",
@ -6060,23 +5624,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_SCATTERPICKUPFADE7", "S_SCATTERPICKUPFADE7",
"S_SCATTERPICKUPFADE8", "S_SCATTERPICKUPFADE8",
"S_GRENADEPICKUP1", "S_GRENADEPICKUP",
"S_GRENADEPICKUP2",
"S_GRENADEPICKUP3",
"S_GRENADEPICKUP4",
"S_GRENADEPICKUP5",
"S_GRENADEPICKUP6",
"S_GRENADEPICKUP7",
"S_GRENADEPICKUP8",
"S_GRENADEPICKUP9",
"S_GRENADEPICKUP10",
"S_GRENADEPICKUP11",
"S_GRENADEPICKUP12",
"S_GRENADEPICKUP13",
"S_GRENADEPICKUP14",
"S_GRENADEPICKUP15",
"S_GRENADEPICKUP16",
"S_GRENADEPICKUPFADE1", "S_GRENADEPICKUPFADE1",
"S_GRENADEPICKUPFADE2", "S_GRENADEPICKUPFADE2",
"S_GRENADEPICKUPFADE3", "S_GRENADEPICKUPFADE3",
@ -6457,101 +6005,22 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_ROCKSPAWN", "S_ROCKSPAWN",
"S_ROCKCRUMBLEA1", "S_ROCKCRUMBLEA",
"S_ROCKCRUMBLEA2", "S_ROCKCRUMBLEB",
"S_ROCKCRUMBLEA3", "S_ROCKCRUMBLEC",
"S_ROCKCRUMBLEA4", "S_ROCKCRUMBLED",
"S_ROCKCRUMBLEA5", "S_ROCKCRUMBLEE",
"S_ROCKCRUMBLEF",
"S_ROCKCRUMBLEB1", "S_ROCKCRUMBLEG",
"S_ROCKCRUMBLEB2", "S_ROCKCRUMBLEH",
"S_ROCKCRUMBLEB3", "S_ROCKCRUMBLEI",
"S_ROCKCRUMBLEB4", "S_ROCKCRUMBLEJ",
"S_ROCKCRUMBLEB5", "S_ROCKCRUMBLEK",
"S_ROCKCRUMBLEL",
"S_ROCKCRUMBLEC1", "S_ROCKCRUMBLEM",
"S_ROCKCRUMBLEC2", "S_ROCKCRUMBLEN",
"S_ROCKCRUMBLEC3", "S_ROCKCRUMBLEO",
"S_ROCKCRUMBLEC4", "S_ROCKCRUMBLEP",
"S_ROCKCRUMBLEC5",
"S_ROCKCRUMBLED1",
"S_ROCKCRUMBLED2",
"S_ROCKCRUMBLED3",
"S_ROCKCRUMBLED4",
"S_ROCKCRUMBLED5",
"S_ROCKCRUMBLEE1",
"S_ROCKCRUMBLEE2",
"S_ROCKCRUMBLEE3",
"S_ROCKCRUMBLEE4",
"S_ROCKCRUMBLEE5",
"S_ROCKCRUMBLEF1",
"S_ROCKCRUMBLEF2",
"S_ROCKCRUMBLEF3",
"S_ROCKCRUMBLEF4",
"S_ROCKCRUMBLEF5",
"S_ROCKCRUMBLEG1",
"S_ROCKCRUMBLEG2",
"S_ROCKCRUMBLEG3",
"S_ROCKCRUMBLEG4",
"S_ROCKCRUMBLEG5",
"S_ROCKCRUMBLEH1",
"S_ROCKCRUMBLEH2",
"S_ROCKCRUMBLEH3",
"S_ROCKCRUMBLEH4",
"S_ROCKCRUMBLEH5",
"S_ROCKCRUMBLEI1",
"S_ROCKCRUMBLEI2",
"S_ROCKCRUMBLEI3",
"S_ROCKCRUMBLEI4",
"S_ROCKCRUMBLEI5",
"S_ROCKCRUMBLEJ1",
"S_ROCKCRUMBLEJ2",
"S_ROCKCRUMBLEJ3",
"S_ROCKCRUMBLEJ4",
"S_ROCKCRUMBLEJ5",
"S_ROCKCRUMBLEK1",
"S_ROCKCRUMBLEK2",
"S_ROCKCRUMBLEK3",
"S_ROCKCRUMBLEK4",
"S_ROCKCRUMBLEK5",
"S_ROCKCRUMBLEL1",
"S_ROCKCRUMBLEL2",
"S_ROCKCRUMBLEL3",
"S_ROCKCRUMBLEL4",
"S_ROCKCRUMBLEL5",
"S_ROCKCRUMBLEM1",
"S_ROCKCRUMBLEM2",
"S_ROCKCRUMBLEM3",
"S_ROCKCRUMBLEM4",
"S_ROCKCRUMBLEM5",
"S_ROCKCRUMBLEN1",
"S_ROCKCRUMBLEN2",
"S_ROCKCRUMBLEN3",
"S_ROCKCRUMBLEN4",
"S_ROCKCRUMBLEN5",
"S_ROCKCRUMBLEO1",
"S_ROCKCRUMBLEO2",
"S_ROCKCRUMBLEO3",
"S_ROCKCRUMBLEO4",
"S_ROCKCRUMBLEO5",
"S_ROCKCRUMBLEP1",
"S_ROCKCRUMBLEP2",
"S_ROCKCRUMBLEP3",
"S_ROCKCRUMBLEP4",
"S_ROCKCRUMBLEP5",
"S_SRB1_CRAWLA1", "S_SRB1_CRAWLA1",
"S_SRB1_CRAWLA2", "S_SRB1_CRAWLA2",
@ -7486,6 +6955,7 @@ struct {
// Frame settings // Frame settings
{"FF_FRAMEMASK",FF_FRAMEMASK}, {"FF_FRAMEMASK",FF_FRAMEMASK},
{"FF_ANIMATE",FF_ANIMATE},
{"FF_FULLBRIGHT",FF_FULLBRIGHT}, {"FF_FULLBRIGHT",FF_FULLBRIGHT},
{"FF_TRANSMASK",FF_TRANSMASK}, {"FF_TRANSMASK",FF_TRANSMASK},
{"FF_TRANSSHIFT",FF_TRANSSHIFT}, {"FF_TRANSSHIFT",FF_TRANSSHIFT},

View file

@ -210,13 +210,6 @@ extern FILE *logstream;
// Note that we use this to help keep internal testing in check; this is why v2.1.0 is not version "1". // Note that we use this to help keep internal testing in check; this is why v2.1.0 is not version "1".
#define MODVERSION 20 #define MODVERSION 20
// some tests, enable or disable it if it run or not
#define SPLITSCREEN
// ========================================================================= // =========================================================================
// The maximum number of players, multiplayer/networking. // The maximum number of players, multiplayer/networking.
@ -356,11 +349,7 @@ void CONS_Debug(INT32 debugflags, const char *fmt, ...) FUNCDEBUG;
#include "m_swap.h" #include "m_swap.h"
// Things that used to be in dstrings.h // Things that used to be in dstrings.h
#define DEVMAPS "devmaps"
#define DEVDATA "devdata"
#define SAVEGAMENAME "srb2sav" #define SAVEGAMENAME "srb2sav"
char savegamename[256]; char savegamename[256];
// m_misc.h // m_misc.h

View file

@ -977,6 +977,7 @@ static const char *credits[] = {
"\"Monster\" Iestyn Jealous", "\"Monster\" Iestyn Jealous",
"Ronald \"Furyhunter\" Kinard", // The SDL2 port "Ronald \"Furyhunter\" Kinard", // The SDL2 port
"John \"JTE\" Muniz", "John \"JTE\" Muniz",
"Ehab \"Wolfy\" Saeed",
"\"SSNTails\"", "\"SSNTails\"",
"Matthew \"Inuyasha\" Walsh", "Matthew \"Inuyasha\" Walsh",
"", "",
@ -985,6 +986,7 @@ static const char *credits[] = {
"\"chi.miru\"", // Red's secret weapon, the REAL reason slopes exist (also helped port drawing code from ZDoom) "\"chi.miru\"", // Red's secret weapon, the REAL reason slopes exist (also helped port drawing code from ZDoom)
"Andrew \"orospakr\" Clunis", "Andrew \"orospakr\" Clunis",
"Gregor \"Oogaland\" Dick", "Gregor \"Oogaland\" Dick",
"Vivian \"toaster\" Grannell",
"Julio \"Chaos Zero 64\" Guir", "Julio \"Chaos Zero 64\" Guir",
"\"Kalaron\"", // Coded some of Sryder13's collection of OpenGL fixes, especially fog "\"Kalaron\"", // Coded some of Sryder13's collection of OpenGL fixes, especially fog
"Matthew \"Shuffle\" Marsalko", "Matthew \"Shuffle\" Marsalko",
@ -1001,6 +1003,7 @@ static const char *credits[] = {
"Desmond \"Blade\" DesJardins", "Desmond \"Blade\" DesJardins",
"Sherman \"CoatRack\" DesJardins", "Sherman \"CoatRack\" DesJardins",
"Andrew \"Senku Niola\" Moran", "Andrew \"Senku Niola\" Moran",
"Vivian \"toaster\" Grannell",
"David \"Instant Sonic\" Spencer Jr.", "David \"Instant Sonic\" Spencer Jr.",
"\"SSNTails\"", "\"SSNTails\"",
"", "",
@ -1020,7 +1023,7 @@ static const char *credits[] = {
"\"Monster\" Iestyn Jealous", "\"Monster\" Iestyn Jealous",
"Jarel \"Arrow\" Jones", "Jarel \"Arrow\" Jones",
"Stefan \"Stuf\" Rimalia", "Stefan \"Stuf\" Rimalia",
"Shane Strife", "Shane Mychal Sexton",
"\"Spazzo\"", "\"Spazzo\"",
"David \"Big Wave Dave\" Spencer Sr.", "David \"Big Wave Dave\" Spencer Sr.",
"David \"Instant Sonic\" Spencer Jr.", "David \"Instant Sonic\" Spencer Jr.",
@ -1033,6 +1036,7 @@ static const char *credits[] = {
"Sherman \"CoatRack\" DesJardins", "Sherman \"CoatRack\" DesJardins",
"Ben \"Mystic\" Geyer", "Ben \"Mystic\" Geyer",
"Nathan \"Jazz\" Giroux", "Nathan \"Jazz\" Giroux",
"Vivian \"toaster\" Grannell",
"Dan \"Blitzzo\" Hagerstrand", "Dan \"Blitzzo\" Hagerstrand",
"Kepa \"Nev3r\" Iceta", "Kepa \"Nev3r\" Iceta",
"Thomas \"Shadow Hog\" Igoe", "Thomas \"Shadow Hog\" Igoe",
@ -1069,7 +1073,7 @@ static const char *credits[] = {
"iD Software", "iD Software",
"Alex \"MistaED\" Fuller", "Alex \"MistaED\" Fuller",
"FreeDoom Project", // Used some of the mancubus and rocket launcher sprites for Brak "FreeDoom Project", // Used some of the mancubus and rocket launcher sprites for Brak
"Randy Heit (<!>)", // For his MSPaint <!> sprite that we nicked "Randi Heit (<!>)", // For their MSPaint <!> sprite that we nicked
"", "",
"\1Produced By", "\1Produced By",
"Sonic Team Junior", "Sonic Team Junior",

View file

@ -90,6 +90,7 @@ enum
// custom intermissions // custom intermissions
wipe_specinter_toblack, wipe_specinter_toblack,
wipe_multinter_toblack, wipe_multinter_toblack,
wipe_speclevel_towhite,
wipe_level_final, wipe_level_final,
wipe_intermission_final, wipe_intermission_final,
@ -108,7 +109,7 @@ enum
NUMWIPEDEFS NUMWIPEDEFS
}; };
#define WIPEFINALSHIFT 12 #define WIPEFINALSHIFT 13
extern UINT8 wipedefs[NUMWIPEDEFS]; extern UINT8 wipedefs[NUMWIPEDEFS];
#endif #endif

View file

@ -58,6 +58,7 @@ UINT8 wipedefs[NUMWIPEDEFS] = {
0, // wipe_specinter_toblack 0, // wipe_specinter_toblack
0, // wipe_multinter_toblack 0, // wipe_multinter_toblack
0, // wipe_speclevel_towhite
0, // wipe_level_final 0, // wipe_level_final
0, // wipe_intermission_final 0, // wipe_intermission_final

View file

@ -4336,10 +4336,8 @@ void G_GhostTicker(void)
switch(g->color) switch(g->color)
{ {
case GHC_SUPER: // Super Sonic (P_DoSuperStuff) case GHC_SUPER: // Super Sonic (P_DoSuperStuff)
if (leveltime % 9 < 5) g->mo->color = SKINCOLOR_SUPER1;
g->mo->color = SKINCOLOR_SUPER1 + leveltime % 9; g->mo->color += abs( ( ( leveltime >> 1 ) % 9) - 4);
else
g->mo->color = SKINCOLOR_SUPER1 + 9 - leveltime % 9;
break; break;
case GHC_INVINCIBLE: // Mario invincibility (P_CheckInvincibilityTimer) case GHC_INVINCIBLE: // Mario invincibility (P_CheckInvincibilityTimer)
g->mo->color = (UINT8)(leveltime % MAXSKINCOLORS); g->mo->color = (UINT8)(leveltime % MAXSKINCOLORS);

View file

@ -1493,16 +1493,37 @@ void HWR_DrawMD2(gr_vissprite_t *spr)
HWR_GetMappedPatch(gpatch, spr->colormap); HWR_GetMappedPatch(gpatch, spr->colormap);
} }
if (spr->mobj->frame & FF_ANIMATE)
{
// set duration and tics to be the correct values for FF_ANIMATE states
durs = spr->mobj->state->var2;
tics = spr->mobj->anim_duration;
}
//FIXME: this is not yet correct //FIXME: this is not yet correct
frame = (spr->mobj->frame & FF_FRAMEMASK) % md2->model->header.numFrames; frame = (spr->mobj->frame & FF_FRAMEMASK) % md2->model->header.numFrames;
buff = md2->model->glCommandBuffer; buff = md2->model->glCommandBuffer;
curr = &md2->model->frames[frame]; curr = &md2->model->frames[frame];
if (cv_grmd2.value == 1 if (cv_grmd2.value == 1)
&& spr->mobj->state->nextstate != S_NULL && states[spr->mobj->state->nextstate].sprite != SPR_NULL
&& !(spr->mobj->player && spr->mobj->state->nextstate == S_PLAY_WAIT && spr->mobj->state == &states[S_PLAY_STND]))
{ {
const INT32 nextframe = (states[spr->mobj->state->nextstate].frame & FF_FRAMEMASK) % md2->model->header.numFrames; // frames are handled differently for states with FF_ANIMATE, so get the next frame differently for the interpolation
next = &md2->model->frames[nextframe]; if (spr->mobj->frame & FF_ANIMATE)
{
UINT32 nextframe = (spr->mobj->frame & FF_FRAMEMASK) + 1;
if (nextframe >= (UINT32)spr->mobj->state->var1)
nextframe = (spr->mobj->state->frame & FF_FRAMEMASK);
nextframe %= md2->model->header.numFrames;
next = &md2->model->frames[nextframe];
}
else
{
if (spr->mobj->state->nextstate != S_NULL && states[spr->mobj->state->nextstate].sprite != SPR_NULL
&& !(spr->mobj->player && spr->mobj->state->nextstate == S_PLAY_WAIT && spr->mobj->state == &states[S_PLAY_STND]))
{
const UINT32 nextframe = (states[spr->mobj->state->nextstate].frame & FF_FRAMEMASK) % md2->model->header.numFrames;
next = &md2->model->frames[nextframe];
}
}
} }
//Hurdler: it seems there is still a small problem with mobj angle //Hurdler: it seems there is still a small problem with mobj angle

File diff suppressed because it is too large Load diff

View file

@ -1479,30 +1479,7 @@ typedef enum state
S_MSSHIELD_F12, S_MSSHIELD_F12,
// Ring // Ring
S_RING1, S_RING,
S_RING2,
S_RING3,
S_RING4,
S_RING5,
S_RING6,
S_RING7,
S_RING8,
S_RING9,
S_RING10,
S_RING11,
S_RING12,
S_RING13,
S_RING14,
S_RING15,
S_RING16,
S_RING17,
S_RING18,
S_RING19,
S_RING20,
S_RING21,
S_RING22,
S_RING23,
S_RING24,
// Blue Sphere for special stages // Blue Sphere for special stages
S_BLUEBALL, S_BLUEBALL,
@ -1518,39 +1495,10 @@ typedef enum state
S_GRAVWELLRED3, S_GRAVWELLRED3,
// Individual Team Rings // Individual Team Rings
S_TEAMRING1, S_TEAMRING,
S_TEAMRING2,
S_TEAMRING3,
S_TEAMRING4,
S_TEAMRING5,
S_TEAMRING6,
S_TEAMRING7,
S_TEAMRING8,
S_TEAMRING9,
S_TEAMRING10,
S_TEAMRING11,
S_TEAMRING12,
S_TEAMRING13,
S_TEAMRING14,
S_TEAMRING15,
S_TEAMRING16,
S_TEAMRING17,
S_TEAMRING18,
S_TEAMRING19,
S_TEAMRING20,
S_TEAMRING21,
S_TEAMRING22,
S_TEAMRING23,
S_TEAMRING24,
// Special Stage Token // Special Stage Token
S_EMMY1, S_EMMY,
S_EMMY2,
S_EMMY3,
S_EMMY4,
S_EMMY5,
S_EMMY6,
S_EMMY7,
// Special Stage Token // Special Stage Token
S_TOKEN, S_TOKEN,
@ -1704,40 +1652,9 @@ typedef enum state
S_SPIKED2, S_SPIKED2,
// Starpost // Starpost
S_STARPOST1, S_STARPOST_IDLE,
S_STARPOST2, S_STARPOST_FLASH,
S_STARPOST3, S_STARPOST_SPIN,
S_STARPOST4,
S_STARPOST5,
S_STARPOST6,
S_STARPOST7,
S_STARPOST8,
S_STARPOST9,
S_STARPOST10,
S_STARPOST11,
S_STARPOST12,
S_STARPOST13,
S_STARPOST14,
S_STARPOST15,
S_STARPOST16,
S_STARPOST17,
S_STARPOST18,
S_STARPOST19,
S_STARPOST20,
S_STARPOST21,
S_STARPOST22,
S_STARPOST23,
S_STARPOST24,
S_STARPOST25,
S_STARPOST26,
S_STARPOST27,
S_STARPOST28,
S_STARPOST29,
S_STARPOST30,
S_STARPOST31,
S_STARPOST32,
S_STARPOST33,
S_STARPOST34,
// Big floating mine // Big floating mine
S_BIGMINE1, S_BIGMINE1,
@ -2345,38 +2262,7 @@ typedef enum state
S_PITY10, S_PITY10,
// Invincibility Sparkles // Invincibility Sparkles
S_IVSP1, S_IVSP,
S_IVSP2,
S_IVSP3,
S_IVSP4,
S_IVSP5,
S_IVSP6,
S_IVSP7,
S_IVSP8,
S_IVSP9,
S_IVSP10,
S_IVSP11,
S_IVSP12,
S_IVSP13,
S_IVSP14,
S_IVSP15,
S_IVSP16,
S_IVSP17,
S_IVSP18,
S_IVSP19,
S_IVSP20,
S_IVSP21,
S_IVSP22,
S_IVSP23,
S_IVSP24,
S_IVSP25,
S_IVSP26,
S_IVSP27,
S_IVSP28,
S_IVSP29,
S_IVSP30,
S_IVSP31,
S_IVSP32,
// Super Sonic Spark // Super Sonic Spark
S_SSPK1, S_SSPK1,
@ -2563,283 +2449,17 @@ typedef enum state
S_RRNG6, S_RRNG6,
S_RRNG7, S_RRNG7,
// Bounce Ring // Weapon Ring Ammo
S_BOUNCERING1, S_BOUNCERINGAMMO,
S_BOUNCERING2, S_RAILRINGAMMO,
S_BOUNCERING3, S_INFINITYRINGAMMO,
S_BOUNCERING4, S_AUTOMATICRINGAMMO,
S_BOUNCERING5, S_EXPLOSIONRINGAMMO,
S_BOUNCERING6, S_SCATTERRINGAMMO,
S_BOUNCERING7, S_GRENADERINGAMMO,
S_BOUNCERING8,
S_BOUNCERING9,
S_BOUNCERING10,
S_BOUNCERING11,
S_BOUNCERING12,
S_BOUNCERING13,
S_BOUNCERING14,
S_BOUNCERING15,
S_BOUNCERING16,
S_BOUNCERING17,
S_BOUNCERING18,
S_BOUNCERING19,
S_BOUNCERING20,
S_BOUNCERING21,
S_BOUNCERING22,
S_BOUNCERING23,
S_BOUNCERING24,
S_BOUNCERING25,
S_BOUNCERING26,
S_BOUNCERING27,
S_BOUNCERING28,
S_BOUNCERING29,
S_BOUNCERING30,
S_BOUNCERING31,
S_BOUNCERING32,
S_BOUNCERING33,
S_BOUNCERING34,
S_BOUNCERING35,
// Rail Ring
S_RAILRING1,
S_RAILRING2,
S_RAILRING3,
S_RAILRING4,
S_RAILRING5,
S_RAILRING6,
S_RAILRING7,
S_RAILRING8,
S_RAILRING9,
S_RAILRING10,
S_RAILRING11,
S_RAILRING12,
S_RAILRING13,
S_RAILRING14,
S_RAILRING15,
S_RAILRING16,
S_RAILRING17,
S_RAILRING18,
S_RAILRING19,
S_RAILRING20,
S_RAILRING21,
S_RAILRING22,
S_RAILRING23,
S_RAILRING24,
S_RAILRING25,
S_RAILRING26,
S_RAILRING27,
S_RAILRING28,
S_RAILRING29,
S_RAILRING30,
S_RAILRING31,
S_RAILRING32,
S_RAILRING33,
S_RAILRING34,
S_RAILRING35,
// Infinity Ring
S_INFINITYRING1,
S_INFINITYRING2,
S_INFINITYRING3,
S_INFINITYRING4,
S_INFINITYRING5,
S_INFINITYRING6,
S_INFINITYRING7,
S_INFINITYRING8,
S_INFINITYRING9,
S_INFINITYRING10,
S_INFINITYRING11,
S_INFINITYRING12,
S_INFINITYRING13,
S_INFINITYRING14,
S_INFINITYRING15,
S_INFINITYRING16,
S_INFINITYRING17,
S_INFINITYRING18,
S_INFINITYRING19,
S_INFINITYRING20,
S_INFINITYRING21,
S_INFINITYRING22,
S_INFINITYRING23,
S_INFINITYRING24,
S_INFINITYRING25,
S_INFINITYRING26,
S_INFINITYRING27,
S_INFINITYRING28,
S_INFINITYRING29,
S_INFINITYRING30,
S_INFINITYRING31,
S_INFINITYRING32,
S_INFINITYRING33,
S_INFINITYRING34,
S_INFINITYRING35,
// Automatic Ring
S_AUTOMATICRING1,
S_AUTOMATICRING2,
S_AUTOMATICRING3,
S_AUTOMATICRING4,
S_AUTOMATICRING5,
S_AUTOMATICRING6,
S_AUTOMATICRING7,
S_AUTOMATICRING8,
S_AUTOMATICRING9,
S_AUTOMATICRING10,
S_AUTOMATICRING11,
S_AUTOMATICRING12,
S_AUTOMATICRING13,
S_AUTOMATICRING14,
S_AUTOMATICRING15,
S_AUTOMATICRING16,
S_AUTOMATICRING17,
S_AUTOMATICRING18,
S_AUTOMATICRING19,
S_AUTOMATICRING20,
S_AUTOMATICRING21,
S_AUTOMATICRING22,
S_AUTOMATICRING23,
S_AUTOMATICRING24,
S_AUTOMATICRING25,
S_AUTOMATICRING26,
S_AUTOMATICRING27,
S_AUTOMATICRING28,
S_AUTOMATICRING29,
S_AUTOMATICRING30,
S_AUTOMATICRING31,
S_AUTOMATICRING32,
S_AUTOMATICRING33,
S_AUTOMATICRING34,
S_AUTOMATICRING35,
// Explosion Ring
S_EXPLOSIONRING1,
S_EXPLOSIONRING2,
S_EXPLOSIONRING3,
S_EXPLOSIONRING4,
S_EXPLOSIONRING5,
S_EXPLOSIONRING6,
S_EXPLOSIONRING7,
S_EXPLOSIONRING8,
S_EXPLOSIONRING9,
S_EXPLOSIONRING10,
S_EXPLOSIONRING11,
S_EXPLOSIONRING12,
S_EXPLOSIONRING13,
S_EXPLOSIONRING14,
S_EXPLOSIONRING15,
S_EXPLOSIONRING16,
S_EXPLOSIONRING17,
S_EXPLOSIONRING18,
S_EXPLOSIONRING19,
S_EXPLOSIONRING20,
S_EXPLOSIONRING21,
S_EXPLOSIONRING22,
S_EXPLOSIONRING23,
S_EXPLOSIONRING24,
S_EXPLOSIONRING25,
S_EXPLOSIONRING26,
S_EXPLOSIONRING27,
S_EXPLOSIONRING28,
S_EXPLOSIONRING29,
S_EXPLOSIONRING30,
S_EXPLOSIONRING31,
S_EXPLOSIONRING32,
S_EXPLOSIONRING33,
S_EXPLOSIONRING34,
S_EXPLOSIONRING35,
// Scatter Ring
S_SCATTERRING1,
S_SCATTERRING2,
S_SCATTERRING3,
S_SCATTERRING4,
S_SCATTERRING5,
S_SCATTERRING6,
S_SCATTERRING7,
S_SCATTERRING8,
S_SCATTERRING9,
S_SCATTERRING10,
S_SCATTERRING11,
S_SCATTERRING12,
S_SCATTERRING13,
S_SCATTERRING14,
S_SCATTERRING15,
S_SCATTERRING16,
S_SCATTERRING17,
S_SCATTERRING18,
S_SCATTERRING19,
S_SCATTERRING20,
S_SCATTERRING21,
S_SCATTERRING22,
S_SCATTERRING23,
S_SCATTERRING24,
S_SCATTERRING25,
S_SCATTERRING26,
S_SCATTERRING27,
S_SCATTERRING28,
S_SCATTERRING29,
S_SCATTERRING30,
S_SCATTERRING31,
S_SCATTERRING32,
S_SCATTERRING33,
S_SCATTERRING34,
S_SCATTERRING35,
// Grenade Ring
S_GRENADERING1,
S_GRENADERING2,
S_GRENADERING3,
S_GRENADERING4,
S_GRENADERING5,
S_GRENADERING6,
S_GRENADERING7,
S_GRENADERING8,
S_GRENADERING9,
S_GRENADERING10,
S_GRENADERING11,
S_GRENADERING12,
S_GRENADERING13,
S_GRENADERING14,
S_GRENADERING15,
S_GRENADERING16,
S_GRENADERING17,
S_GRENADERING18,
S_GRENADERING19,
S_GRENADERING20,
S_GRENADERING21,
S_GRENADERING22,
S_GRENADERING23,
S_GRENADERING24,
S_GRENADERING25,
S_GRENADERING26,
S_GRENADERING27,
S_GRENADERING28,
S_GRENADERING29,
S_GRENADERING30,
S_GRENADERING31,
S_GRENADERING32,
S_GRENADERING33,
S_GRENADERING34,
S_GRENADERING35,
// Weapon pickup // Weapon pickup
S_BOUNCEPICKUP1, S_BOUNCEPICKUP,
S_BOUNCEPICKUP2,
S_BOUNCEPICKUP3,
S_BOUNCEPICKUP4,
S_BOUNCEPICKUP5,
S_BOUNCEPICKUP6,
S_BOUNCEPICKUP7,
S_BOUNCEPICKUP8,
S_BOUNCEPICKUP9,
S_BOUNCEPICKUP10,
S_BOUNCEPICKUP11,
S_BOUNCEPICKUP12,
S_BOUNCEPICKUP13,
S_BOUNCEPICKUP14,
S_BOUNCEPICKUP15,
S_BOUNCEPICKUP16,
S_BOUNCEPICKUPFADE1, S_BOUNCEPICKUPFADE1,
S_BOUNCEPICKUPFADE2, S_BOUNCEPICKUPFADE2,
S_BOUNCEPICKUPFADE3, S_BOUNCEPICKUPFADE3,
@ -2849,23 +2469,7 @@ typedef enum state
S_BOUNCEPICKUPFADE7, S_BOUNCEPICKUPFADE7,
S_BOUNCEPICKUPFADE8, S_BOUNCEPICKUPFADE8,
S_RAILPICKUP1, S_RAILPICKUP,
S_RAILPICKUP2,
S_RAILPICKUP3,
S_RAILPICKUP4,
S_RAILPICKUP5,
S_RAILPICKUP6,
S_RAILPICKUP7,
S_RAILPICKUP8,
S_RAILPICKUP9,
S_RAILPICKUP10,
S_RAILPICKUP11,
S_RAILPICKUP12,
S_RAILPICKUP13,
S_RAILPICKUP14,
S_RAILPICKUP15,
S_RAILPICKUP16,
S_RAILPICKUPFADE1, S_RAILPICKUPFADE1,
S_RAILPICKUPFADE2, S_RAILPICKUPFADE2,
S_RAILPICKUPFADE3, S_RAILPICKUPFADE3,
@ -2875,23 +2479,7 @@ typedef enum state
S_RAILPICKUPFADE7, S_RAILPICKUPFADE7,
S_RAILPICKUPFADE8, S_RAILPICKUPFADE8,
S_AUTOPICKUP1, S_AUTOPICKUP,
S_AUTOPICKUP2,
S_AUTOPICKUP3,
S_AUTOPICKUP4,
S_AUTOPICKUP5,
S_AUTOPICKUP6,
S_AUTOPICKUP7,
S_AUTOPICKUP8,
S_AUTOPICKUP9,
S_AUTOPICKUP10,
S_AUTOPICKUP11,
S_AUTOPICKUP12,
S_AUTOPICKUP13,
S_AUTOPICKUP14,
S_AUTOPICKUP15,
S_AUTOPICKUP16,
S_AUTOPICKUPFADE1, S_AUTOPICKUPFADE1,
S_AUTOPICKUPFADE2, S_AUTOPICKUPFADE2,
S_AUTOPICKUPFADE3, S_AUTOPICKUPFADE3,
@ -2901,23 +2489,7 @@ typedef enum state
S_AUTOPICKUPFADE7, S_AUTOPICKUPFADE7,
S_AUTOPICKUPFADE8, S_AUTOPICKUPFADE8,
S_EXPLODEPICKUP1, S_EXPLODEPICKUP,
S_EXPLODEPICKUP2,
S_EXPLODEPICKUP3,
S_EXPLODEPICKUP4,
S_EXPLODEPICKUP5,
S_EXPLODEPICKUP6,
S_EXPLODEPICKUP7,
S_EXPLODEPICKUP8,
S_EXPLODEPICKUP9,
S_EXPLODEPICKUP10,
S_EXPLODEPICKUP11,
S_EXPLODEPICKUP12,
S_EXPLODEPICKUP13,
S_EXPLODEPICKUP14,
S_EXPLODEPICKUP15,
S_EXPLODEPICKUP16,
S_EXPLODEPICKUPFADE1, S_EXPLODEPICKUPFADE1,
S_EXPLODEPICKUPFADE2, S_EXPLODEPICKUPFADE2,
S_EXPLODEPICKUPFADE3, S_EXPLODEPICKUPFADE3,
@ -2927,23 +2499,7 @@ typedef enum state
S_EXPLODEPICKUPFADE7, S_EXPLODEPICKUPFADE7,
S_EXPLODEPICKUPFADE8, S_EXPLODEPICKUPFADE8,
S_SCATTERPICKUP1, S_SCATTERPICKUP,
S_SCATTERPICKUP2,
S_SCATTERPICKUP3,
S_SCATTERPICKUP4,
S_SCATTERPICKUP5,
S_SCATTERPICKUP6,
S_SCATTERPICKUP7,
S_SCATTERPICKUP8,
S_SCATTERPICKUP9,
S_SCATTERPICKUP10,
S_SCATTERPICKUP11,
S_SCATTERPICKUP12,
S_SCATTERPICKUP13,
S_SCATTERPICKUP14,
S_SCATTERPICKUP15,
S_SCATTERPICKUP16,
S_SCATTERPICKUPFADE1, S_SCATTERPICKUPFADE1,
S_SCATTERPICKUPFADE2, S_SCATTERPICKUPFADE2,
S_SCATTERPICKUPFADE3, S_SCATTERPICKUPFADE3,
@ -2953,23 +2509,7 @@ typedef enum state
S_SCATTERPICKUPFADE7, S_SCATTERPICKUPFADE7,
S_SCATTERPICKUPFADE8, S_SCATTERPICKUPFADE8,
S_GRENADEPICKUP1, S_GRENADEPICKUP,
S_GRENADEPICKUP2,
S_GRENADEPICKUP3,
S_GRENADEPICKUP4,
S_GRENADEPICKUP5,
S_GRENADEPICKUP6,
S_GRENADEPICKUP7,
S_GRENADEPICKUP8,
S_GRENADEPICKUP9,
S_GRENADEPICKUP10,
S_GRENADEPICKUP11,
S_GRENADEPICKUP12,
S_GRENADEPICKUP13,
S_GRENADEPICKUP14,
S_GRENADEPICKUP15,
S_GRENADEPICKUP16,
S_GRENADEPICKUPFADE1, S_GRENADEPICKUPFADE1,
S_GRENADEPICKUPFADE2, S_GRENADEPICKUPFADE2,
S_GRENADEPICKUPFADE3, S_GRENADEPICKUPFADE3,
@ -3350,101 +2890,22 @@ typedef enum state
S_ROCKSPAWN, S_ROCKSPAWN,
S_ROCKCRUMBLEA1, S_ROCKCRUMBLEA,
S_ROCKCRUMBLEA2, S_ROCKCRUMBLEB,
S_ROCKCRUMBLEA3, S_ROCKCRUMBLEC,
S_ROCKCRUMBLEA4, S_ROCKCRUMBLED,
S_ROCKCRUMBLEA5, S_ROCKCRUMBLEE,
S_ROCKCRUMBLEF,
S_ROCKCRUMBLEB1, S_ROCKCRUMBLEG,
S_ROCKCRUMBLEB2, S_ROCKCRUMBLEH,
S_ROCKCRUMBLEB3, S_ROCKCRUMBLEI,
S_ROCKCRUMBLEB4, S_ROCKCRUMBLEJ,
S_ROCKCRUMBLEB5, S_ROCKCRUMBLEK,
S_ROCKCRUMBLEL,
S_ROCKCRUMBLEC1, S_ROCKCRUMBLEM,
S_ROCKCRUMBLEC2, S_ROCKCRUMBLEN,
S_ROCKCRUMBLEC3, S_ROCKCRUMBLEO,
S_ROCKCRUMBLEC4, S_ROCKCRUMBLEP,
S_ROCKCRUMBLEC5,
S_ROCKCRUMBLED1,
S_ROCKCRUMBLED2,
S_ROCKCRUMBLED3,
S_ROCKCRUMBLED4,
S_ROCKCRUMBLED5,
S_ROCKCRUMBLEE1,
S_ROCKCRUMBLEE2,
S_ROCKCRUMBLEE3,
S_ROCKCRUMBLEE4,
S_ROCKCRUMBLEE5,
S_ROCKCRUMBLEF1,
S_ROCKCRUMBLEF2,
S_ROCKCRUMBLEF3,
S_ROCKCRUMBLEF4,
S_ROCKCRUMBLEF5,
S_ROCKCRUMBLEG1,
S_ROCKCRUMBLEG2,
S_ROCKCRUMBLEG3,
S_ROCKCRUMBLEG4,
S_ROCKCRUMBLEG5,
S_ROCKCRUMBLEH1,
S_ROCKCRUMBLEH2,
S_ROCKCRUMBLEH3,
S_ROCKCRUMBLEH4,
S_ROCKCRUMBLEH5,
S_ROCKCRUMBLEI1,
S_ROCKCRUMBLEI2,
S_ROCKCRUMBLEI3,
S_ROCKCRUMBLEI4,
S_ROCKCRUMBLEI5,
S_ROCKCRUMBLEJ1,
S_ROCKCRUMBLEJ2,
S_ROCKCRUMBLEJ3,
S_ROCKCRUMBLEJ4,
S_ROCKCRUMBLEJ5,
S_ROCKCRUMBLEK1,
S_ROCKCRUMBLEK2,
S_ROCKCRUMBLEK3,
S_ROCKCRUMBLEK4,
S_ROCKCRUMBLEK5,
S_ROCKCRUMBLEL1,
S_ROCKCRUMBLEL2,
S_ROCKCRUMBLEL3,
S_ROCKCRUMBLEL4,
S_ROCKCRUMBLEL5,
S_ROCKCRUMBLEM1,
S_ROCKCRUMBLEM2,
S_ROCKCRUMBLEM3,
S_ROCKCRUMBLEM4,
S_ROCKCRUMBLEM5,
S_ROCKCRUMBLEN1,
S_ROCKCRUMBLEN2,
S_ROCKCRUMBLEN3,
S_ROCKCRUMBLEN4,
S_ROCKCRUMBLEN5,
S_ROCKCRUMBLEO1,
S_ROCKCRUMBLEO2,
S_ROCKCRUMBLEO3,
S_ROCKCRUMBLEO4,
S_ROCKCRUMBLEO5,
S_ROCKCRUMBLEP1,
S_ROCKCRUMBLEP2,
S_ROCKCRUMBLEP3,
S_ROCKCRUMBLEP4,
S_ROCKCRUMBLEP5,
S_SRB1_CRAWLA1, S_SRB1_CRAWLA1,
S_SRB1_CRAWLA2, S_SRB1_CRAWLA2,

View file

@ -1111,9 +1111,13 @@ static int ffloor_set(lua_State *L)
case ffloor_bottompic: case ffloor_bottompic:
*ffloor->bottompic = P_AddLevelFlatRuntime(luaL_checkstring(L, 3)); *ffloor->bottompic = P_AddLevelFlatRuntime(luaL_checkstring(L, 3));
break; break;
case ffloor_flags: case ffloor_flags: {
ffloortype_e oldflags = ffloor->flags; // store FOF's old flags
ffloor->flags = luaL_checkinteger(L, 3); ffloor->flags = luaL_checkinteger(L, 3);
if (ffloor->flags != oldflags)
ffloor->target->moved = true; // reset target sector's lightlist
break; break;
}
case ffloor_alpha: case ffloor_alpha:
ffloor->alpha = (INT32)luaL_checkinteger(L, 3); ffloor->alpha = (INT32)luaL_checkinteger(L, 3);
break; break;

View file

@ -34,6 +34,7 @@ enum mobj_e {
mobj_angle, mobj_angle,
mobj_sprite, mobj_sprite,
mobj_frame, mobj_frame,
mobj_anim_duration,
mobj_touching_sectorlist, mobj_touching_sectorlist,
mobj_subsector, mobj_subsector,
mobj_floorz, mobj_floorz,
@ -92,6 +93,7 @@ static const char *const mobj_opt[] = {
"angle", "angle",
"sprite", "sprite",
"frame", "frame",
"anim_duration",
"touching_sectorlist", "touching_sectorlist",
"subsector", "subsector",
"floorz", "floorz",
@ -187,6 +189,9 @@ static int mobj_get(lua_State *L)
case mobj_frame: case mobj_frame:
lua_pushinteger(L, mo->frame); lua_pushinteger(L, mo->frame);
break; break;
case mobj_anim_duration:
lua_pushinteger(L, mo->anim_duration);
break;
case mobj_touching_sectorlist: case mobj_touching_sectorlist:
return UNIMPLEMENTED; return UNIMPLEMENTED;
case mobj_subsector: case mobj_subsector:
@ -406,6 +411,9 @@ static int mobj_set(lua_State *L)
case mobj_frame: case mobj_frame:
mo->frame = (UINT32)luaL_checkinteger(L, 3); mo->frame = (UINT32)luaL_checkinteger(L, 3);
break; break;
case mobj_anim_duration:
mo->anim_duration = (UINT16)luaL_checkinteger(L, 3);
break;
case mobj_touching_sectorlist: case mobj_touching_sectorlist:
return UNIMPLEMENTED; return UNIMPLEMENTED;
case mobj_subsector: case mobj_subsector:

View file

@ -1339,6 +1339,9 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
} }
else else
player->pflags |= PF_ITEMHANG; player->pflags |= PF_ITEMHANG;
// Can't jump first frame
player->pflags |= PF_JUMPSTASIS;
return; return;
case MT_BIGMINE: case MT_BIGMINE:
case MT_BIGAIRMINE: case MT_BIGAIRMINE:

View file

@ -212,6 +212,7 @@ void P_RemoveSavegameMobj(mobj_t *th);
boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state); boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state);
boolean P_SetMobjState(mobj_t *mobj, statenum_t state); boolean P_SetMobjState(mobj_t *mobj, statenum_t state);
void P_RunShields(void); void P_RunShields(void);
void P_RunOverlays(void);
void P_MobjThinker(mobj_t *mobj); void P_MobjThinker(mobj_t *mobj);
boolean P_RailThinker(mobj_t *mobj); boolean P_RailThinker(mobj_t *mobj);
void P_PushableThinker(mobj_t *mobj); void P_PushableThinker(mobj_t *mobj);

View file

@ -503,7 +503,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
return true; // overhead return true; // overhead
if (thing->z + thing->height < tmthing->z) if (thing->z + thing->height < tmthing->z)
return true; // underneath return true; // underneath
if (tmthing->player && tmthing->flags & MF_SHOOTABLE) if (tmthing->player && tmthing->flags & MF_SHOOTABLE && thing->health > 0)
{ {
UINT8 damagetype = 0; UINT8 damagetype = 0;
if (thing->flags & MF_FIRE) // BURN! if (thing->flags & MF_FIRE) // BURN!
@ -519,7 +519,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
return true; // overhead return true; // overhead
if (tmthing->z + tmthing->height < thing->z) if (tmthing->z + tmthing->height < thing->z)
return true; // underneath return true; // underneath
if (thing->player && thing->flags & MF_SHOOTABLE) if (thing->player && thing->flags & MF_SHOOTABLE && tmthing->health > 0)
{ {
UINT8 damagetype = 0; UINT8 damagetype = 0;
if (tmthing->flags & MF_FIRE) // BURN! if (tmthing->flags & MF_FIRE) // BURN!

View file

@ -79,11 +79,31 @@ void P_AddCachedAction(mobj_t *mobj, INT32 statenum)
actioncachehead.prev = newaction; actioncachehead.prev = newaction;
} }
//
// P_CycleStateAnimation
//
FUNCINLINE static ATTRINLINE void P_CycleStateAnimation(mobj_t *mobj)
{
// var2 determines delay between animation frames
if (!(mobj->frame & FF_ANIMATE) || --mobj->anim_duration != 0)
return;
mobj->anim_duration = (UINT16)mobj->state->var2;
// compare the current sprite frame to the one we started from
// if more than var1 away from it, swap back to the original
// else just advance by one
if (((++mobj->frame) & FF_FRAMEMASK) - (mobj->state->frame & FF_FRAMEMASK) > (UINT32)mobj->state->var1)
mobj->frame = (mobj->state->frame & FF_FRAMEMASK) | (mobj->frame & ~FF_FRAMEMASK);
}
// //
// P_CycleMobjState // P_CycleMobjState
// //
static void P_CycleMobjState(mobj_t *mobj) static void P_CycleMobjState(mobj_t *mobj)
{ {
// state animations
P_CycleStateAnimation(mobj);
// cycle through states, // cycle through states,
// calling action functions at transitions // calling action functions at transitions
if (mobj->tics != -1) if (mobj->tics != -1)
@ -102,6 +122,9 @@ static void P_CycleMobjState(mobj_t *mobj)
// //
static void P_CyclePlayerMobjState(mobj_t *mobj) static void P_CyclePlayerMobjState(mobj_t *mobj)
{ {
// state animations
P_CycleStateAnimation(mobj);
// cycle through states, // cycle through states,
// calling action functions at transitions // calling action functions at transitions
if (mobj->tics != -1) if (mobj->tics != -1)
@ -307,6 +330,7 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
boolean noalt = false; boolean noalt = false;
UINT8 spr2 = st->frame & FF_FRAMEMASK; UINT8 spr2 = st->frame & FF_FRAMEMASK;
UINT16 frame = (mobj->frame & FF_FRAMEMASK)+1; UINT16 frame = (mobj->frame & FF_FRAMEMASK)+1;
mobj->anim_duration = (UINT16)st->var2; // only used if FF_ANIMATE is set
while (((skin_t *)mobj->skin)->sprites[spr2].numframes <= 0 while (((skin_t *)mobj->skin)->sprites[spr2].numframes <= 0
&& spr2 != SPR2_STND) && spr2 != SPR2_STND)
@ -497,6 +521,7 @@ boolean P_SetMobjState(mobj_t *mobj, statenum_t state)
st = &states[state]; st = &states[state];
mobj->state = st; mobj->state = st;
mobj->tics = st->tics; mobj->tics = st->tics;
mobj->anim_duration = (UINT16)st->var2; // only used if FF_ANIMATE is set
// Player animations // Player animations
if (st->sprite == SPR_PLAY) if (st->sprite == SPR_PLAY)
@ -574,6 +599,8 @@ boolean P_SetMobjStateNF(mobj_t *mobj, statenum_t state)
mobj->tics = st->tics; mobj->tics = st->tics;
mobj->sprite = st->sprite; mobj->sprite = st->sprite;
mobj->frame = st->frame; mobj->frame = st->frame;
mobj->anim_duration = (UINT16)st->var2; // only used if FF_ANIMATE is set
return true; return true;
} }
@ -591,6 +618,8 @@ static boolean P_SetPrecipMobjState(precipmobj_t *mobj, statenum_t state)
mobj->tics = st->tics; mobj->tics = st->tics;
mobj->sprite = st->sprite; mobj->sprite = st->sprite;
mobj->frame = st->frame; mobj->frame = st->frame;
mobj->anim_duration = (UINT16)st->var2; // only used if FF_ANIMATE is set
return true; return true;
} }
@ -3891,6 +3920,8 @@ void P_NullPrecipThinker(precipmobj_t *mobj)
void P_SnowThinker(precipmobj_t *mobj) void P_SnowThinker(precipmobj_t *mobj)
{ {
P_CycleStateAnimation((mobj_t *)mobj);
// adjust height // adjust height
if ((mobj->z += mobj->momz) <= mobj->floorz) if ((mobj->z += mobj->momz) <= mobj->floorz)
mobj->z = mobj->ceilingz; mobj->z = mobj->ceilingz;
@ -3898,6 +3929,8 @@ void P_SnowThinker(precipmobj_t *mobj)
void P_RainThinker(precipmobj_t *mobj) void P_RainThinker(precipmobj_t *mobj)
{ {
P_CycleStateAnimation((mobj_t *)mobj);
if (mobj->state != &states[S_RAIN1]) if (mobj->state != &states[S_RAIN1])
{ {
// cycle through states, // cycle through states,
@ -6008,8 +6041,6 @@ INT32 numshields = 0;
void P_RunShields(void) void P_RunShields(void)
{ {
INT32 i; INT32 i;
mobj_t *mo, *next;
fixed_t destx,desty,zoffs;
// run shields // run shields
for (i = 0; i < numshields; i++) for (i = 0; i < numshields; i++)
@ -6018,60 +6049,6 @@ void P_RunShields(void)
P_SetTarget(&shields[i], NULL); P_SetTarget(&shields[i], NULL);
} }
numshields = 0; numshields = 0;
// run overlays
next = NULL;
for (mo = overlaycap; mo; mo = next)
{
I_Assert(!P_MobjWasRemoved(mo));
// grab next in chain, then unset the chain target
next = mo->hnext;
P_SetTarget(&mo->hnext, NULL);
if (!mo->target)
continue;
if (!splitscreen /*&& rendermode != render_soft*/)
{
angle_t viewingangle;
if (players[displayplayer].awayviewtics)
viewingangle = R_PointToAngle2(mo->target->x, mo->target->y, players[displayplayer].awayviewmobj->x, players[displayplayer].awayviewmobj->y);
else if (!camera.chase && players[displayplayer].mo)
viewingangle = R_PointToAngle2(mo->target->x, mo->target->y, players[displayplayer].mo->x, players[displayplayer].mo->y);
else
viewingangle = R_PointToAngle2(mo->target->x, mo->target->y, camera.x, camera.y);
if (mo->state->var1)
viewingangle += ANGLE_180;
destx = mo->target->x + P_ReturnThrustX(mo->target, viewingangle, FixedMul(FRACUNIT/4, mo->scale));
desty = mo->target->y + P_ReturnThrustY(mo->target, viewingangle, FixedMul(FRACUNIT/4, mo->scale));
}
else
{
destx = mo->target->x;
desty = mo->target->y;
}
mo->eflags = (mo->eflags & ~MFE_VERTICALFLIP) | (mo->target->eflags & MFE_VERTICALFLIP);
mo->scale = mo->destscale = mo->target->scale;
zoffs = FixedMul(((signed)mo->state->var2)*FRACUNIT, mo->scale);
mo->angle = mo->target->angle;
P_UnsetThingPosition(mo);
mo->x = destx;
mo->y = desty;
if (mo->eflags & MFE_VERTICALFLIP)
mo->z = (mo->target->z + mo->target->height - mo->height) - zoffs;
else
mo->z = mo->target->z + zoffs;
if (mo->state->var1)
P_SetUnderlayPosition(mo);
else
P_SetThingPosition(mo);
P_CheckPosition(mo, mo->x, mo->y);
}
P_SetTarget(&overlaycap, NULL);
} }
static boolean P_AddShield(mobj_t *thing) static boolean P_AddShield(mobj_t *thing)
@ -6108,6 +6085,71 @@ static boolean P_AddShield(mobj_t *thing)
return true; return true;
} }
void P_RunOverlays(void)
{
// run overlays
mobj_t *mo, *next = NULL;
fixed_t destx,desty,zoffs;
for (mo = overlaycap; mo; mo = next)
{
I_Assert(!P_MobjWasRemoved(mo));
// grab next in chain, then unset the chain target
next = mo->hnext;
P_SetTarget(&mo->hnext, NULL);
if (!mo->target)
continue;
if (!splitscreen /*&& rendermode != render_soft*/)
{
angle_t viewingangle;
if (players[displayplayer].awayviewtics)
viewingangle = R_PointToAngle2(mo->target->x, mo->target->y, players[displayplayer].awayviewmobj->x, players[displayplayer].awayviewmobj->y);
else if (!camera.chase && players[displayplayer].mo)
viewingangle = R_PointToAngle2(mo->target->x, mo->target->y, players[displayplayer].mo->x, players[displayplayer].mo->y);
else
viewingangle = R_PointToAngle2(mo->target->x, mo->target->y, camera.x, camera.y);
if (!(mo->state->frame & FF_ANIMATE) && mo->state->var1)
viewingangle += ANGLE_180;
destx = mo->target->x + P_ReturnThrustX(mo->target, viewingangle, FixedMul(FRACUNIT/4, mo->scale));
desty = mo->target->y + P_ReturnThrustY(mo->target, viewingangle, FixedMul(FRACUNIT/4, mo->scale));
}
else
{
destx = mo->target->x;
desty = mo->target->y;
}
mo->eflags = (mo->eflags & ~MFE_VERTICALFLIP) | (mo->target->eflags & MFE_VERTICALFLIP);
mo->scale = mo->destscale = mo->target->scale;
mo->angle = mo->target->angle;
if (!(mo->state->frame & FF_ANIMATE))
zoffs = FixedMul(((signed)mo->state->var2)*FRACUNIT, mo->scale);
// if you're using FF_ANIMATE on an overlay,
// then you're on your own.
else
zoffs = 0;
P_UnsetThingPosition(mo);
mo->x = destx;
mo->y = desty;
if (mo->eflags & MFE_VERTICALFLIP)
mo->z = (mo->target->z + mo->target->height - mo->height) - zoffs;
else
mo->z = mo->target->z + zoffs;
if (mo->state->var1)
P_SetUnderlayPosition(mo);
else
P_SetThingPosition(mo);
P_CheckPosition(mo, mo->x, mo->y);
}
P_SetTarget(&overlaycap, NULL);
}
// Called only when MT_OVERLAY thinks. // Called only when MT_OVERLAY thinks.
static void P_AddOverlay(mobj_t *thing) static void P_AddOverlay(mobj_t *thing)
{ {
@ -7677,6 +7719,8 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
mobj->tics = st->tics; mobj->tics = st->tics;
mobj->sprite = st->sprite; mobj->sprite = st->sprite;
mobj->frame = st->frame; // FF_FRAMEMASK for frame, and other bits.. mobj->frame = st->frame; // FF_FRAMEMASK for frame, and other bits..
mobj->anim_duration = (UINT16)st->var2; // only used if FF_ANIMATE is set
mobj->friction = ORIG_FRICTION; mobj->friction = ORIG_FRICTION;
mobj->movefactor = ORIG_FRICTION_FACTOR; mobj->movefactor = ORIG_FRICTION_FACTOR;
@ -7902,6 +7946,7 @@ static precipmobj_t *P_SpawnPrecipMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype
mobj->tics = st->tics; mobj->tics = st->tics;
mobj->sprite = st->sprite; mobj->sprite = st->sprite;
mobj->frame = st->frame; // FF_FRAMEMASK for frame, and other bits.. mobj->frame = st->frame; // FF_FRAMEMASK for frame, and other bits..
mobj->anim_duration = (UINT16)st->var2; // only used if FF_ANIMATE is set
// set subsector and/or block links // set subsector and/or block links
P_SetPrecipitationThingPosition(mobj); P_SetPrecipitationThingPosition(mobj);

View file

@ -271,6 +271,7 @@ typedef struct mobj_s
spritenum_t sprite; // used to find patch_t and flip value spritenum_t sprite; // used to find patch_t and flip value
UINT32 frame; // frame number, plus bits see p_pspr.h UINT32 frame; // frame number, plus bits see p_pspr.h
UINT8 sprite2; // player sprites UINT8 sprite2; // player sprites
UINT16 anim_duration; // for FF_ANIMATE states
struct msecnode_s *touching_sectorlist; // a linked list of sectors where this object appears struct msecnode_s *touching_sectorlist; // a linked list of sectors where this object appears
@ -384,7 +385,8 @@ typedef struct precipmobj_s
// More drawing info: to determine current sprite. // More drawing info: to determine current sprite.
angle_t angle; // orientation angle_t angle; // orientation
spritenum_t sprite; // used to find patch_t and flip value spritenum_t sprite; // used to find patch_t and flip value
INT32 frame; // frame number, plus bits see p_pspr.h UINT32 frame; // frame number, plus bits see p_pspr.h
UINT16 anim_duration; // for FF_ANIMATE states
struct mprecipsecnode_s *touching_sectorlist; // a linked list of sectors where this object appears struct mprecipsecnode_s *touching_sectorlist; // a linked list of sectors where this object appears

View file

@ -36,9 +36,11 @@
#endif #endif
/// \brief Frame flags: only the frame number /// \brief Frame flags: only the frame number
#define FF_FRAMEMASK 0x7fff #define FF_FRAMEMASK 0x3fff
/// \brief Frame flags: Simple stateless animation
#define FF_ANIMATE 0x4000
/// \brief Frame flags: frame always appears full bright /// \brief Frame flags: frame always appears full bright
#define FF_FULLBRIGHT 0x8000 // #define FF_FULLBRIGHT 0x8000
/// \brief Frame flags: 0 = no trans(opaque), 1-15 = transl. table /// \brief Frame flags: 0 = no trans(opaque), 1-15 = transl. table
#define FF_TRANSMASK 0xf0000 #define FF_TRANSMASK 0xf0000
/// \brief shift for FF_TRANSMASK /// \brief shift for FF_TRANSMASK

View file

@ -1060,6 +1060,8 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type)
diff |= MD_SPRITE; diff |= MD_SPRITE;
if (mobj->frame != mobj->state->frame) if (mobj->frame != mobj->state->frame)
diff |= MD_FRAME; diff |= MD_FRAME;
if (mobj->anim_duration != (UINT16)mobj->state->var2)
diff |= MD_FRAME;
if (mobj->eflags) if (mobj->eflags)
diff |= MD_EFLAGS; diff |= MD_EFLAGS;
if (mobj->player) if (mobj->player)
@ -1183,7 +1185,10 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type)
WRITEUINT8(save_p, mobj->sprite2); WRITEUINT8(save_p, mobj->sprite2);
} }
if (diff & MD_FRAME) if (diff & MD_FRAME)
{
WRITEUINT32(save_p, mobj->frame); WRITEUINT32(save_p, mobj->frame);
WRITEUINT16(save_p, mobj->anim_duration);
}
if (diff & MD_EFLAGS) if (diff & MD_EFLAGS)
WRITEUINT16(save_p, mobj->eflags); WRITEUINT16(save_p, mobj->eflags);
if (diff & MD_PLAYER) if (diff & MD_PLAYER)
@ -2015,9 +2020,15 @@ static void LoadMobjThinker(actionf_p1 thinker)
mobj->sprite2 = mobj->state->frame&FF_FRAMEMASK; mobj->sprite2 = mobj->state->frame&FF_FRAMEMASK;
} }
if (diff & MD_FRAME) if (diff & MD_FRAME)
{
mobj->frame = READUINT32(save_p); mobj->frame = READUINT32(save_p);
mobj->anim_duration = READUINT16(save_p);
}
else else
{
mobj->frame = mobj->state->frame; mobj->frame = mobj->state->frame;
mobj->anim_duration = (UINT16)mobj->state->var2;
}
if (diff & MD_EFLAGS) if (diff & MD_EFLAGS)
mobj->eflags = READUINT16(save_p); mobj->eflags = READUINT16(save_p);
if (diff & MD_PLAYER) if (diff & MD_PLAYER)

View file

@ -2369,7 +2369,7 @@ boolean P_SetupLevel(boolean skipprecip)
// use gamemap to get map number. // use gamemap to get map number.
// 99% of the things already did, so. // 99% of the things already did, so.
// Map header should always be in place at this point // Map header should always be in place at this point
INT32 i, loadprecip = 1; INT32 i, loadprecip = 1, ranspecialwipe = 0;
INT32 loademblems = 1; INT32 loademblems = 1;
INT32 fromnetsave = 0; INT32 fromnetsave = 0;
boolean loadedbm = false; boolean loadedbm = false;
@ -2442,6 +2442,28 @@ boolean P_SetupLevel(boolean skipprecip)
// will be set by player think. // will be set by player think.
players[consoleplayer].viewz = 1; players[consoleplayer].viewz = 1;
// Special stage fade to white
// This is handled BEFORE sounds are stopped.
if (rendermode != render_none && G_IsSpecialStage(gamemap))
{
tic_t starttime = I_GetTime();
tic_t endtime = starttime + (3*TICRATE)/2;
S_StartSound(NULL, sfx_s3kaf);
F_WipeStartScreen();
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 0);
F_WipeEndScreen();
F_RunWipe(wipedefs[wipe_speclevel_towhite], false);
// Hold on white for extra effect.
while (I_GetTime() < endtime)
I_Sleep();
ranspecialwipe = 1;
}
// Make sure all sounds are stopped before Z_FreeTags. // Make sure all sounds are stopped before Z_FreeTags.
S_StopSounds(); S_StopSounds();
S_ClearSfx(); S_ClearSfx();
@ -2451,25 +2473,28 @@ boolean P_SetupLevel(boolean skipprecip)
S_Start(); S_Start();
// Let's fade to black here // Let's fade to black here
if (rendermode != render_none) // But only if we didn't do the special stage wipe
if (rendermode != render_none && !ranspecialwipe)
{ {
F_WipeStartScreen(); F_WipeStartScreen();
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31);
F_WipeEndScreen(); F_WipeEndScreen();
F_RunWipe(wipedefs[wipe_level_toblack], false); F_RunWipe(wipedefs[wipe_level_toblack], false);
}
// Print "SPEEDING OFF TO [ZONE] [ACT 1]..."
if (rendermode != render_none)
{
// Don't include these in the fade! // Don't include these in the fade!
{ char tx[64];
char tx[64]; V_DrawSmallString(1, 191, V_ALLOWLOWERCASE, M_GetText("Speeding off to..."));
V_DrawSmallString(1, 191, V_ALLOWLOWERCASE, M_GetText("Speeding off to...")); snprintf(tx, 63, "%s%s%s",
snprintf(tx, 63, "%s%s%s", mapheaderinfo[gamemap-1]->lvlttl,
mapheaderinfo[gamemap-1]->lvlttl, (mapheaderinfo[gamemap-1]->levelflags & LF_NOZONE) ? "" : " ZONE",
(mapheaderinfo[gamemap-1]->levelflags & LF_NOZONE) ? "" : " ZONE", (mapheaderinfo[gamemap-1]->actnum > 0) ? va(", Act %d",mapheaderinfo[gamemap-1]->actnum) : "");
(mapheaderinfo[gamemap-1]->actnum > 0) ? va(", Act %d",mapheaderinfo[gamemap-1]->actnum) : ""); V_DrawSmallString(1, 195, V_ALLOWLOWERCASE, tx);
V_DrawSmallString(1, 195, V_ALLOWLOWERCASE, tx); I_UpdateNoVsync();
I_UpdateNoVsync();
}
} }
#ifdef HAVE_BLUA #ifdef HAVE_BLUA
@ -2767,7 +2792,7 @@ boolean P_SetupLevel(boolean skipprecip)
// Remove the loading shit from the screen // Remove the loading shit from the screen
if (rendermode != render_none) if (rendermode != render_none)
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, (ranspecialwipe) ? 0 : 31);
if (precache || dedicated) if (precache || dedicated)
R_PrecacheLevel(); R_PrecacheLevel();

View file

@ -3039,6 +3039,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS);
sector_t *sec; // Sector that the FOF is visible (or not visible) in sector_t *sec; // Sector that the FOF is visible (or not visible) in
ffloor_t *rover; // FOF to vanish/un-vanish ffloor_t *rover; // FOF to vanish/un-vanish
ffloortype_e oldflags; // store FOF's old flags
for (secnum = -1; (secnum = P_FindSectorFromTag(sectag, secnum)) >= 0 ;) for (secnum = -1; (secnum = P_FindSectorFromTag(sectag, secnum)) >= 0 ;)
{ {
@ -3062,11 +3063,17 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
return; return;
} }
oldflags = rover->flags;
// Abracadabra! // Abracadabra!
if (line->flags & ML_NOCLIMB) if (line->flags & ML_NOCLIMB)
rover->flags |= FF_EXISTS; rover->flags |= FF_EXISTS;
else else
rover->flags &= ~FF_EXISTS; rover->flags &= ~FF_EXISTS;
// if flags changed, reset sector's light list
if (rover->flags != oldflags)
sec->moved = true;
} }
} }
break; break;

View file

@ -631,6 +631,7 @@ void P_Ticker(boolean run)
// Run shield positioning // Run shield positioning
P_RunShields(); P_RunShields();
P_RunOverlays();
P_UpdateSpecials(); P_UpdateSpecials();
P_RespawnSpecials(); P_RespawnSpecials();
@ -742,6 +743,7 @@ void P_PreTicker(INT32 frames)
// Run shield positioning // Run shield positioning
P_RunShields(); P_RunShields();
P_RunOverlays();
P_UpdateSpecials(); P_UpdateSpecials();
P_RespawnSpecials(); P_RespawnSpecials();

View file

@ -3437,27 +3437,14 @@ static void P_DoSuperStuff(player_t *player)
player->mo->health--; player->mo->health--;
} }
// future todo: a skin option for this, and possibly more colors
switch (player->skin) switch (player->skin)
{ {
case 1: // Golden orange supertails. case 1: /* Tails */ player->mo->color = SKINCOLOR_TSUPER1; break;
if (leveltime % 9 < 5) case 2: /* Knux */ player->mo->color = SKINCOLOR_KSUPER1; break;
player->mo->color = SKINCOLOR_TSUPER1 + leveltime % 9; default: /* everyone */ player->mo->color = SKINCOLOR_SUPER1; break;
else
player->mo->color = SKINCOLOR_TSUPER1 + 9 - leveltime % 9;
break;
case 2: // Pink superknux.
if (leveltime % 9 < 5)
player->mo->color = SKINCOLOR_KSUPER1 + leveltime % 9;
else
player->mo->color = SKINCOLOR_KSUPER1 + 9 - leveltime % 9;
break;
default: // Yousa yellow now!
if (leveltime % 9 < 5)
player->mo->color = SKINCOLOR_SUPER1 + leveltime % 9;
else
player->mo->color = SKINCOLOR_SUPER1 + 9 - leveltime % 9;
break;
} }
player->mo->color += abs( ( ( leveltime >> 1 ) % 9) - 4);
if ((cmd->forwardmove != 0 || cmd->sidemove != 0 || player->pflags & (PF_CARRIED|PF_ROPEHANG|PF_ITEMHANG|PF_MACESPIN)) if ((cmd->forwardmove != 0 || cmd->sidemove != 0 || player->pflags & (PF_CARRIED|PF_ROPEHANG|PF_ITEMHANG|PF_MACESPIN))
&& !(leveltime % TICRATE) && (player->mo->momx || player->mo->momy)) && !(leveltime % TICRATE) && (player->mo->momx || player->mo->momy))
@ -6363,8 +6350,7 @@ static void P_MovePlayer(player_t *player)
if (!(player->powers[pw_nocontrol] & (1<<15))) if (!(player->powers[pw_nocontrol] & (1<<15)))
player->pflags |= PF_JUMPSTASIS; player->pflags |= PF_JUMPSTASIS;
} }
else // note: don't unset stasis here
player->pflags &= ~PF_FULLSTASIS;
if (!player->spectator && G_TagGametype()) if (!player->spectator && G_TagGametype())
{ {
@ -8955,6 +8941,11 @@ void P_PlayerThink(player_t *player)
if (!player->mo) if (!player->mo)
return; // P_MovePlayer removed player->mo. return; // P_MovePlayer removed player->mo.
// Unset statis flags after moving.
// In other words, if you manually set stasis via code,
// it lasts for one tic.
player->pflags &= ~PF_FULLSTASIS;
#ifdef POLYOBJECTS #ifdef POLYOBJECTS
if (player->onconveyor == 1) if (player->onconveyor == 1)
player->cmomy = player->cmomx = 0; player->cmomy = player->cmomx = 0;

View file

@ -45,9 +45,6 @@ typedef DWORD (WINAPI *p_timeGetTime) (void);
typedef UINT (WINAPI *p_timeEndPeriod) (UINT); typedef UINT (WINAPI *p_timeEndPeriod) (UINT);
typedef HANDLE (WINAPI *p_OpenFileMappingA) (DWORD, BOOL, LPCSTR); typedef HANDLE (WINAPI *p_OpenFileMappingA) (DWORD, BOOL, LPCSTR);
typedef LPVOID (WINAPI *p_MapViewOfFile) (HANDLE, DWORD, DWORD, DWORD, SIZE_T); typedef LPVOID (WINAPI *p_MapViewOfFile) (HANDLE, DWORD, DWORD, DWORD, SIZE_T);
typedef HANDLE (WINAPI *p_GetCurrentProcess) (VOID);
typedef BOOL (WINAPI *p_GetProcessAffinityMask) (HANDLE, PDWORD_PTR, PDWORD_PTR);
typedef BOOL (WINAPI *p_SetProcessAffinityMask) (HANDLE, DWORD_PTR);
#endif #endif
#endif #endif
#include <stdio.h> #include <stdio.h>
@ -2779,7 +2776,6 @@ static const char *locateWad(void)
{ {
return returnWadPath; return returnWadPath;
} }
#endif #endif
// examine default dirs // examine default dirs
@ -3070,52 +3066,6 @@ const CPUInfoFlags *I_CPUInfo(void)
#endif #endif
} }
#if (defined (_WIN32) && !defined (_WIN32_WCE)) && !defined (_XBOX) // note CPUAFFINITY code used to reside here
static void CPUAffinity_OnChange(void); void I_RegisterSysCommands(void) {}
static consvar_t cv_cpuaffinity = {"cpuaffinity", "-1", CV_SAVE | CV_CALL, NULL, CPUAffinity_OnChange, 0, NULL, NULL, 0, 0, NULL};
static p_GetCurrentProcess pfnGetCurrentProcess = NULL;
static p_GetProcessAffinityMask pfnGetProcessAffinityMask = NULL;
static p_SetProcessAffinityMask pfnSetProcessAffinityMask = NULL;
static inline VOID GetAffinityFuncs(VOID)
{
HMODULE h = GetModuleHandleA("kernel32.dll");
pfnGetCurrentProcess = (p_GetCurrentProcess)GetProcAddress(h, "GetCurrentProcess");
pfnGetProcessAffinityMask = (p_GetProcessAffinityMask)GetProcAddress(h, "GetProcessAffinityMask");
pfnSetProcessAffinityMask = (p_SetProcessAffinityMask)GetProcAddress(h, "SetProcessAffinityMask");
}
static void CPUAffinity_OnChange(void)
{
DWORD_PTR dwProcMask, dwSysMask;
HANDLE selfpid;
if (!pfnGetCurrentProcess || !pfnGetProcessAffinityMask || !pfnSetProcessAffinityMask)
return;
else
selfpid = pfnGetCurrentProcess();
pfnGetProcessAffinityMask(selfpid, &dwProcMask, &dwSysMask);
/* If resulting mask is zero, don't change anything and fall back to
* actual mask.
*/
if(dwSysMask & cv_cpuaffinity.value)
{
pfnSetProcessAffinityMask(selfpid, dwSysMask & cv_cpuaffinity.value);
CV_StealthSetValue(&cv_cpuaffinity, (INT32)(dwSysMask & cv_cpuaffinity.value));
}
else
CV_StealthSetValue(&cv_cpuaffinity, (INT32)dwProcMask);
}
#endif
void I_RegisterSysCommands(void)
{
#if (defined (_WIN32) && !defined (_WIN32_WCE)) && !defined (_XBOX)
GetAffinityFuncs();
CV_RegisterVar(&cv_cpuaffinity);
#endif
}
#endif #endif

View file

@ -1701,21 +1701,11 @@ void I_StartupGraphics(void)
keyboard_started = true; keyboard_started = true;
#if !defined(HAVE_TTF) #if !defined(HAVE_TTF)
#ifdef _WIN32 // Initialize Audio as well, otherwise Win32's DirectX can not use audio // Previously audio was init here for questionable reasons?
if (SDL_InitSubSystem(SDL_INIT_AUDIO|SDL_INIT_VIDEO) < 0)
#else //SDL_OpenAudio will do SDL_InitSubSystem(SDL_INIT_AUDIO)
if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0)
#endif
{ {
#ifdef _WIN32 CONS_Printf(M_GetText("Couldn't initialize SDL's Video System: %s\n"), SDL_GetError());
if (SDL_WasInit(SDL_INIT_AUDIO)==0) return;
CONS_Printf(M_GetText("Couldn't initialize SDL's Audio System with Video System: %s\n"), SDL_GetError());
if (SDL_WasInit(SDL_INIT_VIDEO)==0)
#endif
{
CONS_Printf(M_GetText("Couldn't initialize SDL's Video System: %s\n"), SDL_GetError());
return;
}
} }
#endif #endif
{ {

View file

@ -77,7 +77,16 @@ static INT32 current_track;
void I_StartupSound(void) void I_StartupSound(void)
{ {
I_Assert(!sound_started); I_Assert(!sound_started);
sound_started = true;
// EE inits audio first so we're following along.
if (SDL_WasInit(SDL_INIT_AUDIO) == SDL_INIT_AUDIO)
CONS_Printf("SDL Audio already started\n");
else if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0)
{
CONS_Alert(CONS_ERROR, "Error initializing SDL Audio: %s\n", SDL_GetError());
// call to start audio failed -- we do not have it
return;
}
midimode = false; midimode = false;
music = NULL; music = NULL;
@ -86,19 +95,31 @@ void I_StartupSound(void)
#if SDL_MIXER_VERSION_ATLEAST(1,2,11) #if SDL_MIXER_VERSION_ATLEAST(1,2,11)
Mix_Init(MIX_INIT_FLAC|MIX_INIT_MOD|MIX_INIT_MP3|MIX_INIT_OGG); Mix_Init(MIX_INIT_FLAC|MIX_INIT_MOD|MIX_INIT_MP3|MIX_INIT_OGG);
#endif #endif
Mix_OpenAudio(44100, AUDIO_S16LSB, 2, 2048);
if (Mix_OpenAudio(44100, AUDIO_S16SYS, 2, 2048) < 0)
{
CONS_Alert(CONS_ERROR, "Error starting SDL_Mixer: %s\n", Mix_GetError());
// call to start audio failed -- we do not have it
return;
}
sound_started = true;
Mix_AllocateChannels(256); Mix_AllocateChannels(256);
} }
void I_ShutdownSound(void) void I_ShutdownSound(void)
{ {
I_Assert(sound_started); if (!sound_started)
return; // not an error condition
sound_started = false; sound_started = false;
Mix_CloseAudio(); Mix_CloseAudio();
#if SDL_MIXER_VERSION_ATLEAST(1,2,11) #if SDL_MIXER_VERSION_ATLEAST(1,2,11)
Mix_Quit(); Mix_Quit();
#endif #endif
SDL_QuitSubSystem(SDL_INIT_AUDIO);
#ifdef HAVE_LIBGME #ifdef HAVE_LIBGME
if (gme) if (gme)
gme_delete(gme); gme_delete(gme);

View file

@ -1213,6 +1213,16 @@ void I_StartupSound(void)
// Configure sound device // Configure sound device
CONS_Printf("I_StartupSound:\n"); CONS_Printf("I_StartupSound:\n");
// EE inits audio first so we're following along.
if (SDL_WasInit(SDL_INIT_AUDIO) == SDL_INIT_AUDIO)
CONS_Printf("SDL Audio already started\n");
else if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0)
{
CONS_Alert(CONS_ERROR, "Error initializing SDL Audio: %s\n", SDL_GetError());
// call to start audio failed -- we do not have it
return;
}
// Open the audio device // Open the audio device
if (M_CheckParm ("-freq") && M_IsNextParm()) if (M_CheckParm ("-freq") && M_IsNextParm())
{ {

View file

@ -3656,7 +3656,7 @@ const CPUInfoFlags *I_CPUInfo(void)
} }
static void CPUAffinity_OnChange(void); static void CPUAffinity_OnChange(void);
static consvar_t cv_cpuaffinity = {"cpuaffinity", "1", CV_SAVE | CV_CALL, NULL, CPUAffinity_OnChange, 0, NULL, NULL, 0, 0, NULL}; static consvar_t cv_cpuaffinity = {"cpuaffinity", "-1", CV_CALL, NULL, CPUAffinity_OnChange, 0, NULL, NULL, 0, 0, NULL};
typedef HANDLE (WINAPI *p_GetCurrentProcess) (VOID); typedef HANDLE (WINAPI *p_GetCurrentProcess) (VOID);
static p_GetCurrentProcess pfnGetCurrentProcess = NULL; static p_GetCurrentProcess pfnGetCurrentProcess = NULL;