Phase 6: Pokémon machines (five cores, shells as data)

Adrian (2026-10-31): a Large Furnace where a Fire Pokémon heats real
furnaces (hoppers in and out), our own Electric generator, no upkeep;
then a drop synthesizer (FE into full drop rolls, looting tiers), a
sacrifice altar (level tiers, rare candies only from Lv 80) and a
rebirth chamber (Lv 100 -> shiny Lv 1 first stage, three perfect IVs,
moves kept, Ability Patch so the hidden ability is optional).

- machine/: data-driven 3x3x3 shells (window spots for glass, free
  spot under the core), checked in four rotations; the Pokémon walks in
  from the party and lives in the core; breaking core or shell sends it
  home (party, else PC, offline too); a real Cobblemon entity copy is
  shown in the chamber (no AI, invulnerable, uncatchable, never saved).
- Heat Core keeps vanilla furnaces lit and faster; Dynamo Core makes
  and pushes FE; Synthesis Core takes FE and rolls drops into a hopper-
  extractable buffer; Altar Core sacrifices on a confirmed sneak-use;
  Rebirth Core runs on server time.
- Recipes, casing tags, block loot, textures (tools/machine_assets.py),
  models, blockstates, names.
- Self-tests: in/out, refusal, shell and core breaks (PC when full),
  chunk unload, server restart, and each machine's work.
- Docs: design, balance table, Phase 6 checklist; Phase 5 approved.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
claudeandClaude Opus 5.5 committed 2026-11-02 15:18:03 +01:00
1 parent 5cae9252c3
commit 0877a6a179
75 files changed
+2321 -7

No files matched your search

@@ -0,0 +1,21 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"bonus_rolls": 0,
"entries": [
{
"type": "minecraft:item",
"name": "cobblesurvival:altar_core"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
],
"random_sequence": "cobblesurvival:blocks/altar_core"
}
@@ -0,0 +1,21 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"bonus_rolls": 0,
"entries": [
{
"type": "minecraft:item",
"name": "cobblesurvival:dynamo_core"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
],
"random_sequence": "cobblesurvival:blocks/dynamo_core"
}
@@ -0,0 +1,21 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"bonus_rolls": 0,
"entries": [
{
"type": "minecraft:item",
"name": "cobblesurvival:heat_core"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
],
"random_sequence": "cobblesurvival:blocks/heat_core"
}
@@ -0,0 +1,21 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"bonus_rolls": 0,
"entries": [
{
"type": "minecraft:item",
"name": "cobblesurvival:rebirth_core"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
],
"random_sequence": "cobblesurvival:blocks/rebirth_core"
}
@@ -0,0 +1,21 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"bonus_rolls": 0,
"entries": [
{
"type": "minecraft:item",
"name": "cobblesurvival:synthesis_core"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
],
"random_sequence": "cobblesurvival:blocks/synthesis_core"
}
@@ -0,0 +1,132 @@
{
"_comment": "Sacrifice Altar (Adrian, 2026-10-31): sneak-use the core to see what the Pokémon inside would give, sneak-use again within confirm_ticks to sacrifice it (gone for good). The highest tier its level reaches gives its rewards; specials add theirs. Rare candies only from Lv 80, above the highest natural level (Basalt Furnace Lv 70, guardians Lv 75). Shape: layers bottom to top, rows north to south, columns west to east, as seen with the core in the south wall; checked in all four rotations. 'C' = the core, '.' = the chamber (air; the Pokémon stands there), '#' = casing, ' ' = anything (under the core, so a hopper can go there), 'W' = a window spot: casing or glass (the middle of each side wall and the top centre). Placeholder rewards; see docs/balance.md. Read by the companion mod (machine/).",
"core": "cobblesurvival:altar_core",
"kind": "altar",
"min_level": 20,
"layers": [
[
"###",
"###",
"# #"
],
[
"#W#",
"W.W",
"#C#"
],
[
"###",
"#W#",
"###"
]
],
"keys": {
"#": "#cobblesurvival:altar_casing",
"W": [
"#cobblesurvival:altar_casing",
"#c:glass_blocks"
]
},
"altar": {
"confirm_ticks": 100,
"tiers": [
{
"min_level": 20,
"rewards": [
{
"item": "cobblemon:exp_candy_s",
"count": 3
}
]
},
{
"min_level": 35,
"rewards": [
{
"item": "cobblemon:exp_candy_m",
"count": 3
}
]
},
{
"min_level": 50,
"rewards": [
{
"item": "cobblemon:exp_candy_l",
"count": 3
}
]
},
{
"min_level": 65,
"rewards": [
{
"item": "cobblemon:exp_candy_xl",
"count": 2
},
{
"item": "cobblemon:ability_capsule",
"count": 1
}
]
},
{
"min_level": 80,
"rewards": [
{
"item": "cobblemon:rare_candy",
"count": 3
},
{
"item": "cobblemon:exp_candy_xl",
"count": 2
}
]
},
{
"min_level": 90,
"rewards": [
{
"item": "cobblemon:rare_candy",
"count": 5
},
{
"item": "cobblemon:ability_patch",
"count": 1
}
]
},
{
"min_level": 100,
"rewards": [
{
"item": "cobblemon:rare_candy",
"count": 8
},
{
"item": "cobblemon:ability_patch",
"count": 1
},
{
"item": "minecraft:nether_star",
"count": 1
}
]
}
],
"specials": [
{
"types": [
"dragon"
],
"min_level": 100,
"rewards": [
{
"item": "minecraft:dragon_egg",
"count": 1
}
]
}
]
}
}
@@ -0,0 +1,38 @@
{
"_comment": "Generator (Adrian, 2026-10-31): an Electric Pokémon in the chamber makes Forge Energy, stored in the core and pushed to whatever touches the core and takes energy. Shape: layers bottom to top, rows north to south, columns west to east, as seen with the core in the south wall; checked in all four rotations. 'C' = the core, '.' = the chamber (air; the Pokémon stands there), '#' = casing, ' ' = anything (under the core, so a hopper can go there), 'W' = a window spot: casing or glass (the middle of each side wall and the top centre). Output per tick: fe_per_level × level × (1 + per_special_attack × Special Attack), after Poke Power's 50 FE per level. Placeholder numbers; see docs/balance.md. Read by the companion mod (machine/).",
"core": "cobblesurvival:dynamo_core",
"kind": "generator",
"types": [
"electric"
],
"layers": [
[
"###",
"###",
"# #"
],
[
"#W#",
"W.W",
"#C#"
],
[
"###",
"#W#",
"###"
]
],
"keys": {
"#": "#cobblesurvival:dynamo_casing",
"W": [
"#cobblesurvival:dynamo_casing",
"#c:glass_blocks"
]
},
"energy": {
"fe_per_level": 50,
"per_special_attack": 0.005,
"capacity": 200000,
"max_output": 16000
}
}
@@ -0,0 +1,42 @@
{
"_comment": "Large Furnace (Adrian, 2026-10-31): a Fire Pokémon in the chamber heats vanilla furnaces, blast furnaces and smokers standing against the outside of the shell; they burn without fuel while they have something to cook, and cook faster. Shape: layers bottom to top, rows north to south, columns west to east, as seen with the core in the south wall; checked in all four rotations. 'C' = the core, '.' = the chamber (air; the Pokémon stands there), '#' = casing, ' ' = anything (under the core, so a hopper can go there), 'W' = a window spot: casing or glass (the middle of each side wall and the top centre). Furnaces heated: 1 + level / levels_per_furnace, at most max. Cooking speed: base + per_level × level + per_special_attack × Special Attack. Placeholder numbers; see docs/balance.md. Read by the companion mod (machine/).",
"core": "cobblesurvival:heat_core",
"kind": "furnace",
"types": [
"fire"
],
"layers": [
[
"###",
"###",
"# #"
],
[
"#W#",
"W.W",
"#C#"
],
[
"###",
"#W#",
"###"
]
],
"keys": {
"#": "#cobblesurvival:heat_casing",
"W": [
"#cobblesurvival:heat_casing",
"#c:glass_blocks"
]
},
"furnaces": {
"tag": "cobblesurvival:machine_furnaces",
"max": 8,
"levels_per_furnace": 15,
"speed": {
"base": 1.0,
"per_level": 0.04,
"per_special_attack": 0.01
}
}
}
@@ -0,0 +1,40 @@
{
"_comment": "Rebirth Chamber (Adrian, 2026-10-31): a Lv 100 Pokémon put in is reborn after 'ticks' of server time (also while the chunk is unloaded): first stage of its line, Lv 1, shiny, perfect_ivs of its IVs raised to 31 (none lowered), moves, ability, nickname and original trainer kept. 'extra' goes to the owner with it: an Ability Patch, so the hidden ability is their choice. Taking it out early cancels. Shape: layers bottom to top, rows north to south, columns west to east, as seen with the core in the south wall; checked in all four rotations. 'C' = the core, '.' = the chamber (air; the Pokémon stands there), '#' = casing, ' ' = anything (under the core, so a hopper can go there), 'W' = a window spot: casing or glass (the middle of each side wall and the top centre). Placeholder numbers; see docs/balance.md. Read by the companion mod (machine/).",
"core": "cobblesurvival:rebirth_core",
"kind": "rebirth",
"min_level": 100,
"layers": [
[
"###",
"###",
"# #"
],
[
"#W#",
"W.W",
"#C#"
],
[
"###",
"#W#",
"###"
]
],
"keys": {
"#": "#cobblesurvival:rebirth_casing",
"W": [
"#cobblesurvival:rebirth_casing",
"#c:glass_blocks"
]
},
"rebirth": {
"ticks": 144000,
"perfect_ivs": 3,
"extra": [
{
"item": "cobblemon:ability_patch",
"count": 1
}
]
}
}
@@ -0,0 +1,42 @@
{
"_comment": "Drop Synthesizer (Adrian, 2026-10-31): any Pokémon; the core takes Forge Energy (up to max_input per tick, so more energy is faster) and for every fe_per_roll rolls the Pokémon's own drop table once, as if it were defeated. The shell's tier is the lowest of 'tiers' among its casing blocks (iron, gold, diamond, netherite = looting 0-3): each looting level adds 0-1 to every drop, and chance_bonus_per_looting × looting is the chance of a second roll. What it makes waits in the core (output_slots) for hoppers. Shape: layers bottom to top, rows north to south, columns west to east, as seen with the core in the south wall; checked in all four rotations. 'C' = the core, '.' = the chamber (air; the Pokémon stands there), '#' = casing, ' ' = anything (under the core, so a hopper can go there), 'W' = a window spot: casing or glass (the middle of each side wall and the top centre). Placeholder numbers; see docs/balance.md. Read by the companion mod (machine/).",
"core": "cobblesurvival:synthesis_core",
"kind": "synthesis",
"layers": [
[
"###",
"###",
"# #"
],
[
"#W#",
"W.W",
"#C#"
],
[
"###",
"#W#",
"###"
]
],
"keys": {
"#": "#cobblesurvival:synthesis_casing",
"W": [
"#cobblesurvival:synthesis_casing",
"#c:glass_blocks"
]
},
"synthesis": {
"fe_per_roll": 2000000,
"max_input": 32000,
"capacity": 4000000,
"output_slots": 9,
"tiers": [
"cobblesurvival:synthesis_tier/iron",
"cobblesurvival:synthesis_tier/gold",
"cobblesurvival:synthesis_tier/diamond",
"cobblesurvival:synthesis_tier/netherite"
],
"chance_bonus_per_looting": 0.25
}
}
@@ -0,0 +1,24 @@
{
"type": "minecraft:crafting_shaped",
"category": "misc",
"pattern": [
"OGO",
"GEG",
"OGO"
],
"key": {
"O": {
"item": "minecraft:obsidian"
},
"G": {
"item": "minecraft:gold_block"
},
"E": {
"item": "minecraft:echo_shard"
}
},
"result": {
"id": "cobblesurvival:altar_core",
"count": 1
}
}
@@ -0,0 +1,24 @@
{
"type": "minecraft:crafting_shaped",
"category": "misc",
"pattern": [
"CRC",
"RTR",
"CRC"
],
"key": {
"C": {
"item": "minecraft:copper_block"
},
"R": {
"item": "minecraft:redstone"
},
"T": {
"item": "cobblemon:thunder_stone"
}
},
"result": {
"id": "cobblesurvival:dynamo_core",
"count": 1
}
}
@@ -0,0 +1,24 @@
{
"type": "minecraft:crafting_shaped",
"category": "misc",
"pattern": [
"BIB",
"IFI",
"BIB"
],
"key": {
"B": {
"item": "minecraft:bricks"
},
"I": {
"item": "minecraft:iron_ingot"
},
"F": {
"item": "minecraft:blast_furnace"
}
},
"result": {
"id": "cobblesurvival:heat_core",
"count": 1
}
}
@@ -0,0 +1,24 @@
{
"type": "minecraft:crafting_shaped",
"category": "misc",
"pattern": [
"ADA",
"DSD",
"ADA"
],
"key": {
"A": {
"item": "minecraft:amethyst_block"
},
"D": {
"item": "minecraft:diamond"
},
"S": {
"item": "cobblemon:shiny_stone"
}
},
"result": {
"id": "cobblesurvival:rebirth_core",
"count": 1
}
}
@@ -0,0 +1,27 @@
{
"type": "minecraft:crafting_shaped",
"category": "misc",
"pattern": [
"IRI",
"HXH",
"IRI"
],
"key": {
"I": {
"item": "minecraft:iron_block"
},
"R": {
"item": "minecraft:redstone_block"
},
"H": {
"item": "minecraft:hopper"
},
"X": {
"item": "minecraft:crafter"
}
},
"result": {
"id": "cobblesurvival:synthesis_core",
"count": 1
}
}
@@ -0,0 +1,8 @@
{
"values": [
"minecraft:obsidian",
"minecraft:crying_obsidian",
"minecraft:blackstone",
"minecraft:polished_blackstone_bricks"
]
}
@@ -0,0 +1,20 @@
{
"values": [
"minecraft:copper_block",
"minecraft:cut_copper",
"minecraft:exposed_copper",
"minecraft:exposed_cut_copper",
"minecraft:weathered_copper",
"minecraft:weathered_cut_copper",
"minecraft:oxidized_copper",
"minecraft:oxidized_cut_copper",
"minecraft:waxed_copper_block",
"minecraft:waxed_cut_copper",
"minecraft:waxed_exposed_copper",
"minecraft:waxed_exposed_cut_copper",
"minecraft:waxed_weathered_copper",
"minecraft:waxed_weathered_cut_copper",
"minecraft:waxed_oxidized_copper",
"minecraft:waxed_oxidized_cut_copper"
]
}
@@ -0,0 +1 @@
{"values": ["minecraft:bricks", "minecraft:mud_bricks", "minecraft:deepslate_bricks"]}
@@ -0,0 +1,7 @@
{
"values": [
"minecraft:furnace",
"minecraft:blast_furnace",
"minecraft:smoker"
]
}
@@ -0,0 +1,7 @@
{
"values": [
"minecraft:amethyst_block",
"minecraft:quartz_block",
"minecraft:calcite"
]
}
@@ -0,0 +1,8 @@
{
"values": [
"#cobblesurvival:synthesis_tier/iron",
"#cobblesurvival:synthesis_tier/gold",
"#cobblesurvival:synthesis_tier/diamond",
"#cobblesurvival:synthesis_tier/netherite"
]
}
@@ -0,0 +1,5 @@
{
"values": [
"minecraft:diamond_block"
]
}
@@ -0,0 +1,5 @@
{
"values": [
"minecraft:gold_block"
]
}
@@ -0,0 +1,5 @@
{
"values": [
"minecraft:iron_block"
]
}
@@ -0,0 +1,5 @@
{
"values": [
"minecraft:netherite_block"
]
}