diff --git a/doomsday/plugins/common/include/p_inventory.h b/doomsday/plugins/common/include/p_inventory.h index 537d06138d..6bc81ec0b5 100644 --- a/doomsday/plugins/common/include/p_inventory.h +++ b/doomsday/plugins/common/include/p_inventory.h @@ -30,6 +30,7 @@ #define IIF_READY_ALWAYS 0x8 // Item is always "ready" (i.e., usable). typedef struct { + int gameModeBits; // Game modes the item is available in. byte flags; char niceName[32]; char action[32]; diff --git a/doomsday/plugins/common/src/g_controls.c b/doomsday/plugins/common/src/g_controls.c index 19a74efd8c..dd7bfb2e67 100644 --- a/doomsday/plugins/common/src/g_controls.c +++ b/doomsday/plugins/common/src/g_controls.c @@ -798,7 +798,7 @@ static void G_UpdateCmdControls(ticcmd_t *cmd, int pnum, } #endif -#if __JHEXEN__ || __JSTRIFE__ +#if __JHEXEN__ if(PLAYER_ACTION(pnum, A_PANIC) && !cmd->arti) { PLAYER_ACTION(pnum, A_PANIC) = false; // Use one of each artifact diff --git a/doomsday/plugins/common/src/p_inventory.cpp b/doomsday/plugins/common/src/p_inventory.cpp index c64bbac420..afb81dcc9b 100644 --- a/doomsday/plugins/common/src/p_inventory.cpp +++ b/doomsday/plugins/common/src/p_inventory.cpp @@ -46,53 +46,53 @@ int didUseItem = false; static def_invitem_t const itemDefs[NUM_INVENTORYITEM_TYPES-1] = { #if __JHERETIC__ - {IIF_USE_PANIC, "TXT_ARTIINVULNERABILITY", "A_Invulnerability", "artiuse", "ARTIINVU", CTL_INVULNERABILITY}, - {IIF_USE_PANIC, "TXT_ARTIINVISIBILITY", "A_Invisibility", "artiuse", "ARTIINVS", CTL_INVISIBILITY}, - {IIF_USE_PANIC, "TXT_ARTIHEALTH", "A_Health", "artiuse", "ARTIPTN2", CTL_HEALTH}, - {IIF_USE_PANIC, "TXT_ARTISUPERHEALTH", "A_SuperHealth", "artiuse", "ARTISPHL", CTL_SUPER_HEALTH}, - {IIF_USE_PANIC, "TXT_ARTITOMEOFPOWER", "A_TombOfPower", "artiuse", "ARTIPWBK", CTL_TOME_OF_POWER}, - {IIF_USE_PANIC, "TXT_ARTITORCH", "A_Torch", "artiuse", "ARTITRCH", CTL_TORCH}, - {IIF_USE_PANIC, "TXT_ARTIFIREBOMB", "A_FireBomb", "artiuse", "ARTIFBMB", CTL_FIREBOMB}, - {IIF_USE_PANIC, "TXT_ARTIEGG", "A_Egg", "artiuse", "ARTIEGGC", CTL_EGG}, - {IIF_USE_PANIC, "TXT_ARTIFLY", "A_Wings", "artiuse", "ARTISOAR", CTL_FLY}, - {IIF_USE_PANIC, "TXT_ARTITELEPORT", "A_Teleport", "artiuse", "ARTIATLP", CTL_TELEPORT}, + {GM_ANY, IIF_USE_PANIC, "TXT_ARTIINVULNERABILITY", "A_Invulnerability", "artiuse", "ARTIINVU", CTL_INVULNERABILITY}, + {GM_ANY, IIF_USE_PANIC, "TXT_ARTIINVISIBILITY", "A_Invisibility", "artiuse", "ARTIINVS", CTL_INVISIBILITY}, + {GM_ANY, IIF_USE_PANIC, "TXT_ARTIHEALTH", "A_Health", "artiuse", "ARTIPTN2", CTL_HEALTH}, + {GM_NOT_SHAREWARE, IIF_USE_PANIC, "TXT_ARTISUPERHEALTH", "A_SuperHealth", "artiuse", "ARTISPHL", CTL_SUPER_HEALTH}, + {GM_ANY, IIF_USE_PANIC, "TXT_ARTITOMEOFPOWER", "A_TombOfPower", "artiuse", "ARTIPWBK", CTL_TOME_OF_POWER}, + {GM_ANY, IIF_USE_PANIC, "TXT_ARTITORCH", "A_Torch", "artiuse", "ARTITRCH", CTL_TORCH}, + {GM_ANY, IIF_USE_PANIC, "TXT_ARTIFIREBOMB", "A_FireBomb", "artiuse", "ARTIFBMB", CTL_FIREBOMB}, + {GM_ANY, IIF_USE_PANIC, "TXT_ARTIEGG", "A_Egg", "artiuse", "ARTIEGGC", CTL_EGG}, + {GM_ANY, IIF_USE_PANIC, "TXT_ARTIFLY", "A_Wings", "artiuse", "ARTISOAR", CTL_FLY}, + {GM_NOT_SHAREWARE, IIF_USE_PANIC, "TXT_ARTITELEPORT", "A_Teleport", "artiuse", "ARTIATLP", CTL_TELEPORT}, #elif __JHEXEN__ - {IIF_USE_PANIC, "TXT_ARTIINVULNERABILITY", "A_Invulnerability", "ARTIFACT_USE", "ARTIINVU", CTL_INVULNERABILITY}, - {IIF_USE_PANIC, "TXT_ARTIHEALTH", "A_Health", "ARTIFACT_USE", "ARTIPTN2", CTL_HEALTH}, - {IIF_USE_PANIC, "TXT_ARTISUPERHEALTH", "A_SuperHealth", "ARTIFACT_USE", "ARTISPHL", CTL_MYSTIC_URN}, - {IIF_USE_PANIC, "TXT_ARTIHEALINGRADIUS", "A_HealRadius", "ARTIFACT_USE", "ARTIHRAD", -1}, - {IIF_USE_PANIC, "TXT_ARTISUMMON", "A_SummonTarget", "ARTIFACT_USE", "ARTISUMN", CTL_DARK_SERVANT}, - {IIF_USE_PANIC, "TXT_ARTITORCH", "A_Torch", "ARTIFACT_USE", "ARTITRCH", CTL_TORCH}, - {IIF_USE_PANIC, "TXT_ARTIEGG", "A_Egg", "ARTIFACT_USE", "ARTIPORK", CTL_EGG}, - {IIF_USE_PANIC, "TXT_ARTIFLY", "A_Wings", "ARTIFACT_USE", "ARTISOAR", CTL_FLY}, - {IIF_USE_PANIC, "TXT_ARTIBLASTRADIUS", "A_BlastRadius", "ARTIFACT_USE", "ARTIBLST", CTL_BLAST_RADIUS}, - {IIF_USE_PANIC, "TXT_ARTIPOISONBAG", "A_PoisonBag", "ARTIFACT_USE", "ARTIPSBG", CTL_POISONBAG}, - {IIF_USE_PANIC, "TXT_ARTITELEPORTOTHER", "A_TeleportOther", "ARTIFACT_USE", "ARTITELO", CTL_TELEPORT_OTHER}, - {IIF_USE_PANIC, "TXT_ARTISPEED", "A_Speed", "ARTIFACT_USE", "ARTISPED", CTL_SPEED_BOOTS}, - {IIF_USE_PANIC, "TXT_ARTIBOOSTMANA", "A_BoostMana", "ARTIFACT_USE", "ARTIBMAN", CTL_KRATER}, - {IIF_USE_PANIC, "TXT_ARTIBOOSTARMOR", "A_BoostArmor", "ARTIFACT_USE", "ARTIBRAC", -1}, - {IIF_USE_PANIC, "TXT_ARTITELEPORT", "A_Teleport", "ARTIFACT_USE", "ARTIATLP", CTL_TELEPORT}, - {0, "TXT_ARTIPUZZSKULL", "A_PuzzSkull", "PUZZLE_SUCCESS", "ARTISKLL", -1}, - {0, "TXT_ARTIPUZZGEMBIG", "A_PuzzGemBig", "PUZZLE_SUCCESS", "ARTIBGEM", -1}, - {0, "TXT_ARTIPUZZGEMRED", "A_PuzzGemRed", "PUZZLE_SUCCESS", "ARTIGEMR", -1}, - {0, "TXT_ARTIPUZZGEMGREEN1", "A_PuzzGemGreen1", "PUZZLE_SUCCESS", "ARTIGEMG", -1}, - {0, "TXT_ARTIPUZZGEMGREEN2", "A_PuzzGemGreen2", "PUZZLE_SUCCESS", "ARTIGMG2", -1}, - {0, "TXT_ARTIPUZZGEMBLUE1", "A_PuzzGemBlue1", "PUZZLE_SUCCESS", "ARTIGEMB", -1}, - {0, "TXT_ARTIPUZZGEMBLUE2", "A_PuzzGemBlue2", "PUZZLE_SUCCESS", "ARTIGMB2", -1}, - {0, "TXT_ARTIPUZZBOOK1", "A_PuzzBook1", "PUZZLE_SUCCESS", "ARTIBOK1", -1}, - {0, "TXT_ARTIPUZZBOOK2", "A_PuzzBook2", "PUZZLE_SUCCESS", "ARTIBOK2", -1}, - {0, "TXT_ARTIPUZZSKULL2", "A_PuzzSkull2", "PUZZLE_SUCCESS", "ARTISKL2", -1}, - {0, "TXT_ARTIPUZZFWEAPON", "A_PuzzFWeapon", "PUZZLE_SUCCESS", "ARTIFWEP", -1}, - {0, "TXT_ARTIPUZZCWEAPON", "A_PuzzCWeapon", "PUZZLE_SUCCESS", "ARTICWEP", -1}, - {0, "TXT_ARTIPUZZMWEAPON", "A_PuzzMWeapon", "PUZZLE_SUCCESS", "ARTIMWEP", -1}, - {0, "TXT_ARTIPUZZGEAR1", "A_PuzzGear1", "PUZZLE_SUCCESS", "ARTIGEAR", -1}, - {0, "TXT_ARTIPUZZGEAR2", "A_PuzzGear2", "PUZZLE_SUCCESS", "ARTIGER2", -1}, - {0, "TXT_ARTIPUZZGEAR3", "A_PuzzGear3", "PUZZLE_SUCCESS", "ARTIGER3", -1}, - {0, "TXT_ARTIPUZZGEAR4", "A_PuzzGear4", "PUZZLE_SUCCESS", "ARTIGER4", -1} + {GM_ANY, IIF_USE_PANIC, "TXT_ARTIINVULNERABILITY", "A_Invulnerability", "ARTIFACT_USE", "ARTIINVU", CTL_INVULNERABILITY}, + {GM_ANY, IIF_USE_PANIC, "TXT_ARTIHEALTH", "A_Health", "ARTIFACT_USE", "ARTIPTN2", CTL_HEALTH}, + {GM_ANY, IIF_USE_PANIC, "TXT_ARTISUPERHEALTH", "A_SuperHealth", "ARTIFACT_USE", "ARTISPHL", CTL_MYSTIC_URN}, + {GM_ANY, IIF_USE_PANIC, "TXT_ARTIHEALINGRADIUS", "A_HealRadius", "ARTIFACT_USE", "ARTIHRAD", -1}, + {GM_ANY, IIF_USE_PANIC, "TXT_ARTISUMMON", "A_SummonTarget", "ARTIFACT_USE", "ARTISUMN", CTL_DARK_SERVANT}, + {GM_ANY, IIF_USE_PANIC, "TXT_ARTITORCH", "A_Torch", "ARTIFACT_USE", "ARTITRCH", CTL_TORCH}, + {GM_ANY, IIF_USE_PANIC, "TXT_ARTIEGG", "A_Egg", "ARTIFACT_USE", "ARTIPORK", CTL_EGG}, + {GM_ANY, IIF_USE_PANIC, "TXT_ARTIFLY", "A_Wings", "ARTIFACT_USE", "ARTISOAR", CTL_FLY}, + {GM_ANY, IIF_USE_PANIC, "TXT_ARTIBLASTRADIUS", "A_BlastRadius", "ARTIFACT_USE", "ARTIBLST", CTL_BLAST_RADIUS}, + {GM_ANY, IIF_USE_PANIC, "TXT_ARTIPOISONBAG", "A_PoisonBag", "ARTIFACT_USE", "ARTIPSBG", CTL_POISONBAG}, + {GM_ANY, IIF_USE_PANIC, "TXT_ARTITELEPORTOTHER", "A_TeleportOther", "ARTIFACT_USE", "ARTITELO", CTL_TELEPORT_OTHER}, + {GM_ANY, IIF_USE_PANIC, "TXT_ARTISPEED", "A_Speed", "ARTIFACT_USE", "ARTISPED", CTL_SPEED_BOOTS}, + {GM_ANY, IIF_USE_PANIC, "TXT_ARTIBOOSTMANA", "A_BoostMana", "ARTIFACT_USE", "ARTIBMAN", CTL_KRATER}, + {GM_ANY, IIF_USE_PANIC, "TXT_ARTIBOOSTARMOR", "A_BoostArmor", "ARTIFACT_USE", "ARTIBRAC", -1}, + {GM_ANY, IIF_USE_PANIC, "TXT_ARTITELEPORT", "A_Teleport", "ARTIFACT_USE", "ARTIATLP", CTL_TELEPORT}, + {GM_ANY, 0, "TXT_ARTIPUZZSKULL", "A_PuzzSkull", "PUZZLE_SUCCESS", "ARTISKLL", -1}, + {GM_ANY, 0, "TXT_ARTIPUZZGEMBIG", "A_PuzzGemBig", "PUZZLE_SUCCESS", "ARTIBGEM", -1}, + {GM_ANY, 0, "TXT_ARTIPUZZGEMRED", "A_PuzzGemRed", "PUZZLE_SUCCESS", "ARTIGEMR", -1}, + {GM_ANY, 0, "TXT_ARTIPUZZGEMGREEN1", "A_PuzzGemGreen1", "PUZZLE_SUCCESS", "ARTIGEMG", -1}, + {GM_ANY, 0, "TXT_ARTIPUZZGEMGREEN2", "A_PuzzGemGreen2", "PUZZLE_SUCCESS", "ARTIGMG2", -1}, + {GM_ANY, 0, "TXT_ARTIPUZZGEMBLUE1", "A_PuzzGemBlue1", "PUZZLE_SUCCESS", "ARTIGEMB", -1}, + {GM_ANY, 0, "TXT_ARTIPUZZGEMBLUE2", "A_PuzzGemBlue2", "PUZZLE_SUCCESS", "ARTIGMB2", -1}, + {GM_ANY, 0, "TXT_ARTIPUZZBOOK1", "A_PuzzBook1", "PUZZLE_SUCCESS", "ARTIBOK1", -1}, + {GM_ANY, 0, "TXT_ARTIPUZZBOOK2", "A_PuzzBook2", "PUZZLE_SUCCESS", "ARTIBOK2", -1}, + {GM_ANY, 0, "TXT_ARTIPUZZSKULL2", "A_PuzzSkull2", "PUZZLE_SUCCESS", "ARTISKL2", -1}, + {GM_ANY, 0, "TXT_ARTIPUZZFWEAPON", "A_PuzzFWeapon", "PUZZLE_SUCCESS", "ARTIFWEP", -1}, + {GM_ANY, 0, "TXT_ARTIPUZZCWEAPON", "A_PuzzCWeapon", "PUZZLE_SUCCESS", "ARTICWEP", -1}, + {GM_ANY, 0, "TXT_ARTIPUZZMWEAPON", "A_PuzzMWeapon", "PUZZLE_SUCCESS", "ARTIMWEP", -1}, + {GM_ANY, 0, "TXT_ARTIPUZZGEAR1", "A_PuzzGear1", "PUZZLE_SUCCESS", "ARTIGEAR", -1}, + {GM_ANY, 0, "TXT_ARTIPUZZGEAR2", "A_PuzzGear2", "PUZZLE_SUCCESS", "ARTIGER2", -1}, + {GM_ANY, 0, "TXT_ARTIPUZZGEAR3", "A_PuzzGear3", "PUZZLE_SUCCESS", "ARTIGER3", -1}, + {GM_ANY, 0, "TXT_ARTIPUZZGEAR4", "A_PuzzGear4", "PUZZLE_SUCCESS", "ARTIGER4", -1} #elif __JDOOM64__ - {IIF_READY_ALWAYS, "DEMONKEY1", "", "", "", -1}, - {IIF_READY_ALWAYS, "DEMONKEY2", "", "", "", -1}, - {IIF_READY_ALWAYS, "DEMONKEY3", "", "", "", -1} + {GM_ANY, IIF_READY_ALWAYS, "DEMONKEY1", "", "", "", -1}, + {GM_ANY, IIF_READY_ALWAYS, "DEMONKEY2", "", "", "", -1}, + {GM_ANY, IIF_READY_ALWAYS, "DEMONKEY3", "", "", "", -1} #endif }; @@ -180,6 +180,11 @@ static dd_bool giveItem(playerinventory_t *inv, inventoryitemtype_t type) { uint count = countItems(inv, type); + // Do not give items unavailable for the current game mode. + def_invitem_t const *def = itemDefForType(type); + if(!(def->gameModeBits & gameModeBits)) + return false; + #if __JHEXEN__ // Can't carry more than 1 puzzle item in coop netplay. if(count && type >= IIT_FIRSTPUZZITEM && IS_NETGAME && @@ -293,10 +298,14 @@ void P_InitInventory() def_invitem_t const *def = P_GetInvItemDef(type); invitem_t *data = &invItems[i]; + // Skip items unavailable for the current game mode. + if(!(def->gameModeBits & gameModeBits)) + continue; + data->type = type; - data->niceName = textenum_t(Def_Get(DD_DEF_TEXT, (char*) def->niceName, NULL)); + data->niceName = textenum_t(Def_Get(DD_DEF_TEXT, (char *) def->niceName, NULL)); data->action = getActionPtr(def->action); - data->useSnd = sfxenum_t(Def_Get(DD_DEF_SOUND, (char*) def->useSnd, NULL)); + data->useSnd = sfxenum_t(Def_Get(DD_DEF_SOUND, (char *) def->useSnd, NULL)); data->patchId = R_DeclarePatch(def->patch); } diff --git a/doomsday/plugins/common/src/p_user.c b/doomsday/plugins/common/src/p_user.c index 5f58fa67fd..0cef8f08fc 100644 --- a/doomsday/plugins/common/src/p_user.c +++ b/doomsday/plugins/common/src/p_user.c @@ -1176,11 +1176,11 @@ void P_PlayerThinkSounds(player_t* player) #endif } -void P_PlayerThinkItems(player_t* player) +void P_PlayerThinkItems(player_t *player) { #if __JHERETIC__ || __JHEXEN__ inventoryitemtype_t i, type = IIT_NONE; // What to use? - int pnum = player - players; + int pnum = player - players; if(player->brain.useInvItem) { @@ -1190,7 +1190,7 @@ void P_PlayerThinkItems(player_t* player) // Inventory item hot keys. for(i = IIT_FIRST; i < NUM_INVENTORYITEM_TYPES; ++i) { - const def_invitem_t* def = P_GetInvItemDef(i); + def_invitem_t const *def = P_GetInvItemDef(i); if(def->hotKeyCtrlIdent != -1 && P_GetImpulseControlState(pnum, def->hotKeyCtrlIdent)) diff --git a/doomsday/plugins/heretic/src/m_cheat.cpp b/doomsday/plugins/heretic/src/m_cheat.cpp index 2c65379ffc..f10e9baf36 100644 --- a/doomsday/plugins/heretic/src/m_cheat.cpp +++ b/doomsday/plugins/heretic/src/m_cheat.cpp @@ -109,28 +109,25 @@ CHEAT_FUNC(InvItem3) // Dead players can't cheat. if(plr->health <= 0) return false; + bool didGive = false; inventoryitemtype_t type = inventoryitemtype_t(args[0] - 'a' + 1); int count = args[1] - '0'; if(type > IIT_NONE && type < NUM_INVENTORYITEM_TYPES && count > 0 && count < 10) { - if(gameMode == heretic_shareware && (type == IIT_SUPERHEALTH || type == IIT_TELEPORT)) - { - P_SetMessage(plr, LMF_NO_HIDE, TXT_CHEATITEMSFAIL); - return false; - } - for(int i = 0; i < count; ++i) { - P_InventoryGive(player, type, false); + if(P_InventoryGive(player, type, false)) + didGive = true; } - P_SetMessage(plr, LMF_NO_HIDE, TXT_CHEATINVITEMS3); } - else + + if(!didGive) { - // Bad input P_SetMessage(plr, LMF_NO_HIDE, TXT_CHEATITEMSFAIL); + return false; } + P_SetMessage(plr, LMF_NO_HIDE, TXT_CHEATINVITEMS3); S_LocalSound(SFX_DORCLS, NULL); return true; } @@ -501,13 +498,9 @@ D_CMD(CheatGive) } // Give one specific item type. - if(!(gameMode == heretic_shareware && - (idx == IIT_SUPERHEALTH || idx == IIT_TELEPORT))) + for(int j = 0; j < MAXINVITEMCOUNT; ++j) { - for(int j = 0; j < MAXINVITEMCOUNT; ++j) - { - P_InventoryGive(player, inventoryitemtype_t(idx), false); - } + P_InventoryGive(player, inventoryitemtype_t(idx), false); } break; } @@ -516,10 +509,6 @@ D_CMD(CheatGive) // Give all inventory items. for(int type = IIT_FIRST; type < NUM_INVENTORYITEM_TYPES; ++type) { - if(gameMode == heretic_shareware && - (type == IIT_SUPERHEALTH || type == IIT_TELEPORT)) - continue; - for(int i = 0; i < MAXINVITEMCOUNT; ++i) { P_InventoryGive(player, inventoryitemtype_t(type), false);