Inside the Fishing Rework

Posted

by

Our newest Unturned update features a whole school of fishing changes, and we’re reeling with excitement! Not only to see how players tackle the unique fish behaviors, but also because it brings a bunch of tunable settings for modders to experiment with.

Did those fin-tastic puns pike your interest?

Of course, these changes are optional. Mods can keep using older features, and we’ve added a difficulty setting for disabling the “Catch Challenge” minigame outright if it’s just not for you.

Assuming your interest was piqued, this blogpost is meant for you. These features went through waves of changes during development, and our playtesting taught us a lot about what works well… and what doesn’t. We’ve compiled our notes so modders can learn from our mistakes!

Why Did We Change Fishing?

Let’s talk core design philosophy. Our reasons behind changing fishing, and benefits from doing so.

Originally, fishing loot was tied to the fishing rod used. This is quite limiting, and made fishing rods identical during normal gameplay – except for the Upgraded Fishing Rod, which could catch Giant Squid at a 0.31% chance. Custom maps often needed to create their own fishing rods, just so they could customize the map’s fishing loot. An extra step that should be unnecessary.

This led to us creating map-specific loot tables for fishing. It’s a more seamless solution, and you can even create maps where your loot depends on which water source you’re fishing in! Germany’s ponds have been updated with this in mind.

Though equally important – if not more – is that fishing rods can have meaningful differences. Rather than having unique loot tables, we added a “Catch Challenge” minigame and let each rod perform differently. This gives modders a better reason to create custom rods!

Designing Fishing Rods

Fishing rods have 10 new properties in this update! To maintain backwards compatibility, mods must manually enable support for the new minigame and map-specific loot tables.

Our standard Fishing Rod’s stat block is otherwise identical to the default values for these properties. For reference, that looks like this:

// Enable new features
Fishing_Reward_Mode WaterVolumes
CatchChallenge_Enabled true
// Default minigame values
CatchChallenge_CursorSize 0.2
CatchChallenge_Gravity 1.0
CatchChallenge_Acceleration 1.0
CatchChallenge_UpperRestitution 0.5
CatchChallenge_LowerRestitution 0.5
CatchChallenge_CaptureSpeed 1.0
CatchChallenge_EscapeSpeed 1.0
// Fish bite frequency (default)
Fish_Bite_Interval_Multiplier 1
Comparing cursor sizes at 0.1 (Birch Rod), 0.135 (Pine Rod), 0.2 (Fishing Rod), and 0.25 (Upgraded Fishing Rod).

CursorSize controls the literal size of the player’s cursor during the minigame. With a default of 0.2, it takes up 20% of the water column. This may seem generous, but even skilled players may find it challenging when considering all properties at play.

Gravity and Acceleration control the downwards and upwards acceleration of the cursor. Lower values can make a rod feel sluggish to respond, as cursors have momentum and cannot change direction immediately.

UpperRestitution and LowerRestitution affects the intensity of the bounce caused when the cursor bumps into the edges of the water column. These properties allow for skill expression, by penalizing players who lack control over their cursor. Skilled players can even use the bounce to their advantage when chasing a fast-moving fish.

CaptureSpeed and EscapeSpeed are multipliers on how quickly a fish can be caught or escape during the minigame.

Fish_Bite_Interval_Multiplier affects the frequency you hook something. For example, you can double the frequency by setting this to 2. Weather can also be configured to affect the frequency, and these multipliers stack!

Cursor size, acceleration and gravity, and escape speed are the most impactful stats when designing a fishing rod that struggles to catch high-tier fish. Size and acceleration can make it difficult to track your fish, while a penalty to escape speed could mean that a high-tier fish escapes nearly instantly after leaving your cursor.

On the other hand, capture speed and restitution have little impact on difficulty. If the cursor passes the fish, the escape bar is immediately reset. By setting a very low capture speed, it may be more annoying than challenging. Similarly, too high of a restitution value can lead to infinite bouncing.

We recommend designing fishing rods around the Salmon, as that’s our default fish behavior. Alternatively, decide what the standard fish should be on your map, and then scale other fish and custom rods around that!

Tiers of Fishing Rods

With the standard Fishing Rod as our baseline, we wanted a soft sense of progression for players using our vanilla fishing rods.

Wooden rods are expectantly worse than the standard rod. Though most items with wood variants have their own progression with Birch → Maple → Pine, we decided to take a different approach for the fishing rods. Instead: Birch, Maple, and Pine are sidegrades to each other, each with a unique tradeoff.

Birch Rods have a smaller cursor, Maple Rods have slower acceleration and gravity, and Pine Rods have higher restitution. These sidegrades give players options based on their comfortability with different fishing mechanics.

Some players may get lucky and find themselves with an Upgraded Fishing Rod, which can now be acquired on all maps. Since loot is no longer rod-specific, we’ve made the Upgraded Fishing Rod handle significantly better than other fishing rods. Though, the main benefit is that the most challenging fish – like Tuna and Giant Squid – are more feasible to catch.

Our early stat blocks for this overhaul had greater differences between each tier of fishing rod. This was very effective at preventing players from catching fish outside their tier, but was unfun in practice. Less is more, and our current stat blocks ensure almost every fish is catchable regardless of the rod used, given enough skill.

Fish Behavior

Although we’ve used the word “fish”, any item can be added to the fishing minigame and have unique behavior. Items have a new dictionary with 16 properties for configuring their behavior.

Items without a unique behavior use our default values instead, just like our Salmon:

Fishing_Catchable
{
Min_Relocate_Interval 1.5
Max_Relocate_Interval 2
Max_Upward_Acceleration 1.5
Max_Downward_Acceleration 1.2
Max_Upward_Speed 0.6
Max_Downward_Speed 0.45
Upper_Restitution 0.6
Lower_Restitution 0.4
Min_Target_Delta 0.3
Max_Target_Delta 0.4
Min_Target_Position 0.1
Max_Target_Position 0.9
Capture_Duration 2
Escape_Duration 2
Spring_Stiffness 16
Spring_Damping 4
}

With so many options, this can be a really helpful baseline when creating custom fish behaviors. These default values were also balanced with the vanilla fishing rods in mind. High difficulty for wooden rods, medium difficulty for the standard rod, and low difficulty for the upgraded rod.

Relocate_Interval is how often the fish changes target position. By default, this is between 1.5 and 2 seconds. Smaller ranges means movement happens more consistently. Fish can select a new target position even if they haven’t reached their current target.

Acceleration controls how quickly the fish accelerates when moving upwards or downwards.

Speed is a cap on how quickly a fish is allowed to move. Fish cannot accelerate past their max speed.

Restitution affects the “bounciness” caused when the fish collides with the edge of the water column. At a low value, this makes your fish bounce very slightly – which can look nicer than having it sit idly on the bottom, even if it doesn’t affect the difficulty. At a high value, this can cause your fish to quickly move in the opposite direction – greatly decreasing predictability.

Target_Delta controls the distance between target positions. Smaller values means less distance between the old and new target positions.

Target_Position is where the fish is allowed to target. For example, 0 would be the very bottom of the water column, and 1 is the very top edge. Although fish can only target within this range, it is possible for them to travel outside it when carried by their momentum.

Capture_Duration and Escape_Duration determine how long it takes for the fish to be captured or escape, respectively.

Spring_Stiffness and Spring_Damping controls the jerk (also known as jolt). This is the rate of change in the fish’s acceleration over time. Stiffness is the coefficient for how quickly to accelerate towards the target, and damping is the coefficient for how quickly to decelerate when approaching the target. High springiness with low damping causes oscillation – circling the target rather than settling. Low springiness and high damping would be very sluggish to respond to the target.

Our default behavior is fairly predictable. Due to the configured target deltas and possible target positions, fish with these settings almost always move Up/Down. Rarely, when ending near an edge, they may move Up2/Down or Up/Down2 instead.

Once players understand the rules for how your fish can move, it becomes much easier to catch. Used correctly, each setting can affect the difficulty and predictability of your fish’s behavior.

Fishy Archetypes

Breaking fishing loot into tiers is helpful when deciding how challenging each minigame should be. For example:

  • Easy: Shrimp, Minnow, Goldfish
  • Medium: Salmon, Trout, Bass
  • Hard: Giant Trevally, Tuna, Giant Squid

Fish behaviors can then be designed with the corresponding tier of fishing rod in mind, and some fish (like the Dolphinfish or Lobster) can bridge the gaps between tiers for an even smoother difficulty progression.

To give each fish more personality, we were inspired by some real-world fish behaviors. Although we can’t replicate those exact behaviors, our current fish can be split across 4 archetypes: jumpers, long runners, bottom fighters, and oscillators.

Oscillators tend to be the most challenging. High springiness, short movement intervals, and high restitution makes them unpredictable. This can be annoying if overused, but interesting when reserved for your rarest fish. For example, the Giant Squid!

What Else?

Although we hope this blogpost is helpful to modders in our community, we’ve updated our official modding documentation too!

Some other details you may find helpful, in rapid-fire:

  • Maps can set a default spawn table to use while fishing.
  • Water volumes can override that default spawn table.
  • Minimum depth required to fish can be configured per water volume.
  • Like any other spawn table, vanilla spawn tables can be expanded by mods.
  • Fishing rods can set a default spawn table that should be used if the map doesn’t have any spawn tables configured. This is useful for backwards compatibility!

Thank you supporting the game! We hope you’re enjoying the Wild Harvest update.


Discover more from Smartly Dressed Games Blog

Subscribe to get the latest posts sent to your email.

Categories

Archives