Editing the Fishing Pond
The fishing minigame is one actor, not a scene full of them. When the scene loads, that actor builds the whole pond by itself: the owner, the fish, the lily pads, the sign and the prize tank.
This means most of the pond is fixed in place. You cannot move the fishing game to your pond. You have to move your pond to the fishing game.
This page lists what is fixed, what you can change, and how to build a custom pond that still works.
- Scene: Fishing Pond (
turibori_scene, scene0x49) — scene page - Actor: Fishing Pond Man and Fish (
Fishing,0x00FE) — actor page
One actor starts everything
The vanilla scene places a single Fishing actor, with the pond owner role
(any parameter value under 100). That one actor spawns every other part of the
minigame when the scene loads.
You do not place the fish. You do not place the lily pads. Place the owner only.
The actor also ignores the position you give it. It reads your actor entry only to learn that it is the owner, then moves itself to its own coordinates and sets its own rotation and scale.
What the actor places for itself
All positions are world units. x, y, z are absolute — they are not
relative to your actor entry.
| Part | Position | Notes |
|---|---|---|
| Pond owner (the man) | 160, -2, 1208 |
Faces the pond. Scale 0.011. |
| Sign | 53, -17, 982 |
An En_Kanban actor, spawned by the owner. |
| Prize tank and record fish | 130, 40, 1300 |
Both the glass and the fish are drawn by the actor. |
| 15 to 17 catchable fish | See the list below | 15 normally; 16 or 17 when the loaches appear. |
| 60 background fish | Three groups on a circle of radius 720, at y = -35 |
Decoration only. You cannot catch them. |
| 140 pond props | Fixed list, y between -73 and -22 |
95 lily pads, 41 reeds, 11 rocks, 6 wooden posts. |
| 4 sinking-lure hiding spots | For example -364, -30, -269 and 1129, 3, -855 |
Where the hidden lure can be found. |
Two things about the props are easy to miss:
- The actor draws them, not your room. Do not model lily pads, reeds, rocks or posts into your scene. They will appear on top of yours.
- The rocks and the wooden posts have collision. The actor gives them collision spheres, so Link will bump into them even if your room mesh has nothing there.
The pond shape is assumed, not read
Every boundary check in the minigame measures the distance from x = 0, z = 0. There is no offset. The pond is a circle around the world origin.
The floor is calculated from that distance too. The game does not read your collision triangles to decide where the lure or the fish sit — it uses this shape:
outside 920: the ground rises 0.11 per unit
\ /
\ /
~~~~~~~~~~+~~~~~~~~ water surface ~~~~~~~~+~~~~~~~~~ <- the water box
\ /
\ the bottom drops /
\ 0.147 per unit /
\_______________________/
about 135 units below the surface
at the centre (x = 0, z = 0)
|<----------- 920 ----------->|
radius, from x = 0, z = 0
The important distances:
| Distance from the centre | What happens there |
|---|---|
920 |
The edge of the water. The lure, the fishing line and the splashes cannot go past it. Link's shadow fades inside it. |
about 800 |
Fish stop following the lure and turn back. |
about 750 |
Fish will not choose a target past this. |
720 |
Where the background fish swim. |
So a custom pond should be a bowl of about 920 units radius, centred on the world origin, about 135 units deep in the middle. If your bowl is a different shape, the lure will hang above your floor or sink into it.
What your scene does control
The list is short, but one item on it matters a lot.
The water level
The only value the minigame reads from your scene is the surface height of the first water box in the scene collision. Everything vertical follows it: the water surface, how deep the lure sinks, where the fish swim, the ripples.
In the vanilla scene there is exactly one water box:
| Field | Value |
|---|---|
Surface height (ySurface) |
-24 |
| Covers | x from -952 to 1048, z from -926 to 1074 |
Two warnings:
- A scene with no water box crashes. The actor reads the first water box every frame and never checks whether one exists.
- Keep the surface near
-24. The fish and the props are placed at fixed heights (lily pads sit aty = -22). If you move the water far from-24, the lily pads will float in the air or sink out of sight.
Everything else
Your room mesh, your collision, your textures, your lighting, your skybox and the dialog text are all yours. Just remember that the terrain is only for looks and for Link's own movement — the fishing maths ignores it, so your floor should follow the bowl shape above.
Keep the scene ID
Build your pond by replacing the existing Fishing Pond scene, not by putting the actor in a new one.
Four places in the game check for scene 0x49 by number. One of them matters:
the code that puts the fishing rod on the B button and locks the other
buttons while you play. In any other scene that does not happen. Link still
holds the rod, but the HUD keeps your normal B item and you can still draw a
sword in the middle of the game.
The other three are cosmetic: the pond's title card, the pond's own underwater blur, and one small music behaviour.
In Prelude, importing a .glb over the viewed scene replaces it at its
existing path, so the scene ID stays 0x49. Importing into a spare debug slot
gives you a new scene ID instead, and the B button code will not follow you
there.
Landmarks on dry land
These are outside the water, and the game watches Link's position against them. If you rebuild the shop area, keep them roughly where they are.
| Place | Where | What it does |
|---|---|---|
| The counter | z greater than 1150 |
The pond fish stop being drawn. You are meant to be indoors here. |
| The exit door | z greater than 1360, and x within 25 of 0 |
While you hold the rod, Link is pushed back and the owner stops you leaving. |
| The prize tank | around 130, 40, 1300 |
The record fish and its glass. |
Fish starting positions
The catchable fish. Every one of them starts within about 790 units of the centre.
- Size is the base length. The game adds a small random amount on top, and child Link's fish are 27% smaller.
- Attraction is how easily the fish comes to your lure. A fish with
0.00ignores it at first; you have to keep the lure near it until its interest grows.
| # | Position (x, y, z) |
Size | Attraction |
|---|---|---|---|
| 1 | 666, -45, 354 |
38 | 0.10 |
| 2 | 681, -45, 240 |
36 | 0.10 |
| 3 | 670, -45, 90 |
41 | 0.05 |
| 4 | 615, -45, -450 |
35 | 0.20 |
| 5 | 500, -45, -420 |
39 | 0.10 |
| 6 | 420, -45, -550 |
44 | 0.05 |
| 7 | -264, -45, -640 |
40 | 0.10 |
| 8 | -470, -45, -540 |
34 | 0.20 |
| 9 | -557, -45, -430 |
54 | 0.01 |
| 10 | -260, -60, -330 |
47 | 0.05 |
| 11 | -500, -60, 330 |
42 | 0.06 |
| 12 | 428, -40, -283 |
33 | 0.20 |
| 13 | 409, -70, -230 |
57 | 0.00 |
| 14 | 450, -67, -300 |
63 | 0.00 |
| 15 | -136, -65, -196 |
71 | 0.00 |
| 16 | -561, -35, -547 |
45 | 0.00 |
| 17 | 667, -35, 317 |
43 | 0.00 |
Fish 16 and 17 are the loaches. They only appear on every fourth game. Fish 17 is child Link only.
Checklist for a custom pond
- Replace
turibori_sceneso the scene ID stays0x49. - Place one
Fishingactor with the pond owner role. Its position does not matter. Do not place fish. - Build the water as a circle around
x = 0, z = 0with a radius of about920, and a floor that reaches about135units below the surface at the centre. - Give the scene one water box with a surface height near
-24, covering the whole pond. Put it first in the list. - Leave the shore rising gently outside radius
920. - Keep the shop area around
z = 1200, with the door at aboutz = 1360. - Do not model lily pads, reeds, rocks or posts. The actor adds them, with collision.
Where these numbers come from
Everything above was read from Ship of Harkinian's own source, in
soh/src/overlays/actors/ovl_Fishing/z_fishing.c: the owner's coordinates in
Fishing_Init, the fish list in sFishInits, the props in sPondPropInits,
the water box lookup in the WATER_SURFACE_Y macro, and the radius 920 in the
lure and fish updates. The vanilla water box values were read from a real
oot.o2r. The scene ID checks are in z_parameter.c, z_actor.c, z_camera.c
and z_player.c.