From bcadead566b654e04fc457a24f5c14fcc023ea0d Mon Sep 17 00:00:00 2001 From: Jacquerel Date: Fri, 26 Aug 2022 04:13:36 +0100 Subject: [PATCH] Chasm Fishing (#69252) Adds the capability of fishing in chasms. Chasms contain Chasm Chrabs, which are cute little crustaceans you can eat or put in an aquarium. More importantly, chasms contain everything which has ever fallen into a chasm. Falling into a chasm is no longer instant permanent round removal... as long as someone is willing to do some fishing, which means your chances of return haven't necessarily increased that much. Potential rescuers (or people lamenting about how they dropped their necropolis chest into a hole) should also beware, chasm crabs are actually young Lobstrosities and there's a rare but not insubstantial chance that you'll fish one of them up instead, which won't make it very happy. If you somehow come back to life inside a chasm (generally only likely by being a changeling or some admin interference, but perhaps you have some kind of implant which does it) you'll climb back out again, so holes are no longer a way of disposing of a changeling for good. You think The Thing would be defeated if you threw it down a hole? Ethereals can't manage this because falling into a chasm causes too much damage and they simply smash on the way down. add: You can now fish in chasms, and might manage to catch things that careless miners have dropped in there. add: If your pole is long enough to reach into a deep hole, you might catch crabs. balance: Changelings can climb out of chasms if you throw them into one. imageadd: An icon of a nice little crab, who will grow up into something less nice. add: You can craft fishing equipment from various lavaland materials, so that Ashwalkers can fish up dead miners before you. add: You can sometimes find worms while digging up tiles, if appropriate for that material. --- code/__DEFINES/fishing.dm | 1 + code/datums/components/chasm.dm | 185 +++++++++++++------ code/datums/elements/diggable.dm | 7 +- code/game/turfs/open/asteroid.dm | 7 + code/game/turfs/open/floor/fancy_floor.dm | 7 +- code/modules/fishing/fish/chasm_detritus.dm | 46 +++++ code/modules/fishing/fish/fish_types.dm | 15 ++ code/modules/fishing/fishing_equipment.dm | 25 +++ code/modules/fishing/fishing_rod.dm | 14 ++ code/modules/fishing/sources/_fish_source.dm | 5 +- code/modules/fishing/sources/source_types.dm | 11 ++ icons/obj/aquarium.dmi | Bin 15572 -> 16101 bytes icons/obj/fishing.dmi | Bin 2855 -> 3236 bytes tgstation.dme | 1 + 14 files changed, 267 insertions(+), 57 deletions(-) create mode 100644 code/modules/fishing/fish/chasm_detritus.dm diff --git a/code/__DEFINES/fishing.dm b/code/__DEFINES/fishing.dm index 40b4d21a9e8..8b1917f47af 100644 --- a/code/__DEFINES/fishing.dm +++ b/code/__DEFINES/fishing.dm @@ -35,6 +35,7 @@ #define FISHING_SPOT_PRESET_BEACH "beach" #define FISHING_SPOT_PRESET_LAVALAND_LAVA "lavaland lava" +#define FISHING_SPOT_PRESET_CHASM "chasm" #define FISHING_MINIGAME_RULE_HEAVY_FISH "heavy" #define FISHING_MINIGAME_RULE_WEIGHTED_BAIT "weighted" diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm index b69988939b6..dc44e40e693 100644 --- a/code/datums/components/chasm.dm +++ b/code/datums/components/chasm.dm @@ -1,6 +1,10 @@ +/// List of weakrefs to containers for things which have fallen into chasms +GLOBAL_LIST_INIT(chasm_storage, list()) + // Used by /turf/open/chasm and subtypes to implement the "dropping" mechanic /datum/component/chasm var/turf/target_turf + var/obj/effect/abstract/chasm_storage/storage var/fall_message = "GAH! Ah... where are you?" var/oblivion_message = "You stumble and stare into the abyss before you. It stares back, and you fall into the enveloping dark." @@ -26,12 +30,33 @@ /obj/effect/dummy/phased_mob, /obj/effect/mapping_helpers, /obj/effect/wisp, + /obj/effect/ebeam, + /obj/effect/fishing_lure, )) /datum/component/chasm/Initialize(turf/target) RegisterSignal(parent, COMSIG_ATOM_ENTERED, .proc/Entered) target_turf = target START_PROCESSING(SSobj, src) // process on create, in case stuff is still there + src.parent.AddElement(/datum/element/lazy_fishing_spot, FISHING_SPOT_PRESET_CHASM) + +/datum/component/chasm/UnregisterFromParent() + STOP_PROCESSING(SSobj, src) + remove_storage() + +/** + * Deletes the chasm storage object and removes empty weakrefs from global list + */ +/datum/component/chasm/proc/remove_storage() + if (!storage) + return + QDEL_NULL(storage) + var/list/chasm_storage = list() + for (var/datum/weakref/ref as anything in GLOB.chasm_storage) + if (!ref.resolve()) + continue + chasm_storage += ref + GLOB.chasm_storage = chasm_storage /datum/component/chasm/proc/Entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) SIGNAL_HANDLER @@ -54,35 +79,36 @@ LAZYREMOVE(found_safeties, S) return LAZYLEN(found_safeties) -/datum/component/chasm/proc/drop_stuff(AM) +/datum/component/chasm/proc/drop_stuff(dropped_thing) if (is_safe()) return FALSE var/atom/parent = src.parent - var/to_check = AM ? list(AM) : parent.contents + var/to_check = dropped_thing ? list(dropped_thing) : parent.contents for (var/thing in to_check) if (droppable(thing)) . = TRUE INVOKE_ASYNC(src, .proc/drop, thing) -/datum/component/chasm/proc/droppable(atom/movable/AM) - var/datum/weakref/falling_ref = WEAKREF(AM) +/datum/component/chasm/proc/droppable(atom/movable/dropped_thing) + var/datum/weakref/falling_ref = WEAKREF(dropped_thing) // avoid an infinite loop, but allow falling a large distance if(falling_atoms[falling_ref] && falling_atoms[falling_ref] > 30) return FALSE - if(!isliving(AM) && !isobj(AM)) + if(!isliving(dropped_thing) && !isobj(dropped_thing)) return FALSE - if(is_type_in_typecache(AM, forbidden_types) || AM.throwing || (AM.movement_type & (FLOATING|FLYING))) + if(is_type_in_typecache(dropped_thing, forbidden_types) || dropped_thing.throwing || (dropped_thing.movement_type & (FLOATING|FLYING))) return FALSE + //Flies right over the chasm - if(ismob(AM)) - var/mob/M = AM + if(ismob(dropped_thing)) + var/mob/M = dropped_thing if(M.buckled) //middle statement to prevent infinite loops just in case! var/mob/buckled_to = M.buckled if((!ismob(M.buckled) || (buckled_to.buckled != M)) && !droppable(M.buckled)) return FALSE - if(ishuman(AM)) - var/mob/living/carbon/human/victim = AM + if(ishuman(dropped_thing)) + var/mob/living/carbon/human/victim = dropped_thing if(istype(victim.belt, /obj/item/wormhole_jaunter)) var/obj/item/wormhole_jaunter/jaunter = victim.belt var/turf/chasm = get_turf(victim) @@ -92,63 +118,118 @@ return fall_into_chasm return TRUE -/datum/component/chasm/proc/drop(atom/movable/AM) - var/datum/weakref/falling_ref = WEAKREF(AM) +/datum/component/chasm/proc/drop(atom/movable/dropped_thing) + var/datum/weakref/falling_ref = WEAKREF(dropped_thing) //Make sure the item is still there after our sleep - if(!AM || !falling_ref?.resolve()) + if(!dropped_thing || !falling_ref?.resolve()) falling_atoms -= falling_ref return falling_atoms[falling_ref] = (falling_atoms[falling_ref] || 0) + 1 var/turf/T = target_turf + var/atom/parent = src.parent if(T) // send to the turf below - AM.visible_message(span_boldwarning("[AM] falls into [parent]!"), span_userdanger("[fall_message]")) - T.visible_message(span_boldwarning("[AM] falls from above!")) - AM.forceMove(T) - if(isliving(AM)) - var/mob/living/L = AM + dropped_thing.visible_message(span_boldwarning("[dropped_thing] falls into [parent]!"), span_userdanger("[fall_message]")) + T.visible_message(span_boldwarning("[dropped_thing] falls from above!")) + dropped_thing.forceMove(T) + if(isliving(dropped_thing)) + var/mob/living/L = dropped_thing L.Paralyze(100) L.adjustBruteLoss(30) falling_atoms -= falling_ref + return - else - // send to oblivion - AM.visible_message(span_boldwarning("[AM] falls into [parent]!"), span_userdanger("[oblivion_message]")) - if (isliving(AM)) - var/mob/living/L = AM - L.notransform = TRUE - L.Paralyze(20 SECONDS) + // send to oblivion + dropped_thing.visible_message(span_boldwarning("[dropped_thing] falls into [parent]!"), span_userdanger("[oblivion_message]")) + if (isliving(dropped_thing)) + var/mob/living/falling_mob = dropped_thing + falling_mob.notransform = TRUE + falling_mob.Paralyze(20 SECONDS) - var/oldtransform = AM.transform - var/oldcolor = AM.color - var/oldalpha = AM.alpha - animate(AM, transform = matrix() - matrix(), alpha = 0, color = rgb(0, 0, 0), time = 10) - for(var/i in 1 to 5) - //Make sure the item is still there after our sleep - if(!AM || QDELETED(AM)) - return - AM.pixel_y-- - sleep(2) + var/oldtransform = dropped_thing.transform + var/oldcolor = dropped_thing.color + var/oldalpha = dropped_thing.alpha + animate(dropped_thing, transform = matrix() - matrix(), alpha = 0, color = rgb(0, 0, 0), time = 10) + for(var/i in 1 to 5) //Make sure the item is still there after our sleep - if(!AM || QDELETED(AM)) + if(!dropped_thing || QDELETED(dropped_thing)) return + dropped_thing.pixel_y-- + sleep(2) - if(iscyborg(AM)) - var/mob/living/silicon/robot/S = AM - qdel(S.mmi) - if(isliving(AM)) - var/mob/living/L = AM - if(L.stat != DEAD) - L.death(TRUE) + //Make sure the item is still there after our sleep + if(!dropped_thing || QDELETED(dropped_thing)) + return - falling_atoms -= falling_ref - qdel(AM) - if(AM && !QDELETED(AM)) //It's indestructible - var/atom/parent = src.parent - parent.visible_message(span_boldwarning("[parent] spits out [AM]!")) - AM.alpha = oldalpha - AM.color = oldcolor - AM.transform = oldtransform - AM.throw_at(get_edge_target_turf(parent,pick(GLOB.alldirs)),rand(1, 10),rand(1, 10)) + if (!storage) + storage = new(get_turf(parent)) + RegisterSignal(storage, COMSIG_ATOM_EXITED, .proc/left_chasm) + GLOB.chasm_storage += WEAKREF(storage) + + if (storage.contains(dropped_thing)) + return + + dropped_thing.alpha = oldalpha + dropped_thing.color = oldcolor + dropped_thing.transform = oldtransform + + if (dropped_thing.forceMove(storage)) + if (isliving(dropped_thing)) + RegisterSignal(dropped_thing, COMSIG_LIVING_REVIVE, .proc/on_revive) + SEND_SIGNAL(dropped_thing, COMSIG_MOVABLE_SECLUDED_LOCATION) + else + parent.visible_message(span_boldwarning("[parent] spits out [dropped_thing]!")) + dropped_thing.throw_at(get_edge_target_turf(parent, pick(GLOB.alldirs)), rand(1, 10), rand(1, 10)) + + if (isliving(dropped_thing)) + var/mob/living/fallen_mob = dropped_thing + if(fallen_mob.stat != DEAD) + fallen_mob.death(TRUE) + fallen_mob.notransform = FALSE + fallen_mob.apply_damage(300) + + falling_atoms -= falling_ref + +/** + * Called when something has left the chasm depths storage. + * Arguments + * + * * source - Chasm object holder. + * * gone - Item which has just left the chasm contents. + */ +/datum/component/chasm/proc/left_chasm(atom/source, atom/movable/gone) + SIGNAL_HANDLER + UnregisterSignal(gone, COMSIG_LIVING_REVIVE) + +#define CHASM_TRAIT "chasm trait" + +/** + * Called if something comes back to life inside the pit. Expected sources are badmins and changelings. + * Ethereals should take enough damage to be smashed and not revive. + * + * Arguments + * * escapee - Lucky guy who just came back to life at the bottom of a hole. + */ +/datum/component/chasm/proc/on_revive(mob/living/escapee) + SIGNAL_HANDLER + var/atom/parent = src.parent + parent.visible_message(span_boldwarning("After a long climb, [escapee] leaps out of [parent]!")) + ADD_TRAIT(escapee, TRAIT_MOVE_FLYING, CHASM_TRAIT) //Otherwise they instantly fall back in + escapee.forceMove(get_turf(parent)) + escapee.throw_at(get_edge_target_turf(parent, pick(GLOB.alldirs)), rand(1, 10), rand(1, 10)) + REMOVE_TRAIT(escapee, TRAIT_MOVE_FLYING, CHASM_TRAIT) + escapee.Paralyze(20 SECONDS, TRUE) + UnregisterSignal(escapee, COMSIG_LIVING_REVIVE) + +#undef CHASM_TRAIT + +/** + * An abstract object which is basically just a bag that the chasm puts people inside + */ +/obj/effect/abstract/chasm_storage + name = "chasm depths" + desc = "The bottom of a hole. You shouldn't be able to interact with this." + anchored = TRUE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT diff --git a/code/datums/elements/diggable.dm b/code/datums/elements/diggable.dm index e57b24fd250..d5a4811e005 100644 --- a/code/datums/elements/diggable.dm +++ b/code/datums/elements/diggable.dm @@ -10,8 +10,10 @@ var/action_text /// What should we tell other people what the user did? (Eg: "Guy digs up the turf.") var/action_text_third_person + /// Percentage chance of receiving a bonus worm + var/worm_chance -/datum/element/diggable/Attach(datum/target, to_spawn, amount = 1, action_text = "dig up", action_text_third_person = "digs up") +/datum/element/diggable/Attach(datum/target, to_spawn, amount = 1, worm_chance = 30, action_text = "dig up", action_text_third_person = "digs up") . = ..() if(!isturf(target)) return ELEMENT_INCOMPATIBLE @@ -21,6 +23,7 @@ src.to_spawn = to_spawn src.amount = amount + src.worm_chance = worm_chance src.action_text = action_text src.action_text_third_person = action_text_third_person @@ -36,6 +39,8 @@ for(var/i in 1 to amount) new to_spawn(source) + if (prob(worm_chance)) + new /obj/item/food/bait/worm(source) user.visible_message( span_notice("[user] [action_text_third_person] [source]."), diff --git a/code/game/turfs/open/asteroid.dm b/code/game/turfs/open/asteroid.dm index fdf21c7a293..5c5a357673f 100644 --- a/code/game/turfs/open/asteroid.dm +++ b/code/game/turfs/open/asteroid.dm @@ -24,6 +24,8 @@ var/dug = FALSE /// Icon state to use when broken var/broken_state = "asteroid_dug" + /// Percentage chance of receiving a bonus worm + var/worm_chance = 30 /turf/open/misc/asteroid/break_tile() icon_state = broken_state @@ -39,6 +41,8 @@ /turf/open/misc/asteroid/proc/getDug() dug = TRUE new digResult(src, 5) + if (prob(worm_chance)) + new /obj/item/food/bait/worm(src) icon_state = "[base_icon_state]_dug" /// If the user can dig the turf @@ -124,6 +128,7 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) /turf/open/misc/asteroid/basalt/airless initial_gas_mix = AIRLESS_ATMOS + worm_chance = 0 /turf/open/misc/asteroid/basalt/Initialize(mapload) . = ..() @@ -152,6 +157,7 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) initial_gas_mix = AIRLESS_ATMOS baseturfs = /turf/open/misc/asteroid/airless turf_type = /turf/open/misc/asteroid/airless + worm_chance = 0 /turf/open/misc/asteroid/snow gender = PLURAL @@ -217,6 +223,7 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) /turf/open/misc/asteroid/snow/airless initial_gas_mix = AIRLESS_ATMOS + worm_chance = 0 /turf/open/misc/asteroid/snow/temperatre initial_gas_mix = "o2=22;n2=82;TEMP=255.37" diff --git a/code/game/turfs/open/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm index 8c8aac4bee0..5a9224433cf 100644 --- a/code/game/turfs/open/floor/fancy_floor.dm +++ b/code/game/turfs/open/floor/fancy_floor.dm @@ -132,7 +132,8 @@ /turf/open/floor/grass/Initialize(mapload) . = ..() spawniconchange() - AddElement(/datum/element/diggable, /obj/item/stack/ore/glass, 2, "uproot", "uproots") + AddElement(/datum/element/diggable, /obj/item/stack/ore/glass, 2, worm_chance = 50, \ + action_text = "uproot", action_text_third_person = "uproots") /turf/open/floor/grass/proc/spawniconchange() icon_state = "grass[rand(0,3)]" @@ -170,7 +171,7 @@ /turf/open/floor/fake_snow/Initialize(mapload) . = ..() - AddElement(/datum/element/diggable, /obj/item/stack/tile/mineral/snow, 2) + AddElement(/datum/element/diggable, /obj/item/stack/tile/mineral/snow, 2, worm_chance = 0) /turf/open/floor/fake_snow/setup_broken_states() return list("snow_dug") @@ -197,7 +198,7 @@ /turf/open/floor/fakebasalt/Initialize(mapload) . = ..() - AddElement(/datum/element/diggable, /obj/item/stack/ore/glass/basalt, 2) + AddElement(/datum/element/diggable, /obj/item/stack/ore/glass/basalt, 2, worm_chance = 0) if(prob(15)) icon_state = "basalt[rand(0, 12)]" set_basalt_light(src) diff --git a/code/modules/fishing/fish/chasm_detritus.dm b/code/modules/fishing/fish/chasm_detritus.dm new file mode 100644 index 00000000000..a20ab5c42df --- /dev/null +++ b/code/modules/fishing/fish/chasm_detritus.dm @@ -0,0 +1,46 @@ +/// An object which should replace itself on initialisation with something which fell into a chasm. +/obj/item/chasm_detritus + name = "chasm detritus" + desc = "Abstract concept of an object which once fell into a deep hole." + icon_state = "skub" + /// Stuff which you can always fish up even if nothing fell into a hole. + var/static/list/default_contents = list(\ + /obj/item/stack/ore/slag = 2, \ + /obj/item/stack/sheet/bone = 3, \ + /obj/effect/mob_spawn/corpse/human/skeleton = 1, \ + /mob/living/simple_animal/hostile/asteroid/lobstrosity/lava = 1, \ + ) + +/obj/item/chasm_detritus/Initialize(mapload) + . = ..() + if (prob(25)) + create_default_object() + return + + var/list/chasm_stuff = find_chasm_contents() + if (!chasm_stuff.len) + create_default_object() + return + + var/atom/movable/detritus = pick(chasm_stuff) + detritus.forceMove(get_turf(src)) + qdel(src) + +/// Instantiates something from the default list. +/obj/item/chasm_detritus/proc/create_default_object() + var/contents_type = pick(default_contents) + new contents_type(get_turf(src)) + qdel(src) + +/// Returns a list of every object which is currently inside of a chasm. +/obj/item/chasm_detritus/proc/find_chasm_contents() + var/list/chasm_contents = list() + if (!GLOB.chasm_storage.len) + return chasm_contents + + var/list/chasm_storage_resolved = recursive_list_resolve(GLOB.chasm_storage) + for (var/obj/storage as anything in chasm_storage_resolved) + for (var/thing as anything in storage.contents) + chasm_contents += thing + + return chasm_contents diff --git a/code/modules/fishing/fish/fish_types.dm b/code/modules/fishing/fish/fish_types.dm index f6e99c73586..c96ff4221ba 100644 --- a/code/modules/fishing/fish/fish_types.dm +++ b/code/modules/fishing/fish/fish_types.dm @@ -181,6 +181,21 @@ fillet_type = /obj/item/food/fishmeat/armorfish fish_ai_type = FISH_AI_SLOW +//Chasm fish +/obj/item/fish/chasm_crab + name = "chasm chrab" + desc = "The young of the lobstrosity mature in pools below the earth, eating what falls in until large enough to clamber out. Those found near the station are well-fed." + icon_state = "chrab" + dedicated_in_aquarium_icon_state = "chrab_small" + sprite_height = 9 + sprite_width = 8 + source_height = 9 + source_width = 8 + stable_population = 4 + feeding_frequency = 15 MINUTES + random_case_rarity = FISH_RARITY_RARE + fillet_type = /obj/item/food/meat/slab/rawcrab + /obj/item/storage/box/fish_debug name = "box full of fish" diff --git a/code/modules/fishing/fishing_equipment.dm b/code/modules/fishing/fishing_equipment.dm index 84281601a12..385936e712e 100644 --- a/code/modules/fishing/fishing_equipment.dm +++ b/code/modules/fishing/fishing_equipment.dm @@ -30,6 +30,20 @@ fishing_line_traits = FISHING_LINE_BOUNCY line_color = "#99313f" +/obj/item/fishing_line/sinew + name = "fishing sinew" + desc = "an all-natural fishing line made of stretched out sinew" + icon = 'icons/obj/fishing.dmi' + icon_state = "reel_sinew" + line_color = "#d1cca3" + +/datum/crafting_recipe/sinew_line + name = "Sinew Fishing Line Reel" + result = /obj/item/fishing_line/sinew + reqs = list(/obj/item/stack/sheet/sinew = 2) + time = 2 SECONDS + category = CAT_PRIMAL + // Hooks /obj/item/fishing_hook @@ -62,6 +76,17 @@ fishing_hook_traits = FISHING_HOOK_WEIGHTED rod_overlay_icon_state = "hook_weighted_overlay" +/obj/item/fishing_hook/bone + name = "bone hook" + desc = "a simple hook carved from sharpened bone" + icon_state = "hook_bone" + +/datum/crafting_recipe/bone_hook + name = "Goliath Bone Hook" + result = /obj/item/fishing_hook/bone + reqs = list(/obj/item/stack/sheet/bone = 1) + time = 2 SECONDS + category = CAT_PRIMAL /obj/item/storage/toolbox/fishing name = "fishing toolbox" diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index 90d84a28467..d9900243ef7 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -362,6 +362,20 @@ if(gone == hook) hook = null +/obj/item/fishing_rod/bone + name = "bone fishing rod" + desc = "A humble rod, made with whatever happened to be on hand." + icon_state = "fishing_rod_bone" + +/datum/crafting_recipe/bone_rod + name = "Bone Fishing Rod" + result = /obj/item/fishing_rod/bone + time = 5 SECONDS + reqs = list(/obj/item/stack/sheet/leather = 1, + /obj/item/stack/sheet/sinew = 2, + /obj/item/stack/sheet/bone = 2) + category = CAT_PRIMAL + /obj/item/fishing_rod/master name = "master fishing rod" desc = "The mythical rod of a lost fisher king. Said to be imbued with un-paralleled fishing power. There's writing on the back of the pole. \"中国航天制造\"" diff --git a/code/modules/fishing/sources/_fish_source.dm b/code/modules/fishing/sources/_fish_source.dm index f27d4aed837..4e6d708c3a3 100644 --- a/code/modules/fishing/sources/_fish_source.dm +++ b/code/modules/fishing/sources/_fish_source.dm @@ -11,6 +11,9 @@ GLOBAL_LIST_INIT(preset_fish_sources,init_fishing_configurations()) var/datum/fish_source/lavaland/lava_preset = new .[FISHING_SPOT_PRESET_LAVALAND_LAVA] = lava_preset + var/datum/fish_source/chasm/chasm_preset = new + .[FISHING_SPOT_PRESET_CHASM] = chasm_preset + /// Where the fish actually come from - every fishing spot has one assigned but multiple fishing holes can share single source, ie single shared one for ocean/lavaland river /datum/fish_source /// Fish catch weight table - these are relative weights @@ -87,7 +90,7 @@ GLOBAL_LIST_INIT(preset_fish_sources,init_fishing_configurations()) reward_path = FISHING_DUD //Ran out of these since rolling (multiple fishermen on same source most likely) if(ispath(reward_path)) if(ispath(reward_path,/obj/item)) - var/obj/item/reward = new reward_path + var/obj/item/reward = new reward_path(get_turf(fisherman)) if(ispath(reward_path,/obj/item/fish)) var/obj/item/fish/caught_fish = reward caught_fish.randomize_weight_and_size() diff --git a/code/modules/fishing/sources/source_types.dm b/code/modules/fishing/sources/source_types.dm index 9b626de6956..d3a499d5ebd 100644 --- a/code/modules/fishing/sources/source_types.dm +++ b/code/modules/fishing/sources/source_types.dm @@ -21,6 +21,17 @@ ) catalog_description = "Fish dimension (Fishing portal generator)" +/datum/fish_source/chasm + catalog_description = "Chasm depths" + background = "fishing_background_lavaland" + fish_table = list( + FISHING_DUD = 5, + /obj/item/fish/chasm_crab = 15, + /obj/item/chasm_detritus = 30, + ) + + fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 5 + /datum/fish_source/lavaland catalog_description = "Lava vents" background = "fishing_background_lavaland" diff --git a/icons/obj/aquarium.dmi b/icons/obj/aquarium.dmi index fcb2c96bf58862c581f0089d5e3ee3ae197fa044..6927ca8104e15daa3dcb70414c9f49112f043ac3 100644 GIT binary patch literal 16101 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 literal 15572 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 Z(~S-~mVCHXgZx_=kdaiBs1P&q{~!E*{M7&e diff --git a/icons/obj/fishing.dmi b/icons/obj/fishing.dmi index 13b2409ed28fffb9400c35f3cf82bcdba027f854..dee9f7a5c29b80179a14e255c2e053642cfcd378 100644 GIT binary patch delta 2931 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 du_ZhKf55=N2MjBLhKvd(4Ga}Y5kD59 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