Files
odinsea-elixir/PORT_PROGRESS.md
2026-02-14 19:36:59 -07:00

43 KiB

Odinsea Elixir Port - Progress Tracker

Project Overview

Reference: Java MapleStory server (odinsea) at /home/ra/lucid
Target: Elixir/OTP implementation at /home/ra/odinsea-elixir
Client Version: GMS v342 (Rev 342)


Phase 1: Foundation COMPLETE

1.1 Project Structure & Tooling

  • Initialize Elixir project with mix new
  • Configure project dependencies (mix.exs)
  • Create directory structure aligned with domain boundaries
  • Set up development tooling placeholders (credo, dialyzer)

Dependencies Configured:

  • Networking: :ranch, :gen_state_machine
  • Database: :ecto_sql, :myxql, :redix
  • Utilities: :jason, :decimal, :timex, :poolboy, :nimble_pool
  • Observability: :telemetry, :logger_file_backend
  • Development: :credo, :dialyxir

1.2 Configuration System

  • Port config/global.propertiesconfig/runtime.exs
  • Port config/plugin.properties → feature flags
  • Create config/config.exs for defaults

Files Created:

  • config/config.exs - Default configuration
  • config/runtime.exs - Environment-based configuration

1.3 Core Types & Constants

  • Port GameConstantsOdinsea.Constants.Game
  • Port ServerConstantsOdinsea.Constants.Server

Files Created:

  • lib/odinsea/constants/server.ex - Server/protocol constants
  • lib/odinsea/constants/game.ex - Game mechanics constants

Phase 2: Networking Layer COMPLETE

2.1 Packet Infrastructure

  • Port InPacketOdinsea.Net.Packet.In
  • Port OutPacketOdinsea.Net.Packet.Out
  • Port HexToolOdinsea.Net.Hex

Files Created:

  • lib/odinsea/net/packet/in.ex - Incoming packet decoder (little-endian)
  • lib/odinsea/net/packet/out.ex - Outgoing packet encoder (little-endian)
  • lib/odinsea/net/hex.ex - Hex encoding/decoding utilities

2.2 Cryptography

  • Port AES encryption (AESCipher)
  • Port InnoGames cipher (IGCipher - shuffle/hash)
  • Port ClientCrypto (IV management, header encoding/decoding)
  • Port LoginCrypto (password hashing SHA-1/SHA-512, RSA decryption)
  • Port BitTools utilities (byte manipulation, string extraction)

Files Created:

  • lib/odinsea/net/cipher/aes_cipher.ex - AES-ECB encryption with IV handling
  • lib/odinsea/net/cipher/ig_cipher.ex - InnoGames IV hash transformation
  • lib/odinsea/net/cipher/client_crypto.ex - Client crypto coordinator (encrypt/decrypt/header)
  • lib/odinsea/net/cipher/login_crypto.ex - Password hashing and RSA operations
  • lib/odinsea/util/bit_tools.ex - Bit/byte manipulation utilities

Reference Files:

  • src/handling/netty/cipher/AESCipher.java
  • src/handling/netty/cipher/IGCipher.java
  • src/handling/netty/ClientCrypto.java
  • src/client/LoginCrypto.java
  • src/tools/BitTools.java

2.3 Client Connection (Basic)

  • Implement TCP acceptor pool with gen_tcp
  • Port ClientHandlerOdinsea.Net.Client
  • Implement connection state machine structure
  • Implement alive ack/ping handling

Files Created:

  • lib/odinsea/login/listener.ex - Login server TCP listener
  • lib/odinsea/login/client.ex - Login client handler
  • lib/odinsea/channel/server.ex - Channel server TCP listener
  • lib/odinsea/channel/client.ex - Channel client handler
  • lib/odinsea/shop/listener.ex - Cash shop TCP listener
  • lib/odinsea/shop/client.ex - Cash shop client handler

2.4 Packet Processor / Opcodes (Audited 2026-02-14)

  • Port packet opcode definitions (ClientPacket/LoopbackPacket)
  • Port PacketProcessorOdinsea.Net.Processor
  • CRITICAL: Full opcode audit and correction (200+ recv, 250+ send opcodes)
  • Verify 100% match with Java recvops.properties and sendops.properties

Files Created:

  • lib/odinsea/net/opcodes.ex - All client/server packet opcodes ( AUDITED & CORRECTED)
  • lib/odinsea/net/processor.ex - Central packet routing/dispatch system

Phase 3: Database Layer 🔄 PARTIAL

3.1 Database Connection

  • Configure Ecto with MyXQL adapter
  • Port connection pool settings
  • Set up migration structure

Files Created:

  • lib/odinsea/database/repo.ex - Ecto repository

3.2 Schemas & Repos 🔄 PARTIAL

  • Create Ecto schemas for core tables:
    • accounts
    • characters
    • inventory_items
    • storage
    • buddies
    • guilds
    • parties
  • Implement Database Context module (Odinsea.Database.Context)

Files Created:

  • lib/odinsea/database/schema/account.ex - Account schema with changesets
  • lib/odinsea/database/schema/character.ex - Character schema with changesets

3.3 Redis Connection (Basic)

  • Configure Redix connection
  • Implement migration token storage (Redis + ETS)
  • Port pub/sub messaging system
  • Implement full cross-server message passing

Phase 4: Login Server HANDLERS COMPLETE

4.1 Login Handlers

  • Port CharLoginHandlerOdinsea.Login.Handler
  • Implement auth flow:
    • Permission request
    • Password check (with SPW)
    • World selection
    • Character list
    • Character creation/deletion
    • Character selection
  • Integrate with database (Odinsea.Database.Context)

Files Created:

  • lib/odinsea/login/handler.ex - All login packet handlers

Reference Files:

  • src/handling/login/handler/CharLoginHandler.java

4.2 Login Packets

  • Port LoginPacketOdinsea.Login.Packets
  • Implement packet builders:
    • Hello/handshake packets
    • Authentication responses
    • Server/world list
    • Character list
    • Character name check
    • Character creation/deletion
    • Migration command

Files Created:

  • lib/odinsea/login/packets.ex - Login server packet builders

Reference Files:

  • src/tools/packet/LoginPacket.java

4.3 Account Management

  • Port MapleClientOdinsea.Login.Session
  • Implement account storage/caching
  • Handle session state transitions

Phase 5: Game World Core 🔄 STRUCTURE READY

5.1 World Server (Structure)

  • Port WorldOdinsea.World (placeholder)
  • Implement cross-server messaging
  • Port party/guild/family/alliance management

Files Created:

  • lib/odinsea/world.ex - World state
  • lib/odinsea/world/supervisor.ex - World services supervisor
  • lib/odinsea/world/party.ex - Party service (placeholder)
  • lib/odinsea/world/guild.ex - Guild service (placeholder)
  • lib/odinsea/world/family.ex - Family service (placeholder)
  • lib/odinsea/world/expedition.ex - Expedition service (placeholder)
  • lib/odinsea/world/messenger.ex - Messenger service (placeholder)

5.2 Channel Server (Structure)

  • Port ChannelServerOdinsea.Channel (structure)
  • Implement channel registry
  • Handle player storage per channel

Files Created:

  • lib/odinsea/channel/supervisor.ex - Channel supervisor
  • lib/odinsea/channel/server.ex - Individual channel server

5.3 Player Storage

  • Port PlayerStorageOdinsea.Channel.Players
  • Implement character loading/saving (via Context)
  • Handle channel transfers (Migration system)

5.4 Migration System

  • Port CharacterTransferOdinsea.World.Migration
  • Implement migration token creation/validation
  • Cross-server token storage (ETS + Redis)
  • Token expiration and cleanup

5.5 Inter-Server Handler

  • Port InterServerHandlerOdinsea.Channel.Handler.InterServer
  • Implement MigrateIn handling
  • Implement ChangeChannel handling

5.6 Character (In-Game State)

  • Port MapleCharacterOdinsea.Game.Character (minimal)
  • Implement character stats structure
  • Implement position tracking
  • Character loading from database
  • Character saving to database
  • Map change logic

Files Created:

  • lib/odinsea/game/character.ex - In-game character GenServer

Reference Files:

  • src/client/MapleCharacter.java (minimal - 150 fields remaining)
  • src/client/PlayerStats.java (minimal)

Phase 6: Game Systems NOT STARTED

6.1 Maps COMPLETE (Core)

  • Port MapleMapOdinsea.Game.Map (minimal implementation)
  • Implement player spawn/despawn on maps
  • Implement map broadcasting (packets to all players)
  • Port MapleMapFactoryOdinsea.Game.MapFactory NEW
  • Implement map template loading (JSON-based) NEW
  • Implement portal data structures NEW
  • Implement foothold data structures NEW
  • Create ETS caching for map templates NEW
  • Integrate portals with Map module
  • Implement reactors
  • Full foothold collision system

Files Created:

  • lib/odinsea/game/map.ex - Map instance GenServer
  • lib/odinsea/game/map_factory.ex - Map data provider (450+ lines) NEW

Reference Files:

  • src/server/maps/MapleMap.java (core)
  • src/server/maps/MapleMapFactory.java (core ported)

6.2 Life (Mobs/NPCs) COMPLETE (Core)

  • Port MapleLifeFactoryOdinsea.Game.LifeFactory
  • Port MapleMonsterOdinsea.Game.Monster (core structure)
  • Implement monster stats loading from JSON
  • Implement NPC data loading from JSON
  • Create ETS caching for monster/NPC data
  • Full monster AI and movement
  • Monster skill usage
  • Monster drops and loot tables
  • Full NPC interaction system

Files Created:

  • lib/odinsea/game/life_factory.ex - Monster/NPC data provider (350+ lines)
  • lib/odinsea/game/monster.ex - Monster instance struct (250+ lines)

Reference Files:

  • src/server/life/*.java (core ported)

6.3 Items & Inventory COMPLETE (Core)

  • Port ItemOdinsea.Game.Item
  • Port EquipOdinsea.Game.Equip
  • Port MapleInventoryOdinsea.Game.Inventory
  • Port MapleInventoryTypeOdinsea.Game.InventoryType
  • Create InventoryItem database schema
  • Add inventory operations to Database Context
  • Port MapleItemInformationProviderOdinsea.Game.ItemInfo NEW
  • Create item data loading system (JSON-based) NEW
  • Implement equipment creation with stats NEW
  • Implement full item usage effects
  • Implement scrolling system

Files Created:

  • lib/odinsea/game/item_info.ex - Item information provider (450+ lines) NEW

Reference Files:

  • src/server/MapleItemInformationProvider.java (core ported)
  • src/client/inventory/*.java (complete)

6.4 Skills & Buffs

  • Port SkillFactoryOdinsea.Game.Skills
  • Implement buff management
  • Port cooldown handling

Reference Files:

  • src/client/SkillFactory.java
  • src/client/status/*.java

6.6 Movement (Simplified)

  • Port MovementParseOdinsea.Game.Movement (simplified)
  • Parse movement commands
  • Extract final position from movement data
  • Full movement type parsing (40+ movement command types)
  • Movement validation and anti-cheat

Files Created:

  • lib/odinsea/game/movement.ex - Movement parsing

Reference Files:

  • src/handling/channel/handler/MovementParse.java (simplified)

6.5 Quests

  • Port MapleQuestOdinsea.Game.Quests
  • Implement quest management

Reference Files:

  • src/server/quest/MapleQuest.java

Phase 7: Channel Handlers 🔄 IN PROGRESS

7.1 Player Handlers 🔄 PARTIAL

  • Port PlayerHandlerOdinsea.Channel.Handler.Player (basic)
  • Implement movement (MovePlayer)
  • Implement map changes (ChangeMap)
  • Implement keybinding changes (ChangeKeymap)
  • Implement skill macro changes (ChangeSkillMacro)
  • Stub attack handlers (CloseRange, Ranged, Magic)
  • Stub damage handler (TakeDamage)
  • Full attack implementation (damage calculation, mob interaction)
  • Stats handling (AP/SP distribution)
  • Skill usage and buffs
  • Item effects
  • Chair usage
  • Emotion changes

Files Created:

  • lib/odinsea/channel/handler/player.ex - Player action handlers

Reference Files:

  • src/handling/channel/handler/PlayerHandler.java (partial)
  • src/handling/channel/handler/StatsHandling.java

7.2 Inventory Handlers COMPLETE (Core)

  • Port InventoryHandlerOdinsea.Channel.Handler.Inventory
  • Implement item move (equip, unequip, drop)
  • Implement item sort
  • Implement item gather
  • Implement full item usage effects
  • Implement scrolling system
  • Implement cash item usage

Reference Files:

  • src/handling/channel/handler/InventoryHandler.java

7.3 Mob Handlers

  • Port MobHandlerOdinsea.Channel.Handler.Mob
  • Implement mob movement, damage, skills

Reference Files:

  • src/handling/channel/handler/MobHandler.java

7.4 NPC Handlers COMPLETE

  • Port NPCHandlerOdinsea.Channel.Handler.NPC
  • Implement NPC move/talk (stubs - needs script system)
  • Implement shop handlers (stubs - needs full shop system)
  • Implement storage handlers (stubs - needs full storage system)
  • Implement quest action handlers (stubs - needs quest system)
  • All 12 NPC-related packet handlers implemented

Files Created:

  • lib/odinsea/channel/handler/npc.ex - All NPC packet handlers
  • lib/odinsea/game/shop.ex - Shop system structure (stubs)
  • lib/odinsea/game/storage.ex - Storage system structure (stubs)

Reference Files:

  • src/handling/channel/handler/NPCHandler.java

7.5 Chat & Social Handlers CHAT COMPLETE

  • Port ChatHandlerOdinsea.Channel.Handler.Chat
  • Implement general chat (map broadcast)
  • Implement party chat routing (buddy, party, guild, alliance, expedition)
  • Implement whisper/find player
  • Add chat packet builders (UserChat, Whisper, MultiChat, FindPlayer)
  • Port BuddyListHandler → buddy system
  • Port PartyHandler, GuildHandler, FamilyHandler

Files Created:

  • lib/odinsea/channel/handler/chat.ex - Chat packet handlers

Reference Files:

  • src/handling/channel/handler/ChatHandler.java
  • src/handling/channel/handler/BuddyListHandler.java
  • src/handling/channel/handler/PartyHandler.java
  • src/handling/channel/handler/GuildHandler.java

Phase 8: Cash Shop NOT STARTED

8.1 Cash Shop Server (Structure)

  • Port CashShopServerOdinsea.Shop (structure)
  • Implement cash item handling
  • Implement coupon system

Files Created:

  • lib/odinsea/shop/listener.ex - Cash shop listener
  • lib/odinsea/shop/client.ex - Cash shop client

8.2 Channel Packets 🔄 PARTIAL

  • Basic channel packet builders
  • Character spawn packet (simplified)
  • Character despawn packet
  • Chat packets (UserChat, Whisper, MultiChat, FindPlayer)
  • Movement packet (MovePlayer)
  • Full character encoding (equipment, buffs, pets)
  • Damage packets
  • Skill effect packets
  • Attack packets

Files Updated:

  • lib/odinsea/channel/packets.ex - Added spawn_player, remove_player, chat packets

Phase 9: Scripting System NOT STARTED

9.1 Script Engine

  • Integrate QuickJS or Lua runtime
  • Port AbstractScriptManager
  • Implement script globals (cm, em, pi, etc.)

Reference Files:

  • src/scripting/*.java

Phase 10: Advanced Features NOT STARTED

10.1 Timers & Scheduling

  • Port timer system to Elixir processes
  • World timer, Map timer, Buff timer, etc.

Reference Files:

  • src/server/Timer.java

10.2 Anti-Cheat

  • Port MapleAntiCheatOdinsea.AntiCheat
  • Implement lie detector system

Reference Files:

  • src/client/anticheat/*.java

10.3 Events

  • Port event system
  • Implement scheduled events

Reference Files:

  • src/server/events/*.java

10.4 Admin Commands

  • Port AdminHandlerOdinsea.Admin
  • Implement command system

Reference Files:

  • src/handling/admin/*.java

Phase 11: Testing & Optimization NOT STARTED

  • Unit tests for packet encoding/decoding
  • Integration tests for login flow
  • Load testing for channel capacity
  • Performance optimization
  • Documentation

File Mapping Reference

Core Application

Java Elixir Status
src/app/Program.java lib/odinsea/application.ex Structure ready
src/app/ServerStart.java lib/odinsea/application.ex Structure ready
src/app/ServerStop.java lib/odinsea/application.ex Structure ready
src/app/Config.java config/runtime.exs Done
src/app/Plugin.java config/runtime.exs (features) Done
src/app/Logging.java Elixir Logger Native

Networking

Java Elixir Status
src/handling/PacketProcessor.java lib/odinsea/net/processor.ex Done
src/handling/ClientPacket.java lib/odinsea/net/opcodes.ex Done
src/tools/data/InPacket.java lib/odinsea/net/packet/in.ex Done
src/tools/data/OutPacket.java lib/odinsea/net/packet/out.ex Done
src/tools/HexTool.java lib/odinsea/net/hex.ex Done
src/handling/netty/cipher/AESCipher.java lib/odinsea/net/cipher/aes_cipher.ex Done
src/handling/netty/cipher/IGCipher.java lib/odinsea/net/cipher/ig_cipher.ex Done
src/handling/netty/ClientCrypto.java lib/odinsea/net/cipher/client_crypto.ex Done
src/client/LoginCrypto.java lib/odinsea/net/cipher/login_crypto.ex Done
src/tools/BitTools.java lib/odinsea/util/bit_tools.ex Done

Database

Java Elixir Status
src/database/DatabaseConnection.java lib/odinsea/database/repo.ex Structure ready
src/database/RedisConnection.java config/runtime.exs Config ready
src/client/inventory/ItemLoader.java lib/odinsea/database/schema/inventory_item.ex Done

Login

Java Elixir Status
src/handling/login/handler/CharLoginHandler.java lib/odinsea/login/handler.ex Done
src/tools/packet/LoginPacket.java lib/odinsea/login/packets.ex Done
src/client/MapleClient.java lib/odinsea/login/session.ex TODO
N/A lib/odinsea/login/listener.ex Created
N/A lib/odinsea/login/client.ex Created

World

Java Elixir Status
src/handling/world/World.java lib/odinsea/world.ex Structure ready
src/handling/world/MapleParty.java lib/odinsea/world/party.ex Structure ready
src/handling/world/guild/*.java lib/odinsea/world/guild.ex Structure ready
src/handling/world/family/*.java lib/odinsea/world/family.ex Structure ready

Channel

Java Elixir Status
src/handling/channel/ChannelServer.java lib/odinsea/channel/server.ex Structure ready
src/handling/channel/PlayerStorage.java lib/odinsea/channel/players.ex Done
src/handling/channel/handler/MovementParse.java lib/odinsea/game/movement.ex 🔄 Simplified
src/handling/channel/handler/ChatHandler.java lib/odinsea/channel/handler/chat.ex Done
src/handling/channel/handler/InventoryHandler.java lib/odinsea/channel/handler/inventory.ex Core (move, equip, sort)
src/handling/channel/handler/PlayerHandler.java lib/odinsea/channel/handler/player.ex 🔄 Partial (movement, stubs)
N/A lib/odinsea/channel/supervisor.ex Created
N/A lib/odinsea/channel/client.ex Created + wired handlers
N/A lib/odinsea/channel/packets.ex 🔄 Partial + chat packets

Shop

Java Elixir Status
src/handling/cashshop/CashShopServer.java lib/odinsea/shop/listener.ex Structure ready
N/A lib/odinsea/shop/client.ex Created

Game Systems

Java Elixir Status
src/client/MapleCharacter.java lib/odinsea/game/character.ex 🔄 Core (stats + inventory)
src/client/PlayerStats.java lib/odinsea/game/character.ex 🔄 Minimal
src/client/inventory/Item.java lib/odinsea/game/item.ex Done
src/client/inventory/Equip.java lib/odinsea/game/item.ex Done
src/client/inventory/MapleInventory.java lib/odinsea/game/inventory.ex Done
src/client/inventory/MapleInventoryType.java lib/odinsea/game/inventory_type.ex Done
src/server/MapleItemInformationProvider.java lib/odinsea/game/item_info.ex Done (Core)
src/server/maps/MapleMap.java lib/odinsea/game/map.ex 🔄 Core (spawn/despawn/broadcast)
src/server/maps/MapleMapFactory.java lib/odinsea/game/map_factory.ex Done (Core)
src/server/life/MapleLifeFactory.java lib/odinsea/game/life_factory.ex Done (Core)
src/server/life/MapleMonster.java lib/odinsea/game/monster.ex Done (Core)
src/server/life/MapleNPC.java lib/odinsea/game/life_factory.ex Done (Data)
src/client/SkillFactory.java TODO Not started

Project Statistics

Metric Count
Files Created 55+ ⬆️ (+4)
Lines of Code (Elixir) ~12,500+ ⬆️ (+1,500)
Modules Implemented 49+ ⬆️ (+4)
Opcodes Defined 450+ (200+ recv, 250+ send) AUDITED
Registries 5 (Player, Channel, Character, Map, Client)
Supervisors 4 (World, Channel, Client, Map)
Channel Handlers 4 (Chat , Player 🔄, NPC , Inventory )
Data Providers 3 (ItemInfo , MapFactory , LifeFactory ) NEW

Progress Summary

Phase Status % Complete
1. Foundation Complete 100%
2. Networking Complete (Opcode Audit ) 100%
3. Database 🔄 Partial 65%
4. Login Server Complete 100%
5. World/Channel 🔄 Core Complete 70%
6. Game Systems 🔄 Core Complete 55% ⬆️ (+20%)
7. Handlers 🔄 In Progress 45%
8. Cash Shop 🔄 Structure + Packets 30%
9. Scripting Not Started 0%
10. Advanced Not Started 0%
11. Testing Not Started 0%

Overall Progress: ~62% ⬆️ (+7% from data providers + monster system)


Next Session Recommendations

High Priority (Testing & Inventory)

  1. Test with Real v342 Client ⚠️ NEW - Now possible with correct opcodes!

    • Test login flow with real client
    • Test character selection with real client
    • Test channel migration with real client
    • Verify packet encoding/decoding matches wire protocol
    • Test NPC interaction basic flow
  2. Implement Inventory System 🔴 CRITICAL BLOCKER

    • Port MapleInventoryOdinsea.Game.Inventory
    • Port MapleItem → item types (Equip, Use, Setup, Etc, Cash)
    • Implement inventory operations (add, remove, move, sort, gather)
    • Required for: shops, storage, item usage, equipment, attacks
    • Files to reference:
      • src/client/inventory/MapleInventory.java
      • src/client/inventory/Item.java
      • src/client/inventory/Equip.java
  3. Implement Item Information Provider 🔴 CRITICAL BLOCKER

    • Port MapleItemInformationProviderOdinsea.Game.Items
    • Load item data (WZ files or cached data)
    • Item validation and pricing
    • Required for: inventory, shops, drops, quests
    • Files to reference:
      • src/server/MapleItemInformationProvider.java

Medium Priority (Game Systems)

  1. Implement Basic Mob System

    • Port MapleMonsterOdinsea.Game.Monster
    • Port MapleLifeFactory → mob data loading
    • Implement mob spawning on maps
    • Implement mob movement
    • Required for: combat, drops, experience
  2. Implement Map Data Loading

    • Port MapleMapFactoryOdinsea.Game.MapFactory
    • Create map cache (ETS)
    • Map loading from WZ data or cached data
    • Portal data, spawn points, foothold data
  3. Expand Character Data Loading

    • Load inventory/equipment from database
    • Load skills/buffs from database
    • Load quest progress from database

Notes for Future Agents

Architecture Decisions

  1. Concurrency Model:

    • One process per client connection (GenServer)
    • One process per map instance (GenServer)
    • ETS tables for shared caches (items, maps, mobs)
    • Registry for player lookups by name/ID
  2. Packet Handling:

    • Little-endian encoding (MapleStory standard)
    • Opcode dispatch pattern in client handlers
    • Separate modules for each handler type
  3. Database Strategy:

    • Ecto for type safety and migrations
    • Keep SQL schema compatible with Java server
    • Consider read replicas for static data
  4. State Management:

    • GenServer state for connection/session
    • ETS for global/shared state
    • Redis for cross-server pub/sub

Key Files to Reference

  • src/handling/PacketProcessor.java - Packet dispatch logic
  • src/handling/netty/cipher/ - Encryption algorithms
  • src/handling/login/handler/CharLoginHandler.java - Login flow
  • src/tools/packet/LoginPacket.java - Login packet formats
  • src/server/maps/MapleMap.java - Map system

Session History

Session 2026-02-14

Completed:

  • Implemented Odinsea.Net.Processor (central packet routing)
  • Implemented Odinsea.Login.Handler (all login packet handlers)
  • Implemented Odinsea.Login.Packets (login packet builders)
  • Created Odinsea.Database.Schema.Account (Ecto schema)
  • Created Odinsea.Database.Schema.Character (Ecto schema)
  • Integrated PacketProcessor with Login.Client

Session 2026-02-14 (continued)

Completed:

  • Implemented Odinsea.Database.Context - Full database context module
    • Account authentication (with SHA-512 password verification)
    • Login state management
    • IP logging
    • Character CRUD operations
    • Character name validation
  • Integrated login handlers with database (real queries instead of stubs)
  • Implemented Odinsea.World.Migration - Server transfer system
    • Migration token creation/validation
    • Cross-server storage (ETS + Redis)
    • Token expiration and cleanup
  • Implemented Odinsea.Channel.Players - Player storage (ETS-based)
  • Implemented Odinsea.Channel.Handler.InterServer - Migration handler
  • Added verify_salted_sha512/3 to LoginCrypto
  • Implemented actual packet sending via TCP sockets

Next Steps:

  • Channel packet handlers (PlayerHandler, InventoryHandler, etc.)
  • Map system implementation (MapleMap)
  • Character full data loading (inventory, skills, quests)
  • Testing the login flow with real client

Session 2026-02-14 (Game Systems - Vertical Slice)

Completed:

  • Implemented Odinsea.Game.Character - In-game character state GenServer
    • Character stats (str, dex, int, luk, hp, mp, etc.)
    • Position tracking (x, y, foothold, stance)
    • Map transitions (change_map/3)
    • Load from database / save to database
    • SP array parsing (comma-separated to list)
  • Implemented Odinsea.Game.Map - Map instance GenServer
    • Player spawn/despawn on map
    • Object ID (OID) allocation
    • Broadcasting packets to all players
    • Broadcasting packets except specific player
    • Dynamic map loading via DynamicSupervisor
  • Added Character and Map registries to application
    • Odinsea.CharacterRegistry for character_id → pid lookups
    • Odinsea.MapRegistry for {map_id, channel_id} → pid lookups
    • Odinsea.MapSupervisor for dynamic map instance supervision
  • Implemented Odinsea.Game.Movement - Movement parsing (simplified)
    • Parse movement commands from packets
    • Extract final position from movement data
    • Support for basic movement types (absolute, relative, teleport)
    • TODO: Full 40+ movement command types
  • Updated Odinsea.Channel.Packets
    • spawn_player/2 - Spawn player on map (minimal encoding)
    • remove_player/1 - Remove player from map
    • Helper functions for appearance/buffs/mounts/pets (minimal)
  • Updated Odinsea.Net.Opcodes
    • Added lp_spawn_player/0 (184)
    • Added lp_remove_player_from_map/0 (185)
    • Added lp_chattext/0 (186)
    • Added lp_move_player/0 (226)
    • Added lp_update_char_look/0 (241)

Architecture Notes:

  • Took vertical slice approach: minimal character → minimal map → spawn/movement
  • Each character is a GenServer (isolation, crash safety)
  • Each map instance is a GenServer (per-channel map isolation)
  • Registry pattern for lookups (distributed-ready)
  • DynamicSupervisor for on-demand map loading

Next Steps:

  • Implement basic PlayerHandler (movement, chat, map changes)
  • Expand character encoding (equipment, buffs, pets)
  • Implement full movement parsing (all 40+ command types)
  • Add inventory system
  • Add NPC interaction

Session 2026-02-14 (Channel Handlers - Chat & Movement)

Completed:

  • Implemented Odinsea.Channel.Handler.Chat - Full chat handler
    • General chat (broadcast to map)
    • Party chat (buddy, party, guild, alliance, expedition routing)
    • Whisper system (find player, send whisper)
  • Implemented Odinsea.Channel.Handler.Player - Player action handler
    • MovePlayer (character movement with broadcast)
    • ChangeMap (portal-based map transitions)
    • ChangeKeymap (keybinding changes)
    • ChangeSkillMacro (skill macro management)
    • Attack stubs (CloseRange, Ranged, Magic - ready for implementation)
    • TakeDamage stub
  • Added chat packet builders to Odinsea.Channel.Packets
    • UserChat (general chat)
    • WhisperReceived / WhisperReply
    • FindPlayerReply / FindPlayerWithMap
    • MultiChat (party/guild/alliance/expedition)
  • Wired handlers into Odinsea.Channel.Client packet dispatcher
    • Integrated ChatHandler for all chat opcodes
    • Integrated PlayerHandler for movement, map changes, attacks
  • Added missing opcodes (lp_whisper, lp_multi_chat)

Architecture Notes:

  • Chat system routes through World services for cross-channel support
  • Movement broadcasts to all players on map except mover
  • Handlers use character GenServer for state management
  • Map GenServer handles player tracking and packet broadcasting

Next Steps:

  • Implement full attack system (damage calculation, mob interaction)
  • Port Inventory handler (item usage, equipping)
  • Implement mob system (spawning, movement, AI)
  • Implement party/guild/buddy systems in World layer
  • Implement full Shop system (database loading, item pricing)
  • Implement full Storage system (database persistence)
  • Implement Quest system
  • Implement Scripting system (JavaScript/Lua engine)

Session 2026-02-14 (NPC Handler & Game Systems)

Completed:

  • Implemented Odinsea.Channel.Handler.NPC - Full NPC handler (12 packet handlers)
    • NPC move/animation forwarding
    • NPC talk (shop open / script start)
    • NPC dialog continuation (script responses)
    • Shop handlers (buy, sell, recharge)
    • Storage handlers (deposit, withdraw, arrange, meso transfer)
    • Quest action handlers (start, complete, forfeit, scripted)
    • Repair handlers (single item, all items)
    • Quest update/item handlers
    • Public NPC handler (UI-based NPCs)
    • Scripted NPC item handler
  • Implemented Odinsea.Game.Shop - Shop system structure (stubs)
    • ShopItem struct
    • Rechargeable items list (stars/bullets)
    • Load shop / send shop functions
    • Buy/sell/recharge stubs (needs inventory system)
  • Implemented Odinsea.Game.Storage - Storage system structure (stubs)
    • Storage struct with slots/meso/items
    • Load/send storage functions
    • Take out/store item stubs
    • Arrange/sort stub
    • Meso transfer stub
    • Helper functions (full?, next_slot, find_by_id)
  • Updated Odinsea.Net.Opcodes - Added 15+ NPC/quest/storage opcodes
    • Fixed NPC recv opcodes to match recvops.properties
    • Added quest opcodes (cp_quest_action, cp_update_quest, etc.)
    • Added repair opcodes (cp_repair, cp_repair_all)
    • Added NPC send opcodes (lp_npc_talk, lp_open_npc_shop, lp_open_storage)
  • Wired all NPC handlers into Odinsea.Channel.Client dispatcher
    • Added 12 opcode case statements
    • Integrated with existing packet routing pattern

Architecture Notes:

  • NPC handler follows existing pattern: handlers receive packet + client_pid
  • Shop and Storage modules use GenServer for state management
  • All implementations are stubs awaiting:
    • Inventory system (for item operations)
    • Item information provider (for pricing/validation)
    • Quest system (for quest operations)
    • Script manager (for NPC dialogs)
    • Database loading (for shops/storage persistence)

Opcode Discrepancy Discovered:

  • Current Elixir opcodes don't match Java recvops.properties
  • NPC opcodes have been corrected to match wire protocol
  • Full opcode audit recommended for future session

Next Steps:

  • Implement Inventory system (critical dependency for shops/storage)
  • Implement Item information provider (WZ data loading)
  • Implement basic Mob handler
  • Implement Party/Guild/Buddy systems
  • Audit and fix ALL opcodes to match recvops.properties
  • Test NPC handlers with real client once inventory system exists

Session 2026-02-14 (CRITICAL: Opcode Audit & Fix) ⚠️

Completed:

  • COMPLETE OPCODE REWRITE - Fixed critical opcode mismatch issue
    • Rewrote entire Odinsea.Net.Opcodes module (892 lines)
    • All 200+ recv opcodes now match recvops.properties exactly
    • All 250+ send opcodes now match sendops.properties exactly
    • Added opcode naming helper functions (name_for/1, valid_client_opcode?/1)
    • Added backward-compatibility aliases (e.g., cp_party_chat()cp_partychat())
    • Added missing cp_npc_move() opcode (0x41)
    • Verified compilation - all handlers compile successfully
    • Impact: This was a critical blocker - old opcodes were completely wrong and would prevent any client connection from working properly

Opcode Comparison (Examples):

Packet Old (Wrong) New (Correct) Java Source
CHANGE_MAP 0x31 0x23 recvops.properties:21
MOVE_PLAYER 0x2D 0x2A recvops.properties:27
GENERAL_CHAT 0x39 0x36 recvops.properties:36
SPAWN_PLAYER 184 0xB8 sendops.properties:123
CHATTEXT 186 0xBA sendops.properties:125

Architecture Notes:

  • Opcodes module is now 100% wire-protocol compatible with GMS v342
  • All opcode values directly ported from Java properties files
  • Naming convention: cp_* for client→server, lp_* for server→client
  • Backward-compatible aliases added where Elixir conventions differ from Java
  • Helper functions added for debugging and validation

Files Modified:

  • lib/odinsea/net/opcodes.ex - Complete rewrite (892 lines)

Testing:

  • All handler files compile without errors
  • Opcode function calls from handlers resolve correctly
  • ⚠️ Not yet tested with real v342 client (requires full server stack)

Priority Impact:

  • 🔴 CRITICAL FIX - This was blocking all real client testing
  • Without correct opcodes, no packet handling would work
  • Handlers were written against incorrect opcode values
  • Now ready for actual client connection testing

Next Steps:

  • Test login flow with real v342 client
  • Test channel migration with real v342 client
  • Continue with Inventory system implementation
  • Implement Item information provider

Session 2026-02-14 (Inventory System Implementation)

Completed:

  • INVENTORY SYSTEM - Core inventory implementation complete
    • Odinsea.Game.Item - Base item struct with all fields (item_id, position, quantity, flag, etc.)
    • Odinsea.Game.Equip - Equipment struct with stats (str, dex, watk, wdef, upgradeSlots, potential, etc.)
    • Odinsea.Game.Inventory - Inventory management module
      • add_item, remove_item, move items between slots
      • equip/unequip handling
      • item stacking logic
      • slot management (next_free_slot, is_full, etc.)
    • Odinsea.Game.InventoryType - Inventory type enum (equip, use, setup, etc, cash, equipped)
    • Odinsea.Database.Schema.InventoryItem - Ecto schema for inventoryitems table
    • Database Context updates - load/save inventory operations
    • Odinsea.Game.Character updates
      • Load inventories from database on character login
      • Inventory management via GenServer calls (get_item, move_item, equip_item, etc.)
      • Save inventories on character save/logout
  • INVENTORY HANDLER - Channel packet handlers
    • Odinsea.Channel.Handler.Inventory - Full inventory packet handler
    • handle_item_move - equip, unequip, drop, regular moves
    • handle_item_sort - inventory sorting
    • handle_item_gather - item gathering/stacking
    • handle_use_item - item usage (stub, needs effects)
    • handle_use_scroll - scrolling system (stub)
    • handle_use_cash_item - cash item usage (stub)
  • CHANNEL CLIENT - Wired inventory handlers
    • All 7 inventory opcodes now routed to InventoryHandler
    • Fixed processor opcode mappings to match handler functions

Files Created:

  • lib/odinsea/game/item.ex - Item and Equip structs (200 lines)
  • lib/odinsea/game/inventory_type.ex - Inventory type definitions (80 lines)
  • lib/odinsea/game/inventory.ex - Inventory management (350 lines)
  • lib/odinsea/database/schema/inventory_item.ex - Database schema (200 lines)
  • lib/odinsea/channel/handler/inventory.ex - Packet handlers (350 lines)

Files Modified:

  • lib/odinsea/database/context.ex - Added inventory operations (+70 lines)
  • lib/odinsea/game/character.ex - Integrated inventories (+80 lines)
  • lib/odinsea/channel/client.ex - Wired inventory handlers (+50 lines)
  • lib/odinsea/net/processor.ex - Fixed opcode mappings
  • lib/odinsea/net/opcodes.ex - Added missing opcodes

Architecture Notes:

  • Inventory system follows Java structure closely
  • Each inventory type is a separate struct within the character state
  • Database schema includes both regular items and equipment in one table
  • Equipment-specific fields (stats, potentials, etc.) stored as columns
  • Move operations handle stacking automatically for non-equipment items
  • Slot positions: positive = inventory, negative = equipped

Next Steps:

  • Implement Item Information Provider (WZ data loading)
  • Implement full item usage effects (potions, scrolls, etc.)
  • Implement scrolling system (success/fail logic, stat changes)
  • Port Mob system (MapleMonster, MapleLifeFactory)
  • Implement MobHandler for mob movement and combat

Session 2026-02-14 (Data Providers & Monster System) MAJOR UPDATE

Completed:

  • ITEM INFORMATION PROVIDER - Complete item data system
    • Odinsea.Game.ItemInfo - Item/equipment data provider (450+ lines)
    • ItemInformation struct with all item metadata
    • EquipStats struct for equipment base stats
    • ETS caching for item lookups
    • JSON-based data loading (WZ export compatibility)
    • Fallback data for basic testing
    • Equipment creation with randomized stats
    • Helper functions: get_name, get_price, get_slot_max, is_tradeable, etc.
    • Integrated into application supervision tree
  • MAP FACTORY - Complete map data system
    • Odinsea.Game.MapFactory - Map template provider (450+ lines)
    • Portal struct with all portal types (spawn, invisible, visible, script, etc.)
    • Foothold struct for collision/movement
    • FieldTemplate struct with complete map properties
    • ETS caching for map templates
    • JSON-based data loading (WZ export compatibility)
    • Portal lookups (by name, random spawn)
    • Map property accessors (return map, field limit, etc.)
    • Fallback data for common maps (Southperry, Henesys, etc.)
    • Integrated into application supervision tree
  • LIFE FACTORY - Complete monster/NPC data system
    • Odinsea.Game.LifeFactory - Monster/NPC data provider (350+ lines)
    • MonsterStats struct with 40+ fields (hp, mp, exp, atk, def, etc.)
    • NPC struct with shop/script data
    • ETS caching for monster/NPC lookups
    • JSON-based data loading (WZ export compatibility)
    • Monster stat accessors (boss?, undead?, flying?, etc.)
    • Fallback data for common monsters (Blue Snail, Orange Mushroom, etc.)
    • Integrated into application supervision tree
  • MONSTER MODULE - Complete monster instance system
    • Odinsea.Game.Monster - Monster instance struct (250+ lines)
    • Full monster state (hp, mp, position, stance, controller)
    • Damage tracking and attacker logging
    • HP/MP management (damage, heal)
    • Controller assignment (player who controls mob AI)
    • Status effects system (poison, stun, etc.)
    • Position tracking and movement
    • Boss detection, death detection
    • EXP calculation
    • Top attacker tracking
    • Drop disabling
  • DATA DIRECTORY STRUCTURE - Created priv/data for WZ exports
    • Directory created for JSON cache files
    • Ready for data export from Java server

Files Created:

  • lib/odinsea/game/item_info.ex - Item information provider (450 lines)
  • lib/odinsea/game/map_factory.ex - Map factory (450 lines)
  • lib/odinsea/game/life_factory.ex - Life factory (350 lines)
  • lib/odinsea/game/monster.ex - Monster module (250 lines)
  • priv/data/.gitkeep - Data directory for WZ exports

Files Modified:

  • lib/odinsea/application.ex - Added 3 data providers to supervision tree

Architecture Notes:

  • All data providers use ETS for high-performance caching
  • JSON-based loading allows easy WZ data exports from Java
  • Fallback data enables testing without full WZ exports
  • Data providers start before game servers (proper initialization order)
  • Monster instances are structs managed by Map GenServer (not separate processes)
  • Complete separation of data (LifeFactory) and instances (Monster)

Progress Impact:

  • 🎯 CRITICAL BLOCKERS RESOLVED
    • Item Information Provider was blocking shops, drops, quests
    • Map Factory was blocking proper map initialization
    • Life Factory was blocking monster spawning and combat
  • 📊 Statistics Updated
    • Files: 51 → 55 (+4)
    • Lines: ~11,000 → ~12,500 (+1,500)
    • Modules: 45 → 49 (+4)
    • Progress: 55% → 62% (+7%)
  • 🚀 Next Steps Unlocked
    • Can now implement full monster spawning
    • Can implement shop systems with item pricing
    • Can implement drop tables with item creation
    • Can implement portal-based map changes
    • Can implement combat damage calculation

Next Session Priorities:

  1. Implement WZ data export utility (Java → JSON)
    • Export items.json, equips.json, item_strings.json
    • Export maps.json with portals/footholds
    • Export monsters.json, npcs.json
    • Test with real WZ data instead of fallbacks
  2. Implement monster spawning on maps
    • SpawnPoint system
    • Respawn timers
    • Monster AI movement
  3. Implement basic combat system
    • Damage calculation
    • Monster damage handler
    • Death and EXP distribution
    • Drop creation
  4. Implement portal system
    • Portal-based map changes
    • Script portals
    • Town portals
  5. Test full gameplay loop:
    • Login → Character select → Spawn in map → See monsters → Kill monster → Get EXP/drops

Last Updated: 2026-02-14 Current Phase: Data Providers Complete - Progress: 55% → 62%