Add remaining mineral deposits

* update repr results to yield valid Python
* update biome report to display deposits
* add deposit report
This commit is contained in:
Andrew Miner
2025-10-15 15:35:49 -06:00
parent cf21103d3e
commit 919c3d7312
48 changed files with 709 additions and 305 deletions
+21 -3
View File
@@ -9,12 +9,30 @@ class BiomeReport(ReportComposer):
def doCompose(self):
for biome in self.pack.world.biomes:
self.line(f"# Biome: {biome.gameId} ({biome.city})")
self.line(f"Biome: {biome.gameId} ({biome.city})")
self.line()
self.indent()
needsDelimiter = False
self.text("Traits: ")
for trait in biome.traits():
self.text("* ").line(trait)
self.outdent()
if needsDelimiter: self.text(", ")
needsDelimiter = True
self.text(trait)
self.line()
self.line()
self.line("Deposits:")
self.indent()
depositCount = 0
for deposit in self.pack.world.deposits:
if not deposit.acceptsBiome(biome): continue
self.line(deposit.name)
depositCount += 1
if depositCount == 0:
self.line("<no deposits>")
self.outdent()
self.outdent()
self.line()
+10 -14
View File
@@ -48,21 +48,17 @@ def createReport(pack:ModPack):
def test_report(report):
assert str(report).strip() == textwrap.dedent("""
# Biome: minecraft:plains (kansascity)
Biome: minecraft:plains (kansascity)
* Flora: field
* Geology: sedimentary
* Heat: temperate
* Humidity: damp
* Soil: loamy
* Water: inland
Traits: field, sedimentary, temperate, damp, loamy, inland
# Biome: minecraft:savanna (dallas)
Deposits:
<no deposits>
* Flora: field
* Geology: sedimentary
* Heat: subtropical
* Humidity: dry
* Soil: sandy
* Water: inland
Biome: minecraft:savanna (dallas)
Traits: field, sedimentary, subtropical, dry, sandy, inland
Deposits:
<no deposits>
""").strip()
+2 -2
View File
@@ -6,6 +6,6 @@ from mcpacker.model.modpack import ModPack
class ReportComposer(TextComposer):
def __init__(self, pack:ModPack, indentText:str=" "):
super().__init__(indentText)
def __init__(self, pack:ModPack):
super().__init__()
self.pack = pack
+41
View File
@@ -0,0 +1,41 @@
from mcpacker.format.report.composer import ReportComposer
from mcpacker.model.core.geology.deposit.mineraldeposit import MineralDeposit
from mcpacker.model.modpack import ModPack
from pathlib import Path
# Class ############################################################################################
class DepositReport(ReportComposer):
def doCompose(self):
biomes = self.pack.world.biomes
for deposit in self.pack.world.deposits:
self.line(f"Deposit: {deposit.name}")
self.line()
self.indent()
self.text("altitude: ").line(deposit.altitude)
self.text("biome filters: ").line(", ".join(str(b) for b in deposit.biomeFilters))
self.text("scarcity: ").line(deposit.scarcity)
if isinstance(deposit, MineralDeposit):
self.text("bulk: ").line(deposit.bulk)
self.text("inclusions: ").line(", ".join(str(i) for i in deposit.inclusions))
self.text("proportion: ").line(deposit.proportion)
self.line()
self.line("Found in:")
self.indent()
biomeCount = 0
for biome in biomes.filter(lambda b: deposit.acceptsBiome(b)):
self.line(biome)
biomeCount += 1
if biomeCount == 0:
self.line("WARNING: no suitable biomes")
self.outdent()
self.outdent()
self.line()
@@ -0,0 +1,9 @@
import mcpacker.format.report.depositreport
# Tests ############################################################################################
def test_syntax():
pass
# TODO: add some meaningful tests
+2 -2
View File
@@ -9,12 +9,12 @@ class MineralReport(ReportComposer):
def doCompose(self):
for mineral in self.pack.world.minerals:
self.line(f"# Mineral: {mineral.name}")
self.line(f"Mineral: {mineral.name}")
self.line()
self.indent()
for replacement in mineral.replacements:
self.text("* ").line(str(replacement))
self.line(str(replacement))
self.outdent()
self.line()
+6 -6
View File
@@ -38,13 +38,13 @@ def createReport(pack:ModPack):
def test_report(report:MineralReport):
assert str(report).strip() == textwrap.dedent("""
# Mineral: copper
Mineral: copper
* #minecraft:stone_replaceables => minecraft:copper_ore
* #minecraft:deepslate_replaceables => minecraft:deepslate_copper_ore
#minecraft:stone_replaceables => minecraft:copper_ore
#minecraft:deepslate_replaceables => minecraft:deepslate_copper_ore
# Mineral: iron
Mineral: iron
* #minecraft:stone_replaceables => minecraft:iron_ore
* #minecraft:deepslate_replaceables => minecraft:deepslate_iron_ore
#minecraft:stone_replaceables => minecraft:iron_ore
#minecraft:deepslate_replaceables => minecraft:deepslate_iron_ore
""").strip()
+12 -26
View File
@@ -10,37 +10,23 @@ class MobSpawnReport(ReportComposer):
def doCompose(self):
for spawn in self.pack.world.mobSpawns:
self.line(f"# Mob: {spawn.gameId}")
self.line(f"Mob: {spawn.gameId}")
self.line()
self.indent()
needsDelimiter = False
for index, habitat in enumerate(spawn.habitats, start=1):
self.text("* habitat ").line(index)
if needsDelimiter: self.line()
needsDelimiter = True
self.text("Habitat ").line(index)
self.indent()
self.text("* altitude: ").line(habitat.altitude)
self.line("* biomeFilter:")
self.indent()
for trait in habitat.biomeFilter.required:
if isinstance(trait, BiomeTrait):
self.text("* ").line(trait)
else:
category = type(trait[0]).__name__
self.text("* ").\
text(category).\
text(": any of: ").\
line(", ".join([t.name for t in trait]))
for trait in habitat.biomeFilter.prohibited:
category = type(trait).__name__
self.text("* ").text(category).text(": not: ").line(trait.name)
self.outdent()
self.text("* seasons: ").line(", ".join([s.name for s in habitat.seasons]))
self.text("* group: ").line(habitat.group.name)
self.text("* location: ").line(habitat.location.name)
self.text("* scarcity: ").line(habitat.scarcity.name)
self.text("altitude: ").line(habitat.altitude)
self.text("biomeFilter: ").line(habitat.biomeFilter)
self.text("seasons: ").line(", ".join([str(s) for s in habitat.seasons]))
self.text("group: ").line(habitat.group)
self.text("location: ").line(habitat.location)
self.text("scarcity: ").line(habitat.scarcity)
self.outdent()
self.outdent()
+16 -21
View File
@@ -69,26 +69,21 @@ def createReport(pack:ModPack):
def test_write(report:MobSpawnReport):
assert str(report).strip() == textwrap.dedent("""
# Mob: minecraft:chicken
Mob: minecraft:chicken
* habitat 1
* altitude: lowlands-uplands
* biomeFilter:
* Heat: tropical
* Humidity: wet
* Flora: any of: canopy, forest, clearing
* seasons: summer
* group: troup
* location: outside
* scarcity: common
* habitat 2
* altitude: lowlands-uplands
* biomeFilter:
* Heat: tropical
* Humidity: wet
* Flora: any of: canopy, forest, clearing
* seasons: spring, autumn, winter
* group: troup
* location: outside
* scarcity: uncommon
Habitat 1
altitude: lowlands to uplands (70 to 124)
biomeFilter: tropical and wet and (canopy or forest or clearing)
seasons: summer
group: troup (3 to 6)
location: outside
scarcity: common
Habitat 2
altitude: lowlands to uplands (70 to 124)
biomeFilter: tropical and wet and (canopy or forest or clearing)
seasons: spring, autumn, winter
group: troup (3 to 6)
location: outside
scarcity: uncommon
""").strip()
+9 -1
View File
@@ -24,6 +24,14 @@ class TextComposer:
def doCompose(self):
raise NotImplementedError()
def include(self, composer:"TextComposer") -> Self:
composer.reset()
composer.compose()
for line in composer._lines:
self._lines.append(line)
return self
def indent(self) -> Self:
self._indent += 1
self._lineBuffer.insert(0, self._indentText)
@@ -32,7 +40,7 @@ class TextComposer:
def line(self, text:Any="") -> Self:
self.text(text)
self._lines.append("".join(self._lineBuffer))
self._lines.append("".join(self._lineBuffer).rstrip())
self._lineBuffer = []
while len(self._lineBuffer) < self._indent:
self._lineBuffer.append(self._indentText)
+9
View File
@@ -0,0 +1,9 @@
import mcpacker.model.blockfactory
# Tests ############################################################################################
def test_syntax():
pass
# TODO: add some meaningful tests
+9 -4
View File
@@ -23,10 +23,10 @@ class Altitude:
return hash((self.bottom, self.top))
def __str__(self) -> str:
return self.name
return f"{self.name} ({self.bottom} to {self.top})"
def __repr__(self) -> str:
return f"{self.name} <{self.bottom} to {self.top}>"
return f"Altitude(name={self.name}, bottom={self.bottom}, top={self.top})"
# Constants ########################################################################################
@@ -43,7 +43,7 @@ LOWLANDS = Altitude("lowlands", 70, 92)
DUNES = Altitude("dunes", 62, 70)
# Transition
EVAPORATES = Altitude("evaporates", 60, 64)
EVAPORITES = Altitude("evaporites", 60, 64)
ANYWHERE = Altitude("anywhere", -64, 320)
# Underground
@@ -65,6 +65,8 @@ OVERGROUND = (DUNES, LOWLANDS, UPLANDS, HILLS, ALPINE, CRAGS, PEAKS, SUMMIT, SK
UNDERGROUND = (SOIL, SUBSTRATE, OVERBURDEN, CRUST, MANTLE, PLUTONIC)
UNDERWATER = (SURFACE, SHALLOWS, DEEPS, ABYSS)
ALL = OVERGROUND + UNDERGROUND + UNDERWATER
# Helper Functions #################################################################################
@@ -87,5 +89,8 @@ def span(*altitudes:Altitude):
top = altitude.top
topAltitude = altitude
result = Altitude(f"{bottomAltitude.name}-{topAltitude.name}", bottom, top)
if bottomAltitude == topAltitude:
return bottomAltitude
result = Altitude(f"{bottomAltitude.name} to {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.name == "lowlands to uplands"
assert merged.bottom == A.LOWLANDS.bottom
assert merged.top == A.UPLANDS.top
+9 -9
View File
@@ -45,18 +45,18 @@ class Biome(object):
return hash((self.gameId, self.city))
def __str__(self) -> str:
return f"{self.city}<{self.gameId}>"
return f"{self.gameId} ({self.city})"
def __repr__(self) -> str:
return "".join([str(p) for p in [
str(self), "{",
repr(self.flora), ", ",
repr(self.geology), ", ",
repr(self.heat), ", ",
repr(self.humidity), ", ",
repr(self.soil), ", ",
repr(self.water),
"}"
"Biome(",
"flora=", repr(self.flora), ", ",
"geology=", repr(self.geology), ", ",
"heat=", repr(self.heat), ", ",
"humidity=", repr(self.humidity), ", ",
"soil=", repr(self.soil), ", ",
"water=", repr(self.water),
")"
]])
def traits(self) -> list[BiomeTrait]:
+14 -9
View File
@@ -32,6 +32,14 @@ class BiomeFilter:
self.required = required or []
self.prohibited = prohibited or []
def __repr__(self) -> str:
return (
"BiomeFilter(" +
f"required={repr(self.required)}, " +
f"prohibited={repr(self.prohibited)}" +
")"
)
def __str__(self) -> str:
required = []
for trait in self.required:
@@ -39,26 +47,23 @@ class BiomeFilter:
required.append(str(trait))
else:
required.append("(" +
", ".join([str(option) for option in trait]) +
" or ".join([str(option) for option in trait]) +
")")
prohibited = []
for trait in self.prohibited:
prohibited.append(str(trait))
if not prohibited:
result = " and ".join(required)
else:
result = "".join([
"must:[",
", ".join(required),
"], not:[",
", ".join(prohibited),
"]"
"must:[", " and ".join(required), "], ",
"not:[", " and ".join(prohibited), "]",
])
return result
def __repr__(self) -> str:
return f"BiomeFilter([{repr(self.required)}], [{repr(self.prohibited)}])"
def accepts(self, biome: Biome) -> bool:
biomeTraits = biome.traits()
+2 -2
View File
@@ -20,10 +20,10 @@ class BiomeTrait:
return hash((type(self).__name__, self.name))
def __str__(self):
return f"{type(self).__name__}: {self.name}"
return self.name
def __repr__(self) -> str:
return f"{type(self).__name__}<{self.name}>"
return f"{type(self).__name__}(name='{self.name}')"
# Type Support #####################################################################################
@@ -49,10 +49,10 @@ def test_hash(green, blue, traitMap):
assert traitMap[blue] == "sapphire"
def test_repr(green):
assert repr(green) == "BiomeTrait<green>"
assert repr(green) == "BiomeTrait(name='green')"
def test_str(green):
assert str(green) == "BiomeTrait: green"
assert str(green) == "green"
def test_within(traitList, green, yellow, orange):
assert biomeTrait.within(traitList, green, orange) == [green, yellow, orange]
+3 -3
View File
@@ -20,10 +20,10 @@ class Group:
return hash((self.smallest, self.largest))
def __str__(self) -> str:
return self.name
return f"{self.name} ({self.smallest} to {self.largest})"
def __repr__(self) -> str:
return str(self) + f"<{self.smallest} to {self.largest}>"
return f"Group(name='{self.name}', smallest={self.smallest}, largest={self.largest})"
# Constants ########################################################################################
@@ -57,4 +57,4 @@ def merge(*groups:Group):
largest = group.largest
largestGroup = group
return Group(f"{smallestGroup.name}-{largestGroup.name}", smallest, largest)
return Group(f"{smallestGroup.name} to {largestGroup.name}", smallest, largest)
+1 -1
View File
@@ -15,7 +15,7 @@ class Location:
return self.name
def __repr__(self) -> str:
return f"Location<{self.name}>"
return f"Location(name='{self.name}')"
# Constants ########################################################################################
+19 -11
View File
@@ -28,17 +28,25 @@ def createMobSpawn(cow, fields):
def test_cowsInFields(spawn):
assert str(spawn) == (
"Spawn{" +
"habitats: [" +
"Habitat{" +
"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>, " +
"location: Location<outside>, " +
"scarcity: Scarcity<sparse>" +
"}" +
"Spawn(" +
"habitats=[" +
"Habitat(" +
"altitude=Altitude(name=anywhere, bottom=-64, top=320), " +
"biomeFilter=BiomeFilter(" +
"required=[Flora(name='field'), Heat(name='temperate')], " +
"prohibited=[]" +
"), " +
"seasons=[" +
"Season(name='spring'), " +
"Season(name='summer'), " +
"Season(name='autumn'), " +
"Season(name='winter')" +
"], " +
"group=Group(name='solo', smallest=1, largest=1), " +
"location=Location(name='outside'), " +
"scarcity=Scarcity(name='sparse')" +
")" +
"]" +
"}"
")"
)
+18 -7
View File
@@ -1,3 +1,4 @@
from typing import Any
import math
@@ -10,11 +11,19 @@ class Bulk:
self.smallest = smallest
self.largest = largest
def __str__(self) -> str:
return self.name
def __eq__(self, other:Any) -> bool:
if type(self) != type(other): return False
if self.name != other.name: return False
return True
def __hash__(self) -> int:
return hash(self.name)
def __repr__(self) -> str:
return f"Bulk<{self.name}>{{smallest: {self.smallest}, largest: {self.largest}}}"
return f"Bulk(name='{self.name}', smallest={self.smallest}, largest={self.largest})"
def __str__(self) -> str:
return f"{self.name} ({self.smallest} to {self.largest})"
def scale(self, factor) -> "Bulk":
return Bulk(
@@ -26,8 +35,10 @@ class Bulk:
# Constants ########################################################################################
SMALL = Bulk("tiny", 250, 500)
MEDIUM = Bulk("small", 500, 1000)
LARGE = Bulk("small", 1000, 2000)
TINY = Bulk("tiny", 250, 500)
SMALL = Bulk("small", 500, 750)
MEDIUM = Bulk("small", 750, 1000)
LARGE = Bulk("large", 1250, 1500)
HUGE = Bulk("huge", 1500, 1750)
ALL = [SMALL, MEDIUM, LARGE]
ALL = [TINY, SMALL, MEDIUM, LARGE, HUGE]
+2 -2
View File
@@ -16,5 +16,5 @@ def scaleBulk(bulk):
# Fixture ##########################################################################################
def test_repr(bulk, scaledBulk):
assert repr(bulk) == "Bulk<chunk>{smallest: 64, largest: 128}"
assert repr(scaledBulk) == "Bulk<chunk>{smallest: 128, largest: 256}"
assert repr(bulk) == "Bulk(name='chunk', smallest=64, largest=128)"
assert repr(scaledBulk) == "Bulk(name='chunk', smallest=128, largest=256)"
@@ -1,8 +1,12 @@
from collections.abc import Iterable
from mcpacker.model.core.altitude import Altitude
from mcpacker.model.core.ecology.biome import Biome
from mcpacker.model.core.ecology.biomefilter import BiomeFilter
from mcpacker.model.core.geology.bulk import Bulk
from mcpacker.model.core.geology.mineral import Mineral
from mcpacker.model.core.scarcity import Scarcity
import mcpacker.model.core.altitude as altitude
import mcpacker.model.core.scarcity as scarcity
@@ -13,11 +17,40 @@ class Deposit:
def __init__(
self,
name:str,
altitude:Altitude=altitude.ANYWHERE,
biomeFilters:Iterable[BiomeFilter]|BiomeFilter|None=None,
scarcity:Scarcity=scarcity.SPARSE,
biomeFilter:BiomeFilter|None=None,
):
self.name = name
self.altitude = altitude
self.biomeFilters:list[BiomeFilter] = []
self.gameId = name
self.biomeFilter = biomeFilter or BiomeFilter()
self.name = name
self.scarcity = scarcity
if not biomeFilters:
biomeFilters = [BiomeFilter()]
if isinstance(biomeFilters, BiomeFilter):
biomeFilters = [biomeFilters]
for biomeFilter in biomeFilters:
self.biomeFilters.append(biomeFilter)
def __repr__(self) -> str:
return "".join([str(p) for p in [
"Deposit(",
"name=", self.name, ", ",
"altitude=", repr(self.altitude), ", ",
"biomeFilters=[", ", ".join(repr(self.biomeFilters)), "], ",
"scarcity=", repr(self.scarcity),
")"
]])
def __str__(self) -> str:
return self.name
def acceptsBiome(self, biome:Biome) -> bool:
for biomeFilter in self.biomeFilters:
if biomeFilter.accepts(biome): return True
return False
@@ -0,0 +1,25 @@
from collections.abc import Iterable
from mcpacker.model.core.altitude import Altitude
from mcpacker.model.core.ecology.biomefilter import BiomeFilter
from mcpacker.model.core.geology.bulk import Bulk
from mcpacker.model.core.geology.deposit import Deposit
from mcpacker.model.core.geology.mineral import Mineral
from mcpacker.model.core.scarcity import Scarcity
import mcpacker.model.core.altitude as altitude
import mcpacker.model.core.scarcity as scarcity
# Class ############################################################################################
class GeodeDeposit(Deposit):
def __init__(
self,
name:str,
altitude:Altitude=altitude.ANYWHERE,
biomeFilters:Iterable[BiomeFilter]|BiomeFilter|None=None,
scarcity:Scarcity=scarcity.SPARSE,
):
super().__init__(name, altitude, biomeFilters, scarcity)
# TODO: add geode layers
@@ -0,0 +1,7 @@
import mcpacker.model.core.geology.deposit.geodedeposit
# Class ############################################################################################
def test_syntax():
pass
@@ -1,44 +0,0 @@
from collections.abc import Iterable
from mcpacker.model.core.ecology.biomefilter import BiomeFilter
from mcpacker.model.core.geology.bulk import Bulk
from mcpacker.model.core.geology.deposit import Deposit
from mcpacker.model.core.geology.inclusion import Inclusion
from mcpacker.model.core.geology.proportion import Proportion
from mcpacker.model.core.scarcity import Scarcity
import mcpacker.model.core.geology.bulk as BU
import mcpacker.model.core.geology.proportion as PR
import mcpacker.model.core.scarcity as SC
# Class ############################################################################################
class MetalDeposit(Deposit):
def __init__(
self,
name:str,
inclusions:Iterable[Inclusion],
bulk:Bulk=BU.MEDIUM,
proportion:Proportion=PR.BODY,
biomeFilter:BiomeFilter|None=None,
scarcity:Scarcity=SC.SPARSE,
):
super().__init__(name, scarcity, biomeFilter)
self.inclusions = inclusions
self.bulk = bulk
self.proportion = proportion
def __str__(self) -> str:
return self.name
def __repr__(self) -> str:
return "".join([str(p) for p in [
"MetalDeposit<", self.name, ">{",
"scarcity: ", repr(self.scarcity), ", ",
"biomeFilter: ", self.biomeFilter, ", ",
"inclusions: [", ", ".join([repr(m) for m in self.inclusions]), "], ",
"bulk: ", repr(self.bulk), ", ",
"proportion: ", repr(self.proportion),
"}"
]])
@@ -0,0 +1,50 @@
from collections.abc import Iterable
from mcpacker.model.core.altitude import Altitude
from mcpacker.model.core.ecology.biomefilter import BiomeFilter
from mcpacker.model.core.geology.bulk import Bulk
from mcpacker.model.core.geology.deposit import Deposit
from mcpacker.model.core.geology.inclusion import Inclusion
from mcpacker.model.core.geology.proportion import Proportion
from mcpacker.model.core.scarcity import Scarcity
import mcpacker.model.core.altitude as AL
import mcpacker.model.core.geology.bulk as BU
import mcpacker.model.core.geology.proportion as PR
import mcpacker.model.core.scarcity as SC
# Class ############################################################################################
class MineralDeposit(Deposit):
def __init__(
self,
name:str,
altitude:Altitude=AL.ANYWHERE,
biomeFilters:Iterable[BiomeFilter]|BiomeFilter|None=None,
bulk:Bulk=BU.MEDIUM,
inclusions:Iterable[Inclusion]|None=None,
proportion:Proportion=PR.BODY,
scarcity:Scarcity=SC.SPARSE,
):
super().__init__(name, altitude, biomeFilters, scarcity)
self.bulk = bulk
self.inclusions = inclusions or []
self.proportion = proportion
def __repr__(self) -> str:
return "".join([str(p) for p in [
"MineralDeposit(" +
"name=", repr(self.name), ", ",
"altitude=", repr(self.altitude), ", ",
"biomeFilters=", repr(self.biomeFilters), ", ",
"bulk=", repr(self.bulk), ", ",
"inclusions=[", ", ".join([repr(m) for m in self.inclusions]), "], ",
"proportion=", repr(self.proportion), ", ",
"scarcity=", repr(self.scarcity),
")"
]])
def __str__(self) -> str:
return self.name
@@ -1,5 +1,5 @@
from mcpacker.model.core.ecology.biomefilter import BiomeFilter
from mcpacker.model.core.geology.deposit.metaldeposit import MetalDeposit
from mcpacker.model.core.geology.deposit.mineraldeposit import MineralDeposit
from mcpacker.model.core.geology.inclusion import Inclusion
from mcpacker.model.core.geology.mineral import Mineral
from mcpacker.model.core.geology.replacement import Replacement
@@ -15,23 +15,17 @@ import mcpacker.model.core.scarcity as SC
@fixture(name="quartz")
def createQuartz():
yield Mineral("quartz", [
Replacement("#minecraft:stone_replaceables", "minecraft:quartz_ore"),
Replacement("#minecraft:deepslate_replaceables", "minecraft:deepslate_quartz_ore")
])
yield Mineral("quartz", [])
@fixture(name="iron")
def createIron():
yield Mineral("iron", [
Replacement("#minecraft:stone_replaceables", "minecraft:iron_ore"),
Replacement("#minecraft:deepslate_replaceables", "minecraft:deepslate_iron_ore")
])
yield Mineral("iron", [])
@fixture(name="bifIron")
def createBifIron(iron, quartz):
yield MetalDeposit(
yield MineralDeposit(
name = "bifiron",
biomeFilter = BiomeFilter([FL.FOREST]),
biomeFilters = BiomeFilter([FL.FOREST]),
bulk = BU.LARGE,
inclusions = [Inclusion(iron, 60), Inclusion(quartz, 40)],
proportion = PR.LENS,
@@ -42,14 +36,16 @@ def createBifIron(iron, quartz):
def test_repr(bifIron):
assert repr(bifIron) == (
"MetalDeposit<bifiron>{" +
"scarcity: Scarcity<common>, " +
"biomeFilter: must:[Flora: forest], not:[], " +
"inclusions: [" +
"Inclusion{mineral: iron, weight: 60}, " +
"Inclusion{mineral: quartz, weight: 40}" +
"MineralDeposit(" +
"name='bifiron', " +
"altitude=Altitude(name=anywhere, bottom=-64, top=320), " +
"biomeFilters=[BiomeFilter(required=[Flora(name='forest')], prohibited=[])], " +
"bulk=Bulk(name='large', smallest=1250, largest=1500), " +
"inclusions=[" +
"Inclusion(mineral=Mineral(name='iron', replacements=[]), weight=60), " +
"Inclusion(mineral=Mineral(name='quartz', replacements=[]), weight=40)" +
"], " +
"bulk: Bulk<small>{smallest: 1000, largest: 2000}, " +
"proportion: Proportion<lens>{ratio: 0.4}" +
"}"
"proportion=Proportion(name='lens', ratio=0.4), " +
"scarcity=Scarcity(name='common')" +
")"
)
+4 -4
View File
@@ -17,8 +17,8 @@ class Inclusion:
def __repr__(self) -> str:
return "".join([str(p) for p in [
"Inclusion{",
"mineral: ", self.mineral.name, ", ",
"weight: ", self.weight,
"}"
"Inclusion(",
"mineral=", repr(self.mineral), ", ",
"weight=", repr(self.weight),
")"
]])
@@ -8,10 +8,7 @@ from pytest import fixture
@fixture(name="iron")
def createIron():
yield Mineral("iron", [
Replacement("#minecraft:stone_replaceables", "minecraft:iron_ore"),
Replacement("#minecraft:deepslate_replaceables", "minecraft:deepslate_iron_ore")
])
yield Mineral("iron", [])
@fixture(name="inclusion")
def createInclusion(iron):
@@ -21,4 +18,4 @@ def createInclusion(iron):
# Tests ############################################################################################I
def test_repr(inclusion):
assert repr(inclusion) == "Inclusion{mineral: iron, weight: 75}"
assert repr(inclusion) == "Inclusion(mineral=Mineral(name='iron', replacements=[]), weight=75)"
+4 -5
View File
@@ -17,9 +17,8 @@ class Mineral:
def __repr__(self) -> str:
return "".join([str(p) for p in [
f"Mineral<{self.name}>", "{",
"replacements: [",
", ".join([str(r) for r in self.replacements]),
"]",
"}"
f"Mineral(" +
"name=", repr(self.name), ", ",
"replacements=", repr(self.replacements),
")"
]])
+14 -5
View File
@@ -19,10 +19,19 @@ def createIron():
def test_repr(iron):
assert repr(iron) == (
"Mineral<iron>{" +
"replacements: [" +
"#minecraft:stone_ore_replaceables => minecraft:iron_ore, " +
"#minecraft:deepslate_ore_replaceables => minecraft:deepslate_iron_ore" +
"Mineral(" +
"name='iron', " +
"replacements=[" +
"Replacement(" +
"source='#minecraft:stone_ore_replaceables', " +
"target='minecraft:iron_ore', " +
"weight=100" +
"), " +
"Replacement(" +
"source='#minecraft:deepslate_ore_replaceables', " +
"target='minecraft:deepslate_iron_ore', " +
"weight=100" +
")"
"]" +
"}"
")"
)
+2 -2
View File
@@ -15,10 +15,10 @@ class Proportion:
return hash(self.name)
def __str__(self) -> str:
return self.name
return f"{self.name} ({self.ratio})"
def __repr__(self) -> str:
return f"Proportion<{self.name}>{{ratio: {self.ratio}}}"
return f"Proportion(name='{self.name}', ratio={self.ratio})"
# Constants ########################################################################################
@@ -6,7 +6,7 @@ import mcpacker.model.core.geology.proportion as proportion
# Tests ############################################################################################
def test_str():
assert str(proportion.LENS) == "lens"
assert str(proportion.LENS) == "lens (0.4)"
def test_repr():
assert repr(proportion.LENS) == "Proportion<lens>{ratio: 0.4}"
assert repr(proportion.LENS) == "Proportion(name='lens', ratio=0.4)"
+5 -5
View File
@@ -32,9 +32,9 @@ class Replacement:
def __repr__(self) -> str:
return "".join([str(p) for p in [
"Replacement{" +
"source: ", self.source, ", ",
"target: ", self.target, ", ",
"weight: ", self.weight,
"}"
"Replacement(" +
"source=", repr(self.source), ", ",
"target=", repr(self.target), ", ",
"weight=", repr(self.weight),
")"
]])
@@ -17,10 +17,10 @@ def createWeightedReplacement():
def test_repr(replacement, weightedReplacement):
assert repr(replacement) == (
"Replacement{source: #minecraft:stone, target: minecraft:iron_ore, weight: 100}"
"Replacement(source='#minecraft:stone', target='minecraft:iron_ore', weight=100)"
)
assert repr(weightedReplacement) == (
"Replacement{source: #minecraft:dirt, target: minecraft:gravel, weight: 25}"
"Replacement(source='#minecraft:dirt', target='minecraft:gravel', weight=25)"
)
def test_str(replacement, weightedReplacement):
+8 -8
View File
@@ -53,14 +53,14 @@ class Habitat:
def __repr__(self) -> str:
return "".join([str(p) for p in [
"Habitat{",
"altitude: ", repr(self.altitude), ", ",
"biomeFilter: ", repr(self.biomeFilter), ", ",
"seasons: [", ", ".join([repr(s) for s in self.seasons]), "], ",
"group: ", repr(self.group), ", ",
"location: ", repr(self.location), ", ",
"scarcity: ", repr(self.scarcity),
"}"
"Habitat(",
"altitude=", repr(self.altitude), ", ",
"biomeFilter=", repr(self.biomeFilter), ", ",
"seasons=[", ", ".join([repr(s) for s in self.seasons]), "], ",
"group=", repr(self.group), ", ",
"location=", repr(self.location), ", ",
"scarcity=", repr(self.scarcity),
")"
]])
def derive(
+16 -8
View File
@@ -34,12 +34,20 @@ def test_derive(derivedHabitats):
def test_repr(fields):
assert repr(fields) == (
"Habitat{" +
"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>, " +
"location: Location<outside>, " +
"scarcity: Scarcity<sparse>" +
"}"
"Habitat(" +
"altitude=Altitude(name=anywhere, bottom=-64, top=320), " +
"biomeFilter=BiomeFilter(" +
"required=[Flora(name='field'), Heat(name='temperate')], " +
"prohibited=[]"
"), " +
"seasons=[" +
"Season(name='spring'), " +
"Season(name='summer'), " +
"Season(name='autumn'), " +
"Season(name='winter')" +
"], " +
"group=Group(name='solo', smallest=1, largest=1), " +
"location=Location(name='outside'), " +
"scarcity=Scarcity(name='sparse')" +
")"
)
+1 -1
View File
@@ -12,7 +12,7 @@ class Scarcity:
return self.name
def __repr__(self) -> str:
return f"Scarcity<{self.name}>"
return f"Scarcity(name='{self.name}')"
# Constants ########################################################################################
+1 -1
View File
@@ -12,7 +12,7 @@ class Season:
return self.name
def __repr__(self) -> str:
return f"Season<{self.name}>"
return f"Season(name='{self.name}')"
# Constants ########################################################################################
+3 -3
View File
@@ -18,7 +18,7 @@ class Spawn:
def __repr__(self) -> str:
return (
"Spawn{" +
f"habitats: [{', '.join([repr(h) for h in self.habitats])}]" +
"}"
"Spawn(" +
f"habitats=[{', '.join([repr(h) for h in self.habitats])}]" +
")"
)
+18 -12
View File
@@ -22,17 +22,23 @@ def createSpawn(fields):
def test_repr(spawn):
assert repr(spawn) == (
"Spawn{" +
"habitats: [" +
"Habitat{" +
"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>, " +
"location: Location<outside>, " +
"scarcity: Scarcity<sparse>" +
"}" +
"]" +
"}"
"Spawn(habitats=[" +
"Habitat(" +
"altitude=Altitude(name=anywhere, bottom=-64, top=320), " +
"biomeFilter=BiomeFilter(" +
"required=[Flora(name='field'), Heat(name='temperate')], " +
"prohibited=[]" +
"), "
"seasons=[" +
"Season(name='spring'), " +
"Season(name='summer'), " +
"Season(name='autumn'), " +
"Season(name='winter')" +
"], " +
"group=Group(name='solo', smallest=1, largest=1), " +
"location=Location(name='outside'), " +
"scarcity=Scarcity(name='sparse')" +
")" +
"])"
)
@@ -0,0 +1,10 @@
import mcpacker.model.resourcepack.blockstate
# Tests ############################################################################################
def test_syntax():
pass
# TODO: add some meaningful tests
+13 -14
View File
@@ -1,5 +1,4 @@
from mcpacker.model.core.ecology.biome import Biome
from mcpacker.model.core.ecology.biomefilter import BiomeFilter
from mcpacker.model.modpack import ModPack
import mcpacker.model.core.ecology.flora as FL
@@ -40,14 +39,14 @@ def addBiomes(pack:ModPack):
))
biomes.add(Biome("calcutta", "minecraft:mangrove_swamp",
FL.FOREST, GE.SEDIMENTARY, HE.SUBTROPICAL, HU.WET, SO.CLAYEY, WA.INLAND
FL.FOREST, GE.SEDIMENTARY, HE.TROPICAL, HU.WET, SO.CLAYEY, WA.SWAMP
))
biomes.add(Biome("cornwall", "minecraft:windswept_hills",
FL.BARREN, GE.METAMORPHIC, HE.BOREAL, HU.DAMP, SO.ROCKY, WA.INLAND
))
biomes.add(Biome("dallas", "minecraft:savanna",
biomes.add(Biome("dakar", "minecraft:savanna",
FL.FIELD, GE.SEDIMENTARY, HE.SUBTROPICAL, HU.DRY, SO.SANDY, WA.INLAND
))
@@ -55,7 +54,7 @@ def addBiomes(pack:ModPack):
FL.BARREN, GE.SEDIMENTARY, HE.FROZEN, HU.WET, SO.SANDY, WA.RIVER
))
biomes.add(Biome("durango", "minecraft:savanna_plateau",
biomes.add(Biome("khartoum", "minecraft:savanna_plateau",
FL.FIELD, GE.IGNEOUS, HE.SUBTROPICAL, HU.DRY, SO.SANDY, WA.INLAND
))
@@ -83,16 +82,16 @@ def addBiomes(pack:ModPack):
FL.BARREN, GE.SEDIMENTARY, HE.SUBTROPICAL, HU.WET, SO.SANDY, WA.OCEAN
))
biomes.add(Biome("hilo", "minecraft:mushroom_fields",
FL.CLEARING, GE.IGNEOUS, HE.SUBTROPICAL, HU.WET, SO.FUNGAL, WA.INLAND
biomes.add(Biome("tahiti", "minecraft:mushroom_fields",
FL.CLEARING, GE.IGNEOUS, HE.TROPICAL, HU.WET, SO.FUNGAL, WA.INLAND
))
biomes.add(Biome("honolulu", "minecraft:deep_ocean",
FL.BARREN, GE.SEDIMENTARY, HE.TEMPERATE, HU.WET, SO.SANDY, WA.OCEAN
FL.BARREN, GE.IGNEOUS, HE.TEMPERATE, HU.WET, SO.SANDY, WA.OCEAN
))
biomes.add(Biome("innnesbruk", "minecraft:meadow",
FL.FIELD, GE.SEDIMENTARY, HE.BOREAL, HU.DAMP, SO.PEATY, WA.INLAND
biomes.add(Biome("innsbruck", "minecraft:meadow",
FL.FIELD, GE.IGNEOUS, HE.BOREAL, HU.DAMP, SO.LOAMY, WA.INLAND
))
biomes.add(Biome("irkutsk", "minecraft:taiga",
@@ -140,7 +139,7 @@ def addBiomes(pack:ModPack):
))
biomes.add(Biome("moscow", "minecraft:snowy_plains",
FL.FIELD, GE.SEDIMENTARY, HE.FROZEN, HU.DAMP, SO.LOAMY, WA.INLAND
FL.FIELD, GE.SEDIMENTARY, HE.FROZEN, HU.DAMP, SO.PEATY, WA.INLAND
))
biomes.add(Biome("nassau", "minecraft:warm_ocean",
@@ -159,7 +158,7 @@ def addBiomes(pack:ModPack):
FL.FOREST, GE.METAMORPHIC, HE.BOREAL, HU.DAMP, SO.ACIDIC, WA.INLAND
))
biomes.add(Biome("phoenix", "minecraft:desert",
biomes.add(Biome("timbuktu", "minecraft:desert",
FL.BARREN, GE.SEDIMENTARY, HE.TROPICAL, HU.DRY, SO.SANDY, WA.INLAND
))
@@ -167,7 +166,7 @@ def addBiomes(pack:ModPack):
FL.BARREN, GE.METAMORPHIC, HE.TEMPERATE, HU.DAMP, SO.ROCKY, WA.COAST
))
biomes.add(Biome("portland", "minecraft:forest",
biomes.add(Biome("sherwood", "minecraft:forest",
FL.FOREST, GE.SEDIMENTARY, HE.TEMPERATE, HU.DAMP, SO.LOAMY, WA.INLAND
))
@@ -176,7 +175,7 @@ def addBiomes(pack:ModPack):
))
biomes.add(Biome("rangoon", "minecraft:bamboo_jungle",
FL.BARREN, GE.SEDIMENTARY, HE.SUBTROPICAL, HU.DRY, SO.LOAMY, WA.INLAND
FL.FOREST, GE.SEDIMENTARY, HE.TROPICAL, HU.WET, SO.ACIDIC, WA.INLAND
))
biomes.add(Biome("sanfrancisco", "minecraft:ocean",
@@ -195,7 +194,7 @@ def addBiomes(pack:ModPack):
FL.BARREN, GE.SEDIMENTARY, HE.SUBTROPICAL, HU.DRY, SO.CLAYEY, WA.INLAND
))
biomes.add(Biome("topeka", "minecraft:sunflower_plains",
biomes.add(Biome("stlouis", "minecraft:sunflower_plains",
FL.FIELD, GE.SEDIMENTARY, HE.TEMPERATE, HU.DAMP, SO.LOAMY, WA.INLAND
))
+221 -5
View File
@@ -1,5 +1,6 @@
from mcpacker.model.core.ecology.biomefilter import BiomeFilter as BF
from mcpacker.model.core.geology.deposit.metaldeposit import MetalDeposit
from mcpacker.model.core.geology.deposit.geodedeposit import GeodeDeposit
from mcpacker.model.core.geology.deposit.mineraldeposit import MineralDeposit
from mcpacker.model.core.geology.inclusion import Inclusion as I
from mcpacker.model.modpack import ModPack
@@ -14,21 +15,236 @@ import mcpacker.model.core.geology.bulk as BU
import mcpacker.model.core.geology.proportion as PR
import mcpacker.model.core.scarcity as SC
# Catalog ##########################################################################################
def addDeposits(pack:ModPack):
minerals = pack.world.minerals
deposits = pack.world.deposits
deposits.add(MetalDeposit(
# Geode Deposits ###########################################################
deposits.add(GeodeDeposit(
name = "geode_amethyst",
altitude = AL.span(AL.MANTLE, AL.CRUST),
# TODO: these filter exclude all biomes
biomeFilters = BF([GE.IGNEOUS, HE.TEMPERATE, HU.DAMP]),
scarcity = SC.UNCOMMON,
))
deposits.add(GeodeDeposit(
name = "geode_kimberlite",
altitude = AL.span(AL.MANTLE, AL.CRUST),
biomeFilters = BF([GE.IGNEOUS]),
scarcity = SC.SPARSE,
))
deposits.add(MineralDeposit(
name = "hydrothermal_emerald",
altitude = AL.span(AL.CRUST, AL.SUBSTRATE),
biomeFilters = BF([HE.FROZEN, GE.METAMORPHIC, SO.ROCKY]),
scarcity = SC.UNCOMMON,
))
# Metal Deposits ###########################################################
deposits.add(MineralDeposit(
name = "bif_iron",
scarcity = SC.COMMON,
biomeFilter = BF([GE.METAMORPHIC, (HE.BOREAL, HE.FROZEN), HU.DAMP]),
altitude = AL.span(AL.CRUST, AL.SUBSTRATE),
biomeFilters = BF([FL.FIELD, HE.SUBTROPICAL, HU.DRY]),
bulk = BU.LARGE,
inclusions = [
I(minerals["iron"], 50),
I(minerals["quartz"], 45),
I(minerals["uranium"], 5)
],
bulk = BU.LARGE,
proportion = PR.BED,
scarcity = SC.UNCOMMON,
))
deposits.add(MineralDeposit(
name = "epithermal_silver",
altitude = AL.span(AL.OVERBURDEN, AL.SUBSTRATE),
biomeFilters = BF([(HE.BOREAL, HE.FROZEN), SO.ROCKY, GE.IGNEOUS]),
bulk = BU.SMALL,
inclusions = [I(minerals["silver"], 75), I(minerals["gold"], 25)],
proportion = PR.PIPE,
scarcity = SC.RARE,
))
deposits.add(MineralDeposit(
name = "greisen_tin",
altitude = AL.span(AL.OVERBURDEN, AL.SUBSTRATE),
biomeFilters = BF([HE.BOREAL, SO.ROCKY, GE.METAMORPHIC]),
bulk = BU.MEDIUM,
inclusions = [I(minerals["tin"], 100)],
proportion = PR.STOCK,
scarcity = SC.COMMON,
))
deposits.add(MineralDeposit(
name = "laterite_aluminum",
altitude = AL.span(AL.DUNES, AL.UPLANDS),
biomeFilters = BF([FL.within(FL.CANOPY, FL.CLEARING), HU.WET, HE.TROPICAL, GE.SEDIMENTARY]),
bulk = BU.MEDIUM,
inclusions = [I(minerals["aluminum"], 70), I(minerals["nickel"], 30)],
proportion = PR.LENS,
scarcity = SC.UNCOMMON,
))
deposits.add(MineralDeposit(
name = "mvt_lead",
altitude = AL.span(AL.CRUST, AL.SUBSTRATE),
biomeFilters = [
BF([FL.FIELD, GE.SEDIMENTARY, HE.TEMPERATE, HU.DAMP]),
BF([GE.SEDIMENTARY, HE.TEMPERATE, SO.CLAYEY]),
],
bulk = BU.MEDIUM,
inclusions = [
I(minerals["lead"], 45),
I(minerals["zinc"], 40),
I(minerals["silver"], 15),
],
proportion = PR.LODE,
scarcity = SC.SPARSE,
))
deposits.add(MineralDeposit(
name = "porphyry_copper",
altitude = AL.span(AL.MANTLE, AL.OVERBURDEN),
biomeFilters = BF([GE.SEDIMENTARY, HE.SUBTROPICAL, HU.DRY, SO.CLAYEY]),
bulk = BU.LARGE,
inclusions = [
I(minerals["copper"], 55),
I(minerals["redstone"], 25),
I(minerals["gold"], 20),
],
proportion = PR.PIPE,
scarcity = SC.UNUSUAL,
))
deposits.add(MineralDeposit(
name = "sedimentary_iron",
altitude = AL.span(AL.OVERBURDEN, AL.SOIL),
biomeFilters = BF([
FL.within(FL.CANOPY, FL.CLEARING),
(HE.TEMPERATE, HE.BOREAL)
]),
bulk = BU.LARGE,
inclusions = [I(minerals["iron"], 100)],
proportion = PR.LODE,
scarcity = SC.COMMON,
))
deposits.add(MineralDeposit(
name = "serpentine_nickel",
altitude = AL.span(AL.UPLANDS, AL.HILLS),
biomeFilters = BF([GE.METAMORPHIC, (HU.DAMP, HU.WET), (SO.ACIDIC, SO.ROCKY)]),
bulk = BU.SMALL,
inclusions = [I(minerals["nickel"], 70), I(minerals["iron"], 30)],
proportion = PR.LENS,
scarcity = SC.UNCOMMON,
))
# Mineral Deposits #########################################################
deposits.add(MineralDeposit(
name = "evaporite_salt",
altitude = AL.EVAPORITES,
biomeFilters = BF([HE.TROPICAL, HU.DRY, SO.SANDY]),
bulk = BU.TINY,
inclusions = [I(minerals["salt"], 100)],
proportion = PR.BED,
scarcity = SC.SPARSE,
))
deposits.add(MineralDeposit(
name = "evaporite_nitrate",
altitude = AL.EVAPORITES,
biomeFilters = BF([FL.BARREN, HE.SUBTROPICAL, HU.DRY, SO.CLAYEY]),
bulk = BU.TINY,
inclusions = [I(minerals["nitrate"], 100)],
proportion = PR.BED,
scarcity = SC.SPARSE,
))
deposits.add(MineralDeposit(
name = "fumarole_sulfur",
altitude = AL.CRUST,
biomeFilters = BF([GE.IGNEOUS]),
bulk = BU.MEDIUM,
inclusions = [I(minerals["sulfur"], 100)],
proportion = PR.VENT,
scarcity = SC.UNUSUAL,
))
deposits.add(MineralDeposit(
name = "sedimentary_redbed",
altitude = AL.span(AL.SOIL, AL.HILLS),
biomeFilters = BF([GE.SEDIMENTARY, HE.SUBTROPICAL, HU.DRY, SO.CLAYEY]),
bulk = BU.SMALL,
inclusions = [I(minerals["redstone"], 80), I(minerals["iron"], 20)],
proportion = PR.BED,
scarcity = SC.UNCOMMON,
))
deposits.add(MineralDeposit(
name = "skarn_lapis",
altitude = AL.CRUST,
biomeFilters = BF([GE.METAMORPHIC, HE.BOREAL, SO.ROCKY]),
bulk = BU.LARGE,
inclusions = [
I(minerals["greywacke"], 50),
I(minerals["lapis"], 25),
I(minerals["diorite"], 10),
I(minerals["quartz"], 10),
I(minerals["iron"], 5),
],
proportion = PR.LENS,
scarcity = SC.SPARSE,
))
deposits.add(MineralDeposit(
name = "vein_quartz",
altitude = AL.span(AL.SUBSTRATE, AL.OVERBURDEN),
biomeFilters = BF([HE.TROPICAL, HU.DRY, SO.SANDY]),
bulk = BU.MEDIUM,
inclusions = [I(minerals["quartz"], 95), I(minerals["gold"], 5)],
proportion = PR.LODE,
scarcity = SC.UNUSUAL,
))
# Organic Deposits #########################################################
deposits.add(MineralDeposit(
name = "bed_loam",
altitude = AL.span(AL.SOIL),
biomeFilters = BF([HE.TEMPERATE, HU.DAMP, SO.LOAMY]),
bulk = BU.TINY,
inclusions = [I(minerals["loam"], 100)],
proportion = PR.BED,
scarcity = SC.COMMON,
))
deposits.add(MineralDeposit(
name = "seam_bituminouscoal",
altitude = AL.span(AL.CRUST, AL.OVERBURDEN),
biomeFilters = [
BF([FL.FOREST, GE.SEDIMENTARY, HE.TEMPERATE]),
BF([HE.BOREAL, GE.METAMORPHIC, (SO.ACIDIC, SO.ROCKY)]),
],
bulk = BU.HUGE,
inclusions = [I(minerals["coal"], 100)],
proportion = PR.BED,
scarcity = SC.COMMON,
))
deposits.add(MineralDeposit(
name = "seam_peatcoal",
altitude = AL.span(AL.SOIL),
biomeFilters = BF([SO.PEATY]),
bulk = BU.LARGE,
inclusions = [I(minerals["peat"], 100)],
proportion = PR.BED,
scarcity = SC.COMMON,
))
@@ -30,13 +30,13 @@ def makeOreMineral(name:str) -> Mineral:
def makeImmersiveEngineeringOreMineral(name:str) -> Mineral:
return Mineral(name, [
Replacement.inStone(f"{IE}:ore_{name}"),
Replacement.inDeepslate("{IE}:deepslate_ore_{name}")
Replacement.inDeepslate(f"{IE}:deepslate_ore_{name}")
])
def makeRailcraftOreMineral(name:str) -> Mineral:
return Mineral(name, [
Replacement.inStone(f"{RC}:{name}_ore"),
Replacement.inDeepslate("{RC}:deepslate_{name}_ore")
Replacement.inDeepslate(f"{RC}:deepslate_{name}_ore")
])
@@ -102,7 +102,7 @@ def addMinerals(pack:ModPack):
minerals.add(makeImmersiveEngineeringOreMineral("uranium"))
# Railcraft Ores
minerals.add(Mineral("saltpeter", [
minerals.add(Mineral("nitrate", [
Replacement("sand", f"{RC}:saltpeter_ore"),
Replacement("sandstone", f"{RC}:saltpeter_ore"),
]))
+5 -3
View File
@@ -1,4 +1,5 @@
from mcpacker.format.report.biomereport import BiomeReport
from mcpacker.format.report.depositreport import DepositReport
from mcpacker.format.report.mineralreport import MineralReport
from mcpacker.format.report.mobspawnreport import MobSpawnReport
from mcpacker.model.modpack import ModPack
@@ -49,9 +50,10 @@ class Runner:
def _command_writeReports(self):
CompositeWriter(self.pack, self.outputDir, [
ReportWriter(self.pack, BiomeReport, self.outputDir, "biomes.md"),
ReportWriter(self.pack, MineralReport, self.outputDir, "minerals.md"),
ReportWriter(self.pack, MobSpawnReport, self.outputDir, "mobspawns.md"),
ReportWriter(self.pack, BiomeReport, self.outputDir, "biomes.txt"),
ReportWriter(self.pack, DepositReport, self.outputDir, "deposits.txt"),
ReportWriter(self.pack, MineralReport, self.outputDir, "minerals.txt"),
ReportWriter(self.pack, MobSpawnReport, self.outputDir, "mobspawns.txt"),
]).write()
def _command_writeModPack(self):
+3 -3
View File
@@ -95,6 +95,6 @@ def test_writeModPack(tmp_path:Path, modPackRunner:Runner):
assert (tmp_path/"testpack"/"test.md").exists()
def test_writeReports(tmp_path:Path, reportRunner:Runner):
assert (tmp_path/"testpack"/"reports"/"biomes.md").exists()
assert (tmp_path/"testpack"/"reports"/"minerals.md").exists()
assert (tmp_path/"testpack"/"reports"/"mobspawns.md").exists()
assert (tmp_path/"testpack"/"reports"/"biomes.txt").exists()
assert (tmp_path/"testpack"/"reports"/"minerals.txt").exists()
assert (tmp_path/"testpack"/"reports"/"mobspawns.txt").exists()