From 3cbfcc3a2480af495e7cb8c25309413ed3d26c58 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Tue, 20 Feb 2024 15:00:52 +0300 Subject: [PATCH] [MIRROR] Adds an 'auto-reel' line reel to the fishing tech node. Minor gameplay changes to fishing. (#2068) * Adds an 'auto-reel' line reel to the fishing tech node. Minor gameplay changes to fishing. (#81407) ## About The Pull Request This PR adds a new line reel, which speeds up the baiting phase of the fishing minigame and skips the biting phase, thus starting the minigame without the initial input from the player. The auto-reel line will also throw items (or other people/things, if you have the right hook) in your direction when snagged, with the added bonus of catching the item mid-air. Turn your fishing rod into a discount meat hook. I've lowered the deceleration coefficient and bounce threshold of the minigame by 1/4. My rationale is that these two numbers are a must lest we end up with an uncontrollable mess of a minigame, though they also feel like a sack of flour hitting gravel rn, making specific hooks like the bi-directional one and the weighted other a bit useless. Another change is to the baiting and biting phase. Previously, if you clicked anywhere during the baiting phase, it'd reset the whole timer back to any value between 1 and 30 seconds, spelling futility to the time you've just spent waiting. Now, it'll simply add another 4 seconds or so to the current timer, capping at 30s. One last thing*. Once the biting phase start, the faster your input is, the higher the starting completion of the minigame will be, and the other way around, if you're very slow. The difficulty variable can also lower the starting completion. *I lied. I've also added a short cooldown to casting a fishing rod so you can't just spam it. ## Why It's Good For The Game Finetuning the minigame, quality of life and balance, making fishing even more gimmicky. ## Changelog :cl: Ghommie add: Added a new fishing line reel that speeds up the first half of the fishing minigame, and also let's you catch things from afar like a discount meat hook. balance: During the biting phase preceeding the actual minigame, initiating it as soon as the "!!!" alert pops up will net you an advantage. Conversely... qol: Clicking during the baiting phase will no longer wholly reset it and make you lose your patience. Instead, it'll delay the next phase by about 4 seconds. balance: The deceleration and bounce should feel less sudden and stiff, meaning the controls are 25% more slippery again. balance: Added a cooldown to spam-casting fishing rods. imageadd: Resprited line reels a little. /:cl: * Adds an 'auto-reel' line reel to the fishing tech node. Minor gameplay changes to fishing. --------- Co-authored-by: NovaBot <154629622+NovaBot13@users.noreply.github.com> Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> --- code/__DEFINES/dcs/signals/signals_fish.dm | 2 + code/__DEFINES/fish.dm | 5 ++ code/game/objects/items.dm | 18 +++--- code/modules/fishing/fishing_equipment.dm | 60 +++++++++++++++++- code/modules/fishing/fishing_minigame.dm | 52 ++++++++++++--- code/modules/fishing/fishing_rod.dm | 13 +++- code/modules/fishing/sources/source_types.dm | 6 +- .../mob/living/carbon/carbon_defense.dm | 28 ++++---- code/modules/mob/living/living_defense.dm | 20 ++++++ code/modules/research/designs/misc_designs.dm | 18 +++++- code/modules/research/techweb/all_nodes.dm | 1 + icons/obj/fishing.dmi | Bin 16897 -> 17567 bytes 12 files changed, 177 insertions(+), 46 deletions(-) diff --git a/code/__DEFINES/dcs/signals/signals_fish.dm b/code/__DEFINES/dcs/signals/signals_fish.dm index a40e731fc7b..c70cdfde1a3 100644 --- a/code/__DEFINES/dcs/signals/signals_fish.dm +++ b/code/__DEFINES/dcs/signals/signals_fish.dm @@ -28,6 +28,8 @@ #define COMSIG_FISHING_ROD_CAUGHT_FISH "fishing_rod_caught_fish" /// From /obj/item/fishing_rod/proc/hook_item(): (reward, user) #define COMSIG_FISHING_ROD_HOOKED_ITEM "fishing_rod_hooked_item" +/// From /datum/fish_source/proc/use_slot(), sent to the slotted item: (obj/item/fishing_rod/rod) +#define COMSIG_FISHING_EQUIPMENT_SLOTTED "fishing_equipment_slotted" /// Sent when the challenge is to be interrupted: (reason) #define COMSIG_FISHING_SOURCE_INTERRUPT_CHALLENGE "fishing_spot_interrupt_challenge" diff --git a/code/__DEFINES/fish.dm b/code/__DEFINES/fish.dm index 62954a649e2..24c3c963598 100644 --- a/code/__DEFINES/fish.dm +++ b/code/__DEFINES/fish.dm @@ -3,6 +3,7 @@ // Baseline fishing difficulty levels #define FISHING_DEFAULT_DIFFICULTY 15 +#define FISHING_EASY_DIFFICULTY 10 /// Difficulty modifier when bait is fish's favorite #define FAV_BAIT_DIFFICULTY_MOD -5 @@ -52,6 +53,8 @@ #define FISHING_LINE_BOUNCY (1 << 2) /// The sorta opposite of FISHING_LINE_BOUNCY. It makes it slower to gain completion and faster to lose it. #define FISHING_LINE_STIFF (1 << 3) +///Skip the biting phase and go straight to the fishing phase. +#define FISHING_LINE_AUTOREEL (1 << 4) ///Keeps the bait from falling from gravity, instead allowing the player to move the bait down with right click. #define FISHING_MINIGAME_RULE_BIDIRECTIONAL (1 << 0) @@ -65,6 +68,8 @@ #define FISHING_MINIGAME_RULE_ANTIGRAV (1 << 4) ///Will filp the minigame hud for the duration of the effect #define FISHING_MINIGAME_RULE_FLIP (1 << 5) +///Skip the biting phase and go straight to the minigame, avoiding the penalty for having slow reflexes. +#define FISHING_MINIGAME_AUTOREEL (1 << 6) ///all the effects that are active and will last for a few seconds before triggering a cooldown #define FISHING_MINIGAME_ACTIVE_EFFECTS (FISHING_MINIGAME_RULE_ANTIGRAV|FISHING_MINIGAME_RULE_FLIP) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index c82164dd7f4..ba9e4912aff 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -545,20 +545,20 @@ return return attempt_pickup(user) -/obj/item/proc/attempt_pickup(mob/user) +/obj/item/proc/attempt_pickup(mob/user, skip_grav = FALSE) . = TRUE if(!(interaction_flags_item & INTERACT_ITEM_ATTACK_HAND_PICKUP)) //See if we're supposed to auto pickup. return - //Heavy gravity makes picking up things very slow. - var/grav = user.has_gravity() - if(grav > STANDARD_GRAVITY) - var/grav_power = min(3,grav - STANDARD_GRAVITY) - to_chat(user,span_notice("You start picking up [src]...")) - if(!do_after(user, 30 * grav_power, src)) - return - + if(!skip_grav) + //Heavy gravity makes picking up things very slow. + var/grav = user.has_gravity() + if(grav > STANDARD_GRAVITY) + var/grav_power = min(3,grav - STANDARD_GRAVITY) + to_chat(user,span_notice("You start picking up [src]...")) + if(!do_after(user, 30 * grav_power, src)) + return //If the item is in a storage item, take it out var/outside_storage = !loc.atom_storage diff --git a/code/modules/fishing/fishing_equipment.dm b/code/modules/fishing/fishing_equipment.dm index b1e5ddc4c18..4b30951d89a 100644 --- a/code/modules/fishing/fishing_equipment.dm +++ b/code/modules/fishing/fishing_equipment.dm @@ -41,12 +41,68 @@ /obj/item/fishing_line/sinew name = "fishing sinew" desc = "An all-natural fishing line made of stretched out sinew. A bit stiff, but usable to fish in extreme enviroments." - icon = 'icons/obj/fishing.dmi' icon_state = "reel_sinew" - icon_state = "reel_green" fishing_line_traits = FISHING_LINE_REINFORCED|FISHING_LINE_STIFF line_color = "#d1cca3" +/** + * A special line reel that let you skip the biting phase of the minigame, netting you a completion bonus, + * and thrown hooked items at you, so you can rapidly catch them from afar. + * It may also work on mobs if the right hook is attached. + */ +/obj/item/fishing_line/auto_reel + name = "fishing line auto-reel" + desc = "A fishing line that automatically starts reeling in fish the moment they bite. Also good for hurling things at yourself." + icon_state = "reel_auto" + fishing_line_traits = FISHING_LINE_AUTOREEL + line_color = "#F88414" + +/obj/item/fishing_line/auto_reel/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_FISHING_EQUIPMENT_SLOTTED, PROC_REF(line_equipped)) + +/obj/item/fishing_line/auto_reel/proc/line_equipped(datum/source, obj/item/fishing_rod/rod) + SIGNAL_HANDLER + RegisterSignal(rod, COMSIG_FISHING_ROD_HOOKED_ITEM, PROC_REF(on_hooked_item)) + RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(on_removed)) + +/obj/item/fishing_line/auto_reel/proc/on_removed(atom/movable/source, atom/old_loc, dir, forced) + SIGNAL_HANDLER + UnregisterSignal(src, COMSIG_MOVABLE_MOVED) + UnregisterSignal(old_loc, COMSIG_FISHING_ROD_HOOKED_ITEM) + +/obj/item/fishing_line/auto_reel/proc/on_hooked_item(obj/item/fishing_rod/source, atom/target, mob/living/user) + SIGNAL_HANDLER + if(!ismovable(target)) + return + var/atom/movable/movable_target = target + var/please_be_gentle = FALSE + var/atom/destination + var/datum/callback/throw_callback + if(isliving(movable_target) || !isitem(movable_target)) + destination = get_step_towards(user, target) + please_be_gentle = TRUE + else + destination = user + throw_callback = CALLBACK(src, PROC_REF(clear_hitby_signal), movable_target) + RegisterSignal(movable_target, COMSIG_ATOM_PREHITBY, PROC_REF(catch_it_chucklenut)) + + if(!movable_target.safe_throw_at(destination, source.cast_range, 2, callback = throw_callback, gentle = please_be_gentle)) + UnregisterSignal(movable_target, COMSIG_ATOM_PREHITBY) + else + playsound(src, 'sound/weapons/batonextend.ogg', 50, TRUE) + +/obj/item/fishing_line/auto_reel/proc/catch_it_chucklenut(obj/item/source, atom/hit_atom, datum/thrownthing/throwingdatum) + SIGNAL_HANDLER + var/mob/living/user = throwingdatum.initial_target.resolve() + if(QDELETED(user) || hit_atom != user) + return + if(user.try_catch_item(source, skip_throw_mode_check = TRUE, try_offhand = TRUE)) + return COMSIG_HIT_PREVENTED + +/obj/item/fishing_line/auto_reel/proc/clear_hitby_signal(obj/item/item) + UnregisterSignal(item, COMSIG_ATOM_PREHITBY) + // Hooks /obj/item/fishing_hook diff --git a/code/modules/fishing/fishing_minigame.dm b/code/modules/fishing/fishing_minigame.dm index a5e1dd142b1..e2108848b0b 100644 --- a/code/modules/fishing/fishing_minigame.dm +++ b/code/modules/fishing/fishing_minigame.dm @@ -18,9 +18,15 @@ // Acceleration mod when bait is over fish #define FISH_ON_BAIT_ACCELERATION_MULT 0.6 /// The minimum velocity required for the bait to bounce -#define BAIT_MIN_VELOCITY_BOUNCE 200 +#define BAIT_MIN_VELOCITY_BOUNCE 150 /// The extra deceleration of velocity that happens when the bait switches direction -#define BAIT_DECELERATION_MULT 2 +#define BAIT_DECELERATION_MULT 1.5 + +/// Reduce initial completion rate depending on difficulty +#define MAX_FISH_COMPLETION_MALUS 15 +/// The window of time between biting phase and back to baiting phase +#define BITING_TIME_WINDOW 4 SECONDS + ///Defines to know how the bait is moving on the minigame slider. #define REELING_STATE_IDLE 0 @@ -162,6 +168,8 @@ if(rod.line.fishing_line_traits & FISHING_LINE_STIFF) completion_loss += 1 completion_gain -= 1 + if(rod.line.fishing_line_traits & FISHING_LINE_AUTOREEL) + special_effects |= FISHING_MINIGAME_AUTOREEL if(rod.hook) if(rod.hook.fishing_hook_traits & FISHING_HOOK_WEIGHTED) bait_bounce_mult = 0.1 @@ -180,6 +188,9 @@ difficulty += comp.fish_source.calculate_difficulty(reward_path, rod, user, src) difficulty = clamp(round(difficulty), 1, 100) + if(difficulty > FISHING_EASY_DIFFICULTY) + completion -= round(MAX_FISH_COMPLETION_MALUS * (difficulty/100), 1) + if(HAS_TRAIT(user, TRAIT_REVEAL_FISH) || (user.mind && HAS_TRAIT(user.mind, TRAIT_REVEAL_FISH))) fish_icon = GLOB.specific_fish_icons[reward_path] || "fish" @@ -259,7 +270,7 @@ return if(phase == WAIT_PHASE) //Reset wait send_alert("miss!") - start_baiting_phase() + start_baiting_phase(TRUE) else if(phase == BITING_PHASE) start_minigame_phase() return COMSIG_MOB_CANCEL_CLICKON @@ -302,14 +313,19 @@ if(!QDELETED(src)) qdel(src) -/datum/fishing_challenge/proc/start_baiting_phase() +/datum/fishing_challenge/proc/start_baiting_phase(penalty = FALSE) + var/wait_time + if(penalty) + wait_time = min(timeleft(next_phase_timer) + rand(3 SECONDS, 5 SECONDS), 30 SECONDS) + else + wait_time = rand(1 SECONDS, 30 SECONDS) + if(special_effects & FISHING_MINIGAME_AUTOREEL && wait_time >= 15 SECONDS) + wait_time = max(wait_time - 7.5 SECONDS, 15 SECONDS) 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_REF(start_biting_phase)), wait_time, TIMER_STOPPABLE) /datum/fishing_challenge/proc/start_biting_phase() @@ -342,9 +358,11 @@ send_alert("!!!") animate(lure, pixel_y = 3, time = 5, loop = -1, flags = ANIMATION_RELATIVE) animate(pixel_y = -3, time = 5, flags = ANIMATION_RELATIVE) + if(special_effects & FISHING_MINIGAME_AUTOREEL) + start_minigame_phase(auto_reel = TRUE) + return // Setup next phase - var/wait_time = rand(3 SECONDS, 6 SECONDS) - next_phase_timer = addtimer(CALLBACK(src, PROC_REF(start_baiting_phase)), wait_time, TIMER_STOPPABLE) + next_phase_timer = addtimer(CALLBACK(src, PROC_REF(start_baiting_phase)), BITING_TIME_WINDOW, TIMER_STOPPABLE) ///The damage dealt per second to the fish when FISHING_MINIGAME_RULE_KILL is active. #define FISH_DAMAGE_PER_SECOND 2 @@ -366,7 +384,21 @@ var/damage = CEILING((world.time - start_time)/10 * FISH_DAMAGE_PER_SECOND, 1) reward.adjust_health(reward.health - damage) -/datum/fishing_challenge/proc/start_minigame_phase() +/datum/fishing_challenge/proc/start_minigame_phase(auto_reel = FALSE) + if(auto_reel) + completion *= 1.3 + else + var/time_left = timeleft(next_phase_timer) + switch(time_left) + if(0 to BITING_TIME_WINDOW - 3 SECONDS) + completion *= 0.65 + if(BITING_TIME_WINDOW - 3 SECONDS to BITING_TIME_WINDOW - 2 SECONDS) + completion *= 0.82 + if(BITING_TIME_WINDOW - 1 SECONDS to BITING_TIME_WINDOW - 0.5 SECONDS) + completion *= 1.2 + if(BITING_TIME_WINDOW - 0.5 SECONDS to BITING_TIME_WINDOW) + completion *= 1.4 + completion = round(completion, 1) if(!prepare_minigame_hud()) return phase = MINIGAME_PHASE @@ -691,3 +723,5 @@ #undef REELING_STATE_UP #undef REELING_STATE_DOWN +#undef MAX_FISH_COMPLETION_MALUS +#undef BITING_TIME_WINDOW diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index 8a3035a9cc9..0578ffb0789 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -39,6 +39,9 @@ ///The name of the icon state of the reel overlay var/reel_overlay = "reel_overlay" + ///Prevents spamming the line casting, without affecting the player's click cooldown. + COOLDOWN_DECLARE(casting_cd) + /obj/item/fishing_rod/Initialize(mapload) . = ..() register_context() @@ -220,6 +223,8 @@ if(!CheckToolReach(user, target, cast_range)) balloon_alert(user, "cannot reach there!") return + if(!COOLDOWN_FINISHED(src, casting_cd)) + return /// Annoyingly pre attack is only called in melee SEND_SIGNAL(target, COMSIG_PRE_FISHING) casting = TRUE @@ -232,6 +237,7 @@ cast_projectile.impacted = list(user = TRUE) cast_projectile.preparePixelProjectile(target, user) cast_projectile.fire() + COOLDOWN_START(src, casting_cd, 1 SECONDS) /// Called by hook projectile when hitting things /obj/item/fishing_rod/proc/hook_hit(atom/atom_hit_by_hook_projectile) @@ -361,9 +367,7 @@ 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) + use_slot(params["slot"], user, held_item == src ? null : held_item) return TRUE /// Ideally this will be replaced with generic slotted storage datum + display @@ -404,6 +408,9 @@ user.put_in_hands(current_item) balloon_alert(user, "[slot] swapped") + if(new_item) + SEND_SIGNAL(new_item, COMSIG_FISHING_EQUIPMENT_SLOTTED, src) + update_icon() playsound(src, 'sound/items/click.ogg', 50, TRUE) diff --git a/code/modules/fishing/sources/source_types.dm b/code/modules/fishing/sources/source_types.dm index edab6dc0db5..5cdc2d2b841 100644 --- a/code/modules/fishing/sources/source_types.dm +++ b/code/modules/fishing/sources/source_types.dm @@ -262,7 +262,7 @@ fish_counts = list( /obj/item/storage/wallet/money = 2, ) - fishing_difficulty = FISHING_DEFAULT_DIFFICULTY - 5 //For beginners + fishing_difficulty = FISHING_EASY_DIFFICULTY //For beginners /datum/fish_source/holographic catalog_description = "Holographic water" @@ -275,7 +275,7 @@ /obj/item/fish/holo/checkered = 5, /obj/item/fish/holo/halffish = 5, ) - fishing_difficulty = FISHING_DEFAULT_DIFFICULTY - 5 + fishing_difficulty = FISHING_EASY_DIFFICULTY /datum/fish_source/holographic/reason_we_cant_fish(obj/item/fishing_rod/rod, mob/fisherman, atom/parent) . = ..() @@ -332,7 +332,7 @@ /mob/living/basic/frog = 1, /mob/living/basic/axolotl = 1, ) - fishing_difficulty = FISHING_DEFAULT_DIFFICULTY - 10 + fishing_difficulty = FISHING_EASY_DIFFICULTY - 5 /datum/fish_source/hydro_tray/reason_we_cant_fish(obj/item/fishing_rod/rod, mob/fisherman, atom/parent) if(!istype(parent, /obj/machinery/hydroponics/constructable)) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index d0717972d59..909cf50618b 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -69,25 +69,19 @@ if(P.catastropic_dismemberment) apply_damage(P.damage, P.damtype, BODY_ZONE_CHEST, wound_bonus = P.wound_bonus) //stops a projectile blowing off a limb effectively doing no damage. Mostly relevant for sniper rifles. -/mob/living/carbon/proc/can_catch_item(skip_throw_mode_check) - . = FALSE +/mob/living/carbon/try_catch_item(obj/item/item, skip_throw_mode_check = FALSE, try_offhand = FALSE) + . = ..() + if(.) + throw_mode_off(THROW_MODE_TOGGLE) + +/mob/living/carbon/can_catch_item(skip_throw_mode_check = FALSE, try_offhand = FALSE) if(!skip_throw_mode_check && !throw_mode) - return - if(get_active_held_item()) - return - if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) - return - return TRUE + return FALSE + return ..() -/mob/living/carbon/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) - if(!skipcatch && can_catch_item() && isitem(AM) && !HAS_TRAIT(AM, TRAIT_UNCATCHABLE) && isturf(AM.loc)) - var/obj/item/I = AM - I.attack_hand(src) - if(get_active_held_item() == I) //if our attack_hand() picks up the item... - visible_message(span_warning("[src] catches [I]!"), \ - span_userdanger("You catch [I] in mid-air!")) - throw_mode_off(THROW_MODE_TOGGLE) - return TRUE +/mob/living/carbon/hitby(atom/movable/movable, skipcatch, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) + if(!skipcatch && try_catch_item(movable)) + return TRUE return ..() /mob/living/carbon/send_item_attack_message(obj/item/I, mob/living/user, hit_area, def_zone) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 55cb51c97dd..3a4b0091b51 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -222,6 +222,26 @@ hitpush = FALSE return ..() +///The core of catching thrown items, which non-carbons cannot without the help of items or abilities yet, as they've no throw mode. +/mob/living/proc/try_catch_item(obj/item/item, skip_throw_mode_check = FALSE, try_offhand = FALSE) + if(!can_catch_item(skip_throw_mode_check, try_offhand) || !isitem(item) || HAS_TRAIT(item, TRAIT_UNCATCHABLE) || !isturf(item.loc)) + return FALSE + if(!can_hold_items(item)) + return FALSE + INVOKE_ASYNC(item, TYPE_PROC_REF(/obj/item, attempt_pickup), src, TRUE) + if(get_active_held_item() == item) //if our attack_hand() picks up the item... + visible_message(span_warning("[src] catches [item]!"), \ + span_userdanger("You catch [item] in mid-air!")) + return TRUE + +///Checks the requites for catching a throw item. +/mob/living/proc/can_catch_item(skip_throw_mode_check = FALSE, try_offhand = FALSE) + if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) + return FALSE + if(get_active_held_item() && (!try_offhand || get_inactive_held_item() || !swap_hand())) + return FALSE + return TRUE + /mob/living/fire_act() . = ..() adjust_fire_stacks(3) diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index ae8f7e43a40..e17b53da692 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -972,7 +972,7 @@ category = list( RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE ) - departmental_flags = DEPARTMENT_BITFLAG_SERVICE + departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE /datum/design/stabilized_hook name = "Gyro-Stabilized Hook" @@ -984,7 +984,19 @@ category = list( RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE ) - departmental_flags = DEPARTMENT_BITFLAG_SERVICE + departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/auto_reel + name = "Fishing Line Auto-Reel" + desc = "An advanced line reel which can be used speed up both fishing and casually snagging other items in your direction." + id = "auto_reel" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 4, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 3) + build_path = /obj/item/fishing_line/auto_reel + category = list( + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE + ) + departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE /datum/design/fish_analyzer name = "Fish Analyzer" @@ -996,7 +1008,7 @@ category = list( RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE ) - departmental_flags = DEPARTMENT_BITFLAG_SERVICE + departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE // Coffeemaker Stuff diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 32d834a19ba..4a02e368a8e 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -1549,6 +1549,7 @@ design_ids = list( "fishing_rod_tech", "stabilized_hook", + "auto_reel", "fish_analyzer", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) diff --git a/icons/obj/fishing.dmi b/icons/obj/fishing.dmi index 8e8be783fb7a9d2704768ac100b401f8329f69f1..92d7da8238ad348869ec29ff39174c661fa1f35b 100644 GIT binary patch literal 17567 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 Wv?P;ccko|305Xz_5=CPA{{I82hjYFF