X-Git-Url: https://plomlompom.com/repos/foo.html?a=blobdiff_plain;f=roguelike-server;h=3f0965e335d6ed324dcdfeae3e00a5f0800e2e86;hb=5f49de1262f21edd1911fe1df8ccb214acfa208c;hp=0bb69884d40f31adbd73d16e23efe89c71e0cea4;hpb=7417e7083aef8ecdc22fd28b2a16630c8aca30d8;p=plomrogue diff --git a/roguelike-server b/roguelike-server index 0bb6988..3f0965e 100755 --- a/roguelike-server +++ b/roguelike-server @@ -145,7 +145,7 @@ def obey(command, prefix, replay=False, do_record=False): commands_db[tokens[0]][2](*tokens[1:]) if do_record: io_db["record_chunk"] += command + "\n" - if time.time() > io_db["save_wait"] + 15: + if time.time() > io_db["save_wait"] + 300: atomic_write(io_db["path_record"], io_db["record_chunk"], do_append=True) if world_db["WORLD_ACTIVE"]: @@ -327,9 +327,8 @@ def try_worldstate_update(): type_id = world_db["Things"][id]["T_TYPE"] name = world_db["ThingTypes"][type_id]["TT_NAME"] inventory = inventory + name + "\n" - # 7DRL additions: GOD_MOOD, GOD_FAVOR + # 7DRL additions: GOD_FAVOR string = str(world_db["TURN"]) + "\n" + \ - str(world_db["GOD_MOOD"]) + "\n" + \ str(world_db["GOD_FAVOR"]) + "\n" + \ str(world_db["Things"][0]["T_LIFEPOINTS"]) + "\n" + \ str(world_db["Things"][0]["T_SATIATION"]) + "\n" + \ @@ -576,30 +575,49 @@ def update_map_memory(t, age_map=True): fovmap = c_pointer_to_bytearray(t["fovmap"]) libpr.age_some_memdepthmap_on_nonfov_cells(memdepthmap, fovmap) + def update_mem_and_memdepthmap_via_fovmap(): + # OUTSOURCED FOR PERFORMANCE REASONS TO libplomrogue.so: + # for pos in [pos for pos in range(world_db["MAP_LENGTH"] ** 2) + # if ord_v == t["fovmap"][pos]]: + # t["T_MEMDEPTHMAP"][pos] = ord_0 + # t["T_MEMMAP"][pos] = world_db["MAP"][pos] + memdepthmap = c_pointer_to_bytearray(t["T_MEMDEPTHMAP"]) + memmap = c_pointer_to_bytearray(t["T_MEMMAP"]) + fovmap = c_pointer_to_bytearray(t["fovmap"]) + map = c_pointer_to_bytearray(world_db["MAP"]) + libpr.update_mem_and_memdepthmap_via_fovmap(map, fovmap, memdepthmap, + memmap) + if not t["T_MEMMAP"]: t["T_MEMMAP"] = bytearray(b' ' * (world_db["MAP_LENGTH"] ** 2)) if not t["T_MEMDEPTHMAP"]: t["T_MEMDEPTHMAP"] = bytearray(b' ' * (world_db["MAP_LENGTH"] ** 2)) - ord_v = ord("v") - ord_0 = ord("0") - ord_space = ord(" ") - for pos in [pos for pos in range(world_db["MAP_LENGTH"] ** 2) - if ord_v == t["fovmap"][pos]]: - t["T_MEMDEPTHMAP"][pos] = ord_0 - t["T_MEMMAP"][pos] = world_db["MAP"][pos] + update_mem_and_memdepthmap_via_fovmap() if age_map: age_some_memdepthmap_on_nonfov_cells() + ord_v = ord("v") t["T_MEMTHING"] = [mt for mt in t["T_MEMTHING"] if ord_v != t["fovmap"][(mt[1] * world_db["MAP_LENGTH"]) + mt[2]]] - for id in [id for id in world_db["Things"] - if not world_db["Things"][id]["carried"]]: - type = world_db["Things"][id]["T_TYPE"] - if not world_db["ThingTypes"][type]["TT_LIFEPOINTS"]: - y = world_db["Things"][id]["T_POSY"] - x = world_db["Things"][id]["T_POSX"] - if ord_v == t["fovmap"][(y * world_db["MAP_LENGTH"]) + x]: - t["T_MEMTHING"].append((type, y, x)) + maplength = world_db["MAP_LENGTH"] + eat_cost = eat_vs_hunger_threshold(t["T_TYPE"]) # # + [t["T_MEMTHING"].append((world_db["Things"][id]["T_TYPE"], + world_db["Things"][id]["T_POSY"], + world_db["Things"][id]["T_POSX"])) + for id in world_db["Things"] + if not world_db["Things"][id]["carried"] + if not world_db["ThingTypes"][world_db["Things"][id]["T_TYPE"]] + ["TT_LIFEPOINTS"] + if (t == world_db["Things"][0] or + (world_db["ThingTypes"][world_db["Things"][id]["T_TYPE"]] + ["TT_TOOL"] == "food" + and + world_db["ThingTypes"][world_db["Things"][id]["T_TYPE"]] + ["TT_TOOLPOWER"] > eat_cost + ) + ) + if ord_v == t["fovmap"][(world_db["Things"][id]["T_POSY"] * maplength) + + world_db["Things"][id]["T_POSX"]]] def set_world_inactive(): @@ -680,13 +698,9 @@ def decrement_lifepoints(t): still display memory data. On non-player things, erase fovmap and memory. Dying actors drop all their things. """ - # 7DRL: Also decrements God's mood; deaths heavily so. # 7DRL: Return 1 if death, else 0. t["T_LIFEPOINTS"] -= 1 - world_db["GOD_MOOD"] -= 1 # # if 0 == t["T_LIFEPOINTS"]: - sadness = world_db["ThingTypes"][t["T_TYPE"]]["TT_LIFEPOINTS"] # # - world_db["GOD_MOOD"] -= sadness # # for id in t["T_CARRIES"]: t["T_CARRIES"].remove(id) world_db["Things"][id]["T_POSY"] = t["T_POSY"] @@ -702,30 +716,10 @@ def decrement_lifepoints(t): t["T_MEMMAP"] = False t["T_MEMDEPTHMAP"] = False t["T_MEMTHING"] = [] - return sadness # # + return world_db["ThingTypes"][t["T_TYPE"]]["TT_LIFEPOINTS"] # # return 0 # # -def add_gods_favor(i): # # - """"Add to GOD_FAVOR, multiplied with factor growing log. with GOD_MOOD.""" - def favor_multiplier(i): - x = 100 - threshold = math.e * x - mood = world_db["GOD_MOOD"] - if i > 0: - if mood > threshold: - i = i * math.log(mood / x) - elif -mood > threshold: - i = i / math.log(-mood / x) - elif i < 0: - if -mood > threshold: - i = i * math.log(-mood / x) - if mood > threshold: - i = i / math.log(mood / x) - return int(i) - world_db["GOD_FAVOR"] += favor_multiplier(i) - - def mv_yx_in_dir_legal(dir, y, x): """Wrapper around libpr.mv_yx_in_dir_legal to simplify its use.""" dir_c = dir.encode("ascii")[0] @@ -783,7 +777,7 @@ def enter_altar(): # # id = id_setter(-1, "Things") world_db["Things"][id] = new_Thing(world_db["PLANT_1"], world_db["altar"]) - add_gods_favor(-250) + world_db["GOD_FAVOR"] -= 250 elif world_db["GOD_FAVOR"] > 9000: world_db["FAVOR_STAGE"] = 9001 log("The Island God speaks to you: \"You have proven yourself worthy" @@ -827,13 +821,13 @@ def actor_move(t): hitted_type = world_db["Things"][hit_id]["T_TYPE"] hitted_name = world_db["ThingTypes"][hitted_type]["TT_NAME"] log("You wound " + hitted_name + ".") - add_gods_favor(-1) # # + 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(world_db["Things"][hit_id]) # #(test=) if test and t == world_db["Things"][0]: # # - add_gods_favor(-test) # # + world_db["GOD_FAVOR"] -test # # return if (ord("X") == world_db["MAP"][pos] # # or ord("|") == world_db["MAP"][pos]): # # @@ -848,7 +842,7 @@ def actor_move(t): if t == world_db["Things"][0]: # # log("With your " + axe_name + ", you chop!\n") # # if ord("X") == world_db["MAP"][pos]: # # - add_gods_favor(-1) # # + 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 # # @@ -859,7 +853,7 @@ def actor_move(t): if t == world_db["Things"][0]: # # log("You chop it down.") # # if world_db["MAP"][pos] == ord("X"): # # - add_gods_favor(-10) # # + world_db["GOD_FAVOR"] = -10 # # world_db["MAP"][pos] = ord(".") # # i = 3 if case_X else 1 # # for i in range(i): # # @@ -922,7 +916,7 @@ def actor_pick_up(t): and world_db["Things"][id]["T_PLAYERDROP"] # # and world_db["ThingTypes"][type]["TT_TOOL"] == "food"): # # score = world_db["ThingTypes"][type]["TT_TOOLPOWER"] / 32 # # - add_gods_favor(score) # # + world_db["GOD_FAVOR"] += score # # world_db["Things"][id]["T_PLAYERDROP"] = 0 # # t["T_CARRIES"].append(id) if t == world_db["Things"][0]: @@ -951,6 +945,7 @@ def actor_use(t): """Make t use (for now: consume) T_ARGUMENT-indexed Thing in inventory.""" # TODO: Handle case where T_ARGUMENT matches nothing. # 7DLR: Handle SLIPPERS-type Thing use. + # 7DRL: Player with fertilizer fertilizes if len(t["T_CARRIES"]): id = t["T_CARRIES"][t["T_ARGUMENT"]] type = world_db["Things"][id]["T_TYPE"] @@ -1003,6 +998,12 @@ def actor_use(t): log("You can't use a " # # + world_db["ThingTypes"][type_tool]["TT_NAME"] # # + " without some wood in your inventory.") # # + 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("."): + world_db["MAP"][pos] = ord(":") + else: + log("Can only fertilize on unfertilized earth.") elif world_db["ThingTypes"][type]["TT_TOOL"] == "food": t["T_CARRIES"].remove(id) del world_db["Things"][id] @@ -1043,11 +1044,6 @@ def thingproliferation(t, prol_map): id = id_setter(-1, "Things") newT = new_Thing(t["T_TYPE"], (candidates[i][0], candidates[i][1])) world_db["Things"][id] = newT - animacy = world_db["ThingTypes"][t["T_TYPE"]]["TT_LIFEPOINTS"] # # - if animacy: # # - world_db["GOD_MOOD"] += animacy # # - else: # # - world_db["GOD_MOOD"] += 1 # # if (world_db["FAVOR_STAGE"] > 0 # # and t["T_TYPE"] == world_db["PLANT_0"]): # # world_db["GOD_FAVOR"] += 5 # # @@ -1066,8 +1062,6 @@ def try_healing(t): testval = int(abs(t["T_SATIATION"]) / wait_divider) if (testval <= 1 or 1 == (rand.next() % testval)): t["T_LIFEPOINTS"] += 1 - if t != world_db["Things"][0]: # # - world_db["GOD_MOOD"] += 1 # # if t == world_db["Things"][0]: log("You heal.") @@ -1135,11 +1129,11 @@ def get_dir_to_target(t, filter): raise RuntimeError("No score map allocated for get_map_score().") return result - def animate_in_fov(Thing): - if Thing["carried"] or Thing == t or not Thing["T_LIFEPOINTS"]: + def animate_in_fov(Thing, maplength): # maplength needed for optimization? + if not Thing["T_LIFEPOINTS"] or Thing["carried"] or Thing == t: return False - pos = Thing["T_POSY"] * world_db["MAP_LENGTH"] + Thing["T_POSX"] - if ord("v") == t["fovmap"][pos]: + pos = Thing["T_POSY"] * maplength + Thing["T_POSX"] + if 118 == t["fovmap"][pos]: # optimization: 118 = ord("v") return True def good_attack_target(v): @@ -1164,22 +1158,27 @@ def get_dir_to_target(t, filter): return False def seeing_thing(): + maplength = world_db["MAP_LENGTH"] if t["fovmap"] and "a" == filter: for id in world_db["Things"]: - if animate_in_fov(world_db["Things"][id]): - return good_attack_target(world_db["Things"][id]) + if animate_in_fov(world_db["Things"][id], maplength): + if good_attack_target(world_db["Things"][id]): + return True elif t["fovmap"] and "f" == filter: for id in world_db["Things"]: - if animate_in_fov(world_db["Things"][id]): - return good_flee_target(world_db["Things"][id]) + if animate_in_fov(world_db["Things"][id], maplength): + if good_flee_target(world_db["Things"][id]): + return True elif t["T_MEMMAP"] and "c" == filter: eat_cost = eat_vs_hunger_threshold(t["T_TYPE"]) + ord_blank = ord(" ") for mt in t["T_MEMTHING"]: - if ' ' != chr(t["T_MEMMAP"][(mt[1] * world_db["MAP_LENGTH"]) - + mt[2]]) \ - and world_db["ThingTypes"][mt[0]]["TT_TOOL"] == "food" \ - and world_db["ThingTypes"][mt[0]]["TT_TOOLPOWER"] \ - > eat_cost: + if ord_blank != t["T_MEMMAP"][(mt[1] * world_db["MAP_LENGTH"]) + + mt[2]] and \ + (t != world_db["Things"][0] or \ + (world_db["ThingTypes"][mt[0]]["TT_TOOL"] == "food" + and world_db["ThingTypes"][mt[0]]["TT_TOOLPOWER"] + > eat_cost)): return True return False @@ -1199,41 +1198,39 @@ def get_dir_to_target(t, filter): test = libpr.init_score_map() if test: raise RuntimeError("Malloc error in init_score_map().") - ord_v = ord("v") - ord_blank = ord(" ") set_cells_passable_on_memmap_to_65534_on_scoremap() + maplength = world_db["MAP_LENGTH"] if "a" == filter: - for id in world_db["Things"]: - if animate_in_fov(world_db["Things"][id]) \ - and good_attack_target(world_db["Things"][id]): - set_map_score_at_thingpos(id, 0) + [set_map_score_at_thingpos(id, 0) + for id in world_db["Things"] + if animate_in_fov(world_db["Things"][id], maplength) + if good_attack_target(world_db["Things"][id])] elif "f" == filter: - for id in world_db["Things"]: - if animate_in_fov(world_db["Things"][id]) \ - and good_flee_target(world_db["Things"][id]): - set_map_score_at_thingpos(id, 0) + [set_map_score_at_thingpos(id, 0) + for id in world_db["Things"] + if animate_in_fov(world_db["Things"][id], maplength) + if good_flee_target(world_db["Things"][id])] elif "c" == filter: eat_cost = eat_vs_hunger_threshold(t["T_TYPE"]) - for mt in [mt for mt in t["T_MEMTHING"] - if ord_blank != t["T_MEMMAP"][mt[1] - * world_db["MAP_LENGTH"] - + mt[2]] - if world_db["ThingTypes"][mt[0]]["TT_TOOL"] == "food" - if world_db["ThingTypes"][mt[0]]["TT_TOOLPOWER"] - > eat_cost]: - set_map_score(mt[1] * world_db["MAP_LENGTH"] + mt[2], 0) + ord_blank = ord(" ") + [set_map_score(mt[1] * maplength + mt[2], 0) + for mt in t["T_MEMTHING"] + if ord_blank != t["T_MEMMAP"][mt[1] * maplength + mt[2]] + if t != world_db["Things"][0] or + (world_db["ThingTypes"][mt[0]]["TT_TOOL"] == "food" and + world_db["ThingTypes"][mt[0]]["TT_TOOLPOWER"] > eat_cost)] elif "s" == filter: zero_score_map_where_char_on_memdepthmap(mem_depth_c[0]) - if "a" != filter: - for id in world_db["Things"]: - if animate_in_fov(world_db["Things"][id]): - if "f" == filter: - pos = world_db["Things"][id]["T_POSY"] \ - * world_db["MAP_LENGTH"] \ - + world_db["Things"][id]["T_POSX"] - if 0 == get_map_score(pos): - continue - set_map_score_at_thingpos(id, 65535) + if "f" == filter: + [set_map_score_at_thingpos(id, 65535) + for id in world_db["Things"] + if animate_in_fov(world_db["Things"][id], maplength) + if get_map_score(world_db["Things"][id]["T_POSY"] * maplength + + world_db["Things"][id]["T_POSX"])] + elif "a" != filter: + [set_map_score_at_thingpos(id, 65535) + for id in world_db["Things"] + if animate_in_fov(world_db["Things"][id], maplength)] def rand_target_dir(neighbors, cmp, dirs): candidates = [] @@ -1345,48 +1342,33 @@ def get_inventory_slot_to_consume(t): def ai(t): """Determine next command/argment for actor t via AI algorithms.""" # 7DRL add: Don't pick up or search things when inventory is full. - if t == world_db["Things"][0]: - log("%AI------") t["T_COMMAND"] = [id for id in world_db["ThingActions"] if world_db["ThingActions"][id]["TA_NAME"] == "wait"][0] if get_dir_to_target(t, "f"): - if t == world_db["Things"][0]: - log("%FLEE") return sel = get_inventory_slot_to_consume(t) if -1 != sel: - if t == world_db["Things"][0]: - log("%EAT") t["T_COMMAND"] = [id for id in world_db["ThingActions"] if world_db["ThingActions"][id]["TA_NAME"] == "use"][0] t["T_ARGUMENT"] = sel elif standing_on_food(t): - if t == world_db["Things"][0]: - log("%STANDINGON") if (len(t["T_CARRIES"]) < # # world_db["ThingTypes"][t["T_TYPE"]]["TT_STORAGE"]): # # - if t == world_db["Things"][0]: - log("%(pickingup)") t["T_COMMAND"] = [id for id in world_db["ThingActions"] if world_db["ThingActions"][id]["TA_NAME"] == "pick_up"][0] else: - if t == world_db["Things"][0]: - log("%AIMING_FOR_FOOD") going_to_known_food_spot = get_dir_to_target(t, "c") if not going_to_known_food_spot: - if t == world_db["Things"][0]: - log("%AIMING_FOR_WALKING_FOOD") aiming_for_walking_food = get_dir_to_target(t, "a") if not aiming_for_walking_food: - if t == world_db["Things"][0]: - log("%SEARCHING") get_dir_to_target(t, "s") def turn_over(): """Run game world and its inhabitants until new player input expected.""" + # 7DRL: effort of move action is TA_EFFORT / sqrt(TT_LIFEPOINTS) id = 0 whilebreaker = False while world_db["Things"][0]["T_LIFEPOINTS"]: @@ -1415,7 +1397,14 @@ def turn_over(): taid = [a for a in world_db["ThingActions"] if a == Thing["T_COMMAND"]][0] ThingAction = world_db["ThingActions"][taid] - if Thing["T_PROGRESS"] == ThingAction["TA_EFFORT"]: + #if Thing["T_PROGRESS"] == ThingAction["TA_EFFORT"]: + effort = ThingAction["TA_EFFORT"] # # + if ThingAction["TA_NAME"] == "move": # # + type = Thing["T_TYPE"] # # + max_hp = (world_db["ThingTypes"][type] # # + ["TT_LIFEPOINTS"]) # # + effort = int(effort / math.sqrt(max_hp)) # # + if Thing["T_PROGRESS"] == effort: # # eval("actor_" + ThingAction["TA_NAME"])(Thing) Thing["T_COMMAND"] = 0 Thing["T_PROGRESS"] = 0 @@ -2018,7 +2007,6 @@ commands_db = { "MAKE_WORLD": (1, False, command_makeworld), "SEED_RANDOMNESS": (1, False, command_seedrandomness), "TURN": (1, False, setter(None, "TURN", 0, 65535)), - "GOD_MOOD": (1, False, setter(None, "GOD_MOOD", -32768, 32767)), # # "GOD_FAVOR": (1, False, setter(None, "GOD_FAVOR", -32768, 32767)), # # "PLAYER_TYPE": (1, False, setter(None, "PLAYER_TYPE", 0)), "MAP_LENGTH": (1, False, command_maplength), @@ -2030,6 +2018,7 @@ commands_db = { "PLANT_1": (1, False, specialtypesetter("PLANT_1")), # # "LUMBER": (1, False, specialtypesetter("LUMBER")), # # "TOOL_0": (1, False, specialtypesetter("TOOL_0")), # # + "TOOL_1": (1, False, specialtypesetter("TOOL_1")), # # "EMPATHY": (1, False, setter(None, "EMPATHY", 0, 1)), # # "TA_ID": (1, False, command_taid), "TA_EFFORT": (1, False, setter("ThingAction", "TA_EFFORT", 0, 255)), @@ -2076,7 +2065,6 @@ world_db = { "MAP_LENGTH": 64, "PLAYER_TYPE": 0, "WORLD_ACTIVE": 0, - "GOD_MOOD": 0, # # "GOD_FAVOR": 0, # # "MAP": False, "FAVOR_STAGE": 0, # # @@ -2085,6 +2073,7 @@ world_db = { "PLANT_1": 0, # # "LUMBER": 0, # # "TOOL_0": 0, # # + "TOOL_1": 0, # # "EMPATHY": 1, # # "ThingActions": {}, "ThingTypes": {}, @@ -2093,7 +2082,7 @@ world_db = { # 7DRL-specific! """Special type settings.""" -specials = ["SLIPPERS", "PLANT_0", "PLANT_1", "LUMBER", "TOOL_0"] # # +specials = ["SLIPPERS", "PLANT_0", "PLANT_1", "LUMBER", "TOOL_0", "TOOL_1"] # # """Mapping of direction names to internal direction chars.""" directions_db = {"east": "d", "south-east": "c", "south-west": "x",