Optimally assigns creatures to expeditions and jobs in Koltera 2, maximising XP/s across your entire roster so every creature levels up.
- Dungeon (optional,
--dungeon TYPE) — pulls 3 creatures first, before anything else, selected by highest dungeon score - Jobs — assigns one creature per job (Chopping, Mining, Exploring, Digging, Fishing, Farming) based on proficiency
- Sanctuary — assigns awakened creatures (up to 8) from the remaining pool, prioritising highest tier
- Machines (optional,
--machine) — assigns awakened creatures to 9 machines: Bakery (water), Sawmill (wind), Greenhouse (earth), Smelter (fire), Cooker (fire), and Stone Quarry, Stick Finder, Coal Miner, Refinery (any element) - Expeditions — assigns remaining creatures to expeditions in parties of up to 3, picking the best tier and party composition — non-awakened creatures take priority over awakened ones
- Maximises XP per second, accounting for type bonuses, trait bonuses, stat weights, and party score
- Copy
data/creature_levels.json.exampletodata/creature_levels.jsonand set each creature's current level and awakening (0 or 1) - Copy
data/expedition_progress.json.exampletodata/expedition_progress.jsonand set how many tiers you have unlocked per expedition (0 = not unlocked)
creature_levels.jsonandexpedition_progress.jsonare personal save data and are gitignored.
python main.py [--machine] [--min-party-size {1,2,3}] [--awakened-helpers] [--dungeon TYPE]
| Flag | Description |
|---|---|
--machine |
Assign awakened creatures to machines after jobs, before expeditions |
--min-party-size N |
Minimum creatures per expedition party (default: 1) |
--awakened-helpers |
Reserve non-awakened creatures for expeditions: awakened creatures are preferred for job assignments regardless of proficiency, and only awakened creatures may serve as expedition party companions |
--dungeon TYPE |
Pull 3 creatures for the dungeon first (before jobs). TYPE is one of: combat, chopping, mining, digging, farming, fishing, exploring |
--fill-expeditions |
Scale minimum party size by roster size and dynamically enforce a per-iteration floor to guarantee no unassigned creatures (when pool starts below 60) |
When --fill-expeditions is active, the base minimum party size is set by how many creatures are available when expedition assignment begins: fewer than 40 → 1, 40–59 → 2, 60 or more → 3. For pools under 60, a per-iteration check also raises the minimum to ceil(remaining creatures / remaining expeditions) as soon as it would otherwise be impossible to assign everyone.
Output shows Dungeon assignment (if --dungeon), Sanctuary, Job assignments, Machine assignments (if --machine), Expedition assignments, and any unassigned creatures.
- Combat score:
floor((POW + GRT + AGI + SMT) × 0.25)per creature - Gathering score (all other types):
floor((SMT + LOT + LCK) × 1/3)per creature - Party score = sum of the 3 individual creature scores
- 5 difficulty tiers: 2000 / 4000 / 6000 / 8000 / 10000
- Grade is determined by score vs. difficulty ratio: S (≥2×), A (≥1×), B (≥0.6×), C (≥0.25×), F (<0.25×)
- Grade multipliers: S=×2, A=×1.5, B=×1, C=×0.5, F=×0.25 — applied to base XP rate and Chronicle Rune count
- Chronicle Runes (combat only):
max(1, floor(tier × 2 × grade_mult))per tier - Output recommends the single best tier: most runes for combat, highest XP rate for gathering
| File | What it contains | Gitignored |
|---|---|---|
data/creatures.json |
Creature roster: stats, types, traits, job proficiencies | No |
data/expeditions.json |
All known expeditions: types, traits, weights, tier difficulties/rewards | No |
data/creature_levels.json |
Your creatures' current levels and awakening status | Yes |
data/expedition_progress.json |
How many tiers you have unlocked per expedition (0–5) | Yes |
expeditions.json and creatures.json are community data. If you have unlocked creatures or expeditions not yet in the file, please open a PR with data about them.
base_score = Σ(stat × weight), where stat = base_stat × level
type_score = floor(base_score) × 1.5 (preferred type) or × 0.5 (opposing type)
final_score = floor(type_score) × 1.5 (if preferred trait matches)
party_score = sum of individual scores
time_minutes = max(5.0, 60 − 55 × party_score / difficulty)
xp_per_second = xp_reward / (party_size × time_minutes × 60)