Abyss Messenger Devlog: From "Paper Person" to "Playable Game"

Abyss Messenger Devlog: From "Paper Person" to "Playable Game"
Header illustration generated for this article with an AI image model. It is promotional art, not an in-game screenshot.

This article records the full iteration that took Abyss Messenger from a "technical demo" to a "game you can actually play". Behind every change there is a painful little story.


Stage 1: is this game playable at all? (2026-06-30)

Problem: the character is a paper cutout

The game originally loaded a GLTF model (character.glb, 2.9 MB) in place of the procedural character. But that model carried no animation joint data (userData.joints), so while moving the character slid across the ground like a sheet of paper — no limb motion at all.

Fix: disable GLTF loading and use the procedural character only.

Problem: there is no gameplay

Two exploration agents audited the code end to end and concluded: at this point the game is a "walking dialogue simulator".

The core loop was: walk to an NPC → click through 8-13 lines of dialogue → get auto-teleported to the next NPC → repeat five times → choose between two endings → done.

Systems already present (all complete, none of them affecting gameplay):

Completely missing: no items or inventory, no puzzles that require decoding, no exploration rewards, no ability unlocks, no side quests, and no fail state or challenge of any kind.

Fix: rebuild the female character + add game systems

Character rebuild

buildCharacterMesh() was rewritten to construct a complete female character:

Each of the 5 NPCs was also given its own hair colour, dress colour and boot colour.

Animation system updates

New game systems

SystemWhat it isHow it works
Memory fragments12 glowing octahedra scattered across the planet's surfaceWalk close and press E to collect; the HUD shows 0/12
Quest items5 items (the tidal log / a fluorescence sample / the chronicle / a bone flute / a frequency meter)The NPC refuses to talk until you have found the item
Story bottles7 preset narrative bottles (K's warning, Su Qing's diary, Ming Yue's sutra copying, and so on)Placed around the planet; press B to pick one up
Consequences for the radioTuning to 52.9 Hz spawns a golden hidden fragmentBefore unlocking: text only; after unlocking: a real item
InventoryShows the items you collected and the story of each fragmentToggled with the I key

What the preset story bottles say

Each of the 7 bottles holds one piece of the story:

  1. Anonymous: "If you found this letter, it means you heard that voice too. 52.9 hertz — it does not come from the seabed. It comes from somewhere deeper."
  2. K: "Seven lighthouses, seven gatekeepers. Lan City is only the beginning. Remember this frequency; it is the key."
  3. Su Qing (an old diary): "Brainwave data does not lie. This island is dreaming. And it is about to wake up."
  4. Ming Yue (a copied sutra): "The ten-thousand-year pact is due. The fate of the city on its back rests in the messenger's hands."
  5. K: "I have seen that door at the Lan City lighthouse. Do not open it. The same frequency means they are connected."
  6. Old Chen (a sailing log): "The tide went from six seconds to four, then to three. It is breathing faster and faster."
  7. Lin Xi (a memo): "Every clue points to the same conclusion — this is not an island, it is a living thing. And I have to choose."

Stage 2: the camera is wrong and the movement is strange (2026-07-01)

Diagnosis after ten minutes as an actual player

What happens when a real person enters the game?

TimeWhat they doWhat it feels like
0-1 minTitle screen → enter the gameThe title screen is fine; it has atmosphere
1-2 minClick the canvas to lock the mouse, walk with WASDConfused: why is the ground curved? Why do I come back around after a few steps?
2-3 minFind the first glowing beaconThe beacon is obvious, but the walk to it makes you dizzy
3-5 minTalk to Old Chen (8 lines)The story is good; the typewriter effect pulls you in
5-5.5 minDialogue ends, auto-teleportJarring: how did I suddenly end up somewhere else?
5.5-7 minLook for the quest item + talk to Su QingWhere is the item? No hint at all, so you wander blindly
7-8 minCollect one memory fragmentThe fragment looks lovely glowing, but the text flashes by and is gone
8-10 minThird NPC dialogueRepetitive: walk → read → teleport → walk → read → teleport...

Root-cause analysis

Problem 1: the planet is too small

Problem 2: auto-teleport kills exploration

Problem 3: no guidance for fragments and items

Problem 4: dialogue cannot be skipped

Fix: a full overhaul

Planet scaled up 3x

PLANET_RADIUS: 18 → 50 (2.78x)
all 3D objects scaled uniformly by 2.5x

Every constant was rescaled in proportion:

ConstantOldNewWhy
CAMERA_DISTANCE4.814Pull the camera back so more of the horizon is visible
CAMERA_HEIGHT1.65Raise the camera to reduce the sense of ground curvature
MAX_SPEED5.08.0Faster, but the planet is bigger so it feels slower relatively
JUMP_FORCE7.412Jump force matched to the heavier gravity
GRAVITY1828More gravity, so jumps stop feeling floaty
INTERACT_DISTANCE2.56Interaction range matched to a bigger world
Landmark detection range7.420Detection radius matched to a bigger world

Movement and camera fixes

Auto-teleport removed

The teleportToQuest() calls were deleted. The player now has to navigate to the next objective themselves.

New navigation system

Beginner tutorial

On first entry the game shows a 4-step control guide:

  1. You are standing on a tiny planet. Move with WASD, turn the view with the mouse.
  2. Follow the glowing beacons to find NPCs, and press E to talk.
  3. Collect glowing memory fragments and quest items; press I to open your inventory.
  4. The compass in the top-right corner points you to the next objective.

Skip button for dialogue

A "Skip" button was added to the top-right of the dialogue panel; clicking it reveals the full text immediately.


Stage 3: every character is lying down (2026-07-01)

Problem: character orientation is completely wrong

After fixing the above, entering the game revealed: every character was lying flat, feet pointing up.

Root cause: a left-handed coordinate system

// the original code
const right = crossVectors(facing, normal)  // facing × normal = LEFT (not RIGHT!)

This produced a left-handed matrix (determinant = -1). Three.js setFromRotationMatrix cannot handle a left-handed matrix correctly, so the characters ended up facing the wrong way entirely.

Fix: a right-handed coordinate system

// after the fix
const right = crossVectors(normal, facing)  // normal × facing = RIGHT (correct)

Swapping the order of the cross product yields a proper right-handed basis, and the characters stand correctly on the sphere.


Stage 4: only half a person, the lower body sunk in (2026-07-01)

Problem: the character is half buried

With orientation fixed, the character's upper half was visible and the lower half had sunk into the ground.

Root cause: wrong position maths

The character's position was set at normal × PLANET_RADIUS, which puts the character's origin (y=0) on the surface. But the boot soles sit 0.34 units below the origin, so the boots sank into the ground.

Fix: lift the character

// after the fix
const surfacePosition = normal.clone().multiplyScalar(PLANET_RADIUS + 0.4 + this.jumpOffset)

Raising the character by 0.4 units puts the boot soles exactly on the surface. The NPCs' position offset was fixed in the same pass.


Full change list

Engine.js (core engine)

ChangeDetails
Character rebuildFemale character (dress / long hair / scarf / boots / female proportions), eliminating the paper cutout
GLTF disabledProcedural character only, so an animation-less model cannot override it
Animation systemHip sway / hem / hair while walking; breathing plus faint hair motion while idle
Memory fragments12 glowing octahedra, collected with E when close
Quest items5 items; NPCs demand you find them before they will talk
Story bottles7 preset narrative bottles
Radio consequences52.9 Hz unlocks a hidden fragment
Planet scaled upRadius 18→50, all objects scaled uniformly by 2.5x
Camera fixesDistance 4.8→14, height 1.6→5, more forgiving collision
Rotation smoothinglerp coefficient 10→4
Teleport removedReplaced by compass navigation guidance
Navigation APIgetTargetDirection / getShardPositions / getItemPositions
Orientation fixCross-product order corrected to a right-handed basis
Ground fixCharacter raised by 0.4 units so the boot soles touch the ground

App.vue (UI layer)

ChangeDetails
Fragment counter HUDShows 0/12 in the top-right corner
Inventory panelToggled with the I key; shows items and each fragment's story
Compass componentLive direction arrow plus distance readout
Beginner tutorial4-step control guide on first entry
Dialogue skipTop-right button that reveals the full text
Minimap markersFragments (blue) / items (gold) / target NPC (pink)
Pickup promptsThe banner that appears when you are near a fragment or item
Story overlayThe text shown after a fragment is collected

i18n.js (bilingual strings)

Added 40+ bilingual entries:

style.css (styling)

Added 176 lines of styles:


Technical details

Build statistics

29 modules transformed
dist/assets/index.js   244.34 kB (gzip: 84.94 kB)
dist/assets/three.js   558.90 kB (gzip: 141.68 kB)
✓ built in 33.70s

Test verification

Playwright automated tests confirmed:

Git commit history

The messages below are the original commits, quoted verbatim.

3318bb8 feat: 重建女性角色 + 新增记忆碎片/任务道具/故事漂流瓶游戏系统
c9ff436 feat: 新增背包UI + 碎片计数HUD + 收集提示交互
ca8b55a feat: 任务道具数据 + 双语翻译(碎片剧情/道具名称/UI文本)
d0a201d feat: 星球放大3倍 + 移动/相机修复 + 导航API
15d7407 feat: 新手教程 + 指南针导航 + 对话跳过 + 小地图标记
730757b fix: 修复角色朝向 — 右手坐标系 + 脚踩地面

In one sentence

From a tech demo of "a paper cutout sliding around on a small ball" to a playable 3D exploration game with a female character, a collection system, navigation guidance and a tutorial.

Every step was an iteration driven by real player feedback. No perfectionism — only "this is the problem hurting the experience most, so fix it first".

If you are making an indie game too, I hope this log saves you a few of these detours. At least you know — you are not the only one fighting a paper cutout.