#Things I would change about apotheosis

9 messages · Page 1 of 1 (latest)

meager coral
#

I absolutely love the Apotheosis system in Lucid Blocks, and I think it's one of the best parts of the game. However, I have spent a lot of time thinking about the apotheosis algorithm, especially during the development of Revelation Engine, and got many ideas in the process, so I will write down my thoughts and suggestions here.

I'm going to split my ideas/suggestions into multiple comments since it's too long to fit in one post.

#

1 - Fix essence weighting
Every item in the game has a set of 13 essence values assigned to it, which is one of multiple things that are used to determine the output of apotheosis.

In addition, there is a global "weight" associated with each essence type. For example, blockiness has a weight of 0.75 and lust has a weight of 1.4. In the code this variable is called used_properties_weights.

However, the game does not use the weights in the way you would expect. It takes the essence values of all the input items, multiplies them by their corresponding essence weights, and then computes a weighted average of the essence values to get the overall essence vector for the input values (called mood_vector in the code). However, it then computes the distance of this weighted input essence vector to the unweighted essence vectors of all the output items. This is a fundamentally different operation than assigning different weights to different essence values, as the name used_property_weights would imply.

As an example to illustrate this problem, I will provide a simple example:
Suppose we have items A, B, C, and D.
Let A, B, and C have the essence values aqua: 1.0 and blockiness: 1.0
Let D have essence values aqua: 0.75 and blockiness: 0.75.
For simplicity, assume all other essences are 0.
Now suppose we try to fuse items A and B. Which item does the apotheosis algorithm think has the closest essence value?
You would normally think that would be item C, since it has it has identical essences to A and B, but to the game, it is actually D that has a perfect essence match.
This is because aqua and blockiness both have weights of 0.75, so it thinks the average essence values for the input values are actually 0.75, and then tries to compare those weighted input essences to the unweighted essence values of candidate output items.
.

#

While I cannot know for sure, I am fairly certain that this is an accident. It doesn't make sense for an item to not perfectly match its own essence. This just isn't what weighting means.

What I think should be done instead is to multiply the weights after computing the distances between input and output essence values, rather than multiply weights with the input essence values only. That way, the essence weights actually act like weights.
.

#

2 - Have an item for every possible output tag
When an item with an output tag is used as a recipe input, it basically guarantees that the output contains that tag if at all possible.

We currently have 10 items with output tags:

  • plush -> fluff
  • silver vessel -> gem
  • fire -> fire
  • water -> water
  • meat apparatus -> meat
  • ball essence -> ball
  • gear -> metal
  • dice -> magic
  • glaggle token -> digital
  • empty capsule -> capsule

However, there are actually 28 tags. What about the other 18 tags? I would love if we had items for all of them.
.

#

3 - Add a way to penalize certain tags in the output
A big part of how apotheosis decides the best output is tag matching. It takes a list of all tags owned by at least one input item, and prioritizes outputs by the number of tags that a candidate output item has that are in that input tag list.

Since there is no penalty a candidate output item having a tag that is not in the input tag list, this means that it tends to be easier to craft an item the more tags it has. Conversely, it is harder to craft items with fewer tags.

In extreme cases, like with bunny ears, which have no tags, this makes them pretty much impossible to craft.

Items with only one tag, especially when that tag is not usually found by itself in other items, are usually possible but still extremely difficult to craft. I am pretty sure nobody is finding a recipe for string on their own, for example.
Cardboard boxes, as another example, only have the wood tag, which is one reason we cannot find a recipe for it (it also has a negative bias, which in addition to the tag problem makes it impossible to find a recipe for).

I have two ideas for solving this problem
First, we could use hamming distance to calculate tag match instead of just counting the number of tags in common. That way, it discourages extra tags in the output item that no input item has. If we fuse a bunch of items with no metal, for example, it should discourage an output that has the metal tag.

Another option is to have items with anti-tags. For example, we could have negative counterparts to all output tag items. An anti-fire, for example, would prevent the output from having a fire tag. There are many ways to do it. It could be weighted to 1000 like output tags, it could have the same weight as regular tags. Just some way for an item to have an anti-tag that discourages that tag in the output. I think negative counterparts to all output tag items is just the simplest way to do this.
.

#

And those were all the ideas that I had off the top of my head. There may be more that I haven't remembered.

topaz falcon
#

-# (i actually did find a recipe for string on my own but that's beside the point. it was a very weird recipe)

meager coral
topaz falcon
#

it was in my wrath + turvy world lol
-# (on playtest.. maybe that's why)