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,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
}
}