From 3f95ebbd5eb56d6af32cb293e93d2a52129d82e7 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 17 Jun 2022 01:30:40 +0200 Subject: [PATCH] [MIRROR] Fishing, Version 1 [MDB IGNORE] (#14370) * Fishing, Version 1 (#67691) Adds fishing and fishing minigame. You use fishing rod to fish. Equipping specific bait/hook/reels will affect your success chances. You can fish out fish,items and other things. Fishing Equipment Fishing rods have three slots: Bait, Reel and Hook. Any food can be used as bait but dedicated bait makes fishing easier. You can buy hook and line sets New bait types: Worms : Buy can of them at cargo (alternative acquirement method pending) Doughballs : Use knife on flat piece of dough to get five of them. Fishing rod types: Basic : Print these at the lathe, nothing fancy here. Tech: Experimental tech. Provides infinite bait Fishing rods can also hook and reel normal items. Equipment screen and reeling video Fishing spots Keep in mind this PR is meant to add the basic systems and i intend to fill these with more fish in future PR's so wait with suggestions until then. Lavaland lava (no fish here right now, just other stuff), requires reinforced line to fish in. Maintenance moisture traps. Beach away mission water. Fishing portal available for purchase from cargo - This is stopgap until we fill more spots. Difficulty depends on fishing spot, fish type, and the fish traits and rod setup combinations. All fish types can have specific traits, most common ones being favourite and disliked bait types/categories. Other Fishing catalog now lists fishing related info New admin debug verb, fishing calculator that show probabilities with different setups so it's easier to balance this. Fish now have average weight and size. Make sure to boast if you catch a big one. Adds tgui mouse passthrough Screens Sprites: Fishing portal sprite by @ ArcaneMusic Other sprites by @ Mey-Ha-Zah Bad ones by me. (Could still use better fishing minigame backgrounds) Sounds: https://freesound.org/people/soundscalpel.com/sounds/110393/ https://freesound.org/people/soundslikewillem/sounds/343748/ * Fishing, Version 1 Co-authored-by: AnturK --- code/__DEFINES/dcs/signals/signals_beam.dm | 3 + code/__DEFINES/dcs/signals/signals_fish.dm | 12 + code/__DEFINES/fishing.dm | 41 ++ code/__DEFINES/food.dm | 23 + code/__DEFINES/traits.dm | 3 + code/__HELPERS/maths.dm | 20 +- code/_globalvars/lists/maintenance_loot.dm | 1 + code/datums/beam.dm | 58 ++- code/datums/components/fishing_spot.dm | 62 +++ code/datums/elements/lazy_fishing_spot.dm | 25 + .../mood_events/generic_positive_events.dm | 5 + code/game/objects/items/food/_food.dm | 1 + code/game/objects/items/food/bait.dm | 47 ++ code/game/objects/items/food/dough.dm | 3 + code/game/objects/structures/maintenance.dm | 8 +- code/game/turfs/open/lava.dm | 4 + code/game/turfs/open/water.dm | 4 + code/modules/admin/admin_verbs.dm | 1 + code/modules/aquarium/aquarium_behaviour.dm | 19 - code/modules/asset_cache/assets/fish.dm | 7 + code/modules/cargo/goodies.dm | 24 + code/modules/cargo/packs.dm | 8 + code/modules/fishing/admin.dm | 75 +++ .../{ => fishing}/aquarium/aquarium.dm | 0 .../{ => fishing}/aquarium/aquarium_kit.dm | 52 -- code/modules/fishing/bait.dm | 35 ++ .../fish.dm => fishing/fish/_fish.dm} | 255 ++------- code/modules/fishing/fish/fish_types.dm | 242 +++++++++ code/modules/fishing/fish_catalog.dm | 109 ++++ code/modules/fishing/fishing_equipment.dm | 102 ++++ code/modules/fishing/fishing_minigame.dm | 215 ++++++++ .../modules/fishing/fishing_portal_machine.dm | 48 ++ code/modules/fishing/fishing_rod.dm | 484 ++++++++++++++++++ code/modules/fishing/fishing_traits.dm | 82 +++ code/modules/fishing/sources/_fish_source.dm | 198 +++++++ code/modules/fishing/sources/source_types.dm | 54 ++ code/modules/keybindings/setup.dm | 6 + code/modules/projectiles/projectile.dm | 6 +- .../research/designs/autolathe_designs.dm | 8 + code/modules/research/designs/misc_designs.dm | 12 + code/modules/research/techweb/all_nodes.dm | 14 +- code/modules/tgui/tgui.dm | 16 + code/modules/tgui/tgui_window.dm | 41 ++ icons/effects/beam.dmi | Bin 129671 -> 129694 bytes icons/hud/fishing.dmi | Bin 0 -> 771 bytes .../equipment/fishing_rod_lefthand.dmi | Bin 0 -> 677 bytes .../equipment/fishing_rod_righthand.dmi | Bin 0 -> 710 bytes icons/obj/fishing.dmi | Bin 0 -> 2855 bytes icons/obj/storage.dmi | Bin 82067 -> 80078 bytes icons/ui_icons/fishing/default.png | Bin 0 -> 886 bytes icons/ui_icons/fishing/lavaland.png | Bin 0 -> 886 bytes sound/effects/bigsplash.ogg | Bin 0 -> 18054 bytes sound/effects/fish_splash.ogg | Bin 0 -> 18591 bytes sound/effects/splash.ogg | Bin 0 -> 20924 bytes tgstation.dme | 23 +- tgui/packages/common/random.ts | 33 ++ tgui/packages/tgui/backend.ts | 9 + .../{FishCatalog.js => FishCatalog.tsx} | 59 ++- tgui/packages/tgui/interfaces/Fishing.tsx | 432 ++++++++++++++++ .../tgui/interfaces/FishingCalculator.tsx | 84 +++ .../interfaces/FishingPortalGenerator.tsx | 30 ++ tgui/packages/tgui/interfaces/FishingRod.tsx | 98 ++++ .../tgui/styles/interfaces/Fishing.scss | 79 +++ tgui/packages/tgui/styles/main.scss | 1 + 64 files changed, 2975 insertions(+), 306 deletions(-) create mode 100644 code/__DEFINES/dcs/signals/signals_beam.dm create mode 100644 code/__DEFINES/fishing.dm create mode 100644 code/datums/components/fishing_spot.dm create mode 100644 code/datums/elements/lazy_fishing_spot.dm create mode 100644 code/game/objects/items/food/bait.dm delete mode 100644 code/modules/aquarium/aquarium_behaviour.dm create mode 100644 code/modules/fishing/admin.dm rename code/modules/{ => fishing}/aquarium/aquarium.dm (100%) rename code/modules/{ => fishing}/aquarium/aquarium_kit.dm (66%) create mode 100644 code/modules/fishing/bait.dm rename code/modules/{aquarium/fish.dm => fishing/fish/_fish.dm} (58%) create mode 100644 code/modules/fishing/fish/fish_types.dm create mode 100644 code/modules/fishing/fish_catalog.dm create mode 100644 code/modules/fishing/fishing_equipment.dm create mode 100644 code/modules/fishing/fishing_minigame.dm create mode 100644 code/modules/fishing/fishing_portal_machine.dm create mode 100644 code/modules/fishing/fishing_rod.dm create mode 100644 code/modules/fishing/fishing_traits.dm create mode 100644 code/modules/fishing/sources/_fish_source.dm create mode 100644 code/modules/fishing/sources/source_types.dm create mode 100644 icons/hud/fishing.dmi create mode 100644 icons/mob/inhands/equipment/fishing_rod_lefthand.dmi create mode 100644 icons/mob/inhands/equipment/fishing_rod_righthand.dmi create mode 100644 icons/obj/fishing.dmi create mode 100644 icons/ui_icons/fishing/default.png create mode 100644 icons/ui_icons/fishing/lavaland.png create mode 100644 sound/effects/bigsplash.ogg create mode 100644 sound/effects/fish_splash.ogg create mode 100644 sound/effects/splash.ogg create mode 100644 tgui/packages/common/random.ts rename tgui/packages/tgui/interfaces/{FishCatalog.js => FishCatalog.tsx} (57%) create mode 100644 tgui/packages/tgui/interfaces/Fishing.tsx create mode 100644 tgui/packages/tgui/interfaces/FishingCalculator.tsx create mode 100644 tgui/packages/tgui/interfaces/FishingPortalGenerator.tsx create mode 100644 tgui/packages/tgui/interfaces/FishingRod.tsx create mode 100644 tgui/packages/tgui/styles/interfaces/Fishing.scss diff --git a/code/__DEFINES/dcs/signals/signals_beam.dm b/code/__DEFINES/dcs/signals/signals_beam.dm new file mode 100644 index 00000000000..edfbc7c4371 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_beam.dm @@ -0,0 +1,3 @@ +/// Called before beam is redrawn +#define COMSIG_BEAM_BEFORE_DRAW "beam_before_draw" + #define BEAM_CANCEL_DRAW (1 << 0) diff --git a/code/__DEFINES/dcs/signals/signals_fish.dm b/code/__DEFINES/dcs/signals/signals_fish.dm index d40d6f3e595..89e25d85136 100644 --- a/code/__DEFINES/dcs/signals/signals_fish.dm +++ b/code/__DEFINES/dcs/signals/signals_fish.dm @@ -5,3 +5,15 @@ // Fish signals #define COMSIG_FISH_STATUS_CHANGED "fish_status_changed" #define COMSIG_FISH_STIRRED "fish_stirred" + +/// Fishing challenge completed +#define COMSIG_FISHING_CHALLENGE_COMPLETED "fishing_completed" +/// Called when you try to use fishing rod on anything +#define COMSIG_PRE_FISHING "pre_fishing" + +/// Sent by the target of the fishing rod cast +#define COMSIG_FISHING_ROD_CAST "fishing_rod_cast" + #define FISHING_ROD_CAST_HANDLED (1 << 0) + +/// Sent when fishing line is snapped +#define COMSIG_FISHING_LINE_SNAPPED "fishing_line_interrupted" diff --git a/code/__DEFINES/fishing.dm b/code/__DEFINES/fishing.dm new file mode 100644 index 00000000000..40b4d21a9e8 --- /dev/null +++ b/code/__DEFINES/fishing.dm @@ -0,0 +1,41 @@ +/// Use in fish tables to denote miss chance. +#define FISHING_DUD "dud" + +#define FISHING_BAIT_TRAIT "fishing_bait" +#define BASIC_QUALITY_BAIT_TRAIT "removes_felinids_pr" +#define GOOD_QUALITY_BAIT_TRAIT "adds_bitcoin_miner_pr" +#define GREAT_QUALITY_BAIT_TRAIT "perspective_walls_pr" + +// Baseline fishing difficulty levels +#define FISHING_DEFAULT_DIFFICULTY 15 + +/// Difficulty modifier when bait is fish's favorite +#define FAV_BAIT_DIFFICULTY_MOD -5 +/// Difficulty modifier when bait is fish's disliked +#define DISLIKED_BAIT_DIFFICULTY_MOD 15 + + +#define FISH_TRAIT_MINOR_DIFFICULTY_BOOST 5 + +// These define how the fish will behave in the minigame +#define FISH_AI_DUMB "dumb" +#define FISH_AI_ZIPPY "zippy" +#define FISH_AI_SLOW "slow" + +#define ADDITIVE_FISHING_MOD "additive" +#define MULTIPLICATIVE_FISHING_MOD "multiplicative" + +#define FISHING_HOOK_MAGNETIC (1 << 0) +#define FISHING_HOOK_SHINY (1 << 1) +#define FISHING_HOOK_WEIGHTED (1 << 2) + +#define FISHING_LINE_CLOAKED (1 << 0) +#define FISHING_LINE_REINFORCED (1 << 1) +#define FISHING_LINE_BOUNCY (1 << 2) + +#define FISHING_SPOT_PRESET_BEACH "beach" +#define FISHING_SPOT_PRESET_LAVALAND_LAVA "lavaland lava" + +#define FISHING_MINIGAME_RULE_HEAVY_FISH "heavy" +#define FISHING_MINIGAME_RULE_WEIGHTED_BAIT "weighted" +#define FISHING_MINIGAME_RULE_LIMIT_LOSS "limit_loss" diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm index 0d486296f96..9f1066c2984 100644 --- a/code/__DEFINES/food.dm +++ b/code/__DEFINES/food.dm @@ -41,6 +41,29 @@ "BUGS", \ ) +/// IC meaning (more or less) for food flags +#define FOOD_FLAGS_IC list( \ + "Meat", \ + "Vegetables", \ + "Raw food", \ + "Junk food", \ + "Grain", \ + "Fruits", \ + "Dairy products", \ + "Fried food", \ + "Alcohol", \ + "Sugary food", \ + "Gross food", \ + "Toxic food", \ + "Pineapples", \ + "Breakfast food", \ + "Clothing", \ + "Nuts", \ + "Seafood", \ + "Oranges", \ + "Bugs", \ +) + #define DRINK_NICE 1 #define DRINK_GOOD 2 #define DRINK_VERYGOOD 3 diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 6ca33a53847..ae00cf0ed4a 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -894,3 +894,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Ignores body_parts_covered during the add_fingerprint() proc. Works both on the person and the item in the glove slot. #define TRAIT_FINGERPRINT_PASSTHROUGH "fingerprint_passthrough" + +/// Currently fishing +#define TRAIT_GONE_FISHING "fishing" diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm index 49cab9bf273..9d67466cf5b 100644 --- a/code/__HELPERS/maths.dm +++ b/code/__HELPERS/maths.dm @@ -1,11 +1,21 @@ -///Calculate the angle between two points and the west|east coordinate +///Calculate the angle between two movables and the west|east coordinate /proc/get_angle(atom/movable/start, atom/movable/end)//For beams. if(!start || !end) return 0 - var/dy - var/dx - dy=(32 * end.y + end.pixel_y) - (32 * start.y + start.pixel_y) - dx=(32 * end.x + end.pixel_x) - (32 * start.x + start.pixel_x) + var/dy =(32 * end.y + end.pixel_y) - (32 * start.y + start.pixel_y) + var/dx =(32 * end.x + end.pixel_x) - (32 * start.x + start.pixel_x) + if(!dy) + return (dx >= 0) ? 90 : 270 + . = arctan(dx/dy) + if(dy < 0) + . += 180 + else if(dx < 0) + . += 360 + +/// Angle between two arbitrary points and horizontal line same as [/proc/get_angle] +/proc/get_angle_raw(start_x, start_y, start_pixel_x, start_pixel_y, end_x, end_y, end_pixel_x, end_pixel_y) + var/dy = (32 * end_y + end_pixel_y) - (32 * start_y + start_pixel_y) + var/dx = (32 * end_x + end_pixel_x) - (32 * start_x + start_pixel_x) if(!dy) return (dx >= 0) ? 90 : 270 . = arctan(dx/dy) diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index aab842e3747..5185461ea49 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -290,6 +290,7 @@ GLOBAL_LIST_INIT(rarity_loot, list(//rare: really good items /obj/item/shield/riot/buckler = 1, /obj/item/throwing_star = 1, /obj/item/weldingtool/hugetank = 1, + /obj/item/fishing_rod/master = 1, ) = 1, list(//equipment diff --git a/code/datums/beam.dm b/code/datums/beam.dm index bb67f55632d..a92b0480caa 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -30,8 +30,16 @@ var/obj/effect/ebeam/visuals ///The color of the beam we're drawing. var/beam_color + /// If set will be used instead of origin's pixel_x in offset calculations + var/override_origin_pixel_x = null + /// If set will be used instead of origin's pixel_y in offset calculations + var/override_origin_pixel_y = null + /// If set will be used instead of targets's pixel_x in offset calculations + var/override_target_pixel_x = null + /// If set will be used instead of targets's pixel_y in offset calculations + var/override_target_pixel_y = null -/datum/beam/New(origin, target, icon = 'icons/effects/beam.dmi', icon_state = "b_beam", time = INFINITY, max_distance = INFINITY, beam_type = /obj/effect/ebeam, beam_color = null) +/datum/beam/New(origin, target, icon = 'icons/effects/beam.dmi', icon_state = "b_beam", time = INFINITY, max_distance = INFINITY, beam_type = /obj/effect/ebeam, beam_color = null, override_origin_pixel_x = null, override_origin_pixel_y = null, override_target_pixel_x = null, override_target_pixel_y = null) src.origin = origin src.target = target src.icon = icon @@ -39,6 +47,10 @@ src.max_distance = max_distance src.beam_type = beam_type src.beam_color = beam_color + src.override_origin_pixel_x = override_origin_pixel_x + src.override_origin_pixel_y = override_origin_pixel_y + src.override_target_pixel_x = override_target_pixel_x + src.override_target_pixel_y = override_target_pixel_y if(time < INFINITY) QDEL_IN(src, time) @@ -85,33 +97,41 @@ * Creates the beam effects and places them in a line from the origin to the target. Sets their rotation to make the beams face the target, too. */ /datum/beam/proc/Draw() - var/Angle = round(get_angle(origin,target)) + if(SEND_SIGNAL(src, COMSIG_BEAM_BEFORE_DRAW) & BEAM_CANCEL_DRAW) + return + var/origin_px = isnull(override_origin_pixel_x) ? origin.pixel_x : override_origin_pixel_x + var/origin_py = isnull(override_origin_pixel_y) ? origin.pixel_y : override_origin_pixel_y + var/target_px = isnull(override_target_pixel_x) ? target.pixel_x : override_target_pixel_x + var/target_py = isnull(override_target_pixel_y) ? target.pixel_y : override_target_pixel_y + var/Angle = get_angle_raw(origin.x, origin.y, origin_px, origin_py, target.x , target.y, target_px, target_py) + ///var/Angle = round(get_angle(origin,target)) var/matrix/rot_matrix = matrix() var/turf/origin_turf = get_turf(origin) rot_matrix.Turn(Angle) //Translation vector for origin and target - var/DX = (32*target.x+target.pixel_x)-(32*origin.x+origin.pixel_x) - var/DY = (32*target.y+target.pixel_y)-(32*origin.y+origin.pixel_y) + var/DX = (32*target.x+target_px)-(32*origin.x+origin_px) + var/DY = (32*target.y+target_py)-(32*origin.y+origin_py) var/N = 0 var/length = round(sqrt((DX)**2+(DY)**2)) //hypotenuse of the triangle formed by target and origin's displacement for(N in 0 to length-1 step 32)//-1 as we want < not <=, but we want the speed of X in Y to Z and step X if(QDELETED(src)) break - var/obj/effect/ebeam/X = new beam_type(origin_turf) - X.owner = src - elements += X + var/obj/effect/ebeam/segment = new beam_type(origin_turf) + segment.owner = src + elements += segment //Assign our single visual ebeam to each ebeam's vis_contents //ends are cropped by a transparent box icon of length-N pixel size laid over the visuals obj if(N+32>length) //went past the target, we draw a box of space to cut away from the beam sprite so the icon actually ends at the center of the target sprite var/icon/II = new(icon, icon_state)//this means we exclude the overshooting object from the visual contents which does mean those visuals don't show up for the final bit of the beam... II.DrawBox(null,1,(length-N),32,32)//in the future if you want to improve this, remove the drawbox and instead use a 513 filter to cut away at the final object's icon - X.icon = II + segment.icon = II + segment.color = beam_color else - X.vis_contents += visuals - X.transform = rot_matrix + segment.vis_contents += visuals + segment.transform = rot_matrix //Calculate pixel offsets (If necessary) var/Pixel_x @@ -129,15 +149,15 @@ var/a if(abs(Pixel_x)>32) a = Pixel_x > 0 ? round(Pixel_x/32) : CEILING(Pixel_x/32, 1) - X.x += a + segment.x += a Pixel_x %= 32 if(abs(Pixel_y)>32) a = Pixel_y > 0 ? round(Pixel_y/32) : CEILING(Pixel_y/32, 1) - X.y += a + segment.y += a Pixel_y %= 32 - X.pixel_x = Pixel_x - X.pixel_y = Pixel_y + segment.pixel_x = origin_px + Pixel_x + segment.pixel_y = origin_py + Pixel_y CHECK_TICK /obj/effect/ebeam @@ -147,7 +167,9 @@ /obj/effect/ebeam/update_overlays() . = ..() - . += emissive_appearance(icon, icon_state) + var/mutable_appearance/emmisive = emissive_appearance(icon, icon_state) + emmisive.transform = transform + . += emmisive /obj/effect/ebeam/Destroy() owner = null @@ -170,7 +192,9 @@ * maxdistance: how far the beam will go before stopping itself. Used mainly for two things: preventing lag if the beam may go in that direction and setting a range to abilities that use beams. * beam_type: The type of your custom beam. This is for adding other wacky stuff for your beam only. Most likely, you won't (and shouldn't) change it. */ -/atom/proc/Beam(atom/BeamTarget,icon_state="b_beam",icon='icons/effects/beam.dmi',time=INFINITY,maxdistance=INFINITY,beam_type=/obj/effect/ebeam, beam_color = null) - var/datum/beam/newbeam = new(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type, beam_color) +/atom/proc/Beam(atom/BeamTarget,icon_state="b_beam",icon='icons/effects/beam.dmi',time=INFINITY,maxdistance=INFINITY,beam_type=/obj/effect/ebeam, beam_color = null, override_origin_pixel_x = null, override_origin_pixel_y = null, override_target_pixel_x = null, override_target_pixel_y = null) + var/datum/beam/newbeam = new(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type, beam_color, override_origin_pixel_x, override_origin_pixel_y, override_target_pixel_x, override_target_pixel_y ) INVOKE_ASYNC(newbeam, /datum/beam/.proc/Start) return newbeam + + diff --git a/code/datums/components/fishing_spot.dm b/code/datums/components/fishing_spot.dm new file mode 100644 index 00000000000..78b9d64cbd2 --- /dev/null +++ b/code/datums/components/fishing_spot.dm @@ -0,0 +1,62 @@ +// A thing you can fish in +/datum/component/fishing_spot + /// Defines the probabilities and fish availibilty + var/datum/fish_source/fish_source + +/datum/component/fishing_spot/Initialize(configuration) + if(ispath(configuration,/datum/fish_source)) + //Create new one of the given type + fish_source = new configuration + else if(istype(configuration,/datum/fish_source)) + //Use passed in instance + fish_source = configuration + else + /// Check if it's a preset key + var/datum/fish_source/preset_configuration = GLOB.preset_fish_sources[configuration] + if(!preset_configuration) + stack_trace("Invalid fishing spot configuration \"[configuration]\" passed down to fishing spot component.") + return COMPONENT_INCOMPATIBLE + fish_source = preset_configuration + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/handle_attackby) + RegisterSignal(parent, COMSIG_FISHING_ROD_CAST, .proc/handle_cast) + + +/datum/component/fishing_spot/proc/handle_cast(datum/source, obj/item/fishing_rod/rod, mob/user) + SIGNAL_HANDLER + if(try_start_fishing(rod,user)) + return FISHING_ROD_CAST_HANDLED + return NONE + +/datum/component/fishing_spot/proc/handle_attackby(datum/source, obj/item/item, mob/user, params) + SIGNAL_HANDLER + if(try_start_fishing(item,user)) + return COMPONENT_NO_AFTERATTACK + return NONE + +/datum/component/fishing_spot/proc/try_start_fishing(obj/item/possibly_rod, mob/user) + SIGNAL_HANDLER + var/obj/item/fishing_rod/rod = possibly_rod + if(!istype(rod)) + return + if(HAS_TRAIT(user,TRAIT_GONE_FISHING) || rod.currently_hooked_item) + user.balloon_alert(user, "already fishing") + return COMPONENT_NO_AFTERATTACK + var/denial_reason = fish_source.can_fish(rod, user) + if(denial_reason) + to_chat(user, span_warning(denial_reason)) + return COMPONENT_NO_AFTERATTACK + start_fishing_challenge(rod, user) + return COMPONENT_NO_AFTERATTACK + +/datum/component/fishing_spot/proc/start_fishing_challenge(obj/item/fishing_rod/rod, mob/user) + /// Roll what we caught based on modified table + var/result = fish_source.roll_reward(rod, user) + var/datum/fishing_challenge/challenge = new(parent, result, rod, user) + challenge.background = fish_source.background + challenge.difficulty = fish_source.calculate_difficulty(result, rod, user) + RegisterSignal(challenge, COMSIG_FISHING_CHALLENGE_COMPLETED, .proc/fishing_completed) + challenge.start(user) + +/datum/component/fishing_spot/proc/fishing_completed(datum/fishing_challenge/source, mob/user, success, perfect) + if(success) + fish_source.dispense_reward(source.reward_path, user) diff --git a/code/datums/elements/lazy_fishing_spot.dm b/code/datums/elements/lazy_fishing_spot.dm new file mode 100644 index 00000000000..603cd56e22f --- /dev/null +++ b/code/datums/elements/lazy_fishing_spot.dm @@ -0,0 +1,25 @@ +// Lazy fishing spot element so fisheable turfs do not have a component each since they're usually pretty common on their respective maps (lava/water/etc) +/datum/element/lazy_fishing_spot + element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH + id_arg_index = 2 + var/configuration + +/datum/element/lazy_fishing_spot/Attach(datum/target, configuration) + . = ..() + if(!isatom(target)) + return ELEMENT_INCOMPATIBLE + if(!configuration) + CRASH("Lazy fishing spot had no configuration passed in.") + src.configuration = configuration + + RegisterSignal(target, COMSIG_PRE_FISHING, .proc/create_fishing_spot) + +/datum/element/lazy_fishing_spot/Detach(datum/target) + UnregisterSignal(target, COMSIG_PRE_FISHING) + return ..() + +/datum/element/lazy_fishing_spot/proc/create_fishing_spot(datum/source) + SIGNAL_HANDLER + + source.AddComponent(/datum/component/fishing_spot, configuration) + Detach(source) diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index 8706990d918..ad3b54efce7 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -305,3 +305,8 @@ /datum/mood_event/russian_roulette_win/add_effects(loaded_rounds) mood_change = 2 ** loaded_rounds + +/datum/mood_event/fishing + description = "Fishing is relaxing." + mood_change = 5 + timeout = 3 MINUTES diff --git a/code/game/objects/items/food/_food.dm b/code/game/objects/items/food/_food.dm index 97288efa60f..fd9c9d3be77 100644 --- a/code/game/objects/items/food/_food.dm +++ b/code/game/objects/items/food/_food.dm @@ -65,6 +65,7 @@ MakeGrillable() MakeDecompose(mapload) MakeBakeable() + ADD_TRAIT(src, FISHING_BAIT_TRAIT, INNATE_TRAIT) ///This proc adds the edible component, overwrite this if you for some reason want to change some specific args like callbacks. /obj/item/food/proc/MakeEdible() diff --git a/code/game/objects/items/food/bait.dm b/code/game/objects/items/food/bait.dm new file mode 100644 index 00000000000..30856b3a18a --- /dev/null +++ b/code/game/objects/items/food/bait.dm @@ -0,0 +1,47 @@ +/obj/item/food/bait + name = "this is bait" + desc = "you got baited." + icon = 'icons/obj/fishing.dmi' + /// Quality trait of this bait + var/bait_quality = BASIC_QUALITY_BAIT_TRAIT + /// Icon state added to main fishing rod icon when this bait is equipped + var/rod_overlay_icon_state + +/obj/item/food/bait/Initialize(mapload) + . = ..() + ADD_TRAIT(src, bait_quality, INNATE_TRAIT) + +/obj/item/food/bait/worm + name = "worm" + desc = "It's a wriggling worm from a can of fishing bait. You're not going to eat it are you ?" + icon = 'icons/obj/fishing.dmi' + icon_state = "worm" + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 1) + tastes = list("meat" = 1, "worms" = 1) + foodtypes = GROSS | MEAT | BUGS + w_class = WEIGHT_CLASS_TINY + bait_quality = BASIC_QUALITY_BAIT_TRAIT + rod_overlay_icon_state = "worm_overlay" + +/obj/item/food/bait/worm/premium + name = "extra slimy worm" + desc = "This worm looks very sophisticated." + bait_quality = GOOD_QUALITY_BAIT_TRAIT + +/obj/item/food/bait/doughball + name = "doughball" + desc = "Small piece of dough. Simple but effective fishing bait." + icon = 'icons/obj/fishing.dmi' + icon_state = "doughball" + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 1) + tastes = list("dough" = 1) + foodtypes = GRAIN + w_class = WEIGHT_CLASS_TINY + bait_quality = BASIC_QUALITY_BAIT_TRAIT + rod_overlay_icon_state = "dough_overlay" + +/// These are generated by tech fishing rod +/obj/item/food/bait/doughball/synthetic + name = "synthetic doughball" + icon_state = "doughball" + preserved_food = TRUE diff --git a/code/game/objects/items/food/dough.dm b/code/game/objects/items/food/dough.dm index 36c9076fc70..39a699c84ea 100644 --- a/code/game/objects/items/food/dough.dm +++ b/code/game/objects/items/food/dough.dm @@ -59,6 +59,9 @@ /obj/item/food/doughslice/MakeBakeable() AddComponent(/datum/component/bakeable, /obj/item/food/bun, rand(20 SECONDS, 25 SECONDS), TRUE, TRUE) +/obj/item/food/doughslice/MakeProcessable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/bait/doughball, 5, 30) + /obj/item/food/bun name = "bun" desc = "A base for any self-respecting burger." diff --git a/code/game/objects/structures/maintenance.dm b/code/game/objects/structures/maintenance.dm index 84030d00712..8c4e887c3c5 100644 --- a/code/game/objects/structures/maintenance.dm +++ b/code/game/objects/structures/maintenance.dm @@ -25,7 +25,6 @@ at the cost of risking a vicious bite.**/ /obj/item/restraints/handcuffs/cable/pink = 1, /obj/item/restraints/handcuffs/alien = 2, /obj/item/coin/bananium = 9, - /obj/item/fish/ratfish = 10, /obj/item/knife/butcher = 5, /obj/item/coin/mythril = 1, ) @@ -41,6 +40,13 @@ at the cost of risking a vicious bite.**/ var/picked_item = pick_weight(loot_table) hidden_item = new picked_item(src) + var/datum/fish_source/moisture_trap/fish_source = new + if(prob(50)) // 50% chance there's another item to fish out of there + var/picked_item = pick_weight(loot_table) + fish_source.fish_table[picked_item] = 5 + fish_source.fish_counts[picked_item] = 1; + AddComponent(/datum/component/fishing_spot, fish_source) + /obj/structure/moisture_trap/Destroy() if(hidden_item) diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index 7d4312fd818..e99c79a0659 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -27,6 +27,10 @@ /// objects with these flags won't burn. var/immunity_resistance_flags = LAVA_PROOF +/turf/open/lava/Initialize(mapload) + . = ..() + AddElement(/datum/element/lazy_fishing_spot, FISHING_SPOT_PRESET_LAVALAND_LAVA) + /turf/open/lava/ex_act(severity, target) return diff --git a/code/game/turfs/open/water.dm b/code/game/turfs/open/water.dm index 6d8c1316c3f..151a4c8e1d4 100644 --- a/code/game/turfs/open/water.dm +++ b/code/game/turfs/open/water.dm @@ -28,6 +28,10 @@ base_icon_state = "water" baseturfs = /turf/open/water/beach +/turf/open/water/beach/Initialize(mapload) + . = ..() + AddElement(/datum/element/lazy_fishing_spot, FISHING_SPOT_PRESET_BEACH) + //Same turf, but instead used in the Beach Biodome /turf/open/water/beach/biodome initial_gas_mix = OPENTURF_DEFAULT_ATMOS diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index c33e5d0ff73..fa1cbf13d22 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -89,6 +89,7 @@ GLOBAL_PROTECT(admin_verbs_admin) /datum/admins/proc/known_alts_panel, /datum/admins/proc/paintings_manager, /datum/admins/proc/display_tags, + /datum/admins/proc/fishing_calculator, ) GLOBAL_LIST_INIT(admin_verbs_ban, list(/client/proc/unban_panel, /client/proc/ban_panel, /client/proc/stickybanpanel)) GLOBAL_PROTECT(admin_verbs_ban) diff --git a/code/modules/aquarium/aquarium_behaviour.dm b/code/modules/aquarium/aquarium_behaviour.dm deleted file mode 100644 index e735b3ec45d..00000000000 --- a/code/modules/aquarium/aquarium_behaviour.dm +++ /dev/null @@ -1,19 +0,0 @@ -/* - // Default size of the "greyscale_fish" icon_state - sprite_height = 3 - sprite_width = 3 - -/// This path exists mostly for admin abuse. -/datum/aquarium_behaviour/fish/auto - name = "automatic fish" - desc = "generates fish appearance automatically from component parent appearance" - available_in_random_cases = FALSE - sprite_width = 8 - sprite_height = 8 - show_in_catalog = FALSE - -/datum/aquarium_behaviour/fish/auto/apply_appearance(obj/effect/holder) - holder.appearance = parent.parent - holder.transform = base_transform() - holder.dir = WEST -*/ diff --git a/code/modules/asset_cache/assets/fish.dm b/code/modules/asset_cache/assets/fish.dm index a76e8b096fe..44300c63587 100644 --- a/code/modules/asset_cache/assets/fish.dm +++ b/code/modules/asset_cache/assets/fish.dm @@ -10,3 +10,10 @@ if(sprites[id]) //no dupes continue Insert(id, fish_icon, fish_icon_state) + + +/datum/asset/simple/fishing_minigame + assets = list( + "fishing_background_default" = 'icons/ui_icons/fishing/default.png', + "fishing_background_lavaland" = 'icons/ui_icons/fishing/lavaland.png' + ) diff --git a/code/modules/cargo/goodies.dm b/code/modules/cargo/goodies.dm index 95d4854c9cf..c7404a154e0 100644 --- a/code/modules/cargo/goodies.dm +++ b/code/modules/cargo/goodies.dm @@ -168,3 +168,27 @@ desc = "A complete meal package for the terminally lazy. Contains one Ready-Donk meal." cost = PAYCHECK_CREW * 2 contains = list(/obj/item/food/ready_donk) + +/datum/supply_pack/goody/fishing_toolbox + name = "Fishing toolbox" + desc = "Complete toolbox set for your fishing adventure. Advanced hooks and lines sold separetely." + cost = PAYCHECK_CREW * 2 + contains = list(/obj/item/storage/toolbox/fishing) + +/datum/supply_pack/goody/fishing_hook_set + name = "Fishing Hooks Set" + desc = "Set of various fishing hooks." + cost = PAYCHECK_CREW + contains = list(/obj/item/storage/box/fishing_hooks) + +/datum/supply_pack/goody/fishing_line_set + name = "Fishing Lines Set" + desc = "Set of various fishing lines." + cost = PAYCHECK_CREW + contains = list(/obj/item/storage/box/fishing_lines) + +/datum/supply_pack/goody/premium_bait + name = "Deluxe fishing bait" + desc = "When the standard variety is not good enough for you." + cost = PAYCHECK_CREW + contains = list(/obj/item/bait_can/worm/premium) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 06b5dd763ea..c9b98eab64d 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -2817,6 +2817,14 @@ crate_value -= uplink_item.cost new uplink_item.item(C) + +/datum/supply_pack/misc/fishing_portal + name = "Fishing Portal Generator Crate" + desc = "Not enough fish near your location? Fishing portal has your back." + cost = CARGO_CRATE_VALUE * 4 + contains = list(/obj/machinery/fishing_portal_generator) + crate_name = "fishing portal crate" + ////////////////////////////////////////////////////////////////////////////// /////////////////////// General Vending Restocks ///////////////////////////// ////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/fishing/admin.dm b/code/modules/fishing/admin.dm new file mode 100644 index 00000000000..ad97ab890b4 --- /dev/null +++ b/code/modules/fishing/admin.dm @@ -0,0 +1,75 @@ +// Helper tool to see fishing probabilities with different setups +/datum/admins/proc/fishing_calculator() + set name = "Fishing Calculator" + set category = "Debug" + + if(!check_rights(R_DEBUG)) + return + var/datum/fishing_calculator/ui = new(usr) + ui.ui_interact(usr) + +/datum/fishing_calculator + var/list/current_table + +/datum/fishing_calculator/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "FishingCalculator") + ui.open() + +/datum/fishing_calculator/ui_state(mob/user) + return GLOB.admin_state + +/datum/fishing_calculator/ui_close(mob/user) + qdel(src) + +/datum/fishing_calculator/ui_static_data(mob/user) + . = ..() + .["rod_types"] = typesof(/obj/item/fishing_rod) + .["hook_types"] = typesof(/obj/item/fishing_hook) + .["line_types"] = typesof(/obj/item/fishing_line) + var/list/spot_keys = list() + for(var/key in GLOB.preset_fish_sources) + spot_keys += key + .["spot_types"] = subtypesof(/datum/fish_source) + spot_keys + +/datum/fishing_calculator/ui_data(mob/user) + return list("info" = current_table) + +/datum/fishing_calculator/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + var/mob/user = usr + switch(action) + if("recalc") + var/rod_type = text2path(params["rod"]) + var/bait_type = text2path(params["bait"]) + var/hook_type = text2path(params["hook"]) + var/line_type = text2path(params["line"]) + var/spot_type = text2path(params["spot"]) || params["spot"] //can be also key from presets + + //validate here against nonsense values + var/datum/fish_source/spot + if(ispath(spot_type)) + spot = new spot_type + else + spot = GLOB.preset_fish_sources[spot_type] + + var/obj/item/fishing_rod/temporary_rod = new rod_type + if(bait_type) + temporary_rod.bait = new bait_type + if(hook_type) + temporary_rod.hook = new hook_type + if(line_type) + temporary_rod.line = new line_type + var/result_table = list() + var/modified_table = spot.get_modified_fish_table(temporary_rod,user) + for(var/result_type in spot.fish_table) // through this not modified to display 0 chance ones too + var/list/info = list() + info["result"] = result_type + info["weight"] = modified_table[result_type] || 0 + info["difficulty"] = spot.calculate_difficulty(result_type,temporary_rod, user) + info["count"] = spot.fish_counts[result_type] || "Infinite" + result_table += list(info) + current_table = result_table + qdel(temporary_rod) + return TRUE diff --git a/code/modules/aquarium/aquarium.dm b/code/modules/fishing/aquarium/aquarium.dm similarity index 100% rename from code/modules/aquarium/aquarium.dm rename to code/modules/fishing/aquarium/aquarium.dm diff --git a/code/modules/aquarium/aquarium_kit.dm b/code/modules/fishing/aquarium/aquarium_kit.dm similarity index 66% rename from code/modules/aquarium/aquarium_kit.dm rename to code/modules/fishing/aquarium/aquarium_kit.dm index f091a7c6f05..3221acce755 100644 --- a/code/modules/aquarium/aquarium_kit.dm +++ b/code/modules/fishing/aquarium/aquarium_kit.dm @@ -1,4 +1,3 @@ - ///Fish feed can /obj/item/fish_feed name = "fish feed can" @@ -59,57 +58,6 @@ var/fish_type = pick(/obj/item/fish/dwarf_moonfish, /obj/item/fish/gunner_jellyfish, /obj/item/fish/needlefish, /obj/item/fish/armorfish) new fish_type(src) -///Book detailing where to get the fish and their properties. -/obj/item/book/fish_catalog - name = "Fish Encyclopedia" - desc = "Indexes all fish known to mankind (and related species)." - icon_state = "fishbook" - starting_content = "Lot of fish stuff" //book wrappers could use cleaning so this is not necessary - -/obj/item/book/fish_catalog/on_read(mob/user) - ui_interact(user) - -/obj/item/book/fish_catalog/ui_interact(mob/user, datum/tgui/ui) - . = ..() - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "FishCatalog", name) - ui.open() - -/obj/item/book/fish_catalog/ui_static_data(mob/user) - . = ..() - var/static/fish_info - if(!fish_info) - fish_info = list() - for(var/_fish_type in subtypesof(/obj/item/fish)) - var/obj/item/fish/fish = _fish_type - var/list/fish_data = list() - if(!initial(fish.show_in_catalog)) - continue - fish_data["name"] = initial(fish.name) - fish_data["desc"] = initial(fish.desc) - fish_data["fluid"] = initial(fish.required_fluid_type) - fish_data["temp_min"] = initial(fish.required_temperature_min) - fish_data["temp_max"] = initial(fish.required_temperature_max) - fish_data["icon"] = sanitize_css_class_name("[initial(fish.icon)][initial(fish.icon_state)]") - fish_data["color"] = initial(fish.color) - fish_data["source"] = initial(fish.available_in_random_cases) ? "[AQUARIUM_COMPANY] Fish Packs" : "Unknown" - var/datum/reagent/food_type = initial(fish.food) - if(food_type != /datum/reagent/consumable/nutriment) - fish_data["feed"] = initial(food_type.name) - else - fish_data["feed"] = "[AQUARIUM_COMPANY] Fish Feed" - fish_info += list(fish_data) - // TODO: Custom entries - - .["fish_info"] = fish_info - .["sponsored_by"] = AQUARIUM_COMPANY - -/obj/item/book/fish_catalog/ui_assets(mob/user) - return list( - get_asset_datum(/datum/asset/spritesheet/fish) - ) - /obj/item/aquarium_kit name = "DIY Aquarium Construction Kit" desc = "Everything you need to build your own aquarium. Raw materials sold separately." diff --git a/code/modules/fishing/bait.dm b/code/modules/fishing/bait.dm new file mode 100644 index 00000000000..b67298fab9f --- /dev/null +++ b/code/modules/fishing/bait.dm @@ -0,0 +1,35 @@ +/obj/item/bait_can + name = "can o bait" + desc = "there's a lot of them in there, getting them out takes a while though" + icon = 'icons/obj/fishing.dmi' + icon_state = "bait_can" + w_class = WEIGHT_CLASS_SMALL + /// Tracking until we can take out another bait item + COOLDOWN_DECLARE(bait_removal_cooldown) + /// What bait item it produces + var/bait_type + /// Time between bait retrievals + var/cooldown_time = 10 SECONDS + +/obj/item/bait_can/attack_self(mob/user, modifiers) + . = ..() + var/fresh_bait = retrieve_bait(user) + if(fresh_bait) + user.put_in_hands(fresh_bait) + +/obj/item/bait_can/proc/retrieve_bait(mob/user) + if(!COOLDOWN_FINISHED(src, bait_removal_cooldown)) + user.balloon_alert(user, "wait a bit") //I can't think of generic ic reason. + return + COOLDOWN_START(src, bait_removal_cooldown, cooldown_time) + return new bait_type(src) + +/obj/item/bait_can/worm + name = "can o' worm" + desc = "this can got worms." + bait_type = /obj/item/food/bait/worm + +/obj/item/bait_can/worm/premium + name = "can o' worm deluxe" + desc = "this can got fancy worms." + bait_type = /obj/item/food/bait/worm/premium diff --git a/code/modules/aquarium/fish.dm b/code/modules/fishing/fish/_fish.dm similarity index 58% rename from code/modules/aquarium/fish.dm rename to code/modules/fishing/fish/_fish.dm index 220918499aa..51990a0e340 100644 --- a/code/modules/aquarium/fish.dm +++ b/code/modules/fishing/fish/_fish.dm @@ -64,6 +64,41 @@ var/in_stasis = FALSE + // Fishing related properties + + /// List of fishing trait types, these modify probabilty/difficulty depending on rod/user properties + var/list/fishing_traits = list() + + /// Fishing behaviour + var/fish_ai_type = FISH_AI_DUMB + + /// Base additive modifier to fishing difficulty + var/fishing_difficulty_modifier = 0 + + /** + * Bait identifiers that make catching this fish easier and more likely + * Bait identifiers: Path | Trait | list("Type"="Foodtype","Value"= Food Type Flag like [MEAT]) + */ + var/list/favorite_bait = list() + + /** + * Bait identifiers that make catching this fish harder and less likely + * Bait identifiers: Path | Trait | list("Type"="Foodtype","Value"= Food Type Flag like [MEAT]) + */ + var/list/disliked_bait = list() + + /// Size in centimeters + var/size = 50 + /// Average size for this fish type in centimeters. Will be used as gaussian distribution with 20% deviation for fishing, bought fish are always standard size + var/average_size = 50 + + /// Weight in grams + var/weight = 1000 + /// Average weight for this fish type in grams + var/average_weight = 1000 + + + /obj/item/fish/Initialize(mapload) . = ..() if(fillet_type) @@ -75,6 +110,24 @@ if(status != FISH_DEAD) START_PROCESSING(SSobj, src) + size = average_size + weight = average_weight + +/obj/item/fish/examine(mob/user) + . = ..() + // All spacemen have magic eyes of fish weight perception until fish scale (get it?) is implemented. + . += span_notice("It's [size] cm long.") + . += span_notice("It weighs [weight] g.") + +/obj/item/fish/proc/randomize_weight_and_size(modifier = 0) + var/size_deviation = 0.2 * average_size + var/size_mod = modifier * average_size + size = max(1,gaussian(average_size + size_mod, size_deviation)) + + var/weight_deviation = 0.2 * average_weight + var/weight_mod = modifier * average_weight + weight = max(1,gaussian(average_weight + weight_mod, weight_deviation)) + /obj/item/fish/Moved(atom/OldLoc, Dir) . = ..() check_environment_after_movement() @@ -123,7 +176,7 @@ if(QDELETED(src)) //we don't care anymore return // Apply/remove stasis as needed - if(HAS_TRAIT(loc, TRAIT_FISH_SAFE_STORAGE)) + if(loc && HAS_TRAIT(loc, TRAIT_FISH_SAFE_STORAGE)) enter_stasis() else if(in_stasis) exit_stasis() @@ -134,7 +187,7 @@ on_aquarium_insertion(loc) // Start flopping if outside of fish container - var/should_be_flopping = status == FISH_ALIVE && !HAS_TRAIT(loc,TRAIT_FISH_SAFE_STORAGE) && !in_aquarium + var/should_be_flopping = status == FISH_ALIVE && loc && !HAS_TRAIT(loc,TRAIT_FISH_SAFE_STORAGE) && !in_aquarium if(should_be_flopping) start_flopping() @@ -314,202 +367,4 @@ probability_table[argkey] = chance_table return pick_weight(probability_table[argkey]) -// Freshwater fish -/obj/item/fish/goldfish - name = "goldfish" - desc = "Despite common belief, goldfish do not have three-second memories. They can actually remember things that happened up to three months ago." - icon_state = "goldfish" - sprite_width = 8 - sprite_height = 8 - - stable_population = 3 - -/obj/item/fish/angelfish - name = "angelfish" - desc = "Young Angelfish often live in groups, while adults prefer solitary life. They become territorial and aggressive toward other fish when they reach adulthood." - icon_state = "angelfish" - dedicated_in_aquarium_icon_state = "bigfish" - sprite_height = 7 - source_height = 7 - - stable_population = 3 - -/obj/item/fish/guppy - name = "guppy" - desc = "Guppy is also known as rainbow fish because of the brightly colored body and fins." - icon_state = "guppy" - dedicated_in_aquarium_icon_state = "fish_greyscale" - aquarium_vc_color = "#91AE64" - sprite_width = 8 - sprite_height = 5 - - stable_population = 6 - -/obj/item/fish/plasmatetra - name = "plasma tetra" - desc = "Due to their small size, tetras are prey to many predators in their watery world, including eels, crustaceans, and invertebrates." - icon_state = "plastetra" - dedicated_in_aquarium_icon_state = "fish_greyscale" - aquarium_vc_color = "#D30EB0" - - stable_population = 3 - -/obj/item/fish/catfish - name = "cory catfish" - desc = "A catfish has about 100,000 taste buds, and their bodies are covered with them to help detect chemicals present in the water and also to respond to touch." - icon_state = "catfish" - dedicated_in_aquarium_icon_state = "fish_greyscale" - aquarium_vc_color = "#907420" - - stable_population = 3 - -// Saltwater fish below - -/obj/item/fish/clownfish - name = "clownfish" - desc = "Clownfish catch prey by swimming onto the reef, attracting larger fish, and luring them back to the anemone. The anemone will sting and eat the larger fish, leaving the remains for the clownfish." - icon_state = "clownfish" - dedicated_in_aquarium_icon_state = "clownfish_small" - required_fluid_type = AQUARIUM_FLUID_SALTWATER - sprite_width = 8 - sprite_height = 5 - - stable_population = 4 - -/obj/item/fish/cardinal - name = "cardinalfish" - desc = "Cardinalfish are often found near sea urchins, where the fish hide when threatened." - icon_state = "cardinalfish" - dedicated_in_aquarium_icon_state = "fish_greyscale" - required_fluid_type = AQUARIUM_FLUID_SALTWATER - - stable_population = 4 - -/obj/item/fish/greenchromis - name = "green chromis" - desc = "The Chromis can vary in color from blue to green depending on the lighting and distance from the lights." - icon_state = "greenchromis" - dedicated_in_aquarium_icon_state = "fish_greyscale" - aquarium_vc_color = "#00ff00" - required_fluid_type = AQUARIUM_FLUID_SALTWATER - - - stable_population = 5 -/obj/item/fish/firefish - name = "firefish goby" - desc = "To communicate in the wild, the firefish uses its dorsal fin to alert others of potential danger." - icon_state = "firefish" - sprite_width = 6 - sprite_height = 5 - required_fluid_type = AQUARIUM_FLUID_SALTWATER - - stable_population = 3 - -/obj/item/fish/pufferfish - name = "pufferfish" - desc = "One Pufferfish contains enough toxins in its liver to kill 30 people." - icon_state = "pufferfish" - required_fluid_type = AQUARIUM_FLUID_SALTWATER - sprite_width = 8 - sprite_height = 8 - - stable_population = 3 - -/obj/item/fish/lanternfish - name = "lanternfish" - desc = "Typically found in areas below 6600 feet below the surface of the ocean, they live in complete darkness." - icon_state = "lanternfish" - required_fluid_type = AQUARIUM_FLUID_SALTWATER - random_case_rarity = FISH_RARITY_VERY_RARE - source_width = 28 - source_height = 21 - sprite_width = 8 - sprite_height = 8 - - stable_population = 3 - -//Tiziran Fish -/obj/item/fish/dwarf_moonfish - name = "dwarf moonfish" - desc = "Ordinarily in the wild, the Zagoskian moonfish is around the size of a tuna, however through selective breeding a smaller breed suitable for being kept as an aquarium pet has been created." - icon_state = "dwarf_moonfish" - required_fluid_type = AQUARIUM_FLUID_SALTWATER - stable_population = 2 - fillet_type = /obj/item/food/fishmeat/moonfish - -/obj/item/fish/gunner_jellyfish - name = "gunner jellyfish" - desc = "So called due to their resemblance to an artillery shell, the gunner jellyfish is native to Tizira, where it is enjoyed as a delicacy. Produces a mild hallucinogen that is destroyed by cooking." - icon_state = "gunner_jellyfish" - required_fluid_type = AQUARIUM_FLUID_SALTWATER - stable_population = 4 - fillet_type = /obj/item/food/fishmeat/gunner_jellyfish - -/obj/item/fish/needlefish - name = "needlefish" - desc = "A tiny, transparent fish which resides in large schools in the oceans of Tizira. A common food for other, larger fish." - icon_state = "needlefish" - required_fluid_type = AQUARIUM_FLUID_SALTWATER - stable_population = 12 - fillet_type = null - -/obj/item/fish/armorfish - name = "armorfish" - desc = "A small shellfish native to Tizira's oceans, known for its exceptionally hard shell. Consumed similarly to prawns." - icon_state = "armorfish" - required_fluid_type = AQUARIUM_FLUID_SALTWATER - stable_population = 10 - fillet_type = /obj/item/food/fishmeat/armorfish - -/obj/item/storage/box/fish_debug - name = "box full of fish" - -/obj/item/storage/box/fish_debug/PopulateContents() - for(var/fish_type in subtypesof(/obj/item/fish)) - new fish_type(src) - -/obj/item/fish/donkfish - name = "donk co. company patent donkfish" - desc = "A lab-grown donkfish. Its invention was an accident for the most part, as it was intended to be consumed in donk pockets. Unfortunately, it tastes horrible, so it has now become a pseudo-mascot." - icon_state = "donkfish" - random_case_rarity = FISH_RARITY_VERY_RARE - required_fluid_type = AQUARIUM_FLUID_FRESHWATER - stable_population = 4 - fillet_type = /obj/item/food/fishmeat/donkfish - -/obj/item/fish/emulsijack - name = "toxic emulsijack" - desc = "Ah, the terrifying emulsijack. Created in a laboratory, this slimey, scaleless fish emits an invisible toxin that emulsifies other fish for it to feed on. Its only real use is for completely ruining a tank." - icon_state = "emulsijack" - random_case_rarity = FISH_RARITY_GOOD_LUCK_FINDING_THIS - required_fluid_type = AQUARIUM_FLUID_ANADROMOUS - stable_population = 3 - -/obj/item/fish/emulsijack/process(delta_time = SSOBJ_DT) - var/emulsified = FALSE - var/obj/structure/aquarium/aquarium = loc - if(istype(aquarium)) - for(var/obj/item/fish/victim in aquarium) - if(istype(victim, /obj/item/fish/emulsijack)) - continue //no team killing - victim.adjust_health((victim.health - 3) * delta_time) //the victim may heal a bit but this will quickly kill - emulsified = TRUE - if(emulsified) - adjust_health((health + 3) * delta_time) - last_feeding = world.time //emulsijack feeds on the emulsion! - ..() - -/obj/item/fish/ratfish - name = "ratfish" - desc = "A rat exposed to the murky waters of maintenance too long. Any higher power, if it revealed itself, would state that the ratfish's continued existence is extremely unwelcome." - icon_state = "ratfish" - random_case_rarity = FISH_RARITY_RARE - required_fluid_type = AQUARIUM_FLUID_FRESHWATER - stable_population = 10 //set by New, but this is the default config value - fillet_type = /obj/item/food/meat/slab/human/mutant/zombie //eww... - -/obj/item/fish/ratfish/Initialize(mapload) - . = ..() - //stable pop reflects the config for how many mice migrate. powerful... - stable_population = CONFIG_GET(number/mice_roundstart) diff --git a/code/modules/fishing/fish/fish_types.dm b/code/modules/fishing/fish/fish_types.dm new file mode 100644 index 00000000000..f6e99c73586 --- /dev/null +++ b/code/modules/fishing/fish/fish_types.dm @@ -0,0 +1,242 @@ +// Freshwater fish + +/obj/item/fish/goldfish + name = "goldfish" + desc = "Despite common belief, goldfish do not have three-second memories. They can actually remember things that happened up to three months ago." + icon_state = "goldfish" + sprite_width = 8 + sprite_height = 8 + stable_population = 3 + average_size = 30 + average_weight = 500 + favorite_bait = list(/obj/item/food/bait/worm) + +/obj/item/fish/angelfish + name = "angelfish" + desc = "Young Angelfish often live in groups, while adults prefer solitary life. They become territorial and aggressive toward other fish when they reach adulthood." + icon_state = "angelfish" + dedicated_in_aquarium_icon_state = "bigfish" + sprite_height = 7 + source_height = 7 + average_size = 30 + average_weight = 500 + stable_population = 3 + +/obj/item/fish/guppy + name = "guppy" + desc = "Guppy is also known as rainbow fish because of the brightly colored body and fins." + icon_state = "guppy" + dedicated_in_aquarium_icon_state = "fish_greyscale" + aquarium_vc_color = "#91AE64" + sprite_width = 8 + sprite_height = 5 + average_size = 30 + average_weight = 500 + stable_population = 6 + +/obj/item/fish/plasmatetra + name = "plasma tetra" + desc = "Due to their small size, tetras are prey to many predators in their watery world, including eels, crustaceans, and invertebrates." + icon_state = "plastetra" + dedicated_in_aquarium_icon_state = "fish_greyscale" + aquarium_vc_color = "#D30EB0" + average_size = 30 + average_weight = 500 + stable_population = 3 + +/obj/item/fish/catfish + name = "cory catfish" + desc = "A catfish has about 100,000 taste buds, and their bodies are covered with them to help detect chemicals present in the water and also to respond to touch." + icon_state = "catfish" + dedicated_in_aquarium_icon_state = "fish_greyscale" + aquarium_vc_color = "#907420" + average_size = 100 + average_weight = 2000 + stable_population = 3 + favorite_bait = list( + list( + "Type" = "Foodtype", + "Value" = JUNKFOOD + ) + ) + +// Saltwater fish below + +/obj/item/fish/clownfish + name = "clownfish" + desc = "Clownfish catch prey by swimming onto the reef, attracting larger fish, and luring them back to the anemone. The anemone will sting and eat the larger fish, leaving the remains for the clownfish." + icon_state = "clownfish" + dedicated_in_aquarium_icon_state = "clownfish_small" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + sprite_width = 8 + sprite_height = 5 + average_size = 30 + average_weight = 500 + stable_population = 4 + + fishing_traits = list(/datum/fishing_trait/picky_eater) + +/obj/item/fish/cardinal + name = "cardinalfish" + desc = "Cardinalfish are often found near sea urchins, where the fish hide when threatened." + icon_state = "cardinalfish" + dedicated_in_aquarium_icon_state = "fish_greyscale" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + average_size = 30 + average_weight = 500 + stable_population = 4 + fishing_traits = list(/datum/fishing_trait/vegan) + +/obj/item/fish/greenchromis + name = "green chromis" + desc = "The Chromis can vary in color from blue to green depending on the lighting and distance from the lights." + icon_state = "greenchromis" + dedicated_in_aquarium_icon_state = "fish_greyscale" + aquarium_vc_color = "#00ff00" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + average_size = 30 + average_weight = 500 + stable_population = 5 + + fishing_difficulty_modifier = 5 // Bit harder + +/obj/item/fish/firefish + name = "firefish goby" + desc = "To communicate in the wild, the firefish uses its dorsal fin to alert others of potential danger." + icon_state = "firefish" + sprite_width = 6 + sprite_height = 5 + required_fluid_type = AQUARIUM_FLUID_SALTWATER + average_size = 30 + average_weight = 500 + stable_population = 3 + disliked_bait = list(/obj/item/food/bait/worm, /obj/item/food/bait/doughball) + fish_ai_type = FISH_AI_ZIPPY + +/obj/item/fish/pufferfish + name = "pufferfish" + desc = "One Pufferfish contains enough toxins in its liver to kill 30 people." + icon_state = "pufferfish" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + sprite_width = 8 + sprite_height = 8 + average_size = 60 + average_weight = 1000 + stable_population = 3 + + fishing_traits = list(/datum/fishing_trait/heavy) + +/obj/item/fish/lanternfish + name = "lanternfish" + desc = "Typically found in areas below 6600 feet below the surface of the ocean, they live in complete darkness." + icon_state = "lanternfish" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + random_case_rarity = FISH_RARITY_VERY_RARE + source_width = 28 + source_height = 21 + sprite_width = 8 + sprite_height = 8 + average_size = 100 + average_weight = 1500 + stable_population = 3 + + fishing_traits = list(/datum/fishing_trait/nocturnal) + +//Tiziran Fish +/obj/item/fish/dwarf_moonfish + name = "dwarf moonfish" + desc = "Ordinarily in the wild, the Zagoskian moonfish is around the size of a tuna, however through selective breeding a smaller breed suitable for being kept as an aquarium pet has been created." + icon_state = "dwarf_moonfish" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + stable_population = 2 + fillet_type = /obj/item/food/fishmeat/moonfish + average_size = 100 + average_weight = 2000 + +/obj/item/fish/gunner_jellyfish + name = "gunner jellyfish" + desc = "So called due to their resemblance to an artillery shell, the gunner jellyfish is native to Tizira, where it is enjoyed as a delicacy. Produces a mild hallucinogen that is destroyed by cooking." + icon_state = "gunner_jellyfish" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + stable_population = 4 + fillet_type = /obj/item/food/fishmeat/gunner_jellyfish + +/obj/item/fish/needlefish + name = "needlefish" + desc = "A tiny, transparent fish which resides in large schools in the oceans of Tizira. A common food for other, larger fish." + icon_state = "needlefish" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + stable_population = 12 + fillet_type = null + average_size = 30 + average_weight = 300 + fishing_traits = list(/datum/fishing_trait/carnivore) + +/obj/item/fish/armorfish + name = "armorfish" + desc = "A small shellfish native to Tizira's oceans, known for its exceptionally hard shell. Consumed similarly to prawns." + icon_state = "armorfish" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + stable_population = 10 + fillet_type = /obj/item/food/fishmeat/armorfish + fish_ai_type = FISH_AI_SLOW + +/obj/item/storage/box/fish_debug + name = "box full of fish" + +/obj/item/storage/box/fish_debug/PopulateContents() + for(var/fish_type in subtypesof(/obj/item/fish)) + new fish_type(src) + +/obj/item/fish/donkfish + name = "donk co. company patent donkfish" + desc = "A lab-grown donkfish. Its invention was an accident for the most part, as it was intended to be consumed in donk pockets. Unfortunately, it tastes horrible, so it has now become a pseudo-mascot." + icon_state = "donkfish" + random_case_rarity = FISH_RARITY_VERY_RARE + required_fluid_type = AQUARIUM_FLUID_FRESHWATER + stable_population = 4 + fillet_type = /obj/item/food/fishmeat/donkfish + +/obj/item/fish/emulsijack + name = "toxic emulsijack" + desc = "Ah, the terrifying emulsijack. Created in a laboratory, this slimey, scaleless fish emits an invisible toxin that emulsifies other fish for it to feed on. Its only real use is for completely ruining a tank." + icon_state = "emulsijack" + random_case_rarity = FISH_RARITY_GOOD_LUCK_FINDING_THIS + required_fluid_type = AQUARIUM_FLUID_ANADROMOUS + stable_population = 3 + +/obj/item/fish/emulsijack/process(delta_time) + var/emulsified = FALSE + var/obj/structure/aquarium/aquarium = loc + if(istype(aquarium)) + for(var/obj/item/fish/victim in aquarium) + if(istype(victim, /obj/item/fish/emulsijack)) + continue //no team killing + victim.adjust_health((victim.health - 3) * delta_time) //the victim may heal a bit but this will quickly kill + emulsified = TRUE + if(emulsified) + adjust_health((health + 3) * delta_time) + last_feeding = world.time //emulsijack feeds on the emulsion! + ..() + +/obj/item/fish/ratfish + name = "ratfish" + desc = "A rat exposed to the murky waters of maintenance too long. Any higher power, if it revealed itself, would state that the ratfish's continued existence is extremely unwelcome." + icon_state = "ratfish" + random_case_rarity = FISH_RARITY_RARE + required_fluid_type = AQUARIUM_FLUID_FRESHWATER + stable_population = 10 //set by New, but this is the default config value + fillet_type = /obj/item/food/meat/slab/human/mutant/zombie //eww... + + fish_ai_type = FISH_AI_ZIPPY + favorite_bait = list( + list( + "Type" = "Foodtype", + "Value" = DAIRY + ) + ) + +/obj/item/fish/ratfish/Initialize(mapload) + . = ..() + //stable pop reflects the config for how many mice migrate. powerful... + stable_population = CONFIG_GET(number/mice_roundstart) diff --git a/code/modules/fishing/fish_catalog.dm b/code/modules/fishing/fish_catalog.dm new file mode 100644 index 00000000000..396d112bd43 --- /dev/null +++ b/code/modules/fishing/fish_catalog.dm @@ -0,0 +1,109 @@ +///Book detailing where to get the fish and their properties. +/obj/item/book/fish_catalog + name = "Fish Encyclopedia" + desc = "Indexes all fish known to mankind (and related species)." + icon_state = "fishbook" + starting_content = "Lot of fish stuff" //book wrappers could use cleaning so this is not necessary + +/obj/item/book/fish_catalog/on_read(mob/user) + ui_interact(user) + +/obj/item/book/fish_catalog/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "FishCatalog", name) + ui.open() + +/obj/item/book/fish_catalog/ui_static_data(mob/user) + . = ..() + var/static/fish_info + if(!fish_info) + fish_info = list() + for(var/_fish_type as anything in subtypesof(/obj/item/fish)) + var/obj/item/fish/fish = _fish_type + var/list/fish_data = list() + if(!initial(fish.show_in_catalog)) + continue + fish_data["name"] = initial(fish.name) + fish_data["desc"] = initial(fish.desc) + fish_data["fluid"] = initial(fish.required_fluid_type) + fish_data["temp_min"] = initial(fish.required_temperature_min) + fish_data["temp_max"] = initial(fish.required_temperature_max) + fish_data["icon"] = sanitize_css_class_name("[initial(fish.icon)][initial(fish.icon_state)]") + fish_data["color"] = initial(fish.color) + fish_data["source"] = initial(fish.available_in_random_cases) ? "[AQUARIUM_COMPANY] Fish Packs" : "Unknown" + fish_data["size"] = initial(fish.average_size) + fish_data["weight"] = initial(fish.average_weight) + var/datum/reagent/food_type = initial(fish.food) + if(food_type != /datum/reagent/consumable/nutriment) + fish_data["feed"] = initial(food_type.name) + else + fish_data["feed"] = "[AQUARIUM_COMPANY] Fish Feed" + fish_data["fishing_tips"] = build_fishing_tips(fish) + fish_info += list(fish_data) + // TODO: Custom entries for unusual stuff + + .["fish_info"] = fish_info + .["sponsored_by"] = AQUARIUM_COMPANY + +/obj/item/book/proc/bait_description(bait) + if(ispath(bait)) + var/obj/bait_item = bait + return initial(bait_item.name) + if(islist(bait)) + var/list/special_identifier = bait + switch(special_identifier["Type"]) + if("Foodtype") + return jointext(bitfield_to_list(special_identifier["Value"], FOOD_FLAGS_IC),",") + else + stack_trace("Unknown bait identifier in fish favourite/disliked list") + return "SOMETHING VERY WEIRD" + else + //Here we handle descriptions of traits fish use as qualifiers + return "something special" + +/obj/item/book/fish_catalog/proc/build_fishing_tips(fish_type) + var/obj/item/fish/fishy = fish_type + . = list() + //// Where can it be found - iterate fish sources, how should this handle key + var/list/spot_descriptions = list() + for(var/datum/fish_source/fishing_spot_type as anything in subtypesof(/datum/fish_source)) + var/datum/fish_source/temp = new fishing_spot_type + if((fish_type in temp.fish_table) && temp.catalog_description) + spot_descriptions += temp.catalog_description + .["spots"] = english_list(spot_descriptions, nothing_text = "Unknown") + ///Difficulty descriptor + switch(initial(fishy.fishing_difficulty_modifier)) + if(-INFINITY to 10) + .["difficulty"] = "Easy" + if(20 to 30) + .["difficulty"] = "Medium" + else + .["difficulty"] = "Hard" + var/list/fish_list_properties = collect_fish_properties() + var/list/fav_bait = fish_list_properties[fishy][NAMEOF(fishy, favorite_bait)] + var/list/disliked_bait = fish_list_properties[fishy][NAMEOF(fishy, disliked_bait)] + var/list/bait_list = list() + // Favourite/Disliked bait + for(var/bait_type_or_trait in fav_bait) + bait_list += bait_description(bait_type_or_trait) + .["favorite_bait"] = english_list(bait_list, nothing_text = "None") + bait_list.Cut() + for(var/bait_type_or_trait in disliked_bait) + bait_list += bait_description(bait_type_or_trait) + .["disliked_bait"] = english_list(bait_list, nothing_text = "None") + // Fish traits description + var/list/trait_descriptions = list() + var/list/fish_traits = fish_list_properties[fishy][NAMEOF(fishy, fishing_traits)] + for(var/fish_trait in fish_traits) + var/datum/fishing_trait/trait = fish_trait + trait_descriptions += initial(trait.catalog_description) + if(!length(trait_descriptions)) + trait_descriptions += "This fish exhibits no special behavior." + .["traits"] = trait_descriptions + return . + +/obj/item/book/fish_catalog/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/spritesheet/fish) + ) diff --git a/code/modules/fishing/fishing_equipment.dm b/code/modules/fishing/fishing_equipment.dm new file mode 100644 index 00000000000..6ad286c5285 --- /dev/null +++ b/code/modules/fishing/fishing_equipment.dm @@ -0,0 +1,102 @@ +// Reels + +/obj/item/fishing_line + name = "fishing line reel" + desc = "simple fishing line" + icon = 'icons/obj/fishing.dmi' + icon_state = "reel_blue" + var/fishing_line_traits = NONE + /// Color of the fishing line + var/line_color = "#808080" + +/obj/item/fishing_line/reinforced + name = "reinforced fishing line reel" + desc = "essential for fishing in extreme environments" + icon_state = "reel_green" + fishing_line_traits = FISHING_LINE_REINFORCED + line_color = "#2b9c2b" + +/obj/item/fishing_line/cloaked + name = "cloaked fishing line reel" + desc = "even harder to notice than the common variety" + icon_state = "reel_white" + fishing_line_traits = FISHING_LINE_CLOAKED + line_color = "#82cfdd" + +/obj/item/fishing_line/bouncy + name = "flexible fishing line reel" + desc = "this specialized line is much harder to snap" + icon_state = "reel_red" + fishing_line_traits = FISHING_LINE_BOUNCY + line_color = "#99313f" + +// Hooks + +/obj/item/fishing_hook + name = "simple fishing hook" + desc = "a simple fishing hook." + icon = 'icons/obj/fishing.dmi' + icon_state = "hook" + w_class = WEIGHT_CLASS_TINY + + var/fishing_hook_traits = NONE + // icon state added to main rod icon when this hook is equipped + var/rod_overlay_icon_state = "hook_overlay" + +/obj/item/fishing_hook/magnet + name = "magnetic hook" + desc = "won't make catching fish any easier but might help with looking for other things" + icon_state = "treasure" + fishing_hook_traits = FISHING_HOOK_MAGNETIC + rod_overlay_icon_state = "hook_treasure_overlay" + +/obj/item/fishing_hook/shiny + name = "shiny lure hook" + icon_state = "gold_shiny" + fishing_hook_traits = FISHING_HOOK_SHINY + rod_overlay_icon_state = "hook_shiny_overlay" + +/obj/item/fishing_hook/weighted + name = "weighted hook" + icon_state = "weighted" + fishing_hook_traits = FISHING_HOOK_WEIGHTED + rod_overlay_icon_state = "hook_weighted_overlay" + + +/obj/item/storage/toolbox/fishing + name = "fishing toolbox" + desc = "contains everything you need for your fishing trip" + icon_state = "fishing" + inhand_icon_state = "artistic_toolbox" + material_flags = NONE + +/obj/item/storage/toolbox/ComponentInitialize() + . = ..() + // Can hold fishing rod despite the size + var/static/list/exception_cache = typecacheof(/obj/item/fishing_rod) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.exception_hold = exception_cache + +/obj/item/storage/toolbox/fishing/PopulateContents() + new /obj/item/bait_can/worm(src) + new /obj/item/fishing_rod(src) + new /obj/item/fishing_hook(src) + new /obj/item/fishing_line(src) + +/obj/item/storage/box/fishing_hooks + name = "fishing hook set" + +/obj/item/storage/box/fishing_hooks/PopulateContents() + . = ..() + new /obj/item/fishing_hook/magnet(src) + new /obj/item/fishing_hook/shiny(src) + new /obj/item/fishing_hook/weighted(src) + +/obj/item/storage/box/fishing_lines + name = "fishing line set" + +/obj/item/storage/box/fishing_lines/PopulateContents() + . = ..() + new /obj/item/fishing_line/bouncy(src) + new /obj/item/fishing_line/reinforced(src) + new /obj/item/fishing_line/cloaked(src) diff --git a/code/modules/fishing/fishing_minigame.dm b/code/modules/fishing/fishing_minigame.dm new file mode 100644 index 00000000000..ce91cbf0332 --- /dev/null +++ b/code/modules/fishing/fishing_minigame.dm @@ -0,0 +1,215 @@ +// Lure bobbing +#define WAIT_PHASE 1 +// Click now to start tgui part +#define BITING_PHASE 2 +// UI minigame phase +#define MINIGAME_PHASE 3 +// Shortest time the minigame can be won +#define MINIMUM_MINIGAME_DURATION 140 + +/datum/fishing_challenge + /// When the ui minigame phase started + var/start_time + /// Is it finished (either by win/lose or window closing) + var/completed = FALSE + /// Fish AI type to use + var/fish_ai = FISH_AI_DUMB + /// Rule modifiers (eg weighted bait) + var/list/special_effects = list() + /// Did the game get past the baiting phase, used to track if bait should be consumed afterwards + var/bait_taken = FALSE + /// Result path + var/reward_path = FISHING_DUD + /// Minigame difficulty + var/difficulty = FISHING_DEFAULT_DIFFICULTY + // Current phase + var/phase = WAIT_PHASE + // Timer for the next phase + var/next_phase_timer + /// Fishing mob + var/mob/user + /// Rod that is used for the challenge + var/obj/item/fishing_rod/used_rod + /// Lure visual + var/obj/effect/fishing_lure/lure + /// Background image from /datum/asset/simple/fishing_minigame + var/background = "default" + + /// Max distance we can move from the spot + var/max_distance = 5 + + /// Fishing line visual + var/datum/beam/fishing_line + +/datum/fishing_challenge/New(atom/spot, reward_path, obj/item/fishing_rod/rod, mob/user) + src.user = user + src.reward_path = reward_path + src.used_rod = rod + lure = new(get_turf(spot)) + /// Fish minigame properties + if(ispath(reward_path,/obj/item/fish)) + var/obj/item/fish/fish = reward_path + fish_ai = initial(fish.fish_ai_type) + // Apply fishing trait modifiers + var/list/fish_list_properties = collect_fish_properties() + var/list/fish_traits = fish_list_properties[fish][NAMEOF(fish, fishing_traits)] + for(var/fish_trait in fish_traits) + var/datum/fishing_trait/trait = new fish_trait + special_effects += trait.minigame_mod(rod, user) + /// Enable special parameters + if(rod.line) + if(rod.line.fishing_line_traits & FISHING_LINE_BOUNCY) + special_effects += FISHING_MINIGAME_RULE_LIMIT_LOSS + if(rod.hook) + if(rod.hook.fishing_hook_traits & FISHING_HOOK_WEIGHTED) + special_effects += FISHING_MINIGAME_RULE_WEIGHTED_BAIT + +/datum/fishing_challenge/Destroy(force, ...) + if(!completed) + complete(win = FALSE) + if(fishing_line) + QDEL_NULL(fishing_line) + if(lure) + QDEL_NULL(lure) + . = ..() + +/datum/fishing_challenge/proc/start(mob/user) + /// Create fishing line visuals + fishing_line = used_rod.create_fishing_line(lure, target_py = 5) + // If fishing line breaks los / rod gets dropped / deleted + RegisterSignal(fishing_line, COMSIG_FISHING_LINE_SNAPPED, .proc/interrupt) + ADD_TRAIT(user, TRAIT_GONE_FISHING, REF(src)) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "fishing", /datum/mood_event/fishing) + RegisterSignal(user, COMSIG_MOB_CLICKON, .proc/handle_click) + start_baiting_phase() + to_chat(user, span_notice("You start fishing...")) + playsound(lure, 'sound/effects/splash.ogg', 100) + +/datum/fishing_challenge/proc/handle_click() + if(phase == WAIT_PHASE) //Reset wait + lure.balloon_alert(user, "miss!") + start_baiting_phase() + else if(phase == BITING_PHASE) + start_minigame_phase() + return COMSIG_MOB_CANCEL_CLICKON + +/datum/fishing_challenge/proc/check_distance() + SIGNAL_HANDLER + if(get_dist(user,lure) > max_distance) + interrupt() + +/// Challenge interrupted by something external +/datum/fishing_challenge/proc/interrupt() + SIGNAL_HANDLER + if(!completed) + complete(FALSE) + +/datum/fishing_challenge/proc/complete(win = FALSE, perfect_win = FALSE) + deltimer(next_phase_timer) + completed = TRUE + if(user) + UnregisterSignal(user, list(COMSIG_MOB_CLICKON, COMSIG_MOVABLE_MOVED)) + REMOVE_TRAIT(user, TRAIT_GONE_FISHING, REF(src)) + if(used_rod) + UnregisterSignal(used_rod, COMSIG_ITEM_DROPPED) + if(phase == MINIGAME_PHASE) + used_rod.consume_bait() + if(win) + // validate timings to have at least basic abuse prevention, though it's kinda impossible task here + // 140 from minimum completion bar fill time + var/minimum_time = start_time + MINIMUM_MINIGAME_DURATION + if(world.time < minimum_time) + win = FALSE + stack_trace("Fishing minimum time check failed") + if(win) + if(reward_path != FISHING_DUD) + playsound(lure, 'sound/effects/bigsplash.ogg', 100) + else + user.balloon_alert(user, "it got away") + SEND_SIGNAL(src, COMSIG_FISHING_CHALLENGE_COMPLETED, user, win, perfect_win) + qdel(src) + +/datum/fishing_challenge/proc/start_baiting_phase() + deltimer(next_phase_timer) + phase = WAIT_PHASE + //Bobbing animation + animate(lure, pixel_y = 1, time = 1 SECONDS, loop = -1, flags = ANIMATION_RELATIVE) + animate(pixel_y = -1, time = 1 SECONDS, flags = ANIMATION_RELATIVE) + //Setup next phase + var/wait_time = rand(1 SECONDS, 30 SECONDS) + next_phase_timer = addtimer(CALLBACK(src, .proc/start_biting_phase), wait_time, TIMER_STOPPABLE) + +/datum/fishing_challenge/proc/start_biting_phase() + phase = BITING_PHASE + // Trashing animation + playsound(lure, 'sound/effects/fish_splash.ogg', 100) + lure.balloon_alert(user, "!!!") + animate(lure, pixel_y = 3, time = 5, loop = -1, flags = ANIMATION_RELATIVE) + animate(pixel_y = -3, time = 5, flags = ANIMATION_RELATIVE) + // Setup next phase + var/wait_time = rand(3 SECONDS, 6 SECONDS) + next_phase_timer = addtimer(CALLBACK(src, .proc/start_baiting_phase), wait_time, TIMER_STOPPABLE) + +/datum/fishing_challenge/proc/start_minigame_phase() + phase = MINIGAME_PHASE + deltimer(next_phase_timer) + start_time = world.time + ui_interact(user) + +/datum/fishing_challenge/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Fishing") + ui.set_autoupdate(FALSE) + ui.set_mouse_hook(TRUE) + ui.open() + +/datum/fishing_challenge/ui_host(mob/user) + return lure //Could be the target really + +// Manually closing the ui is treated as lose +/datum/fishing_challenge/ui_close(mob/user) + . = ..() + if(!completed) + complete(FALSE) + +/datum/fishing_challenge/ui_static_data(mob/user) + . = ..() + .["difficulty"] = max(1,min(difficulty,100)) + .["fish_ai"] = fish_ai + .["special_effects"] = special_effects + .["background_image"] = background + +/datum/fishing_challenge/ui_assets(mob/user) + return list(get_asset_datum(/datum/asset/simple/fishing_minigame)) //preset screens + +/datum/fishing_challenge/ui_status(mob/user, datum/ui_state/state) + return min( + get_dist(user, lure) > max_distance ? UI_CLOSE : UI_INTERACTIVE, + ui_status_user_has_free_hands(user), + ui_status_user_is_abled(user, lure), + ) + +/datum/fishing_challenge/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + if(phase != MINIGAME_PHASE) + return + + switch(action) + if("win") + complete(win = TRUE, perfect_win = params["perfect"]) + if("lose") + complete(win = FALSE) + +/// The visual that appears over the fishing spot +/obj/effect/fishing_lure + icon = 'icons/obj/fishing.dmi' + icon_state = "lure_idle" + +#undef WAIT_PHASE +#undef BITING_PHASE +#undef MINIGAME_PHASE +#undef MINIMUM_MINIGAME_DURATION diff --git a/code/modules/fishing/fishing_portal_machine.dm b/code/modules/fishing/fishing_portal_machine.dm new file mode 100644 index 00000000000..3fc6b0eb938 --- /dev/null +++ b/code/modules/fishing/fishing_portal_machine.dm @@ -0,0 +1,48 @@ +/obj/machinery/fishing_portal_generator + name = "fish-porter 3000" + desc = "fishing anywhere, anytime, anyway what was i talking about" + + icon = 'icons/obj/fishing.dmi' + icon_state = "portal_off" + + idle_power_usage = 0 + active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 + + anchored = FALSE + density = TRUE + + var/fishing_source = /datum/fish_source/portal + var/datum/component/fishing_spot/active + +/obj/machinery/fishing_portal_generator/wrench_act(mob/living/user, obj/item/tool) + . = ..() + default_unfasten_wrench(user, tool) + return TOOL_ACT_TOOLTYPE_SUCCESS + +/obj/machinery/fishing_portal_generator/interact(mob/user, special_state) + . = ..() + if(active) + deactivate() + else + activate() + +/obj/machinery/fishing_portal_generator/update_icon(updates) + . = ..() + if(active) + icon_state = "portal_on" + else + icon_state = "portal_off" + +/obj/machinery/fishing_portal_generator/proc/activate() + active = AddComponent(/datum/component/fishing_spot, fishing_source) + use_power = ACTIVE_POWER_USE + update_icon() + +/obj/machinery/fishing_portal_generator/proc/deactivate() + QDEL_NULL(active) + use_power = IDLE_POWER_USE + update_icon() + +/obj/machinery/fishing_portal_generator/on_set_is_operational(old_value) + if(old_value) + deactivate() diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm new file mode 100644 index 00000000000..66700957e7a --- /dev/null +++ b/code/modules/fishing/fishing_rod.dm @@ -0,0 +1,484 @@ +#define ROD_SLOT_BAIT "bait" +#define ROD_SLOT_LINE "line" +#define ROD_SLOT_HOOK "hook" + +/obj/item/fishing_rod + name = "fishing rod" + desc = "You can fish with this." + icon = 'icons/obj/fishing.dmi' + icon_state = "fishing_rod" + lefthand_file = 'icons/mob/inhands/equipment/fishing_rod_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/fishing_rod_righthand.dmi' + inhand_icon_state = "rod" + inhand_x_dimension = 64 + inhand_y_dimension = 64 + force = 8 + w_class = WEIGHT_CLASS_HUGE + + /// How far can you cast this + var/cast_range = 5 + /// Fishing minigame difficulty modifier (additive) + var/difficulty_modifier = 0 + /// Explaination of rod functionality shown in the ui + var/ui_description = "A classic fishing rod, with no special qualities." + + var/obj/item/bait + var/obj/item/fishing_line/line + var/obj/item/fishing_hook/hook + + /// Currently hooked item for item reeling + var/obj/item/currently_hooked_item + + /// Fishing line visual for the hooked item + var/datum/beam/hooked_item_fishing_line + + /// Are we currently casting + var/casting = FALSE + + /// List of fishing line beams + var/list/fishing_lines = list() + + var/default_line_color = "gray" + +/obj/item/fishing_rod/Initialize(mapload) + . = ..() + register_context() + register_item_context() + +/obj/item/fishing_rod/add_context(atom/source, list/context, obj/item/held_item, mob/user) + if(src == held_item) + if(currently_hooked_item) + context[SCREENTIP_CONTEXT_LMB] = "Reel in" + context[SCREENTIP_CONTEXT_RMB] = "Modify" + return CONTEXTUAL_SCREENTIP_SET + return NONE + +/obj/item/fishing_rod/add_item_context(obj/item/source, list/context, atom/target, mob/living/user) + . = ..() + if(currently_hooked_item) + context[SCREENTIP_CONTEXT_LMB] = "Reel in" + return CONTEXTUAL_SCREENTIP_SET + return NONE + +/obj/item/fishing_rod/Destroy(force) + . = ..() + //Remove any leftover fishing lines + QDEL_LIST(fishing_lines) + + +/// Catch weight modifier for the given fish_type (or FISHING_DUD), additive +/obj/item/fishing_rod/proc/fish_bonus(fish_type) + return 0 + +/obj/item/fishing_rod/proc/consume_bait() + if(bait) + QDEL_NULL(bait) + update_icon() + +/obj/item/fishing_rod/interact(mob/user) + if(currently_hooked_item) + reel(user) + +/obj/item/fishing_rod/proc/reel(mob/user) + //Could use sound here for feedback + if(do_after(user, 1 SECONDS, currently_hooked_item)) + // Should probably respect and used force move later + step_towards(currently_hooked_item, get_turf(src)) + if(get_dist(currently_hooked_item,get_turf(src)) < 1) + clear_hooked_item() + +/obj/item/fishing_rod/attack_self_secondary(mob/user, modifiers) + . = ..() + ui_interact(user) + +/obj/item/fishing_rod/pre_attack(atom/targeted_atom, mob/living/user, params) + . = ..() + /// Reel in if able + if(currently_hooked_item) + reel(user) + return TRUE + SEND_SIGNAL(targeted_atom, COMSIG_PRE_FISHING) + +/// Generates the fishing line visual from the current user to the target and updates inhands +/obj/item/fishing_rod/proc/create_fishing_line(atom/movable/target, target_py = null) + var/mob/user = loc + if(!istype(user)) + return + var/beam_color = line?.line_color || default_line_color + var/datum/beam/fishing_line/fishing_line_beam = new(user, target, icon_state = "fishing_line", beam_color = beam_color, override_target_pixel_y = target_py) + fishing_line_beam.lefthand = user.get_held_index_of_item(src) % 2 == 1 + RegisterSignal(fishing_line_beam, COMSIG_BEAM_BEFORE_DRAW, .proc/check_los) + RegisterSignal(fishing_line_beam, COMSIG_PARENT_QDELETING, .proc/clear_line) + fishing_lines += fishing_line_beam + INVOKE_ASYNC(fishing_line_beam, /datum/beam/.proc/Start) + user.update_inv_hands() + return fishing_line_beam + +/obj/item/fishing_rod/proc/clear_line(datum/source) + SIGNAL_HANDLER + fishing_lines -= source + if(ismob(loc)) + var/mob/user = loc + user.update_inv_hands() + +/obj/item/fishing_rod/dropped(mob/user, silent) + . = ..() + if(currently_hooked_item) + clear_hooked_item() + for(var/datum/beam/fishing_line in fishing_lines) + SEND_SIGNAL(fishing_line, COMSIG_FISHING_LINE_SNAPPED) + QDEL_LIST(fishing_lines) + +/// Hooks the item +/obj/item/fishing_rod/proc/hook_item(mob/user, atom/target_atom) + if(currently_hooked_item) + return + if(!can_be_hooked(target_atom)) + return + currently_hooked_item = target_atom + hooked_item_fishing_line = create_fishing_line(target_atom) + RegisterSignal(hooked_item_fishing_line, COMSIG_FISHING_LINE_SNAPPED, .proc/clear_hooked_item) + +/// Checks what can be hooked +/obj/item/fishing_rod/proc/can_be_hooked(atom/movable/target) + // Could be made dependent on actual hook, ie magnet to hook metallic items + return istype(target, /obj/item) + +/obj/item/fishing_rod/proc/clear_hooked_item() + SIGNAL_HANDLER + + if(!QDELETED(hooked_item_fishing_line)) + QDEL_NULL(hooked_item_fishing_line) + currently_hooked_item = null + +// Checks fishing line for interruptions and range +/obj/item/fishing_rod/proc/check_los(datum/beam/source) + SIGNAL_HANDLER + . = NONE + + if(!CheckToolReach(src, source.target, cast_range)) + SEND_SIGNAL(source, COMSIG_FISHING_LINE_SNAPPED) //Stepped out of range or los interrupted + return BEAM_CANCEL_DRAW + +/obj/item/fishing_rod/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + + /// Reel in if able + if(currently_hooked_item) + reel(user) + return + + /// If the line to whatever that is is clear and we're not already busy, try fishing in it + if(!casting && !currently_hooked_item && !proximity_flag && CheckToolReach(user, target, cast_range)) + /// Annoyingly pre attack is only called in melee + SEND_SIGNAL(target, COMSIG_PRE_FISHING) + casting = TRUE + var/obj/projectile/fishing_cast/cast_projectile = new(get_turf(src)) + cast_projectile.range = cast_range + cast_projectile.owner = src + cast_projectile.original = target + cast_projectile.fired_from = src + cast_projectile.firer = user + cast_projectile.impacted = list(user = TRUE) + cast_projectile.preparePixelProjectile(target, user) + cast_projectile.fire() + +/// Called by hook projectile when hitting things +/obj/item/fishing_rod/proc/hook_hit(atom/atom_hit_by_hook_projectile) + var/mob/user = loc + if(!istype(user)) + return + if(SEND_SIGNAL(atom_hit_by_hook_projectile, COMSIG_FISHING_ROD_CAST, src, user) & FISHING_ROD_CAST_HANDLED) + return + /// If you can't fish in it, try hooking it + hook_item(user, atom_hit_by_hook_projectile) + +/obj/item/fishing_rod/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "FishingRod", name) + ui.set_autoupdate(FALSE) + ui.open() + +/obj/item/fishing_rod/update_overlays() + . = ..() + var/line_color = line?.line_color || default_line_color + /// Line part by the rod, always visible + var/mutable_appearance/reel_overlay = mutable_appearance(icon, "reel_overlay") + reel_overlay.color = line_color; + . += reel_overlay + + // Line & hook is also visible when only bait is equipped but it uses default appearances then + if(hook || bait) + var/mutable_appearance/line_overlay = mutable_appearance(icon, "line_overlay") + line_overlay.color = line_color; + . += line_overlay + var/mutable_appearance/hook_overlay = mutable_appearance(icon, hook?.rod_overlay_icon_state || "hook_overlay") + . += hook_overlay + + if(bait) + var/bait_state = "worm_overlay" //default to worm overlay for anything without specific one + if(istype(bait, /obj/item/food/bait)) + var/obj/item/food/bait/real_bait = bait + bait_state = real_bait.rod_overlay_icon_state + . += bait_state + +/obj/item/fishing_rod/worn_overlays(mutable_appearance/standing, isinhands, icon_file) + . = ..() + var/line_color = line?.line_color || default_line_color + var/mutable_appearance/reel_overlay = mutable_appearance(icon_file, "reel_overlay") + reel_overlay.appearance_flags |= RESET_COLOR + reel_overlay.color = line_color + . += reel_overlay + /// if we don't have anything hooked show the dangling hook & line + if(isinhands && length(fishing_lines) == 0) + var/mutable_appearance/line_overlay = mutable_appearance(icon_file, "line_overlay") + line_overlay.appearance_flags |= RESET_COLOR + line_overlay.color = line_color + . += line_overlay + . += mutable_appearance(icon_file, "hook_overlay") + +/obj/item/fishing_rod/attackby(obj/item/attacking_item, mob/user, params) + if(slot_check(attacking_item,ROD_SLOT_LINE)) + use_slot(ROD_SLOT_LINE, user, attacking_item) + SStgui.update_uis(src) + return TRUE + else if(slot_check(attacking_item,ROD_SLOT_HOOK)) + use_slot(ROD_SLOT_HOOK, user, attacking_item) + SStgui.update_uis(src) + return TRUE + else if(slot_check(attacking_item,ROD_SLOT_BAIT)) + use_slot(ROD_SLOT_BAIT, user, attacking_item) + SStgui.update_uis(src) + return TRUE + else if(istype(attacking_item, /obj/item/bait_can)) //Quicker filling from bait can + var/obj/item/bait_can/can = attacking_item + var/bait = can.retrieve_bait(user) + if(bait) + use_slot(ROD_SLOT_BAIT, user, bait) + SStgui.update_uis(src) + return TRUE + . = ..() + +/obj/item/fishing_rod/ui_data(mob/user) + . = ..() + var/list/data = list() + + data["bait_name"] = format_text(bait?.name) + data["bait_icon"] = bait != null ? icon2base64(icon(bait.icon, bait.icon_state)) : null + + data["line_name"] = format_text(line?.name) + data["line_icon"] = line != null ? icon2base64(icon(line.icon, line.icon_state)) : null + + data["hook_name"] = format_text(hook?.name) + data["hook_icon"] = hook != null ? icon2base64(icon(hook.icon, hook.icon_state)) : null + + data["description"] = ui_description + + return data + +/// Checks if the item fits the slot +/obj/item/fishing_rod/proc/slot_check(obj/item/item,slot) + if(!istype(item)) + return FALSE + switch(slot) + if(ROD_SLOT_HOOK) + if(!istype(item,/obj/item/fishing_hook)) + return FALSE + if(ROD_SLOT_LINE) + if(!istype(item,/obj/item/fishing_line)) + return FALSE + if(ROD_SLOT_BAIT) + if(!HAS_TRAIT(item, FISHING_BAIT_TRAIT)) + return FALSE + return TRUE + +/obj/item/fishing_rod/ui_act(action, list/params) + . = ..() + if(.) + return . + var/mob/user = usr + switch(action) + if("slot_action") + // Simple click with empty hand to remove, click with item to insert/switch + var/obj/item/held_item = user.get_active_held_item() + if(held_item == src) + return + use_slot(params["slot"], user, held_item) + return TRUE + +/// Ideally this will be replaced with generic slotted storage datum + display +/obj/item/fishing_rod/proc/use_slot(slot, mob/user, obj/item/new_item) + var/obj/item/current_item + switch(slot) + if(ROD_SLOT_BAIT) + current_item = bait + if(ROD_SLOT_HOOK) + current_item = hook + if(ROD_SLOT_LINE) + current_item = line + if(!new_item && !current_item) + return + // Trying to remove the item + if(!new_item && current_item) + user.put_in_hands(current_item) + update_icon() + return + // Trying to insert item into empty slot + if(new_item && !current_item) + if(!slot_check(new_item, slot)) + return + if(user.transferItemToLoc(new_item,src)) + switch(slot) + if(ROD_SLOT_BAIT) + bait = new_item + if(ROD_SLOT_HOOK) + hook = new_item + if(ROD_SLOT_LINE) + line = new_item + update_icon() + /// Trying to swap item + if(new_item && current_item) + if(!slot_check(new_item,slot)) + return + if(user.transferItemToLoc(new_item,src)) + switch(slot) + if(ROD_SLOT_BAIT) + bait = new_item + if(ROD_SLOT_HOOK) + hook = new_item + if(ROD_SLOT_LINE) + line = new_item + user.put_in_hands(current_item) + update_icon() + + +/obj/item/fishing_rod/Exited(atom/movable/gone, direction) + . = ..() + if(gone == bait) + bait = null + if(gone == line) + line = null + if(gone == hook) + hook = null + +/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. \"中国航天制造\"" + difficulty_modifier = -10 + ui_description = "This rods makes fishing easy even for an absolute beginner." + icon_state = "fishing_rod_master" + + +/obj/item/fishing_rod/tech + name = "advanced fishing rod" + desc = "An embedded universal constructor along with micro-fusion generator makes this marvel of technology never run out of bait. Interstellar treaties prevent using it outside of recreational fishing. And you can fish with this. " + ui_description = "This rod has an infinite supply of synthetic bait." + icon_state = "fishing_rod_science" + +/obj/item/fishing_rod/tech/Initialize(mapload) + . = ..() + var/obj/item/food/bait/doughball/synthetic/infinite_supply_of_bait = new(src) + bait = infinite_supply_of_bait + update_icon() + +/obj/item/fishing_rod/tech/consume_bait() + return + +/obj/item/fishing_rod/tech/use_slot(slot, mob/user, obj/item/new_item) + if(slot == ROD_SLOT_BAIT) + return + return ..() + +#undef ROD_SLOT_BAIT +#undef ROD_SLOT_LINE +#undef ROD_SLOT_HOOK + +/obj/projectile/fishing_cast + name = "fishing hook" + icon = 'icons/obj/fishing.dmi' + icon_state = "hook_projectile" + damage = 0 + nodamage = TRUE + range = 5 + suppressed = SUPPRESSED_VERY + can_hit_turfs = TRUE + + var/obj/item/fishing_rod/owner + var/datum/beam/our_line + +/obj/projectile/fishing_cast/Impact(atom/hit_atom) + . = ..() + owner.hook_hit(hit_atom) + qdel(src) + +/obj/projectile/fishing_cast/fire(angle, atom/direct_target) + . = ..() + our_line = owner.create_fishing_line(src) + +/obj/projectile/fishing_cast/Destroy() + . = ..() + QDEL_NULL(our_line) + owner?.casting = FALSE + + + +/datum/beam/fishing_line + // Is the fishing rod held in left side hand + var/lefthand = FALSE + +/datum/beam/fishing_line/Start() + update_offsets(origin.dir) + . = ..() + RegisterSignal(origin, COMSIG_ATOM_DIR_CHANGE, .proc/handle_dir_change) + +/datum/beam/fishing_line/Destroy() + UnregisterSignal(origin, COMSIG_ATOM_DIR_CHANGE) + . = ..() + +/datum/beam/fishing_line/proc/handle_dir_change(atom/movable/source, olddir, newdir) + SIGNAL_HANDLER + update_offsets(newdir) + INVOKE_ASYNC(src, /datum/beam/.proc/redrawing) + +/datum/beam/fishing_line/proc/update_offsets(user_dir) + switch(user_dir) + if(SOUTH) + override_origin_pixel_x = lefthand ? lefthand_s_px : righthand_s_px + override_origin_pixel_y = lefthand ? lefthand_s_py : righthand_s_py + if(EAST) + override_origin_pixel_x = lefthand ? lefthand_e_px : righthand_e_px + override_origin_pixel_y = lefthand ? lefthand_e_py : righthand_e_py + if(WEST) + override_origin_pixel_x = lefthand ? lefthand_w_px : righthand_w_px + override_origin_pixel_y = lefthand ? lefthand_w_py : righthand_w_py + if(NORTH) + override_origin_pixel_x = lefthand ? lefthand_n_px : righthand_n_px + override_origin_pixel_y = lefthand ? lefthand_n_py : righthand_n_py + +// Make these inline with final sprites +/datum/beam/fishing_line + var/righthand_s_px = 13 + var/righthand_s_py = 16 + + var/righthand_e_px = 18 + var/righthand_e_py = 16 + + var/righthand_w_px = -20 + var/righthand_w_py = 18 + + var/righthand_n_px = -14 + var/righthand_n_py = 16 + + var/lefthand_s_px = -13 + var/lefthand_s_py = 15 + + var/lefthand_e_px = 24 + var/lefthand_e_py = 18 + + var/lefthand_w_px = -17 + var/lefthand_w_py = 16 + + var/lefthand_n_px = 13 + var/lefthand_n_py = 15 + diff --git a/code/modules/fishing/fishing_traits.dm b/code/modules/fishing/fishing_traits.dm new file mode 100644 index 00000000000..3a58ae5157c --- /dev/null +++ b/code/modules/fishing/fishing_traits.dm @@ -0,0 +1,82 @@ +/datum/fishing_trait + /// Description of the trait in the fishing catalog + var/catalog_description + +/// Difficulty modifier from this mod, needs to return a list with two values +/datum/fishing_trait/proc/difficulty_mod(obj/item/fishing_rod/rod, mob/fisherman) + SHOULD_CALL_PARENT(TRUE) //Technically it doesn't but this makes it saner without custom unit test + return list(ADDITIVE_FISHING_MOD = 0, MULTIPLICATIVE_FISHING_MOD = 1) + +/// Catch weight table modifier from this mod, needs to return a list with two values +/datum/fishing_trait/proc/catch_weight_mod(obj/item/fishing_rod/rod, mob/fisherman) + SHOULD_CALL_PARENT(TRUE) + return list(ADDITIVE_FISHING_MOD = 0, MULTIPLICATIVE_FISHING_MOD = 1) + +/// Returns special minigame rules applied by this trait +/datum/fishing_trait/proc/minigame_mod(obj/item/fishing_rod/rod, mob/fisherman) + return list() + +/datum/fishing_trait/wary + catalog_description = "This fish will avoid visible fish lines, cloaked line recommended." + +/datum/fishing_trait/wary/difficulty_mod(obj/item/fishing_rod/rod, mob/fisherman) + . = ..() + // Wary fish require transparent line or they're harder + if(!rod.line || !(rod.line.fishing_line_traits & FISHING_LINE_CLOAKED)) + .[ADDITIVE_FISHING_MOD] = -FISH_TRAIT_MINOR_DIFFICULTY_BOOST + +/datum/fishing_trait/shiny_lover + catalog_description = "This fish loves shiny things, shiny lure recommended." + +/datum/fishing_trait/shiny_lover/difficulty_mod(obj/item/fishing_rod/rod, mob/fisherman) + . = ..() + // These fish are easier to catch with shiny lure + if(rod.hook && rod.hook.fishing_hook_traits & FISHING_HOOK_SHINY) + .[ADDITIVE_FISHING_MOD] = FISH_TRAIT_MINOR_DIFFICULTY_BOOST + +/datum/fishing_trait/picky_eater + catalog_description = "This fish is very picky and will ignore low quality bait." + +/datum/fishing_trait/picky_eater/catch_weight_mod(obj/item/fishing_rod/rod, mob/fisherman) + . = ..() + if(!rod.bait || !(HAS_TRAIT(rod.bait, GOOD_QUALITY_BAIT_TRAIT) || HAS_TRAIT(rod.bait, GREAT_QUALITY_BAIT_TRAIT))) + .[MULTIPLICATIVE_FISHING_MOD] = 0 + + +/datum/fishing_trait/nocturnal + catalog_description = "This fish avoids bright lights, fishing in darkness recommended." + +/datum/fishing_trait/nocturnal/catch_weight_mod(obj/item/fishing_rod/rod, mob/fisherman) + . = ..() + var/turf/T = get_turf(fisherman) + var/light_amount = T.get_lumcount() + if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) + .[MULTIPLICATIVE_FISHING_MOD] = 0 + + +/datum/fishing_trait/heavy + catalog_description = "This fish tends to stay near the waterbed."; + +/datum/fishing_trait/heavy/minigame_mod(obj/item/fishing_rod/rod, mob/fisherman) + return list(FISHING_MINIGAME_RULE_HEAVY_FISH) + + +/datum/fishing_trait/carnivore + catalog_description = "This fish can only be baited with meat." + +/datum/fishing_trait/carnivore/catch_weight_mod(obj/item/fishing_rod/rod, mob/fisherman) + . = ..() + .[MULTIPLICATIVE_FISHING_MOD] = 0 + if(rod.bait && istype(rod.bait, /obj/item/food)) + var/obj/item/food/food_bait = rod.bait + if(food_bait.foodtypes & MEAT) + .[MULTIPLICATIVE_FISHING_MOD] = 1 + +/datum/fishing_trait/vegan + catalog_description = "This fish can only be baited with fresh produce." + +/datum/fishing_trait/vegan/catch_weight_mod(obj/item/fishing_rod/rod, mob/fisherman) + . = ..() + .[MULTIPLICATIVE_FISHING_MOD] = 0 + if(rod.bait && istype(rod.bait, /obj/item/food/grown)) + .[MULTIPLICATIVE_FISHING_MOD] = 1 diff --git a/code/modules/fishing/sources/_fish_source.dm b/code/modules/fishing/sources/_fish_source.dm new file mode 100644 index 00000000000..f27d4aed837 --- /dev/null +++ b/code/modules/fishing/sources/_fish_source.dm @@ -0,0 +1,198 @@ +/// Keyed list of preset sources to configuration instance +GLOBAL_LIST_INIT(preset_fish_sources,init_fishing_configurations()) + +/// These are shared between their spots +/proc/init_fishing_configurations() + . = list() + + var/datum/fish_source/ocean/beach/beach_preset = new + .[FISHING_SPOT_PRESET_BEACH] = beach_preset + + var/datum/fish_source/lavaland/lava_preset = new + .[FISHING_SPOT_PRESET_LAVALAND_LAVA] = lava_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 + var/list/fish_table = list() + /// 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() + /// Text shown as baloon alert when you roll a dud in the table + var/duds = list("it was nothing", "the hook is empty") + /// Baseline difficulty for fishing in this spot + var/fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + /// How the spot type is described in fish catalog section about fish sources, will be skipped if null + var/catalog_description + /// Background image name from /datum/asset/simple/fishing_minigame + var/background = "fishing_background_default" + +/// Can we fish in this spot at all. Returns DENIAL_REASON or null if we're good to go +/datum/fish_source/proc/can_fish(obj/item/fishing_rod/rod, mob/fisherman) + return + + +/// DIFFICULTY = (SPOT_BASE_VALUE + FISH_MODIFIER + ROD_MODIFIER + FAV/DISLIKED_BAIT_MODIFIER + TRAITS_ADDITIVE) * TRAITS_MULTIPLICATIVE , For non-fish it's just SPOT_BASE_VALUE +/datum/fish_source/proc/calculate_difficulty(result, obj/item/fishing_rod/rod, mob/fisherman) + . = fishing_difficulty + + if(!ispath(result,/obj/item/fish)) + // In the future non-fish rewards can have variable difficulty calculated here + return + + var/list/fish_list_properties = collect_fish_properties() + var/obj/item/fish/caught_fish = result + // Baseline fish difficulty + . += initial(caught_fish.fishing_difficulty_modifier) + . += rod.difficulty_modifier + + if(rod.bait) + var/obj/item/bait = rod.bait + //Fav bait makes it easier + var/list/fav_bait = fish_list_properties[caught_fish][NAMEOF(caught_fish, favorite_bait)] + for(var/bait_identifer in fav_bait) + if(is_matching_bait(bait, bait_identifer)) + . += FAV_BAIT_DIFFICULTY_MOD + break + //Disliked bait makes it harder + var/list/disliked_bait = fish_list_properties[caught_fish][NAMEOF(caught_fish, disliked_bait)] + for(var/bait_identifer in disliked_bait) + if(is_matching_bait(bait, bait_identifer)) + . += DISLIKED_BAIT_DIFFICULTY_MOD + break + + // Matching/not matching fish traits and equipment + var/list/fish_traits = fish_list_properties[caught_fish][NAMEOF(caught_fish, fishing_traits)] + + var/additive_mod = 0 + var/multiplicative_mod = 1 + for(var/fish_trait in fish_traits) + var/datum/fishing_trait/trait = new fish_trait + var/list/mod = trait.difficulty_mod(rod, fisherman) + additive_mod += mod[ADDITIVE_FISHING_MOD] + multiplicative_mod *= mod[MULTIPLICATIVE_FISHING_MOD] + + . += additive_mod + . *= multiplicative_mod + +/// In case you want more complex rules for specific spots +/datum/fish_source/proc/roll_reward(obj/item/fishing_rod/rod, mob/fisherman) + return pick_weight(get_modified_fish_table(rod,fisherman)) + +/// Gives out the reward if possible +/datum/fish_source/proc/dispense_reward(reward_path, mob/fisherman) + if((reward_path in fish_counts)) // This is limited count result + if(fish_counts[reward_path] > 0) + fish_counts[reward_path] -= 1 + else + 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 + if(ispath(reward_path,/obj/item/fish)) + var/obj/item/fish/caught_fish = reward + caught_fish.randomize_weight_and_size() + //fish caught signal if needed goes here and/or fishing achievements + //Try to put it in hand + fisherman.put_in_hands(reward) + fisherman.balloon_alert(fisherman, "caught [reward]!") + else //If someone adds fishing out carp/chests/singularities or whatever just plop it down on the fisher's turf + fisherman.balloon_alert(fisherman, "caught something!") + new reward_path(get_turf(fisherman)) + else if (reward_path == FISHING_DUD) + //baloon alert instead + fisherman.balloon_alert(fisherman,pick(duds)) + +/// Cached fish list properties so we don't have to initalize fish every time, init deffered +GLOBAL_LIST(fishing_property_cache) + +/// Awful workaround around initial(x.list_variable) not being a thing while trying to keep some semblance of being structured +/proc/collect_fish_properties() + if(GLOB.fishing_property_cache == null) + var/list/fish_property_table = list() + for(var/fish_type in subtypesof(/obj/item/fish)) + var/obj/item/fish/fish = new fish_type(null) + fish_property_table[fish_type] = list() + fish_property_table[fish_type][NAMEOF(fish, favorite_bait)] = fish.favorite_bait.Copy() + fish_property_table[fish_type][NAMEOF(fish, disliked_bait)] = fish.disliked_bait.Copy() + fish_property_table[fish_type][NAMEOF(fish, fishing_traits)] = fish.fishing_traits.Copy() + QDEL_NULL(fish) + GLOB.fishing_property_cache = fish_property_table + return GLOB.fishing_property_cache + +/// Checks if bait matches identifier from fav/disliked bait list +/datum/fish_source/proc/is_matching_bait(obj/item/bait, identifier) + if(ispath(identifier)) //Just a path + return istype(bait, identifier) + if(islist(identifier)) + var/list/special_identifier = identifier + switch(special_identifier["Type"]) + if("Foodtype") + var/obj/item/food/food_bait = bait + return istype(food_bait) && food_bait.foodtypes & special_identifier["Value"] + else + CRASH("Unknown bait identifier in fish favourite/disliked list") + else + return HAS_TRAIT(bait, identifier) + +/// Builds a fish weights table modified by bait/rod/user properties +/datum/fish_source/proc/get_modified_fish_table(obj/item/fishing_rod/rod, mob/fisherman) + var/obj/item/bait = rod.bait + + var/list/fish_list_properties = collect_fish_properties() + + var/list/final_table = fish_table.Copy() + for(var/result in final_table) + if((result in fish_counts) && fish_counts[result] <= 0) //ran out of these, ignore + final_table -= result + continue + final_table[result] += rod.fish_bonus(result) //Decide on order here so it can be multiplicative + if(result == FISHING_DUD) + //Modify dud result + //Bait quality reduces dud chance heavily. + if(bait) + if(HAS_TRAIT(bait, GREAT_QUALITY_BAIT_TRAIT)) + final_table[result] *= 0.1 + else if(HAS_TRAIT(bait, GOOD_QUALITY_BAIT_TRAIT)) + final_table[result] *= 0.3 + else if(HAS_TRAIT(bait, BASIC_QUALITY_BAIT_TRAIT)) + final_table[result] *= 0.5 + else + final_table[result] *= 10 //Fishing without bait is not going to be easy + else if(ispath(result, /obj/item/fish)) + //Modify fish roll chance + var/obj/item/fish/caught_fish = result + + if(bait) + //Bait matching likes doubles the chance + var/list/fav_bait = fish_list_properties[result][NAMEOF(caught_fish, favorite_bait)] + for(var/bait_identifer in fav_bait) + if(is_matching_bait(bait, bait_identifer)) + final_table[result] *= 2 + break // could compound possibly + //Bait matching dislikes + var/list/disliked_bait = fish_list_properties[result][NAMEOF(caught_fish, disliked_bait)] + for(var/bait_identifer in disliked_bait) + if(is_matching_bait(bait, bait_identifer)) + final_table[result] *= 0.5 + break // same question as above + + // Apply fishing trait modifiers + var/list/fish_traits = fish_list_properties[caught_fish][NAMEOF(caught_fish, fishing_traits)] + var/additive_mod = 0 + var/multiplicative_mod = 1 + for(var/fish_trait in fish_traits) + var/datum/fishing_trait/trait = new fish_trait + var/list/mod = trait.catch_weight_mod(rod, fisherman) + additive_mod += mod[ADDITIVE_FISHING_MOD] + multiplicative_mod *= mod[MULTIPLICATIVE_FISHING_MOD] + + final_table[result] += additive_mod + final_table[result] *= multiplicative_mod + + else + //Modify other paths chance + if(rod.hook && rod.hook.fishing_hook_traits & FISHING_HOOK_MAGNETIC) + final_table[result] *= 5 + if(final_table[result] <= 0) + final_table -= result + return final_table diff --git a/code/modules/fishing/sources/source_types.dm b/code/modules/fishing/sources/source_types.dm new file mode 100644 index 00000000000..9b626de6956 --- /dev/null +++ b/code/modules/fishing/sources/source_types.dm @@ -0,0 +1,54 @@ +/datum/fish_source/ocean + fish_table = list( + FISHING_DUD = 15, + /obj/item/coin/gold = 5, + /obj/item/fish/clownfish = 15, + /obj/item/fish/pufferfish = 15, + /obj/item/fish/cardinal = 15, + /obj/item/fish/greenchromis = 15, + /obj/item/fish/lanternfish = 5 + ) + fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 5 + +/datum/fish_source/ocean/beach + catalog_description = "Beach shore water" + +/datum/fish_source/portal + fish_table = list( + FISHING_DUD = 5, + /obj/item/fish/goldfish = 10, + /obj/item/fish/guppy = 10, + ) + catalog_description = "Fish dimension (Fishing portal generator)" + +/datum/fish_source/lavaland + catalog_description = "Lava vents" + background = "fishing_background_lavaland" + fish_table = list( + FISHING_DUD = 5, + /obj/item/stack/ore/slag = 20, + /obj/structure/closet/crate/necropolis/tendril = 1, + /obj/effect/mob_spawn/corpse/human/charredskeleton = 1 + ) + fish_counts = list( + /obj/structure/closet/crate/necropolis/tendril = 1 + ) + + fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 10 + +/datum/fish_source/lavaland/can_fish(obj/item/fishing_rod/rod, mob/fisherman) + . = ..() + var/turf/approx = get_turf(fisherman) //todo pass the parent + if(!SSmapping.level_trait(approx.z, ZTRAIT_MINING)) + return "There doesn't seem to be anything to catch here." + if(!rod.line || !(rod.line.fishing_line_traits & FISHING_LINE_REINFORCED)) + return "You'll need reinforced fishing line to fish in there" + + +/datum/fish_source/moisture_trap + catalog_description = "moisture trap basins" + fish_table = list( + FISHING_DUD = 20, + /obj/item/fish/ratfish = 10 + ) + fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 10 diff --git a/code/modules/keybindings/setup.dm b/code/modules/keybindings/setup.dm index de07c952c72..79baf2e195c 100644 --- a/code/modules/keybindings/setup.dm +++ b/code/modules/keybindings/setup.dm @@ -32,6 +32,12 @@ var/command = macro_set[key] winset(src, "default-[REF(key)]", "parent=default;name=[key];command=[command]") + //Reactivate any active tgui windows mouse passthroughs macros + for(var/datum/tgui_window/window in tgui_windows) + if(window.mouse_event_macro_set) + window.mouse_event_macro_set = FALSE + window.set_mouse_macro() + if(hotkeys) winset(src, null, "input.focus=true input.background-color=[COLOR_INPUT_ENABLED]") else diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 8028f6d0e45..a59f350c938 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -182,6 +182,8 @@ var/static/list/projectile_connections = list( COMSIG_ATOM_ENTERED = .proc/on_entered, ) + /// If true directly targeted turfs can be hit + var/can_hit_turfs = FALSE /obj/projectile/Initialize(mapload) . = ..() @@ -494,7 +496,7 @@ /obj/projectile/proc/can_hit_target(atom/target, direct_target = FALSE, ignore_loc = FALSE, cross_failed = FALSE) if(QDELETED(target) || impacted[target]) return FALSE - if(!ignore_loc && (loc != target.loc)) + if(!ignore_loc && (loc != target.loc) && !(can_hit_turfs && direct_target && loc == target)) return FALSE // if pass_flags match, pass through entirely - unless direct target is set. if((target.pass_flags_self & pass_flags) && !direct_target) @@ -511,7 +513,7 @@ return TRUE if(!isliving(target)) if(isturf(target)) // non dense turfs - return FALSE + return can_hit_turfs && direct_target if(target.layer < hit_threshhold) return FALSE else if(!direct_target) // non dense objects do not get hit unless specifically clicked diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 10505e89af5..7a2777d8bd0 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -1288,3 +1288,11 @@ materials = list(/datum/material/iron = 100, /datum/material/glass = 500) build_path = /obj/item/electronics/tracker category = list("initial", "Electronics", "Construction") + +/datum/design/fishing_rod_basic + name = "Fishing Rod" + id = "fishing_rod" + build_type = AUTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = 200, /datum/material/glass = 200) + build_path = /obj/item/fishing_rod + category = list("initial", "Misc", "Equipment") diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index f168e7c6adc..abcc07164ab 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -719,3 +719,15 @@ build_path = /obj/item/plate/oven_tray category = list("initial","Equipment") departmental_flags = DEPARTMENT_BITFLAG_SERVICE + +///////////////////////////////////////// +/////////Fishing Equipment/////////////// +///////////////////////////////////////// + +/datum/design/fishing_rod_tech + name = "Advanced Fishing Rod" + id = "fishing_rod_tech" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/uranium = 1000, /datum/material/plastic = 2000) + build_path = /obj/item/fishing_rod/tech + category = list("Equipment") diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 1730b508c14..185b213bb97 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -1279,7 +1279,7 @@ "cybernetic_stomach_tier2", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) - + /datum/techweb_node/cyber_organs_upgraded id = "cyber_organs_upgraded" @@ -2255,6 +2255,18 @@ hidden = TRUE experimental = TRUE +/datum/techweb_node/fishing + id = "fishing" + display_name = "Fishing Technology" + description = "Cutting edge fishing advancements." + prereq_ids = list("base") + design_ids = list( + "fishing_rod_tech" + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + hidden = TRUE + experimental = TRUE + //Helpers for debugging/balancing the techweb in its entirety! /proc/total_techweb_points() var/list/datum/techweb_node/processing = list() diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm index dff46365f48..cace17568c9 100644 --- a/code/modules/tgui/tgui.dm +++ b/code/modules/tgui/tgui.dm @@ -37,6 +37,8 @@ var/datum/ui_state/state = null /// Rate limit client refreshes to prevent DoS. COOLDOWN_DECLARE(refresh_cooldown) + /// Are byond mouse events beyond the window passed in to the ui + var/mouse_hooked = FALSE /** * public @@ -110,6 +112,8 @@ window.send_message("update", get_payload( with_data = TRUE, with_static_data = TRUE)) + if(mouse_hooked) + window.set_mouse_macro() SStgui.on_open(src) return TRUE @@ -148,6 +152,18 @@ /datum/tgui/proc/set_autoupdate(autoupdate) src.autoupdate = autoupdate +/** + * public + * + * Enable/disable passing through byond mouse events to the window + * + * required value bool Enable/disable hooking. + */ +/datum/tgui/proc/set_mouse_hook(value) + src.mouse_hooked = value + //Handle unhooking/hooking on already open windows ? + + /** * public * diff --git a/code/modules/tgui/tgui_window.dm b/code/modules/tgui/tgui_window.dm index ded443f37a0..674016bcafa 100644 --- a/code/modules/tgui/tgui_window.dm +++ b/code/modules/tgui/tgui_window.dm @@ -24,6 +24,7 @@ var/initial_inline_html var/initial_inline_js var/initial_inline_css + var/mouse_event_macro_set = FALSE /** * public @@ -219,6 +220,8 @@ /datum/tgui_window/proc/close(can_be_suspended = TRUE) if(!client) return + if(mouse_event_macro_set) + remove_mouse_macro() if(can_be_suspended && can_be_suspended()) log_tgui(client, context = "[id]/close (suspending)", @@ -372,3 +375,41 @@ /datum/tgui_window/vv_edit_var(var_name, var_value) return var_name != NAMEOF(src, id) && ..() + + +/datum/tgui_window/proc/set_mouse_macro() + if(mouse_event_macro_set) + return + + var/list/byondToTguiEventMap = list( + "MouseDown" = "byond/mousedown", + "MouseUp" = "byond/mouseup" + ) + + for(var/mouseMacro in byondToTguiEventMap) + var/command_template = ".output CONTROL PAYLOAD" + var/event_message = TGUI_CREATE_MESSAGE(byondToTguiEventMap[mouseMacro], null) + var target_control = is_browser \ + ? "[id]:update" \ + : "[id].browser:update" + var/with_id = replacetext(command_template, "CONTROL", target_control) + var/full_command = replacetext(with_id, "PAYLOAD", event_message) + + var/list/params = list() + params["parent"] = "default" //Technically this is external to tgui but whatever + params["name"] = mouseMacro + params["command"] = full_command + + winset(client, "[mouseMacro]Window[id]Macro", params) + mouse_event_macro_set = TRUE + +/datum/tgui_window/proc/remove_mouse_macro() + if(!mouse_event_macro_set) + stack_trace("Unsetting mouse macro on tgui window that has none") + var/list/byondToTguiEventMap = list( + "MouseDown" = "byond/mousedown", + "MouseUp" = "byond/mouseup" + ) + for(var/mouseMacro in byondToTguiEventMap) + winset(client, null, "[mouseMacro]Window[id]Macro.parent=null") + mouse_event_macro_set = FALSE diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi index 7ff9807d9e534f9cf3c0ba8b1634b8977b4087e4..b050a6dfd590c0c5ecf44ed9e401042dddb1f2c1 100644 GIT binary patch delta 9350 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 FV1k9EWs(2@ literal 0 HcmV?d00001 diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 16971814404bdb2baf6725d1a9e635ecab90de0d..01f35df64ff0626a61e3a696288848ada6c66def 100644 GIT binary patch literal 80078 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%0Doh;CO0L2LbkhQY1 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 z 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 F{{r0fvrzy5 literal 82067 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 af8+iLUJr`rklqBqKW+7UYBehMQU4d6)j2W% diff --git a/icons/ui_icons/fishing/default.png b/icons/ui_icons/fishing/default.png new file mode 100644 index 0000000000000000000000000000000000000000..f21074ac2dde8bae43cd811fc812ccaf70cbc985 GIT binary patch literal 886 zcmeAS@N?(olHy`uVBq!ia0vp^Mhpy05gcqlmcse1OMnz(age(c!@6@aFM%AEbVpxD z28NCO+Tc{|LL@8x?Ju9I&_ON(1CA3 zF0}?adGHARdDBt!%>LisdlxVD6uaLN^iiBu1`1JGV9;i|1H<^1ATVsHE%YqiecP(V sOC_K8ZBd>vn8Jnr$;jB_gvnlpl)Hx)AJj1Z0n955p00i_>zopr0OuQFRsaA1 literal 0 HcmV?d00001 diff --git a/icons/ui_icons/fishing/lavaland.png b/icons/ui_icons/fishing/lavaland.png new file mode 100644 index 0000000000000000000000000000000000000000..6c97f66432e94a4db97ee48b8272d7d2325b2884 GIT binary patch literal 886 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 literal 0 HcmV?d00001 diff --git a/sound/effects/splash.ogg b/sound/effects/splash.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a02121ae02fb97ed105eb5c4460d63aea9a435c5 GIT binary patch literal 20924 zcmb5V1zZ(D^f0=Bl%$k&Nr!ZUlG1hI(jeX4NK1)?ba!`m2_oIyCEXw?p>NTDz3;u> z_r15jxpQad?3^>FX3oscDw>(80IcJM>BG33q!TP=*gwY*;(0H zS$SAF$>|^_#x6z{wr1oKwyqYAcD6Pqw$AiVc*($@iLH^Hv5BLQoPnzm7vF1k*4J#T ztWSvkp@)J0_fIb>rUnBbfeqN?$b0<8qo4qQ2>|+3^ysms()9Up*>oOBaZ*pE9@fyL zxX>Paqj0v~|IElajd20s8Q@2U9GSZ#Z8^$khEE&mn8jzIz*|U;_*r?K5Bb{_jgf6Z zU4fPDC_Ob2nkGB|%1~H}A_xcalo@`a2*wAq5MsxEio!I<=L|(zAD^@LlLyGL@8`uT z@b4GpM)Duf)s2gyFxO4W$g$0+8CA3+=z2Mg^6jSmM~3{D4|1?Cq6h@Wn4(Be=s(dH zBsqep{;@?4_NQ)i^`d#3K__ia(i@vAHHVBve%8q2T4BtL|zt=jt-&>aCd+ zq}}AL*%YKbAEbK|WPl(1AL-V6?dB={Wt|)b$a=+>ut}doNtpA4F9$9#xC|CBei8{e zattMXOs;f+sbz&lYJ+)cgUwJ4(@+iS-$y|GKYQv8kY$ll@c&4rnh7TV=Ok?2&j1L6 zvg~sp?sK4$fKc^0G9mtza6bU*R2ah4OV^01D~?D$Wz8sE=Ks!Q?|2;aZ;zcLRC{~n~RfD|7y^BlwcFoCH-J>Pge4Hiqohx zYD)gUk_T2QVtMf-SVyp%hTcnH06u3inSxlnpaHhk98cLPYQ_Oep>e6S_06jP@coBb z6zippcJXb1EkYMlt(uW_!O}0|w389!r@H^ue1t*08O-DNrhg>&jzloTp(vn;C3XIS z9-GD1PoGB`5&2H0I6w(PK%4LU@h|7(pbumIwc`KG{+jYXE6$7g%rHn-JIp@B^pur# zkMbW@bz_R5vVm62#06S$MEy>NQw5)tRet@f7Gr)KM20^9pGSd8B{z-|K_K|+B*96J zgY<=8H*ZB6YR_?970f4sJg3-W}?edW03B=%i5gx+FZo@ zm%;z5Vf~lq0HD(Z{`JW?!*I5~v;YNB5C>Fh^CUQp^~3u8u`hoc)>Y= zEuqXQuY#*Pf$K7bXQINbJH=%(1vQy*HCbpd(QfqCZ1@j{`R6ukb1whGbDms;k}q;o zD(2aLdrlTzh z3RU*+IHC+;o`G=9K$xMbLjQY@0iiRT@>86kVB-OR003TrN)E*Q>=-3#E2M$MwnGJ< z&4-Zv9Y3%TlLM6xjnX+vgjT32hOZm-VjV(HCNShefv20>(w?0D!y`2K#Oh{9HWe2q%}a zDs%`NI-?3*!jp$KP|IV>%U`NOu_d6m(5VD@XuZuCr^$jUbOjGO(_pfM=cAtBvc@5= z3Es|vP?xy`@AtDdx=H_mN*?DgDsJdp1DCQhR2gcbsS4F}HPO6*s?U1Mf>0It1zae! z0lIKy15NPWaE9utn=ITwHSv73=Ylq_y*KcmFwf1nfKY>36N5&VH9CtF3(K6Mk`%g< zlH!sEo05uh?VP=moRYyBvyzIk!J5j_3hP4@GVLRfc-&#+$71=xV;SUE_(=o{PvSIcQ-R>HrC` zE%(|Hx3UuJE^&i^^qO)MZ=?Pjt>&FQ9F}JlO{Jpl~(?Bdi}U z41hqfi=%?c&_nKw2{|CoQ)NS-a8i)zA&yg$v80HbX6PkXjg;N(%4Rl15qUh#K_2$$Hzd1(_)`c1w_h7(>KJ($br3*k*N-XXj!w(ra`Q^z+Qo< zVq~nDd$qLX>Rm9kQ2zF+yk5=9vb+~0PMwc0D^p#MXJyN_LnvcW{zSaE2TwZ^B(7q` zRWNJ$1kkn-noV(%DW9E&M1TMzoA#L$&(r_p+|ZJ_ch<1{i8w=bd<;l@XHhGhFK*Hh zL=^)G2U}=cHy0#Wf`AlASpCkTlQq}%v{u;@4Owu8aQf1Gr3Q{VesF-WAF@f-(-89H zwj!S(qtX_bj>CKm$fCo1w8f5cqV)98VG$(i`cXc5`kq-nB3@-xZWN3^1L5Y^T zfTob&GpuDE}t2u;V|DG zF()`O5(lC)^ri)%iz4BI-2msRVLmX!6a@ibyq6sSX8CcGPXLI_J~>!NpYQwxh=V)_ z00w(7BC1k0cKR5d1&*1pfXCCADZ_`D9rupDmpm>80+It+Dt1H#W!Izj1c=i*A_q;w zn#&avG^<`MF`4on4XX-@{8_^?t~t<%>vvMDWI%w`NHYK|!y^J!a6}T^wD`yjoW_5d z@FNGs7|s@qWB8eEH%$zQz9$KcaSHICLJx3~eTqNAK>&E$3j+9diJ!7Gr^x>fO#Zus z{Qts4F&JmPPy=V{UVI{?e^L26tiQKL*8dTtC;hwqA2IuXNALf;lD1VjXmbBE1BAam zM+E*L5~)e@(i5UEJ@JT%4hDMNNnno=NCJcD_woWk^<<05@X=9&Rzgn?nh)sFaauCT zP7nwKb$-Ir&@rtg!wlj^q|Tp(Sb|jek@D-NpGeJ%NYUrdYK1X_E++%t8isQPL%>IR z<_*i(@+Kjmf8raJfexf)1$NzvnZAD3FuWd=KR80n8isMrYM}t@w)TLZRFy+;d|vIh ziS@s_rT~L&(ZAAuS{Oh;U1U933x&80XjM-(LJLC1kg~x#dJ@pc=>C?d!4mSn0Pe3b24aDsTpWn`UtJs)NaJsK7YBK=NKiCSfWM~t zw}edbB(A>?Q~YcD6bphT3imV$zuKe99i+78-1r8kWZo|W_@M%T!@T7o{cJyZPg-Dt zY+#flrs3-skk5RQ)h1E|J@_+mZ234U5Uag3!*FHAbR!wI?y@*F8M^3?la6KeuEXFe zksJwN#iZcy7ly&X?*|D5KBEV+syfHnbe=ui!eW1p`n)gDY0?4?zzpn1jsB#8iiKU` zpJT`mXz1woBl@96MAU_$?6G&k>n^*H2a-Rd_|yY~6Xh3xZR`F6O|hv9nO`Cw{oi64 z1|S817&LN9$`rmx^e-4un9(m{uwt>}K=TEFbr?Skz>f<4)2C0Sk-6QQa8%;PfqCDz zo>Bh=KV?Wr|CTDx{+9nOru{blfu9!BPh@C^2E3JF{(oF_Ts+Ji+`Q~OJ4?IkOH1@j zbhOM&Y@FQN9PFH&yPM1F3!9u=z;pEfPZt8%gK6T%Em0!ehFQ z-=sKIo*%0>IHdfj(Kuaz!UZ1ZjaE=^<1-nItNSzbq|suO4b$5edpHDsD{}FL;4h2Iry7S)S}xe890MjZ35ZcfV<|R|ye5BomM$xAZ0#|3 zf9V?7PujA`Os9C8Gesh@a7@|30hhmc*DVM!7*z%XzGJNOqNA-FywT;V{F34NBEa2% zaZ@Po+$Rg=^@+859UDN5Ab^lC@qNap0ZA#JJ3>xo$mGLyKZB?6CKHP!CR6UK;F)Yx zW}|xUfN{f?01JUg1mGEAvL0F9B0!jZ3~XCkAyjdgHDe_P*+{#0AK$8-rL;-g@d;1xQ3*t5zOe~omJLaMpc7bZ-4sBL*N-Rid- zEAMlW^w5^ai{mL1ue{s=aRwLR1@`11y55Jk+Q5Dn@?rJcDJX5JFA;3#Z!28&j=H2> zvKJM#{CFmxZr-M9*0ar=`&7c*H3cfE9>iiaHwYobZ#7r9|FW79*Wzmkw&P}WM=frf5l77?2G*V>q zatETIsd-3MgBs-v^M;x-J<4D*MoNK9B1(t4G~ivs@U&}#@T_^ra;=aO%9)dD{rp+7 zNtw!EQqS$A6(_R?Bq|Md)J%0OY|w( zD4S_c=PsBPVrHss%^S2CxJc(u)%i>hd;P~gX!niC*)J37BEI+uFCvQD@owLzpwJ-Og9A458ylPVRoNaYs2xN~oi#Be)7zWTGArh`#* zZsgcO-tM*=7dXG6R0e*PP{pMA$rieoQdmF-FRt#(#E2vLO7aTidvCyxT9{Eb9-WUl zU#xQomZ)2 z4c=jk_#GGo`;pEEPIafANH)9k@m#7)9rMiJ?6E959ks=UrIZ}h zCgL=e&a4%$KkRWSC3t*Gyuo;tjeS@2jbE(qt}Spu*r0gXVkfj|+H~>f_zk%*JIloD zs_Y;H84oMjgQJrU>E8T5k+OD&B#nr4Z*H!RmH}SvQ8w?9No5f!vmzlB!DLZB+#ge& z1I5HsgzeV`50WEi2jL%4Rez`BaVGj%ZgwqxOQ${=%B~LI5D-1zyk*J5lz4qypUP>Y z-y{VznAK^1o4Q!4++X0;O;7a&=MO(zaw*4%6ixh`OPEuZ@lwPIax(XyXZ6#zE6#m| zTuK2>rNr&xB@#1yT93V}?o%I@C43_vcJ5YYW>XYX^>NJ`(f0a%WZhq_*O;w{4z-U; z5f+ks2`4zIaAtwkw%T9*j>NO~3ubbMr!fnIiSj$8woK?f-V8)THr5flt*^b|Ra&Ht z*hIwziO4+x46eP;l7%~!*00(~xIw&2HYfBgI{x<7?+Ce3`GU3WQQ^3sbKEfdD5{;$ z1zGqsLXY_zT9Qi-MvvJ!Uq?^|MrlTjECJ5$bXMy}q$qj$ta=vjthF3Bes#4!6x5cH zdHKh~5wlDCjkH_`6WRbY_(v#BKMy?|iVZE+@WWR(#ABgH+uXD(EyFB}0u*1dp0U56 zEz|yxa^3*wh}r-|j4LzWf5jw7>?^i>JQVjCE#lFg$fw0*#-VY*gtiRma|7vtk1+So zE51yp{$#!&uHV|!drhq*ptI=EnsW|=^ZG?^*rlC1TY4)zW^@^LC$>bG=qm`m72)=qZ1p!mh;V z-LuaX4CctlRH9J$UaD?BS3k!Svd+3@DAcu{{m$A`P(q{EA%9YDMc{RNKLu>Kp zHDMM6z?hVTdSR&+x*b%r70V%#@a?t~9)`B}HLc#Uw6YIcjrm!o1nqU^HUqzYde)Z{ zo_yGtMQq?_6K7hWfX`qFin8pXYPaVp{l`z<%qQrf$oQ>C1i}`~AzLwTgfoTyqz+VK z$fF^KeQCAk7Z{m+4EYlIMS4ipzRK?-Riahtel)vyJRYf9S;TYcp<~(nv(b1@_V`&h z`$a733#PE_?uG|We_A0kxN=|yO)V=9p{tFTj zXd=AK{Bh-shJBU;i~LL$g-fQG)4$7ZPpxtWH*ZIW@V?GJmCVA&UN$~ zsSQUF{*Y_$32zwkOQX5`kfh30P11Yob-A}-q%TOyr~FRZ9&@L%1P<8#e0XkSjFwospvN-&F5&(R#e)iqaNt0RFhhAIXT|n#EVSXvb`^vkO z4GetD%MT03fKIu(=a{1|F20k%wZh4I+{CQ@ep@gNU)>uoiDxlzVO`xu#AAfYys1fQ zIn;N2HxY^@IkA+*qFSkajs9-jTi{nXCX^B1@#o24LKgE#PV?6_G6rR|o810@Y0SFS zpL^)ke{8$X-bMSslMj!WVF*Vkyqe`V`?NIKs2DKx9Ga*LclwiE9}e^N(gH`XJ3cHa z@0LHJC89{35;n#u&ibnms-pXMV>56Y_Syw?6B(C?_>H}XM%s4t;jarMe+92UPLCJ~ zo!O?R(?)$YX)N|IYfQk?#1b#^?Mcf!3r^GY@sM@OGu9uayrBAM^)_c!yrgY}yZwM` zdfDDw${$6M@)cc0RB3qwtNR^QRqtxZO#3%6nSSF?qzcWMo?CK86y}zK4t9#Jvb>5m zb>#HPx)=GjWG@{o_PAKgl3v&p8|L0_ZLDN{z-<;bSUZy7XCO0frk;S&G*@I)c2L^x zC~#D5s=jn@zY+_)^TEi>`A0+SZY_;7uK9*JwwAB9o?g? zY`!F*6n7%ikT}om-lP*O%OhmhSKDNBt(Av;iu&%&5nuhsH->bp$C&H~L>o+-dg>qd zJvi|^5D`DOek>vXZFOWJf;P7EZR}NYIl?j$F9dBvhcb>$F;pcQ%a>3z#u>NM^ETWs zJ}7+_((?=7DGBdk#Fp^rS*BGWKBHYZvau)?Ns_ZKst<1ud%kM{<};W)&1FRZkkAjM z7UnIUbxOeoXR=mU6nz!JHB&pb;b8+4o6N27?~P_7xZ5^4;moMGEC$w(m6s04EjzC5 zXU->eW!42@%*PKSnCpn_3+$Td22r8$qmY6K++9{=iX(^C{b?4HHmXoxc|dT;eCzKb2U{$8%Pf z{o=!>1F;S0wMkQnRsGaf;UTL`tV37Ohh$83M}1Nb9bX=>U@Z7}jmq-Q4?km?1u0`t zbo#Jp*^T2A;r!=M8B5(ibJN$KktD0nUF!)-4uTIAp>vN<*x{x!aW=-rughUmo0jbZ>%HxazzEgJpz5;NwGW*_%=8Z zTI2fc4<{!SseSvtshybQrgNA{d3U2V!2#B$Vx}qEzu|ja7hy^?T44@(vVv{Y!*&%5 zv0XJQe(>Y0jxTkSn#a0ga`OvyU+^vqzJsyWLf(*~@tG_LArh{`nZg<#Or~RQjr?4@ zefz%bf#g;H!&qjX;Ql9HYGntf2uly`i=0a2f4dUG3{NlM!PoELt^^$Tzmy?l{E}m1 zY5iz%c4l>Td3|DQWtWkSjbmqNFVHalqxw4^c)4RhsV5Y9UY&cU*5;>vIbTN`1p}Yj zH%&`^C)nz-J>5)%qeT6eWhGDqeyxa!mjf&Qt?Ma0t7NF%tf<}N9!q=TqOR14i$(S0 z#g{M*LR?O!JII6~dUF_ZC#i3fi*<%3%CkUgor86%0 zFDcxqqt$-m(H&0BhdNC>h&24ECt{HC{4vXugj_F<2UQ=q46ON4IpH$gu8Q_c?haz) zp38)jJaN+UpyS0&!;48H|3Jfc7BCY&Sy-D%-z(~}*2r*83~xJw6$(uWg;y*CdQxA?)F&c;mB?n`U`SYOH`CB?=dCv;7ug>nr;{ zaFPo1RxKYGtb+1M?0jk1V_$zDVbQuUwBJ=fe6;h0q%+k(ky5VTWiu!#(bT5VKE4$D zGuD>8F*lLv>o5PFXF;R=aIx)$&0%0sE|VPxqiT#kdZn^1_JRhJzLR@MMvm(Jy;#0S z^7$Ntv7**!uZK#*RL$C2ZPt-pUi$AU*jN1;1Lz;u38X*i)G$}xRZK@O8He!`%FL2j zJm0N(U9V>8d_9kD&H}$$e3f5bJ($^_m2!>&bk-B%PZ4UTAKybKVcbd)v+A!lZHBsR zENoW#j5%XYXsvp|DPQ~U`_DlHT)EqLk$Lt^uXzP{U!ZqbzzKcCvPEMq zUJJZTJj@YY@WU%~3dIValKT*fJL6}*GKo)iZfcn8U5dWpBx=uLjEJr1iFEai<;B8~ zdcO$a(nHU}Vx>B-eBg#nGHHrJL3e*ofm^EgoB=IJqK8!vyeTlcekMGF8j23%BDxa$$* zI>G4<;0lc&F)7(l9GUq~Hfocl2>R}J8`3VUebaonpZaEgr9CVl%fshB zN|q?_OPB9TalE_g$@8~6MVx;(kRfoTM0+Y=~&b=pZSSDHta@d3no1`+Rl*&TpOqJ2#h>a~+<|UoM z6*s}P(HhUAI}gL`88#ri@GN{|u%bpQ4;h{m5ny`je74f4f|>qRV9NH3$G{iXJY_tl zWg-3X)Nw8Kwp~I;suKO>tUprJ*{MZ3?}pEsK0Q9O=wn{`+HKo8y1&yP+Q`iHhJsT1 zE{;G?*@VIWqb=Kebdl(?G$JEM?i!Tf@MX5PWh0s$r#T+pwBZ-qDDG-8I0hTpCf40` z?SEXIq8(iyh2Ie}r{w(PGfWwVHSUB=*v&U7T$Ig)M5~k*3v(Oi* zyPsp;EG0Fk-wa3QIH|aikA`=)r1{%$6N*p8)oVnAWJHY!dlH|?FkO^JOi4{fza;pk zFUh<`BKeYClvi#qT%|dh>40n34)1$^$9s)n?@!)VO~SlEc^u=#xfmmcC!r21T5t6? ztJ2&^*Tqj0rS#`a4Fb3{?fk6{nx`v8g$1-%y|J)y;5ItfpiN=@>>FkNbsJbD{2QLR+GS1K zH+oAbD$QtfiTRLX)vwJxa6D^;^83RoeGgiDeN?cxYLWukD0c%}_1WwX8PA zkcY27ThI#V%>q zU6gHK-XDb2W%oO6$Of6VNODR-rkB0Rqs=15ho3@)C7yq+GE~F18iI?P0p57bjNFt} zTD)+p8pV_Z_a||()T^0$UQ4Sy*NFv0*xe7`&MYzpU%egUsCm~qFx5|LwsN1F)|y#3 zt=w?YS{~{6A$fux=Q{zmO0d19A$zsrjM`~p)F>SfwVvbXW@@3PE>jz!!&v!!!4H$( zRC?v@VwBZs>tTQxSM_$3eP!7<+h@AZ%6Tl9oW#yeD-gDi@qLQ#l4f1E(u^aTdI;{e zUVnhJlR@%<(RK~_a$v!6yhEj9_5{}B-D(l;xd0om_3LHlK~<|$ms!HIp9k;=B`02c zzaey2t#BhVaBK|UPZ}IWdQ1O2jRGd{-S2t=+u@aD^-OePDWU2Kh2&SJ z#5rcrb9fRppY%fNMJu1p^7JcrYy%B%!II|lP3LKl@$koK_sy7PgCB2in8Vtovn8&1+oou6ATpq&-qLfAP%5sFqUfkG z{yS#9JWwfuQl7nM{S=0x)~lVYzP1UMQ&Z2~$>Pfp@{oPB4^-)vsy1zMhKVgKs(U8< z+rYsOgm1Igqd#(dV*6#0b8BEm*qda5jO2*e%DNf@I3ECb0~fvkmG}^^n(5s69@{Ud zG;?>E--}5mC^=x%*-_~wpOMAe$MO;fh0{YdlV+V$Ps7;!JQ>*QdnX*9)VMfld2SUk ztJCF_uJrd|pR~+kRcS6T^b7rEV_nml%j3qZl3$oiwL?NKuSaVi){K)ACqB&JzBcwT zS=_%L)J}dM`{w@QxzY3aRG3qp6}nh#T3882g?NoMw5k(Mr;*&LFW8Sw<))gp@aO0; zWINcZRYer#M(09TEjU}tf*=gdf!&pp+Q zL*rRD1N=+~%Yf|}^RlUUDa0dY;F*S6;`4PD-&jSSL;GLl=4ts=KD>8 zt^=~BR1|4QgZ4w5T}OW(r(2+jgjdg&luD2?p6A^M@0(J^;>J&+_SG-*z3(LbBi}Mc zXGtram=^tCBCCnd^so&CB z*z23xk#(?f`yP^%_PO6L zw<|&ph4Q&14Ayd4VfYz5zw1Kb;%s@I1>|o^ew~MzbmY<3e3>EyRqItLUN)fM@rOP7KFdBI z@2ED!5>NBMQ=vWS8;3p>kn)SKe(Tbb=+CIDcu2Fq6D8P<0=cXqk%c#K>KB8I+l z3qkB{`n7M{ls2G=B)d|3txFVc6;8qzcS7iKmG1RLuRBrqFkLPlSSf-@D_T;%lw@yy z4*%S*i@6PC#9-V zdS8*VEsjh2Fl%0_;BW>l_LDMF#*z-44xc+#C3-qOUF#UzQ#RYX+|-@JHClqP5^}>ej)%IlL8O znd_OJF=(6PxR^X-4=C5|TK*8=sZ{0o$^Lf+e*h74#AQcvB+O?YJvvUO2Ivph1P{7%I*IS&Su2O^J4Pp5R;X>4 zstLQU%r0{qZu<7DB@?|Q!?6f69dLHwxHP#Y*?RXvywxvOb371RP3XMFD6!9fSh)c{ z$u=Wse1#Fu!R-=2o3+nEI>T~1?}0O{^9m2JA2Z}R_c^=xZf^88nZN_ZlY!1G!Oewd z{b=VltYV?*in*h@QrbUZ8DnKQN81ZlmjNI9m0QfxjtIk#cWr?g5v=l4pwSsbnNeZY{7ai!0hg6mM@7iG!(P#KL~FUE)N+T&j2+5ju#_e5KVa?KdbcBq{BUzc zj=}CQ=g(?=y?b)n{)gS)<28FMmKiu{|J%#xwEpkCjHiFGGwIp}HV8R!^U*^V}rGm2-7NK6&%o(-SD0s62;P;KSw0ec3LGihW( zCewUf()l=cY5C(C;-n(xDWMN_=bwR>-dKm0JNbhIvSp{8RnuJr9a z-ip=Qj)Z&nPgSeTY@@;{9vjgeVX;@R4WdD=Z(#Ei$F^(rnTcEB1<8=PrJS3=&lvPH zU6{*VzoCB>Uw*?ig#jL=SKn6O*MQ>O(gK)vH-Bcf?tqt)L;Gh5F196^<%|iRZ6)?? zMY<0dwkLiCzRbJDB@4WqAY;D^vX)4WmVT>6s>o7y)m2n-kK@y%nk$&@+G{=sr9R_{ zJ^TD7i8AP&)%zaWk*~^rMV6XY{S(9!F_c606w}{R=YD?JCmYc&VoP_X%f3;qFGK6% zSwab&?)t6hcU?li*e%3qm$IDX@MX5bcp6>;0}B&u7l~as@+|={jzB8KSgzcV@)!uqg6P*-CPvW5 z^1FXW)i7pzUH@jP=yn@2_Uucmz{$_`(?iT(WJiNG=_O3DB#X}^=)SV_H)&WF-49Ic zVgx;oF7Itr_pi(f%+9@$lw(xj7BbZSS=W)*Jo0%TKj8RlpaKd*cma*lJS28CHdMjQ z_H&*gQ|w`rQ#~)jXU)#hd(Bn?#e+$EUtY_6nZrSXac2 zXm**`vkZGZ*ySC3l6czkjLd^O_$H_4*SyTwj4ZpBRU+(QgxZfVDXo3=BzOE zhK_ytp(h@#*Jot#J-=f1j-NpX1recxN#~Cl2=w{S1D8?B(phoJ;{wsTACU6bjTX5Q zxr&M739McAVmcfQTyPO4p?5Xs3*#nfkB74fov=bEj%gT7ukU;qVb_zv7gVOYfTx`< z1rs-rxXk1CIu1H2hLrH5P1n=rVV>5OtqyN9L2$ffodqzqG=d!{CfS`75Do$S9^vNE z#EQ-a+)BNN3~i^-U$5}dOUi>0!t;pRdHto@STa!#88$CVfs#U+O0vq4KO|X9N9g(^ zE>^CI>7@&12%>{lvBceau#4GkXH#83Jwwlw;|zxEEs7hb-p)k zA&z^v$KRug+C&*059~|%sk5|e1%xUA7)Oq$f-Ahe)fKY4l!q=UtZ%Tn2?K@*rWE5);4Hy;v~d&O_v^$Xu)RzkFD zTp=dw3T4#3FqOwK=0&mvWaBfX+iIWGFN@~6hXC+lwxw|V!CX<+hTT7Bxgx?oRJR_G{jwX!q?cLGd8qA z7%A?`jj&E$)N-2X2Jv;r49)(wcoupnj zkzK*mcpePdUJ}^O#4>D+-}m-(Z{|8Sc8@flBH}W(_1x_VLNZVLgRWGOl-6m;l~QW_ zC+Ua-e!~DKxx|Gh-6`#C=}1bDfxpJ_hpp<=Ghk7Zq_KF!EM<>qeZ}qR3n^Q^tr1G} zI^0O8!gVR#8AM~0t>)%uwvO8H#i8Au;yp~ez1dl>8g4|Xd&Nyekx;Cb)l6Z5db5He zvd}=Rn#7^)gAIEEzNps$DSyL<-LS{sIy>@aR{E6byd;Gg)cLD(LG-I@DX&V8(KT&j zU9^K-#f;4lB|n6%nsA5S#@(i#4-%_SA#~op@coYj z;CCa=VnE}U^Kl+S><@3j(Di$YjI_bDQsPEuY zPx*9y-VRcsmF4)CNA8dOx;ni6It&hD$ko`&;gBsUdVn;BCQ%fX06lE1(r$%8ZW2$u zApeDn6|Ej^y6q;tzCgqAyZ5Qu^5g*2Gh@_pi(5#vx8Hl9sO)<@1*gusv+N(hug}Gz z-I(oyUz^a!h=l|j$e@$&K%bfxkCQKZ3(oe|fKjUIwpan06e2M>kRaS^+h5+_I;ehb?y!8YOMZu)a} z;3`I_N8=yw`mx@{v1lg!SF4Cq|`LT;Y=zwQmtaQk~qm3WJ;5Y2CMim+n<{p$V&U2im&f=vunG* zV^HqRUv$$US11bVG^_}r(Xn-&mgTNIi@+W4wu8^ui(AF*C=H#Tf9VaX4vkfwaULlGys zpVqO;Bn~*b_hOpL^n7w;uO5twKI*lFnk^?b@<r74F>8w%)4AA}nemsimvU)MJ9eIxp4N~*FTBq&6@_kDKc$D811dc0RP zG$~Pfz{ME&PNABnqW5zN=SC+CwqNJnZRSgDHCJu*6_q3N3>jTT=nN~H>KH#UB#2weS+ROUEOQdWuOw65Sv%H7vQA0AfBd_bt=A({BUL4pJNUFo2RDn|z6(l(}XCdQ#JZHG71q`;VUVu+Uej zYSWK8uQfMr;fVw-K1lPiYZ28-(Mjt?f%#qW{yj>vMX z5_zX@5FKdED!x$mud0iz^o$MvRg*KI2+?0tgj!xxU#)mf8@R2sHxbJkYgE?mzZq1c z++;8Ck+|kD!9%9F`b~XRmY=Ec5_fOlqr_uJOx!GQkomKG9PD72Fh&DnmgX=egyiG( z*^H_AiI?ElV-NeW)3+&ZEL9?h1d{=9pIz-!z{5YZpYeILIOfqh=|T<=${Gb@S~}$R zdDh7C8C?d=PX;Y|8~B(swa|#!JzzD9I`tc25HPr~n=G8mkmJ|g!{o2aqIn1Jb;FmA zYChRE*ka(k$%X%voUJhb1{h?Zfx!w(@4Y@wIT2K8u94xF|6zd*pQn11(bnLkct&c_ zeyK1L1}84MphW+hx!Viz6MqQISUbcPQfzrSX7>?3to!ny_?O+=HOF2WL`C7cFSU>3 zcC%jrPVU@IjkmF(-L62<4|~|JhsN5&;jg9{)La}H1_W(2?@c;gw^>iE-8yFq=DRJi zFZ}@=%KRTVFA0v&{ra5nS#={EXuce4%M;{5qXd7}VJxg;4?#t20(x-(syn1vk+Im+ zZ%%G7MjE|8huq0u*okE3-Vu@XJEf^bQE@Pbydu3^Q9_1HKd0G$&g^J~HtRAXDpo;NpJ zdD}PN9IJerP^q}fVfs~*T!Da)6qqKhH*48+_t)6s#G@7(CtjJ5m-i{Zw63=00Ztj+ zbqc14>S`@(pf}qT5Nl|)q!lL)V$}X)Tq-!yZc)r&7<1ipvdD%cu7;SyV~k$#r4cSq zYy@biG*OS^l1Xkv8t)tGv7l3M%=y!LnOD3w=UoeX!$$=Os)fL+W#GOU!4u}gz!XlX z@${8eCP)qSJ4T?*CQi&LK353;Exh4y(buR9ue3qpR?8NFcMqa{wkK*PL4DTN z-%18{*-M6)hNm#9Hc06dlZ_rQv&n`hu`Wa$yGF3!tcnjO3~1SEe$3Qcyd@A2cuiL1 zbTnRR$7I4#Z}+;-r$0Se|Ih()d^VFVWQI~o=smK@?udWp^cpv^lNRRr^TX$F41p`T zu}@>9ncP%FlPHJo9~`%cKiKI02=FF!BMm>rX&^shjAmg;)4Hv0!L<9C9S$p~{vKF@ zUYI=E|Bg;>Lj*dcj$il68S4k!zyYkHhSsGeIS$}bD;U6PYi##yHC`B-Hyp0SQqI&~ zex1yu_{gvw_nSwC;aF^>8I5MV!GI*+p~2}*rrx+NmHO7A1}RaltBFaXz~y)<&d+T# z1@S{3K8cXFaQwv=C>;?EOBX(GO&SlFMnWcQR=zgGZX0WQs`gsChM6I*=ItR9rA;o? zsr9rdEMs5IRZhnkeJC`ov!avDS2FWJq*7#7YqI&i8RG5AirRXhGWA#ib47}b;;?j^ zZ9C?*OEcm=k`{DzlZ$9#!e^1 zhefoxsMd#AW-~}5Lf z#YdHQFHID_a{JKhBw_+(_W980HE!iL{SlrJNtPB7Hyh#pa!niPrn`blccTTcg^a3w3R1 zHc+lVuopX>Eu%52bv@FzB~I{eA0ryJFiJgIsgptzbbp0%@LFzWa_5=Mb*lq!_R83U zko~8-ZothXeJ0Hk!%M?BvCajUXI06rKlO%e2Wk}tXx`kbIAjRX)(-l2&G6`!G&gCL z2Xds81=1plHhSq6YR>n+RZxA|uBI$PEc?4bt}9(6==B}uR$HPtwR55MxjgIr{unm z^qwGdQGH!zOPEc#H`>Rgh(P1DwC!$!-0jaztWa>iY2&`ZRHxcjkXny)R7wIcde$&1%J;Nhjid z9yJKAaZhV`rbpEBWqf9W+X^<6IIPBvD(%q4x+9)zazc=FAJMmEQD(JW7W7$6Yn|*# z37)lx8<;qydE^@|epZkv!zk;a4|CkhRH-Gf=WZR6Ic2)GMHPfN^oE6tabg;^j9c?U zNBVc>IjR6xAf6s#IipJH=8E)|cw>v5?>)4k(x)Qh&-897{6)KEh=QP@U(zdjM=#TB z8RMOCcr{O|%~9`8d@yDv@n+sLgk`pf3lYA6+@0* z11HINL37v0fT4I2CCR`!AG~2lI|7e1Y&p(>mu=3g$h*6+7)W9LmnE%CMvbkLNcGI zXI9)lwWQv^T$WKsW&jeto=+Z$!mX-!GI>vL<(_?~Er59g4}MdSu2U|@j){`w3kziV zS3}g}zn8?I^Kt=rRl)5pj;^lPdk!_LoSRcFgoLd^jcPJOscKg=bQQW7pVEoy&>M^` zE-?))_n%1~1`7sp8llvV@LApS;%6DMVqo7Wnshvmp`a3-+lNqo+m5db9nqQ>R8gFE z9W-*w$bHs?W*bAHw{~ozvO9wHe+5hov-6HpHtxyb$+Gb)Pm0zrwlB0BzgONO@cJF3 ztD6*3ek#}#zp>=%&w2V}B#E)3Qo#zJ>=|3;j8e|D$C+eD@0XQ^RqRRr*qqPY`+MaN z3&G%ZKIVUo_b4~_G3vf_4XXhF-k4o|*-{TS2H+SMUz#dEW%ocLN707@ zPos-o_q2+$lE$f`=E*=CW@A;(;fz)@BT0%_voS;=dUG^YZi+C~@5mkhYhttz$Iw<# zWpB+#clB9PqTsu>M`W0xw4;ukZ%{W-Y5Ii&pr1j08>I&{vr3`RY=~ktvGZ`4Xz6J0 zFz6axC-aS_M;I;&hBM#t5xe380NxngU95C90GNIN02Bw|NmXkS;mRW%_>us?_u(_! z>D}Xx@sfB_RsMY5C^koq`)dt-%uPQu)TE1NWtXFD5)WIg!^A3@J7{Q@n}&bck9m=S zCQT&@dVZCxP#x;Pn` zCfjs{n%LguC$H>kFl%yN%cFBv8Wc*Qfj2yQ(KT&YoNTLFe20Dw(^ zNjOQXqHJZ40-qj$1=rrMr>71iefCCfILvk<{z`#2wSQq=-?lv6BDD1zF<}S?b{$xd zy>wsFmNnVuqbArD?@FW;zG}gfiDr7+l2cpWo+0le_P}H3HTxd)<<09990d<-^eeN+ zs!XSFRW;Y|ifp?H?MMg23Qg6e>N#*FR^9xO5cf=Thha{8Xf8uM-{KVz*=&ANIHI~ z>?xwe0S;*X0RUJ@AiJtcHrhlT0^V~5NYMUIleeYP4?G^&G~9G4#ygMpF`k*4Rfnro z$JMpdTaq4fv6lIywj2ANf4_rvEQ-$(==64GXO2GVjgsj}!-!v_-;?on>P{frTBj0q z8iJ2h%1=)ARDe?oeLeb58?U9!yW}mFSWMR(forITW#0R!>|eb+`9TB)r3ZJ_2HX2A zgk1m5%rSG3c0dkLV@`W;@^VQJpIOVynjOXXUkr91?z7iCH)-8LQXtYc{<H9lI&&6uN&4{(e69E1Qonq}e*&L)v}*4T z8O5jOgdNm+tKc})r7N|udLrX#fBd*^kE-j(o{s_&mmZ!ZJ}J2~IJ1r_rD&f`_YW^n zU|E&~lE3-2_q?n*gW?OAqlLDs7;UlU9AQ~eJP`n1d0lJj9C1)5TjqWr03fX-JWT|P ziWGQX0D2_`pKnnXj!R0L|NO9U_9d05$cHOEHMKQW$PZZ60`U{gVZlRJM|1`U8R5vY zx>F*Ez_%{NT&TX*r;8wlQUw{t22ZbtQ8H$E#mp5U0JgU*&O@q?LEfPK zHvk|D0AMmns*H)cqIAIj84ZAWZUlj$McGWg-e{n7Tx-`aq*!X=8b`Igd4sGC&pIO| ze+%N!S~6N$liPe^mt@Mry4F=7-I>DT{pdjHdmLbk+xIx4Z=71{gyc7KjO!TnRaKQ{ zt^XH_Rk2qxzpkpcJMFn`4HL(BzOD4OwPMq?;H$C%rrwJjZn9Cs{jwq}Hw~DrYJ_zIi*{QgQ*~fw;c1KX`=Q}k z@6KoMF}&3PEHYD46OK`Fl6)J0OV}GgOI0e@cpBjb9Y@vcnH0A_-6`m_i~!-ao)jh> z2OYJu+6G{py8##Pk1Oi14FnF~+-?&3jwgde{7Zqm!Vgd~A6az***@*cD7>B!^ zS#Dg4ZhioDhRf3XZx8WoL=NG^q?9`gG%91|*_iIk9d`hOhdl{=qT;%pk-it=+}XFf zgS-A!UGCqg^^UeM7)(y5Bx77$gu2`T(pj6p@Ab!GX4@61`nJH}o(>?_^SxY4WoS(5 zz@k1!yOGnh>;P0=PXeCnezDUwAT4VqkY{^bTxN`z`LkD%c_#f(6^ihM%890)Ntc8L z93tFr&7?RF091Cj4vc)i80r-JfCdUCBv5>tH5^(l7%J6mQr^^xesU?Qb1sGTvLwsH z_a1StB<}!vs(l?(XaO|9`;uW8hG7_n;nKMP+Exy?rDa`KIv`565(~0_XN+jvsv$_asQ(Nh`R`{W+A>W) zOIe(Fn0vT??q+I&ZKv5Sf6u>hRU!+4wvEXi-QaVrR)Rvk-L!;-jKk3ueoem|*I_X| zXZDDhx|d69i&znSwX9@NeE;5*j^%r`qRox74IvE|0$Ey7*GC+X$c{mup?Kx-kZ3=v29n7=}sYpn0aNkz|{-~YPym87woq(SJ006>O)oM-Dasa?}04#yr z#+zw5JwN3Q_g9lJPSowtSW%WzpBBA(*wArfjdSQgz1`>^tzu&8X-_ZS3_;!B#ev< ze^{w4W0u0SO)IkNq|rr>5xf>nzs*9cNExSuYk6*p^q_6gm89)yzEvNWB?`g}*BYCr z_nm1YTnB>|SJ5C6J1PKn2mr~R&jtV<=uEPA8Uqu|KL7v#V^xI{t&{Sl1Ku+LAz6~A z)i}Lr_{}n<$w|W4K&R}9#Z`BgJdiB2{o{+|mtH7BC+Fs_iEu^8J)x54ifQkm>U1|~ zI|O;%qOYR5R#<@vsX(;uSUN1~%>XhiT|sN0ymS1l=%;s*AfK z&>$-Y2T5~IMl3{fN6n@BuI`0M_62`~?{waJ*a(obWeM6DtUXk@dnXSA-U<~VmvPbk zO^<&CRxJxclobbJ2$BUH>DTG(ZlVsi3;Bk6eKkG&)$cz0MWv$A$4EY73cW%*ruTG=A;LUg zkp{oE7I~xl?fMe4MMr+bqgCCvDhrKC!*{brR4Lij9vW%R_oSztmFGCN#zY#sC0SS% z?`PO)iJA08%)njLVO=~=*z<=bE>(0HCNp(dji+g&#*Z?swnmRb3jAZ-n!YaTvkeB8F>{MFN9+Q4$eW~d4= zApi&{0AN=7@e8-VpMCkj<-r?MIg2%(H!atWY$Qy|DvESpY8PO6$N9(MSV^vGq29 F)&Vmvy4nB$ literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 4d1fb77f25b..205c1cd5f35 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -77,6 +77,7 @@ #include "code\__DEFINES\external_organs.dm" #include "code\__DEFINES\fantasy_affixes.dm" #include "code\__DEFINES\firealarm.dm" +#include "code\__DEFINES\fishing.dm" #include "code\__DEFINES\flags.dm" #include "code\__DEFINES\flora.dm" #include "code\__DEFINES\fonts.dm" @@ -205,6 +206,7 @@ #include "code\__DEFINES\dcs\signals\signals_adventure.dm" #include "code\__DEFINES\dcs\signals\signals_area.dm" #include "code\__DEFINES\dcs\signals\signals_assembly.dm" +#include "code\__DEFINES\dcs\signals\signals_beam.dm" #include "code\__DEFINES\dcs\signals\signals_bot.dm" #include "code\__DEFINES\dcs\signals\signals_changeling.dm" #include "code\__DEFINES\dcs\signals\signals_circuit.dm" @@ -812,6 +814,7 @@ #include "code\datums\components\engraved.dm" #include "code\datums\components\explodable.dm" #include "code\datums\components\faction_granter.dm" +#include "code\datums\components\fishing_spot.dm" #include "code\datums\components\force_move.dm" #include "code\datums\components\fov_handler.dm" #include "code\datums\components\fullauto.dm" @@ -1048,6 +1051,7 @@ #include "code\datums\elements\kneecapping.dm" #include "code\datums\elements\kneejerk.dm" #include "code\datums\elements\knockback.dm" +#include "code\datums\elements\lazy_fishing_spot.dm" #include "code\datums\elements\lifesteal.dm" #include "code\datums\elements\light_blocking.dm" #include "code\datums\elements\light_eaten.dm" @@ -1682,6 +1686,7 @@ #include "code\game\objects\items\devices\scanners\slime_scanner.dm" #include "code\game\objects\items\devices\scanners\t_scanner.dm" #include "code\game\objects\items\food\_food.dm" +#include "code\game\objects\items\food\bait.dm" #include "code\game\objects\items\food\bread.dm" #include "code\game\objects\items\food\burgers.dm" #include "code\game\objects\items\food\cake.dm" @@ -2352,10 +2357,6 @@ #include "code\modules\antagonists\wizard\equipment\soulstone.dm" #include "code\modules\antagonists\wizard\equipment\spellbook.dm" #include "code\modules\antagonists\xeno\xeno.dm" -#include "code\modules\aquarium\aquarium.dm" -#include "code\modules\aquarium\aquarium_behaviour.dm" -#include "code\modules\aquarium\aquarium_kit.dm" -#include "code\modules\aquarium\fish.dm" #include "code\modules\art\paintings.dm" #include "code\modules\art\statues.dm" #include "code\modules\assembly\assembly.dm" @@ -2933,6 +2934,20 @@ #include "code\modules\explorer_drone\exploration_events\fluff.dm" #include "code\modules\explorer_drone\exploration_events\resource.dm" #include "code\modules\explorer_drone\exploration_events\trader.dm" +#include "code\modules\fishing\admin.dm" +#include "code\modules\fishing\bait.dm" +#include "code\modules\fishing\fish_catalog.dm" +#include "code\modules\fishing\fishing_equipment.dm" +#include "code\modules\fishing\fishing_minigame.dm" +#include "code\modules\fishing\fishing_portal_machine.dm" +#include "code\modules\fishing\fishing_rod.dm" +#include "code\modules\fishing\fishing_traits.dm" +#include "code\modules\fishing\aquarium\aquarium.dm" +#include "code\modules\fishing\aquarium\aquarium_kit.dm" +#include "code\modules\fishing\fish\_fish.dm" +#include "code\modules\fishing\fish\fish_types.dm" +#include "code\modules\fishing\sources\_fish_source.dm" +#include "code\modules\fishing\sources\source_types.dm" #include "code\modules\flufftext\Dreaming.dm" #include "code\modules\food_and_drinks\food.dm" #include "code\modules\food_and_drinks\pizzabox.dm" diff --git a/tgui/packages/common/random.ts b/tgui/packages/common/random.ts new file mode 100644 index 00000000000..7f99cda39f3 --- /dev/null +++ b/tgui/packages/common/random.ts @@ -0,0 +1,33 @@ +import { clamp } from "./math"; + +/** + * Returns random number between lowerBound exclusive and upperBound inclusive + */ +export const randomNumber = (lowerBound: number, upperBound: number) => { + return Math.random() * (upperBound - lowerBound) + lowerBound; +}; + +/** + * Returns random integer between lowerBound exclusive and upperBound inclusive + */ +export const randomInteger = (lowerBound: number, upperBound: number) => { + lowerBound = Math.ceil(lowerBound); + upperBound = Math.floor(upperBound); + return Math.floor(Math.random() * (upperBound - lowerBound) + lowerBound); +}; + +/** + * Returns random array element + */ +export const randomPick = (array: T[]) => { + return array[Math.floor(Math.random() * array.length)]; +}; + +/** + * Return 1 with probability P percent; otherwise 0 + */ +export const randomProb = (probability: number) => { + const normalized = clamp(probability, 0, 100)/100; + return Math.random() <= normalized; +}; + diff --git a/tgui/packages/tgui/backend.ts b/tgui/packages/tgui/backend.ts index 4a58d55c6a7..bf84aa80c41 100644 --- a/tgui/packages/tgui/backend.ts +++ b/tgui/packages/tgui/backend.ts @@ -14,6 +14,7 @@ import { perf } from 'common/perf'; import { createAction } from 'common/redux'; import { setupDrag } from './drag'; +import { globalEvents } from './events'; import { focusMap } from './focus'; import { createLogger } from './logging'; import { resumeRenderer, suspendRenderer } from './renderer'; @@ -138,6 +139,14 @@ export const backendMiddleware = store => { return; } + if (type === "byond/mousedown") { + globalEvents.emit("byond/mousedown"); + } + + if (type === "byond/mouseup") { + globalEvents.emit("byond/mouseup"); + } + if (type === 'backend/suspendStart' && !suspendInterval) { logger.log(`suspending (${Byond.windowId})`); // Keep sending suspend messages until it succeeds. diff --git a/tgui/packages/tgui/interfaces/FishCatalog.js b/tgui/packages/tgui/interfaces/FishCatalog.tsx similarity index 57% rename from tgui/packages/tgui/interfaces/FishCatalog.js rename to tgui/packages/tgui/interfaces/FishCatalog.tsx index 33e6544a5c4..a40f33443da 100644 --- a/tgui/packages/tgui/interfaces/FishCatalog.js +++ b/tgui/packages/tgui/interfaces/FishCatalog.tsx @@ -6,26 +6,53 @@ import { Box, Button, LabeledList, Section, Stack } from '../components'; import { Window } from '../layouts'; import { capitalize } from 'common/string'; +type FishingTips = { + spots : string, + difficulty: string, + favorite_bait: string, + disliked_bait: string, + traits: string[] +} + +type FishInfo = { + name: string, + desc: string, + fluid: string, + temp_min: number, + temp_max: number, + feed: string, + source: string, + fishing_tips: FishingTips, + weight : string, + size: string, + icon: string +} + +type FishCatalogData = { + fish_info : FishInfo[] | null, + sponsored_by: string +} + export const FishCatalog = (props, context) => { - const { act, data } = useBackend(context); + const { act, data } = useBackend(context); const { fish_info, sponsored_by, } = data; const fish_by_name = flow([ - sortBy(fish => fish.name), - ])(data.fish_info || []); + sortBy((fish: FishInfo) => fish.name), + ])(fish_info || []); const [ currentFish, setCurrentFish, - ] = useLocalState(context, 'currentFish', null); + ] = useLocalState(context, 'currentFish', null); return ( - +

{fish_by_name.map(f => ( + + + + + Outcome + Weight + Probabilty + Difficulty + Count + + {data.info?.map(result => ( + + {result.result} + {result.weight} + + {round(result.weight / weight_sum * 100, 2) }% + + {result.difficulty} + {result.count} + ))} +
+
+ + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/FishingPortalGenerator.tsx b/tgui/packages/tgui/interfaces/FishingPortalGenerator.tsx new file mode 100644 index 00000000000..c499b945ec9 --- /dev/null +++ b/tgui/packages/tgui/interfaces/FishingPortalGenerator.tsx @@ -0,0 +1,30 @@ +import { useBackend } from '../backend'; +import { Window } from '../layouts'; +import { Button, LabeledList, Section } from '../components'; + +type FishingPortalData = { + active: boolean; + presets: string[]; + active_preset : string; +} + +export const FishingPortalGenerator = (props, context) => { + const { act, data } = useBackend(context); + + return ( + + +
+ {!data.active && ( + + {data.presets.map(x => ( + +
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/FishingRod.tsx b/tgui/packages/tgui/interfaces/FishingRod.tsx new file mode 100644 index 00000000000..f2aeceb9ff8 --- /dev/null +++ b/tgui/packages/tgui/interfaces/FishingRod.tsx @@ -0,0 +1,98 @@ +import { useBackend } from '../backend'; +import { Window } from '../layouts'; +import { Box, Stack, Button, Section, Flex } from '../components'; + + +type Quality = { + name: string, + kind: "good" | "neutral" | "medium" +} + +type FishingRodData = { + bait_name: string, + bait_icon: string, + line_name: string, + line_icon: string, + hook_name: string, + hook_icon: string + description: string, +} + + +type FishingSlotProps = { + name : string, + slot: string, + current_item_name: string | null, + current_item_icon: string | null +} + + +const FishingRodSlot = (props: FishingSlotProps, context) => { + const { act } = useBackend(context); + + const icon_wrapper = icon => (); + + return ( +
+ + + + + +
); +}; + +export const FishingRod = (props, context) => { + const { act, data } = useBackend(context); + + return ( + + +
+ + + +
+
+ {data.description} +
+
+
+ ); +}; + diff --git a/tgui/packages/tgui/styles/interfaces/Fishing.scss b/tgui/packages/tgui/styles/interfaces/Fishing.scss new file mode 100644 index 00000000000..37c4422e4e6 --- /dev/null +++ b/tgui/packages/tgui/styles/interfaces/Fishing.scss @@ -0,0 +1,79 @@ +.fishing { + width: 121px; + height: 500px; + -ms-user-select: none; + user-select: none; + min-width: 121px; + min-height: 500px; +} + +.fishing .main { + position: absolute; + width: 50px; + height: 500px; + left: 30px; +} + +.fishing .main .background { + position: relative; + width: 50px; + height: 500px; + border-radius: 10px; + border: 0px black solid; + -ms-interpolation-mode: nearest-neighbor; +} + +.fishing .main .fish { + width: 100%; + position: absolute; + right: 0; + font-size: 3em; + text-align: center; + -ms-interpolation-mode: nearest-neighbor; + color: white; + background-color: rgba(65, 91, 138, 0.5); +} + +.fishing .main .fish *::before { + position: absolute; + top: -5px; + left: 5px; +} + + +.fishing .main .bait { + position: absolute; + width: 100%; + top: 0%; + left: 0; + background: #4d5f2b; + border: 0px #4d5f2b; + border-radius: 10px; +} + +.fishing .completion { + position: absolute; + width: 30px; + height: 500px; + left: 95px; + top: 0; + +} + +.fishing .completion .background { + position: relative; + width: 100%; + height: 100%; + border-radius: 5px; + border: 2px black solid; + background: rgb(186, 217, 231); + box-shadow: 5px 5px 2px rgba(0,0,0,0.3); +} + +.fishing .completion .bar { + position: absolute; + width: 100%; + background: #7cb413; + bottom: 0; + border-radius: 5px; +} diff --git a/tgui/packages/tgui/styles/main.scss b/tgui/packages/tgui/styles/main.scss index 40000734786..b02ea5aa4fb 100644 --- a/tgui/packages/tgui/styles/main.scss +++ b/tgui/packages/tgui/styles/main.scss @@ -53,6 +53,7 @@ @include meta.load-css('./interfaces/Changelog.scss'); @include meta.load-css('./interfaces/CrewManifest.scss'); @include meta.load-css('./interfaces/ExperimentConfigure.scss'); +@include meta.load-css('./interfaces/Fishing.scss'); @include meta.load-css('./interfaces/HellishRunes.scss'); @include meta.load-css('./interfaces/HotKeysHelp.scss'); @include meta.load-css('./interfaces/Hypertorus.scss');