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.
6 from server.config.world_data import world_db
7 from server.io import log
11 """Make t do nothing (but loudly, if player avatar)."""
12 if t == world_db["Things"][0]:
17 """If passable, move/collide(=attack) thing into T_ARGUMENT's direction.
19 On attack, return 0 on non-kill and TT_LIFEPOINTS of killed type on kill,
20 plus type id of attacked Thing. On move, return mv_yx_in_dir_legal result.
22 from server.build_fov_map import build_fov_map
23 from server.config.misc import decrement_lifepoints
24 from server.utils import mv_yx_in_dir_legal
25 from server.config.world_data import directions_db, symbols_passable
27 move_result = mv_yx_in_dir_legal(chr(t["T_ARGUMENT"]),
28 t["T_POSY"], t["T_POSX"])
29 if 1 == move_result[0]:
30 pos = (move_result[1] * world_db["MAP_LENGTH"]) + move_result[2]
31 hitted = [id for id in world_db["Things"]
32 if world_db["Things"][id] != t
33 if world_db["Things"][id]["T_LIFEPOINTS"]
34 if world_db["Things"][id]["T_POSY"] == move_result[1]
35 if world_db["Things"][id]["T_POSX"] == move_result[2]]
38 hitted_tid = world_db["Things"][hit_id]["T_TYPE"]
39 if t == world_db["Things"][0]:
40 hitted_name = world_db["ThingTypes"][hitted_tid]["TT_NAME"]
41 log("You WOUND " + hitted_name + ".")
43 hitter_name = world_db["ThingTypes"][t["T_TYPE"]]["TT_NAME"]
44 log(hitter_name +" WOUNDS you.")
45 decr_test = decrement_lifepoints(world_db["Things"][hit_id])
46 if decr_test > 0 and t == world_db["Things"][0]:
47 log(hitted_name + " dies.")
48 return decr_test, hitted_tid
49 from server.config.actions import actor_move_attempts_hook
50 if actor_move_attempts_hook(t, move_result, pos):
52 passable = chr(world_db["MAP"][pos]) in symbols_passable
53 dir = [dir for dir in directions_db
54 if directions_db[dir] == chr(t["T_ARGUMENT"])][0]
56 t["T_POSY"] = move_result[1]
57 t["T_POSX"] = move_result[2]
58 for id in t["T_CARRIES"]:
59 world_db["Things"][id]["T_POSY"] = move_result[1]
60 world_db["Things"][id]["T_POSX"] = move_result[2]
62 if t == world_db["Things"][0]:
63 log("You MOVE " + dir + ".")
68 """Make t pick up (topmost?) Thing from ground into inventory. Return it.
70 Define topmostness by how low the thing's type ID is.
72 ids = [id for id in world_db["Things"] if world_db["Things"][id] != t
73 if not world_db["Things"][id]["carried"]
74 if world_db["Things"][id]["T_POSY"] == t["T_POSY"]
75 if world_db["Things"][id]["T_POSX"] == t["T_POSX"]]
79 tid = world_db["Things"][iid]["T_TYPE"]
80 from server.config.actions import actor_pickup_test_hook
81 if (lowest_tid == -1 or tid < lowest_tid) and \
82 actor_pickup_test_hook(t, tid):
85 world_db["Things"][id]["carried"] = True
86 t["T_CARRIES"].append(id)
87 if t == world_db["Things"][0]:
88 log("You PICK UP an object.")
89 return world_db["Things"][id]
92 """Drop to ground from t's inventory, return T_ARGUMENT-indexed Thing."""
93 # TODO: Handle case where T_ARGUMENT matches nothing.
94 if len(t["T_CARRIES"]):
95 id = t["T_CARRIES"][t["T_ARGUMENT"]]
96 t["T_CARRIES"].remove(id)
97 world_db["Things"][id]["carried"] = False
98 if t == world_db["Things"][0]:
99 log("You DROP an object.")
100 return world_db["Things"][id]
103 """Make t use (for now: consume) T_ARGUMENT-indexed Thing in inventory."""
104 # TODO: Handle case where T_ARGUMENT matches nothing.
105 if len(t["T_CARRIES"]):
106 id = t["T_CARRIES"][t["T_ARGUMENT"]]
107 type = world_db["Things"][id]["T_TYPE"]
108 if world_db["ThingTypes"][type]["TT_TOOL"] == "food":
109 t["T_CARRIES"].remove(id)
110 del world_db["Things"][id]
111 t["T_SATIATION"] += world_db["ThingTypes"][type]["TT_TOOLPOWER"]
112 if t == world_db["Things"][0]:
113 log("You CONSUME this thing.")
115 from server.config.actions import actor_use_attempts_hook
116 actor_use_attempts_hook(t, type)