Add creature database layer

This commit is contained in:
Em (Ethan) Ruszanowski 2024-03-01 16:35:30 -05:00
parent 31ff9e346b
commit bd1c3732c2
Signed by: em
GPG key ID: C725D6E571252B96
2 changed files with 85 additions and 11 deletions

10
app.py
View file

@ -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')

View file

@ -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