This roadmap is intentionally broader than the per-slice plans in docs/plans/. It defines the major work tracks needed to move go-metin2-server from its current pre-alpha bootstrap state toward a legacy-compatible Metin2 server.
The project should continue to land small, independently verified slices. This document is a planning map, not permission to batch large rewrites.
- Keep
maingreen. - Keep one commit per slice.
- Keep docs/specs/tests aligned with behavior.
- Treat legacy source and captures only as external behavior oracles.
- Prefer client-visible compatibility over generic refactors.
- Parallelize by subsystem lanes, but serialize integration through
main.
Objective: make the item layer feel legacy-compatible enough to support real gameplay loops.
Likely areas:
internal/playerinternal/inventoryinternal/proto/iteminternal/proto/quickslotinternal/minimalitem runtime testsspec/protocol/item-*docs/qa/manual-client-checklist.md
Next priorities:
- Finish nearby
ITEM_USE_TO_ITEMedge cases:- partial merges,
- full target rejection,
- locked source/target rejection,
- non-stackable rejection,
- incompatible target behavior.
- Grow item-use families from evidence:
- socket/metin interactions,
- enchant/change bonus style interactions,
- scrolls/books/consumables.
- Harden item restrictions:
- anti-drop,
- anti-sell,
- anti-give,
- class/sex/level restrictions,
- equipment slot validity.
- Extend ground item ownership:
- timers,
- party ownership,
- permission transitions,
- pickup denial feedback where owned.
- Prepare storage/trade boundaries without implementing them prematurely.
Exit criteria:
- item mutation paths are deterministic, tested, persisted, and visible to the real client,
- common carried/equipped/ground/merchant paths no longer rely on slash/debug seams,
- unsupported legacy item uses fail closed and are documented.
Anti-goals:
- do not implement broad trade/storage/player-shop systems in this track until the carried item semantics are stable,
- do not guess item-use packet behavior without evidence.
Objective: turn the practice-mob loop into a real PvE gameplay loop.
Likely areas:
internal/proto/combatinternal/worldruntimeinternal/minimalinternal/playerspec/protocol/combat-*spec/protocol/player-death-*docs/qa/manual-client-checklist.md
Next priorities:
- Harden target/attack/death/restart regressions around the current practice mob.
- Add reward seams after mob death:
- EXP placeholder,
- gold/yang placeholder,
- deterministic item drop placeholder.
- Replace fixed dummy damage with a first authored combat profile:
- attack value,
- defense value,
- HP/max HP,
- level/rank where needed.
- Add first mob AI slices:
- aggro radius,
- chase/return,
- attack cadence,
- leash,
- target release.
- Grow player death policy:
- revive/restart evidence,
- live/dead recipient rules,
- persistence split for HP/position,
- broader peer replay.
Exit criteria:
- a player can kill a spawned mob and receive basic rewards,
- the mob can respawn and re-enter visibility correctly,
- death/restart behavior is deterministic and does not corrupt persisted state.
Anti-goals:
- do not jump to full skill/PvP formulas before the PvE baseline is stable,
- do not persist runtime-only HP loss unless a dedicated persistence-policy slice owns it.
Objective: make the world layer robust enough to host real content and multiple concurrent players.
Likely areas:
internal/worldruntimeinternal/minimalinternal/warpinternal/contentbundleinternal/staticstorespec/protocol/*visibility*spec/protocol/*transfer*docs/debugging-and-profiling.md
Next priorities:
- Harden AOI and map-index behavior across movement, sync, transfer, and reconnect.
- Extend static/non-player actor lifecycle:
- update in place,
- relocate,
- remove,
- replay dead/alive state,
- preserve identity where intended.
- Grow spawn groups:
- multiple actors,
- respawn policies,
- map-specific placement,
- content validation.
- Improve operator/runtime snapshots:
- map occupancy,
- runtime config,
- spawn state,
- selected target state.
- Prepare multi-channel ownership without disrupting the single-channel bootstrap.
Exit criteria:
- visibility transitions are predictable across maps/AOI/reconnect/death/respawn,
- static and non-player actors can be inspected and updated safely,
- content-loaded spawns no longer behave like one-off bootstrap fixtures.
Anti-goals:
- do not rewrite the world runtime wholesale,
- do not introduce distributed/multi-process ownership before the single-process semantics are stable.
Objective: move content interactions from narrow NPC/shop slices toward a real content runtime.
Likely areas:
internal/interactionstoreinternal/staticstoreinternal/contentbundleinternal/proto/interactinternal/proto/shopinternal/minimalspec/protocol/npc-*- future quest packages
Next priorities:
- Expand NPC services with evidence-backed interaction results.
- Harden merchant open/close/buy/sell edge cases.
- Add richer shop definitions:
- multi-tab shops,
- stock/soldout semantics,
- price updates,
- invalid/stale contexts.
- Introduce first quest runtime seam:
- quest flags,
- NPC dialog state,
- simple trigger/result contract,
- persistence model.
- Connect mob kill/item/level events into quest hooks only after the base runtime exists.
Exit criteria:
- content definitions can drive useful NPC/shop behavior without code changes,
- the first quest-style interaction can persist and resume state,
- unsupported service kinds fail early and clearly.
Anti-goals:
- do not attempt full quest-script compatibility in one pass,
- do not let content definitions bypass validation.
Objective: replace bootstrap chat fanout with real party/guild/messenger systems.
Likely areas:
internal/proto/chatinternal/minimalinternal/worldruntime/scopes.go- future party/guild/messenger packages
spec/protocol/party-*spec/protocol/guild-*
Next priorities:
- Introduce explicit party membership state.
- Add party invite/accept/leave/kick where packet evidence exists.
- Connect party membership to chat, pickup, EXP, and drop sharing.
- Introduce guild roster/rank state.
- Add friend/messenger/block systems after core party/guild paths are stable.
Exit criteria:
- party/guild chat no longer means bootstrap-global fanout,
- membership is persisted or explicitly scoped,
- gameplay systems can query social membership safely.
Anti-goals:
- do not over-claim real party/guild behavior while fanout remains bootstrap-shaped,
- do not add social effects before membership state exists.
Objective: move from bootstrap file snapshots to compatibility-grade service operation.
Likely areas:
- stores/repositories under
internal/*store - future DB/migration packages
internal/opsinternal/configdocs/development.mddocs/workflow.md- deployment docs
Next priorities:
- Define DB schema boundaries for accounts, characters, items, quests, guilds, parties, and world state.
- Add migrations and repository interfaces without forcing every existing slice to migrate at once.
- Add backup/restore and crash-recovery policy.
- Expand operator/admin endpoints cautiously.
- Define release/deploy workflow and public CI gates.
Exit criteria:
- the server can persist core gameplay state in a DB-backed store,
- migrations are repeatable,
- operators can inspect and recover the service safely,
- public releases have a documented validation path.
Anti-goals:
- do not prematurely convert every file-backed snapshot before gameplay schemas are stable,
- do not expose sensitive operator actions beyond loopback/trusted boundaries without explicit design.
The recommended acceleration model is lane-based:
lane/items— Track Alane/combat— Track Blane/world— Track C- optional future
lane/contentorlane/archaeology— Tracks D/E/protocol evidence main— integration only
Worker lanes should produce small commits on their branches. The integrator should merge or cherry-pick one lane at a time into main, run full validation, and push only green mainline progress.
This keeps throughput high without letting concurrent agents race on main.