Change version to 0.2.0
[minetest_treasurer.git] / README.md
blob2ae0e77c549d5cd9b0b1f35ef92045366aa4e244
1 = Treasurer’s README file for Treasurer version 0.2.0 =
2 == Overview ==
3 * Name: Treasurer
4 * Technical name: `treasurer`
5 * Purpose: To provide an interface for mods which want to spawn ItemStacks randomly and an interface for mods which create new items.
6 * Version: 0.2.0
7 * Dependencies: none
8 * License: WTFPL
10 == Introduction ==
11 Problem:
12 There are a bunch of mods which have cool items but they won’t appear in the world by
13 themselves.
14 There are some mods which randomly distribute treasures into the world. Sadly, these only
15 distribute the items they know—which are just the items of the mod “default” most of the
16 time. The items of the other mods are completely missed.
18 The reason for this is that the distributing mods can’t know what sort of items are available
19 unless they explicitly depend on the mods that defines these. Viewed the other way round,
20 the item-defining mods that also distribute these items into the world are limited in the
21 sense that they only know one means of distributing items.
23 There is a gap between defining items and distributing them. Every time a mod does both,
24 flexibility is limited and expansion becomes difficult.
26 To bridge this gap, Treasurer has been written. Treasurer makes it possible a) for mods to define
27 treasures without bothering _how_ these are distributed into the world and b) for mods to distribute
28 treasures around the world without knowledge about _what_ treasures exactly are distributed.
30 == Technical side of Treasurer ==
31 === technical overview ===
32 To get a working Treasurer architecture and actually get some treasures into the world,
33 you need:
34 * Treasurer
35 * at least one treasure registration mod
36 * at least one treasure spawning mod
38 === treasurer registration mod ===
39 Firstly, there are the treasure registration mods (TRMs). The task of TRMs is to tell
40 Treasurer which items does it have to offer, which relative appearance probabilities these
41 treasures should have, how “precious” the treasure is considered (on a scale from 0 to 10)
42 , optionally how big the stack of items should be and optionally how much worn out it is.
43 TRMs must depend on at least two mods: On treasurer and on the mod or mods
44 where the items are defined. Technically, a TRM consists of nothing more than a long
45 list of “registration” function calls. While this seems trivial, the task of balancing
46 out probabilties and balancing out preciousness levels of treasures is not trivial
47 and it may take a long time to get right.
49 It is strongly recommended that a TRM really does nothing
50 more than registering treasures (and not defining items, for example). If you want
51 to make your mod compatible to Treasurer, don’t change your mod, write a TRM for
52 it instead.
54 There is an example TRM, called “`trm_default_example`”. It registers some items
55 of the default as treasures. Unsurprisingly, it depends on `treasurer` and `default`.
57 === treasurer spawning mods ===
58 Secondly, there are the treasure spawning mods (TSMs). The task of a TSM is to somehow
59 distribute the available treasures into the world. This is also called “treasure
60 spawning”. How exactly the TSM spawns the treasures is completely up the TSM. But a
61 TSM has to request Treasurer to get some random treasures to distribute. A TSM may
62 optionally request to filter out treasures outside certain preciousness levels
63 and groups, so the result is a bit controllable and not completely random.
64 Treasurer can not guarantee to return the requestet amount of treasures, it may
65 return an empty table, for two reasons:
67 * There is no TRM activated. There must be at least one to work.
68 * The filters filtered out everything, leaving Treasurer with an empty treasure pool
69 to choose from. This problem can be fixed by installing more TRMs or by balancing the
70 existing TRMs to cover as many preciousness levels as possible. It also may be that
71 the range specified by the TSM was too small. It is recommended to keep the
72 requested range at least of a size of 1. Treasurer does, however, guarantee that
73 the returned treasures are always in the requested bounds.
75 A TSM has to at least depend on Treasurer.
76 Unlike for TRMs, it may not be a problem to also do some other stuff than just
77 spawning treasures if it seems feasible. You may choose to make your TSM fully 
78 dependant on Treasure, then it won’t work without Treasurer. You may also choose
79 to only add an optional dependency on Treasurer. For this to work, your mod must
80 now select its own treasures, which of course will only come from a rather limited
81 pool.
83 To check if the Treasurer mod is installed, you can use something like this in
84 your code:
86 ```
87 if(minetest.get_modpath("treasurer")~=nil) then
88         -- Treasurer is installed.
89         -- You can call Treasurer’s functions here.
90 else
91         -- Treasurer is not installed.
92         -- You may write your replacement code here.
93         -- You can not call Treasurer’s funcitons here.
94 end
95 ```
97 There are two example TSMs. The first one is a very basic one and called “`tsm_gift_example`”.
98 It gives a “welcome gift” (1 random treasure) to players who just joined the server
99 or who respawn. The preciousness and group filters are not used. It does only depend on
100 Treasurer. The second one is called “`tsm_chests_example`” and pretty advanced for an example.
101 It places chests of the mod “default” between 20 and 200 node lenghts below the water
102 surface and puts 1-6 random treasures into these. The lower the chest, the higher
103 the preciousness. It depends on treasurer and default (for the chests, of course).
105 === Recap ===
106 TRMs define treasures, TSMs spawn them. Treasurer manages the pool of available treasures.
107 TRMs and TSMs do not have to know anything from each other.
108 TRMs and TSMs do not neccessarily have to change any line of code of other mods to function.
109 Treasurer depends on nothing.
111 Important: It should always only be neccessary for TRMs and TSMs to depend on Treasurer.
112 All other mods do NOT HAVE TO and SHOULD NOT depend on Treasurer.
116 === Treasure attributes ===
117 This section explains the various attributes a treasure can have.
119 ==== Rarity ====
120 Rarity in Treasurer works in a pretty primitive way: The relative rarities of all
121 treasures from the treasure pool are simply all added up. The probabilitiy of one
122 certain treasure is then simply the rarity value divided by the sum.
124 ==== Preciousness ====
125 How “precious” an item is, is highly subjective and also not always easy to categorize.
126 Preciousness in Treasurer’s terms should be therefore viewed as “utility” or as
127 “reward level” or “strength” or even “beauty” or whatever positive attributes you can
128 think of for items. See the text file `GROUPS_AND_PRECIOUSNESS` for a rough
129 guideline.
130 So, if you create a TRM and your treasure is something you want the player work
131 hard for, assign it a high preciousness. Everyday items that are already easy to
132 obtain in normal gameplay certainly deserve a lower precious than items that are
133 expensive to craft.
134 If your treasure consists of a powerful
135 item, assign it a high preciousness. When in doubt, try to value gameplay over
136 personal taste. Remember that TSMs can (and will!) filter out treasures based
137 on their preciousness.
138 For TSM authors, consider preciousness this way: If the trouble the player has
139 to get through to in order to obtain the treasure is high, better filter
140 out unprecious treasures. If your TSM distributes many treasures all over the world and these
141 are easy to obtain, filter out precious treasures.
143 TSMs also can just completely ignore preciousness, then the given treasures base
144 on sheer luck.
146 ==== Treasurer groups ====
147 Every treasure can be assigned to a group. These groups are specific to Treasurer only.
148 The idea is that treasures which share a common property are member of the same group.
149 All groups have a name by which they are identified.
150 For example, if there are apples, plums, pears and oranges and those items can be
151 eaten for health, all those treasures would be members of the group “food”.
153 The group system can be used to further narrow down the treasure pool from which you
154 want Treasurer to return treasures. This makes it more interesting than just using
155 an one-dimensional preciousness scale.
157 Using the groups system is entirely optional. If your TRM does not specify any group,
158 your treasure will be assigned to the group “default”. It is not possible for a treasure
159 to not belong to any group. If your TSM does not specify a group parameter, Treasurer
160 will use all groups.
161 While not using groups as a TSM may be perfectly okay, not using groups as a TRM is
162 not recommended, because TSM which filter by groups may “overlook” your treasure,
163 even if it would actually fit, simply because you didn’t assign it to a specific group.
165 Note that Treasurer groups are completely distinct from Minetest’s group system.
167 You can basically invent your own groups on the fly, but it is strongly recommended that you
168 use the groups suggested in the text file `GROUPS_AND_PRECIOUSNESS` whenever possible, for
169 maximum portability of your TSM. The text file also has a rough guideline for finding
170 appropriate values for the preciousness.
173 ==== Recap ====
174 Rarity determines the chance of a treasure, whereas preciousness determines
175 the difficulty to obtain it. Group
177 == Overview of examples ==
178 - `trm_default_example` - registers items of default mod
179 - `tsm_chests_example` - spawns chests (from the default mod)
180 - `tsm_gift_example` - gives one treasure as a “welcome gift” to joined or respawned players
182 == Treasurer API documentation ==
183 === API documentation for treasure registration mods ===
184 The API consists of one function, which is called “`treasurer.register_treasure`”.
186 ==== `treasurer.register_treasure` ====
187 Registers a new treasure (this means the treasure will be ready to be spawned by treasure spawning mods).
189 This function does some basic parameter checking to catch the most obvious
190 mistakes. If invalid parameters have been passed, the input is rejected and
191 the function returns false. However, it does not cover every possible
192 mistake, so some invalid treasures may slip through.
193                 
194 Rarity does not imply preciousness. A rare treasure may not neccessarily a
195 very precious one. A treasure chest with scorched stuff inside may be very
196 rare, but it’s certainly also very unprecious.
198 ===== Parameters =====
199 * `name`: name of resulting `ItemStack`, e.g. “`mymod:item`”
200 * `rarity`: rarity of treasure on a scale from 0 to 1 (inclusive). lower = rarer
201 * `preciousness` : subjective preciousness on a scale from 0 to 10 (inclusive). higher = more precious.
202 * `count`: optional value which specifies the multiplicity of the item. Default is 1. See `count` syntax help in this file.
203 * `wear`: optional value which specifies the wear of the item. Default is 0, which disables the wear. See `wear` syntax help in this file.
204 * `treasurer_groups`: an optional table of group names to assign this treasure to. If omitted, the treasure is added to the default group.
206 ===== Return value =====                
207 `true` on success, `false` on failure.
209 === data formats ===
210 format of count type:
211 ==== `count` ====
212 A `count` can be a number or a table 
214 * `number`: it’s always so many times
215 * `{min, max}`: it’s pseudorandomly between `min` and `max` times, `math.random` will be used to chose the value
216 * `{min, max, prob_func}`: it’s between `min` and `max` times, and the value is given by `prob_func` (see below)
218 ==== `wear` ====
219 Completely analogous to `count`.
221 ==== Format of `prob_func` function ====
222 There are no parameters.
224 It returns a random or pseudorandom number between 0 (inclusive) and 1 (exclusive).
226 `prob_func` is entirely optional, if it’s not used, treasurer will
227 default to using `math.random`. You can use `prob_func` to define your own
228 “randomness” function, in case you don’t wish your values to be evenly
229 distributed.
231 === API documentation for treasure spawning mods ===
232 The API consists of one function, called “`treasurer.select_random_treasures`”.
234 ==== `treasurer.select_random_treasures` ====
235 Request some treasures from treasurer.
237 ===== Parameters =====
238 * `count`: (optional) amount of treasures. If this value is `nil`, Treasurer assumes a default of 1.
239 * `minimal_preciousness`: (optional) don’t consider treasures with a lower preciousness. If `nil`, there’s no lower bound.
240 * `maximum_preciousness`: (optional) don’t consider treasures with a higher preciousness. If `nil`, there’s no upper bound.
241 * `treasurer_group`: (optional): Only consider treasures which are members of at least one of the members of the provided Treasurer group table. `nil` = consider all groups
244 ===== Return value =====
245 A table of `ItemStacks` (the requested treasures). It may be empty.