X-Git-Url: https://plomlompom.com/repos/foo.html?a=blobdiff_plain;f=server%2Fcommands.py;h=b8216a0fec6433699401b6eefc9cfa4bf41a7080;hb=10152e3ef6bac7e1fbc381cc986c45eebccbcc32;hp=72018be4006a93a58a94d8e69144fed3004d9466;hpb=e9a37a285ab627535c0fe983e1eda815c1d587b5;p=plomrogue
diff --git a/server/commands.py b/server/commands.py
index 72018be..b8216a0 100644
--- a/server/commands.py
+++ b/server/commands.py
@@ -7,7 +7,7 @@ from server.config.world_data import world_db
from server.config.io import io_db
from server.io import log, strong_write
from server.utils import integer_test, id_setter
-from server.world import set_world_inactive, turn_over
+from server.world import set_world_inactive, turn_over, eat_vs_hunger_threshold
from server.update_map_memory import update_map_memory
from server.build_fov_map import build_fov_map
@@ -57,8 +57,7 @@ def command_thingshere(str_y, str_x):
for id in world_db["Things"]
if not world_db["Things"][id]["carried"]
if world_db["Things"][id]["T_TYPE"] == tid
- if y == world_db["Things"][id]["T_POSY"]
- if x == world_db["Things"][id]["T_POSX"]]:
+ if pos == world_db["Things"][id]["pos"]]:
type = world_db["Things"][id]["T_TYPE"]
name = world_db["ThingTypes"][type]["TT_NAME"]
strong_write(io_db["file_out"], name + "\n")
@@ -130,18 +129,21 @@ def command_worldactive(worldactive_string):
else:
print("Ignored: No player defined for world to activate.")
return
- if world_db["MAP"]:
- for id in world_db["Things"]:
- if world_db["Things"][id]["T_LIFEPOINTS"]:
- build_fov_map(world_db["Things"][id])
- if 0 == id:
- update_map_memory(world_db["Things"][id], False)
- if not world_db["Things"][0]["T_LIFEPOINTS"]:
- empty_fovmap = bytearray(b" " * world_db["MAP_LENGTH"] ** 2)
- world_db["Things"][0]["fovmap"] = empty_fovmap
- world_db["WORLD_ACTIVE"] = 1
- else:
+ if not world_db["MAP"]:
print("Ignoring: No map defined for world to activate.")
+ return
+ from server.config.commands import command_worldactive_test_hook
+ if not command_worldactive_test_hook():
+ return
+ for tid in world_db["Things"]:
+ if world_db["Things"][tid]["T_LIFEPOINTS"]:
+ build_fov_map(world_db["Things"][tid])
+ if 0 == tid:
+ update_map_memory(world_db["Things"][tid], False)
+ if not world_db["Things"][0]["T_LIFEPOINTS"]:
+ empty_fovmap = bytearray(b" " * world_db["MAP_LENGTH"] ** 2)
+ world_db["Things"][0]["fovmap"] = empty_fovmap
+ world_db["WORLD_ACTIVE"] = 1
def command_tid(id_string):
@@ -149,34 +151,28 @@ def command_tid(id_string):
Default new Thing's type to the first available ThingType, others: zero.
"""
- id = id_setter(id_string, "Things", command_tid)
- if None != id:
+ tid = id_setter(id_string, "Things", command_tid)
+ if None != tid:
if world_db["ThingTypes"] == {}:
print("Ignoring: No ThingType to settle new Thing in.")
return
- type = list(world_db["ThingTypes"].keys())[0]
+ ty = list(world_db["ThingTypes"].keys())[0]
from server.new_thing import new_Thing
- world_db["Things"][id] = new_Thing(type)
+ world_db["Things"][tid] = new_Thing(ty)
def command_ttid(id_string):
"""Set ID of ThingType to manipulate. ID unused? Create new one.
- Default new ThingType's TT_SYMBOL to "?", TT_CORPSE_ID to self, TT_TOOL to
- "", others: 0.
+ Set new type's TT_CORPSE_ID to self, other fields to thingtype_defaults.
"""
- id = id_setter(id_string, "ThingTypes", command_ttid)
- if None != id:
- world_db["ThingTypes"][id] = {
- "TT_NAME": "(none)",
- "TT_TOOLPOWER": 0,
- "TT_LIFEPOINTS": 0,
- "TT_PROLIFERATE": 0,
- "TT_START_NUMBER": 0,
- "TT_SYMBOL": "?",
- "TT_CORPSE_ID": id,
- "TT_TOOL": ""
- }
+ ttid = id_setter(id_string, "ThingTypes", command_ttid)
+ if None != ttid:
+ from server.config.world_data import thingtype_defaults
+ world_db["ThingTypes"][ttid] = {}
+ for key in thingtype_defaults:
+ world_db["ThingTypes"][ttid][key] = thingtype_defaults[key]
+ world_db["ThingTypes"][ttid]["TT_CORPSE_ID"] = ttid
def command_taid(id_string):
@@ -184,9 +180,9 @@ def command_taid(id_string):
Default new ThingAction's TA_EFFORT to 1, its TA_NAME to "wait".
"""
- id = id_setter(id_string, "ThingActions", command_taid, True)
- if None != id:
- world_db["ThingActions"][id] = {
+ taid = id_setter(id_string, "ThingActions", command_taid, True)
+ if None != taid:
+ world_db["ThingActions"][taid] = {
"TA_EFFORT": 1,
"TA_NAME": "wait"
}
@@ -304,6 +300,13 @@ def command_ttcorpseid(str_int):
print("Ignoring: Corpse ID belongs to no known ThignType.")
+@test_ThingType_id
+def command_ttlifepoints(val_string):
+ setter("ThingType", "TT_LIFEPOINTS", 0, 255)(val_string)
+ tt = world_db["ThingTypes"][command_ttid.id]
+ tt["eat_vs_hunger_threshold"] = eat_vs_hunger_threshold(command_ttid.id)
+
+
@test_ThingAction_id
def command_taname(name):
"""Set TA_NAME of selected ThingAction.
@@ -324,6 +327,15 @@ def command_taname(name):
print("Ignoring: Invalid action name.")
+@test_ThingAction_id
+def command_taeffort(val_string):
+ setter("ThingAction", "TA_EFFORT", 0, 255)(val_string)
+ if world_db["ThingActions"][command_taid.id]["TA_NAME"] == "use":
+ for ttid in world_db["ThingTypes"]:
+ tt = world_db["ThingTypes"][ttid]
+ tt["eat_vs_hunger_threshold"] = eat_vs_hunger_threshold(ttid)
+
+
def setter(category, key, min, max=None):
"""Build setter for world_db([category + "s"][id])[key] to >=min/<=max."""
if category is None:
@@ -406,7 +418,9 @@ def setter_tpos(axis):
val = integer_test(str_int, 0, 255)
if None != val:
if val < world_db["MAP_LENGTH"]:
- world_db["Things"][command_tid.id]["T_POS" + axis] = val
+ t = world_db["Things"][command_tid.id]
+ t["T_POS" + axis] = val
+ t["pos"] = t["T_POSY"] * world_db["MAP_LENGTH"] + t["T_POSX"]
if world_db["WORLD_ACTIVE"] \
and world_db["Things"][command_tid.id]["T_LIFEPOINTS"]:
build_fov_map(world_db["Things"][command_tid.id])
@@ -427,7 +441,8 @@ def set_command(action):
def play_wait():
"""Try "wait" as player's T_COMMAND."""
- set_command("wait")
+ if world_db["WORLD_ACTIVE"]:
+ set_command("wait")
def action_exists(action):
@@ -441,21 +456,21 @@ def action_exists(action):
def play_pickup():
"""Try "pickup" as player's T_COMMAND"."""
- if action_exists("pickup"):
+ if action_exists("pickup") and world_db["WORLD_ACTIVE"]:
t = world_db["Things"][0]
- ids = [id for id in world_db["Things"] if id
- if not world_db["Things"][id]["carried"]
- if world_db["Things"][id]["T_POSY"] == t["T_POSY"]
- if world_db["Things"][id]["T_POSX"] == t["T_POSX"]]
+ ids = [tid for tid in world_db["Things"] if tid
+ if not world_db["Things"][tid]["carried"]
+ if world_db["Things"][tid]["pos"] == t["pos"]]
+ from server.config.commands import play_pickup_attempt_hook
if not len(ids):
log("NOTHING to pick up.")
- else:
+ elif play_pickup_attempt_hook(t):
set_command("pickup")
def play_drop(str_arg):
"""Try "drop" as player's T_COMMAND, int(str_arg) as T_ARGUMENT / slot."""
- if action_exists("drop"):
+ if action_exists("drop") and world_db["WORLD_ACTIVE"]:
t = world_db["Things"][0]
if 0 == len(t["T_CARRIES"]):
log("You have NOTHING to drop in your inventory.")
@@ -470,17 +485,20 @@ def play_drop(str_arg):
def play_use(str_arg):
"""Try "use" as player's T_COMMAND, int(str_arg) as T_ARGUMENT / slot."""
- if action_exists("use"):
+ if action_exists("use") and world_db["WORLD_ACTIVE"]:
t = world_db["Things"][0]
if 0 == len(t["T_CARRIES"]):
log("You have NOTHING to use in your inventory.")
else:
val = integer_test(str_arg, 0, 255)
if None != val and val < len(t["T_CARRIES"]):
- id = t["T_CARRIES"][val]
- type = world_db["Things"][id]["T_TYPE"]
- if not world_db["ThingTypes"][type]["TT_TOOL"] == "food":
- log("You CAN'T consume this thing.")
+ tid = t["T_CARRIES"][val]
+ tt = world_db["ThingTypes"][world_db["Things"][tid]["T_TYPE"]]
+ from server.config.commands import play_use_attempt_hook
+ hook_test = play_use_attempt_hook(t, tt)
+ if not (tt["TT_TOOL"] == "food" or hook_test):
+ if hook_test != False:
+ log("You CAN'T use this thing.")
return
world_db["Things"][0]["T_ARGUMENT"] = val
set_command("use")
@@ -490,22 +508,25 @@ def play_use(str_arg):
def play_move(str_arg):
"""Try "move" as player's T_COMMAND, str_arg as T_ARGUMENT / direction."""
- if action_exists("move"):
+ if action_exists("move") and world_db["WORLD_ACTIVE"]:
from server.config.world_data import directions_db, symbols_passable
t = world_db["Things"][0]
if not str_arg in directions_db:
print("Illegal move direction string.")
return
- dir = ord(directions_db[str_arg])
+ d = ord(directions_db[str_arg])
from server.utils import mv_yx_in_dir_legal
- move_result = mv_yx_in_dir_legal(chr(dir), t["T_POSY"], t["T_POSX"])
+ move_result = mv_yx_in_dir_legal(chr(d), t["T_POSY"], t["T_POSX"])
if 1 == move_result[0]:
pos = (move_result[1] * world_db["MAP_LENGTH"]) + move_result[2]
if ord("~") == world_db["MAP"][pos]:
log("You can't SWIM.")
return
+ from server.config.commands import play_move_attempt_hook
+ if play_move_attempt_hook(t, d, pos):
+ return
if chr(world_db["MAP"][pos]) in symbols_passable:
- world_db["Things"][0]["T_ARGUMENT"] = dir
+ world_db["Things"][0]["T_ARGUMENT"] = d
set_command("move")
return
log("You CAN'T move there.")
@@ -513,6 +534,7 @@ def play_move(str_arg):
def command_ai():
"""Call ai() on player Thing, then turn_over()."""
- from server.config.actions import ai_func
- ai_func(world_db["Things"][0])
- turn_over()
+ from server.ai import ai
+ if world_db["WORLD_ACTIVE"]:
+ ai(world_db["Things"][0])
+ turn_over()