Skip to content

Commit

Permalink
Heretic|Inventory: Prevent giving items unavailable in shareware
Browse files Browse the repository at this point in the history
Also, don't attempt to define their nonexistent patches, avoiding
spurious warnings during game startup.
  • Loading branch information
danij-deng committed Apr 14, 2014
1 parent 4330101 commit c621c98
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 71 deletions.
1 change: 1 addition & 0 deletions doomsday/plugins/common/include/p_inventory.h
Expand Up @@ -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];
Expand Down
2 changes: 1 addition & 1 deletion doomsday/plugins/common/src/g_controls.c
Expand Up @@ -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
Expand Down
103 changes: 56 additions & 47 deletions doomsday/plugins/common/src/p_inventory.cpp
Expand Up @@ -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
};

Expand Down Expand Up @@ -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 &&
Expand Down Expand Up @@ -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);
}

Expand Down
6 changes: 3 additions & 3 deletions doomsday/plugins/common/src/p_user.c
Expand Up @@ -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)
{
Expand All @@ -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))
Expand Down
29 changes: 9 additions & 20 deletions doomsday/plugins/heretic/src/m_cheat.cpp
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}
Expand All @@ -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);
Expand Down

0 comments on commit c621c98

Please sign in to comment.