Kefka's Discworld MUD ...Stuff

Fishing System


Everyone (except fish, or people who like fish in a not-food way) loves fishing! There seem to have been some vague potshots made at implementing some kind of fishing in certain areas, but only on a once off basis. This idea is for a MUD-wide fishing system which could be applied easily to any appropriate room.

Methods of Fishing

Two distinct methods of catching fish come to mind. While it's not essential to implement more than one, it would be nice to have some extra variety.

The first type is line-based fishing. This comes in two sub-methods - rod and hand. Rod fishing is the type we're all familiar with - using a fishing rod which consists of a bendy stick, reelable line and hook (and some bait or a lure). This is the most effective method of fishing, allowing a skilled angler to cast accurately (and far) and distribute the effort of reeling in fish. The core skill involved in this method would obviously be Some ot.perception could be used to represent knowing where exactly to cast your line (and even ot.direction to send it there), increasing your chances of success.

Hand fishing eschews the use of a rod, with one end of the line being held by the fisherman, usually on some form of spool. While essentially using the same skills as rod fishing, hand fishing doesn't have the same finesse in terms of casting and reeling, limiting its effectiveness.

The second method of fishing is basic fishing, where more primitive tools are employed. This involves standing the shallows and trying to catch fish using a sharpened stick or a net. In the case of a sharp stick (essentially a spear), one spots a fish and throws or thrusts the stick at it in an attempt to spear the fish. In the case of a net, one tries to throw the net over one or more fish in an attempt to trap and capture them. This method of fishing is much more of a covert art - you're in the water and hence need to hide your presence from the fish or they'll notice you and swim away. co.sth.underwater is the skill for the job.

For those using a sharpened stick, and maybe fi.ra.thrown seems like suitable skills. For those using a net, (and/or and fi.ra.thrown seem best.

Basic fishing methods are much more limited in their effectiveness and range, not to mention being impossible in certain areas without suitable wading room. This method of fishing is rather difficult, and more akin to 'hunting' (which in essence is a mix of covert and combat skills), hence why it uses skills from the covert and fighting trees rather than the fishing skill. Using at some stage would be easily justified though.

Fishing Locations

This is where things get a bit tricky. For the system to be truly MUD-wide, all suitable locations must be correctly labelled. Without knowing much about LPC, I can only paint a rough idea. A suitable location is a room from which you can fish from. Typically, this would be any room bordering or containing a body of water likely to contain fish (not including underwater rooms). Every suitable room would have a set of data defining its fishing-related properties. Unsuitable locations would omit this set of data entirely, or have a single 'No Fishing' tag in its place.

I imagine the set of fishing data to contain the following information:

Name Type Sample Data
fish_types array {trout, cod, salmon, carp}
Different fish available in location (path to object for cloning).
fish_ratio array {10, 5, 4, 1}
Ratio of available fish (maps to values of fish_types) to determine probability of catching each type of fish (allows for common/rare fish).
catch_ratio array {60, 25}
Percentage chance of catching a fish or junk. Remaining percent (15 in this case) is chance of catching nothing.
fishing_difficulty integer 150
Positive integer indicating difficulty of fishing in area. Used for fishing skill checks.
basic_ok boolean true
Whether or not basic fishing is possible from location (i.e. wading depth water exists).
junk_types array {boot, tin, reeds}
Different junk available in location (path to object for cloning).
area_name string "small fish pond"
Name of body of water, used in messages (e.g. "You wade into the shallows of the <area_name>".).

Why so much data? Customisation! With the data above, it's quick and easy to make just about any type of fishing conditions. Well stocked fish pond? No worries. Fast flowing river? Go nuts. Muddy watering hole? Done. Pontoon in middle of circle sea? Why not! Small variations along the length of a river would make fishing competitions more than possible. Other pieces of data may also be suitable, such as perhaps some more along the lines of area_name. This would allow for more customised feedback messages when fishing, to make each location feel even more unique.

On that note, some of these data arrays could be semi-random, or change based on time/season/weather... having the fish portion of catch_ratio be greater during dawn/twilight, etc. Or having certain fish only available during certain seasons... The potential is limitless!

The size of fish could also be part of the data set, although it may be better to just randomly select a size. So when you catch something (catch_ratio), and the system works out what you get (fish_ratio), a random number determines the size of your catch (represented in short and long description and size attributes of object).

When someone tries to fish from a particular room, the set of data is loaded and used. If the data doesn't exist or a 'No Fishing' tag is found, a message informs the player they can't fish from here. Being able to specify a reason in the 'No Fishing' tag rather than a generic one (which would be shown in places with the default tag or no data) would enable proper feedback for people trying to fish in areas which might have been suitable. e.g. "Fish in the Hong family koi pond? Are you insane!?" or "You don't think Pishe would appreciate you trying to fish in her pools."

The Process

With line-based fishing, the fishing process begins with the player casting their line. This involves two skill checks. Firstly, an ot.perception check is used to determine if you cast in a good area. This check is impossible to fail, and only affects the time spent waiting for something to bite. The second check is to, and determines if you manage to cast. The value of this check is fishing_difficulty (a dark cavern is much harder to cast from than a beach, etc). If you fail the check, your cast fails and the process ends there - try again. If you pass the check, you move on to stage two - the waiting game.

Once you have successfully cast your line, a loop begins in which each iteration has an increasing probability of Something Happening. The initial probability is determined in part by how well you did in the skillcheck when casting. When Something Happens, the catch_ratio determines if you get a bite, snag on junk, or catch nothing (lose your bait). If you lose your bait, the line is reeled in and the process ends - try again.

If you snag on junk, your line is reeled in and the type of junk you catch is determined at random. If you get a bite, you start reeling in the fish. At this stage, a function randomly selects the size of the fish you have caught, and applies an appropriate modifier to the difficulty (smaller fish are easier, larger fish are harder) of reeling it in. This modifier is added/subtracted to the fishing_difficulty for the skill check. Failing means the fish escapes, while passing means you catch it. At this stage, the fish_types and fish_ratio data determines what type of fish you catch.

Assuming basic_ok is set to true, basic fishing begins with the player wading into the shallows of the fishing area. This is similar to casting, except without the perception skill check. A check at fishing_difficulty level determines if the player manages to enter the water without scaring away the fish. If this check is failed, the process ends. It would make sense to impose a short (30 realtime seconds?) delay before being able to try again, with a message about the fish still being on high alert (better phrased, obviously) if the player tries again before the time. If the skill check is passed, it's once again time for the waiting game.

As with line-fishing, a loop with an increasing chance of Something Happening starts. How well the player passed the skill check could influence this, but it's not essential. Personally, I wouldn't mind the odds of Something Happening being universally lower for basic fishing, to reflect the patience required. When Something Happens, the catch_ratio determines if you get a bite, or catch nothing (realise fish have noticed you and are staying clear). If the fish have noticed you, you leave the water and can try again after a short delay.

In basic fishing, there is no chance of catching junk as you are watching and waiting for a fish, so the catch_ratio values need to be interpreted differently. I'm not sure what would make for a fun/realistic system - the junk percentage could be added to the fish percentage (easier to catch fish), ignored and treated as catching nothing (harder to catch fish), or divided in half and added to the fish percentage (between the previous two). Either way, when you eventually do land in the fish percentage, a fish has entered your range and you try to catch it buy throwing your spear or net. This takes a fi.ra.thrown (or possibly / check at double the fishing_difficulty. This is because fishing in this method takes a lot more skill than with a line. However, players are likely to already have significant bonuses in the proposed skills as they are used in combat.

Failing the skill check results in scaring the fish away, and leaving the water - try again in a short while. Passing it results in a catch. The size of the fish is randomly selected, but no modifier is made to the difficulty. While smaller fish might be harder to spear/net, larger (older) fish are more intelligent and don't tend to stray too close, so modifying the difficulty either way is not needed. As with line-based fishing, the fish_types and fish_ratio data determines what type of fish you catch. Regardless of your success or failure, a short delay between attempts seems appropriate.

Code Sample

In thinking through the idea, I discussed things with a few people. This resulted in me writing a mockup of the line-based fishing process described above, using all the variables outlined in this idea. Many thanks to Ptoink, Noir, Wodan and Matthew.

To view the code in action, click here. To view the source code, click here. The code is written in php.


Basic fishing requires either a net or a sharp stick. Fishing nets are already available in game (eg. the rainbow net from the bait stall in the fish market in Bes Pelargic), however a couple of different ones would be nice. Numerous "sharp sticks" exist in the form of spears and javelins. A couple of specialised fishing ones would be nice though. One day, it would be awesome to be able to whittle your own sharpened stick out of an everyday non-sharpened stick.

Hand and rod fishing are a little more complicated. Multiple components are needed, which must be combined correctly. The fishing quest in Death's Domain is an example of this process. It's all rather complicated, so I wouldn't complain if you could buy assembled fishing rods which just need to be baited. Otherwise, I'm sure the quest in Death's Domain is a good place to look for inspiration. Several rods, lines/reels, hooks and baits/lures are already available (mostly in the SE quarter of Bes Pelargic).

Here is some sample equipment:

//weighted fishing net
Strongly woven from hemp cord, this fishing net has dark lead weights around the edge.
Shaped like fat little fish, the weights are designed to make the net sink faster.

//large fishing net
When fully stretched, this net covers an impressively large area in a fine mesh of catgut.

//sharpened stick
A six foot stick of nice straight timber has been whittled into a sharp point at one end.
It practically emanates primal energy.

//barbed fishing spear
A fire hardened wooden shaft has been topped with a cruelly barbed steel head.  The barbs
ensure that whatever is stabbed, remains stabbed.

//double hook
This hook splits in the middle, ending in not one but two viciously barbed points, making it
twice as easy for a fish to become hooked.  It resembles a tiny (and extremely sharp) anchor.

//reel of heavy duty fishing line
This wooden reel has about a hundred yards of extra-strength catgut wrapped around it.  The
line should be able to handle even the biggest and strongest of fish.

//feathered lure
This intricate little lure has been decorated with brightly coloured feathers, making it spin
prettily through the water.  Why exactly fish are attracted to brightly coloured spinning
feathers isn't quite known.