From bd1c3732c223c771e9b774262377c7921ae64047 Mon Sep 17 00:00:00 2001 From: Ethan Ruszanowski Date: Fri, 1 Mar 2024 16:35:30 -0500 Subject: [PATCH] Add creature database layer --- app.py | 10 ++---- database/database.py | 86 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 85 insertions(+), 11 deletions(-) diff --git a/app.py b/app.py index 46456df..ef69a6f 100644 --- a/app.py +++ b/app.py @@ -30,13 +30,9 @@ def main(): st.write(run.moon) # Begin column layout - left_column, right_column = st.columns(2) - - with left_column: - st.markdown("### Outside") - - with right_column: - st.markdown("### Inside") + creatures = db.get_spawnable_inside_creature_ids(run.moon.moon_id) + for creature in creatures: + st.write(db.get_creature_by_id(creature)) st.markdown('## Scrap Lookup') diff --git a/database/database.py b/database/database.py index 663d58d..3517aea 100644 --- a/database/database.py +++ b/database/database.py @@ -2,6 +2,24 @@ import os import sqlite3 +class Creature: + def __init__(self, creature_id: int, creature_name: str, creature_nickname: str, health: int, power_level: int, + max_spawn: int, stunnable: int, stun_multiplier: float or None, door_open_speed: float or None, + hostile: int, creature_type: str, favorite_moon: str): + self.creature_id: int = creature_id + self.creature_name: str = creature_name + self.creature_nickname: str = creature_nickname + self.health: int = health + self.power_level: int = power_level + self.max_spawn: int = max_spawn + self.stunnable: bool = bool(stunnable) + self.stun_multiplier: float = stun_multiplier + self.door_open_speed: float or None = door_open_speed + self.hostile: bool = bool(hostile) + self.creature_type: str = creature_type + self.favorite_moon: str = favorite_moon + + class Moon: def __init__(self, moon_id: int, name: str, risk_level: str, cost: int, default_layout: str, map_size_multiplier: float, min_scrap: int, max_scrap: int, outside_max_power: int, @@ -20,8 +38,8 @@ class Moon: class Scrap: - def __init__(self, scrap_id: int, name: str, min_value: int, - max_value: int, weight: int, conductive: int, two_handed: int): + def __init__(self, scrap_id: int, name: str, min_value: int, max_value: int, weight: int, conductive: int, + two_handed: int): self.scrap_id: int = scrap_id self.name: str = name self.min_value: int = min_value @@ -43,6 +61,41 @@ def get_connection() -> sqlite3.Connection: return sqlite3.connect("./scouter.db") +def get_creature_by_id(creature_id: int) -> Creature or None: + with get_connection() as connection: + cursor = connection.cursor() + + query = """ + select c.creature_id, + c.creature_name, + c.creature_nickname, + c.health, + c.power_level, + c.max_spawn, + c.stunnable, + c.stun_multiplier, + c.door_open_speed, + c.hostile, + ct.type_name, + m.moon_name +from creature as c + join main.creature_type ct on c.creature_type_id = ct.creature_type_id + join main.moon m on c.favorite_moon_id = m.moon_id +where creature_id = ? +limit 1; +""" + + creature = cursor.execute( + query, + (creature_id,) + ).fetchone() + + if creature: + return Creature(*creature) + else: + return None + + def get_moon_id_by_name(moon_name: str) -> int | None: """Queries the database for a moon ID that matches the given name. @@ -79,8 +132,7 @@ def get_moon_list() -> list[str] | None: ).fetchall() if moon_names: - moon_names = [moon[0] for moon in moon_names] - return moon_names + return [moon[0] for moon in moon_names] else: return None @@ -191,3 +243,29 @@ limit 1; return Scrap(*scrap) else: return None + + +def get_spawnable_inside_creature_ids(moon_id: int) -> list[int] | None: + with get_connection() as connection: + cursor = connection.cursor() + + query = """ + select c.creature_id as Creature +from spawn_chance as s + join main.creature c on s.creature_id = c.creature_id + join main.moon m on m.moon_id = s.moon_id + join main.creature_type ct on ct.creature_type_id = c.creature_type_id +where s.moon_id like ? + and (ct.type_name = 'Inside' or 'Hybrid') + and s.spawn_chance > 0 +order by s.spawn_chance desc; +""" + creature_ids = cursor.execute( + query, + (moon_id,) + ).fetchall() + + if creature_ids: + return [creature_id[0] for creature_id in creature_ids] + else: + return None