Skip to content
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions Source/items.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3816,6 +3816,37 @@ void GetItemStr(Item &item)
}
}

bool IsItemIdentifiableByStoryteller(const Item &item)
{
if (item.isEmpty()) {
return false;
}
if (item._iMagical == ITEM_QUALITY_NORMAL) {
return false;
}
return !item._iIdentified;
}

int CountIdentifiablePlayerItems(const Player &player)
{
return static_cast<int>(std::count_if(PlayerItemsRange { player }.begin(), PlayerItemsRange { player }.end(), [](const Item &item) {
return IsItemIdentifiableByStoryteller(item);
}));
}

int IdentifyPlayerItems(Player &player)
{
const int identifiedItemCount = static_cast<int>(std::count_if(PlayerItemsRange { player }.begin(), PlayerItemsRange { player }.end(), [](Item &item) {
if (!IsItemIdentifiableByStoryteller(item)) {
return false;
}
item._iIdentified = true;
return true;
}));
CalcPlrInv(player, true);
return identifiedItemCount;
}

void CheckIdentify(Player &player, int cii)
{
Item *pi;
Expand Down
3 changes: 3 additions & 0 deletions Source/items.h
Original file line number Diff line number Diff line change
Expand Up @@ -545,6 +545,9 @@ void ProcessItems();
void FreeItemGFX();
void GetItemFrm(Item &item);
void GetItemStr(Item &item);
bool IsItemIdentifiableByStoryteller(const Item &item);
int CountIdentifiablePlayerItems(const Player &player);
int IdentifyPlayerItems(Player &player);
void CheckIdentify(Player &player, int cii);
void DoRepair(Player &player, int cii);
void DoRecharge(Player &player, int cii);
Expand Down
8 changes: 1 addition & 7 deletions Source/objects.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2745,13 +2745,7 @@ void OperateShrineGlimmering(Player &player)
if (&player != MyPlayer)
return;

for (Item &item : PlayerItemsRange { player }) {
if (item._iMagical != ITEM_QUALITY_NORMAL && !item._iIdentified) {
item._iIdentified = true;
}
}

CalcPlrInv(player, true);
IdentifyPlayerItems(player);
RedrawEverything();

InitDiabloMsg(EMSG_SHRINE_GLIMMERING);
Expand Down
190 changes: 127 additions & 63 deletions Source/stores.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -897,11 +897,20 @@ void StoreNoRoom()
AddSText(0, 14, _("You do not have enough room in inventory"), UiFlags::ColorWhite | UiFlags::AlignCenter, true);
}

void StoreConfirm(Item &item)
{
StartStore(OldActiveStore);
HasScrollbar = false;
ClearSText(5, 23);
void StoreConfirm(Item &item)
{
StartStore(OldActiveStore);
HasScrollbar = false;
ClearSText(5, 23);

if (OldActiveStore == TalkID::StorytellerIdentifyAll) {
AddSText(0, 10, _("Identify all items?"), UiFlags::ColorWhite | UiFlags::AlignCenter, false);
AddSText(0, 12, fmt::format(fmt::runtime(_("Cost: {:s} gold")), FormatInteger(item._iIvalue)), UiFlags::ColorWhitegold | UiFlags::AlignCenter, false);
AddSText(0, 15, _("Are you sure you want to identify all items?"), UiFlags::ColorWhite | UiFlags::AlignCenter, false);
AddSText(0, 18, _("Yes"), UiFlags::ColorWhite | UiFlags::AlignCenter, true);
AddSText(0, 20, _("No"), UiFlags::ColorWhite | UiFlags::AlignCenter, true);
return;
}

const UiFlags itemColor = item.getTextColorWithStatCheck();
AddSText(20, 8, item.getName(), itemColor, false);
Expand All @@ -917,6 +926,9 @@ void StoreConfirm(Item &item)
case TalkID::StorytellerIdentify:
prompt = _("Are you sure you want to identify this item?");
break;
case TalkID::StorytellerIdentifyAll:
prompt = _("Are you sure you want to identify all items?");
break;
case TalkID::HealerBuy:
case TalkID::SmithPremiumBuy:
case TalkID::WitchBuy:
Expand All @@ -937,14 +949,28 @@ void StoreConfirm(Item &item)
app_fatal(StrCat("Unknown store dialog ", static_cast<int>(OldActiveStore)));
}
AddSText(0, 15, prompt, UiFlags::ColorWhite | UiFlags::AlignCenter, false);
AddSText(0, 18, _("Yes"), UiFlags::ColorWhite | UiFlags::AlignCenter, true);
AddSText(0, 20, _("No"), UiFlags::ColorWhite | UiFlags::AlignCenter, true);
}

void StartBoy()
{
IsTextFullSize = false;
HasScrollbar = false;
AddSText(0, 18, _("Yes"), UiFlags::ColorWhite | UiFlags::AlignCenter, true);
AddSText(0, 20, _("No"), UiFlags::ColorWhite | UiFlags::AlignCenter, true);
}

void RestoreStoreFromOldState()
{
if (OldActiveStore == TalkID::StorytellerIdentifyAll) {
StartStore(TalkID::Storyteller);
CurrentTextLine = 16;
ScrollPos = 0;
return;
}

StartStore(OldActiveStore);
CurrentTextLine = OldTextLine;
ScrollPos = OldScrollPos;
}

void StartBoy()
{
IsTextFullSize = false;
HasScrollbar = false;
AddSText(0, 2, _("Wirt the Peg-legged boy"), UiFlags::ColorWhitegold | UiFlags::AlignCenter, false);
AddSLine(5);
if (!BoyItem.isEmpty()) {
Expand Down Expand Up @@ -1050,19 +1076,14 @@ void StartStoryteller()
AddSText(0, 9, _("Would you like to:"), UiFlags::ColorWhitegold | UiFlags::AlignCenter, false);
AddSText(0, 12, _("Talk to Cain"), UiFlags::ColorBlue | UiFlags::AlignCenter, true);
AddSText(0, 14, _("Identify an item"), UiFlags::ColorWhite | UiFlags::AlignCenter, true);
AddSText(0, 16, _("Identify all items"), UiFlags::ColorWhite | UiFlags::AlignCenter, true);
AddSText(0, 18, _("Say goodbye"), UiFlags::ColorWhite | UiFlags::AlignCenter, true);
AddSLine(5);
}

bool IdItemOk(Item *i)
{
if (i->isEmpty()) {
return false;
}
if (i->_iMagical == ITEM_QUALITY_NORMAL) {
return false;
}
return !i->_iIdentified;
return IsItemIdentifiableByStoryteller(*i);
}

void AddStoreHoldId(Item itm, int8_t i)
Expand Down Expand Up @@ -1138,15 +1159,19 @@ void StartStorytellerIdentify()
}
}

if (!idok) {
HasScrollbar = false;

RenderGold = true;
AddSText(20, 1, _("You have nothing to identify."), UiFlags::ColorWhitegold, false);
AddSLine(3);
AddItemListBackButton(/*selectable=*/true);
return;
}
if (!idok) {
HasScrollbar = false;

RenderGold = true;
if (OldActiveStore == TalkID::StorytellerIdentifyAll) {
AddSText(20, 1, _("There are no items to identify."), UiFlags::ColorWhitegold, false);
} else {
AddSText(20, 1, _("You have nothing to identify."), UiFlags::ColorWhitegold, false);
}
AddSLine(3);
AddItemListBackButton(/*selectable=*/true);
return;
}

HasScrollbar = true;
ScrollPos = 0;
Expand Down Expand Up @@ -1174,6 +1199,13 @@ void StartStorytellerIdentifyShow(Item &item)
AddSText(0, 18, _("Done"), UiFlags::ColorWhite | UiFlags::AlignCenter, true);
}

void StorytellerIdentifyAllItems()
{
Player &myPlayer = *MyPlayer;
TakePlrsMoney(CountIdentifiablePlayerItems(myPlayer) * 100);
IdentifyPlayerItems(myPlayer);
}

void StartTalk()
{
int la;
Expand Down Expand Up @@ -1779,6 +1811,11 @@ void ConfirmEnter(Item &item)
StorytellerIdentifyItem(item);
StartStore(TalkID::StorytellerIdentifyShow);
return;
case TalkID::StorytellerIdentifyAll:
StorytellerIdentifyAllItems();
StartStore(TalkID::Storyteller);
CurrentTextLine = 16;
return;
case TalkID::SmithPremiumBuy:
SmithBuyPItem(item);
break;
Expand All @@ -1787,13 +1824,19 @@ void ConfirmEnter(Item &item)
}
}

StartStore(OldActiveStore);

if (CurrentTextLine == BackButtonLine())
return;

CurrentTextLine = OldTextLine;
ScrollPos = std::min(OldScrollPos, NumTextLines);
StartStore(OldActiveStore);

if (CurrentTextLine == BackButtonLine())
return;

if (OldActiveStore == TalkID::StorytellerIdentifyAll) {
CurrentTextLine = 16;
ScrollPos = 0;
return;
}

CurrentTextLine = OldTextLine;
ScrollPos = std::min(OldScrollPos, NumTextLines);

while (CurrentTextLine != -1 && !TextLine[CurrentTextLine].isSelectable()) {
CurrentTextLine--;
Expand Down Expand Up @@ -1858,19 +1901,35 @@ void StorytellerEnter()
case 14:
StartStore(TalkID::StorytellerIdentify);
break;
case 16:
OldActiveStore = TalkID::StorytellerIdentifyAll;
OldTextLine = 16;
OldScrollPos = 0;
TempItem.clear();
TempItem._iIvalue = CountIdentifiablePlayerItems(*MyPlayer) * 100;
if (TempItem._iIvalue == 0) {
StartStore(TalkID::StorytellerIdentify);
return;
}
if (!PlayerCanAfford(TempItem._iIvalue)) {
StartStore(TalkID::NoMoney);
return;
}
StartStore(TalkID::Confirm);
return;
case 18:
ActiveStore = TalkID::None;
break;
}
}

void StorytellerIdentifyEnter()
{
if (CurrentTextLine == BackButtonLine()) {
StartStore(TalkID::Storyteller);
CurrentTextLine = 14;
return;
}
void StorytellerIdentifyEnter()
{
if (CurrentTextLine == BackButtonLine()) {
StartStore(TalkID::Storyteller);
CurrentTextLine = OldActiveStore == TalkID::StorytellerIdentifyAll ? 16 : 14;
return;
}

OldActiveStore = TalkID::StorytellerIdentify;
OldTextLine = CurrentTextLine;
Expand Down Expand Up @@ -2293,6 +2352,8 @@ void StartStore(TalkID s)
case TalkID::StorytellerIdentify:
StartStorytellerIdentify();
break;
case TalkID::StorytellerIdentifyAll:
break;
case TalkID::SmithPremiumBuy:
if (!StartSmithPremiumBuy())
return;
Expand Down Expand Up @@ -2438,20 +2499,22 @@ void StoreESC()
StartStore(TalkID::Storyteller);
CurrentTextLine = 14;
break;
case TalkID::StorytellerIdentifyAll:
StartStore(TalkID::Storyteller);
CurrentTextLine = 16;
break;
case TalkID::StorytellerIdentifyShow:
StartStore(TalkID::StorytellerIdentify);
break;
case TalkID::NoMoney:
case TalkID::NoRoom:
case TalkID::Confirm:
StartStore(OldActiveStore);
CurrentTextLine = OldTextLine;
ScrollPos = OldScrollPos;
break;
case TalkID::None:
break;
}
}
case TalkID::NoMoney:
case TalkID::NoRoom:
case TalkID::Confirm:
RestoreStoreFromOldState();
break;
case TalkID::None:
break;
}
}

void StoreUp()
{
Expand Down Expand Up @@ -2608,15 +2671,13 @@ void StoreEnter()
case TalkID::WitchRecharge:
WitchRechargeEnter();
break;
case TalkID::NoMoney:
case TalkID::NoRoom:
StartStore(OldActiveStore);
CurrentTextLine = OldTextLine;
ScrollPos = OldScrollPos;
break;
case TalkID::Confirm:
ConfirmEnter(TempItem);
break;
case TalkID::NoMoney:
case TalkID::NoRoom:
RestoreStoreFromOldState();
break;
case TalkID::Confirm:
ConfirmEnter(TempItem);
break;
case TalkID::Boy:
BoyEnter();
break;
Expand All @@ -2635,6 +2696,9 @@ void StoreEnter()
case TalkID::StorytellerIdentify:
StorytellerIdentifyEnter();
break;
case TalkID::StorytellerIdentifyAll:
StartStore(TalkID::Confirm);
break;
case TalkID::Gossip:
TalkEnter();
break;
Expand Down
1 change: 1 addition & 0 deletions Source/stores.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ enum class TalkID : uint8_t {
Storyteller,
HealerBuy,
StorytellerIdentify,
StorytellerIdentifyAll,
SmithPremiumBuy,
Gossip,
StorytellerIdentifyShow,
Expand Down