munificent / hauberk

A web-based roguelike written in Dart.
http://munificent.github.io/hauberk/
Other
2.01k stars 202 forks source link

Recipe complete false positive? #8

Closed jwaltz closed 10 years ago

jwaltz commented 10 years ago

screen shot 2014-08-14 at 6 24 33 am I stumbled across this last night and was wondering if this is intended? I couldn't find any recipes that are just a stick. This seems like possibly an interesting bug i'd be more than happy to tackle over the weekend.

munificent commented 10 years ago

It is intended, though it's kind of an experimental feature. You can toss any piece of equipment in the crucible by itself and basically "re-roll" it. You may get a different piece of gear, something better, or nothing at all.

The gameplay problem is that let's say you find a dagger. You start using it. Since Hauberk doesn't have stores where you can sell loot for cash, that instantly means all other daggers are now worth absolutely nothing. In fact, every weapon worse than a dagger is worth nothing too. That makes finding loot a bit less fun since you end up wading through a lot of items that you ultimately ignore.

With this, any item at least has some marginal value as a lottery ticket on the Crucible's Wheel of Random Loot. The code for this is here: https://github.com/munificent/hauberk/blob/master/lib/src/content/recipes.dart#L114

I still haven't decided if I like this feature or not. What do you think?

jwaltz commented 10 years ago

That explanation makes sense to me, and I think it's a great way to keep some intrinsic value in items that are the same or worse than what you've already got. I think there could be two issues here. First is that a user might not know immediately what is going on--like me thinking it was unintended behavior--when they place a weapon they found in the crucible and end up destroying it. Second is that this behavior is tied into the player's inventory/home capacity + their willingness to keep picking up items equal to or worse than what they currently have and the rarity of coins used in making re-rolling worthwhile.

munificent commented 10 years ago

First is that a user might not know immediately what is going on--like me thinking it was unintended behavior--when they place a weapon they found in the crucible and end up destroying it.

Yeah, maybe the crucible should show a description of what the recipe does once all of the ingredients are added? Would you like to try adding that and see how it looks/feels?

Second is that this behavior is tied into the player's inventory/home capacity + their willingness to keep picking up items equal to or worse than what they currently have and the rarity of coins used in making re-rolling worthwhile.

Yup! Inventory management is a key aspect of the game.

jwaltz commented 10 years ago

Yeah, maybe the crucible should show a description of what the recipe does once all of the ingredients are added? Would you like to try adding that and see how it looks/feels?

I'd be happy to work on this. I'll give it some thought today and try stuff out.

jwaltz commented 10 years ago

I want to show a different recipe description based on the object type of Recipe.result. If I understand correctly, equipment(+ coin[s]) recipe results are instances of _FrequencyDrop and standard recipe results are instances of _ItemDrop. Are these the only Drop objects that recipe results could be? How can I differentiate between them in render() of home_screen.dart? I tried the is operator but could only use the Drop type and not the more specific _FrequencyDrop or _ItemDrop. I could use recipe.result.runtimeType.toString() and compare it but was wondering if there is a cleaner way.

I was thinking of providing a warning when a recipe result is a _FrequencyDrop and, if possible, providing the resulting item name when a recipe result is an _ItemDrop before the user completes the forging.

munificent commented 10 years ago

I think the simplest solution is to just add description property right on Recipe. The little recipe() helper function can implicitly pass in the item type name as the recipe's description for recipes that just create an item.

Then, for the more complex recipes that use a frequency drop, you can just hand-author a description like "Creates a random piece of equipment...".

The fact that it uses a Drop internally is handy right now, but I think may end up changing. Eventually we want recipes that can make an item taking the existing item into account. For example, adding a brand to a weapon. It would be hard to model that using a Drop, which was designed for creating items ex-nihilo.