Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
82f540aa51 | ||
|
|
644c1b5a2e | ||
|
|
55c336f89e | ||
|
|
173203eeb5 |
No files matched your search
@@ -1,58 +0,0 @@
|
||||
name: CI
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build-and-smoke-test:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 45
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: "21"
|
||||
|
||||
- uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: "1.25"
|
||||
|
||||
- name: Install packwiz
|
||||
# packwiz has no tagged releases; pin a commit when one is known good.
|
||||
run: go install github.com/packwiz/packwiz@latest
|
||||
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.12"
|
||||
|
||||
- name: Python packages for the world checks
|
||||
run: pip install numpy
|
||||
|
||||
- name: Build companion mod and export both pack formats
|
||||
run: python3 tools/build.py
|
||||
|
||||
# Booting the server needs eula=true. Set the repository variable
|
||||
# MINECRAFT_EULA_ACCEPTED to "true" only if you accept the Minecraft EULA
|
||||
# (https://aka.ms/MinecraftEULA) for this CI server. Until then CI runs
|
||||
# the mod discovery + dependency check, which needs no EULA.
|
||||
- name: Quick check (smoke checks + sampled world)
|
||||
if: vars.MINECRAFT_EULA_ACCEPTED == 'true'
|
||||
run: python3 tools/quick_check.py --accept-eula
|
||||
|
||||
- name: Mod discovery and dependency check (no EULA)
|
||||
if: vars.MINECRAFT_EULA_ACCEPTED != 'true'
|
||||
run: python3 tools/smoke_test.py --load-only
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
if: always()
|
||||
with:
|
||||
name: pack-exports
|
||||
path: |
|
||||
build/*.mrpack
|
||||
build/*-curseforge.zip
|
||||
build/server/logs/latest.log
|
||||
if-no-files-found: ignore
|
||||
@@ -82,7 +82,7 @@ Installs a NeoForge server under `build/server`, checks every mod's dependency r
|
||||
```bash
|
||||
python3 tools/smoke_test.py --accept-eula
|
||||
```
|
||||
The full smoke test: boots the server and runs `tools/smoke_checks.json` over RCON (companion mod live, core data pack enabled, key commands registered), then fails on unexpected errors in the log. Passing `--accept-eula` states that you accept the [Minecraft EULA](https://aka.ms/MinecraftEULA) for this test server. CI runs it only when the repository variable `MINECRAFT_EULA_ACCEPTED` is `true`.
|
||||
The full smoke test: boots the server and runs `tools/smoke_checks.json` over RCON (companion mod live, core data pack enabled, key commands registered), then fails on unexpected errors in the log. Passing `--accept-eula` states that you accept the [Minecraft EULA](https://aka.ms/MinecraftEULA) for this test server. There is no CI: the Gitea server has no capacity for Actions runners, so the checks run locally (this, `tools/selftest.py`, `tools/quick_check.py`).
|
||||
|
||||
## Adding a mod
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"_comment": "Generated by tools/zone_spawns.py from world/zones.json; do not edit by hand.",
|
||||
"zone": "westmarch",
|
||||
"pokemon": "pinsir level=30 uncatchable=yes",
|
||||
"pokemon": "scyther level=30 uncatchable=yes",
|
||||
"scale": 1.5,
|
||||
"drops": [
|
||||
{
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -13,24 +13,7 @@
|
||||
"maxSkyLight": 7,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-aerodactyl-1-0",
|
||||
"level": "27-28",
|
||||
"pokemon": "aerodactyl",
|
||||
"presets": [],
|
||||
"spawnablePositionType": "grounded",
|
||||
"type": "pokemon",
|
||||
"weight": 100.0
|
||||
},
|
||||
{
|
||||
"bucket": "ultra-rare",
|
||||
"condition": {
|
||||
"biomes": [
|
||||
"#cobblemon:is_lush"
|
||||
],
|
||||
"maxSkyLight": 7,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-amaura-1-1",
|
||||
"id": "lush_caves-amaura-1-0",
|
||||
"level": "12-28",
|
||||
"pokemon": "amaura",
|
||||
"presets": [],
|
||||
@@ -47,7 +30,7 @@
|
||||
"maxSkyLight": 7,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-anorith-1-2",
|
||||
"id": "lush_caves-anorith-1-1",
|
||||
"level": "12-28",
|
||||
"pokemon": "anorith",
|
||||
"presets": [],
|
||||
@@ -64,7 +47,7 @@
|
||||
"maxSkyLight": 7,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-anorith-2-3",
|
||||
"id": "lush_caves-anorith-2-2",
|
||||
"level": "12-28",
|
||||
"pokemon": "anorith",
|
||||
"presets": [
|
||||
@@ -83,7 +66,7 @@
|
||||
"maxSkyLight": 7,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-archen-1-4",
|
||||
"id": "lush_caves-archen-1-3",
|
||||
"level": "15-28",
|
||||
"pokemon": "archen",
|
||||
"presets": [],
|
||||
@@ -107,7 +90,7 @@
|
||||
"maxSkyLight": 7,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-carnivine-2-22",
|
||||
"id": "lush_caves-carnivine-2-21",
|
||||
"level": "20-28",
|
||||
"pokemon": "carnivine",
|
||||
"presets": [],
|
||||
@@ -124,7 +107,7 @@
|
||||
"maxSkyLight": 15,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-cranidos-1-5",
|
||||
"id": "lush_caves-cranidos-1-4",
|
||||
"level": "12-28",
|
||||
"pokemon": "cranidos",
|
||||
"presets": [],
|
||||
@@ -148,7 +131,7 @@
|
||||
"maxSkyLight": 7,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-ferroseed-1-6",
|
||||
"id": "lush_caves-ferroseed-1-5",
|
||||
"level": "12-28",
|
||||
"pokemon": "ferroseed",
|
||||
"presets": [],
|
||||
@@ -171,7 +154,7 @@
|
||||
"maxSkyLight": 7,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-kabuto-1-7",
|
||||
"id": "lush_caves-kabuto-1-6",
|
||||
"level": "12-28",
|
||||
"pokemon": "kabuto",
|
||||
"presets": [],
|
||||
@@ -188,7 +171,7 @@
|
||||
"maxSkyLight": 7,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-kabuto-2-8",
|
||||
"id": "lush_caves-kabuto-2-7",
|
||||
"level": "12-28",
|
||||
"pokemon": "kabuto",
|
||||
"presets": [
|
||||
@@ -207,7 +190,7 @@
|
||||
"maxSkyLight": 7,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-lileep-1-9",
|
||||
"id": "lush_caves-lileep-1-8",
|
||||
"level": "12-28",
|
||||
"pokemon": "lileep",
|
||||
"presets": [
|
||||
@@ -226,7 +209,7 @@
|
||||
"maxSkyLight": 7,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-lileep-2-10",
|
||||
"id": "lush_caves-lileep-2-9",
|
||||
"level": "12-28",
|
||||
"pokemon": "lileep",
|
||||
"presets": [
|
||||
@@ -252,7 +235,7 @@
|
||||
"maxSkyLight": 7,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-morelull-2-23",
|
||||
"id": "lush_caves-morelull-2-22",
|
||||
"level": "12-28",
|
||||
"pokemon": "morelull",
|
||||
"presets": [],
|
||||
@@ -275,7 +258,7 @@
|
||||
"maxSkyLight": 7,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-omanyte-1-11",
|
||||
"id": "lush_caves-omanyte-1-10",
|
||||
"level": "12-28",
|
||||
"pokemon": "omanyte",
|
||||
"presets": [],
|
||||
@@ -292,7 +275,7 @@
|
||||
"maxSkyLight": 7,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-omanyte-2-12",
|
||||
"id": "lush_caves-omanyte-2-11",
|
||||
"level": "12-28",
|
||||
"pokemon": "omanyte",
|
||||
"presets": [
|
||||
@@ -318,7 +301,7 @@
|
||||
"maxSkyLight": 7,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-paras-1-13",
|
||||
"id": "lush_caves-paras-1-12",
|
||||
"level": "12-28",
|
||||
"pokemon": "paras",
|
||||
"presets": [],
|
||||
@@ -348,7 +331,7 @@
|
||||
"maxSkyLight": 7,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-parasect-1-14",
|
||||
"id": "lush_caves-parasect-1-13",
|
||||
"level": "24-28",
|
||||
"pokemon": "parasect",
|
||||
"presets": [],
|
||||
@@ -371,7 +354,7 @@
|
||||
"maxSkyLight": 15,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-shieldon-1-15",
|
||||
"id": "lush_caves-shieldon-1-14",
|
||||
"level": "12-28",
|
||||
"pokemon": "shieldon",
|
||||
"presets": [],
|
||||
@@ -395,7 +378,7 @@
|
||||
"maxSkyLight": 7,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-shiinotic-2-24",
|
||||
"id": "lush_caves-shiinotic-2-23",
|
||||
"level": "24-28",
|
||||
"pokemon": "shiinotic",
|
||||
"presets": [],
|
||||
@@ -425,7 +408,7 @@
|
||||
"maxSkyLight": 7,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-shuckle-1-16",
|
||||
"id": "lush_caves-shuckle-1-15",
|
||||
"level": "16-28",
|
||||
"pokemon": "shuckle",
|
||||
"presets": [],
|
||||
@@ -450,7 +433,7 @@
|
||||
"maxSkyLight": 7,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-shuckle-2-17",
|
||||
"id": "lush_caves-shuckle-2-16",
|
||||
"level": "16-28",
|
||||
"pokemon": "shuckle",
|
||||
"spawnablePositionType": "fishing",
|
||||
@@ -474,7 +457,7 @@
|
||||
"minLureLevel": 1,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-shuckle-3-18",
|
||||
"id": "lush_caves-shuckle-3-17",
|
||||
"level": "16-28",
|
||||
"pokemon": "shuckle",
|
||||
"spawnablePositionType": "fishing",
|
||||
@@ -496,7 +479,7 @@
|
||||
"maxSkyLight": 7,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-tirtouga-1-19",
|
||||
"id": "lush_caves-tirtouga-1-18",
|
||||
"level": "15-28",
|
||||
"pokemon": "tirtouga",
|
||||
"presets": [],
|
||||
@@ -513,7 +496,7 @@
|
||||
"maxSkyLight": 7,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-tirtouga-2-20",
|
||||
"id": "lush_caves-tirtouga-2-19",
|
||||
"level": "15-28",
|
||||
"pokemon": "tirtouga",
|
||||
"presets": [
|
||||
@@ -532,13 +515,73 @@
|
||||
"maxSkyLight": 7,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-tyrunt-1-21",
|
||||
"id": "lush_caves-tyrunt-1-20",
|
||||
"level": "12-28",
|
||||
"pokemon": "tyrunt",
|
||||
"presets": [],
|
||||
"spawnablePositionType": "grounded",
|
||||
"type": "pokemon",
|
||||
"weight": 60.0
|
||||
},
|
||||
{
|
||||
"anticondition": {
|
||||
"maxY": 9,
|
||||
"minY": -41,
|
||||
"structures": [
|
||||
"cobblemon:shipwreck_coves/lush_shipwreck_cove"
|
||||
]
|
||||
},
|
||||
"bucket": "common",
|
||||
"condition": {
|
||||
"biomes": [
|
||||
"#cobblemon:is_lush"
|
||||
],
|
||||
"maxSkyLight": 7,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-venipede-3-24",
|
||||
"level": "12-26",
|
||||
"pokemon": "venipede",
|
||||
"presets": [],
|
||||
"spawnablePositionType": "grounded",
|
||||
"type": "pokemon",
|
||||
"weight": 9.0,
|
||||
"weightMultiplier": {
|
||||
"condition": {
|
||||
"isPokeSnack": true
|
||||
},
|
||||
"multiplier": 2.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"anticondition": {
|
||||
"maxY": 9,
|
||||
"minY": -41,
|
||||
"structures": [
|
||||
"cobblemon:shipwreck_coves/lush_shipwreck_cove"
|
||||
]
|
||||
},
|
||||
"bucket": "common",
|
||||
"condition": {
|
||||
"biomes": [
|
||||
"#cobblemon:is_lush"
|
||||
],
|
||||
"maxSkyLight": 7,
|
||||
"zone": "lush_caves"
|
||||
},
|
||||
"id": "lush_caves-whirlipede-3-25",
|
||||
"level": "22-28",
|
||||
"pokemon": "whirlipede",
|
||||
"presets": [],
|
||||
"spawnablePositionType": "grounded",
|
||||
"type": "pokemon",
|
||||
"weight": 1.8,
|
||||
"weightMultiplier": {
|
||||
"condition": {
|
||||
"isPokeSnack": true
|
||||
},
|
||||
"multiplier": 2.0
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -49,7 +49,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-appletun-1-94",
|
||||
"id": "mire-appletun-1-86",
|
||||
"level": "25-38",
|
||||
"pokemon": "appletun",
|
||||
"presets": [
|
||||
@@ -77,7 +77,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-appletun-2-95",
|
||||
"id": "mire-appletun-2-87",
|
||||
"level": "25-38",
|
||||
"pokemon": "appletun",
|
||||
"presets": [
|
||||
@@ -106,7 +106,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-applin-1-90",
|
||||
"id": "mire-applin-1-82",
|
||||
"level": "25-26",
|
||||
"pokemon": "applin",
|
||||
"presets": [
|
||||
@@ -134,7 +134,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-applin-2-91",
|
||||
"id": "mire-applin-2-83",
|
||||
"level": "25-26",
|
||||
"pokemon": "applin",
|
||||
"presets": [
|
||||
@@ -159,7 +159,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-arcanine-1-121",
|
||||
"id": "mire-arcanine-1-113",
|
||||
"level": "30-38",
|
||||
"pokemon": "arcanine",
|
||||
"presets": [
|
||||
@@ -471,33 +471,6 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"bucket": "rare",
|
||||
"condition": {
|
||||
"biomes": [
|
||||
"#cobblemon:is_overworld"
|
||||
],
|
||||
"maxSkyLight": 15,
|
||||
"minSkyLight": 8,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-chansey-1-82",
|
||||
"level": "25-38",
|
||||
"pokemon": "chansey",
|
||||
"presets": [
|
||||
"natural",
|
||||
"urban"
|
||||
],
|
||||
"spawnablePositionType": "grounded",
|
||||
"type": "pokemon",
|
||||
"weight": 62.6,
|
||||
"weightMultiplier": {
|
||||
"condition": {
|
||||
"timeRange": "night"
|
||||
},
|
||||
"multiplier": 0.25
|
||||
}
|
||||
},
|
||||
{
|
||||
"bucket": "common",
|
||||
"condition": {
|
||||
@@ -542,7 +515,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-deino-2-138",
|
||||
"id": "mire-deino-2-130",
|
||||
"level": "25-30",
|
||||
"pokemon": "deino",
|
||||
"presets": [
|
||||
@@ -577,7 +550,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-dipplin-1-96",
|
||||
"id": "mire-dipplin-1-88",
|
||||
"level": "25-38",
|
||||
"pokemon": "dipplin",
|
||||
"presets": [
|
||||
@@ -605,7 +578,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-dipplin-2-97",
|
||||
"id": "mire-dipplin-2-89",
|
||||
"level": "25-38",
|
||||
"pokemon": "dipplin",
|
||||
"presets": [
|
||||
@@ -775,7 +748,7 @@
|
||||
"minY": -31,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-dragonair-1-128",
|
||||
"id": "mire-dragonair-1-120",
|
||||
"level": "30-38",
|
||||
"pokemon": "dragonair",
|
||||
"presets": [
|
||||
@@ -809,7 +782,7 @@
|
||||
"minY": -31,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-dragonair-2-129",
|
||||
"id": "mire-dragonair-2-121",
|
||||
"level": "30-38",
|
||||
"pokemon": "dragonair",
|
||||
"presets": [
|
||||
@@ -844,7 +817,7 @@
|
||||
"minY": -31,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-dragonair-3-130",
|
||||
"id": "mire-dragonair-3-122",
|
||||
"level": "30-38",
|
||||
"pokemon": "dragonair",
|
||||
"spawnablePositionType": "fishing",
|
||||
@@ -868,7 +841,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-dragonair-4-131",
|
||||
"id": "mire-dragonair-4-123",
|
||||
"level": "30-38",
|
||||
"pokemon": "dragonair",
|
||||
"presets": [
|
||||
@@ -901,7 +874,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-dragonair-5-132",
|
||||
"id": "mire-dragonair-5-124",
|
||||
"level": "30-38",
|
||||
"pokemon": "dragonair",
|
||||
"presets": [
|
||||
@@ -935,7 +908,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-dragonair-6-133",
|
||||
"id": "mire-dragonair-6-125",
|
||||
"level": "30-38",
|
||||
"pokemon": "dragonair",
|
||||
"spawnablePositionType": "fishing",
|
||||
@@ -960,7 +933,7 @@
|
||||
"minY": -31,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-dratini-1-122",
|
||||
"id": "mire-dratini-1-114",
|
||||
"level": "25-30",
|
||||
"pokemon": "dratini",
|
||||
"presets": [
|
||||
@@ -994,7 +967,7 @@
|
||||
"minY": -31,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-dratini-2-123",
|
||||
"id": "mire-dratini-2-115",
|
||||
"level": "25-30",
|
||||
"pokemon": "dratini",
|
||||
"presets": [
|
||||
@@ -1029,7 +1002,7 @@
|
||||
"minY": -31,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-dratini-3-124",
|
||||
"id": "mire-dratini-3-116",
|
||||
"level": "25-30",
|
||||
"pokemon": "dratini",
|
||||
"spawnablePositionType": "fishing",
|
||||
@@ -1053,7 +1026,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-dratini-4-125",
|
||||
"id": "mire-dratini-4-117",
|
||||
"level": "25-30",
|
||||
"pokemon": "dratini",
|
||||
"presets": [
|
||||
@@ -1086,7 +1059,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-dratini-5-126",
|
||||
"id": "mire-dratini-5-118",
|
||||
"level": "25-30",
|
||||
"pokemon": "dratini",
|
||||
"presets": [
|
||||
@@ -1120,7 +1093,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-dratini-6-127",
|
||||
"id": "mire-dratini-6-119",
|
||||
"level": "25-30",
|
||||
"pokemon": "dratini",
|
||||
"spawnablePositionType": "fishing",
|
||||
@@ -1290,7 +1263,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-flabebe-blue-4-105",
|
||||
"id": "mire-flabebe-blue-4-97",
|
||||
"level": "25-30",
|
||||
"pokemon": "flabebe flower=blue",
|
||||
"presets": [
|
||||
@@ -1320,7 +1293,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-flabebe-orange-3-104",
|
||||
"id": "mire-flabebe-orange-3-96",
|
||||
"level": "25-30",
|
||||
"pokemon": "flabebe flower=orange",
|
||||
"presets": [
|
||||
@@ -1350,7 +1323,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-flabebe-pink-6-107",
|
||||
"id": "mire-flabebe-pink-6-99",
|
||||
"level": "25-30",
|
||||
"pokemon": "flabebe flower=pink",
|
||||
"presets": [
|
||||
@@ -1380,7 +1353,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-flabebe-red-1-102",
|
||||
"id": "mire-flabebe-red-1-94",
|
||||
"level": "25-30",
|
||||
"pokemon": "flabebe flower=red",
|
||||
"presets": [
|
||||
@@ -1410,7 +1383,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-flabebe-white-5-106",
|
||||
"id": "mire-flabebe-white-5-98",
|
||||
"level": "25-30",
|
||||
"pokemon": "flabebe flower=white",
|
||||
"presets": [
|
||||
@@ -1440,7 +1413,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-flabebe-yellow-2-103",
|
||||
"id": "mire-flabebe-yellow-2-95",
|
||||
"level": "25-30",
|
||||
"pokemon": "flabebe flower=yellow",
|
||||
"presets": [
|
||||
@@ -1533,7 +1506,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-flapple-1-92",
|
||||
"id": "mire-flapple-1-84",
|
||||
"level": "25-38",
|
||||
"pokemon": "flapple",
|
||||
"presets": [
|
||||
@@ -1561,7 +1534,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-flapple-2-93",
|
||||
"id": "mire-flapple-2-85",
|
||||
"level": "25-38",
|
||||
"pokemon": "flapple",
|
||||
"presets": [
|
||||
@@ -1585,7 +1558,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-floette-blue-4-111",
|
||||
"id": "mire-floette-blue-4-103",
|
||||
"level": "25-37",
|
||||
"pokemon": "floette flower=blue",
|
||||
"presets": [
|
||||
@@ -1615,7 +1588,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-floette-orange-3-110",
|
||||
"id": "mire-floette-orange-3-102",
|
||||
"level": "25-37",
|
||||
"pokemon": "floette flower=orange",
|
||||
"presets": [
|
||||
@@ -1645,7 +1618,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-floette-pink-6-113",
|
||||
"id": "mire-floette-pink-6-105",
|
||||
"level": "25-37",
|
||||
"pokemon": "floette flower=pink",
|
||||
"presets": [
|
||||
@@ -1675,7 +1648,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-floette-red-1-108",
|
||||
"id": "mire-floette-red-1-100",
|
||||
"level": "25-37",
|
||||
"pokemon": "floette flower=red",
|
||||
"presets": [
|
||||
@@ -1705,7 +1678,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-floette-white-5-112",
|
||||
"id": "mire-floette-white-5-104",
|
||||
"level": "25-37",
|
||||
"pokemon": "floette flower=white",
|
||||
"presets": [
|
||||
@@ -1735,7 +1708,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-floette-yellow-2-109",
|
||||
"id": "mire-floette-yellow-2-101",
|
||||
"level": "25-37",
|
||||
"pokemon": "floette flower=yellow",
|
||||
"presets": [
|
||||
@@ -1765,7 +1738,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-florges-blue-4-117",
|
||||
"id": "mire-florges-blue-4-109",
|
||||
"level": "32-38",
|
||||
"pokemon": "florges flower=blue",
|
||||
"presets": [
|
||||
@@ -1795,7 +1768,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-florges-orange-3-116",
|
||||
"id": "mire-florges-orange-3-108",
|
||||
"level": "32-38",
|
||||
"pokemon": "florges flower=orange",
|
||||
"presets": [
|
||||
@@ -1825,7 +1798,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-florges-pink-6-119",
|
||||
"id": "mire-florges-pink-6-111",
|
||||
"level": "32-38",
|
||||
"pokemon": "florges flower=pink",
|
||||
"presets": [
|
||||
@@ -1855,7 +1828,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-florges-red-1-114",
|
||||
"id": "mire-florges-red-1-106",
|
||||
"level": "32-38",
|
||||
"pokemon": "florges flower=red",
|
||||
"presets": [
|
||||
@@ -1885,7 +1858,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-florges-white-5-118",
|
||||
"id": "mire-florges-white-5-110",
|
||||
"level": "32-38",
|
||||
"pokemon": "florges flower=white",
|
||||
"presets": [
|
||||
@@ -1915,7 +1888,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-florges-yellow-2-115",
|
||||
"id": "mire-florges-yellow-2-107",
|
||||
"level": "32-38",
|
||||
"pokemon": "florges flower=yellow",
|
||||
"presets": [
|
||||
@@ -2125,7 +2098,7 @@
|
||||
"minY": 0,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-gabite-3-136",
|
||||
"id": "mire-gabite-3-128",
|
||||
"level": "25-38",
|
||||
"pokemon": "gabite",
|
||||
"presets": [
|
||||
@@ -2157,7 +2130,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-gabite-4-137",
|
||||
"id": "mire-gabite-4-129",
|
||||
"level": "25-38",
|
||||
"pokemon": "gabite",
|
||||
"presets": [
|
||||
@@ -2189,7 +2162,7 @@
|
||||
"minY": 0,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-gible-3-134",
|
||||
"id": "mire-gible-3-126",
|
||||
"level": "25-30",
|
||||
"pokemon": "gible",
|
||||
"presets": [
|
||||
@@ -2221,7 +2194,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-gible-4-135",
|
||||
"id": "mire-gible-4-127",
|
||||
"level": "25-30",
|
||||
"pokemon": "gible",
|
||||
"presets": [
|
||||
@@ -2242,7 +2215,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-goomy-1-139",
|
||||
"id": "mire-goomy-1-131",
|
||||
"level": "25-30",
|
||||
"pokemon": "goomy",
|
||||
"presets": [
|
||||
@@ -2265,7 +2238,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-goomy-2-140",
|
||||
"id": "mire-goomy-2-132",
|
||||
"level": "25-30",
|
||||
"pokemon": "goomy",
|
||||
"presets": [
|
||||
@@ -2288,7 +2261,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-goomy-3-141",
|
||||
"id": "mire-goomy-3-133",
|
||||
"level": "25-30",
|
||||
"pokemon": "goomy",
|
||||
"presets": [
|
||||
@@ -2310,7 +2283,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-goomy-4-142",
|
||||
"id": "mire-goomy-4-134",
|
||||
"level": "25-30",
|
||||
"pokemon": "goomy",
|
||||
"spawnablePositionType": "fishing",
|
||||
@@ -2328,7 +2301,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-goomy-5-143",
|
||||
"id": "mire-goomy-5-135",
|
||||
"level": "25-30",
|
||||
"pokemon": "goomy",
|
||||
"spawnablePositionType": "fishing",
|
||||
@@ -2355,7 +2328,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-goomy-6-144",
|
||||
"id": "mire-goomy-6-136",
|
||||
"level": "25-30",
|
||||
"pokemon": "goomy",
|
||||
"spawnablePositionType": "fishing",
|
||||
@@ -2381,7 +2354,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-goomy-hisui-12-147",
|
||||
"id": "mire-goomy-hisui-12-139",
|
||||
"level": "25-30",
|
||||
"pokemon": "goomy region_bias=hisui",
|
||||
"spawnablePositionType": "fishing",
|
||||
@@ -2408,7 +2381,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-goomy-hisui-13-148",
|
||||
"id": "mire-goomy-hisui-13-140",
|
||||
"level": "25-30",
|
||||
"pokemon": "goomy region_bias=hisui",
|
||||
"spawnablePositionType": "fishing",
|
||||
@@ -2434,7 +2407,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-goomy-hisui-14-149",
|
||||
"id": "mire-goomy-hisui-14-141",
|
||||
"level": "25-30",
|
||||
"pokemon": "goomy region_bias=hisui",
|
||||
"spawnablePositionType": "fishing",
|
||||
@@ -2460,7 +2433,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-goomy-hisui-15-150",
|
||||
"id": "mire-goomy-hisui-15-142",
|
||||
"level": "25-30",
|
||||
"pokemon": "goomy region_bias=hisui",
|
||||
"spawnablePositionType": "fishing",
|
||||
@@ -2486,7 +2459,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-goomy-hisui-16-151",
|
||||
"id": "mire-goomy-hisui-16-143",
|
||||
"level": "25-30",
|
||||
"pokemon": "goomy region_bias=hisui",
|
||||
"spawnablePositionType": "fishing",
|
||||
@@ -2520,7 +2493,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-goomy-hisui-8-145",
|
||||
"id": "mire-goomy-hisui-8-137",
|
||||
"level": "25-30",
|
||||
"pokemon": "goomy region_bias=hisui",
|
||||
"presets": [
|
||||
@@ -2548,7 +2521,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-goomy-hisui-9-146",
|
||||
"id": "mire-goomy-hisui-9-138",
|
||||
"level": "25-30",
|
||||
"pokemon": "goomy region_bias=hisui",
|
||||
"presets": [
|
||||
@@ -2659,7 +2632,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-growlithe-1-120",
|
||||
"id": "mire-growlithe-1-112",
|
||||
"level": "25-35",
|
||||
"pokemon": "growlithe",
|
||||
"presets": [
|
||||
@@ -2670,108 +2643,6 @@
|
||||
"type": "pokemon",
|
||||
"weight": 92.0
|
||||
},
|
||||
{
|
||||
"bucket": "common",
|
||||
"condition": {
|
||||
"biomes": [
|
||||
"#cobblemon:is_freshwater",
|
||||
"#cobblemon:is_ocean"
|
||||
],
|
||||
"canSeeSky": true,
|
||||
"isPokeSnack": true,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-gyarados-1-83",
|
||||
"level": "25-38",
|
||||
"pokemon": "gyarados",
|
||||
"presets": [
|
||||
"water"
|
||||
],
|
||||
"spawnablePositionType": "submerged",
|
||||
"type": "pokemon",
|
||||
"weight": 0.6
|
||||
},
|
||||
{
|
||||
"bucket": "common",
|
||||
"condition": {
|
||||
"biomes": [
|
||||
"#cobblemon:is_freshwater",
|
||||
"#cobblemon:is_ocean"
|
||||
],
|
||||
"canSeeSky": false,
|
||||
"isPokeSnack": true,
|
||||
"maxSkyLight": 15,
|
||||
"minSkyLight": 8,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-gyarados-2-84",
|
||||
"level": "25-38",
|
||||
"pokemon": "gyarados",
|
||||
"presets": [
|
||||
"water"
|
||||
],
|
||||
"spawnablePositionType": "submerged",
|
||||
"type": "pokemon",
|
||||
"weight": 0.6
|
||||
},
|
||||
{
|
||||
"bucket": "uncommon",
|
||||
"condition": {
|
||||
"biomes": [
|
||||
"#cobblemon:is_freshwater",
|
||||
"#cobblemon:is_ocean"
|
||||
],
|
||||
"isPokeSnack": true,
|
||||
"maxSkyLight": 15,
|
||||
"minSkyLight": 8,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-gyarados-3-85",
|
||||
"level": "25-38",
|
||||
"pokemon": "gyarados",
|
||||
"presets": [
|
||||
"water"
|
||||
],
|
||||
"spawnablePositionType": "surface",
|
||||
"type": "pokemon",
|
||||
"weight": 1.6
|
||||
},
|
||||
{
|
||||
"bucket": "common",
|
||||
"condition": {
|
||||
"biomes": [
|
||||
"#aether:is_aether",
|
||||
"#cobblemon:is_overworld"
|
||||
],
|
||||
"canSeeSky": true,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-gyarados-4-86",
|
||||
"level": "25-38",
|
||||
"pokemon": "gyarados",
|
||||
"spawnablePositionType": "fishing",
|
||||
"type": "pokemon",
|
||||
"weight": 10.0
|
||||
},
|
||||
{
|
||||
"bucket": "common",
|
||||
"condition": {
|
||||
"biomes": [
|
||||
"#aether:is_aether",
|
||||
"#cobblemon:is_overworld"
|
||||
],
|
||||
"canSeeSky": false,
|
||||
"maxSkyLight": 15,
|
||||
"minSkyLight": 8,
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-gyarados-5-87",
|
||||
"level": "25-38",
|
||||
"pokemon": "gyarados",
|
||||
"spawnablePositionType": "fishing",
|
||||
"type": "pokemon",
|
||||
"weight": 10.0
|
||||
},
|
||||
{
|
||||
"anticondition": {
|
||||
"biomes": [
|
||||
@@ -2791,7 +2662,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-hydrapple-1-98",
|
||||
"id": "mire-hydrapple-1-90",
|
||||
"level": "29-38",
|
||||
"pokemon": "hydrapple",
|
||||
"presets": [
|
||||
@@ -2819,7 +2690,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-hydrapple-2-99",
|
||||
"id": "mire-hydrapple-2-91",
|
||||
"level": "29-38",
|
||||
"pokemon": "hydrapple",
|
||||
"presets": [
|
||||
@@ -3363,30 +3234,6 @@
|
||||
"type": "pokemon",
|
||||
"weight": 60.0
|
||||
},
|
||||
{
|
||||
"bucket": "uncommon",
|
||||
"condition": {
|
||||
"biomes": [
|
||||
"#aether:is_aether",
|
||||
"#cobblemon:is_overworld"
|
||||
],
|
||||
"maxSkyLight": 15,
|
||||
"minSkyLight": 8,
|
||||
"neededNearbyBlocks": [
|
||||
"#cobblemon:saccharine_trees"
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-munchlax-2-89",
|
||||
"level": "25-38",
|
||||
"pokemon": "munchlax",
|
||||
"presets": [
|
||||
"natural"
|
||||
],
|
||||
"spawnablePositionType": "grounded",
|
||||
"type": "pokemon",
|
||||
"weight": 16.8
|
||||
},
|
||||
{
|
||||
"bucket": "common",
|
||||
"condition": {
|
||||
@@ -3520,30 +3367,6 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"bucket": "uncommon",
|
||||
"condition": {
|
||||
"biomes": [
|
||||
"#aether:is_aether",
|
||||
"#cobblemon:is_overworld"
|
||||
],
|
||||
"maxSkyLight": 15,
|
||||
"minSkyLight": 8,
|
||||
"neededNearbyBlocks": [
|
||||
"#cobblemon:saccharine_trees"
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-snorlax-2-88",
|
||||
"level": "34-38",
|
||||
"pokemon": "snorlax",
|
||||
"presets": [
|
||||
"natural"
|
||||
],
|
||||
"spawnablePositionType": "grounded",
|
||||
"type": "pokemon",
|
||||
"weight": 3.2
|
||||
},
|
||||
{
|
||||
"bucket": "ultra-rare",
|
||||
"condition": {
|
||||
@@ -4046,7 +3869,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-teddiursa-2-100",
|
||||
"id": "mire-teddiursa-2-92",
|
||||
"level": "25-33",
|
||||
"pokemon": "teddiursa",
|
||||
"presets": [
|
||||
@@ -4105,7 +3928,7 @@
|
||||
],
|
||||
"zone": "mire"
|
||||
},
|
||||
"id": "mire-ursaring-2-101",
|
||||
"id": "mire-ursaring-2-93",
|
||||
"level": "30-38",
|
||||
"pokemon": "ursaring",
|
||||
"presets": [
|
||||
|
||||
@@ -574,28 +574,6 @@
|
||||
"type": "pokemon",
|
||||
"weight": 18.0
|
||||
},
|
||||
{
|
||||
"bucket": "uncommon",
|
||||
"condition": {
|
||||
"biomes": [
|
||||
"#cobblemon:is_overworld"
|
||||
],
|
||||
"maxSkyLight": 15,
|
||||
"minSkyLight": 8,
|
||||
"minY": 192,
|
||||
"zone": "southwold"
|
||||
},
|
||||
"id": "southwold-drampa-2-97",
|
||||
"level": "8-18",
|
||||
"pokemon": "drampa",
|
||||
"presets": [
|
||||
"natural",
|
||||
"wild"
|
||||
],
|
||||
"spawnablePositionType": "grounded",
|
||||
"type": "pokemon",
|
||||
"weight": 60.0
|
||||
},
|
||||
{
|
||||
"anticondition": {
|
||||
"biomes": [
|
||||
@@ -1145,7 +1123,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "southwold"
|
||||
},
|
||||
"id": "southwold-koffing-1-107",
|
||||
"id": "southwold-koffing-1-106",
|
||||
"level": "9-18",
|
||||
"pokemon": "koffing",
|
||||
"presets": [
|
||||
@@ -1189,7 +1167,7 @@
|
||||
],
|
||||
"zone": "southwold"
|
||||
},
|
||||
"id": "southwold-koffing-2-108",
|
||||
"id": "southwold-koffing-2-107",
|
||||
"level": "9-18",
|
||||
"pokemon": "koffing",
|
||||
"presets": [
|
||||
@@ -1835,7 +1813,7 @@
|
||||
"timeRange": "night",
|
||||
"zone": "southwold"
|
||||
},
|
||||
"id": "southwold-munna-1-98",
|
||||
"id": "southwold-munna-1-97",
|
||||
"level": "8-18",
|
||||
"pokemon": "munna",
|
||||
"presets": [
|
||||
@@ -1860,7 +1838,7 @@
|
||||
"timeRange": "night",
|
||||
"zone": "southwold"
|
||||
},
|
||||
"id": "southwold-munna-2-99",
|
||||
"id": "southwold-munna-2-98",
|
||||
"level": "8-18",
|
||||
"pokemon": "munna",
|
||||
"presets": [
|
||||
@@ -1939,7 +1917,7 @@
|
||||
"timeRange": "day",
|
||||
"zone": "southwold"
|
||||
},
|
||||
"id": "southwold-pidove-1-100",
|
||||
"id": "southwold-pidove-1-99",
|
||||
"level": "8-18",
|
||||
"pokemon": "pidove",
|
||||
"presets": [
|
||||
@@ -1968,7 +1946,7 @@
|
||||
"timeRange": "day",
|
||||
"zone": "southwold"
|
||||
},
|
||||
"id": "southwold-pidove-2-101",
|
||||
"id": "southwold-pidove-2-100",
|
||||
"level": "8-18",
|
||||
"pokemon": "pidove",
|
||||
"presets": [
|
||||
@@ -2000,7 +1978,7 @@
|
||||
"timeRange": "day",
|
||||
"zone": "southwold"
|
||||
},
|
||||
"id": "southwold-pidove-3-102",
|
||||
"id": "southwold-pidove-3-101",
|
||||
"level": "8-18",
|
||||
"pokemon": "pidove",
|
||||
"presets": [
|
||||
@@ -2296,7 +2274,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "southwold"
|
||||
},
|
||||
"id": "southwold-sigilyph-2-112",
|
||||
"id": "southwold-sigilyph-2-111",
|
||||
"level": "8-18",
|
||||
"pokemon": "sigilyph",
|
||||
"presets": [
|
||||
@@ -2390,6 +2368,32 @@
|
||||
"type": "pokemon",
|
||||
"weight": 54.0
|
||||
},
|
||||
{
|
||||
"bucket": "rare",
|
||||
"condition": {
|
||||
"biomes": [
|
||||
"#cobblemon:is_overworld"
|
||||
],
|
||||
"maxSkyLight": 15,
|
||||
"minSkyLight": 8,
|
||||
"zone": "southwold"
|
||||
},
|
||||
"id": "southwold-solosis-1-112",
|
||||
"level": "8-18",
|
||||
"pokemon": "solosis",
|
||||
"presets": [
|
||||
"natural"
|
||||
],
|
||||
"spawnablePositionType": "grounded",
|
||||
"type": "pokemon",
|
||||
"weight": 12.0,
|
||||
"weightMultiplier": {
|
||||
"condition": {
|
||||
"isPokeSnack": true
|
||||
},
|
||||
"multiplier": 1.25
|
||||
}
|
||||
},
|
||||
{
|
||||
"anticondition": {
|
||||
"biomes": [
|
||||
@@ -2666,7 +2670,7 @@
|
||||
"minY": 96,
|
||||
"zone": "southwold"
|
||||
},
|
||||
"id": "southwold-swablu-1-110",
|
||||
"id": "southwold-swablu-1-109",
|
||||
"level": "8-18",
|
||||
"pokemon": "swablu",
|
||||
"presets": [
|
||||
@@ -2703,7 +2707,7 @@
|
||||
"minY": 192,
|
||||
"zone": "southwold"
|
||||
},
|
||||
"id": "southwold-swablu-2-111",
|
||||
"id": "southwold-swablu-2-110",
|
||||
"level": "8-18",
|
||||
"pokemon": "swablu",
|
||||
"presets": [
|
||||
@@ -3024,7 +3028,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "southwold"
|
||||
},
|
||||
"id": "southwold-voltorb-1-103",
|
||||
"id": "southwold-voltorb-1-102",
|
||||
"level": "8-18",
|
||||
"pokemon": "voltorb",
|
||||
"presets": [
|
||||
@@ -3062,7 +3066,7 @@
|
||||
],
|
||||
"zone": "southwold"
|
||||
},
|
||||
"id": "southwold-voltorb-2-104",
|
||||
"id": "southwold-voltorb-2-103",
|
||||
"level": "8-18",
|
||||
"pokemon": "voltorb",
|
||||
"presets": [
|
||||
@@ -3099,7 +3103,7 @@
|
||||
],
|
||||
"zone": "southwold"
|
||||
},
|
||||
"id": "southwold-voltorb-3-105",
|
||||
"id": "southwold-voltorb-3-104",
|
||||
"level": "8-18",
|
||||
"pokemon": "voltorb",
|
||||
"spawnablePositionType": "grounded",
|
||||
@@ -3133,7 +3137,7 @@
|
||||
],
|
||||
"zone": "southwold"
|
||||
},
|
||||
"id": "southwold-voltorb-hisuian-4-106",
|
||||
"id": "southwold-voltorb-hisuian-4-105",
|
||||
"level": "8-18",
|
||||
"pokemon": "voltorb hisuian",
|
||||
"presets": [
|
||||
@@ -3174,7 +3178,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "southwold"
|
||||
},
|
||||
"id": "southwold-whismur-2-109",
|
||||
"id": "southwold-whismur-2-108",
|
||||
"level": "8-18",
|
||||
"pokemon": "whismur",
|
||||
"presets": [
|
||||
|
||||
@@ -451,6 +451,28 @@
|
||||
"multiplier": 0.25
|
||||
}
|
||||
},
|
||||
{
|
||||
"bucket": "uncommon",
|
||||
"condition": {
|
||||
"biomes": [
|
||||
"#cobblemon:is_overworld"
|
||||
],
|
||||
"maxSkyLight": 15,
|
||||
"minSkyLight": 8,
|
||||
"minY": 192,
|
||||
"zone": "sunscorch"
|
||||
},
|
||||
"id": "sunscorch-drampa-2-76",
|
||||
"level": "30-45",
|
||||
"pokemon": "drampa",
|
||||
"presets": [
|
||||
"natural",
|
||||
"wild"
|
||||
],
|
||||
"spawnablePositionType": "grounded",
|
||||
"type": "pokemon",
|
||||
"weight": 60.0
|
||||
},
|
||||
{
|
||||
"bucket": "common",
|
||||
"condition": {
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-alcremie-1-58",
|
||||
"id": "westmarch-alcremie-1-57",
|
||||
"level": "22-25",
|
||||
"pokemon": "alcremie",
|
||||
"spawnablePositionType": "grounded",
|
||||
@@ -53,7 +53,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-alcremie-2-59",
|
||||
"id": "westmarch-alcremie-2-58",
|
||||
"level": "22-25",
|
||||
"pokemon": "alcremie",
|
||||
"presets": [
|
||||
@@ -88,7 +88,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-alcremie-3-60",
|
||||
"id": "westmarch-alcremie-3-59",
|
||||
"level": "22-25",
|
||||
"pokemon": "alcremie",
|
||||
"presets": [
|
||||
@@ -292,7 +292,7 @@
|
||||
"canSeeSky": false,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-baltoy-2-77",
|
||||
"id": "westmarch-baltoy-2-76",
|
||||
"level": "15-25",
|
||||
"pokemon": "baltoy",
|
||||
"presets": [
|
||||
@@ -319,7 +319,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-boldore-1-112",
|
||||
"id": "westmarch-boldore-1-111",
|
||||
"level": "25-25",
|
||||
"pokemon": "boldore",
|
||||
"presets": [
|
||||
@@ -344,7 +344,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-boltund-1-48",
|
||||
"id": "westmarch-boltund-1-47",
|
||||
"level": "25-25",
|
||||
"pokemon": "boltund",
|
||||
"presets": [
|
||||
@@ -387,7 +387,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-boltund-2-49",
|
||||
"id": "westmarch-boltund-2-48",
|
||||
"level": "25-25",
|
||||
"pokemon": "boltund",
|
||||
"presets": [
|
||||
@@ -457,7 +457,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-bronzor-2-78",
|
||||
"id": "westmarch-bronzor-2-77",
|
||||
"level": "15-25",
|
||||
"pokemon": "bronzor",
|
||||
"presets": [
|
||||
@@ -481,7 +481,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-bronzor-4-79",
|
||||
"id": "westmarch-bronzor-4-78",
|
||||
"level": "15-25",
|
||||
"pokemon": "bronzor",
|
||||
"spawnablePositionType": "grounded",
|
||||
@@ -531,7 +531,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-carbink-1-87",
|
||||
"id": "westmarch-carbink-1-86",
|
||||
"level": "25-25",
|
||||
"pokemon": "carbink",
|
||||
"presets": [
|
||||
@@ -561,7 +561,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-carkol-1-108",
|
||||
"id": "westmarch-carkol-1-107",
|
||||
"level": "18-25",
|
||||
"pokemon": "carkol",
|
||||
"presets": [
|
||||
@@ -584,7 +584,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-charjabug-2-89",
|
||||
"id": "westmarch-charjabug-2-88",
|
||||
"level": "20-25",
|
||||
"pokemon": "charjabug",
|
||||
"presets": [
|
||||
@@ -750,7 +750,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-corsola-2-104",
|
||||
"id": "westmarch-corsola-2-103",
|
||||
"level": "16-25",
|
||||
"pokemon": "corsola",
|
||||
"presets": [
|
||||
@@ -771,7 +771,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-corsola-galarian-6-105",
|
||||
"id": "westmarch-corsola-galarian-6-104",
|
||||
"level": "16-25",
|
||||
"pokemon": "corsola galarian",
|
||||
"presets": [
|
||||
@@ -798,7 +798,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-corsola-galarian-7-106",
|
||||
"id": "westmarch-corsola-galarian-7-105",
|
||||
"level": "16-25",
|
||||
"pokemon": "corsola galarian",
|
||||
"presets": [
|
||||
@@ -1033,7 +1033,7 @@
|
||||
"timeRange": "night",
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-drifloon-1-61",
|
||||
"id": "westmarch-drifloon-1-60",
|
||||
"level": "15-25",
|
||||
"pokemon": "drifloon",
|
||||
"presets": [
|
||||
@@ -1059,7 +1059,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-drilbur-1-102",
|
||||
"id": "westmarch-drilbur-1-101",
|
||||
"level": "15-25",
|
||||
"pokemon": "drilbur",
|
||||
"presets": [
|
||||
@@ -1085,7 +1085,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-dunsparce-1-121",
|
||||
"id": "westmarch-dunsparce-1-120",
|
||||
"level": "17-25",
|
||||
"pokemon": "dunsparce",
|
||||
"presets": [
|
||||
@@ -1119,7 +1119,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-eevee-1-123",
|
||||
"id": "westmarch-eevee-1-122",
|
||||
"level": "15-25",
|
||||
"pokemon": "eevee",
|
||||
"presets": [
|
||||
@@ -1146,7 +1146,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-eevee-2-124",
|
||||
"id": "westmarch-eevee-2-123",
|
||||
"level": "15-25",
|
||||
"pokemon": "eevee",
|
||||
"presets": [
|
||||
@@ -1172,7 +1172,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-eevee-3-125",
|
||||
"id": "westmarch-eevee-3-124",
|
||||
"level": "15-25",
|
||||
"pokemon": "eevee",
|
||||
"presets": [
|
||||
@@ -1202,7 +1202,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-eevee-4-126",
|
||||
"id": "westmarch-eevee-4-125",
|
||||
"level": "15-25",
|
||||
"pokemon": "eevee",
|
||||
"presets": [
|
||||
@@ -1232,7 +1232,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-farfetchd-1-100",
|
||||
"id": "westmarch-farfetchd-1-99",
|
||||
"level": "15-25",
|
||||
"pokemon": "farfetchd",
|
||||
"presets": [
|
||||
@@ -1265,7 +1265,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-farfetchd-galarian-2-101",
|
||||
"id": "westmarch-farfetchd-galarian-2-100",
|
||||
"level": "15-25",
|
||||
"pokemon": "farfetchd galarian",
|
||||
"presets": [
|
||||
@@ -1356,7 +1356,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-gastly-1-70",
|
||||
"id": "westmarch-gastly-1-69",
|
||||
"level": "15-25",
|
||||
"pokemon": "gastly",
|
||||
"presets": [
|
||||
@@ -1386,7 +1386,7 @@
|
||||
"canSeeSky": false,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-gastly-2-71",
|
||||
"id": "westmarch-gastly-2-70",
|
||||
"level": "15-25",
|
||||
"pokemon": "gastly",
|
||||
"presets": [
|
||||
@@ -1412,7 +1412,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-geodude-1-51",
|
||||
"id": "westmarch-geodude-1-50",
|
||||
"level": "15-25",
|
||||
"pokemon": "geodude",
|
||||
"presets": [
|
||||
@@ -1438,7 +1438,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-geodude-2-52",
|
||||
"id": "westmarch-geodude-2-51",
|
||||
"level": "15-25",
|
||||
"pokemon": "geodude",
|
||||
"presets": [
|
||||
@@ -1458,7 +1458,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-graveler-1-53",
|
||||
"id": "westmarch-graveler-1-52",
|
||||
"level": "25-25",
|
||||
"pokemon": "graveler",
|
||||
"presets": [
|
||||
@@ -1484,7 +1484,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-graveler-2-54",
|
||||
"id": "westmarch-graveler-2-53",
|
||||
"level": "25-25",
|
||||
"pokemon": "graveler",
|
||||
"presets": [
|
||||
@@ -1531,7 +1531,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-grimer-2-62",
|
||||
"id": "westmarch-grimer-2-61",
|
||||
"level": "15-25",
|
||||
"pokemon": "grimer",
|
||||
"presets": [
|
||||
@@ -1574,7 +1574,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-grimer-3-63",
|
||||
"id": "westmarch-grimer-3-62",
|
||||
"level": "15-25",
|
||||
"pokemon": "grimer",
|
||||
"presets": [
|
||||
@@ -1612,7 +1612,7 @@
|
||||
"canSeeSky": true,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-grimer-5-64",
|
||||
"id": "westmarch-grimer-5-63",
|
||||
"level": "15-25",
|
||||
"pokemon": "grimer",
|
||||
"presets": [
|
||||
@@ -1655,7 +1655,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-grimer-6-65",
|
||||
"id": "westmarch-grimer-6-64",
|
||||
"level": "15-25",
|
||||
"pokemon": "grimer",
|
||||
"presets": [
|
||||
@@ -1696,7 +1696,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-grimer-8-66",
|
||||
"id": "westmarch-grimer-8-65",
|
||||
"level": "15-25",
|
||||
"pokemon": "grimer",
|
||||
"presets": [
|
||||
@@ -1741,7 +1741,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-grimer-9-67",
|
||||
"id": "westmarch-grimer-9-66",
|
||||
"level": "15-25",
|
||||
"pokemon": "grimer",
|
||||
"presets": [
|
||||
@@ -1776,7 +1776,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-grimer-alolan-10-68",
|
||||
"id": "westmarch-grimer-alolan-10-67",
|
||||
"level": "15-25",
|
||||
"pokemon": "grimer alolan",
|
||||
"presets": [
|
||||
@@ -1814,7 +1814,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-grimer-alolan-11-69",
|
||||
"id": "westmarch-grimer-alolan-11-68",
|
||||
"level": "15-25",
|
||||
"pokemon": "grimer alolan",
|
||||
"presets": [
|
||||
@@ -1851,7 +1851,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-grubbin-2-88",
|
||||
"id": "westmarch-grubbin-2-87",
|
||||
"level": "15-25",
|
||||
"pokemon": "grubbin",
|
||||
"presets": [
|
||||
@@ -1883,7 +1883,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-gurdurr-1-95",
|
||||
"id": "westmarch-gurdurr-1-94",
|
||||
"level": "25-25",
|
||||
"pokemon": "gurdurr",
|
||||
"presets": [
|
||||
@@ -1927,7 +1927,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-gurdurr-2-96",
|
||||
"id": "westmarch-gurdurr-2-95",
|
||||
"level": "25-25",
|
||||
"pokemon": "gurdurr",
|
||||
"presets": [
|
||||
@@ -1968,7 +1968,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-haunter-1-72",
|
||||
"id": "westmarch-haunter-1-71",
|
||||
"level": "25-25",
|
||||
"pokemon": "haunter",
|
||||
"presets": [
|
||||
@@ -1998,7 +1998,7 @@
|
||||
"canSeeSky": false,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-haunter-2-73",
|
||||
"id": "westmarch-haunter-2-72",
|
||||
"level": "25-25",
|
||||
"pokemon": "haunter",
|
||||
"presets": [
|
||||
@@ -2029,7 +2029,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-hawlucha-2-86",
|
||||
"id": "westmarch-hawlucha-2-85",
|
||||
"level": "25-25",
|
||||
"pokemon": "hawlucha",
|
||||
"presets": [
|
||||
@@ -2065,7 +2065,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-heracross-1-75",
|
||||
"id": "westmarch-heracross-1-74",
|
||||
"level": "25-25",
|
||||
"pokemon": "heracross",
|
||||
"presets": [
|
||||
@@ -2102,7 +2102,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-heracross-3-76",
|
||||
"id": "westmarch-heracross-3-75",
|
||||
"level": "25-25",
|
||||
"pokemon": "heracross",
|
||||
"presets": [
|
||||
@@ -2134,7 +2134,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-herdier-1-82",
|
||||
"id": "westmarch-herdier-1-81",
|
||||
"level": "16-25",
|
||||
"pokemon": "herdier",
|
||||
"presets": [
|
||||
@@ -2169,7 +2169,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-herdier-2-83",
|
||||
"id": "westmarch-herdier-2-82",
|
||||
"level": "16-25",
|
||||
"pokemon": "herdier",
|
||||
"presets": [
|
||||
@@ -2198,7 +2198,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-honedge-2-84",
|
||||
"id": "westmarch-honedge-2-83",
|
||||
"level": "15-25",
|
||||
"pokemon": "honedge",
|
||||
"spawnablePositionType": "grounded",
|
||||
@@ -2220,7 +2220,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-honedge-3-85",
|
||||
"id": "westmarch-honedge-3-84",
|
||||
"level": "15-25",
|
||||
"pokemon": "honedge",
|
||||
"presets": [
|
||||
@@ -2241,7 +2241,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-kirlia-2-117",
|
||||
"id": "westmarch-kirlia-2-116",
|
||||
"level": "20-25",
|
||||
"pokemon": "kirlia",
|
||||
"presets": [
|
||||
@@ -2266,7 +2266,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-kirlia-3-118",
|
||||
"id": "westmarch-kirlia-3-117",
|
||||
"level": "20-25",
|
||||
"pokemon": "kirlia",
|
||||
"presets": [
|
||||
@@ -2289,7 +2289,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-klink-2-122",
|
||||
"id": "westmarch-klink-2-121",
|
||||
"level": "15-25",
|
||||
"pokemon": "klink",
|
||||
"presets": [
|
||||
@@ -2392,7 +2392,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-lillipup-1-80",
|
||||
"id": "westmarch-lillipup-1-79",
|
||||
"level": "15-25",
|
||||
"pokemon": "lillipup",
|
||||
"presets": [
|
||||
@@ -2421,7 +2421,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-lillipup-2-81",
|
||||
"id": "westmarch-lillipup-2-80",
|
||||
"level": "15-25",
|
||||
"pokemon": "lillipup",
|
||||
"presets": [
|
||||
@@ -2441,7 +2441,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-maschiff-1-97",
|
||||
"id": "westmarch-maschiff-1-96",
|
||||
"level": "15-25",
|
||||
"pokemon": "maschiff",
|
||||
"presets": [
|
||||
@@ -2465,7 +2465,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-maschiff-2-98",
|
||||
"id": "westmarch-maschiff-2-97",
|
||||
"level": "15-25",
|
||||
"pokemon": "maschiff",
|
||||
"presets": [
|
||||
@@ -2489,7 +2489,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-maschiff-3-99",
|
||||
"id": "westmarch-maschiff-3-98",
|
||||
"level": "15-25",
|
||||
"pokemon": "maschiff",
|
||||
"presets": [
|
||||
@@ -2635,7 +2635,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-milcery-1-55",
|
||||
"id": "westmarch-milcery-1-54",
|
||||
"level": "15-25",
|
||||
"pokemon": "milcery",
|
||||
"spawnablePositionType": "grounded",
|
||||
@@ -2667,7 +2667,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-milcery-2-56",
|
||||
"id": "westmarch-milcery-2-55",
|
||||
"level": "15-25",
|
||||
"pokemon": "milcery",
|
||||
"presets": [
|
||||
@@ -2702,7 +2702,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-milcery-3-57",
|
||||
"id": "westmarch-milcery-3-56",
|
||||
"level": "15-25",
|
||||
"pokemon": "milcery",
|
||||
"presets": [
|
||||
@@ -2733,7 +2733,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-mimejr-1-119",
|
||||
"id": "westmarch-mimejr-1-118",
|
||||
"level": "15-25",
|
||||
"pokemon": "mimejr",
|
||||
"presets": [
|
||||
@@ -2762,7 +2762,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-mimejr-2-120",
|
||||
"id": "westmarch-mimejr-2-119",
|
||||
"level": "15-25",
|
||||
"pokemon": "mimejr",
|
||||
"presets": [
|
||||
@@ -2827,6 +2827,32 @@
|
||||
"multiplier": 1.25
|
||||
}
|
||||
},
|
||||
{
|
||||
"anticondition": {
|
||||
"biomes": [
|
||||
"#cobblemon:is_deep_dark",
|
||||
"minecraft:sulfur_caves"
|
||||
]
|
||||
},
|
||||
"bucket": "uncommon",
|
||||
"condition": {
|
||||
"biomes": [
|
||||
"#cobblemon:is_overworld"
|
||||
],
|
||||
"maxSkyLight": 7,
|
||||
"minSkyLight": 0,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-nosepass-1-126",
|
||||
"level": "15-25",
|
||||
"pokemon": "nosepass",
|
||||
"presets": [
|
||||
"natural"
|
||||
],
|
||||
"spawnablePositionType": "grounded",
|
||||
"type": "pokemon",
|
||||
"weight": 55.2
|
||||
},
|
||||
{
|
||||
"bucket": "common",
|
||||
"condition": {
|
||||
@@ -2871,7 +2897,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-onix-1-103",
|
||||
"id": "westmarch-onix-1-102",
|
||||
"level": "15-25",
|
||||
"pokemon": "onix",
|
||||
"presets": [
|
||||
@@ -3080,7 +3106,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-pinsir-2-74",
|
||||
"id": "westmarch-pinsir-2-73",
|
||||
"level": "25-25",
|
||||
"pokemon": "pinsir",
|
||||
"presets": [
|
||||
@@ -3109,7 +3135,7 @@
|
||||
"timeRange": "night",
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-pumpkaboo-1-50",
|
||||
"id": "westmarch-pumpkaboo-1-49",
|
||||
"level": "15-25",
|
||||
"pokemon": "pumpkaboo",
|
||||
"presets": [
|
||||
@@ -3136,7 +3162,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-ralts-2-115",
|
||||
"id": "westmarch-ralts-2-114",
|
||||
"level": "15-20",
|
||||
"pokemon": "ralts",
|
||||
"presets": [
|
||||
@@ -3161,7 +3187,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-ralts-3-116",
|
||||
"id": "westmarch-ralts-3-115",
|
||||
"level": "15-20",
|
||||
"pokemon": "ralts",
|
||||
"presets": [
|
||||
@@ -3187,7 +3213,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-roggenrola-1-111",
|
||||
"id": "westmarch-roggenrola-1-110",
|
||||
"level": "15-25",
|
||||
"pokemon": "roggenrola",
|
||||
"presets": [
|
||||
@@ -3211,7 +3237,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-rolycoly-1-107",
|
||||
"id": "westmarch-rolycoly-1-106",
|
||||
"level": "15-24",
|
||||
"pokemon": "rolycoly",
|
||||
"presets": [
|
||||
@@ -3340,32 +3366,6 @@
|
||||
"type": "pokemon",
|
||||
"weight": 90.0
|
||||
},
|
||||
{
|
||||
"bucket": "rare",
|
||||
"condition": {
|
||||
"biomes": [
|
||||
"#cobblemon:is_overworld"
|
||||
],
|
||||
"maxSkyLight": 15,
|
||||
"minSkyLight": 8,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-solosis-1-45",
|
||||
"level": "15-25",
|
||||
"pokemon": "solosis",
|
||||
"presets": [
|
||||
"natural"
|
||||
],
|
||||
"spawnablePositionType": "grounded",
|
||||
"type": "pokemon",
|
||||
"weight": 12.0,
|
||||
"weightMultiplier": {
|
||||
"condition": {
|
||||
"isPokeSnack": true
|
||||
},
|
||||
"multiplier": 1.25
|
||||
}
|
||||
},
|
||||
{
|
||||
"anticondition": {
|
||||
"biomes": [
|
||||
@@ -3541,7 +3541,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-tentacool-2-109",
|
||||
"id": "westmarch-tentacool-2-108",
|
||||
"level": "15-25",
|
||||
"pokemon": "tentacool",
|
||||
"presets": [
|
||||
@@ -3580,7 +3580,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-tentacool-5-110",
|
||||
"id": "westmarch-tentacool-5-109",
|
||||
"level": "15-25",
|
||||
"pokemon": "tentacool",
|
||||
"spawnablePositionType": "fishing",
|
||||
@@ -3665,7 +3665,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-timburr-1-93",
|
||||
"id": "westmarch-timburr-1-92",
|
||||
"level": "15-25",
|
||||
"pokemon": "timburr",
|
||||
"presets": [
|
||||
@@ -3709,7 +3709,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-timburr-2-94",
|
||||
"id": "westmarch-timburr-2-93",
|
||||
"level": "15-25",
|
||||
"pokemon": "timburr",
|
||||
"presets": [
|
||||
@@ -3744,7 +3744,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-toxel-1-91",
|
||||
"id": "westmarch-toxel-1-90",
|
||||
"level": "15-24",
|
||||
"pokemon": "toxel",
|
||||
"presets": [
|
||||
@@ -3765,7 +3765,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-toxel-2-92",
|
||||
"id": "westmarch-toxel-2-91",
|
||||
"level": "15-24",
|
||||
"pokemon": "toxel",
|
||||
"presets": [
|
||||
@@ -3804,7 +3804,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-tynamo-2-113",
|
||||
"id": "westmarch-tynamo-2-112",
|
||||
"level": "15-25",
|
||||
"pokemon": "tynamo",
|
||||
"presets": [
|
||||
@@ -3829,7 +3829,7 @@
|
||||
"minSkyLight": 0,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-tynamo-5-114",
|
||||
"id": "westmarch-tynamo-5-113",
|
||||
"level": "15-25",
|
||||
"pokemon": "tynamo",
|
||||
"spawnablePositionType": "fishing",
|
||||
@@ -3856,7 +3856,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-varoom-2-90",
|
||||
"id": "westmarch-varoom-2-89",
|
||||
"level": "15-25",
|
||||
"pokemon": "varoom",
|
||||
"spawnablePositionType": "grounded",
|
||||
@@ -3884,7 +3884,7 @@
|
||||
"minSkyLight": 8,
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-yamper-1-46",
|
||||
"id": "westmarch-yamper-1-45",
|
||||
"level": "15-25",
|
||||
"pokemon": "yamper",
|
||||
"presets": [
|
||||
@@ -3919,7 +3919,7 @@
|
||||
],
|
||||
"zone": "westmarch"
|
||||
},
|
||||
"id": "westmarch-yamper-2-47",
|
||||
"id": "westmarch-yamper-2-46",
|
||||
"level": "15-25",
|
||||
"pokemon": "yamper",
|
||||
"presets": [
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"_comment":"Generated by tools/zone_layout.py from world/zones.json; do not edit by hand.","seed":"isle-26","radius":1700,"step":24,"size":142,"zones":[{"id":"button_isle","name":"Button Isle","levels":[2,10]},{"id":"frostpeak","name":"Frostpeak Range","levels":[40,55]},{"id":"sunscorch","name":"Sunscorch","levels":[30,45]},{"id":"mire","name":"Mangrove Mire","levels":[25,38]},{"id":"jungle","name":"Verdant Jungle","levels":[18,30]},{"id":"highlands","name":"Highland Meadows","levels":[25,35]},{"id":"westmarch","name":"Westmarch","levels":[15,25]},{"id":"southwold","name":"Southwold","levels":[8,18]},{"id":"shallows","name":"Shallows","levels":[5,20]},{"id":"deep_sea","name":"Deep Sea","levels":[30,50]}],"caves":[{"id":"lush_caves","name":"Lush Caves","levels":[12,28],"biome":"minecraft:lush_caves"},{"id":"dripstone","name":"Dripstone Depths","levels":[22,38],"biome":"minecraft:dripstone_caves"},{"id":"deep_dark","name":"Deep Dark","levels":[45,60],"biome":"minecraft:deep_dark"},{"id":"basalt","name":"Basalt Furnace","levels":[55,70],"biome":"minecraft:basalt_deltas"}],"samples":{"button_isle":[-116,null,-92],"frostpeak":[628,null,-572],"sunscorch":[1372,null,-236],"mire":[652,null,1012],"jungle":[844,null,196],"highlands":[100,null,-1076],"westmarch":[-428,null,-1100],"southwold":[-116,null,1108],"shallows":[988,null,4],"deep_sea":[-1268,null,4],"lush_caves":[-1028,0,292],"dripstone":[940,40,-212],"deep_dark":[292,-52,-812],"basalt":[1276,0,508]},"biome_samples":{"frostpeak":[580,null,-524],"sunscorch":[-44,null,-452],"mire":[652,null,1012],"jungle":[844,null,196]},"grid_rle":[[9,771],[8,20],[9,117],[8,30],[9,109],[8,36],[9,103],[8,17],[5,1],[8,1],[5,5],[8,1],[5,3],[8,15],[9,97],[8,12],[5,1],[8,1],[5,22],[8,11],[9,87],[8,3],[9,5],[8,8],[6,5],[5,26],[1,1],[8,10],[9,82],[8,6],[9,3],[8,8],[6,6],[5,24],[1,3],[5,2],[8,10],[9,79],[8,8],[9,2],[8,6],[6,8],[5,31],[1,1],[8,9],[9,75],[8,15],[6,11],[5,21],[1,6],[5,7],[8,9],[9,71],[8,15],[6,1],[8,1],[6,11],[5,20],[1,9],[5,7],[8,9],[9,68],[8,14],[6,1],[8,1],[6,13],[5,19],[1,11],[5,9],[8,7],[9,65],[8,14],[6,1],[8,1],[6,15],[5,18],[1,11],[5,12],[8,7],[9,62],[8,13],[6,1],[8,1],[2,1],[6,16],[5,18],[1,9],[5,15],[8,7],[9,60],[8,12],[6,1],[8,1],[2,3],[6,16],[5,18],[1,6],[5,20],[8,7],[9,57],[8,11],[6,4],[2,2],[6,17],[5,46],[8,6],[9,54],[8,12],[6,5],[2,1],[6,19],[5,46],[8,6],[9,52],[8,11],[6,7],[2,1],[6,19],[5,25],[1,5],[5,18],[8,5],[9,50],[8,11],[6,27],[5,26],[1,6],[5,18],[8,5],[9,48],[8,12],[6,27],[5,24],[1,8],[5,19],[8,5],[9,46],[8,9],[2,1],[8,2],[2,2],[6,26],[5,24],[1,9],[5,19],[8,5],[9,44],[8,9],[2,6],[6,26],[5,24],[1,11],[5,18],[8,5],[9,42],[8,9],[2,7],[6,26],[5,23],[1,5],[5,1],[1,5],[5,20],[8,5],[9,41],[8,8],[2,8],[6,26],[5,23],[1,12],[5,20],[8,5],[9,40],[8,7],[2,8],[6,27],[5,23],[1,13],[5,20],[8,5],[9,40],[8,5],[2,10],[6,26],[5,26],[1,10],[5,21],[8,5],[9,38],[8,5],[2,9],[6,28],[5,27],[1,7],[5,24],[8,5],[9,36],[8,5],[2,9],[6,29],[5,28],[1,5],[5,26],[8,4],[9,35],[8,5],[6,2],[2,4],[6,33],[5,29],[1,3],[5,28],[8,4],[9,33],[8,5],[6,40],[5,61],[8,4],[9,32],[8,5],[6,40],[5,20],[1,1],[5,41],[8,4],[9,30],[8,5],[6,41],[5,16],[1,3],[5,1],[1,5],[5,37],[8,4],[9,29],[8,5],[6,42],[5,12],[1,18],[5,11],[1,1],[5,21],[8,4],[9,28],[8,4],[6,43],[5,12],[1,17],[5,3],[1,4],[5,2],[1,1],[5,2],[1,1],[5,22],[8,4],[9,26],[8,5],[6,43],[5,12],[1,18],[5,1],[1,5],[5,1],[1,3],[5,1],[1,1],[5,22],[8,4],[9,26],[8,4],[6,44],[5,12],[1,11],[5,1],[1,6],[5,1],[1,3],[5,2],[1,4],[5,25],[8,4],[9,24],[8,5],[6,43],[5,5],[1,1],[5,7],[1,13],[5,1],[1,2],[5,7],[1,2],[5,1],[1,2],[5,25],[8,4],[9,24],[8,5],[6,43],[5,4],[1,4],[5,5],[1,9],[5,2],[1,2],[5,9],[1,8],[5,23],[8,5],[9,22],[8,4],[2,3],[6,43],[5,1],[1,8],[5,3],[1,7],[5,4],[1,1],[5,9],[1,9],[5,24],[8,4],[9,22],[8,4],[2,3],[6,43],[5,1],[1,8],[5,4],[1,5],[5,3],[1,3],[5,9],[1,9],[5,25],[8,4],[9,20],[8,4],[2,4],[6,43],[1,9],[5,4],[1,10],[5,10],[1,9],[5,25],[8,4],[9,20],[8,4],[6,47],[1,10],[5,4],[1,3],[5,2],[1,3],[5,10],[1,10],[5,26],[8,4],[9,18],[8,4],[6,48],[1,10],[5,3],[2,1],[5,1],[2,2],[5,15],[1,9],[5,28],[8,2],[9,19],[8,4],[6,48],[1,9],[2,7],[5,16],[1,9],[5,4],[1,3],[5,21],[8,1],[9,19],[8,4],[6,48],[1,9],[2,8],[5,16],[1,9],[5,3],[1,4],[5,22],[8,1],[9,18],[8,4],[6,48],[1,7],[2,10],[5,16],[1,9],[5,3],[1,5],[5,20],[2,1],[8,1],[9,18],[8,3],[6,50],[1,5],[2,11],[5,16],[1,9],[5,3],[1,5],[5,19],[2,2],[8,2],[9,16],[8,4],[6,50],[5,2],[1,2],[2,13],[5,15],[1,10],[5,3],[1,4],[5,18],[2,3],[5,1],[8,1],[9,16],[8,3],[6,51],[5,3],[2,12],[1,4],[5,14],[1,10],[5,23],[2,4],[5,1],[8,2],[9,15],[8,3],[6,51],[5,3],[2,11],[1,5],[5,15],[1,9],[5,23],[2,5],[5,1],[8,2],[9,14],[8,3],[6,51],[5,3],[2,11],[1,1],[5,2],[1,3],[5,15],[1,10],[5,20],[2,6],[5,1],[8,3],[9,10],[8,1],[9,1],[8,4],[6,51],[5,3],[2,3],[9,3],[8,5],[1,1],[5,3],[1,1],[5,16],[1,12],[5,17],[2,7],[5,1],[8,4],[9,9],[8,5],[4,2],[6,50],[5,3],[2,1],[8,1],[9,5],[8,7],[5,1],[1,1],[5,16],[1,3],[5,5],[1,5],[5,15],[2,9],[8,6],[9,7],[8,5],[4,5],[6,47],[5,1],[8,1],[9,2],[8,1],[9,5],[8,9],[5,6],[4,1],[5,9],[1,2],[5,7],[1,2],[5,1],[1,1],[5,15],[2,9],[Line truncated
|
||||
{"_comment":"Generated by tools/zone_layout.py from world/zones.json; do not edit by hand.","seed":"isle-26","radius":1700,"step":24,"size":142,"zones":[{"id":"button_isle","name":"Button Isle","levels":[2,10]},{"id":"frostpeak","name":"Frostpeak Range","levels":[40,55]},{"id":"sunscorch","name":"Sunscorch","levels":[30,45]},{"id":"mire","name":"Mangrove Mire","levels":[25,38]},{"id":"jungle","name":"Verdant Jungle","levels":[18,30]},{"id":"highlands","name":"Highland Meadows","levels":[25,35]},{"id":"westmarch","name":"Westmarch","levels":[15,25]},{"id":"southwold","name":"Southwold","levels":[8,18]},{"id":"shallows","name":"Shallows","levels":[5,20]},{"id":"deep_sea","name":"Deep Sea","levels":[30,50]}],"caves":[{"id":"lush_caves","name":"Lush Caves","levels":[12,28],"biome":"minecraft:lush_caves"},{"id":"dripstone","name":"Dripstone Depths","levels":[22,38],"biome":"minecraft:dripstone_caves"},{"id":"deep_dark","name":"Deep Dark","levels":[45,60],"biome":"minecraft:deep_dark"},{"id":"basalt","name":"Basalt Furnace","levels":[55,70],"biome":"minecraft:basalt_deltas"}],"level_pressure":{"grace_levels":5,"per_level":0.1,"minimum":0.1},"samples":{"button_isle":[-116,null,-92],"frostpeak":[628,null,-572],"sunscorch":[1372,null,-236],"mire":[652,null,1012],"jungle":[844,null,196],"highlands":[100,null,-1076],"westmarch":[-428,null,-1100],"southwold":[-116,null,1108],"shallows":[988,null,4],"deep_sea":[-1268,null,4],"lush_caves":[-1028,0,292],"dripstone":[940,40,-212],"deep_dark":[292,-52,-812],"basalt":[1276,0,508]},"biome_samples":{"frostpeak":[580,null,-524],"sunscorch":[-44,null,-452],"mire":[652,null,1012],"jungle":[844,null,196]},"grid_rle":[[9,771],[8,20],[9,117],[8,30],[9,109],[8,36],[9,103],[8,17],[5,1],[8,1],[5,5],[8,1],[5,3],[8,15],[9,97],[8,12],[5,1],[8,1],[5,22],[8,11],[9,87],[8,3],[9,5],[8,8],[6,5],[5,26],[1,1],[8,10],[9,82],[8,6],[9,3],[8,8],[6,6],[5,24],[1,3],[5,2],[8,10],[9,79],[8,8],[9,2],[8,6],[6,8],[5,31],[1,1],[8,9],[9,75],[8,15],[6,11],[5,21],[1,6],[5,7],[8,9],[9,71],[8,15],[6,1],[8,1],[6,11],[5,20],[1,9],[5,7],[8,9],[9,68],[8,14],[6,1],[8,1],[6,13],[5,19],[1,11],[5,9],[8,7],[9,65],[8,14],[6,1],[8,1],[6,15],[5,18],[1,11],[5,12],[8,7],[9,62],[8,13],[6,1],[8,1],[2,1],[6,16],[5,18],[1,9],[5,15],[8,7],[9,60],[8,12],[6,1],[8,1],[2,3],[6,16],[5,18],[1,6],[5,20],[8,7],[9,57],[8,11],[6,4],[2,2],[6,17],[5,46],[8,6],[9,54],[8,12],[6,5],[2,1],[6,19],[5,46],[8,6],[9,52],[8,11],[6,7],[2,1],[6,19],[5,25],[1,5],[5,18],[8,5],[9,50],[8,11],[6,27],[5,26],[1,6],[5,18],[8,5],[9,48],[8,12],[6,27],[5,24],[1,8],[5,19],[8,5],[9,46],[8,9],[2,1],[8,2],[2,2],[6,26],[5,24],[1,9],[5,19],[8,5],[9,44],[8,9],[2,6],[6,26],[5,24],[1,11],[5,18],[8,5],[9,42],[8,9],[2,7],[6,26],[5,23],[1,5],[5,1],[1,5],[5,20],[8,5],[9,41],[8,8],[2,8],[6,26],[5,23],[1,12],[5,20],[8,5],[9,40],[8,7],[2,8],[6,27],[5,23],[1,13],[5,20],[8,5],[9,40],[8,5],[2,10],[6,26],[5,26],[1,10],[5,21],[8,5],[9,38],[8,5],[2,9],[6,28],[5,27],[1,7],[5,24],[8,5],[9,36],[8,5],[2,9],[6,29],[5,28],[1,5],[5,26],[8,4],[9,35],[8,5],[6,2],[2,4],[6,33],[5,29],[1,3],[5,28],[8,4],[9,33],[8,5],[6,40],[5,61],[8,4],[9,32],[8,5],[6,40],[5,20],[1,1],[5,41],[8,4],[9,30],[8,5],[6,41],[5,16],[1,3],[5,1],[1,5],[5,37],[8,4],[9,29],[8,5],[6,42],[5,12],[1,18],[5,11],[1,1],[5,21],[8,4],[9,28],[8,4],[6,43],[5,12],[1,17],[5,3],[1,4],[5,2],[1,1],[5,2],[1,1],[5,22],[8,4],[9,26],[8,5],[6,43],[5,12],[1,18],[5,1],[1,5],[5,1],[1,3],[5,1],[1,1],[5,22],[8,4],[9,26],[8,4],[6,44],[5,12],[1,11],[5,1],[1,6],[5,1],[1,3],[5,2],[1,4],[5,25],[8,4],[9,24],[8,5],[6,43],[5,5],[1,1],[5,7],[1,13],[5,1],[1,2],[5,7],[1,2],[5,1],[1,2],[5,25],[8,4],[9,24],[8,5],[6,43],[5,4],[1,4],[5,5],[1,9],[5,2],[1,2],[5,9],[1,8],[5,23],[8,5],[9,22],[8,4],[2,3],[6,43],[5,1],[1,8],[5,3],[1,7],[5,4],[1,1],[5,9],[1,9],[5,24],[8,4],[9,22],[8,4],[2,3],[6,43],[5,1],[1,8],[5,4],[1,5],[5,3],[1,3],[5,9],[1,9],[5,25],[8,4],[9,20],[8,4],[2,4],[6,43],[1,9],[5,4],[1,10],[5,10],[1,9],[5,25],[8,4],[9,20],[8,4],[6,47],[1,10],[5,4],[1,3],[5,2],[1,3],[5,10],[1,10],[5,26],[8,4],[9,18],[8,4],[6,48],[1,10],[5,3],[2,1],[5,1],[2,2],[5,15],[1,9],[5,28],[8,2],[9,19],[8,4],[6,48],[1,9],[2,7],[5,16],[1,9],[5,4],[1,3],[5,21],[8,1],[9,19],[8,4],[6,48],[1,9],[2,8],[5,16],[1,9],[5,3],[1,4],[5,22],[8,1],[9,18],[8,4],[6,48],[1,7],[2,10],[5,16],[1,9],[5,3],[1,5],[5,20],[2,1],[8,1],[9,18],[8,3],[6,50],[1,5],[2,11],[5,16],[1,9],[5,3],[1,5],[5,19],[2,2],[8,2],[9,16],[8,4],[6,50],[5,2],[1,2],[2,13],[5,15],[1,10],[5,3],[1,4],[5,18],[2,3],[5,1],[8,1],[9,16],[8,3],[6,51],[5,3],[2,12],[1,4],[5,14],[1,10],[5,23],[2,4],[5,1],[8,2],[9,15],[8,3],[6,51],[5,3],[2,11],[1,5],[5,15],[1,9],[5,23],[2,5],[5,1],[8,2],[9,14],[8,3],[6,51],[5,3],[2,11],[1,1],[5,2],[1,3],[5,15],[1,10],[5,20],[2,6],[5,1],[8,3],[9,10],[8,1],[9,1],[8,4],[6,51],[5,3],[2,3],[9,3],[8,5],[1,1],[5,3],[1,1],[5,16],[1,12],[5,17],[2,7],[5,1],[8,4],[9,9],[8,5],[4,2],[6,50],[5,3],[2,1],[8,1],[9,5],[8,7],[5,1],[1,1],[5,16],[1,3],[5,5],[1,5],[5,15],[2,9],[8,6],[9,7],[8,5],[4,5],[6,47],[5,1],[8,1],[9,2],[8,1],[9,5],[8Line truncated
|
||||
+15
-11
@@ -15,18 +15,22 @@ Every tunable lives in a config file or in this table. **Placeholder** means gue
|
||||
| Healing Machine recipe | 3 gold ingots, 4 iron ingots, 1 Max Revive, 1 diamond (shaped; Cobblemon: 3 copper, 4 iron, Max Revive, redstone) | Decided (Adrian, 2026-10-29) | `kubejs/server_scripts/healing_machine.js` | Roadmap: make Healing Machines expensive |
|
||||
| Healing Machine recharge | 3,600 s from empty to full (6 charge, one per full Pokémon heal; Cobblemon: 900 s) | Decided (Adrian, 2026-10-29) | `config/cobblemon/main.json` → `secondsToChargeHealingMachine` | So a machine heals a full party about once an hour of play |
|
||||
| Fainted Pokémon auto-recovery | never (`defaultFaintTimer` 1e9 s) | Decided (permadeath) | `config/cobblemon/main.json` | |
|
||||
| Zone level bands | Button Isle 2–10, Southwold 8–18, Westmarch 15–25, Verdant Jungle 18–30, Highland Meadows 25–35, Mangrove Mire 25–38, Sunscorch 30–45, Frostpeak 40–55, Shallows 5–20, Deep Sea 30–50, Lush Caves 12–28, Dripstone 22–38, Deep Dark 45–60, Basalt Furnace 55–70 | Placeholder | `world/zones.json` → `levels`, then `tools/zone_layout.py` and `tools/zone_spawns.py` | Zone shapes approved (Adrian, 2026-10-29) |
|
||||
| Evolution lines per zone (targets) | 15–35 per zone, scaled to the 377 lines available | Placeholder | `world/zones.json` → `lines` | Result per zone in `docs/zone-species.md` |
|
||||
| Lines pinned to a zone | Durant, Torkoal, Heatmor → Basalt Furnace | Placeholder | `world/zones.json` → `species` | Basalt's own lines were all too big for its caves |
|
||||
| Comfortable temperature range | 0.25–1.51 (Cold Sweat units; Cold Sweat: 0.4–1.51) | Placeholder | `config/coldsweat/main.toml` | Keeps the lowlands' nights livable without gear |
|
||||
| Windswept hills temperature | 45–72 °F (Cold Sweat: 24–58 °F) | Placeholder | `config/coldsweat/world.toml` | They lie in the starter lowlands too |
|
||||
| Insulating armour | fur set (cold 10/14/12/10), hide set (heat 10/14/12/10), as Cold Sweat; leather armour none (Cold Sweat: 5/7/6/5 both) | Placeholder | `config/coldsweat/item.toml` | Frostpeak at noon: about 1 min bare, 14 min in fur; Sunscorch at noon: about 2 min bare, 25 min in hide |
|
||||
| Sewn-in insulation | goat fur 2 cold, hoglin hide 2 heat, wool 0.5 cold, leather 0.5/0.5 (Cold Sweat: wool 1.5, leather 1/1, rabbit hide 1.5 heat) | Placeholder | `config/coldsweat/item.toml` | |
|
||||
| Goat Fur / Hoglin Hide recipes | 8 wool + 1 Heat Rock → 8 Goat Fur; 8 leather + 1 Icy Rock → 8 Hoglin Hide (a set takes 24) | Placeholder | `kubejs/server_scripts/insulation.js` | Heat and Icy Rocks come from the guardians before Frostpeak and Sunscorch (archaeology finds too) |
|
||||
| Zone level bands | Button Isle 2–10, Southwold 8–18, Westmarch 15–25, Verdant Jungle 18–30, Highland Meadows 25–35, Mangrove Mire 25–38, Sunscorch 30–45, Frostpeak 40–55, Shallows 5–20, Deep Sea 30–50, Lush Caves 12–28, Dripstone 22–38, Deep Dark 45–60, Basalt Furnace 55–70 | Decided (Adrian, 2026-10-30) | `world/zones.json` → `levels`, then `tools/zone_layout.py` and `tools/zone_spawns.py` | Zone shapes approved (Adrian, 2026-10-29) |
|
||||
| Evolution lines per zone (targets) | 15–35 per zone, scaled to the 377 lines available | Decided (Adrian, 2026-10-30) | `world/zones.json` → `lines` | Result per zone in `docs/zone-species.md` |
|
||||
| Lines pinned to a zone | Durant, Torkoal, Heatmor → Basalt Furnace | Decided (Adrian, 2026-10-30) | `world/zones.json` → `species` | Basalt's own lines were all too big for its caves |
|
||||
| Comfortable temperature range | 0.25–1.51 (Cold Sweat units; Cold Sweat: 0.4–1.51) | Decided (Adrian, 2026-10-30) | `config/coldsweat/main.toml` | Keeps the lowlands' nights livable without gear |
|
||||
| Windswept hills temperature | 45–72 °F (Cold Sweat: 24–58 °F) | Decided (Adrian, 2026-10-30) | `config/coldsweat/world.toml` | They lie in the starter lowlands too |
|
||||
| Insulating armour | fur set (cold 10/14/12/10), hide set (heat 10/14/12/10), as Cold Sweat; leather armour none (Cold Sweat: 5/7/6/5 both) | Decided (Adrian, 2026-10-30) | `config/coldsweat/item.toml` | Frostpeak at noon: about 1 min bare, 14 min in fur; Sunscorch at noon: about 2 min bare, 25 min in hide |
|
||||
| Sewn-in insulation | goat fur 2 cold, hoglin hide 2 heat, wool 0.5 cold, leather 0.5/0.5 (Cold Sweat: wool 1.5, leather 1/1, rabbit hide 1.5 heat) | Decided (Adrian, 2026-10-30) | `config/coldsweat/item.toml` | |
|
||||
| Goat Fur / Hoglin Hide recipes | 8 wool + 1 Heat Rock → 8 Goat Fur; 8 leather + 1 Icy Rock → 8 Hoglin Hide (a set takes 24) | Decided (Adrian, 2026-10-30) | `kubejs/server_scripts/insulation.js` | Heat and Icy Rocks come from the guardians before Frostpeak and Sunscorch (archaeology finds too) |
|
||||
| Guardian respawn | 5 hours of game time after being beaten | Decided (Adrian, 2026-10-29) | `world/zones.json` → `guardian_respawn_hours` | Fixed spots |
|
||||
| Guardian strength | strongest Pokémon spawning in the zone, band top + 5 levels, 1.5× size, uncatchable | Placeholder | `tools/zone_spawns.py` (`GUARDIAN_*`), `world/zones.json` → `guardian.species` | |
|
||||
| Guardian drops | Button Isle 10 Poké Balls + 4 Potions; Southwold 6 Great Balls + 4 Exp. Candy S; Westmarch and Jungle Mire Waders + 4 Pecha Berries + 2 Exp. Candy M; Mire and Highlands 3 Icy Rocks + 4 Super Potions; Sunscorch 3 Heat Rocks + 2 Exp. Candy L; Frostpeak and Deep Dark 3 Icy Rocks + 2 Exp. Candy L; Deep Sea Mystic Water + 3 Exp. Candy M | Placeholder | `world/zones.json` → `guardian.drops` | 3 rocks make one full fur or hide set |
|
||||
| Mire poison | Poison I for 7 s, renewed every 5 s while in the Mire without Mire Waders | Placeholder | `datapacks/core/data/cobblesurvival/zone_hazards/mire.json` | Vanilla Poison stops at half a heart |
|
||||
| Guardian strength | strongest Pokémon spawning in the zone, band top + 5 levels, 1.5× size, uncatchable | Decided (Adrian, 2026-10-30) | `tools/zone_spawns.py` (`GUARDIAN_*`), `world/zones.json` → `guardian.species` | |
|
||||
| Guardian drops | Button Isle 10 Poké Balls + 4 Potions; Southwold 6 Great Balls + 4 Exp. Candy S; Westmarch and Jungle Mire Waders + 4 Pecha Berries + 2 Exp. Candy M; Mire and Highlands 3 Icy Rocks + 4 Super Potions; Sunscorch 3 Heat Rocks + 2 Exp. Candy L; Frostpeak and Deep Dark 3 Icy Rocks + 2 Exp. Candy L; Deep Sea Mystic Water + 3 Exp. Candy M | Decided (Adrian, 2026-10-30) | `world/zones.json` → `guardian.drops` | 3 rocks make one full fur or hide set |
|
||||
| Mire poison | Poison I for 7 s, renewed every 5 s while in the Mire without Mire Waders | Decided (Adrian, 2026-10-30) | `datapacks/core/data/cobblesurvival/zone_hazards/mire.json` | Vanilla Poison stops at half a heart |
|
||||
| Level pressure | full experience up to 5 levels above the zone's band, then 10 % less per level, at least 10 % (Exp. Candy and commands exempt) | Decided (Adrian, 2026-10-30) | `world/zones.json` → `level_pressure` | E.g. on Button Isle (up to Lv 10): Lv 15 full, Lv 20 half, Lv 24+ a tenth |
|
||||
| Strong flyer | ridable through the air with top speed ≥ 60 or top stamina ≥ 85 (Cobblemon ride stats) | Decided (Adrian, 2026-10-30) | `tools/zone_spawns.py` (`STRONG_FLYER_*`) | 29 species |
|
||||
| High zone for strong flyers | band starts at Lv 30 or more (Sunscorch, Frostpeak, Deep Sea, Deep Dark, Basalt Furnace) | Decided (Adrian, 2026-10-30) | `tools/zone_spawns.py` (`HIGH_ZONE_LEVEL`) | |
|
||||
| Ride stats (speed, stamina, ...) | Cobblemon's own | To tune after play-testing | species `riding` via `species_additions` | |
|
||||
| Healing while sleeping | off (`healPercent` 0) | Decided (roadmap) | `config/cobblemon/main.json` | |
|
||||
| Loot container refresh | 1 hour (72,000 ticks of game time) after first opened, all containers | Decided (Adrian, 2026-10-29) | `config/lootr-common.toml` | Tiering by structure/biome later |
|
||||
| Gamerules in the template | `doMobSpawning false` | Decided (Adrian, 2026-10-28; may be reverted later) | `world/world.json` → `gamerules` | Pokémon spawning is Cobblemon's own `doPokemonSpawning` |
|
||||
|
||||
@@ -5,7 +5,7 @@ The agent could not run these: they need the game client, or accepting the Minec
|
||||
## Server (closes the "CI boots the server cleanly" check)
|
||||
|
||||
- [x] `python3 tools/smoke_test.py --accept-eula` passed on 2026-10-28 (EULA accepted by Adrian). Server started in 20 s, all 6 RCON checks passed (companion live, 1,025 species, core data pack enabled), no ERROR lines in the log. The 9 WARN lines are expected: offline mode set by the test, Cobblemon's optional Adorn mixin, and a KubeJS client-only plugin.
|
||||
- [ ] If the repo goes to GitHub and you accept the EULA for CI too, set the repository variable `MINECRAFT_EULA_ACCEPTED=true`.
|
||||
- [x] No CI (Adrian, 2026-10-30: no runners on the Gitea server); the smoke test runs locally.
|
||||
|
||||
## Prism instance "Cobblemon Survival Pack (dev)"
|
||||
|
||||
|
||||
@@ -21,7 +21,20 @@ Open `build/zone-map.png` (the island coloured by zone) and read the draft in `d
|
||||
|
||||
- **The Mire's poison** (step 5). Mire Waders from the Westmarch and Jungle guardians keep it off. Automated: `mire_poisons_without_waders`.
|
||||
|
||||
Still to come: soft level pressure, flyers.
|
||||
- **Soft level pressure** (step 6). Pokémon far above a zone's band learn less there. Automated: `level_pressure_cuts_xp`.
|
||||
|
||||
- **Flyers** (step 7). Strong flyers only spawn in zones from Lv 30 up; checked by `tools/zone_spawns.py`. Ride stats are still Cobblemon's.
|
||||
|
||||
All Phase 3 steps are in. Done-when from the roadmap: the spawn survey shows only each zone's species and levels (`spawn_survey`), and the cold zone hurts an unprotected player but not one in the fur set (`cold_needs_fur`).
|
||||
|
||||
## Ask Adrian: approve Phase 3 before Phase 4
|
||||
|
||||
**Approved 2026-10-30**, placeholders as they are; ride stats still to tune after play-testing.
|
||||
|
||||
- Zone species lists (`docs/zone-species.md`), guardians and their drops, level bands: placeholders to approve or change.
|
||||
- Hazard numbers: Frostpeak about 1 min bare / 14 min in fur at noon; Sunscorch about 2 / 25 min; the Mire's Poison every 5 s without waders.
|
||||
- Level pressure: 10 % less experience per level beyond 5 above the band, at least 10 %.
|
||||
- Flyers: ride stats unchanged until play-tested; Salamence never wild, Aerodactyl fossil-only.
|
||||
|
||||
## In-game
|
||||
|
||||
@@ -33,3 +46,5 @@ Still to come: soft level pressure, flyers.
|
||||
- [ ] **Lowlands:** a night in Southwold or on Button Isle without gear never gets dangerous.
|
||||
- [ ] **Guardians:** `/cobblesurvival guardians` (operator) lists each zone's guardian and spot. Walk there: a big Pokémon appears, can't be caught, and beating it puts its drops in your inventory with a gold message. It's gone for 5 hours of play.
|
||||
- [ ] **Mire:** walk into the Mangrove Mire: a green warning, then Poison keeps coming back. With Mire Waders on (from the Westmarch or Jungle guardian) nothing happens.
|
||||
- [ ] **Level pressure:** bring a Lv 30 Pokémon to Button Isle and win a battle: it gains only a sliver of experience, while a Lv 10 one gains the full amount.
|
||||
- [ ] **Flyers:** no Pokémon you can fly on turns up wild before Sunscorch or Frostpeak; mounting any flyer you own still works everywhere.
|
||||
+5
-1
@@ -111,6 +111,10 @@ Order of play the bands suggest: Button Isle → Southwold → Westmarch or Jung
|
||||
|
||||
**The Mire's poison** (Phase 3, step 5): while a player is in the Mangrove Mire without Mire Waders on, the companion mod gives them Poison every 5 seconds (`zone/ZoneHazards.kt`, data in `datapacks/core/data/cobblesurvival/zone_hazards/mire.json`, protection tag `#cobblesurvival:mire_protection`); the first time they walk in unprotected they get a warning. Vanilla Poison never kills, but it pins a player at half a heart, so a fall or a Pokémon's hit becomes deadly; milk, potions and golden apples still help. Mire Waders (leather boots, a KubeJS item) drop from the guardians of Westmarch and the Verdant Jungle, the zones before the Mire. Tested: `mire_poisons_without_waders`.
|
||||
|
||||
**Soft level pressure** (Phase 3, step 6; no hard level caps): a Pokémon more than 5 levels above the band of the zone its trainer is in gets 10 % less experience per extra level, down to 10 % (`zone/LevelPressure.kt`, values in `world/zones.json` → `level_pressure`). It counts battle experience and anything else except Exp. Candy and commands. The roadmap also offered a disobedience chance; experience alone is gentler and Cobblemon has nothing to build disobedience on. Tested: `level_pressure_cuts_xp`.
|
||||
|
||||
**Flyers** (Phase 3, step 7): strong flyers only spawn in high-level zones. A species you can ride through the air with a top flying speed of 60 or a top stamina of 85 (Cobblemon's ride stats) never spawns in a zone whose band starts below Lv 30; its weaker pre-evolutions still do, and a line that starts as a strong flyer is only placed in such zones (`tools/zone_spawns.py`, which refuses to write pools that break this). So Drampa lives in Sunscorch, Togekiss, Staraptor and Braviary in Frostpeak, Charizard in the Basalt Furnace; Salamence never spawns (Bagon and Shelgon stay in the Dripstone caves), and Aerodactyl only comes from fossils. Ride stats stay Cobblemon's for now: they can be overridden per species with a `species_additions` file replacing `riding`, best tuned after play-testing how far a flyer takes you on a 3 km island. Nothing blocks mounting.
|
||||
|
||||
**Alpha guardians** (Phase 3, step 4; Adrian, 2026-10-29: fixed spots, back 5 hours after being beaten):
|
||||
- One per zone except the Shallows, Lush Caves and Dripstone; the Basalt Furnace gets its boss in Phase 7. Each stands at its zone's sample point (deep inside the zone; a cave floor for the Deep Dark) and only appears while a player is within 96 blocks; it wanders no further than 24 blocks.
|
||||
- The guardian is the strongest Pokémon that spawns walking (or, at sea, swimming) in its zone, five levels above the band, half again as big, and uncatchable: Pachirisu (Button Isle), Sigilyph (Southwold), Carbink (Westmarch), Tangrowth (Jungle), Arcanine (Mire), Cinderace (Highlands), Delphox (Sunscorch), Tyranitar (Frostpeak), Kingdra (Deep Sea), Dusknoir (Deep Dark). `world/zones.json` → `guardian.species` overrides the pick.
|
||||
@@ -130,7 +134,7 @@ Order of play the bands suggest: Button Isle → Southwold → Westmarch or Jung
|
||||
| --- | --- |
|
||||
| Roadmap's open decisions table (loader, island size, safety net, boss AoE, etc.) | Roadmap defaults, unchanged |
|
||||
| **Platform split** (deferred until a public release; not publishing for now) | No platform hosts the full mod list (FTB Quests is CurseForge-only; CobbleHardcoreMon is Modrinth-only). Both mods stay; the exports keep listing what they leave out. Options for release: (a) publish one platform's pack, or both with the gaps listed; (b) ask the authors to cross-post (CobbleHardcoreMon, Matthiesen Core, Regenerating Ore Veins and Ore Generation Configuration are MIT); (c) a quest mod on both platforms; (d) permadeath in the companion mod |
|
||||
| **Minecraft EULA for CI.** Adrian accepted it for the local test server on 2026-10-28 | CI still runs `--load-only` until the repository variable `MINECRAFT_EULA_ACCEPTED=true` is set |
|
||||
| **No CI** (Adrian, 2026-10-30): no Actions runners on the Gitea server, which is too weak; a push that started the old `.github/workflows/ci.yml` crashed it. The workflow is removed (still in the git history) | The roadmap's "CI smoke test" runs locally instead: `tools/smoke_test.py`, `tools/selftest.py`, `tools/quick_check.py`. Adrian accepted the Minecraft EULA for the local test server on 2026-10-28 |
|
||||
| License for the companion mod and pack content | MIT for the companion mod (placeholder); nothing chosen for the rest |
|
||||
| Pack name and mod id | "Cobblemon Survival Pack" / `cobblesurvival` (working titles) |
|
||||
| Basalt deltas keeps the vanilla Nether biome's mobs and features: ghasts, magma cubes and striders can spawn in those caves, glowstone generates, and Cobblemon's Nether-themed habitats appear there (found by the field guide) | Settled by Phase 2: no vanilla mob can join (`world/OnlyPokemon.kt`), so no ghasts, magma cubes or striders; glowstone and Cobblemon's Nether-themed habitats stay |
|
||||
|
||||
+10
-10
@@ -10,17 +10,17 @@ Bidoof, Bonsly, Caterpie (Butterfree, Caterpie, Metapod), Combee, Diglett, Ditto
|
||||
|
||||
Axew (Fraxure, Haxorus), Basculin (Basculegion, Basculin), Budew (Roselia, Roserade), Cherubi (Cherrim), Chespin (Chesnaught, Quilladin), Chikorita (Bayleef, Meganium), Chimchar (Infernape, Monferno), Cryogonal, Cufant (Copperajah), Delibird, Duraludon (Archaludon, Duraludon), Elekid (Electabuzz, Electivire), Gossifleur (Eldegoss), Larvitar (Pupitar, Tyranitar), Machop (Machamp, Machoke), Makuhita (Hariyama), Mankey (Annihilape, Primeape), Mienfoo (Mienshao), Minior, Rhyhorn (Rhydon, Rhyperior), Riolu (Lucario), Rockruff (Lycanroc), Rowlet (Dartrix, Decidueye), Rufflet (Braviary), Salandit, Sawk, Skiddo (Gogoat), Smoochum (Jynx), Sneasel (Sneasel, Sneasler), Snom (Frosmoth), Snorunt (Froslass, Glalie), Snover (Abomasnow), Spinda, Spoink (Grumpig), Sprigatito (Floragato, Meowscarada), Spritzee (Aromatisse), Starly (Staraptor), Throh, Togedemaru, Togepi (Togekiss, Togetic), Tyrogue (Hitmonchan, Hitmonlee, Hitmontop), Vanillite (Vanillish, Vanilluxe), Wooloo (Dubwool)
|
||||
|
||||
## Sunscorch (Lv 30–45, 32 lines)
|
||||
## Sunscorch (Lv 30–45, 33 lines)
|
||||
|
||||
Bramblin (Brambleghast), Cacnea (Cacnea, Cacturne), Capsakid (Capsakid, Scovillain), Cubone (Cubone, Marowak), Dwebble (Crustle, Dwebble), Ekans (Arbok), Falinks, Fennekin (Braixen, Delphox, Fennekin), Flittle (Espathra), Fuecoco (Crocalor, Fuecoco, Skeledirge), Helioptile (Heliolisk), Hippopotas (Hippopotas, Hippowdon), Klawf, Larvesta, Maractus, Nacli (Garganacl, Naclstack), Numel (Camerupt, Numel), Pawniard, Phanpy (Donphan, Phanpy), Poltchageist (Poltchageist, Sinistcha), Rellor (Rabsca), Sandile (Krokorok, Krookodile), Sandshrew (Sandshrew, Sandslash), Scraggy (Scrafty, Scraggy), Shinx (Luxio, Luxray), Silicobra (Sandaconda, Silicobra), Skarmory, Skorupi (Drapion, Skorupi), Spearow (Fearow), Totodile (Croconaw, Feraligatr, Totodile), Trapinch (Flygon, Vibrava), Tympole (Palpitoad, Seismitoad)
|
||||
Bramblin (Brambleghast), Cacnea (Cacnea, Cacturne), Capsakid (Capsakid, Scovillain), Cubone (Cubone, Marowak), Drampa, Dwebble (Crustle, Dwebble), Ekans (Arbok), Falinks, Fennekin (Braixen, Delphox, Fennekin), Flittle (Espathra), Fuecoco (Crocalor, Fuecoco, Skeledirge), Helioptile (Heliolisk), Hippopotas (Hippopotas, Hippowdon), Klawf, Larvesta, Maractus, Nacli (Garganacl, Naclstack), Numel (Camerupt, Numel), Pawniard, Phanpy (Donphan, Phanpy), Poltchageist (Poltchageist, Sinistcha), Rellor (Rabsca), Sandile (Krokorok, Krookodile), Sandshrew (Sandshrew, Sandslash), Scraggy (Scrafty, Scraggy), Shinx (Luxio, Luxray), Silicobra (Sandaconda, Silicobra), Skarmory, Skorupi (Drapion, Skorupi), Spearow (Fearow), Totodile (Croconaw, Feraligatr, Totodile), Trapinch (Flygon, Vibrava), Tympole (Palpitoad, Seismitoad)
|
||||
|
||||
## Mangrove Mire (Lv 25–38, 29 lines)
|
||||
## Mangrove Mire (Lv 25–38, 26 lines)
|
||||
|
||||
Applin (Appletun, Applin, Dipplin, Flapple, Hydrapple), Arrokuda (Arrokuda, Barraskewda), Croagunk (Croagunk, Toxicroak), Deino, Dondozo, Dratini (Dragonair, Dratini), Ducklett (Ducklett, Swanna), Flabébé (Flabébé, Floette, Florges), Flamigo, Froakie (Froakie, Frogadier, Greninja), Gible (Gabite, Gible), Goomy, Growlithe (Arcanine, Growlithe), Happiny (Chansey), Illumise, Karrablast (Escavalier, Karrablast), Magikarp (Gyarados), Misdreavus, Mudkip (Marshtomp, Mudkip, Swampert), Munchlax (Munchlax, Snorlax), Shelmet (Accelgor, Shelmet), Slowpoke, Sobble (Drizzile, Inteleon, Sobble), Surskit (Masquerain, Surskit), Tadbulb (Bellibolt, Tadbulb), Tatsugiri, Teddiursa (Teddiursa, Ursaring), Volbeat, Yanma (Yanma, Yanmega)
|
||||
Applin (Appletun, Applin, Dipplin, Flapple, Hydrapple), Arrokuda (Arrokuda, Barraskewda), Croagunk (Croagunk, Toxicroak), Deino, Dondozo, Dratini (Dragonair, Dratini), Ducklett (Ducklett, Swanna), Flabébé (Flabébé, Floette, Florges), Flamigo, Froakie (Froakie, Frogadier, Greninja), Gible (Gabite, Gible), Goomy, Growlithe (Arcanine, Growlithe), Illumise, Karrablast (Escavalier, Karrablast), Misdreavus, Mudkip (Marshtomp, Mudkip, Swampert), Shelmet (Accelgor, Shelmet), Slowpoke, Sobble (Drizzile, Inteleon, Sobble), Surskit (Masquerain, Surskit), Tadbulb (Bellibolt, Tadbulb), Tatsugiri, Teddiursa (Teddiursa, Ursaring), Volbeat, Yanma (Yanma, Yanmega)
|
||||
|
||||
## Verdant Jungle (Lv 18–30, 34 lines)
|
||||
## Verdant Jungle (Lv 18–30, 35 lines)
|
||||
|
||||
Aipom, Bellsprout (Bellsprout, Weepinbell), Bounsweet (Bounsweet, Steenee, Tsareena), Bulbasaur (Bulbasaur, Ivysaur), Chatot, Darumaka, Exeggcute (Exeggcute, Exeggutor), Fomantis, Glimmet, Grookey (Grookey, Thwackey), Jangmo-o, Kecleon, Litten (Litten, Torracat), Magnemite (Magnemite, Magneton), Natu (Natu, Xatu), Noibat, Nosepass, Panpour (Panpour, Simipour), Pansage (Pansage, Simisage), Pansear (Pansear, Simisear), Pikipek (Pikipek, Toucannon, Trumbeak), Porygon, Shroodle (Grafaiai, Shroodle), Slakoth (Slakoth, Vigoroth), Snivy (Servine, Snivy), Stunfisk, Tangela (Tangela, Tangrowth), Treecko (Grovyle, Treecko), Tropius, Unown, Venipede (Scolipede, Venipede, Whirlipede), Wimpod (Golisopod, Wimpod), Woobat (Swoobat, Woobat), Zubat (Golbat, Zubat)
|
||||
Aipom, Bellsprout (Bellsprout, Weepinbell), Bounsweet (Bounsweet, Steenee, Tsareena), Bulbasaur (Bulbasaur, Ivysaur), Chatot, Darumaka, Exeggcute (Exeggcute, Exeggutor), Fomantis, Glimmet, Grookey (Grookey, Thwackey), Happiny (Chansey, Happiny), Jangmo-o, Kecleon, Litten (Litten, Torracat), Magikarp (Gyarados, Magikarp), Magnemite (Magnemite, Magneton), Munchlax, Natu (Natu, Xatu), Noibat, Panpour (Panpour, Simipour), Pansage (Pansage, Simisage), Pansear (Pansear, Simisear), Pikipek (Pikipek, Toucannon, Trumbeak), Porygon, Shroodle (Grafaiai, Shroodle), Slakoth (Slakoth, Vigoroth), Snivy (Servine, Snivy), Stunfisk, Tangela (Tangela, Tangrowth), Treecko (Grovyle, Treecko), Tropius, Unown, Wimpod (Golisopod, Wimpod), Woobat (Swoobat, Woobat), Zubat (Golbat, Zubat)
|
||||
|
||||
## Highland Meadows (Lv 25–35, 39 lines)
|
||||
|
||||
@@ -28,11 +28,11 @@ Abra (Abra, Alakazam, Kadabra), Bouffalant, Buizel (Buizel, Floatzel), Chewtle (
|
||||
|
||||
## Westmarch (Lv 15–25, 49 lines)
|
||||
|
||||
Baltoy, Bronzor, Buneary, Carbink, Corphish, Corsola, Deerling, Dewpider (Araquanid, Dewpider), Drifloon, Drilbur, Dunsparce, Eevee, Farfetch'd, Fletchling (Fletchinder, Fletchling), Gastly (Gastly, Haunter), Geodude (Geodude, Graveler), Grimer, Grubbin (Charjabug, Grubbin), Hawlucha, Heracross, Honedge, Klink, Lillipup (Herdier, Lillipup), Maschiff, Milcery (Alcremie, Milcery), Mime Jr., Nickit (Nickit, Thievul), Onix, Petilil (Lilligant, Petilil), Phantump, Pichu (Pichu, Pikachu), Pinsir, Pumpkaboo, Ralts (Kirlia, Ralts), Roggenrola (Boldore, Roggenrola), Rolycoly (Carkol, Rolycoly), Scyther, Seedot (Nuzleaf, Seedot), Shroomish (Breloom, Shroomish), Skwovet (Greedent, Skwovet), Solosis, Stunky, Tandemaus (Maushold, Tandemaus), Tentacool, Timburr (Gurdurr, Timburr), Toxel, Tynamo, Varoom, Yamper (Boltund, Yamper)
|
||||
Baltoy, Bronzor, Buneary, Carbink, Corphish, Corsola, Deerling, Dewpider (Araquanid, Dewpider), Drifloon, Drilbur, Dunsparce, Eevee, Farfetch'd, Fletchling (Fletchinder, Fletchling), Gastly (Gastly, Haunter), Geodude (Geodude, Graveler), Grimer, Grubbin (Charjabug, Grubbin), Hawlucha, Heracross, Honedge, Klink, Lillipup (Herdier, Lillipup), Maschiff, Milcery (Alcremie, Milcery), Mime Jr., Nickit (Nickit, Thievul), Nosepass, Onix, Petilil (Lilligant, Petilil), Phantump, Pichu (Pichu, Pikachu), Pinsir, Pumpkaboo, Ralts (Kirlia, Ralts), Roggenrola (Boldore, Roggenrola), Rolycoly (Carkol, Rolycoly), Scyther, Seedot (Nuzleaf, Seedot), Shroomish (Breloom, Shroomish), Skwovet (Greedent, Skwovet), Stunky, Tandemaus (Maushold, Tandemaus), Tentacool, Timburr (Gurdurr, Timburr), Toxel, Tynamo, Varoom, Yamper (Boltund, Yamper)
|
||||
|
||||
## Southwold (Lv 8–18, 50 lines)
|
||||
|
||||
Absol, Audino, Azurill (Azumarill, Azurill, Marill), Barboach, Bunnelby, Burmy, Chingling, Comfey, Cutiefly, Drampa, Drowzee, Druddigon, Elgyem, Espurr, Fidough, Furfrou, Glameow, Goldeen, Indeedee, Joltik, Klefki, Koffing, Lotad (Lombre, Lotad), Meowth, Minccino, Minun, Morpeko, Munna, Orthworm, Patrat, Pidove, Plusle, Purrloin, Relicanth, Sentret (Furret, Sentret), Shuppet, Sigilyph, Slugma, Snubbull, Squawkabilly, Swablu, Swirlix, Taillow, Trubbish, Venonat, Voltorb, Whismur, Yamask, Yungoos, Zigzagoon
|
||||
Absol, Audino, Azurill (Azumarill, Azurill, Marill), Barboach, Bunnelby, Burmy, Chingling, Comfey, Cutiefly, Drowzee, Druddigon, Elgyem, Espurr, Fidough, Furfrou, Glameow, Goldeen, Indeedee, Joltik, Klefki, Koffing, Lotad (Lombre, Lotad), Meowth, Minccino, Minun, Morpeko, Munna, Orthworm, Patrat, Pidove, Plusle, Purrloin, Relicanth, Sentret (Furret, Sentret), Shuppet, Sigilyph, Slugma, Snubbull, Solosis, Squawkabilly, Swablu, Swirlix, Taillow, Trubbish, Venonat, Voltorb, Whismur, Yamask, Yungoos, Zigzagoon
|
||||
|
||||
## Shallows (Lv 5–20, 21 lines)
|
||||
|
||||
@@ -44,7 +44,7 @@ Binacle (Barbaracle, Binacle), Clamperl (Clamperl, Gorebyss, Huntail), Clauncher
|
||||
|
||||
## Lush Caves (Lv 12–28, 16 lines)
|
||||
|
||||
Aerodactyl, Amaura, Anorith, Archen, Carnivine, Cranidos, Ferroseed, Kabuto, Lileep, Morelull (Morelull, Shiinotic), Omanyte, Paras (Paras, Parasect), Shieldon, Shuckle, Tirtouga, Tyrunt
|
||||
Amaura, Anorith, Archen, Carnivine, Cranidos, Ferroseed, Kabuto, Lileep, Morelull (Morelull, Shiinotic), Omanyte, Paras (Paras, Parasect), Shieldon, Shuckle, Tirtouga, Tyrunt, Venipede (Venipede, Whirlipede)
|
||||
|
||||
## Dripstone Depths (Lv 22–38, 5 lines)
|
||||
|
||||
@@ -70,7 +70,7 @@ One per zone at its sample point, uncatchable, five levels above the band; it re
|
||||
| Mangrove Mire | Arcanine | 43 | 3× icy_rock, 4× super_potion |
|
||||
| Verdant Jungle | Tangrowth | 35 | 1× mire_waders, 4× pecha_berry, 2× exp_candy_m |
|
||||
| Highland Meadows | Cinderace | 40 | 3× icy_rock, 4× super_potion |
|
||||
| Westmarch | Pinsir | 30 | 1× mire_waders, 4× pecha_berry, 2× exp_candy_m |
|
||||
| Westmarch | Scyther | 30 | 1× mire_waders, 4× pecha_berry, 2× exp_candy_m |
|
||||
| Southwold | Sigilyph | 23 | 6× great_ball, 4× exp_candy_s |
|
||||
| Deep Sea | Kingdra | 55 | 1× mystic_water, 3× exp_candy_m |
|
||||
| Deep Dark | Dusknoir | 65 | 3× icy_rock, 2× exp_candy_l |
|
||||
@@ -8,6 +8,7 @@ import dev.cobblesurvival.permadeath.Permadeath
|
||||
import dev.cobblesurvival.selftest.SelfTest
|
||||
import dev.cobblesurvival.world.OnlyPokemon
|
||||
import dev.cobblesurvival.zone.Guardians
|
||||
import dev.cobblesurvival.zone.LevelPressure
|
||||
import dev.cobblesurvival.zone.ZoneCondition
|
||||
import dev.cobblesurvival.zone.ZoneHazards
|
||||
import dev.cobblesurvival.zone.Zones
|
||||
@@ -59,6 +60,7 @@ class CobbleSurvival {
|
||||
NeoForge.EVENT_BUS.addListener(Zones::onAddReloadListeners)
|
||||
Guardians.register()
|
||||
ZoneHazards.register()
|
||||
LevelPressure.register()
|
||||
SelfTest.register()
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package dev.cobblesurvival.selftest
|
||||
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.api.pokemon.experience.CandyExperienceSource
|
||||
import com.cobblemon.mod.common.api.pokemon.experience.SidemodExperienceSource
|
||||
import com.cobblemon.mod.common.api.spawning.CobblemonSpawnPools
|
||||
import com.cobblemon.mod.common.api.spawning.SpawnCause
|
||||
import com.cobblemon.mod.common.api.spawning.detail.PokemonSpawnDetail
|
||||
@@ -9,6 +11,7 @@ import com.cobblemon.mod.common.api.spawning.position.calculators.SpawnablePosit
|
||||
import com.cobblemon.mod.common.api.spawning.spawner.SpawningZoneInput
|
||||
import com.cobblemon.mod.common.util.spawner
|
||||
import dev.cobblesurvival.CobbleSurvival
|
||||
import dev.cobblesurvival.zone.LevelPressure
|
||||
import dev.cobblesurvival.zone.Zone
|
||||
import dev.cobblesurvival.zone.ZoneSample
|
||||
import dev.cobblesurvival.zone.Zones
|
||||
@@ -16,7 +19,9 @@ import net.minecraft.core.BlockPos
|
||||
import net.minecraft.gametest.framework.GameTestAssertException
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
import net.minecraft.util.Mth
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.level.levelgen.Heightmap
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
/**
|
||||
* Roadmap Phase 3: each zone has its own Pokémon and levels. The spawn pools come from tools/zone_spawns.py;
|
||||
@@ -30,10 +35,36 @@ object ZoneTests {
|
||||
fun all() = listOf(
|
||||
SelfTestCase("spawn_pools_are_zoned", 20, ::spawnPoolsAreZoned),
|
||||
SelfTestCase("spawn_survey", 2400, ::spawnSurvey, islandOnly = true),
|
||||
SelfTestCase("level_pressure_cuts_xp", 100, ::levelPressure),
|
||||
)
|
||||
|
||||
private fun zoneOf(detail: SpawnDetail): Zone? = Zones.byId[detail.id.substringBefore('-')]
|
||||
|
||||
/** On Button Isle (band up to 10, 5 levels' grace): a Lv 10 Pokémon keeps its experience, a Lv 25 one 10 %. */
|
||||
private fun levelPressure(s: Scenario) {
|
||||
val zone = Zones.byId["button_isle"] ?: throw GameTestAssertException("no Button Isle zone")
|
||||
val sample = Zones.samples["button_isle"] ?: throw GameTestAssertException("no sample point for Button Isle")
|
||||
val player = s.player()
|
||||
val inBand = s.give(player, s.pokemon("bidoof", zone.maxLevel))
|
||||
val farAbove = s.give(player, s.pokemon("bidoof", zone.maxLevel + 15))
|
||||
val expected = (1000 * LevelPressure.factor(farAbove.level, zone)).roundToInt()
|
||||
s.helper.startSequence()
|
||||
.thenExecute {
|
||||
s.level.getChunk(sample.x shr 4, sample.z shr 4)
|
||||
s.moveTo(player, sample.x + 0.5, s.level.getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, sample.x, sample.z).toDouble(), sample.z + 0.5)
|
||||
}
|
||||
.thenExecute {
|
||||
val battle = SidemodExperienceSource(CobbleSurvival.MOD_ID)
|
||||
val kept = inBand.addExperienceWithPlayer(player, battle, 1000).experienceAdded
|
||||
val cut = farAbove.addExperienceWithPlayer(player, battle, 1000).experienceAdded
|
||||
val candy = farAbove.addExperienceWithPlayer(player, CandyExperienceSource(player, ItemStack.EMPTY), 1000).experienceAdded
|
||||
s.check(kept == 1000) { "a Pokémon at the band's top got $kept of 1000 experience" }
|
||||
s.check(cut == expected) { "a Pokémon 15 levels above the band got $cut of 1000 experience, not $expected" }
|
||||
s.check(candy == 1000) { "Exp. Candy was cut too: $candy of 1000" }
|
||||
}
|
||||
.thenSucceed()
|
||||
}
|
||||
|
||||
/** Every loaded spawn entry belongs to a zone and spawns within its level band; none of Cobblemon's is left. */
|
||||
private fun spawnPoolsAreZoned(s: Scenario) {
|
||||
val details = CobblemonSpawnPools.WORLD_SPAWN_POOL.details
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
package dev.cobblesurvival.zone
|
||||
|
||||
import com.cobblemon.mod.common.api.Priority
|
||||
import com.cobblemon.mod.common.api.events.CobblemonEvents
|
||||
import com.cobblemon.mod.common.api.events.pokemon.ExperienceGainedEvent
|
||||
import com.cobblemon.mod.common.api.pokemon.experience.CandyExperienceSource
|
||||
import com.cobblemon.mod.common.api.pokemon.experience.CommandExperienceSource
|
||||
import kotlin.math.max
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
/**
|
||||
* Soft level pressure (roadmap Phase 3; no hard level caps): a Pokémon far above the level band of the zone its
|
||||
* trainer is in learns less from battles there. Up to [LevelPressureRules.graceLevels] above the band's top it
|
||||
* gets full experience; every level beyond costs [LevelPressureRules.perLevel] of it, down to
|
||||
* [LevelPressureRules.minimum]. Exp. Candy and commands are never cut.
|
||||
*/
|
||||
object LevelPressure {
|
||||
fun register() {
|
||||
CobblemonEvents.EXPERIENCE_GAINED_EVENT_PRE.subscribe(Priority.NORMAL, ::onExperience)
|
||||
}
|
||||
|
||||
/** The share of experience a Pokémon of [level] keeps in [zone]. */
|
||||
fun factor(level: Int, zone: Zone, rules: LevelPressureRules = Zones.levelPressure): Double {
|
||||
val over = level - (zone.maxLevel + rules.graceLevels)
|
||||
return if (over <= 0) 1.0 else max(rules.minimum, 1.0 - over * rules.perLevel)
|
||||
}
|
||||
|
||||
private fun onExperience(event: ExperienceGainedEvent.Pre) {
|
||||
if (event.source is CandyExperienceSource || event.source is CommandExperienceSource) return
|
||||
val player = event.pokemon.getOwnerPlayer() ?: return
|
||||
val zone = Zones.at(player.serverLevel(), player.blockPosition()) ?: return
|
||||
val keep = factor(event.pokemon.level, zone)
|
||||
if (keep < 1.0) event.experience = max(1, (event.experience * keep).roundToInt())
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,9 @@ import net.neoforged.neoforge.event.AddReloadListenerEvent
|
||||
/** One zone of the island (world/zones.json). */
|
||||
data class Zone(val id: String, val name: String, val minLevel: Int, val maxLevel: Int)
|
||||
|
||||
/** Soft level pressure (world/zones.json → level_pressure). */
|
||||
data class LevelPressureRules(val graceLevels: Int = 5, val perLevel: Double = 0.1, val minimum: Double = 0.1)
|
||||
|
||||
/** A point deep inside a zone (y only for cave zones), used by the spawn survey. */
|
||||
data class ZoneSample(val x: Int, val y: Int?, val z: Int)
|
||||
|
||||
@@ -36,6 +39,8 @@ object Zones : SimpleJsonResourceReloadListener(Gson(), "zones") {
|
||||
private var caves: Map<ResourceLocation, Zone> = emptyMap()
|
||||
var samples: Map<String, ZoneSample> = emptyMap()
|
||||
private set
|
||||
var levelPressure = LevelPressureRules()
|
||||
private set
|
||||
/** For zones made of biomes: a point inside their own hazard biome (Frostpeak's jagged peaks, ...). */
|
||||
var biomeSamples: Map<String, ZoneSample> = emptyMap()
|
||||
private set
|
||||
@@ -58,6 +63,13 @@ object Zones : SimpleJsonResourceReloadListener(Gson(), "zones") {
|
||||
val caveZones = json.getAsJsonArray("caves").map { it.asJsonObject }
|
||||
caves = caveZones.associate { ResourceLocation.parse(it.get("biome").asString) to zone(it) }
|
||||
byId = (byIndex + caves.values).associateBy { it.id }
|
||||
levelPressure = json.getAsJsonObject("level_pressure")?.let { rules ->
|
||||
LevelPressureRules(
|
||||
graceLevels = rules.get("grace_levels")?.asInt ?: 5,
|
||||
perLevel = rules.get("per_level")?.asDouble ?: 0.1,
|
||||
minimum = rules.get("minimum")?.asDouble ?: 0.1,
|
||||
)
|
||||
} ?: LevelPressureRules()
|
||||
samples = samplesOf(json, "samples")
|
||||
biomeSamples = samplesOf(json, "biome_samples")
|
||||
radius = json.get("radius").asInt
|
||||
|
||||
@@ -312,6 +312,7 @@ def write_datapack(zone, plan, preview):
|
||||
"seed": preview["seed"], "radius": preview["radius"], "step": preview["step"], "size": preview["size"],
|
||||
"zones": [{k: z[k] for k in keep} for z in plan["zones"]],
|
||||
"caves": [{**{k: c[k] for k in keep}, "biome": c["biome"]} for c in plan["caves"]],
|
||||
"level_pressure": plan.get("level_pressure", {}),
|
||||
"samples": samples(zone, plan, preview),
|
||||
"biome_samples": biome_samples(zone, plan, preview),
|
||||
"grid_rle": runs,
|
||||
|
||||
+47
-13
@@ -21,7 +21,8 @@ datapacks/core/data/cobblesurvival/spawn_pool_world/<zone>.json:
|
||||
doesn't spawn there. If no stage fits, the closest one spawns across the whole band.
|
||||
3. world/zones.json → "species" pins a line to a zone by hand: {"pikachu": "southwold"}.
|
||||
4. In cave zones, sky-light minimums, "can see sky" and the "natural" ground preset are dropped.
|
||||
5. Each zone with a "guardian" gets datapacks/core/data/cobblesurvival/guardians/<zone>.json: the
|
||||
5. Strong flyers (STRONG_FLYER_*) only spawn in zones whose band starts at HIGH_ZONE_LEVEL or more.
|
||||
6. Each zone with a "guardian" gets datapacks/core/data/cobblesurvival/guardians/<zone>.json: the
|
||||
strongest Pokémon spawning in the zone (or "species"), uncatchable, half again as big, five levels
|
||||
above the band, with the zone's boss drops and world/zones.json → guardian_respawn_hours.
|
||||
|
||||
@@ -54,6 +55,13 @@ MIN_CELLS = 5 # a zone "has" a biome when at least this many grid cells of it l
|
||||
# tags): its biomes say nothing about a home, so it only goes to a land zone, by strength. Its cave and
|
||||
# water entries still spawn underground and in the rivers of that zone.
|
||||
ALL_ROUNDER = 0.8
|
||||
# Roadmap Phase 3: strong flyers only spawn in high-level zones. A species you can ride through the air with a top
|
||||
# flying speed or stamina this high never spawns in a zone whose band starts below HIGH_ZONE_LEVEL (its weaker
|
||||
# pre-evolutions still do), and a line that starts as one is placed in such a zone only; if none fits its habitat,
|
||||
# it doesn't spawn in the wild.
|
||||
STRONG_FLYER_SPEED = 60
|
||||
STRONG_FLYER_STAMINA = 85
|
||||
HIGH_ZONE_LEVEL = 30
|
||||
|
||||
|
||||
def cobblemon_jar():
|
||||
@@ -98,16 +106,23 @@ def zone_biomes(plan, layout, preview):
|
||||
return shares
|
||||
|
||||
|
||||
def base_stat_totals(jar):
|
||||
"""{species id: base-stat total} from Cobblemon's species files."""
|
||||
totals = {}
|
||||
def species_data(jar):
|
||||
"""({species id: base-stat total}, {species ids that are strong flyers}) from Cobblemon's species files."""
|
||||
totals, flyers = {}, set()
|
||||
with zipfile.ZipFile(jar) as z:
|
||||
for name in z.namelist():
|
||||
m = re.fullmatch(r"data/cobblemon/species/[^/]+/([^/]+)\.json", name)
|
||||
if m:
|
||||
stats = json.loads(z.read(name)).get("baseStats", {})
|
||||
totals[f"cobblemon:{m[1]}"] = sum(stats.values())
|
||||
return totals
|
||||
if not m:
|
||||
continue
|
||||
data = json.loads(z.read(name))
|
||||
totals[f"cobblemon:{m[1]}"] = sum(data.get("baseStats", {}).values())
|
||||
air = ((data.get("riding") or {}).get("behaviours") or {}).get("AIR") or {}
|
||||
stats = air.get("stats", {})
|
||||
def top(stat):
|
||||
return int(str(stats.get(stat, "0")).split("-")[-1])
|
||||
if air and (top("SPEED") >= STRONG_FLYER_SPEED or top("STAMINA") >= STRONG_FLYER_STAMINA):
|
||||
flyers.add(f"cobblemon:{m[1]}")
|
||||
return totals, flyers
|
||||
|
||||
|
||||
def load_before(zone, room, stretch, target):
|
||||
@@ -132,7 +147,7 @@ def main():
|
||||
species = guide["species"]
|
||||
jar = cobblemon_jar()
|
||||
entries = load_entries(jar)
|
||||
bst = base_stat_totals(jar)
|
||||
bst, strong_flyers = species_data(jar)
|
||||
|
||||
zones = {z["id"]: z for z in plan["zones"]} | {c["id"]: c for c in plan["caves"]}
|
||||
shares = zone_biomes(plan, layout, preview)
|
||||
@@ -161,6 +176,10 @@ def main():
|
||||
lines[line_root(member, species)].append((entry, set(s["biomes"]), member, s["level"]))
|
||||
|
||||
pinned = {f"cobblemon:{k}" if ":" not in k else k: v for k, v in plan.get("species", {}).items()}
|
||||
flying_lines = {root for root in lines if root in strong_flyers}
|
||||
|
||||
def allowed(root, zid):
|
||||
return root not in flying_lines or zones[zid]["levels"][0] >= HIGH_ZONE_LEVEL
|
||||
wanted = {zid: z.get("lines", 20) for zid, z in zones.items()}
|
||||
scale = len(lines) / sum(wanted.values())
|
||||
target = {zid: n * scale for zid, n in wanted.items()}
|
||||
@@ -191,7 +210,7 @@ def main():
|
||||
fit = 1 - abs(rank[root] - tier[zid])
|
||||
return habitat * specific ** 0.5 * fit ** 2 / (1 + load[zid] / target[zid])
|
||||
|
||||
candidates = [zid for zid in zones if line_biomes & biomes_of[zid]]
|
||||
candidates = [zid for zid in zones if line_biomes & biomes_of[zid] and allowed(root, zid)]
|
||||
if candidates:
|
||||
home[root] = max(candidates, key=score)
|
||||
load[home[root]] += 1
|
||||
@@ -206,14 +225,21 @@ def main():
|
||||
for root in sorted(all_rounders, key=lambda r: rank[r]):
|
||||
while load[current] >= load_before(current, room, stretch, target) and current != by_tier[-1]:
|
||||
current = next(zone_iter)
|
||||
home[root] = current
|
||||
load[current] += 1
|
||||
# A strong flyer skips ahead to the first high zone.
|
||||
home[root] = current if allowed(root, current) else next((z for z in by_tier if allowed(root, z)), None)
|
||||
if home[root] is None:
|
||||
del home[root]
|
||||
continue
|
||||
load[home[root]] += 1
|
||||
|
||||
pools = collections.defaultdict(list)
|
||||
report = collections.defaultdict(list)
|
||||
for root, zid in home.items():
|
||||
lo, hi = zones[zid]["levels"]
|
||||
usable = [(e, b, m, lv) for e, b, m, lv in lines[root] if b & biomes_of[zid]]
|
||||
high = zones[zid]["levels"][0] >= HIGH_ZONE_LEVEL
|
||||
usable = [(e, b, m, lv) for e, b, m, lv in lines[root] if b & biomes_of[zid] and (high or m not in strong_flyers)]
|
||||
if not usable:
|
||||
continue
|
||||
fitting = [(e, m, max(lv[0], lo), min(lv[1], hi)) for e, b, m, lv in usable if lv[0] <= hi and lv[1] >= lo]
|
||||
if not fitting:
|
||||
# No stage reaches the band: the closest stage spawns across all of it.
|
||||
@@ -238,6 +264,11 @@ def main():
|
||||
names = sorted({species[m]["name"] for _, m, _, _ in fitting})
|
||||
report[zid].append((species.get(root, {}).get("name", root), names))
|
||||
|
||||
low_flyers = [(zid, s["pokemon"]) for zid, spawns in pools.items() for s in spawns
|
||||
if zones[zid]["levels"][0] < HIGH_ZONE_LEVEL and f"cobblemon:{s['pokemon'].split()[0].lower()}" in strong_flyers]
|
||||
if low_flyers:
|
||||
sys.exit(f"strong flyers would spawn below Lv {HIGH_ZONE_LEVEL}: {low_flyers[:5]}")
|
||||
|
||||
OUT.mkdir(parents=True, exist_ok=True)
|
||||
for old in OUT.glob("*.json"):
|
||||
old.unlink()
|
||||
@@ -292,6 +323,9 @@ def main():
|
||||
REPORT.write_text("\n".join(lines_out) + "\n")
|
||||
|
||||
unplaced = [r for r in lines if r not in home]
|
||||
grounded = sorted(species.get(r, {}).get("name", r) for r in unplaced if r in flying_lines)
|
||||
if grounded:
|
||||
print(f"strong flyers kept out of the wild (no high zone fits their habitat): {', '.join(grounded)}")
|
||||
for zid, zone in zones.items():
|
||||
print(f" {zone['name']:18s} {len(report.get(zid, [])):3d} lines {len(pools.get(zid, [])):4d} spawn entries")
|
||||
print(f"{len(home)} lines placed, {len(unplaced)} with no matching zone; wrote {OUT.relative_to(ROOT)} and {REPORT.relative_to(ROOT)}")
|
||||
|
||||
+2
-1
@@ -1,8 +1,9 @@
|
||||
{
|
||||
"_comment": "Zone plan for Phase 3 (model approved by Adrian 2026-10-29; levels are placeholders, see docs/balance.md). tools/zone_layout.py assigns each surface cell of the island to the first zone whose rule matches, in this order, and renders build/zone-map.png. Rules: 'within' = distance from 0,0 in blocks; 'biomes' = cells of these biomes, clusters smaller than min_cells dropped, plus 'absorb' = cells of other biomes within that many blocks of the cluster; 'region' = what is left, by half-plane (x/z bounds in blocks); 'water' = sea cells of these biomes. Biomes in 'inherit' (rivers) take the zone of the land around them. Cave zones follow the cave biome everywhere under the island and are not drawn. 'lines' = how many evolution lines tools/zone_spawns.py aims to give the zone (scaled to the lines available); 'species' pins a line to a zone by hand. 'guardian': the zone's Alpha guardian (tools/zone_spawns.py picks the strongest Pokémon spawning in the zone unless 'species' is given, at the band's top level + 5) and its drops, which help with the next zone; it stands at the zone's sample point and returns guardian_respawn_hours after it is beaten (Adrian, 2026-10-29: fixed spots, 5 hours).",
|
||||
"_comment": "Zone plan for Phase 3 (model approved by Adrian 2026-10-29; levels are placeholders, see docs/balance.md). tools/zone_layout.py assigns each surface cell of the island to the first zone whose rule matches, in this order, and renders build/zone-map.png. Rules: 'within' = distance from 0,0 in blocks; 'biomes' = cells of these biomes, clusters smaller than min_cells dropped, plus 'absorb' = cells of other biomes within that many blocks of the cluster; 'region' = what is left, by half-plane (x/z bounds in blocks); 'water' = sea cells of these biomes. Biomes in 'inherit' (rivers) take the zone of the land around them. Cave zones follow the cave biome everywhere under the island and are not drawn. 'lines' = how many evolution lines tools/zone_spawns.py aims to give the zone (scaled to the lines available); 'species' pins a line to a zone by hand. 'guardian': the zone's Alpha guardian (tools/zone_spawns.py picks the strongest Pokémon spawning in the zone unless 'species' is given, at the band's top level + 5) and its drops, which help with the next zone; it stands at the zone's sample point and returns guardian_respawn_hours after it is beaten (Adrian, 2026-10-29: fixed spots, 5 hours). 'level_pressure': a Pokémon more than grace_levels above the band of the zone its trainer stands in gets per_level less experience per extra level, down to minimum (Exp. Candy and commands excepted).",
|
||||
"min_cells": 6,
|
||||
"inherit": ["minecraft:river"],
|
||||
"guardian_respawn_hours": 5,
|
||||
"level_pressure": {"grace_levels": 5, "per_level": 0.1, "minimum": 0.1},
|
||||
"species": {"durant": "basalt", "torkoal": "basalt", "heatmor": "basalt"},
|
||||
"zones": [
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user