Fine tune spawns across all biomes

This commit is contained in:
Andrew Miner
2025-10-28 23:23:06 -06:00
parent 5ccd48908a
commit e3e870377a
12 changed files with 438 additions and 191 deletions
+19 -11
View File
@@ -1,7 +1,10 @@
from mcpacker.model.modpack import ModPack
from mcpacker.model.geology.mineralspawn import MineralSpawn
from mcpacker.model.ecology.biome import Biome
from mcpacker.format.report.composer import ReportComposer
from mcpacker.model.altitude import Altitude
from mcpacker.model.ecology.biome import Biome
from mcpacker.model.fauna.mob import Mob
from mcpacker.model.flora.plant import Plant
from mcpacker.model.geology.mineralspawn import MineralSpawn
from mcpacker.model.modpack import ModPack
from pathlib import Path
import mcpacker.model.altitude as AL
@@ -41,34 +44,39 @@ class BiomeReport(ReportComposer):
def _composeFaunaSection(self, biome:Biome):
self.line().line("Fauna:").indent()
faunaLineCount = 0
faunaLines:list[tuple[Mob, Altitude]] = []
for mob in self.pack.world.mobs:
altitude = None
for spawn in self.pack.world.mobSpawns:
if spawn.mob != mob: continue
if not spawn.habitat.accepts(biome): continue
if spawn.ecotype.location == LO.CAVE: continue
altitude = AL.span(altitude or spawn.habitat.altitude, spawn.habitat.altitude)
if altitude != None:
self.line(f"{mob.name} @ {altitude}")
faunaLineCount += 1
faunaLines.append((mob, altitude))
if faunaLineCount == 0:
for line in sorted(faunaLines, reverse=True, key=lambda p: (p[1].bottom, p[1].top)):
self.line(f"{line[0]} @ {line[1]}")
if len(faunaLines) == 0:
self.line("<no fauna>")
self.outdent() # fauna
def _composeFloraSection(self, biome:Biome):
self.line().line("Flora:").indent()
floraLineCount = 0
floraLines:list[tuple[Plant, Altitude]] = []
for spawn in self.pack.world.plantSpawns:
if not spawn.habitat.accepts(biome): continue
self.line(f"{spawn.plant.name} @ {spawn.habitat.altitude}")
floraLineCount += 1
floraLines.append((spawn.plant, spawn.habitat.altitude))
if floraLineCount == 0:
for line in sorted(floraLines, reverse=True, key=lambda p: (p[1].bottom, p[1].top)):
self.line(f"{line[0]} @ {line[1]}")
if len(floraLines) == 0:
self.line("<no flora>")
self.outdent() # flora
+13 -6
View File
@@ -1,4 +1,5 @@
from mcpacker.format.report.composer import ReportComposer
from mcpacker.model.ecology.biomefilter import BiomeFilter
from mcpacker.model.ecology.biometrait import BiomeTrait
from mcpacker.model.modpack import ModPack
from pathlib import Path
@@ -10,17 +11,17 @@ class MobSpawnReport(ReportComposer):
def doCompose(self):
for mob in self.pack.world.mobs:
self.line(f"Mob: {mob.name}")
self.indent()
self.line(f"Mob: {mob.name}").indent()
needsDelimiter = False
habitat = None
for spawn in self.pack.world.mobSpawns:
if spawn.mob != mob: continue
habitat = spawn.habitat
ecotype = spawn.ecotype
self.line().text("Spawn: ").line(spawn.name)
self.indent()
self.line().text("Spawn: ").line(spawn.name).indent()
self.text("altitude: ").line(habitat.altitude)
self.text("biomeFilter: ")
self.line(" -OR- ".join(str(b) for b in habitat.biomeFilters))
@@ -29,7 +30,13 @@ class MobSpawnReport(ReportComposer):
self.text("group: ").line(ecotype.group)
self.text("location: ").line(ecotype.location)
self.text("scarcity: ").line(ecotype.scarcity)
self.outdent()
self.outdent() # spawn
self.outdent()
if habitat:
self.line().line("Biomes:").indent()
for biome in BiomeFilter.collate(self.pack.world.biomes, habitat.biomeFilters):
self.line(biome)
self.outdent() # biomes
self.outdent() # mob
self.line()
@@ -86,4 +86,6 @@ def test_write(report:MobSpawnReport):
group: troup (3 to 6)
location: outside
scarcity: common
Biomes:
""").strip()
+2 -3
View File
@@ -1,4 +1,3 @@
from collections.abc import Sequence
from collections.abc import Iterable
from mcpacker.model.resourceid import ResourceId
from mcpacker.model.ecology.biome import Biome
@@ -43,8 +42,8 @@ class BiomeFilter:
def __init__(
self,
required:Sequence[BiomeTrait|ResourceId|Sequence[BiomeTrait]]|None=None,
prohibited:Sequence[BiomeTrait|ResourceId]|None=None,
required:Iterable[BiomeTrait|ResourceId|Iterable[BiomeTrait]]|None=None,
prohibited:Iterable[BiomeTrait|ResourceId]|None=None,
):
self.required = list(required or [])
self.prohibited = list(prohibited or [])
+2 -2
View File
@@ -54,6 +54,6 @@ class Habitat:
def accepts(self, biome:Biome) -> bool:
for biomeFilter in self.biomeFilters:
if not biomeFilter.accepts(biome): return False
if biomeFilter.accepts(biome): return True
return True
return False
+6 -6
View File
@@ -27,7 +27,7 @@ def addBiomes(pack:ModPack):
))
biomes.add(Biome("helsinki", "minecraft:birch_forest",
FL.FOREST, GE.SEDIMENTARY, HE.TEMPERATE, HU.WET, SO.ACIDIC, WA.INLAND
FL.FOREST, GE.SEDIMENTARY, HE.TEMPERATE, HU.DAMP, SO.ACIDIC, WA.INLAND
))
biomes.add(Biome("tokyo", "minecraft:cherry_grove",
@@ -35,7 +35,7 @@ def addBiomes(pack:ModPack):
))
biomes.add(Biome("boston", "minecraft:cold_ocean",
FL.BARREN, GE.SEDIMENTARY, HE.BOREAL, HU.DAMP, SO.CLAYEY, WA.OCEAN
FL.BARREN, GE.SEDIMENTARY, HE.BOREAL, HU.WET, SO.CLAYEY, WA.OCEAN
))
biomes.add(Biome("freiburg", "minecraft:dark_forest",
@@ -119,11 +119,11 @@ def addBiomes(pack:ModPack):
))
biomes.add(Biome("sanfrancisco", "minecraft:ocean",
FL.BARREN, GE.IGNEOUS, HE.TEMPERATE, HU.DAMP, SO.SANDY, WA.OCEAN
FL.BARREN, GE.IGNEOUS, HE.TEMPERATE, HU.WET, SO.SANDY, WA.OCEAN
))
biomes.add(Biome("minsk", "minecraft:old_growth_birch_forest",
FL.FOREST, GE.SEDIMENTARY, HE.TEMPERATE, HU.WET, SO.SANDY, WA.INLAND
FL.FOREST, GE.SEDIMENTARY, HE.TEMPERATE, HU.DAMP, SO.ACIDIC, WA.INLAND
))
biomes.add(Biome("stpetersburg", "minecraft:old_growth_pine_taiga",
@@ -187,11 +187,11 @@ def addBiomes(pack:ModPack):
))
biomes.add(Biome("irkutsk", "minecraft:taiga",
FL.FOREST, GE.IGNEOUS, HE.BOREAL, HU.DAMP, SO.ACIDIC, WA.INLAND
FL.FOREST, GE.METAMORPHIC, HE.BOREAL, HU.DAMP, SO.ACIDIC, WA.INLAND
))
biomes.add(Biome("nassau", "minecraft:warm_ocean",
FL.BARREN, GE.SEDIMENTARY, HE.TROPICAL, HU.SOAKED, SO.SANDY, WA.COAST
FL.BARREN, GE.SEDIMENTARY, HE.TROPICAL, HU.SOAKED, SO.SANDY, WA.OCEAN
))
biomes.add(Biome("stirling", "minecraft:windswept_forest",
@@ -22,8 +22,8 @@ def addMineralSpawns(pack:ModPack):
# Aluminum Family ##########################################################
b.start(minerals["basalt"])
b.biomeFilters = BF([HE.TROPICAL, HU.SOAKED, WA.INLAND])
b.save("aluminum-indicator")
b.biomeFilters = BF([HE.TROPICAL, (HU.WET, HU.SOAKED)], [SO.FUNGAL, WA.OCEAN])
b.save("aluminum-indicator-basalt")
b.switch(minerals["aluminum"])
b.altitude = AL.span(AL.SUBSTRATE, AL.OVERBURDEN)
@@ -48,7 +48,7 @@ def addMineralSpawns(pack:ModPack):
b.start(minerals["tuff"])
b.biomeFilters = BF([GE.SEDIMENTARY, HE.TEMPERATE, HU.SOAKED])
b.save("coal-indicator")
b.save("coal-indicator-tuff")
b.switch(minerals["coal"])
b.altitude = AL.span(AL.SUBSTRATE, AL.OVERBURDEN)
@@ -69,37 +69,61 @@ def addMineralSpawns(pack:ModPack):
b.scarcity = SC.UNUSUAL
b.save("coal-tertiary-iron")
# Copper Family ############################################################
# Copper (oxidizedcap) Family ##############################################
b.start(minerals["diorite"])
b.biomeFilters = BF([GE.SEDIMENTARY, HE.SUBTROPICAL, HU.DRY])
b.save("copper-indicator")
b.start(minerals["sandstone"])
b.biomeFilters = BF([GE.SEDIMENTARY, HE.SUBTROPICAL, (HU.ARID, HU.DRY)])
b.save("copper-oxidizedcap-indicator-sandstone")
b.switch(minerals["copper"])
b.altitude = AL.CRUST
b.bulk = BU.MEDIUM
b.scarcity = SC.UNCOMMON
b.save("copper-primary-copper")
b.save("copper-oxidizedcap-primary-copper")
b.switch(minerals["iron"])
b.altitude = AL.CRUST
b.bulk = BU.SMALL
b.scarcity = SC.UNUSUAL
b.save("copper-oxidizedcap-secondary-iron")
b.switch(minerals["sulfur"])
b.altitude = AL.CRUST
b.bulk = BU.TINY
b.scarcity = SC.RARE
b.save("copper-oxidizedcap-tertiary-sulfur")
# Copper (porphyry) Family ##################################################
b.start(minerals["diorite"])
b.biomeFilters = BF([GE.IGNEOUS, (HE.SUBTROPICAL, HE.FROZEN), SO.ROCKY])
b.save("copper-porphyry-indicator-diorite")
b.switch(minerals["copper"])
b.altitude = AL.CRUST
b.bulk = BU.MEDIUM
b.scarcity = SC.UNCOMMON
b.save("copper-porphyry-primary-copper")
b.switch(minerals["redstone"])
b.altitude = AL.MANTLE
b.bulk = BU.SMALL
b.scarcity = SC.UNUSUAL
b.save("copper-secondary-redstone")
b.save("copper-porphyry-secondary-redstone")
b.switch(minerals["gold"])
b.altitude = AL.span(AL.CRUST, AL.MANTLE)
b.bulk = BU.TINY
b.scarcity = SC.RARE
b.save("copper-tertiary-gold")
b.save("copper-porphyry-tertiary-gold")
# Gold Family ##############################################################
b.start(minerals["marble"])
b.biomeFilters = BF([GE.METAMORPHIC, HE.BOREAL, HU.DRY])
b.save("gold-indicator")
b.biomeFilters = BF([GE.METAMORPHIC, (HE.BOREAL, HE.FROZEN), SO.ROCKY])
b.save("gold-indicator-marble")
b.start(minerals["quartz"])
b.switch(minerals["quartz"])
b.altitude = AL.span(AL.CRAGS, AL.PEAKS)
b.bulk = BU.MEDIUM
b.scarcity = SC.SPARSE
@@ -123,37 +147,65 @@ def addMineralSpawns(pack:ModPack):
b.scarcity = SC.RARE
b.save("gold-quarternary-emerald")
# Iron Family ##############################################################
# Iron (banded) Family ##############################################################
b.start(minerals["andesite"])
b.biomeFilters = BF([GE.SEDIMENTARY, HE.TEMPERATE, HU.WET])
b.save("iron-indicator")
b.start(minerals["diorite"])
b.biomeFilters = BF(
[FL.within(FL.CANOPY, FL.CLEARING), GE.METAMORPHIC, (HE.BOREAL, HE.FROZEN)]
)
b.save("iron-banded-indicator-diorite")
b.start(minerals["iron"])
b.altitude = AL.CRUST
b.bulk = BU.MEDIUM
b.scarcity = SC.COMMON
b.save("iron-primary-iron")
b.switch(minerals["iron"])
b.altitude = AL.span(AL.OVERBURDEN, AL.CRUST)
b.bulk = BU.LARGE
b.scarcity = SC.UNCOMMON
b.save("iron-banded-primary-iron")
b.switch(minerals["quartz"])
b.altitude = AL.CRUST
b.bulk = BU.SMALL
b.altitude = AL.span(AL.OVERBURDEN, AL.CRUST)
b.bulk = BU.MEDIUM
b.scarcity = SC.UNUSUAL
b.save("iron-secondary-quartz")
b.save("iron-banded-secondary-quartz")
b.switch(minerals["uranium"])
b.altitude = AL.MANTLE
b.bulk = BU.TINY
b.altitude = AL.CRUST
b.bulk = BU.SMALL
b.scarcity = SC.UNCOMMON
b.save("iron-banded-tertiary-uranium")
# Iron (bog) Family ##############################################################
b.start(minerals["andesite"])
b.biomeFilters = BF([FL.FOREST, GE.SEDIMENTARY, HE.TEMPERATE], [WA.SWAMP])
b.save("iron-bog-indicator-andesite")
b.switch(minerals["coal"])
b.altitude = AL.SOIL
b.bulk = BU.SMALL
b.depositType = DE.DISK
b.scarcity = SC.UNCOMMON
b.save("iron-bog-primary-coal")
b.switch(minerals["iron"])
b.altitude = AL.span(AL.SOIL, AL.DUNES)
b.bulk = BU.MEDIUM
b.depositType = DE.DISK
b.scarcity = SC.UNCOMMON
b.save("iron-bog-secondary-iron")
b.switch(minerals["uranium"])
b.altitude = AL.SOIL
b.bulk = BU.SMALL
b.scarcity = SC.RARE
b.save("iron-tertiary-uranium")
b.save("iron-bog-tertiary-uranium")
# Lead Family ##############################################################
b.start(minerals["dolostone"])
b.biomeFilters = BF([GE.SEDIMENTARY, HE.TEMPERATE, HU.DAMP])
b.save("lead-indicator")
b.biomeFilters = BF([FL.FIELD, GE.SEDIMENTARY, HE.TEMPERATE, HU.DAMP])
b.save("lead-indicator-dolostone")
b.start(minerals["lead"])
b.switch(minerals["lead"])
b.altitude = AL.CRUST
b.bulk = BU.MEDIUM
b.scarcity = SC.SPARSE
@@ -171,6 +223,87 @@ def addMineralSpawns(pack:ModPack):
b.scarcity = SC.UNUSUAL
b.save("lead-tertiary-silver")
# Ocean (igneous) Family ###################################################
b.start(minerals["basalt"])
b.biomeFilters = BF([GE.IGNEOUS, WA.OCEAN])
b.save("ocean-igneous-indicator-basalt")
b.switch(minerals["tin"])
b.altitude = AL.CRUST
b.bulk = BU.MEDIUM
b.depositType = DE.VEIN
b.scarcity = SC.UNCOMMON
b.save("ocean-igneous-primary-tin")
b.switch(minerals["copper"])
b.altitude = AL.CRUST
b.bulk = BU.SMALL
b.depositType = DE.VEIN
b.scarcity = SC.SPARSE
b.save("ocean-igneous-secondary-copper")
b.switch(minerals["diamond"])
b.altitude = AL.MANTLE
b.bulk = BU.TINY
b.depositType = DE.VEIN
b.scarcity = SC.RARE
b.save("ocean-igneous-tertiary-diamond")
# Ocean (metamorphic) Family ###############################################
b.start(minerals["marble"])
b.biomeFilters = BF([GE.METAMORPHIC, WA.OCEAN])
b.save("ocean-metamorphic-indicator-marble")
b.switch(minerals["quartz"])
b.altitude = AL.CRUST
b.bulk = BU.LARGE
b.depositType = DE.STRATA
b.scarcity = SC.COMMON
b.save("ocean-metamorphic-primary-quartz")
b.switch(minerals["gold"])
b.altitude = AL.CRUST
b.bulk = BU.SMALL
b.depositType = DE.VEIN
b.scarcity = SC.UNUSUAL
b.save("ocean-metamorphic-secondary-gold")
b.switch(minerals["emerald"])
b.altitude = AL.MANTLE
b.bulk = BU.TINY
b.depositType = DE.VEIN
b.scarcity = SC.RARE
b.save("ocean-metamorphic-tertiary-emerald")
# Ocean (sedimentary) Family ###############################################
b.start(minerals["sandstone"])
b.biomeFilters = BF([GE.SEDIMENTARY, WA.OCEAN])
b.save("ocean-sedimentary-indicator-sandstone")
b.switch(minerals["iron"])
b.altitude = AL.CRUST
b.bulk = BU.MEDIUM
b.depositType = DE.STRATA
b.scarcity = SC.UNCOMMON
b.save("ocean-sedimentary-primary-iron")
b.switch(minerals["nickel"])
b.altitude = AL.CRUST
b.bulk = BU.SMALL
b.depositType = DE.DISK
b.scarcity = SC.SPARSE
b.save("ocean-sedimentary-secondary-nickel")
b.switch(minerals["lapis"])
b.altitude = AL.CRUST
b.bulk = BU.LARGE
b.depositType = DE.VEIN
b.scarcity = SC.SPARSE
b.save("ocean-sedimentary-tertiary-lapis")
# Plutonic Family ##########################################################
b.start(minerals["sulfur"])
@@ -187,7 +320,7 @@ def addMineralSpawns(pack:ModPack):
b.start(minerals["chalk"])
b.biomeFilters = BF([GE.SEDIMENTARY, HE.TROPICAL, HU.ARID])
b.save("salt-indicator")
b.save("salt-indicator-chalk")
b.switch(minerals["salt"])
b.altitude = AL.span(AL.CRUST, AL.MANTLE)
@@ -219,11 +352,35 @@ def addMineralSpawns(pack:ModPack):
b.scarcity = SC.COMMON
b.save("soil-special-peat")
# Silver Family ###############################################################
b.start(minerals["diorite"])
b.biomeFilters = BF([GE.METAMORPHIC, HE.TEMPERATE, HU.SOAKED])
b.save("silver-indicator-diorite")
b.switch(minerals["quartz"])
b.altitude = AL.span(AL.CRUST, AL.LOWLANDS)
b.bulk = BU.MEDIUM
b.scarcity = SC.UNCOMMON
b.save("silver-primary-quartz")
b.switch(minerals["lead"])
b.altitude = AL.span(AL.SOIL, AL.OVERBURDEN)
b.bulk = BU.MEDIUM
b.scarcity = SC.SPARSE
b.save("silver-secondary-lead")
b.switch(minerals["silver"])
b.altitude = AL.CRUST
b.bulk = BU.SMALL
b.scarcity = SC.SPARSE
b.save("silver-tertiary-silver")
# Tin Family ###############################################################
b.start(minerals["granite"])
b.biomeFilters = BF([GE.IGNEOUS, HE.BOREAL, HU.DRY])
b.save("tin-indicator")
b.biomeFilters = BF([GE.IGNEOUS, HE.BOREAL, SO.ROCKY])
b.save("tin-indicator-granite")
b.switch(minerals["tin"])
b.altitude = AL.CRUST
@@ -237,6 +394,34 @@ def addMineralSpawns(pack:ModPack):
b.scarcity = SC.UNUSUAL
b.save("tin-secondary-copper")
# Volcanic Family ##########################################################
b.start(minerals["basalt"])
b.biomeFilters = BF([GE.IGNEOUS, SO.FUNGAL])
b.save("volcanic-indicator-basalt")
b.switch(minerals["sulfur"])
b.altitude = AL.span(AL.LOWLANDS, AL.CRUST)
b.bulk = BU.MEDIUM
b.scarcity = SC.UNCOMMON
b.save("volcanic-primary-sulfur")
b.switch(minerals["magma"])
b.altitude = AL.span(AL.SOIL, AL.CRUST)
b.bulk = BU.MEDIUM
b.scarcity = SC.SPARSE
b.save("volcanic-secondary-magma")
b.switch(minerals["diamond"])
b.altitude = AL.span(AL.CRUST, AL.MANTLE)
b.bulk = BU.TINY
b.depositType = DE.VEIN
b.scarcity = SC.UNUSUAL
b.save("volcanic-tertiary-diamond")
# TODO: All the Taiga biomes are missing mineral deposits
# TODO: Mushroom Fields doesn't have any minerals
"""
vein strata
+29 -38
View File
@@ -29,7 +29,7 @@ def addMobSpawns(pack:ModPack):
b.start(mobs["animalplus:raccoon"])
b.altitude = AL.span(AL.LOWLANDS, AL.HILLS)
b.biomeFilters = BF([(FL.CANOPY, FL.FOREST), HE.within(HE.TEMPERATE, HE.BOREAL)])
b.biomeFilters = BF([(FL.CANOPY, FL.FOREST), HE.TEMPERATE])
b.seasons = SE.exclude(SE.WINTER)
b.group = GR.merge(GR.SOLO, GR.PAIR)
b.scarcity = SC.UNCOMMON
@@ -41,7 +41,7 @@ def addMobSpawns(pack:ModPack):
b.start(mobs["animalplus:red_panda"])
b.altitude = AL.span(AL.UPLANDS, AL.HILLS)
b.biomeFilters = BF([ResourceId.parse("bamboo_forest")])
b.biomeFilters = BF([ResourceId.parse("bamboo_jungle")])
b.seasons = SE.ALL
b.group = GR.merge(GR.SOLO, GR.PAIR)
b.scarcity = SC.SPARSE
@@ -53,32 +53,19 @@ def addMobSpawns(pack:ModPack):
b.seasons = SE.AUTUMN
b.group = GR.merge(GR.SOLO, GR.FAMILY)
b.scarcity = SC.UNCOMMON
b.save("blackbear-temperate-autumn")
b.save("blackbear-autumn")
b.seasons = [SE.SPRING, SE.SUMMER]
b.scarcity = SC.SPARSE
b.save("blackbear-temperate-springsummer")
b.save("blackbear-springsummer")
b.seasons = SE.WINTER
b.scarcity = SC.UNUSUAL
b.save("blackbear-temperate-winter")
b.biomeFilters = BF([HE.BOREAL, (FL.CANOPY, FL.FOREST)])
b.seasons = SE.AUTUMN
b.scarcity = SC.SPARSE
b.save("blackbear-boreal-autumn")
b.seasons = [SE.SPRING, SE.SUMMER]
b.scarcity = SC.UNUSUAL
b.save("blackbear-boreal-springsummer")
b.seasons = SE.WINTER
b.scarcity = SC.RARE
b.save("blackbear-boreal-winter")
b.save("blackbear-winter")
b.start(mobs["minecraft:armadillo"])
b.altitude = AL.LOWLANDS
b.biomeFilters = BF([HE.SUBTROPICAL, HU.DRY, SO.CLAYEY])
b.biomeFilters = BF([HE.SUBTROPICAL, HU.ARID, (SO.CLAYEY, SO.ROCKY)])
b.seasons = SE.SUMMER
b.group = GR.merge(GR.SOLO, GR.PAIR)
b.scarcity = SC.COMMON
@@ -106,7 +93,7 @@ def addMobSpawns(pack:ModPack):
b.start(mobs["bearminimum:brown_bear"])
b.altitude = AL.span(AL.LOWLANDS, AL.ALPINE)
b.biomeFilters = BF([HE.BOREAL, (FL.CANOPY, FL.FOREST)])
b.biomeFilters = BF([(FL.CANOPY, FL.FOREST), HE.BOREAL])
b.seasons = SE.AUTUMN
b.group = GR.SOLO
b.scarcity = SC.SPARSE
@@ -122,7 +109,7 @@ def addMobSpawns(pack:ModPack):
b.start(mobs["minecraft:camel"])
b.altitude = AL.span(AL.DUNES, AL.LOWLANDS)
b.biomeFilters = BF([HE.TROPICAL, HU.DRY, FL.BARREN, SO.SANDY])
b.biomeFilters = BF([HE.TROPICAL, HU.ARID, SO.SANDY])
b.seasons = SE.DRY
b.group = GR.FAMILY
b.scarcity = SC.UNUSUAL
@@ -141,7 +128,7 @@ def addMobSpawns(pack:ModPack):
b.start(mobs["cold_sweat:chameleon"])
b.altitude = AL.span(AL.DUNES, AL.UPLANDS)
b.biomeFilters = BF([(FL.CANOPY, FL.FOREST), HE.TROPICAL, HU.WET, WA.INLAND])
b.biomeFilters = BF([(FL.CANOPY, FL.FOREST), HE.TROPICAL, HU.SOAKED])
b.seasons = SE.WET
b.group = GR.merge(GR.SOLO, GR.FAMILY)
b.scarcity = SC.COMMON
@@ -153,7 +140,7 @@ def addMobSpawns(pack:ModPack):
b.start(mobs["minecraft:chicken"])
b.altitude = AL.span(AL.LOWLANDS, AL.UPLANDS)
b.biomeFilters = BF([FL.CLEARING, HE.TROPICAL, HU.WET], [SO.FUNGAL])
b.biomeFilters = BF([FL.CLEARING, HE.TROPICAL, HU.SOAKED], [SO.FUNGAL])
b.seasons = SE.SUMMER
b.group = GR.TROUP
b.scarcity = SC.COMMON
@@ -173,8 +160,10 @@ def addMobSpawns(pack:ModPack):
b.start(mobs["minecraft:cow"])
b.altitude = AL.span(AL.LOWLANDS, AL.UPLANDS)
b.biomeFilters = \
BF([HE.within(HE.SUBTROPICAL, HE.BOREAL), [HU.DAMP, HU.DRY], FL.FIELD], [SO.FUNGAL])
b.biomeFilters = BF(
[FL.FIELD, HE.within(HE.SUBTROPICAL, HE.BOREAL), (HU.DAMP, HU.DRY)],
[SO.FUNGAL, SO.ROCKY]
)
b.seasons = [SE.SPRING, SE.SUMMER]
b.group = GR.HERD
b.scarcity = SC.SPARSE
@@ -188,19 +177,19 @@ def addMobSpawns(pack:ModPack):
b.start(mobs["crabbersdelight:crab"])
b.altitude = AL.DUNES
b.biomeFilters = BF([WA.COAST, [HE.TROPICAL, HE.SUBTROPICAL]])
b.biomeFilters = BF([(HE.TROPICAL, HE.SUBTROPICAL), WA.COAST])
b.seasons = SE.ALL
b.group = GR.SOLO
b.scarcity = SC.UNCOMMON
b.save("crab-warm")
b.biomeFilters = BF([WA.COAST, [HE.TEMPERATE, HE.BOREAL]])
b.biomeFilters = BF([(HE.TEMPERATE, HE.BOREAL), WA.COAST])
b.scarcity = SC.SPARSE
b.save("crab-cool")
b.start(mobs["minecraft:dolphin"])
b.altitude = AL.span(AL.SURFACE, AL.DEEPS)
b.biomeFilters = BF([WA.OCEAN, [HE.SUBTROPICAL, HE.TEMPERATE]])
b.biomeFilters = BF([(HE.SUBTROPICAL, HE.TEMPERATE), WA.OCEAN])
b.location = LO.WATER
b.seasons = SE.SUMMER
b.group = GR.FAMILY
@@ -213,7 +202,7 @@ def addMobSpawns(pack:ModPack):
b.start(mobs["minecraft:donkey"])
b.altitude = AL.span(AL.UPLANDS, AL.HILLS)
b.biomeFilters = BF([HE.SUBTROPICAL, HU.DRY, FL.FIELD])
b.biomeFilters = BF([FL.CLEARING, HE.SUBTROPICAL, HU.DRY])
b.seasons = [SE.SUMMER, SE.AUTUMN]
b.group = GR.FAMILY
b.scarcity = SC.SPARSE
@@ -226,7 +215,7 @@ def addMobSpawns(pack:ModPack):
b.start(mobs["minecraft:fox"])
b.altitude = AL.span(AL.LOWLANDS, AL.HILLS)
b.biomeFilters = BF([HE.within(HE.TEMPERATE, HE.FROZEN), FL.FOREST])
b.biomeFilters = BF([FL.FOREST, HE.within(HE.TEMPERATE, HE.FROZEN), SO.ACIDIC])
b.seasons = [SE.SPRING]
b.group = GR.FAMILY
b.scarcity = SC.UNCOMMON
@@ -239,7 +228,7 @@ def addMobSpawns(pack:ModPack):
b.start(mobs["minecraft:frog"])
b.altitude = AL.span(AL.SURFACE, AL.DUNES)
b.biomeFilters = BF([(HE.TROPICAL, HE.TEMPERATE), HU.WET, WA.SWAMP])
b.biomeFilters = BF([WA.SWAMP])
b.group = GR.HERD
b.scarcity = SC.COMMON
b.seasons = SE.SUMMER
@@ -307,7 +296,7 @@ def addMobSpawns(pack:ModPack):
b.start(mobs["minecraft:ocelot"])
b.altitude = AL.span(AL.LOWLANDS, AL.HILLS)
b.biomeFilters = BF([FL.CANOPY, HE.TROPICAL, HU.WET])
b.biomeFilters = BF([FL.CANOPY, HE.TROPICAL])
b.group = GR.SOLO
b.scarcity = SC.RARE
b.seasons = SE.ALL
@@ -315,7 +304,7 @@ def addMobSpawns(pack:ModPack):
b.start(mobs["minecraft:panda"])
b.altitude = AL.span(AL.LOWLANDS, AL.UPLANDS)
b.biomeFilters = BF([ResourceId.parse("bamboo_forest")])
b.biomeFilters = BF([ResourceId.parse("bamboo_jungle")])
b.group = GR.SOLO
b.scarcity = SC.UNUSUAL
b.seasons = SE.exclude(SE.SPRING)
@@ -327,13 +316,13 @@ def addMobSpawns(pack:ModPack):
b.start(mobs["minecraft:parrot"])
b.altitude = AL.span(AL.DUNES, AL.HILLS)
b.biomeFilters = BF([(FL.CANOPY, FL.FOREST), HE.TROPICAL, HU.WET])
b.biomeFilters = BF([FL.CANOPY, HE.TROPICAL])
b.group = GR.PAIR
b.scarcity = SC.COMMON
b.seasons = SE.ALL
b.save("parrot-canopyforest")
b.biomeFilters = BF([FL.CLEARING, HE.TROPICAL, HU.WET], [SO.FUNGAL])
b.biomeFilters = BF([FL.CLEARING, HE.TROPICAL], [SO.FUNGAL])
b.scarcity = SC.UNCOMMON
b.save("parrot-clearing")
@@ -341,7 +330,9 @@ def addMobSpawns(pack:ModPack):
b.altitude = AL.span(AL.LOWLANDS, AL.HILLS)
b.biomeFilters = BF([
FL.within(FL.CANOPY, FL.CLEARING),
HE.within(HE.SUBTROPICAL, HE.TEMPERATE)
HE.within(HE.SUBTROPICAL, HE.BOREAL),
SO.LOAMY,
])
b.group = GR.TROUP
b.scarcity = SC.COMMON
@@ -395,7 +386,7 @@ def addMobSpawns(pack:ModPack):
b.save("rabbit-temperate-winter")
b.altitude = AL.span(AL.DUNES, AL.LOWLANDS)
b.biomeFilters = BF([FL.BARREN, HE.TROPICAL, HU.DRY])
b.biomeFilters = BF([FL.BARREN, HE.TROPICAL, HU.ARID])
b.group = GR.PAIR
b.scarcity = SC.SPARSE
b.seasons = SE.exclude(SE.SUMMER)
@@ -515,6 +506,6 @@ def addMobSpawns(pack:ModPack):
b.scarcity = SC.UNUSUAL
b.save("wolf-arctic")
b.biomeFilters = BF([(FL.CLEARING, FL.FIELD), HE.SUBTROPICAL, WA.INLAND])
b.biomeFilters = BF([(FL.CLEARING, FL.FIELD), HE.SUBTROPICAL, WA.INLAND], [SO.ROCKY])
b.scarcity = SC.SPARSE
b.save("wolf-savanna")
+7 -7
View File
@@ -64,13 +64,6 @@ def addPlants(pack:ModPack):
radius = 3,
))
plants.add(Patch(
name = "cabbage",
blocks = f"{FD}:wild_cabbages",
density = DE.THIN,
radius = 4,
))
plants.add(Patch(
name = "carrot",
blocks = f"{FD}:wild_carrots",
@@ -142,6 +135,13 @@ def addPlants(pack:ModPack):
radius = 3,
))
plants.add(Patch(
name = "lettuce",
blocks = f"{FD}:wild_cabbages",
density = DE.THIN,
radius = 4,
))
plants.add(Patch(
name = "melon",
blocks = f"{MC}:melon",
@@ -37,7 +37,7 @@ def addPlantSpawns(pack:ModPack):
b.start(plants["bellpepper"])
b.altitude = AL.LOWLANDS
b.biomeFilters = BF([FL.CLEARING, HE.TROPICAL, HU.WET, WA.INLAND])
b.biomeFilters = BF([FL.CLEARING, HE.TROPICAL, HU.SOAKED, WA.INLAND])
b.scarcity = SC.COMMON
b.save("bellpepper")
@@ -48,21 +48,14 @@ def addPlantSpawns(pack:ModPack):
b.save("blueberry")
b.start(plants["brownmushroom"])
b.altitude = AL.span(AL.SOIL, AL.ALPINE)
b.biomeFilters = [
BF([(FL.CANOPY, FL.FOREST), (HE.TEMPERATE, HE.BOREAL), (SO.LOAMY, SO.CLAYEY)], [WA.OCEAN]),
BF([HU.WET], [HE.FROZEN, WA.OCEAN, WA.RIVER]),
BF([SO.FUNGAL]),
]
b.altitude = AL.span(AL.SOIL, AL.UPLANDS)
b.biomeFilters = BF(
[HU.within(HU.DAMP, HU.SOAKED), (SO.CLAYEY, SO.LOAMY, SO.FUNGAL)],
[HE.FROZEN, WA.OCEAN, WA.RIVER]
)
b.scarcity = SC.COMMON
b.save("brownmushroom")
b.start(plants["cabbage"])
b.altitude = AL.HILLS
b.biomeFilters = BF([(HE.SUBTROPICAL, HE.TEMPERATE), SO.SANDY, WA.COAST])
b.scarcity = SC.COMMON
b.save("cabbage")
b.start(plants["carrot"])
b.altitude = AL.LOWLANDS
b.biomeFilters = BF(
@@ -73,7 +66,7 @@ def addPlantSpawns(pack:ModPack):
b.start(plants["coffee"])
b.altitude = AL.span(AL.HILLS, AL.ALPINE)
b.biomeFilters = BF([FL.CANOPY, HE.TROPICAL, HU.WET])
b.biomeFilters = BF([FL.CANOPY, HE.TROPICAL, HU.SOAKED])
b.scarcity = SC.SPARSE
b.save("coffee")
@@ -97,7 +90,7 @@ def addPlantSpawns(pack:ModPack):
b.start(plants["cranberry"])
b.altitude = AL.DUNES
b.biomeFilters = BF([HU.WET, SO.PEATY])
b.biomeFilters = BF([(HE.TEMPERATE, HE.BOREAL), WA.SWAMP])
b.scarcity = SC.UNCOMMON
b.save("cranberry")
@@ -106,13 +99,13 @@ def addPlantSpawns(pack:ModPack):
# "flax" as a fiberous, desert-dwelling cousin.
b.start(plants["flax"])
b.altitude = AL.DUNES
b.biomeFilters = BF([FL.BARREN, HU.DRY, SO.SANDY])
b.biomeFilters = BF([FL.BARREN, HU.ARID, SO.SANDY])
b.scarcity = SC.COMMON
b.save("flax")
b.start(plants["hamimelon"])
b.altitude = AL.span(AL.LOWLANDS, AL.UPLANDS)
b.biomeFilters = BF([FL.FIELD, HE.SUBTROPICAL, HU.DRY, (SO.LOAMY, SO.SANDY)])
b.biomeFilters = BF([FL.FIELD, HE.SUBTROPICAL, HU.ARID, (SO.LOAMY, SO.SANDY)])
b.scarcity = SC.RARE
b.save("hamimelon")
@@ -130,9 +123,15 @@ def addPlantSpawns(pack:ModPack):
b.scarcity = SC.SPARSE
b.save("lemon")
b.start(plants["lettuce"])
b.altitude = AL.HILLS
b.biomeFilters = BF([FL.FIELD, HE.TEMPERATE, SO.SANDY])
b.scarcity = SC.COMMON
b.save("lettuce")
b.start(plants["melon"])
b.altitude = AL.LOWLANDS
b.biomeFilters = BF([FL.CLEARING, HE.TROPICAL, HU.WET], [SO.FUNGAL])
b.biomeFilters = BF([FL.CLEARING, HE.TROPICAL, HU.SOAKED], [SO.FUNGAL])
b.scarcity = SC.SPARSE
b.save("melon")
@@ -147,7 +146,7 @@ def addPlantSpawns(pack:ModPack):
# a more cactus-like cousin of actual pineapples.
b.start(plants["pineapple"])
b.altitude = AL.LOWLANDS
b.biomeFilters = BF([FL.BARREN, HE.TROPICAL, HU.DRY, SO.SANDY])
b.biomeFilters = BF([FL.BARREN, HE.TROPICAL, HU.ARID, SO.SANDY])
b.scarcity = SC.SPARSE
# TODO: add sand as substrate in addplants.py
b.save("pineapple")
@@ -165,12 +164,11 @@ def addPlantSpawns(pack:ModPack):
b.save("pumpkin")
b.start(plants["redmushroom"])
b.altitude = AL.span(AL.SOIL, AL.ALPINE)
b.biomeFilters = [
BF([(FL.CANOPY, FL.FOREST), (HE.TEMPERATE, HE.BOREAL), (SO.LOAMY, SO.CLAYEY)]),
BF([HU.WET], [HE.FROZEN, WA.OCEAN, WA.RIVER]),
BF([SO.FUNGAL]),
]
b.altitude = AL.span(AL.SOIL, AL.UPLANDS)
b.biomeFilters = BF(
[HU.within(HU.DAMP, HU.SOAKED), (SO.ACIDIC, SO.CLAYEY, SO.FUNGAL)],
[HE.FROZEN, WA.OCEAN, WA.RIVER]
)
b.scarcity = SC.UNCOMMON
b.save("redmushroom")
@@ -193,8 +191,8 @@ def addPlantSpawns(pack:ModPack):
b.save("sunflower")
b.start(plants["tomato"])
b.altitude = AL.span(AL.UPLANDS, AL.HILLS)
b.biomeFilters = BF([FL.CLEARING, HE.TROPICAL, HU.WET], [SO.FUNGAL])
b.altitude = AL.UPLANDS
b.biomeFilters = BF([FL.CLEARING, HE.TROPICAL, (HU.DAMP, HU.SOAKED)], [SO.FUNGAL])
b.scarcity = SC.UNCOMMON
b.save("tomato")
@@ -220,7 +218,7 @@ def addPlantSpawns(pack:ModPack):
b.start(plants["blueorchid"])
b.altitude = AL.span(AL.LOWLANDS, AL.UPLANDS)
b.biomeFilters = BF([FL.CANOPY, HE.TROPICAL, HU.WET])
b.biomeFilters = BF([FL.CANOPY, HE.TROPICAL, HU.SOAKED])
b.scarcity = SC.RARE
b.save("blueorchid")
@@ -326,8 +324,8 @@ def addPlantSpawns(pack:ModPack):
b.save("bayberry-tree")
b.start(plants["durian"])
b.altitude = AL.HILLS
b.biomeFilters = BF([FL.within(FL.CANOPY, FL.CLEARING), HE.TROPICAL, HU.WET, SO.ACIDIC])
b.altitude = AL.UPLANDS
b.biomeFilters = BF([FL.FOREST, HE.TROPICAL, SO.ACIDIC])
b.scarcity = SC.UNUSUAL
b.save("durian-tree")
@@ -338,28 +336,26 @@ def addPlantSpawns(pack:ModPack):
b.save("fig-tree")
b.start(plants["hawberry"])
b.altitude = AL.span(AL.UPLANDS, AL.HILLS)
b.biomeFilters = BF([(FL.FOREST, FL.CLEARING), HE.TEMPERATE, (SO.ACIDIC, SO.LOAMY)])
b.altitude = AL.span(AL.LOWLANDS, AL.UPLANDS)
b.biomeFilters = BF([(FL.FOREST, FL.CLEARING), HE.TEMPERATE, SO.ACIDIC])
b.scarcity = SC.SPARSE
b.save("hawberry-tree")
b.start(plants["lychee"])
b.altitude = AL.UPLANDS
b.biomeFilters = BF([FL.CLEARING, HE.TROPICAL, HU.WET], [SO.FUNGAL])
b.altitude = AL.LOWLANDS
b.biomeFilters = BF([FL.CANOPY, HE.TROPICAL, HU.SOAKED])
b.scarcity = SC.SPARSE
b.save("lychee-tree")
b.start(plants["mango"])
b.altitude = AL.LOWLANDS
b.biomeFilters = BF(
[FL.within(FL.CANOPY, FL.CLEARING), HE.TROPICAL, (HU.DAMP, HU.WET), SO.ACIDIC]
)
b.biomeFilters = BF([FL.CANOPY, HE.TROPICAL, HU.SOAKED])
b.scarcity = SC.UNCOMMON
b.save("mango-tree")
b.start(plants["mangosteen"])
b.altitude = AL.UPLANDS
b.biomeFilters = BF([FL.CANOPY, HE.TROPICAL, HU.WET, SO.ACIDIC])
b.biomeFilters = BF([FL.CANOPY, HE.TROPICAL, HU.SOAKED])
b.scarcity = SC.UNUSUAL
b.save("mangosteen-tree")
@@ -383,6 +379,6 @@ def addPlantSpawns(pack:ModPack):
b.start(plants["persimmon"])
b.altitude = AL.span(AL.LOWLANDS, AL.UPLANDS)
b.biomeFilters = BF([FL.FOREST, HE.TEMPERATE, SO.LOAMY])
b.biomeFilters = BF([FL.FIELD, HE.TEMPERATE, SO.LOAMY])
b.scarcity = SC.UNCOMMON
b.save("persimmon-tree")
@@ -0,0 +1,59 @@
# Core Conceptual Mods:
* Alex's Mobs
* Cold Sweat
* Dynamic Trees
* Farmer's Delight
* Immersive Engineering
* Immersive Healing
* Railcraft Reborn
* Serene Seasons
* Thirst Was Taken
* Tectonic
# Extensions
* Brewin' and Chewin'
* Butchery
* Corn Delight
* Crabber's Delight
* Egg Delight
* Engineer's Delight
* Fruits Delight
* Miner's Delight
* Ocean's Delight
* Pizza Delight
* Realistic Wheat
* Rustic Delight
# Atmosphere & Decor
* Bear Minimum
* Chisels & Bits
* Comforts
* Dramatic Doors
* Dramatic Surroundings
* Flower Patch
* Flower Seeds
* Macaw's Bridges
* Macaw's Fences and Walls
* Macaw's Paths and Paving
* Macaw's Stairs
* Macaw's Windows
* Simplest Copper Gear
* Sky's Overworld Quartz
* Small Ships
* Storage Drawers
* Supplementaries
# Game Mechanics
* Better Safe Bed
* Biome Spawn Point
* Carry On
* Chunk Loaders
* InControl!
* Map Atlases
* Simple Finite Water Control
* Stack Refill
* You're in Grave Danger