Files
Bubberstation/code/datums/embed_data.dm
carlarctg 4d84d0de9b Rift Fishing (#88619)
## About The Pull Request

Adds rift fishing to the game.


![image](https://github.com/user-attachments/assets/044304ca-e7a0-45e9-baaf-b445328d3982)

Drained and undrained influences can be fished in, the latter only by
heretics. Fishing in an undrained influence shows a bobber floating over
nothing to other people, so don't be stupid!

The loot pool includes the following:

- Knowledge. Great for heretics, bad for crew. Only actually gives
knowledge if fished up in an unopened rift, opening it.
One of each heretic potion type.
- A wild Fire Shark, hostile to all.
- One of each heretic potion, and two flasks of eldritch essence.
- Several new fish:

![image](https://github.com/user-attachments/assets/259bd1ee-3b1e-47db-bcfd-c23b7908f66f)
In order:
1. Chrystarfish
Cosmostarfishe that snuck into the bluespace compartment of a shuttle
engine. Teleports around when eaten. Can be cut into bluespace crystals.
Very pointy.
2. Flumpulus
Probably not an actual fish. Contains flumpuline, which is in many ways
an upgrade to oculine. Except for it occasionally popping your eyes out
and replacing them with fungus. It also gets flattened if you land on
it, cushioning your fall.

![image](https://github.com/user-attachments/assets/02b398b0-22ac-4002-a828-cb73281ecef6)

3. Gullion
This fish can be cut into two diamonds, and needs no mate to reproduce,
making it an excellent way to replenish the station's diamond supply!
However, it needs silicon in the fish tank to survive.
4. Walro-Dolphish
Weird, amphibious creature. Amazing weapon - high damage, strong
piercing wounds, decent block chances. However, it will bite you if you
hold it for too long, so be careful!

More fish are planned to be added. The PR was split in two to reduce
review complexity as the latter half of the fish were increasingly
convoluted.

Any fishing rod will do for fishing, but heretics are now able to infuse
their fishing rod with a grasp:

![image](https://github.com/user-attachments/assets/37cfb7da-9269-4db7-b05f-4bbf4a6957f2)

Infusing the rod will temporarily improve its fishing modifier and give
it a unique trait that lets heretics gather 2 influence, rather than 1,
from a fished-up rift.

If crew fish up a glimpse of the Mansus, they will recieve the same
effects as if they examined the rift, and a curse hand will shoot out at
them.

influences cannot be bombed for fish.
## Why It's Good For The Game

Rifts are _extremely_ close to basically just being eldritch pools of
liquid that some heretic spilled over the station. It's always stuck out
like a sore thumb that we can't fish in them, but now we _can_. (Also,
someone needs to PR fishing in a bucket for clowns and mimes.)

Fishing in a rift is just one of those things you see some random,
innocent assistant do while doing an errand, passively enhancing the
round with the sheer ridiculousness of it. Coming back, it's likely
you'll see them running from a wild Fire Shark they unwisely dug up from
messing with eldritch influences.

For Heretics, this is for the most part actively a worse alternative
than just doing things normally. But sometimes you don't want to be
optimal. Infusing their fishing rod is almost entirely an amusing twist
on the blade infusion that blade path has, and they can even infuse
other people's rods - make fish not war.

Ghommie gave me the fish sprites, and I interpreted them the silliest
and most interesting ways I could think of.
> Chrystarfish

Bluespace's technobabble has finally reached fish. Much like the
Gullion, the intention here was primarily some additional, risky way to
procure some amount of bluespace crystals and dust that doesn't depend
on Mining to do their job, either for the station or for your own stupid
plans. (Obviously mining is still the best way to get it, but it's not
healthy for the game for them to be the ONLY way to do so!)

>Flumpulus


![image](https://static.wikia.nocookie.net/oots/images/3/38/OOTS0074.jpeg/revision/latest?cb=20150609013601)

Imagine taking a pill of 'Super oculine!' and suddenly your eyes pop out
and are replaced with fungeyes. 10/10

>Gullion

Diamonds are extremely scarce on the station and the only way to get
more is by mining. I thought adding some rare, restricted way of getting
more would be fun for the game, and encourage fish breeding.
Parthenogenesis may be a bit much admittedly, but let's just see what
happens

> Walro-Dolphish

The name for this thing kinda sucks. I like the idea of an amphibious
fish-weapon like the pikes that actually kinda just hates being wielded
around like a stick. It's also piercing to differentiate.


![image](https://github.com/user-attachments/assets/a1cb58fb-af16-4f9c-9675-aaaa15172674)
## Changelog
🆑
Carlarc, Ghommie
add: Adds rift fishing to the game. Includes new wacky fish!
add: Drained and undrained influences can be fished in, the latter only
by heretics. Fishing in an undrained influence shows a bobber floating
over nothing to other people, so don't be stupid!
add: influences cannot be bombed for fish.
add: Heretics can now infuse their fishing rod, and fish for knowledge.
/🆑

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2024-12-27 11:25:12 +00:00

59 lines
3.1 KiB
Plaintext

/// Assosciative list of type -> embed data.
GLOBAL_LIST_INIT(embed_by_type, generate_embed_type_cache())
/proc/generate_embed_type_cache()
var/list/embed_cache = list()
for(var/datum/embed_data/embed_type as anything in subtypesof(/datum/embed_data))
var/datum/embed_data/embed = new embed_type
embed_cache[embed_type] = embed
return embed_cache
/proc/get_embed_by_type(embed_type)
var/datum/embed_data/embed = GLOB.embed_by_type[embed_type]
if(embed)
return embed
CRASH("Attempted to get an embed type that did not exist! '[embed_type]'")
/datum/embed_data
/// Chance for an object to embed into somebody when thrown
var/embed_chance = 45
/// Chance for embedded object to fall out (causing pain but removing the object)
var/fall_chance = 5
/// Chance for embedded objects to cause pain (damage user)
var/pain_chance = 15
/// Coefficient of multiplication for the damage the item does while embedded (this*item.w_class)
var/pain_mult = 2
/// Coefficient of multiplication for the damage the item does when it first embeds (this*item.w_class)
var/impact_pain_mult = 4
/// Coefficient of multiplication for the damage the item does when it falls out or is removed without a surgery (this*item.w_class)
var/remove_pain_mult = 6
/// Time in ticks, total removal time = (this*item.w_class)
var/rip_time = 30
/// If this should ignore throw speed threshold of 4
var/ignore_throwspeed_threshold = FALSE
/// Chance for embedded objects to cause pain every time they move (jostle)
var/jostle_chance = 5
/// Coefficient of multiplication for the damage the item does while
var/jostle_pain_mult = 1
/// Call this proc on jostling, if it exists!
var/datum/callback/jostle_callback
/// This percentage of all pain will be dealt as stam damage rather than brute (0-1)
var/pain_stam_pct = 0
/datum/embed_data/proc/generate_with_values(embed_chance, fall_chance, pain_chance, pain_mult, impact_pain_mult, remove_pain_mult, rip_time, ignore_throwspeed_threshold, jostle_chance, jostle_pain_mult, pain_stam_pct, force_new = FALSE)
var/datum/embed_data/data = isnull(GLOB.embed_by_type[type]) && !force_new ? src : new()
data.embed_chance = !isnull(embed_chance) ? embed_chance : src.embed_chance
data.fall_chance = !isnull(fall_chance) ? fall_chance : src.fall_chance
data.pain_chance = !isnull(pain_chance) ? pain_chance : src.pain_chance
data.pain_mult = !isnull(pain_mult) ? pain_mult : src.pain_mult
data.impact_pain_mult = !isnull(impact_pain_mult) ? impact_pain_mult : src.impact_pain_mult
data.remove_pain_mult = !isnull(remove_pain_mult) ? remove_pain_mult : src.remove_pain_mult
data.rip_time = !isnull(rip_time) ? rip_time : src.rip_time
data.ignore_throwspeed_threshold = !isnull(ignore_throwspeed_threshold) ? ignore_throwspeed_threshold : src.ignore_throwspeed_threshold
data.jostle_chance = !isnull(jostle_chance) ? jostle_chance : src.jostle_chance
data.jostle_pain_mult = !isnull(jostle_pain_mult) ? jostle_pain_mult : src.jostle_pain_mult
data.jostle_callback = !isnull(jostle_callback) ? jostle_callback : src.jostle_callback
data.pain_stam_pct = !isnull(pain_stam_pct) ? pain_stam_pct : src.pain_stam_pct
return data