Setting "No very obvious scams" in Shopsanity
Problem
Some players may like the randomness of shopsanity, but not the illogical behavior (both gameplay-wise and story-wise) of a seller being able to have a very obvious bad deal, and call it a "special offer".
- Gameplay-wise: wasting a shopsanity space in an illogical way may be "fun" for some, but not for others. You may want to add more value to shop offers, and make collecting rupees more important for your gameplay.
- Story-wise: if you buy it, you're stupid; if not, the seller is stupid. Why does someone have to be stupid?
Currently, the workarounds only partially solve this and/or have undesired side effects:
- Using "affordable" settings (10 rupees) affects important items too.
- Using plando/json is possible, but only to disable things entirely, e.g.
"!Junk"or"!R*"to disable Recovery Hearts and Rupees in "special deals". - Or you'd have to specify/restrict all special deals, defeating the purpose of Shopsanity being random ...
Solution
I propose a setting "No obvious scams" in Shopsanity. It would limit the randomly assigned prices with a maximum, based on the logic below. It doesn't need to change the random distribution, just cap to a max after assigning what would be the random price. It applies these invariants:
- Rupee prices cannot be more than what they're worth.
Can't sell a Blupee for 50 rupees. What's that, sentimental value?? Maybe a collector's rupee??
- A repeatable purchase must be cheaper than any repeatable purchases of bigger quantities of the same item available in the same location.
If 30 arrows can always be bought for 60 rupees, then 10 arrows can only cost 59 or less.
- A special deal must be cheaper than any repeatable purchases of the same item (and of bigger quantities of the same item) available in the same location.
If 30 arrows can always be bought for 60 rupees, then a special deal of 30 arrows can only cost 59 or less. Another special deal of 10 arrows must also cost 59 or less. Note that it's fine for the special pack of 30 be cheaper than the special pack of 10 because both can only be bought once. Only the repeatable purchases impose a limit to other prices.
Same location above can mean the same shop + all shops in the same area. So, with entrance randomizer off, that would be all 3 market shops together, and both Karariko shops together. If this is too complex to implement, then at least limit prices in the same shop.
Of course, this should be a setting, because players may also find enjoyment in the absurdity of obvious scams.
It might not be a bad idea to set some limits on how much an item can cost based on what it is. It's kind of silly to have a Deku Shield or a Recovery Heart in a shop for like 245 rupees, when prices between 20-80 and 5-20 respectively make more sense and might be more fun to play with too.
Could be an idea to just arbitrarily assign a 'vanilla price' (or maybe a couple of vanilla prices) to every item idk.
This could be an interesting setting, but I disagree with the part about someone being stupid or whatever. It's a randomizer, story doesn't matter and things aren't supposed to make sense. It doesn't make sense that Anju would give you a legendary weapon for returning her chickens to her either.
On my fork I have a setting that allows fine-grained control over the prices of special deals. You can choose whether prices are selected uniformly from a given range, or weighted so prices near the middle of the range are more common. If that setting is accepted on main Dev (PR soon™), something like what @ETR-BTF and @r0bd0g suggested, where the price is either fixed or selected from a range depending on the item being sold, could be added as another option.
Sure, I guess it's just the way I play. I'm using Plando to make bosses give Triforce Pieces instead of Heart Containers, because I thought it would be cool to gather the Triforce of Courage like this (like in Zelda 1). So, I'm kind of making an alternate story in my head, just for fun; despite being aware (and enjoying) things as random, I kinda wanna keep the too illogical to a minimum.
For example, making the non-essential dialogue random is a setting that can be fun, but there's a reason (other than gameplay) why someone may not necessarily want this. The being stupid thing was just a joke :laughing:
This feels way too niche to be a setting. And, looking at #lets-play, people seem to generally enjoy laughing at the oddities like that.
At the end of the day, rando's gonna rando, and the only logic to it is used for item and entrance placement, not in the decision-making of NPCs.
An issue with adjusting prices for shop items is that it creates a dependency loop in the randomizer: which items can be placed at a location depend on the location's access rule, but with this the access rule would depend on which item is placed at the location. A solution for this could be e.g. adding a new step to fill specifically for temporarily patching access rules to account for wallet requirements. Alternatively, price restrictions could be applied to junk items only, which would still address the original issue.
As a third option, fill could prefer placing items whose “market price” is closer to the price of the shop location.
An issue with adjusting prices for shop items is that it creates a dependency loop in the randomizer
Invariant 1 should not affect randomizer logic at all. It's just rupees.
Invariant 2 only applies to items available as repeatable purchases in different quantities. So only arrows, bombs and nuts. Those require bow and bomb bag anyway. Nuts I believe don't affect logic ... much? Do they? Are they "junk"? And bombchus. If the bombchus in logic option is off, then invariant 2 should not affect logic at all ... I think?
In any case, only a max price is applied, so assuming you were to apply this as a final step, and not consider this price reduction in logic, it would affect logic only where potentially making things easier in some cases because of fewer wallet requirements that might apply to important items like tunics and shields. This change would never make a seed unbeatable. At most it could potentially "break" it making things too easy/accessible in corner cases.
If we make it so such price reductions never cross wallet capacity boundaries, then none of the invariants should affect any randomizer logic at all, so all of those complications would be avoided.
To explain an example of corner case I'm talking about: Say Zora Tunic is normally available for 300 rupees. Invariant 3 would require a Zora Tunic special deal in same shop (or area) be 299 or less (or we could say 300 or less). But if we make it <=99, this would cross wallet capacity boundary, so in this case we can also require this adjusted price to be least 100 to avoid any effects in randomized logic.
Then, it doesn't matter if the item is junk or not -- the price limit won't affect already decided logic because adjustments only apply considering prices in the same shop (or area).