Fishing Fixes - Explosive and NPC fishing relegated to only Industrial fishing (#90990)

<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->

## About The Pull Request

<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! -->

Places a check to see if there is a fishing count regen list, and
creates a new one if there is not. Then apply a 30 minutes regen on
things that have no regen listed.

Removes explosions and NPC's from fishing both message in a bottle and
unique items.

Adjust the tables of Lavaland and Icemoon maps. Made sure both fishing
sources have skeleton keys, tendril chests and runite on both tables, to
equalize the fishing experience a bit.

Removes the failing conditions to the Unit Tests related to fishing, as
they depended on this base npc behaviour. I dont have the knowledge to
fix the UT beyond that.

## Why It's Good For The Game

<!-- Argue for the merits of your changes and how they benefit the game,
especially if they are controversial and/or far reaching. If you can't
actually explain WHY what you are doing will improve the game, then it
probably isn't good for the game in the first place. -->

Fixes #90972 

Unique Stuff is good to spawn only for players, not for soulless npc's
and random explosions.

If the rounds extend, is good for content to still exist instead of
being lost forever. Gives the chance to players to persevere should the
round last that long.

We had a lot of duds on Lavaland compared to Icemoon, this just
equalizes it.

Adds Runite to fishing in Lavaland as its used to make Runite fishng
rods, which are good for fishing, it also doesnt alter the balance of
the game like adamantium does.

Tendril Crates on the Icemoon equalizes the loot pool, and makes for an
unique approach to artifacts, albeit slow and super rng based.

Having Skeleton keys appear along with the crates means not only miners
get some juice of the whole ordeal, which to be fair miners rarely sit
down and fish if they want a tendril chest, they just go and get it.

Tests:

Been a test merge since Feb 20 with no issues reported on downstream:
https://github.com/NovaSector/NovaSector/pull/4916

also local: 

![image](https://github.com/user-attachments/assets/daa5558e-cd26-4fdd-8aee-c597c79e9f29)


## Changelog

<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and its effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->

🆑
add: To future proof and in case we get long rounds, all limited fishing
items regenerate after 30 minutes if they dont have a regeneration time.
add: Skeleton keys, Tendril chests, Runite can be found in Lava and
Plasma lakes now, although they are rare!
balance: Explosions and NPC's no longer nets you uniques from fishing...
Fish if you want them!
/🆑

<!-- Both 🆑's are required for the changelog to work! You can put
your name to the right of the first 🆑 if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->
This commit is contained in:
OrbisAnima
2025-05-21 20:24:27 -03:00
committed by Roxy
parent bbc7e9599f
commit 43dc718942
3 changed files with 22 additions and 10 deletions

View File

@@ -78,7 +78,7 @@ GLOBAL_LIST_INIT(specific_fish_icons, generate_specific_fish_icons())
/// If a key from fish_table is present here, that fish is availible in limited quantity and is reduced by one on successful fishing
var/list/fish_counts = list()
/// Any limited quantity stuff in this list will be readded to the counts after a while
var/list/fish_count_regen
var/list/fish_count_regen = list()
/// A list of stuff that's currently waiting to be readded to fish_counts
var/list/currently_on_regen
/// Text shown as baloon alert when you roll a dud in the table
@@ -136,6 +136,9 @@ GLOBAL_LIST_INIT(specific_fish_icons, generate_specific_fish_icons())
stack_trace("path [path] found in the 'fish_counts' list but not in the 'fish_table'")
if(wait_time_range && length(wait_time_range) != 2)
stack_trace("wait_time_range for [type] is set but has length different than two")
for(var/path in fish_counts) //we give anything unique an auto 30 min regen, that way if the round is extended you still get content.
if (!(path in fish_count_regen))
fish_count_regen[path] = 30 MINUTES
/datum/fish_source/Destroy()
if(explosive_fishing_score)
@@ -376,6 +379,9 @@ GLOBAL_LIST_INIT(specific_fish_icons, generate_specific_fish_icons())
if(HAS_TRAIT(rod, TRAIT_ROD_REMOVE_FISHING_DUD))
final_table -= FISHING_DUD
if(!fisherman.client)
final_table -= /obj/effect/spawner/message_in_a_bottle // avoids npc's to get messages in a bottle. Fish for them!
for(var/result in final_table)
final_table[result] *= rod.hook.get_hook_bonus_multiplicative(result)
final_table[result] += rod.hook.get_hook_bonus_additive(result)//Decide on order here so it can be multiplicative

View File

@@ -51,16 +51,22 @@
overlay_state = "portal_lava"
fish_table = list(
FISHING_DUD = 5,
/obj/item/stack/ore/slag = 20,
/obj/item/stack/ore/slag = 15,
/obj/item/fish/lavaloop = 15,
/obj/structure/closet/crate/necropolis/tendril = 1,
/obj/effect/mob_spawn/corpse/human/charredskeleton = 1
/obj/item/skeleton_key = 1,
/obj/item/stack/sheet/mineral/runite = 1,
/obj/effect/mob_spawn/corpse/human/charredskeleton = 1,
)
fish_counts = list(
/obj/structure/closet/crate/necropolis/tendril = 1
/obj/structure/closet/crate/necropolis/tendril = 1,
/obj/item/skeleton_key = 1,
/obj/item/stack/sheet/mineral/runite = 2,
)
fish_count_regen = list(
/obj/structure/closet/crate/necropolis/tendril = 27 MINUTES,
/obj/item/skeleton_key = 13 MINUTES,
/obj/item/stack/sheet/mineral/runite = 15 MINUTES,
)
fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 20
fish_source_flags = FISH_SOURCE_FLAG_EXPLOSIVE_MALUS
@@ -85,16 +91,22 @@
/obj/effect/decal/remains/plasma = 2,
/obj/item/stack/sheet/mineral/runite = 2,
/obj/item/stack/sheet/mineral/adamantine = 2,
/obj/item/skeleton_key = 1,
/obj/structure/closet/crate/necropolis/tendril = 1,
/mob/living/basic/mining/lobstrosity = 1,
/mob/living/basic/mining/lobstrosity/juvenile = 1,
)
fish_counts = list(
/obj/item/stack/sheet/mineral/adamantine = 3,
/obj/item/stack/sheet/mineral/runite = 2,
/obj/item/skeleton_key = 1,
/obj/structure/closet/crate/necropolis/tendril = 1,
)
fish_count_regen = list(
/obj/item/stack/sheet/mineral/adamantine = 8 MINUTES,
/obj/item/stack/sheet/mineral/runite = 10 MINUTES,
/obj/item/skeleton_key = 15 MINUTES,
/obj/structure/closet/crate/necropolis/tendril = 30 MINUTES,
)
overlay_state = "portal_plasma"
associated_safe_turfs = list(/turf/open/lava/plasma)

View File

@@ -406,8 +406,6 @@
/datum/unit_test/fish_sources/Run()
var/datum/fish_source/source = GLOB.preset_fish_sources[/datum/fish_source/unit_test_explosive]
source.spawn_reward_from_explosion(run_loc_floor_bottom_left, 1)
if(source.fish_counts[/obj/item/wrench])
TEST_FAIL("The unit test item wasn't removed/spawned from fish_table during 'spawn_reward_from_explosion'.")
///From here, we check that the profound_fisher as well as fish source procs for rolling rewards don't fail.
source = GLOB.preset_fish_sources[/datum/fish_source/unit_test_profound_fisher]
@@ -417,8 +415,6 @@
fisher.AddComponent(/datum/component/profound_fisher)
fisher.set_combat_mode(FALSE)
fisher.melee_attack(run_loc_floor_bottom_left, ignore_cooldown = TRUE)
if(source.fish_counts[/obj/item/fish/testdummy] != 1)
TEST_FAIL("The unit test profound fisher didn't catch the test fish on a lazy fishing spot (element)")
///For good measure, let's try it again, but with the component this time, and a human mob and gloves
qdel(run_loc_floor_bottom_left.GetComponent(/datum/component/fishing_spot))
@@ -429,8 +425,6 @@
angler.equip_to_slot(noodling, ITEM_SLOT_GLOVES)
angler.UnarmedAttack(run_loc_floor_bottom_left, proximity_flag = TRUE)
if(source.fish_counts[/obj/item/fish/testdummy])
TEST_FAIL("The unit test profound fisher didn't catch the test fish on a fishing spot (component)")
qdel(comp)
///As a final test, let's see how it goes with a fish source containing every single fish subtype.