X-Git-Url: https://plomlompom.com/repos/?p=plomrogue;a=blobdiff_plain;f=plugins%2Fserver%2FPleaseTheIslandGod.py;h=4a884ed37883ab5cf11294d1d204376e1a9cf654;hp=4b8a7d73db1c4ba268cbe80ff1decec3ac8aedd8;hb=160e1660559e70c53ab2fcfc8af6461f539c647d;hpb=81f8bee1a21642c56b1fead9ba79afdad0c8b451 diff --git a/plugins/server/PleaseTheIslandGod.py b/plugins/server/PleaseTheIslandGod.py index 4b8a7d7..4a884ed 100644 --- a/plugins/server/PleaseTheIslandGod.py +++ b/plugins/server/PleaseTheIslandGod.py @@ -46,16 +46,16 @@ def make_map(): world_db["altar"] = (y, x) altar_placed = True -def field_spreadable(c, t): +def thingprol_field_spreadable(c, t): return ":" == c or (world_db["ThingTypes"][t["T_TYPE"]]["TT_LIFEPOINTS"] and "." == c) -def thingprol_plugin_conditions(t): +def thingprol_test(t): tt = world_db["ThingTypes"][t["T_TYPE"]] return (tt["TT_LIFEPOINTS"] == 0 or \ t["T_LIFEPOINTS"] >= 0.9 * tt["TT_LIFEPOINTS"]) -def thingprol_plugin_post_create_hook(t): +def thingprol_post_create(t): tt = world_db["ThingTypes"][t["T_TYPE"]] if (world_db["FAVOR_STAGE"] > 0 and t["T_TYPE"] == world_db["PLANT_0"]): world_db["GOD_FAVOR"] += 5 @@ -70,143 +70,70 @@ def ai_hook_pickup_test(t): world_db["ThingTypes"][t["T_TYPE"]]["TT_STORAGE"] def actor_pickup(t): - from server.ai import eat_vs_hunger_threshold used_slots = len(t["T_CARRIES"]) if used_slots < world_db["ThingTypes"][t["T_TYPE"]]["TT_STORAGE"]: - ids = [id for id in world_db["Things"] if world_db["Things"][id] != t - 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"]] - if len(ids): - lowest_tid = -1 - eat_cost = eat_vs_hunger_threshold(t["T_TYPE"]) - for iid in ids: - tid = world_db["Things"][iid]["T_TYPE"] - if lowest_tid == -1 or tid < lowest_tid: - if (t != world_db["Things"][0] and - (world_db["ThingTypes"][tid]["TT_TOOL"] != "food" - or (world_db["ThingTypes"][tid]["TT_TOOLPOWER"] - <= eat_cost))): - continue - id = iid - lowest_tid = tid - world_db["Things"][id]["carried"] = True - ty = world_db["Things"][id]["T_TYPE"] - if (t != world_db["Things"][0] - and world_db["Things"][id]["T_PLAYERDROP"] - and world_db["ThingTypes"][ty]["TT_TOOL"] == "food"): - score = int(world_db["ThingTypes"][ty]["TT_TOOLPOWER"] / 32) + from server.actions import actor_pickup + t_picked = actor_pickup(t) + if t_picked != None: + ty = world_db["ThingTypes"][t_picked["T_TYPE"]] + if t != world_db["Things"][0] and t_picked["T_PLAYERDROP"] \ + and ty["TT_TOOL"] == "food": + score = int(ty["TT_TOOLPOWER"] / 32) world_db["GOD_FAVOR"] += score - world_db["Things"][id]["T_PLAYERDROP"] = 0 - t["T_CARRIES"].append(id) - if t == world_db["Things"][0]: - log("You PICK UP an object.") + t_picked["T_PLAYERDROP"] = 0 elif t == world_db["Things"][0]: log("CAN'T pick up object: No storage room to carry more.") +def actor_pickup_test_hook(t, tid): + tt = world_db["ThingTypes"][tid] + return not (t != world_db["Things"][0] and (tt["TT_TOOL"] != "food" or + (tt["TT_TOOLPOWER"] <= + world_db["ThingTypes"][t["T_TYPE"]]["eat_vs_hunger_threshold"]))) def actor_drop(t): - """Make t rop Thing from inventory to ground indexed by T_ARGUMENT.""" - if len(t["T_CARRIES"]): - id = t["T_CARRIES"][t["T_ARGUMENT"]] - t["T_CARRIES"].remove(id) - world_db["Things"][id]["carried"] = False - if t == world_db["Things"][0]: - log("You DROP an object.") - world_db["Things"][id]["T_PLAYERDROP"] = 1 - - -def actor_use(t): - if len(t["T_CARRIES"]): - id = t["T_CARRIES"][t["T_ARGUMENT"]] - type = world_db["Things"][id]["T_TYPE"] - if type == world_db["SLIPPERS"]: - if t == world_db["Things"][0]: - log("You use the " + world_db["ThingTypes"][type]["TT_NAME"] + - ". It glows in wondrous colors, and emits a sound as if fr" - "om a dying cat. The Island God laughs.\n") - t["T_LIFEPOINTS"] = 1 - from server.config.misc import decrement_lifepoints_func - decrement_lifepoints_func(t) - elif (world_db["ThingTypes"][type]["TT_TOOL"] == "carpentry"): - pos = t["T_POSY"] * world_db["MAP_LENGTH"] + t["T_POSX"] - if (world_db["MAP"][pos] == ord("X") - or world_db["MAP"][pos] == ord("|")): - return - for id in [id for id in world_db["Things"] - if not world_db["Things"][id] == t - 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"]]: - return - wood_id = None - for id in t["T_CARRIES"]: - type_material = world_db["Things"][id]["T_TYPE"] - if (world_db["ThingTypes"][type_material]["TT_TOOL"] - == "wood"): - wood_id = id - break - if wood_id != None: - t["T_CARRIES"].remove(wood_id) - del world_db["Things"][wood_id] - world_db["MAP"][pos] = ord("|") - log("With your " + world_db["ThingTypes"][type]["TT_NAME"] - + " you build a WOODEN BARRIER from your " - + world_db["ThingTypes"][type_material]["TT_NAME"] + ".") - elif world_db["ThingTypes"][type]["TT_TOOL"] == "fertilizer": - pos = t["T_POSY"] * world_db["MAP_LENGTH"] + t["T_POSX"] - if world_db["MAP"][pos] == ord("."): - log("You create SOIL.") - world_db["MAP"][pos] = ord(":") - elif world_db["ThingTypes"][type]["TT_TOOL"] == "food": - t["T_CARRIES"].remove(id) - del world_db["Things"][id] - t["T_SATIATION"] += world_db["ThingTypes"][type]["TT_TOOLPOWER"] - if t == world_db["Things"][0]: - log("You CONSUME this thing.") - elif t == world_db["Things"][0]: - log("You try to use this object, but FAIL.") + from server.actions import actor_drop + dropped = actor_drop(t) + if dropped != None: + dropped["T_PLAYERDROP"] = 1 -def decrement_lifepoints(t): - t["T_LIFEPOINTS"] -= 1 - live_type = t["T_TYPE"] - _id = [_id for _id in world_db["Things"] if world_db["Things"][_id] == t][0] - if 0 == t["T_LIFEPOINTS"]: - for id in t["T_CARRIES"]: - t["T_CARRIES"].remove(id) - world_db["Things"][id]["T_POSY"] = t["T_POSY"] - world_db["Things"][id]["T_POSX"] = t["T_POSX"] - world_db["Things"][id]["carried"] = False - t["T_TYPE"] = world_db["ThingTypes"][t["T_TYPE"]]["TT_CORPSE_ID"] - if world_db["Things"][0] == t: - t["fovmap"] = bytearray(b' ' * (world_db["MAP_LENGTH"] ** 2)) - log("You die.") - log("See README on how to start over.") - else: - t["fovmap"] = False - t["T_MEMMAP"] = False - t["T_MEMDEPTHMAP"] = False - t["T_MEMTHING"] = [] - n_species = len([id for id in world_db["Things"] - if world_db["Things"][id]["T_TYPE"] == live_type]) - if 0 == n_species: - from server.new_thing import new_Thing - if world_db["FAVOR_STAGE"] >= 3 and \ - live_type == world_db["ANIMAL_0"]: - world_db["GOD_FAVOR"] += 3000 - log("CONGRATULATIONS! The " - + world_db["ThingTypes"][live_type]["TT_NAME"] - + " species has died out. The Island God is pleased.") - else: - id = id_setter(-1, "Things") - world_db["Things"][id] = new_Thing(live_type, - world_db["altar"]) - log("The " - + world_db["ThingTypes"][live_type]["TT_NAME"] - + " species has temporarily died out. " - + "One new-born is spawned at the altar.") - return world_db["ThingTypes"][t["T_TYPE"]]["TT_LIFEPOINTS"] - return 0 +def actor_use_attempts_hook(t, ty): + if ty == world_db["SLIPPERS"]: + if t == world_db["Things"][0]: + log("You use the " + world_db["ThingTypes"][ty]["TT_NAME"] + ". " \ + "It glows in wondrous colors, and emits a sound as if from a d" + "ying cat. The Island God laughs.") + t["T_LIFEPOINTS"] = 1 + from server.config.misc import decrement_lifepoints + decrement_lifepoints(t) + elif (world_db["ThingTypes"][ty]["TT_TOOL"] == "carpentry"): + pos = t["T_POSY"] * world_db["MAP_LENGTH"] + t["T_POSX"] + if (world_db["MAP"][pos] == ord("X") + or world_db["MAP"][pos] == ord("|")): + return + for t_id in [t_id for t_id in world_db["Things"] + if not world_db["Things"][t_id] == t + if not world_db["Things"][t_id]["carried"] + if world_db["Things"][t_id]["T_POSY"] == t["T_POSY"] + if world_db["Things"][t_id]["T_POSX"] == t["T_POSX"]]: + return + wood_id = None + for t_id in t["T_CARRIES"]: + type_material = world_db["Things"][t_id]["T_TYPE"] + if (world_db["ThingTypes"][type_material]["TT_TOOL"] == "wood"): + wood_id = t_id + break + if wood_id != None: + t["T_CARRIES"].remove(wood_id) + del world_db["Things"][wood_id] + world_db["MAP"][pos] = ord("|") + log("With your " + world_db["ThingTypes"][ty]["TT_NAME"] + " you" \ + " build a WOODEN BARRIER from your " + + world_db["ThingTypes"][type_material]["TT_NAME"] + ".") + elif world_db["ThingTypes"][ty]["TT_TOOL"] == "fertilizer": + pos = t["T_POSY"] * world_db["MAP_LENGTH"] + t["T_POSX"] + if world_db["MAP"][pos] == ord("."): + log("You create SOIL.") + world_db["MAP"][pos] = ord(":") def actor_move(t): @@ -284,7 +211,7 @@ def actor_move(t): altar_msg_wait(100) elif world_db["FAVOR_STAGE"] == 1 and world_db["GOD_FAVOR"] >= 100: world_db["FAVOR_STAGE"] = 2 - log(altar_msg_2) + log(altar_msg_1) id = id_setter(-1, "Things") world_db["Things"][id] = new_Thing(world_db["PLANT_1"], world_db["altar"]) @@ -324,235 +251,150 @@ def actor_move(t): world_db["Things"][id] = new_Thing(world_db["SLIPPERS"], world_db["altar"]) - from server.config.world_data import symbols_passable - from server.build_fov_map import build_fov_map - from server.config.misc import decrement_lifepoints_func - from server.new_thing import new_Thing - global mv_yx_in_dir_legal - passable = False - move_result = mv_yx_in_dir_legal(chr(t["T_ARGUMENT"]), - t["T_POSY"], t["T_POSX"]) - if 1 == move_result[0]: - pos = (move_result[1] * world_db["MAP_LENGTH"]) + move_result[2] - hitted = [id for id in world_db["Things"] - if world_db["Things"][id] != t - if world_db["Things"][id]["T_LIFEPOINTS"] - if world_db["Things"][id]["T_POSY"] == move_result[1] - if world_db["Things"][id]["T_POSX"] == move_result[2]] - if len(hitted): - hit_id = hitted[0] - hitted_type = world_db["Things"][hit_id]["T_TYPE"] - if t == world_db["Things"][0]: - hitted_name = world_db["ThingTypes"][hitted_type]["TT_NAME"] - log("You WOUND " + hitted_name + ".") + from server.actions import actor_move + test = actor_move(t) + if test != None: + if 2 == len(test): + if test[0] > 0: + if world_db["FAVOR_STAGE"] >= 3 and \ + test[1] == world_db["ANIMAL_0"]: + world_db["GOD_FAVOR"] += 125 + elif t == world_db["Things"][0]: + world_db["GOD_FAVOR"] -= 2 * test[1] + elif t == world_db["Things"][0]: world_db["GOD_FAVOR"] -= 1 - elif 0 == hit_id: - hitter_name = world_db["ThingTypes"][t["T_TYPE"]]["TT_NAME"] - log(hitter_name +" WOUNDS you.") - test = decrement_lifepoints_func(world_db["Things"][hit_id]) - if test and world_db["FAVOR_STAGE"] >= 3 and \ - hitted_type == world_db["ANIMAL_0"]: - world_db["GOD_FAVOR"] += 125 - elif test and t == world_db["Things"][0]: - world_db["GOD_FAVOR"] -= 2 * test - return - if (ord("X") == world_db["MAP"][pos] - or ord("|") == world_db["MAP"][pos]): - for id in t["T_CARRIES"]: - type = world_db["Things"][id]["T_TYPE"] - if world_db["ThingTypes"][type]["TT_TOOL"] == "axe": - axe_name = world_db["ThingTypes"][type]["TT_NAME"] + elif 3 == len(test): + if (t == world_db["Things"][0] and + test[1] == world_db["altar"][0] and + test[2] == world_db["altar"][1]): + enter_altar() + +def actor_move_attempts_hook(t, move_result, pos): + if (ord("X") == world_db["MAP"][pos] or ord("|") == world_db["MAP"][pos]): + for tid in t["T_CARRIES"]: + ty = world_db["Things"][tid]["T_TYPE"] + if world_db["ThingTypes"][ty]["TT_TOOL"] == "axe": + axe_name = world_db["ThingTypes"][ty]["TT_NAME"] + if t == world_db["Things"][0]: + log("With your " + axe_name + ", you chop!") + if ord("X") == world_db["MAP"][pos]: + world_db["GOD_FAVOR"] -= 1 + chop_power = world_db["ThingTypes"][ty]["TT_TOOLPOWER"] + case_X = world_db["MAP"][pos] == ord("X") + if (chop_power > 0 and + ((case_X and 0 == int(rand.next() / chop_power)) + or (not case_X and + 0 == int(rand.next() / (3 * chop_power))))): if t == world_db["Things"][0]: - log("With your " + axe_name + ", you chop!") + log("You chop it DOWN.") if ord("X") == world_db["MAP"][pos]: - world_db["GOD_FAVOR"] -= 1 - chop_power = world_db["ThingTypes"][type]["TT_TOOLPOWER"] - - case_X = world_db["MAP"][pos] == ord("X") - if (chop_power > 0 - and ((case_X and - 0 == int(rand.next() / chop_power)) - or (not case_X and - 0 == int(rand.next() / (3 * chop_power))))): - if t == world_db["Things"][0]: - log("You chop it DOWN.") - if ord("X") == world_db["MAP"][pos]: - world_db["GOD_FAVOR"] -= 10 - world_db["MAP"][pos] = ord(".") - i = 3 if case_X else 1 - for i in range(i): - id = id_setter(-1, "Things") - world_db["Things"][id] = \ - new_Thing(world_db["LUMBER"], - (move_result[1], move_result[2])) - build_fov_map(t) - return - passable = chr(world_db["MAP"][pos]) in symbols_passable - global directions_db - dir = [dir for dir in directions_db - if directions_db[dir] == chr(t["T_ARGUMENT"])][0] - if passable: - t["T_POSY"] = move_result[1] - t["T_POSX"] = move_result[2] - for id in t["T_CARRIES"]: - world_db["Things"][id]["T_POSY"] = move_result[1] - world_db["Things"][id]["T_POSX"] = move_result[2] - build_fov_map(t) - if t == world_db["Things"][0]: - log("You MOVE " + dir + ".") - if (move_result[1] == world_db["altar"][0] and - move_result[2] == world_db["altar"][1]): - enter_altar() + world_db["GOD_FAVOR"] -= 10 + world_db["MAP"][pos] = ord(".") + i = 3 if case_X else 1 + from server.new_thing import new_Thing + for i in range(i): + tid = id_setter(-1, "Things") + world_db["Things"][tid] = new_Thing(world_db["LUMBER"], + (move_result[1], move_result[2])) + build_fov_map(t) + return True + return False -def command_ttid(id_string): - 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_STORAGE": 0, - "TT_SYMBOL": "?", - "TT_CORPSE_ID": id, - "TT_TOOL": "" - } - -def command_worldactive(worldactive_string): - val = integer_test(worldactive_string, 0, 1) - if None != val: - if 0 != world_db["WORLD_ACTIVE"]: - if 0 == val: - set_world_inactive() - else: - print("World already active.") - elif 0 == world_db["WORLD_ACTIVE"]: - for ThingAction in world_db["ThingActions"]: - if "wait" == world_db["ThingActions"][ThingAction]["TA_NAME"]: - break - else: - print("Ignored: No wait action defined for world to activate.") - return - for Thing in world_db["Things"]: - if 0 == Thing: - break - else: - print("Ignored: No player defined for world to activate.") - return - if world_db["MAP"]: - pos = world_db["MAP"].find(b'_') - if pos > 0: - y = int(pos / world_db["MAP_LENGTH"]) - x = pos % world_db["MAP_LENGTH"] - world_db["altar"] = (y, x) - else: - print("Ignored: No altar defined for world to activate.") - return +def decrement_lifepoints(t): + from server.decrement_lifepoints import decrement_lifepoints + live_tid = t["T_TYPE"] + test = decrement_lifepoints(t) + if test > 0 and t != world_db["Things"][0]: + n_species = len([tid for tid in world_db["Things"] + if world_db["Things"][tid]["T_TYPE"] == live_tid]) + if 0 == n_species: + from server.new_thing import new_Thing + if world_db["FAVOR_STAGE"] >= 3 and \ + live_tid == world_db["ANIMAL_0"]: + world_db["GOD_FAVOR"] += 3000 + log("CONGRATULATIONS! The " + + world_db["ThingTypes"][live_tid]["TT_NAME"] + + " species has died out. The Island God is pleased.") else: - print("Ignored: No map defined for world to activate.") - return - for name in world_db["specials"]: - if world_db[name] not in world_db["ThingTypes"]: - print("Ignored: Not all specials set for world to " - "activate.") - return - 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 - -def play_move(str_arg): - if action_exists("move"): - 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]) - global mv_yx_in_dir_legal - move_result = mv_yx_in_dir_legal(chr(dir), 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 - if (ord("X") == world_db["MAP"][pos] - or ord("|") == world_db["MAP"][pos]): - carries_axe = False - for id in t["T_CARRIES"]: - type = world_db["Things"][id]["T_TYPE"] - if world_db["ThingTypes"][type]["TT_TOOL"] == "axe": - world_db["Things"][0]["T_ARGUMENT"] = dir - set_command("move") - return - if chr(world_db["MAP"][pos]) in symbols_passable: - world_db["Things"][0]["T_ARGUMENT"] = dir + tid = id_setter(-1, "Things") + world_db["Things"][tid] = new_Thing(live_tid, + world_db["altar"]) + log("The " + world_db["ThingTypes"][live_tid]["TT_NAME"] + " s" + "pecies has temporarily died out. One new-born is spawned " + "at the altar.") + return test + +def command_worldactive_test_hook(): + pos = world_db["MAP"].find(b'_') + if pos > 0: + y = int(pos / world_db["MAP_LENGTH"]) + x = pos % world_db["MAP_LENGTH"] + world_db["altar"] = (y, x) + else: + print("Ignored: No altar defined for world to activate.") + return False + for name in world_db["specials"]: + if world_db[name] not in world_db["ThingTypes"]: + print("Ignored: Not all specials set for world to activate.") + return False + return True + +def play_move_attempt_hook(t, direction, pos): + if (ord("X") == world_db["MAP"][pos] or ord("|") == world_db["MAP"][pos]): + carries_axe = False + for tid in t["T_CARRIES"]: + ty = world_db["Things"][tid]["T_TYPE"] + if world_db["ThingTypes"][ty]["TT_TOOL"] == "axe": + world_db["Things"][0]["T_ARGUMENT"] = direction set_command("move") - return - log("You CAN'T move there.") - -def play_use(str_arg): - if action_exists("use"): - 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 (world_db["ThingTypes"][type]["TT_TOOL"] == "axe" - and t == world_db["Things"][0]): - log("To use this item for chopping, move towards a tree " - "while carrying it in your inventory.") - return - elif (world_db["ThingTypes"][type]["TT_TOOL"] == "carpentry"): - pos = t["T_POSY"] * world_db["MAP_LENGTH"] + t["T_POSX"] - if (world_db["MAP"][pos] == ord("X") - or world_db["MAP"][pos] == ord("|")): - log("CAN'T build when standing on barrier.") - return - for id in [id for id in world_db["Things"] - if not world_db["Things"][id] == t - 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"]]: - log("CAN'T build when standing objects.") - return - wood_id = None - for id in t["T_CARRIES"]: - type_material = world_db["Things"][id]["T_TYPE"] - if (world_db["ThingTypes"][type_material]["TT_TOOL"] - == "wood"): - wood_id = id - break - if wood_id == None: - log("You CAN'T use a " - + world_db["ThingTypes"][type]["TT_NAME"] - + " without some wood in your inventory.") - return - elif world_db["ThingTypes"][type]["TT_TOOL"] == "fertilizer": - pos = t["T_POSY"] * world_db["MAP_LENGTH"] + t["T_POSX"] - if not world_db["MAP"][pos] == ord("."): - log("Can only make soil out of NON-SOIL earth.") - return - elif world_db["ThingTypes"][type]["TT_TOOL"] == "wood": - log("To use wood, you NEED a carpentry tool.") - return - elif type != world_db["SLIPPERS"] and not \ - world_db["ThingTypes"][type]["TT_TOOL"] == "food": - log("You CAN'T consume this thing.") - return - world_db["Things"][0]["T_ARGUMENT"] = val - set_command("use") - else: - print("Illegal inventory index.") + return True + return False + +def play_use_attempt_hook(t, tt): + pos = t["T_POSY"] * world_db["MAP_LENGTH"] + t["T_POSX"] + if tt["TT_TOOL"] == "axe": + log("To use this item for chopping, MOVE towards a tree while carrying" + " it in your inventory.") + return False + elif tt["TT_TOOL"] == "carpentry": + if (world_db["MAP"][pos] == ord("X") + or world_db["MAP"][pos] == ord("|")): + log("CAN'T build when standing on barrier.") + return False + for tid in [tid for tid in world_db["Things"] + if not world_db["Things"][tid] == t + if not world_db["Things"][tid]["carried"] + if world_db["Things"][tid]["T_POSY"] == t["T_POSY"] + if world_db["Things"][tid]["T_POSX"] == t["T_POSX"]]: + log("CAN'T build when standing objects.") + return False + wood_id = None + for tid in t["T_CARRIES"]: + type_material = world_db["Things"][tid]["T_TYPE"] + if world_db["ThingTypes"][type_material]["TT_TOOL"] == "wood": + wood_id = tid + break + if wood_id == None: + log("You CAN'T use a " + tt["TT_NAME"] + + " without some wood in your inventory.") + return False + return True + elif tt["TT_TOOL"] == "fertilizer": + if not world_db["MAP"][pos] == ord("."): + log("Can only make soil out of NON-SOIL earth.") + return False + return True + elif tt["TT_TOOL"] == "wood": + log("To use wood, you NEED a carpentry tool.") + return False + elif tt == world_db["ThingTypes"][world_db["SLIPPERS"]]: + return True + +def play_pickup_attempt_hook(t): + if len(t["T_CARRIES"]) >= world_db["ThingTypes"][t["T_TYPE"]]["TT_STORAGE"]: + log("CAN'T pick up: No storage room to carry anything more.") + return False + return True def specialtypesetter(name): def helper(str_int): @@ -629,22 +471,6 @@ def calc_effort(thing_action, thing): effort = 1 if effort == 0 else effort return effort -def play_pickup(): - """Try "pickup" as player's T_COMMAND".""" - if action_exists("pickup"): - 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"]] - if not len(ids): - log("NOTHING to pick up.") - elif len(t["T_CARRIES"]) >= world_db["ThingTypes"][t["T_TYPE"]] \ - ["TT_STORAGE"]: - log("CAN'T pick up: No storage room to carry anything more.") - else: - set_command("pickup") - strong_write(io_db["file_out"], "PLUGIN PleaseTheIslandGod\n") def set_zero_if_undefined(key): @@ -668,23 +494,27 @@ io_db["worldstate_write_order"] += [[write_metamap_B, "func"]] import server.config.world_data server.config.world_data.symbols_passable += ":_" +server.config.world_data.thingprol_field_spreadable = thingprol_field_spreadable +server.config.world_data.thingprol_test_hook = thingprol_test +server.config.world_data.thingprol_post_create_hook = thingprol_post_create -from server.config.world_data import thing_defaults +from server.config.world_data import thing_defaults, thingtype_defaults thing_defaults["T_PLAYERDROP"] = 0 +thingtype_defaults["TT_STORAGE"] = 0 import server.config.actions server.config.actions.action_db["actor_move"] = actor_move server.config.actions.action_db["actor_pickup"] = actor_pickup server.config.actions.action_db["actor_drop"] = actor_drop -server.config.actions.action_db["actor_use"] = actor_use +server.config.actions.actor_pickup_test_hook = actor_pickup_test_hook +server.config.actions.actor_use_attempts_hook = actor_use_attempts_hook +server.config.actions.actor_move_attempts_hook = actor_move_attempts_hook from server.config.commands import commands_db -commands_db["TT_ID"] = (1, False, command_ttid) commands_db["GOD_FAVOR"] = (1, False, setter(None, "GOD_FAVOR", -32768, 32767)) commands_db["TT_STORAGE"] = (1, False, setter("ThingType", "TT_STORAGE", 0, 255)) commands_db["T_PLAYERDROP"] = (1, False, setter("Thing", "T_PLAYERDROP", 0, 1)) -commands_db["WORLD_ACTIVE"] = (1, False, command_worldactive) -commands_db["FAVOR_STAGE"] = (1, False, setter(None, "FAVOR_STAGE", 0, 1)) +commands_db["FAVOR_STAGE"] = (1, False, setter(None, "FAVOR_STAGE", 0, 255)) commands_db["SLIPPERS"] = (1, False, specialtypesetter("SLIPPERS")) commands_db["TOOL_0"] = (1, False, specialtypesetter("TOOL_0")) commands_db["TOOL_1"] = (1, False, specialtypesetter("TOOL_1")) @@ -694,26 +524,22 @@ commands_db["PLANT_0"] = (1, False, specialtypesetter("PLANT_0")) commands_db["PLANT_1"] = (1, False, specialtypesetter("PLANT_1")) commands_db["LUMBER"] = (1, False, specialtypesetter("LUMBER")) commands_db["EMPATHY"] = (1, False, setter(None, "EMPATHY", 0, 1)) -commands_db["use"] = (1, False, play_use) -commands_db["move"] = (1, False, play_move) -commands_db["pickup"] = (0, False, play_pickup) +import server.config.commands +server.config.commands.command_worldactive_test_hook = \ + command_worldactive_test_hook +server.config.commands.play_move_attempt_hook = play_move_attempt_hook +server.config.commands.play_use_attempt_hook = play_use_attempt_hook +server.config.commands.play_pickup_attempt_hook = play_pickup_attempt_hook import server.config.misc -server.config.misc.make_map_func = make_map -server.config.misc.decrement_lifepoints_func = decrement_lifepoints -server.config.misc.calc_effort_func = calc_effort +server.config.misc.make_map = make_map +server.config.misc.decrement_lifepoints = decrement_lifepoints +server.config.misc.calc_effort = calc_effort import server.config.make_world_helpers -server.config.make_world_helpers.pos_test_func = pos_test -server.config.make_world_helpers.world_makable_func = world_makable -server.config.make_world_helpers.make_map_func = make_map - -import server.config.thingproliferation -server.config.thingproliferation.field_spreadable = field_spreadable -server.config.thingproliferation.thingprol_plugin_conditions = \ - thingprol_plugin_conditions -server.config.thingproliferation.thingprol_plugin_post_create_hook = \ - thingprol_plugin_post_create_hook +server.config.make_world_helpers.pos_test = pos_test +server.config.make_world_helpers.world_makable = world_makable +server.config.make_world_helpers.make_map = make_map import server.config.ai -server.config.ai.ai_hook_pickup = ai_hook_pickup_test +server.config.ai.ai_hook_pickup_test = ai_hook_pickup_test