home · contact · privacy
Server, plugin: Refactor play_use plugin hooking.
[plomrogue] / plugins / server / PleaseTheIslandGod.py
1 # This file is part of PlomRogue. PlomRogue is licensed under the GPL version 3
2 # or any later version. For details on its copyright, license, and warranties,
3 # see the file NOTICE in the root directory of the PlomRogue source package.
4
5
6 from server.io import log, strong_write
7 from server.config.world_data import world_db, directions_db
8 from server.utils import mv_yx_in_dir_legal, rand, id_setter
9 from server.config.io import io_db
10
11 def pos_test(type, y, x):
12     pos = y * world_db["MAP_LENGTH"] + x;
13     plant = world_db["ThingTypes"][type]["TT_PROLIFERATE"]
14     return (not plant or ":" == chr(world_db["MAP"][pos]))
15
16 def world_makable():
17     from server.world_makable import world_makable
18     playertype = world_makable()
19     for name in world_db["specials"]:
20         if world_db[name] not in world_db["ThingTypes"]:
21             print("Ignoring: No valid " + name + " set.")
22             return -1
23     return playertype
24
25 def make_map():
26     from server.make_map import make_map, is_neighbor, new_pos
27     global rand
28     make_map()
29     length = world_db["MAP_LENGTH"]
30     n_colons = int((length ** 2) / 16)
31     i_colons = 0
32     while (i_colons <= n_colons):
33         single_allowed = rand.next() % 256
34         y, x, pos = new_pos()
35         if ("." == chr(world_db["MAP"][pos])
36           and ((not single_allowed) or is_neighbor((y, x), ":"))):
37             world_db["MAP"][pos] = ord(":")
38             i_colons += 1
39     altar_placed = False
40     while not altar_placed:
41         y, x, pos = new_pos()
42         if (("." == chr(world_db["MAP"][pos]
43              or ":" == chr(world_db["MAP"][pos]))
44             and not is_neighbor((y, x), "X"))):
45             world_db["MAP"][pos] = ord("_")
46             world_db["altar"] = (y, x)
47             altar_placed = True
48
49 def field_spreadable(c, t):
50     return ":" == c or (world_db["ThingTypes"][t["T_TYPE"]]["TT_LIFEPOINTS"]
51                         and "." == c)
52
53 def thingprol_plugin_conditions(t):
54     tt = world_db["ThingTypes"][t["T_TYPE"]]
55     return (tt["TT_LIFEPOINTS"] == 0 or \
56             t["T_LIFEPOINTS"] >= 0.9 * tt["TT_LIFEPOINTS"])
57
58 def thingprol_plugin_post_create_hook(t):
59     tt = world_db["ThingTypes"][t["T_TYPE"]]
60     if (world_db["FAVOR_STAGE"] > 0 and t["T_TYPE"] == world_db["PLANT_0"]):
61         world_db["GOD_FAVOR"] += 5
62     elif t["T_TYPE"] == world_db["PLANT_1"]:
63         world_db["GOD_FAVOR"] += 25
64     elif world_db["FAVOR_STAGE"] >= 4 and t["T_TYPE"] == world_db["ANIMAL_1"]:
65         log("The Island God SMILES upon a new-born bear baby.")
66         world_db["GOD_FAVOR"] += 750
67
68 def ai_hook_pickup_test(t):
69     return len(t["T_CARRIES"]) < \
70         world_db["ThingTypes"][t["T_TYPE"]]["TT_STORAGE"]
71
72 def actor_pickup(t):
73     used_slots = len(t["T_CARRIES"])
74     if used_slots < world_db["ThingTypes"][t["T_TYPE"]]["TT_STORAGE"]:
75         from server.actions import actor_pickup
76         t_picked = actor_pickup(t)
77         if t_picked != None:
78             ty = world_db["ThingTypes"][t_picked["T_TYPE"]]
79             if t != world_db["Things"][0] and t_picked["T_PLAYERDROP"] \
80                     and ty["TT_TOOL"] == "food":
81                 score = int(ty["TT_TOOLPOWER"] / 32)
82                 world_db["GOD_FAVOR"] += score
83                 t_picked["T_PLAYERDROP"] = 0
84     elif t == world_db["Things"][0]:
85         log("CAN'T pick up object: No storage room to carry more.")
86
87 def actor_pickup_test_hook(t, tid):
88     from server.ai import eat_vs_hunger_threshold
89     tt = world_db["ThingTypes"][tid]
90     return not (t != world_db["Things"][0] and (tt["TT_TOOL"] != "food" or
91             (tt["TT_TOOLPOWER"] <= eat_vs_hunger_threshold(t["T_TYPE"]))))
92
93 def actor_drop(t):
94     from server.actions import actor_drop
95     dropped = actor_drop(t)
96     if dropped != None:
97         dropped["T_PLAYERDROP"] = 1
98
99 def actor_use_attempts_hook(t, ty):
100     if ty == world_db["SLIPPERS"]:
101         if t == world_db["Things"][0]:
102             log("You use the " + world_db["ThingTypes"][ty]["TT_NAME"] + ". " \
103                 "It glows in wondrous colors, and emits a sound as if from a d"
104                 "ying cat. The Island God laughs.\n")
105         t["T_LIFEPOINTS"] = 1
106         from server.config.misc import decrement_lifepoints
107         decrement_lifepoints(t)
108     elif (world_db["ThingTypes"][ty]["TT_TOOL"] == "carpentry"):
109         pos = t["T_POSY"] * world_db["MAP_LENGTH"] + t["T_POSX"]
110         if (world_db["MAP"][pos] == ord("X")
111             or world_db["MAP"][pos] == ord("|")):
112             return
113         for t_id in [t_id for t_id in world_db["Things"]
114                    if not world_db["Things"][t_id] == t
115                    if not world_db["Things"][t_id]["carried"]
116                    if world_db["Things"][t_id]["T_POSY"] == t["T_POSY"]
117                    if world_db["Things"][t_id]["T_POSX"] == t["T_POSX"]]:
118             return
119         wood_id = None
120         for t_id in t["T_CARRIES"]:
121             type_material = world_db["Things"][t_id]["T_TYPE"]
122             if (world_db["ThingTypes"][type_material]["TT_TOOL"] == "wood"):
123                 wood_id = t_id
124                 break
125         if wood_id != None:
126             t["T_CARRIES"].remove(wood_id)
127             del world_db["Things"][wood_id]
128             world_db["MAP"][pos] = ord("|")
129             log("With your " + world_db["ThingTypes"][ty]["TT_NAME"] + " you" \
130                 " build a WOODEN BARRIER from your "
131                 + world_db["ThingTypes"][type_material]["TT_NAME"] + ".")
132     elif world_db["ThingTypes"][ty]["TT_TOOL"] == "fertilizer":
133         pos = t["T_POSY"] * world_db["MAP_LENGTH"] + t["T_POSX"]
134         if world_db["MAP"][pos] == ord("."):
135             log("You create SOIL.")
136             world_db["MAP"][pos] = ord(":")
137
138 def actor_move(t):
139
140     def altar_msg_wait(limit):
141             log("The Island God will talk again when it favors you to >=" +
142                 str(limit) + " points.")
143
144     altar_msg_0 = "The Island God speaks to you: \"I don't trust you. You in" \
145     "trude on the island's affairs. I think you're a nuisance at best, and a" \
146     " danger to my children at worst. I will give you a chance to lighten my" \
147     " mood, however: For a while now, I've been trying to spread the plant " \
148     + world_db["ThingTypes"][world_db["PLANT_0"]]["TT_NAME"] + " (\"" + \
149     world_db["ThingTypes"][world_db["PLANT_0"]]["TT_SYMBOL"] + "\"). I have " \
150     "not been very successful so far. Maybe you can make yourself useful the" \
151     "re. I will count each further " + \
152     world_db["ThingTypes"][world_db["PLANT_0"]]["TT_NAME"] + " that grows to" \
153     " your favor.\""
154
155     altar_msg_1 = "The Island God speaks to you: \"You could have done worse" \
156     " so far. Maybe you are not the worst to happen to this island since the" \
157     " metal birds threw the great lightning ball. Maybe you can help me spre" \
158     "ad another plant. It multiplies faster,and it is highly nutritious: " + \
159     world_db["ThingTypes"][world_db["PLANT_1"]]["TT_NAME"] + " (\"" + \
160     world_db["ThingTypes"][world_db["PLANT_1"]]["TT_SYMBOL"] + "\"). It is n" \
161     "ew. I give you the only example. Be very careful with it! I also give y" \
162     "ou another tool that may be helpful.\""
163
164     altar_msg_2 = "The Island God speaks to you: \"I am greatly disappointed" \
165     " that you lost all " + \
166     world_db["ThingTypes"][world_db["PLANT_1"]]["TT_NAME"] + " this island h" \
167     "ad. Here is another one. It cost me great work. Be more careful this ti" \
168     "me when planting it.\""
169
170     altar_msg_3 = "The Island God speaks to you: \"The " + \
171     world_db["ThingTypes"][world_db["ANIMAL_0"]]["TT_NAME"] + " has lately b" \
172     "ecome a pest. These creatures do not please me as much as they used to " \
173     "do. Exterminate them all. I will count each kill to your favor. To help" \
174     " you with the hunting, I grant you the empathy and knowledge to read an" \
175     "imals.\""
176
177     altar_msg_4 = "You will now see animals' health bars, and activities (\"" \
178     "m\": moving (maybe for an attack), \"u\": eating, \"p\": picking someth" \
179     "ing up; no letter: waiting)."
180
181     altar_msg_5 = "The Island God speaks to you: \"You know what animal I fi" \
182     "nd the cutest? The " + \
183     world_db["ThingTypes"][world_db["ANIMAL_1"]]["TT_NAME"] + "! I think wha" \
184     "t this islands clearly needs more of is " + \
185     world_db["ThingTypes"][world_db["ANIMAL_1"]]["TT_NAME"] + "s. Why don't " \
186     "you help? Support them. Make sure they are well, and they will multiply" \
187     " faster. From now on, I will count each new-born " + \
188     world_db["ThingTypes"][world_db["ANIMAL_1"]]["TT_NAME"] + \
189     " (not spawned by me due to undo an extinction event) greatly to your fa" \
190     "vor. To help you with the feeding, here is something to make the ground" \
191     " bear more consumables."
192
193     altar_msg_6 = "The Island God speaks to you: \"You have proven yourself " \
194     "worthy of my respect. You were a good citizen to the island, and someti" \
195     "mes a better steward to its inhabitants than me. The island shall miss " \
196     "you when you leave. But you have earned the right to do so. Take this" + \
197     world_db["ThingTypes"][world_db["SLIPPERS"]]["TT_NAME"] + " and USE it w" \
198     "hen you please. It will take you to where you came from. (But do feel f" \
199     "ree to stay here as long as you like.)\""
200
201     def enter_altar():
202         from server.new_thing import new_Thing
203         if world_db["FAVOR_STAGE"] > 9000:
204            log("You step on a soul-less slab of stone.")
205            return
206         log("YOU ENTER SACRED GROUND.")
207         if world_db["FAVOR_STAGE"] == 0:
208             world_db["FAVOR_STAGE"] = 1
209             log(altar_msg_0)
210         elif world_db["FAVOR_STAGE"] == 1 and world_db["GOD_FAVOR"] < 100:
211             altar_msg_wait(100)
212         elif world_db["FAVOR_STAGE"] == 1 and world_db["GOD_FAVOR"] >= 100:
213             world_db["FAVOR_STAGE"] = 2
214             log(altar_msg_2)
215             id = id_setter(-1, "Things")
216             world_db["Things"][id] = new_Thing(world_db["PLANT_1"],
217                                                world_db["altar"])
218             id = id_setter(-1, "Things")
219             world_db["Things"][id] = new_Thing(world_db["TOOL_0"],
220                                                world_db["altar"])
221         elif world_db["FAVOR_STAGE"] == 2 and \
222             0 == len([id for id in world_db["Things"]
223                       if world_db["Things"][id]["T_TYPE"]
224                          == world_db["PLANT_1"]]):
225             log(altar_msg_2)
226             id = id_setter(-1, "Things")
227             world_db["Things"][id] = new_Thing(world_db["PLANT_1"],
228                                                world_db["altar"])
229             world_db["GOD_FAVOR"] -= 250
230         elif world_db["FAVOR_STAGE"] == 2 and world_db["GOD_FAVOR"] < 500:
231             altar_msg_wait(500)
232         elif world_db["FAVOR_STAGE"] == 2 and world_db["GOD_FAVOR"] >= 500:
233             world_db["FAVOR_STAGE"] = 3
234             log(altar_msg_3)
235             log(altar_msg_4)
236             world_db["EMPATHY"] = 1
237         elif world_db["FAVOR_STAGE"] == 3 and world_db["GOD_FAVOR"] < 5000:
238             altar_msg_wait(5000)
239         elif world_db["FAVOR_STAGE"] == 3 and world_db["GOD_FAVOR"] >= 5000:
240             world_db["FAVOR_STAGE"] = 4
241             log(altar_msg_5)
242             id = id_setter(-1, "Things")
243             world_db["Things"][id] = new_Thing(world_db["TOOL_1"],
244                                                world_db["altar"])
245         elif world_db["GOD_FAVOR"] < 20000:
246             altar_msg_wait(20000)
247         elif world_db["GOD_FAVOR"] > 20000:
248             world_db["FAVOR_STAGE"] = 9001
249             log(altar_msg_6)
250             id = id_setter(-1, "Things")
251             world_db["Things"][id] = new_Thing(world_db["SLIPPERS"],
252                                                world_db["altar"])
253
254     from server.actions import actor_move
255     test = actor_move(t)
256     if test != None:
257         if 2 == len(test):
258             if test[0] > 0:
259                 if world_db["FAVOR_STAGE"] >= 3 and \
260                         test[1] == world_db["ANIMAL_0"]:
261                     world_db["GOD_FAVOR"] += 125
262                 elif t == world_db["Things"][0]:
263                     world_db["GOD_FAVOR"] -= 2 * test[1]
264             elif t == world_db["Things"][0]:
265                 world_db["GOD_FAVOR"] -= 1
266         elif 3 == len(test):
267             if (t == world_db["Things"][0] and
268                     test[1] == world_db["altar"][0] and
269                     test[2] == world_db["altar"][1]):
270                 enter_altar()
271
272 def actor_move_attempts_hook(t, move_result, pos):
273     if (ord("X") == world_db["MAP"][pos] or ord("|") == world_db["MAP"][pos]):
274         for tid in t["T_CARRIES"]:
275             ty = world_db["Things"][tid]["T_TYPE"]
276             if world_db["ThingTypes"][ty]["TT_TOOL"] == "axe":
277                 axe_name = world_db["ThingTypes"][ty]["TT_NAME"]
278                 if t == world_db["Things"][0]:
279                     log("With your " + axe_name + ", you chop!")
280                     if ord("X") == world_db["MAP"][pos]:
281                         world_db["GOD_FAVOR"] -= 1
282                 chop_power = world_db["ThingTypes"][ty]["TT_TOOLPOWER"]
283                 case_X = world_db["MAP"][pos] == ord("X")
284                 if (chop_power > 0 and
285                     ((case_X and 0 == int(rand.next() / chop_power))
286                      or (not case_X and
287                          0 == int(rand.next() / (3 * chop_power))))):
288                     if t == world_db["Things"][0]:
289                         log("You chop it DOWN.")
290                         if ord("X") == world_db["MAP"][pos]:
291                             world_db["GOD_FAVOR"] -= 10
292                     world_db["MAP"][pos] = ord(".")
293                     i = 3 if case_X else 1
294                     from server.new_thing import new_Thing
295                     for i in range(i):
296                         tid = id_setter(-1, "Things")
297                         world_db["Things"][tid] = new_Thing(world_db["LUMBER"],
298                                     (move_result[1], move_result[2]))
299                     build_fov_map(t)
300                 return True
301     return False
302
303 def decrement_lifepoints(t):
304     from server.decrement_lifepoints import decrement_lifepoints
305     live_tid = t["T_TYPE"]
306     test = decrement_lifepoints(t)
307     if test > 0 and t != world_db["Things"][0]:
308         n_species = len([tid for tid in world_db["Things"]
309                          if world_db["Things"][tid]["T_TYPE"] == live_tid])
310         if 0 == n_species:
311             from server.new_thing import new_Thing
312             if world_db["FAVOR_STAGE"] >= 3 and \
313                     live_tid == world_db["ANIMAL_0"]:
314                 world_db["GOD_FAVOR"] += 3000
315                 log("CONGRATULATIONS! The "
316                     + world_db["ThingTypes"][live_tid]["TT_NAME"]
317                     + " species has died out. The Island God is pleased.")
318             else:
319                 tid = id_setter(-1, "Things")
320                 world_db["Things"][tid] = new_Thing(live_tid,
321                                                     world_db["altar"])
322                 log("The " + world_db["ThingTypes"][live_tid]["TT_NAME"] + " s"
323                     "pecies has temporarily died out. One new-born is spawned "
324                     "at the altar.")
325     return test
326
327 def command_worldactive_test_hook():
328     pos = world_db["MAP"].find(b'_')
329     if pos > 0:
330         y = int(pos / world_db["MAP_LENGTH"])
331         x = pos % world_db["MAP_LENGTH"]
332         world_db["altar"] = (y, x)
333     else:
334         print("Ignored: No altar defined for world to activate.")
335         return False
336     for name in world_db["specials"]:
337         if world_db[name] not in world_db["ThingTypes"]:
338             print("Ignored: Not all specials set for world to activate.")
339             return False
340     return True
341
342 def play_move_attempt_hook(t, direction, pos):
343     if (ord("X") == world_db["MAP"][pos] or ord("|") == world_db["MAP"][pos]):
344         carries_axe = False
345         for tid in t["T_CARRIES"]:
346             ty = world_db["Things"][tid]["T_TYPE"]
347             if world_db["ThingTypes"][ty]["TT_TOOL"] == "axe":
348                 world_db["Things"][0]["T_ARGUMENT"] = direction
349                 set_command("move")
350                 return True
351     return False
352
353 def play_use_attempt_hook(t, tt):
354     pos = t["T_POSY"] * world_db["MAP_LENGTH"] + t["T_POSX"]
355     if tt["TT_TOOL"] == "axe":
356         log("To use this item for chopping, MOVE towards a tree while carrying"
357             " it in your inventory.")
358         return False
359     elif tt["TT_TOOL"] == "carpentry":
360         if (world_db["MAP"][pos] == ord("X")
361             or world_db["MAP"][pos] == ord("|")):
362             log("CAN'T build when standing on barrier.")
363             return False
364         for tid in [tid for tid in world_db["Things"]
365                     if not world_db["Things"][tid] == t
366                     if not world_db["Things"][tid]["carried"]
367                     if world_db["Things"][tid]["T_POSY"] == t["T_POSY"]
368                     if world_db["Things"][tid]["T_POSX"] == t["T_POSX"]]:
369              log("CAN'T build when standing objects.")
370              return False
371         wood_id = None
372         for tid in t["T_CARRIES"]:
373             type_material = world_db["Things"][tid]["T_TYPE"]
374             if world_db["ThingTypes"][type_material]["TT_TOOL"] == "wood":
375                 wood_id = tid
376                 break
377         if wood_id == None:
378             log("You CAN'T use a " + world_db["ThingTypes"][type]["TT_NAME"]
379                 + " without some wood in your inventory.")
380             return False
381     elif (tt["TT_TOOL"] == "fertilizer"
382           and not world_db["MAP"][pos] == ord(".")):
383         log("Can only make soil out of NON-SOIL earth.")
384         return False
385     elif tt["TT_TOOL"] == "wood":
386         log("To use wood, you NEED a carpentry tool.")
387         return False
388     elif type == world_db["SLIPPERS"]:
389         return True
390
391 def specialtypesetter(name):
392     def helper(str_int):
393         val = integer_test(str_int, 0)
394         if None != val:
395             world_db[name] = val
396             if world_db["WORLD_ACTIVE"] \
397                and world_db[name] not in world_db["ThingTypes"]:
398                 world_db["WORLD_ACTIVE"] = 0
399                 print(name + " fits no known ThingType, deactivating world.")
400     return helper
401
402 def write_metamap_A():
403     from server.worldstate_write_helpers import write_map
404     ord_v = ord("v")
405     length = world_db["MAP_LENGTH"]
406     metamapA = bytearray(b'0' * (length ** 2))
407     for id in [id for id in world_db["Things"]
408                   if not world_db["Things"][id]["carried"]
409                   if world_db["Things"][id]["T_LIFEPOINTS"]
410                   if world_db["Things"][0]["fovmap"][
411                        world_db["Things"][id]["T_POSY"] * length
412                        + world_db["Things"][id]["T_POSX"]] == ord_v]:
413         pos = (world_db["Things"][id]["T_POSY"] * length
414               + world_db["Things"][id]["T_POSX"])
415         if id == 0 or world_db["EMPATHY"]:
416             type = world_db["Things"][id]["T_TYPE"]
417             max_hp = world_db["ThingTypes"][type]["TT_LIFEPOINTS"]
418             third_of_hp = max_hp / 3
419             hp = world_db["Things"][id]["T_LIFEPOINTS"]
420             add = 0
421             if hp > 2 * third_of_hp:
422                  add = 2
423             elif hp > third_of_hp:
424                 add = 1
425             metamapA[pos] = ord('a') + add
426         else:
427             metamapA[pos] = ord('X')
428     for mt in world_db["Things"][0]["T_MEMTHING"]:
429         pos = mt[1] * length + mt[2]
430         if metamapA[pos] < ord('2'):
431             metamapA[pos] += 1
432     return write_map(metamapA, length)
433
434 def write_metamap_B():
435     from server.worldstate_write_helpers import write_map
436     ord_v = ord("v")
437     length = world_db["MAP_LENGTH"]
438     metamapB = bytearray(b' ' * (length ** 2))
439     for id in [id for id in world_db["Things"]
440                   if not world_db["Things"][id]["carried"]
441                   if world_db["Things"][id]["T_LIFEPOINTS"]
442                   if world_db["Things"][0]["fovmap"][
443                        world_db["Things"][id]["T_POSY"] * length
444                        + world_db["Things"][id]["T_POSX"]] == ord_v]:
445         pos = (world_db["Things"][id]["T_POSY"] * length
446               + world_db["Things"][id]["T_POSX"])
447         if id == 0 or world_db["EMPATHY"]:
448             action = world_db["Things"][id]["T_COMMAND"]
449             if 0 != action:
450                 name = world_db["ThingActions"][action]["TA_NAME"]
451             else:
452                 name = " "
453             metamapB[pos] = ord(name[0])
454     return write_map(metamapB, length)
455
456 def calc_effort(thing_action, thing):
457     from math import sqrt
458     effort = thing_action["TA_EFFORT"]
459     if thing_action["TA_NAME"] == "move":
460         typ = thing["T_TYPE"]
461         max_hp = (world_db["ThingTypes"][typ]["TT_LIFEPOINTS"])
462         effort = int(effort / sqrt(max_hp))
463         effort = 1 if effort == 0 else effort
464     return effort
465
466 def play_pickup():
467     """Try "pickup" as player's T_COMMAND"."""
468     if action_exists("pickup"):
469         t = world_db["Things"][0]
470         ids = [id for id in world_db["Things"] if id
471                if not world_db["Things"][id]["carried"]
472                if world_db["Things"][id]["T_POSY"] == t["T_POSY"]
473                if world_db["Things"][id]["T_POSX"] == t["T_POSX"]]
474         if not len(ids):
475             log("NOTHING to pick up.")
476         elif len(t["T_CARRIES"]) >= world_db["ThingTypes"][t["T_TYPE"]] \
477                 ["TT_STORAGE"]:
478             log("CAN'T pick up: No storage room to carry anything more.")
479         else:
480             set_command("pickup")
481
482 strong_write(io_db["file_out"], "PLUGIN PleaseTheIslandGod\n")
483
484 def set_zero_if_undefined(key):
485     if not key in world_db:
486         world_db[key] = 0
487
488 set_zero_if_undefined("GOD_FAVOR")
489 set_zero_if_undefined("FAVOR_STAGE")
490 set_zero_if_undefined("EMPATHY")
491 world_db["specials"] = ["SLIPPERS", "PLANT_0", "PLANT_1", "TOOL_0", "TOOL_1",
492     "LUMBER", "ANIMAL_0", "ANIMAL_1"]
493 for key in world_db["specials"]:
494     set_zero_if_undefined(key)
495
496 world_db["terrain_names"][":"] = "SOIL"
497 world_db["terrain_names"]["|"] = "WALL"
498 world_db["terrain_names"]["_"] = "ALTAR"
499 io_db["worldstate_write_order"] += [["GOD_FAVOR", "world_int"]]
500 io_db["worldstate_write_order"] += [[write_metamap_A, "func"]]
501 io_db["worldstate_write_order"] += [[write_metamap_B, "func"]]
502
503 import server.config.world_data
504 server.config.world_data.symbols_passable += ":_"
505
506 from server.config.world_data import thing_defaults, thingtype_defaults
507 thing_defaults["T_PLAYERDROP"] = 0
508 thingtype_defaults["TT_STORAGE"] = 0
509
510 import server.config.actions
511 server.config.actions.action_db["actor_move"] = actor_move
512 server.config.actions.action_db["actor_pickup"] = actor_pickup
513 server.config.actions.action_db["actor_drop"] = actor_drop
514 server.config.actions.actor_pickup_test_hook = actor_pickup_test_hook
515 server.config.actions.actor_use_attempts_hook = actor_use_attempts_hook
516 server.config.actions.actor_move_attempts_hook = actor_move_attempts_hook
517
518 from server.config.commands import commands_db
519 commands_db["GOD_FAVOR"] = (1, False, setter(None, "GOD_FAVOR", -32768, 32767))
520 commands_db["TT_STORAGE"] = (1, False, setter("ThingType", "TT_STORAGE", 0, 255))
521 commands_db["T_PLAYERDROP"] = (1, False, setter("Thing", "T_PLAYERDROP", 0, 1))
522 commands_db["FAVOR_STAGE"] = (1, False, setter(None, "FAVOR_STAGE", 0, 1))
523 commands_db["SLIPPERS"] = (1, False, specialtypesetter("SLIPPERS"))
524 commands_db["TOOL_0"] = (1, False, specialtypesetter("TOOL_0"))
525 commands_db["TOOL_1"] = (1, False, specialtypesetter("TOOL_1"))
526 commands_db["ANIMAL_0"] = (1, False, specialtypesetter("ANIMAL_0"))
527 commands_db["ANIMAL_1"] = (1, False, specialtypesetter("ANIMAL_1"))
528 commands_db["PLANT_0"] = (1, False, specialtypesetter("PLANT_0"))
529 commands_db["PLANT_1"] = (1, False, specialtypesetter("PLANT_1"))
530 commands_db["LUMBER"] = (1, False, specialtypesetter("LUMBER"))
531 commands_db["EMPATHY"] = (1, False, setter(None, "EMPATHY", 0, 1))
532 commands_db["pickup"] = (0, False, play_pickup)
533 import server.config.commands
534 server.config.commands.command_worldactive_test_hook = \
535     command_worldactive_test_hook
536 server.config.commands.play_move_attempt_hook = play_move_attempt_hook
537 server.config.commands.play_use_attempt_hook = play_use_attempt_hook
538
539 import server.config.misc
540 server.config.misc.make_map_func = make_map
541 server.config.misc.decrement_lifepoints = decrement_lifepoints
542 server.config.misc.calc_effort_func = calc_effort
543
544 import server.config.make_world_helpers
545 server.config.make_world_helpers.pos_test_func = pos_test
546 server.config.make_world_helpers.world_makable_func = world_makable
547 server.config.make_world_helpers.make_map_func = make_map
548
549 import server.config.thingproliferation
550 server.config.thingproliferation.field_spreadable = field_spreadable
551 server.config.thingproliferation.thingprol_plugin_conditions = \
552     thingprol_plugin_conditions
553 server.config.thingproliferation.thingprol_plugin_post_create_hook = \
554     thingprol_plugin_post_create_hook
555
556 import server.config.ai
557 server.config.ai.ai_hook_pickup = ai_hook_pickup_test