MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | FOOD, DRINK & ALCOHOL |
| 2 | ===================== |
| 3 | |
| 4 | Es wird empfohlen, jede tragbare Heilung ueber "/std/food" |
| 5 | zu implementieren. Hier braucht man nur wenige Properties setzen, um |
| 6 | sicherzugehen, dass die Heilung korrekt verlaeuft. |
| 7 | |
| 8 | Bitte bei der Realisierung von tragbaren Tanken IMMER mit der Balance |
| 9 | sprechen. Die Heilung unterliegt genauer Kontrolle. Ewig haltbare Speisen |
| 10 | sind sowieso genehmigungspflichtig und nur mit guter Begruendung und |
| 11 | strengen Auflagen erlaubt. |
| 12 | |
| 13 | FEATURES: |
| 14 | Unterstuetzt wird das Konsumieren von Speisen per Essen oder Trinken auch |
| 15 | in mehreren Portionen. Die Speisen verderben und werden vernichtet. |
| 16 | Es sind Lebensmittel mit Behaelter moeglich, so dass dieser leer |
| 17 | zurueckbleibt, wenn der Inhalt gegessen oder vernichtet wurde. |
| 18 | Die Wirkung von Speisen kann neben der Zufuehrung von Lebens- und Konzen- |
| 19 | trationspunkten erweitert werden. Die Wirkung verdorbener Speisen kann |
| 20 | getrennt definiert werden. |
| 21 | Wert und Gewicht der Speise werden in Abhaengigkeit der Restmengen immer |
| 22 | korrekt berechnet. |
| 23 | |
| 24 | REALISIERUNG: |
| 25 | Die Realisierung der Timer laeuft ueber die Resets der Speise. Callouts |
| 26 | werden lediglich verwendet, um den Aufruf des Resets zu garantieren. |
| 27 | Es wird auch geprueft, dass der Aufruf der Resets per Hand nichts |
| 28 | durcheinander bringt. |
| 29 | |
| 30 | Des Weiteren ist sichergestellt, dass der Spieler nicht mit Futter in |
| 31 | Beruehrung kommt, dessen Timer zum Verderben initialisiert ist. |
| 32 | |
| 33 | Das Konzept ist dem Heilungskonzept der Kneipen angepasst worden. |
| 34 | Dem entsprechend sind die Properties sehr aehnlich. |
| 35 | |
| 36 | PROPERTIES: |
| 37 | |
| 38 | P_PORTIONS : Anzahl der Portionen (wie oft kann man abbeissen / |
| 39 | einen Schluck nehmen) |
| 40 | |
| 41 | P_FOOD : Fuellgrad der Speise pro Portion, muss gesetzt sein, wenn |
| 42 | P_DRINK nicht gesetzt ist |
| 43 | P_DRINK : Fuellgrad der Fluessigkeit pro Portion, muss gesetzt sein, |
| 44 | wenn P_FOOD nicht gesetzt ist |
| 45 | P_ALCOHOL : Alkohollevel pro Portion |
| 46 | |
| 47 | P_WEIGHT : Gewicht pro Portion (bei QueryProp(P_WEIGHT) wird das |
| 48 | komplette Gewicht aller Portionen + eventuell Behaelter |
| 49 | zurueckgegeben) |
| 50 | P_VALUE : Wert pro Portion (bei QueryProp(P_VALUE) wird der |
| 51 | komplette Wert aller Portionen + eventuell Behaelter |
| 52 | zurueckgegeben) |
| 53 | |
| 54 | P_HP : Anzahl der LP, die prop Portion geheilt/geschwaecht werden |
| 55 | P_SP : Anzahl der KP, die prop Portion geheilt/geschwaecht werden |
| 56 | P_DISTRIBUTION : Verteilung der Heilung auf die Heartbeats |
| 57 | (siehe Hilfe zu H_DISTRIBUTION in consume) |
| 58 | |
| 59 | P_LIFETIME : Zeit in Sekunden, bis die Speise verdirbt (>0) |
| 60 | Zaehlt ab der ersten Inbesitznahme durch einen Spieler |
| 61 | P_RESET_LIFETIME : Zeit in Resets, bis die Speise verdirbt (>0) |
| 62 | Die Laenge der einzelnen Resets wird wie ueblich berechnet |
| 63 | und P_LIFETIME entsprechend auf durchschnittlich |
| 64 | P_RESET_LIFETIME * 45 * 60 gesetzt. |
| 65 | (existiert, da bisher meistens in Resets gerechnet wurde) |
| 66 | Sollte sinnvollerweise nur als SetProp(P_RESET_LIFETIME) |
| 67 | verwendet werden, kann aber auch abgefragt werden |
| 68 | |
| 69 | P_EMPTY_PROPS : Mapping mit Werten des Behaelters |
| 70 | Alle hier angegebenen Werte (ausser P_PORTIONS) werden |
| 71 | in der Speise gesetzt, wenn die letzte Portion konsumiert |
| 72 | wurde. Wenn diese Prop leer ist, wird das Objekt zerstoert, |
| 73 | wenn keine Portionen mehr da sind. |
| 74 | Achtung: es werden keine closures unterstuetzt! |
| 75 | P_IDS : Wert in P_EMPTY_PROPS |
| 76 | Liste der IDs des leeren Behaelters |
| 77 | Achtung: es werden keine closures unterstuetzt! |
| 78 | P_ADJECTIVES : Wert in P_EMPTY_PROPS |
| 79 | Liste der Adjektive des leeren Behaelters |
| 80 | Achtung: es werden keine closures unterstuetzt! |
| 81 | P_VALUE : Wert in P_EMPTY_PROPS |
| 82 | Wert des leeren Behaelters |
| 83 | P_WEIGHT : Wert in P_EMPTY_PROPS |
| 84 | Gewicht des leeren Behaelters |
| 85 | |
| 86 | P_NO_BAD : Flag, ob die Speise verderben kann |
| 87 | Darf nur in Absprache mit der Balance auf 1 gesetzt werden! |
| 88 | |
| 89 | P_DESTROY_BAD : Wert, was beim Verderben mit dem Object passiert |
| 90 | DESTROY_BAD = Die Speise wird beim Verderben zerstoert |
| 91 | bzw. der Behaelter wird geleert (default) |
| 92 | DESTROY_NEVER = Die Speise wird beim Verderben nicht |
| 93 | zerstoert |
| 94 | pos. integer = Anzahl der Sekunden, die zwischen Verderben |
| 95 | und Zerstoeren der Speise liegen sollen |
| 96 | |
| 97 | MESSAGES: (durchlaufen replace_personal() und koennen somit Platzhalter |
| 98 | fuer Speise (1. Argument) und Konsument (2. Argument) enthalten) |
| 99 | |
| 100 | P_CONSUME_MSG : fuer den Raum, wenn konsumiert wird |
| 101 | P_EATER_MSG : an den Konsumenten |
| 102 | P_EMPTY_MSG : wenn leere Behaelter konsumiert werden |
| 103 | P_NOFOOD_MSG : wenn Getraenke gegessen werden |
| 104 | P_NODRINK_MSG : wenn Futter getrunken wird |
| 105 | P_BAD_MSG : wenn Speisen verderben |
| 106 | P_REMOVE_MSG : wenn Speisen vernichtet werden |
| 107 | (nur wenn sie nicht beim Verderben vernichtet werden) |
| 108 | P_ENV_MSG : wenn im Raum liegende Speisen konsumiert werden |
| 109 | (ist diese Prop leer, geht das sogar!) |
| 110 | P_FOOD_FULL_MSG : wenn man nix mehr essen kann |
| 111 | P_DRINK_FULL_MSG : wenn man nix mehr trinken kann |
| 112 | P_ALC_FULL_MSG : wenn man keinen Alkohol mehr vertraegt |
| 113 | |
| 114 | METHODEN: |
| 115 | consume : wird beim Konsumieren aufgerufen, wenn klar ist, |
| 116 | dass was zum Konsumieren da ist. |
| 117 | gibt das Ergebnis von try_consume() zurueck |
| 118 | try_consume : bereitet die Daten auf und fuehrt living->consume() aus |
| 119 | kann zur Pruefung mit testonly-Flag aufgerufen werden |
| 120 | gibt das Ergebnis von living->consume() zurueck |
| 121 | success_consume : wird von consume() aufgerufen, wenn Konsumieren klappt |
| 122 | gibt die Meldungen zum Konsumieren aus |
| 123 | failed_consume : wird aufgerufen, wenn Konsumieren nicht klappt |
| 124 | gibt den Grund fuer den Fehlschlag aus |
| 125 | (je nach Ergebnis von living->consume()) |
| 126 | |
| 127 | consume_bad : Aendert die Daten fuer living->consume(), wenn eine |
| 128 | verdorbene Speise konsumiert wird |
| 129 | Standard: Heilung wirkt nicht, Vergiftung +1 |
| 130 | make_bad : wird aufgerufen, wenn die Speise gerade verdirbt |
| 131 | Gibt die Meldungen beim Verderben aus |
| 132 | Vernichtet das Objekt, wenn das gewollt ist |
| 133 | Die Methode wird auch aufgerufen, wenn nur noch der |
| 134 | Behaelter existiert! Also den Test is_not_empty() nicht |
| 135 | vergessen! |
| 136 | make_destroy : wird aufgerufen, wenn die Speise bereits verdorben ist |
| 137 | und die Zeit aus P_DESTROY_BAD abgelaufen ist. |
| 138 | Gibt die Meldung zum Zerstoeren aus und ruft |
| 139 | make_empty aus, um die Speise bzw. den Inhalt des |
| 140 | Behaelters zu zerstoeren. Ausserdem wird der Reset |
| 141 | abgeschaltet. |
| 142 | Die Methode wird auch aufgerufen, wenn nur noch der |
| 143 | Behaelter existiert! Also den Test is_not_empty() nicht |
| 144 | vergessen! |
| 145 | |
| 146 | make_empty : wird aufgerufen, wenn die letzte Portion konsumiert wird |
| 147 | Macht aus einem vollen Behaelter einen leeren oder |
| 148 | vernichtet das Objekt. Der Behaelter verdirbt also im |
| 149 | Normalfall nicht! |
| 150 | |
| 151 | init : Startet den Timer zum Verderben der Speise |
| 152 | (start_lifetime()), wenn sich das Objekt in einem |
| 153 | Spieler befindet. |
| 154 | Prueft, ob Laufzeiten fehlerhafterweise nicht beendet |
| 155 | wurden und holt es dann nach |
| 156 | NotifyMove : Startet den Timer zum Verderben der Speise |
| 157 | (start_lifetime()) auch, wenn die Speise in einen |
| 158 | Spieler bewegt wird, ohne dass init() aufgerufen |
| 159 | wurde. |
| 160 | reset : wird fuer 3 Situationen verwendet: |
| 161 | 1: Das Futter wurde bewegt, der Timer aber noch nicht |
| 162 | initialisiert -> es wird geprueft, ob der Timer |
| 163 | gestartet werden muss. |
| 164 | 2: Der Timer ist abgelaufen -> |
| 165 | laesst die Speise verderben und vernichtet sie |
| 166 | gegebenenfalls |
| 167 | 3: Der Timer nach dem Verderben ist abgelaufen -> |
| 168 | vernichtet die Speise |
| 169 | Es wird immer geprueft, ob die Resets zeitgerecht |
| 170 | aufgerufen wurden und die Aktionen nicht zur falschen |
| 171 | Zeit passieren |
| 172 | |
| 173 | is_not_empty : Flag, ob noch Portionen vorhanden sind |
| 174 | is_drinkable : Flag, ob Speise trinkbar ist |
| 175 | (nur wenn P_DRINK gesetzt und P_FOOD NICHT gesetzt ist) |
| 176 | is_eatable : Flag ob Speise essbar ist |
| 177 | (wenn P_FOOD gesetzt (P_DRINK ist egal)) |
| 178 | is_bad : Flag, ob Speise verdorben ist |
| 179 | |
| 180 | get_current_lifetime : Zeit in Sekunden, wie lange der Timer zum Verderben |
| 181 | laeuft (ist immer 0, wenn P_NO_BAD gesetzt ist) |
| 182 | start_lifetime : startet den Timer zum Verderben der Speise falls keine |
| 183 | Gruende dagegen sprechen, wird intern aufgerufen, kann |
| 184 | aber in speziellen Situationen auch manuell aufgerufen |
| 185 | werden (siehe oben unter REALISIERUNG) |
| 186 | message : es werden Meldungen zu Statusaenderungen verarbeitet |
| 187 | und korrekt ausgegeben. Es wird der Name der auszu- |
| 188 | gebenen Property uebergeben. |
| 189 | Es werden alle notwendigen Ersetzungen per |
| 190 | replace_personal gemacht und geprueft, ob dem Besitzer |
| 191 | oder dem Raum die Meldung ausgegeben werden muss. |
| 192 | Hierueber sollten nur Meldungen ausgegeben werden, die |
| 193 | durch Aenderungen an der Speise im Reset ausgeloest |
| 194 | werden, also im reset selbst und in den make_*-Methoden. |
| 195 | |
| 196 | |
| 197 | STANDARD: |
| 198 | Wenn man nichts in seinem Futter ueberschreibt, dann hat es |
| 199 | folgendes Standardverhalten. |
| 200 | Es muss immer P_FOOD oder P_DRINK explizit groesser 0 gesetzt werden, |
| 201 | sonst laesst sich das Lebensmittel nicht konsumieren! |
| 202 | |
| 203 | - Haltbarkeit: 1 Reset (30 + random(30) Minuten) |
| 204 | - der Ablauf der Haltbarkeit startet, sobald ein Spieler die Speise nimmt |
| 205 | - Wenn die Speise schlecht wird, wird sie zerstoert |
| 206 | - Die Speise hat keinen Behaelter |
| 207 | - Es gibt nur einen Schluck/Bissen, dann ist die Speise weg |
| 208 | - Gewicht: 50 Gramm / Wert: 10 Muenzen |
| 209 | - Man heilt weder LP noch KP |
| 210 | - Man wuerde ansonsten 5 LP/KP pro Heartbeat heilen |
| 211 | - Man kann die Speise nur konsumieren, wenn man sie in der Hand haelt |
| 212 | - Wenn man die verdorbene Speise konsumieren koennte, wuerde man nicht |
| 213 | heilen sondern vergiftet werden (P_POISON+1) |
| 214 | |
| 215 | BEISPIELE: |
| 216 | Beispiele zu tragbaren Speisen und Getraenken kann man unter |
| 217 | doc/beispiele/food/ nachschauen |
| 218 | |
| 219 | SIEHE AUCH: |
| 220 | consume, wiz/heilung, |
| 221 | |
| 222 | LETZTE AeNDERUNG: |
| 223 | 25.09.2010, Caldra |