diff --git a/doomsday/doc/libdoom/variable/game-objects-gibcrushednonbleeders.ame b/doomsday/doc/libdoom/variable/game-objects-gibcrushednonbleeders.ame new file mode 100644 index 0000000000..6a0b8bc062 --- /dev/null +++ b/doomsday/doc/libdoom/variable/game-objects-gibcrushednonbleeders.ame @@ -0,0 +1,3 @@ +@summary{ + 1=Turn any crushed object into a pile of gibs (disables DOOM bug fix). +} diff --git a/doomsday/plugins/common/src/hu_menu.c b/doomsday/plugins/common/src/hu_menu.c index 83a0d661ae..d58aaa809f 100644 --- a/doomsday/plugins/common/src/hu_menu.c +++ b/doomsday/plugins/common/src/hu_menu.c @@ -162,6 +162,11 @@ cvarbutton_t mnCVarButtons[] = { { 0, "game-monsters-floatoverblocking" }, { 0, "game-objects-clipping" }, { 0, "game-objects-falloff" }, +#endif +#if __JDOOM__ || __JDOOM64__ + { 0, "game-objects-gibcrushednonbleeders" }, +#endif +#if __JDOOM__ || __JHERETIC__ || __JDOOM64__ { 0, "game-objects-neverhangoverledges" }, { 0, "game-player-wallrun-northonly" }, #endif @@ -2269,9 +2274,9 @@ void Hu_MenuInitGameplayOptionsPage(void) #endif mn_object_t* objects, *ob; #if __JDOOM64__ - const uint numObjects = 38; -#elif __JDOOM__ const uint numObjects = 40; +#elif __JDOOM__ + const uint numObjects = 42; #elif __JHERETIC__ const uint numObjects = 24; #elif __JHEXEN__ @@ -2734,6 +2739,39 @@ void Hu_MenuInitGameplayOptionsPage(void) } ob++; +#if __JDOOM__ || __JDOOM64__ + ob->_type = MN_TEXT; + ob->_group = 1; + ob->_pageFontIdx = MENU_FONT1; + ob->_pageColorIdx = MENU_COLOR1; + ob->ticker = MNText_Ticker; + ob->updateGeometry = MNText_UpdateGeometry; + ob->drawer = MNText_Drawer; + ob->_typedata = Z_Calloc(sizeof(mndata_text_t), PU_GAMESTATIC, 0); + { mndata_text_t* text = (mndata_text_t*)ob->_typedata; + text->text = "All Crushed Objects Become A Pile Of Gibs"; + } + ob++; + + ob->_type = MN_BUTTON; + ob->_group = 1; + ob->_shortcut = 'g'; + ob->_pageFontIdx = MENU_FONT1; + ob->_pageColorIdx = MENU_COLOR3; + ob->ticker = MNButton_Ticker; + ob->updateGeometry = MNButton_UpdateGeometry; + ob->drawer = MNButton_Drawer; + ob->actions[MNA_MODIFIED].callback = Hu_MenuCvarButton; + ob->actions[MNA_FOCUS].callback = Hu_MenuDefaultFocusAction; + ob->cmdResponder = MNButton_CommandResponder; + ob->_typedata = Z_Calloc(sizeof(mndata_button_t), PU_GAMESTATIC, 0); + { mndata_button_t* btn = (mndata_button_t*)ob->_typedata; + btn->staydownMode = true; + btn->data = "game-objects-gibcrushednonbleeders"; + } + ob++; +#endif + ob->_type = MN_TEXT; ob->_group = 1; ob->_pageFontIdx = MENU_FONT1; diff --git a/doomsday/plugins/common/src/p_map.c b/doomsday/plugins/common/src/p_map.c index 480bf7aef3..f191393cdd 100644 --- a/doomsday/plugins/common/src/p_map.c +++ b/doomsday/plugins/common/src/p_map.c @@ -2752,7 +2752,7 @@ int PIT_ChangeSector(mobj_t* thing, void* data) // Crunch bodies to giblets. #if __JDOOM__ || __JDOOM64__ - if(thing->health <= 0 && !(thing->flags & MF_NOBLOOD)) + if(thing->health <= 0 && (cfg.gibCrushedNonBleeders || !(thing->flags & MF_NOBLOOD))) #elif __JHEXEN__ if(thing->health <= 0 && (thing->flags & MF_CORPSE)) #else diff --git a/doomsday/plugins/doom/data/conhelp.txt b/doomsday/plugins/doom/data/conhelp.txt index f1d375e939..7aaed47616 100644 --- a/doomsday/plugins/doom/data/conhelp.txt +++ b/doomsday/plugins/doom/data/conhelp.txt @@ -742,6 +742,9 @@ desc = 1=Use EXACTLY DOOM's clipping code (disables DOOM bug fix). [game-objects-falloff] desc = 1=Objects fall under their own weight (enables DOOM bug fix). +[game-objects-gibcrushednonbleeders] +desc = 1=Turn any crushed object into a pile of gibs (disables DOOM bug fix). + [game-objects-hangoverledges] desc = 1=Only some objects can hang over tall ledges (enables DOOM bug fix). diff --git a/doomsday/plugins/doom/include/d_config.h b/doomsday/plugins/doom/include/d_config.h index 6e7fecb0e7..0569e7a9e1 100644 --- a/doomsday/plugins/doom/include/d_config.h +++ b/doomsday/plugins/doom/include/d_config.h @@ -169,6 +169,7 @@ typedef struct jdoom_config_s { byte wallRunNorthOnly; // If handle large make exception for wallrunning byte zombiesCanExit; // Zombie players can exit levels. byte fallOff; // Objects fall under their own weight. + byte gibCrushedNonBleeders; byte fixOuchFace; byte fixStatusbarOwnedWeapons; diff --git a/doomsday/plugins/doom/src/d_console.c b/doomsday/plugins/doom/src/d_console.c index 06a083301b..b8449927a3 100644 --- a/doomsday/plugins/doom/src/d_console.c +++ b/doomsday/plugins/doom/src/d_console.c @@ -140,28 +140,29 @@ cvartemplate_t gameCVars[] = { {"player-weapon-order7", 0, CVT_INT, &cfg.weaponOrder[7], 0, NUM_WEAPON_TYPES}, {"player-weapon-order8", 0, CVT_INT, &cfg.weaponOrder[8], 0, NUM_WEAPON_TYPES}, - {"player-weapon-nextmode", 0, CVT_BYTE, &cfg.weaponNextMode, 0, 1}, + {"player-weapon-nextmode", 0, CVT_BYTE, &cfg.weaponNextMode, 0, 1}, {"player-weapon-cycle-sequential", 0, CVT_BYTE, &cfg.weaponCycleSequential, 0, 1}, // Misc {"player-camera-noclip", 0, CVT_INT, &cfg.cameraNoClip, 0, 1}, - {"player-death-lookup", 0, CVT_BYTE, &cfg.deathLookUp, 0, 1}, + {"player-death-lookup", 0, CVT_BYTE, &cfg.deathLookUp, 0, 1}, // Compatibility options - {"game-raiseghosts", 0, CVT_BYTE, &cfg.raiseGhosts, 0, 1}, - {"game-vilechase-usevileradius", 0, CVT_BYTE, &cfg.vileChaseUseVileRadius, 0, 1}, - {"game-maxskulls", 0, CVT_BYTE, &cfg.maxSkulls, 0, 1}, - {"game-skullsinwalls", 0, CVT_BYTE, &cfg.allowSkullsInWalls, 0, 1}, - {"game-anybossdeath666", 0, CVT_BYTE, &cfg.anyBossDeath, 0, 1}, - {"game-monsters-stuckindoors", 0, CVT_BYTE, &cfg.monstersStuckInDoors, 0, 1}, - {"game-objects-neverhangoverledges", 0, CVT_BYTE, &cfg.avoidDropoffs, 0, 1}, - {"game-objects-clipping", 0, CVT_BYTE, &cfg.moveBlock, 0, 1}, - {"game-zombiescanexit", 0, CVT_BYTE, &cfg.zombiesCanExit, 0, 1}, - {"game-player-wallrun-northonly", 0, CVT_BYTE, &cfg.wallRunNorthOnly, 0, 1}, - {"game-objects-falloff", 0, CVT_BYTE, &cfg.fallOff, 0, 1}, - {"game-zclip", 0, CVT_BYTE, &cfg.moveCheckZ, 0, 1}, - {"game-monsters-floatoverblocking", 0, CVT_BYTE, &cfg.allowMonsterFloatOverBlocking, 0, 1}, - {"game-corpse-sliding", 0, CVT_BYTE, &cfg.slidingCorpses, 0, 1}, + {"game-anybossdeath666", 0, CVT_BYTE, &cfg.anyBossDeath, 0, 1}, + {"game-corpse-sliding", 0, CVT_BYTE, &cfg.slidingCorpses, 0, 1}, + {"game-maxskulls", 0, CVT_BYTE, &cfg.maxSkulls, 0, 1}, + {"game-monsters-floatoverblocking", 0, CVT_BYTE, &cfg.allowMonsterFloatOverBlocking, 0, 1}, + {"game-monsters-stuckindoors", 0, CVT_BYTE, &cfg.monstersStuckInDoors, 0, 1}, + {"game-objects-clipping", 0, CVT_BYTE, &cfg.moveBlock, 0, 1}, + {"game-objects-falloff", 0, CVT_BYTE, &cfg.fallOff, 0, 1}, + {"game-objects-gibcrushednonbleeders", 0, CVT_BYTE, &cfg.gibCrushedNonBleeders, 0, 1}, + {"game-objects-neverhangoverledges", 0, CVT_BYTE, &cfg.avoidDropoffs, 0, 1}, + {"game-player-wallrun-northonly", 0, CVT_BYTE, &cfg.wallRunNorthOnly, 0, 1}, + {"game-raiseghosts", 0, CVT_BYTE, &cfg.raiseGhosts, 0, 1}, + {"game-skullsinwalls", 0, CVT_BYTE, &cfg.allowSkullsInWalls, 0, 1}, + {"game-vilechase-usevileradius", 0, CVT_BYTE, &cfg.vileChaseUseVileRadius, 0, 1}, + {"game-zclip", 0, CVT_BYTE, &cfg.moveCheckZ, 0, 1}, + {"game-zombiescanexit", 0, CVT_BYTE, &cfg.zombiesCanExit, 0, 1}, // Game state {"game-fastmonsters", 0, CVT_BYTE, &cfg.fastMonsters, 0, 1}, diff --git a/doomsday/plugins/doom64/data/conhelp.txt b/doomsday/plugins/doom64/data/conhelp.txt index f4d88768f7..e76453eae6 100644 --- a/doomsday/plugins/doom64/data/conhelp.txt +++ b/doomsday/plugins/doom64/data/conhelp.txt @@ -875,6 +875,9 @@ desc = 1=The death of ANY boss monster triggers a 666 special (on applicable map [game-monsters-stuckindoors] desc = 1=Monsters can get stuck in doortracks (disables DOOM bug fix). +[game-objects-gibcrushednonbleeders] +desc = 1=Turn any crushed object into a pile of gibs (disables DOOM bug fix). + [game-objects-hangoverledges] desc = 1=Only some objects can hang over tall ledges (enables DOOM bug fix). diff --git a/doomsday/plugins/doom64/include/d_config.h b/doomsday/plugins/doom64/include/d_config.h index eee964a165..517f0c6bee 100644 --- a/doomsday/plugins/doom64/include/d_config.h +++ b/doomsday/plugins/doom64/include/d_config.h @@ -166,6 +166,7 @@ typedef struct jdoom64_config_s { byte wallRunNorthOnly; // If handle large make exception for wallrunning byte zombiesCanExit; // Zombie players can exit maps. byte fallOff; // Objects fall under their own weight. + byte gibCrushedNonBleeders; byte hudShownCheatCounters; float hudCheatCounterScale; diff --git a/doomsday/plugins/doom64/src/d_console.c b/doomsday/plugins/doom64/src/d_console.c index 5b736169b3..1f495e5107 100644 --- a/doomsday/plugins/doom64/src/d_console.c +++ b/doomsday/plugins/doom64/src/d_console.c @@ -160,26 +160,27 @@ cvartemplate_t gameCVars[] = { {"player-weapon-order8", 0, CVT_INT, &cfg.weaponOrder[8], 0, NUM_WEAPON_TYPES}, {"player-weapon-order9", 0, CVT_INT, &cfg.weaponOrder[9], 0, NUM_WEAPON_TYPES}, - {"player-weapon-nextmode", 0, CVT_BYTE, &cfg.weaponNextMode, 0, 1}, + {"player-weapon-nextmode", 0, CVT_BYTE, &cfg.weaponNextMode, 0, 1}, {"player-weapon-cycle-sequential", 0, CVT_BYTE, &cfg.weaponCycleSequential, 0, 1}, // Misc {"player-camera-noclip", 0, CVT_INT, &cfg.cameraNoClip, 0, 1}, - {"player-death-lookup", 0, CVT_BYTE, &cfg.deathLookUp, 0, 1}, + {"player-death-lookup", 0, CVT_BYTE, &cfg.deathLookUp, 0, 1}, // Compatibility options - {"game-maxskulls", 0, CVT_BYTE, &cfg.maxSkulls, 0, 1}, - {"game-skullsinwalls", 0, CVT_BYTE, &cfg.allowSkullsInWalls, 0, 1}, - {"game-anybossdeath666", 0, CVT_BYTE, &cfg.anyBossDeath, 0, 1}, - {"game-monsters-stuckindoors", 0, CVT_BYTE, &cfg.monstersStuckInDoors, 0, 1}, - {"game-objects-neverhangoverledges", 0, CVT_BYTE, &cfg.avoidDropoffs, 0, 1}, - {"game-objects-clipping", 0, CVT_BYTE, &cfg.moveBlock, 0, 1}, - {"game-zombiescanexit", 0, CVT_BYTE, &cfg.zombiesCanExit, 0, 1}, - {"game-player-wallrun-northonly", 0, CVT_BYTE, &cfg.wallRunNorthOnly, 0, 1}, - {"game-objects-falloff", 0, CVT_BYTE, &cfg.fallOff, 0, 1}, - {"game-zclip", 0, CVT_BYTE, &cfg.moveCheckZ, 0, 1}, - {"game-corpse-sliding", 0, CVT_BYTE, &cfg.slidingCorpses, 0, 1}, - {"game-monsters-floatoverblocking", 0, CVT_BYTE, &cfg.allowMonsterFloatOverBlocking, 0, 1}, + {"game-anybossdeath666", 0, CVT_BYTE, &cfg.anyBossDeath, 0, 1}, + {"game-corpse-sliding", 0, CVT_BYTE, &cfg.slidingCorpses, 0, 1}, + {"game-maxskulls", 0, CVT_BYTE, &cfg.maxSkulls, 0, 1}, + {"game-monsters-floatoverblocking", 0, CVT_BYTE, &cfg.allowMonsterFloatOverBlocking, 0, 1}, + {"game-monsters-stuckindoors", 0, CVT_BYTE, &cfg.monstersStuckInDoors, 0, 1}, + {"game-objects-clipping", 0, CVT_BYTE, &cfg.moveBlock, 0, 1}, + {"game-objects-falloff", 0, CVT_BYTE, &cfg.fallOff, 0, 1}, + {"game-objects-gibcrushednonbleeders", 0, CVT_BYTE, &cfg.gibCrushedNonBleeders, 0, 1}, + {"game-objects-neverhangoverledges", 0, CVT_BYTE, &cfg.avoidDropoffs, 0, 1}, + {"game-player-wallrun-northonly", 0, CVT_BYTE, &cfg.wallRunNorthOnly, 0, 1}, + {"game-skullsinwalls", 0, CVT_BYTE, &cfg.allowSkullsInWalls, 0, 1}, + {"game-zclip", 0, CVT_BYTE, &cfg.moveCheckZ, 0, 1}, + {"game-zombiescanexit", 0, CVT_BYTE, &cfg.zombiesCanExit, 0, 1}, // Game state {"game-fastmonsters", 0, CVT_BYTE, &fastParm, 0, 1},