Add mobreport.py

This commit is contained in:
Andrew Miner
2025-10-06 22:44:46 -06:00
parent 4637137152
commit 3d6f9800ec
17 changed files with 179 additions and 44 deletions
+15 -3
View File
@@ -67,8 +67,20 @@ def span(*altitudes):
if not altitudes: return ANYWHERE
result = Altitude("", ANYWHERE.top, ANYWHERE.bottom)
for altitude in altitudes:
result.bottom = min(result.bottom, altitude.bottom)
result.top = max(result.top, altitude.top)
bottom = OVERGROUND[-1].top
bottomAltitude = None
top = UNDERGROUND[-1].bottom
topAltitude = None
for altitude in altitudes:
if altitude.bottom < bottom:
bottom = altitude.bottom
bottomAltitude = altitude
if altitude.top > top:
top = altitude.top
topAltitude = altitude
result = Altitude(f"{bottomAltitude.name}-{topAltitude.name}", bottom, top)
return result
+1 -1
View File
@@ -13,6 +13,6 @@ def mergeRange():
# Tests ############################################################################################
def test_span(merged):
assert merged.name == "lowlands-uplands"
assert merged.bottom == A.LOWLANDS.bottom
assert merged.top == A.UPLANDS.top
+24
View File
@@ -31,6 +31,30 @@ class BiomeFilter:
self.required = required or []
self.prohibited = prohibited or []
def __str__(self) -> str:
required = []
for trait in self.required:
if isinstance(trait, BiomeTrait):
required.append(str(trait))
else:
required.append("(" +
", ".join([str(option) for option in trait]) +
")")
prohibited = []
for trait in self.prohibited:
prohibited.append(str(trait))
result = "".join([
"must:[",
", ".join(required),
"], not:[",
", ".join(prohibited),
"]"
])
return result
def __repr__(self) -> str:
return f"BiomeFilter([{repr(self.required)}], [{repr(self.prohibited)}])"
+16 -6
View File
@@ -5,7 +5,7 @@ class Group:
How many individuals are commonly present when encountering a creature.
"""
def __init__(self, name, smallest, largest):
def __init__(self, name:str, smallest:int, largest:int):
self.name = name
self.smallest = smallest
self.largest = largest
@@ -42,9 +42,19 @@ ALL = [SOLO, PAIR, FAMILY, TROUP, HERD]
def merge(*groups):
if not groups: return SOLO
result = Group(f"", HERD.largest, SOLO.smallest)
for group in groups:
result.smallest = min(result.smallest, group.smallest)
result.largest = max(result.largest, group.largest)
smallest = ALL[-1].largest
smallestGroup = None
return result
largest = ALL[0].smallest
largestGroup = None
for group in groups:
if group.smallest < smallest:
smallest = group.smallest
smallestGroup = group
if group.largest > largest:
largest = group.largest
largestGroup = group
return Group(f"{smallestGroup.name}-{largestGroup.name}", smallest, largest)
+18 -8
View File
@@ -1,16 +1,26 @@
from tungston.core.fauna.mob import Mob
from collections.abc import Iterator
from tungston.core.fauna.mobplacement import MobPlacement
# Class ############################################################################################
class MobCatalog:
def __init__(self, mobs):
self.mobs = mobs
def __init__(self, mobs:tuple[MobPlacement]):
self._mobs = {}
def findByName(self, name):
for mob in self.mobs:
if mob.name == name:
return mob
for mob in mobs:
self.add(mob)
return None
def add(self, placement:MobPlacement) -> "MobCatalog":
if placement.mob.name in self._mobs:
raise Exception("Catalog already has an entry for {mob.name}")
self._mobs[placement.mob.name] = placement
def all(self) -> Iterator[MobPlacement]:
for placement in self._mobs.values():
yield placement
def get(self, name:str) -> MobPlacement:
return self._mobs.get(name, None)
+1 -1
View File
@@ -30,7 +30,7 @@ def test_cowsInFields(placement):
"Placement{" +
"habitats: [" +
"Habitat{" +
"altitude: [anywhere <-64 to 320>], " +
"altitude: anywhere <-64 to 320>, " +
"biomeFilter: BiomeFilter([[Flora<field>, Heat<temperate>]], [[]]), " +
"seasons: [Season<spring>, Season<summer>, Season<autumn>, Season<winter>], " +
"group: solo<1 to 1>, " +
@@ -44,7 +44,7 @@ def test_repr(bifIron):
assert repr(bifIron) == (
"MetalDeposit<bifiron>{" +
"scarcity: Scarcity<common>, " +
"biomeFilter: BiomeFilter([[Flora<forest>]], [[]]), " +
"biomeFilter: must:[Flora: forest], not:[], " +
"inclusions: [" +
"Inclusion{mineral: iron, weight: 60}, " +
"Inclusion{mineral: quartz, weight: 40}" +
+8 -8
View File
@@ -22,7 +22,7 @@ class Habitat:
def __init__(
self,
altitudes:tuple[Altitude]|Altitude=[A.ANYWHERE],
altitude:Altitude=A.ANYWHERE,
biomeFilter:BiomeFilter=None,
seasons:tuple[Season]=E.ALL,
@@ -30,7 +30,7 @@ class Habitat:
location:Location=L.OUTSIDE,
scarcity:Scarcity=C.SPARSE,
):
self.altitudes = (altitudes,) if isinstance(altitudes, Altitude) else altitudes
self.altitude = altitude
self.biomeFilter = biomeFilter or BiomeFilter()
self.seasons = (seasons,) if isinstance(seasons, Season) else seasons
@@ -41,19 +41,19 @@ class Habitat:
self._source = None
def __str__(self) -> str:
return "".join(str(p) for p in [
self.altitude, "|",
return "".join([str(p) for p in [
", ".join(self.altitude), "|",
self.biomeFilter, "|",
self.seasons, "|",
", ".join([str(s) for s in self.seasons]), "|",
self.group, "|",
self.location, "|",
self.scarcity
])
]])
def __repr__(self) -> str:
return "".join([str(p) for p in [
"Habitat{",
"altitude: [", ", ".join([repr(a) for a in self.altitudes]), "], ",
"altitude: ", repr(self.altitude), ", ",
"biomeFilter: ", repr(self.biomeFilter), ", ",
"seasons: [", ", ".join([repr(s) for s in self.seasons]), "], ",
"group: ", repr(self.group), ", ",
@@ -64,7 +64,7 @@ class Habitat:
def derive(self, **kwargs):
kwargs = {
"altitudes": self.altitudes,
"altitude": self.altitude,
"biomeFilter": self.biomeFilter,
"seasons": self.seasons,
"group": self.group,
+1 -1
View File
@@ -35,7 +35,7 @@ def test_derive(derivedHabitats):
def test_repr(fields):
assert repr(fields) == (
"Habitat{" +
"altitude: [anywhere <-64 to 320>], " +
"altitude: anywhere <-64 to 320>, " +
"biomeFilter: BiomeFilter([[Flora<field>, Heat<temperate>]], [[]]), " +
"seasons: [Season<spring>, Season<summer>, Season<autumn>, Season<winter>], " +
"group: solo<1 to 1>, " +
+1 -1
View File
@@ -25,7 +25,7 @@ def test_repr(placement):
"Placement{" +
"habitats: [" +
"Habitat{" +
"altitude: [anywhere <-64 to 320>], " +
"altitude: anywhere <-64 to 320>, " +
"biomeFilter: BiomeFilter([[Flora<field>, Heat<temperate>]], [[]]), " +
"seasons: [Season<spring>, Season<summer>, Season<autumn>, Season<winter>], " +
"group: solo<1 to 1>, " +