From e43d8fe08fe0e5da43c06ec8c5056234694fc33a Mon Sep 17 00:00:00 2001 From: mochi Date: Tue, 27 Oct 2020 13:11:51 +0100 Subject: [PATCH 1/3] Aquarium QoL: Fish bag, lower hunger rate and more --- .../items/stacks/sheets/sheet_types.dm | 1 + .../objects/items/weapons/storage/fancy.dm | 3 +- code/modules/fish/fish_items.dm | 15 +++ code/modules/fish/fishtank.dm | 106 +++++++++++++----- icons/obj/fish_items.dmi | Bin 34359 -> 35590 bytes 5 files changed, 96 insertions(+), 29 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 6b70ac015ca..af8ecce34ab 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -222,6 +222,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ new/datum/stack_recipe("mining satchel", /obj/item/storage/bag/ore, 4), \ new/datum/stack_recipe("chemistry bag", /obj/item/storage/bag/chemistry, 4), \ new/datum/stack_recipe("bio bag", /obj/item/storage/bag/bio, 4), \ + new/datum/stack_recipe("fish bag", /obj/item/storage/bag/fish, 4), \ null, \ new/datum/stack_recipe("improvised gauze", /obj/item/stack/medical/bruise_pack/improvised, 1, 2, 6), \ new/datum/stack_recipe("rag", /obj/item/reagent_containers/glass/rag, 1), \ diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 0cb1fd92f97..417e5e451f7 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -395,7 +395,7 @@ med_bot_skin = "fish" /obj/item/storage/firstaid/aquatic_kit/full - desc = "It's a starter kit for an acquarium; includes 1 tank brush, 1 egg scoop, 1 fish net, and 1 container of fish food." + desc = "It's a starter kit for an aquarium; includes 1 tank brush, 1 egg scoop, 1 fish net, 1 container of fish food and 1 fish bag." /obj/item/storage/firstaid/aquatic_kit/full/New() ..() @@ -403,3 +403,4 @@ new /obj/item/fish_net(src) new /obj/item/tank_brush(src) new /obj/item/fishfood(src) + new /obj/item/storage/bag/fish(src) diff --git a/code/modules/fish/fish_items.dm b/code/modules/fish/fish_items.dm index bb31226f42a..ebab27e3af2 100644 --- a/code/modules/fish/fish_items.dm +++ b/code/modules/fish/fish_items.dm @@ -55,6 +55,21 @@ to_chat(viewers(user), "[user] is vigorously scrubbing [user.p_them()]self raw with the [name]! It looks like [user.p_theyre()] trying to commit suicide.") return BRUTELOSS|FIRELOSS +/obj/item/storage/bag/fish + name = "fish bag" + icon = 'icons/obj/fish_items.dmi' + icon_state = "bag" + storage_slots = 100 + max_combined_w_class = 100 + max_w_class = WEIGHT_CLASS_NORMAL + w_class = WEIGHT_CLASS_TINY + can_hold = list( + /obj/item/fish, + /obj/item/fish_eggs, + /obj/item/reagent_containers/food/snacks/shrimp, + ) + resistance_flags = FLAMMABLE + ////////////////////////////////////////////// // Fish Items // ////////////////////////////////////////////// diff --git a/code/modules/fish/fishtank.dm b/code/modules/fish/fishtank.dm index d54e22c6fc4..3e3303b53b4 100644 --- a/code/modules/fish/fishtank.dm +++ b/code/modules/fish/fishtank.dm @@ -130,23 +130,23 @@ ////////////////////////////// /obj/machinery/fishtank/update_icon() - overlays.Cut() + cut_overlays() //Update Alert Lights if(has_lid) //Skip the alert lights for aquariums that don't have lids (fishbowls) if(egg_count > 0) //There is at least 1 egg to harvest - overlays += "over_egg" + add_overlay("over_egg") if(lid_switch == 1) //Lid is closed, lid status light is red - overlays += "over_lid_1" + add_overlay("over_lid_1") else //Lid is open, lid status light is green - overlays += "over_lid_0" + add_overlay("over_lid_0") if(food_level > 5) //Food_level is high and isn't a concern yet - overlays += "over_food_0" + add_overlay("over_food_0") else if(food_level > 2) //Food_level is starting to get low, but still above the breeding threshold - overlays += "over_food_1" + add_overlay("over_food_1") else //Food_level is below breeding threshold, or fully consumed, feed the fish! - overlays += "over_food_2" - overlays += "over_leak_[leaking]" //Green if we aren't leaking, light blue and slow blink if minor link, dark blue and rapid flashing for major leak + add_overlay("over_food_2") + add_overlay("over_leak_[leaking]") //Green if we aren't leaking, light blue and slow blink if minor link, dark blue and rapid flashing for major leak //Update water overlay if(!water_level) @@ -154,9 +154,23 @@ var/water_type = "_clean" //Default to clean water if(filth_level > 5) water_type = "_dirty" //Show dirty water above filth_level 5 (breeding threshold) if(water_level > (water_capacity * 0.85)) //Show full if the water_level is over 85% of water_capacity - overlays += "over_[tank_type]_full[water_type]" + add_overlay("over_[tank_type]_full[water_type]") else if(water_level > (water_capacity * 0.35)) //Show half-full if the water_level is over 35% of water_capacity - overlays += "over_[tank_type]_half[water_type]" + add_overlay("over_[tank_type]_half[water_type]") + +/obj/machinery/fishtank/wall/update_icon() + ..() + // Update fish overlay for wall tanks + var/num_fish = length(fish_list) + if(!num_fish) + return + switch(num_fish) + if(1 to 3) + add_overlay("over_tank_fish_33") + if(4 to 7) + add_overlay("over_tank_fish_66") + if(7 to INFINITY) + add_overlay("over_tank_fish_100") ////////////////////////////// // PROCESS PROC // @@ -187,16 +201,16 @@ //Check breeding conditions if(fish_count >=2 && egg_count < max_fish) //Need at least 2 fish to breed, but won't breed if there are as many eggs as max_fish - if(food_level >= 0.2 && filth_level <=5) //Breeding is going to use extra food, and the filth_level shouldn't be too high + if(food_level >= 0.1 && filth_level <=5) //Breeding is going to use extra food, and the filth_level shouldn't be too high if(prob(((fish_count - 2) * 5)+10)) //Chances increase with each additional fish, 10% base + 5% per additional fish breed_fish() - adjust_food_level(-0.2) //Remove extra food for the breeding process + adjust_food_level(-0.1) //Remove extra food for the breeding process ate_food = 1 //Handle standard food and filth adjustments if(food_level > 0 && prob(50)) //Chance for the fish to eat some food - if(food_level >= (fish_count * 0.1)) //If there is at least enough food to go around, feed all the fish - adjust_food_level(fish_count * -0.1) + if(food_level >= (fish_count * 0.05)) //If there is at least enough food to go around, feed all the fish + adjust_food_level(fish_count * -0.05) else //Use up the last of the food adjust_food_level(-food_level) ate_food = 1 @@ -270,6 +284,7 @@ if(istype(fish_type, /datum/fish/glofish)) adjust_tank_light() qdel(fish_type) + update_icon() /obj/machinery/fishtank/proc/add_fish(datum/fish/fish_type = null) //Check if we were passed a fish type @@ -279,44 +294,68 @@ fish_count++ //Increase fish_count to reflect the introduction of a fish, so the everything else works fine //Announce the new fish visible_message("A new [fish_type.fish_name] has hatched in [src]!") + update_icon() //Null type fish are dud eggs, give a message to inform the player else to_chat(usr, "The eggs disolve in the water. They were duds!") -/obj/machinery/fishtank/proc/harvest_eggs(mob/user) +/obj/machinery/fishtank/proc/harvest_eggs(mob/user, obj/item/storage/bag/fish/fish_bag) if(!egg_count) //Can't harvest non-existant eggs return if(egg_count > max_fish) //Make sure the number of eggs doesn't exceed the max_fish for the tank egg_count = max_fish //If you somehow exceeded the cap, set the egg_count to max, destroy the excess later + var/duds = 0 while(egg_count > 0) //Loop until you've harvested all the eggs var/obj/item/fish_eggs/egg = pick(egg_list) //Select an egg at random - egg = new egg(get_turf(user)) //Spawn the egg at the user's feet + if(egg != /obj/item/fish_eggs) // Don't harvest duds + egg = new egg(fish_bag || get_turf(user)) //Spawn the egg at the user's feet + else + duds++ egg_list.Remove(egg) //Remove the egg from the egg_list egg_count -- //Decrease the egg_count and begin again egg_list.Cut() //Destroy any excess eggs, clearing the egg_list + if(duds) + to_chat(user, "[duds] egg\s [duds == 1 ? "was a dud" : "were duds"]!") /obj/machinery/fishtank/proc/harvest_fish(mob/user) if(fish_count <= 0) //Can't catch non-existant fish! to_chat(user, "There are no fish in [src] to catch!") return - var/list/fish_names_list = list() - for(var/datum/fish/fish_type in fish_list) - fish_names_list += list("[fish_type.fish_name]" = fish_type) - var/caught_fish = input("Select a fish to catch.", "Fishing") as null|anything in fish_names_list //Select a fish from the tank + var/list/fish_types = list() + var/list/fish_types_input = list() + for(var/datum/fish/F in fish_list) // Group up the fish first + fish_types[F.type] += list(F) + for(var/key in fish_types) // Then populate the list + var/datum/fish/fish_type = key + var/count = length(fish_types[key]) + fish_types_input += list("[initial(fish_type.fish_name)][count > 1 ? " (x[count])" : ""]" = fish_types[key]) + var/caught_fish = input("Select a fish to catch.", "Fishing") as null|anything in fish_types_input //Select a fish from the tank if(fish_count <= 0) to_chat(user, "There are no fish in [src] to catch!") return else if(caught_fish) - user.visible_message("[user.name] harvests \a [caught_fish] from [src].", "You scoop \a [caught_fish] out of [src].") - var/datum/fish/fish_type = fish_names_list[caught_fish] - var/fish_item = fish_type.fish_item + var/list/fishes_of_type = fish_types_input[caught_fish] + var/datum/fish/fish_to_scoop = pick(fishes_of_type) + // Is the user holding a fish bag? + var/obj/item/storage/bag/fish_bag + if(istype(user.r_hand, /obj/item/storage/bag/fish)) + fish_bag = user.r_hand + else if(istype(user.l_hand, /obj/item/storage/bag/fish)) + fish_bag = user.l_hand + var/fish_name = fish_to_scoop.fish_name + if(fish_bag) + user.visible_message("[user.name] scoops \a [fish_name] from [src] into [fish_bag].", "You scoop \a [fish_name] out of [src] into [fish_bag].") + else + user.visible_message("[user.name] scoops \a [fish_name] from [src].", "You scoop \a [fish_name] out of [src].") + // Move the fish in + var/fish_item = fish_to_scoop.fish_item if(fish_item) - new fish_item(get_turf(user)) //Spawn the appropriate fish_item at the user's feet. - kill_fish(fish_type) //Kill the caught fish from the tank - //Update the air for the turf, to avoid permanent atmos sealing with wall tanks + new fish_item(fish_bag || get_turf(user)) //Spawn the appropriate fish_item at the user's feet or in their held fish bag. + kill_fish(fish_to_scoop) //Kill the caught fish from the tank + /obj/machinery/fishtank/proc/spill_water() var/turf/simulated/T = get_turf(src) switch(tank_type) @@ -527,6 +566,8 @@ return ..() /obj/machinery/fishtank/attack_hand(mob/user) + if(isAI(user)) + return user.changeNext_move(CLICK_CD_MELEE) if(user.a_intent == INTENT_HARM) playsound(get_turf(src), 'sound/effects/glassknock.ogg', 80, 1) @@ -635,8 +676,17 @@ //Fish egg scoop else if(istype(O, /obj/item/egg_scoop)) if(egg_count) - user.visible_message("[user.name] harvests some fish eggs from [src].", "You scoop the fish eggs out of [src].") - harvest_eggs(user) + // Is the user holding a fish bag? + var/obj/item/storage/bag/fish_bag + if(istype(user.r_hand, /obj/item/storage/bag/fish)) + fish_bag = user.r_hand + else if(istype(user.l_hand, /obj/item/storage/bag/fish)) + fish_bag = user.l_hand + if(fish_bag) + user.visible_message("[user.name] harvests some fish eggs from [src] into [fish_bag].", "You scoop the fish eggs out of [src] into [fish_bag].") + else + user.visible_message("[user.name] harvests some fish eggs from [src].", "You scoop the fish eggs out of [src].") + harvest_eggs(user, fish_bag) else user.visible_message("[user.name] fails to harvest any fish eggs from [src].", "There are no fish eggs in [src] to scoop out.") //Fish net diff --git a/icons/obj/fish_items.dmi b/icons/obj/fish_items.dmi index 76a9486fee604f8137f5cd307b79c70521c3ddc8..302e144ba24d211aaa721775ae37d038fe124714 100644 GIT binary patch delta 14027 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 IS&Oj$0d}wl%K!iX delta 12906 zcmYkjbyQSg*Z(~*(k;>r0t!k?cL_);AR#443(^P!hwg3>L>dL8LApzjmZ2NzW`G%( zncsLn_xn8WT4${@f1EROogLTrv-jB(k%8S5hn++N1mWX?K%j%{MpqCB>$ji2k*D%I z4{LXa51tOLE+CL^PD6&4)20A<#Q0Se`H?~E!^XOaQ2rMh!}&;}w{PR$ks&-x>F0(N=}6Q7^m!rxtUHCDBrQ})^*ADK+vy-DwP_F`1#-T(dsx863Y zH1V+_pgb89DRY>}6m}h1J0YrBKy^^N3uZjMM3Ly*kEWF%H4j9nWJ}o8y~zDXc6ZgnM8i?v6_?fy(0;HqIhJCOP}wSxY6ocaLpR@YxHbzd$@ z|2e+(54A<|M6{_02qv+YFPPcw2!Gd5(OKqq(qMANe!1e5zVd;(aib<|?WY8JNNYy# zZ$*M`vlqLXKQsQk&VMHs^`upfLN!w+IQEfs7JD3@e-^c#Y7yNdz~E`Yl3Me#r|jlM z1iqsD-eBR+h;HUAXgGf13mv<#$ztex<+wehFYennx;agDx*qUq2OAEC z`MYvNKE>3|r;EmxkuK=>jP3h}9pC6TAJCCRju21cX=PJXh zL*nAreriqG$S6H&5!(*YV&#EGOg%M$Re78Bg`}=L&G-3C&&NJbP5nKl^#z;xY=osk z^JA5s-|7zYS+ModbL6J)6*wFIjo`}*cx~a2#ZD7j1psLUoIsJ!4 z!1G3D6-8Fjsou0-<&Z5aAP{6yiTl+Jo1h(qjD1eJndl=+?h49~Ku_@|S&*O*i5A`P zO!G6U1QHpN+xZ=fpz~(_wYwKpBEADZ_kfRw&&B=Due*AA629EY_%Yw=r3{P7yPf_V zR8G+tBr8JKjdv#bE>r+52>$lhQ{$bNga@uEILOGzNI_|7Vy$UU!sg+zolo4cHyg>l z;(~!~>q<|aK3!jKT6sXKJ}rXWnv^g*&Xw%M^Om1M6l;RJqR%#?CG*eutJbcL7J+|1 z{xjfK^jBwFivARdZvLYOgqWj-s;6km0q4Lq5_S@ZT%=PwQAKVaJWbcos5Df{*Cp=+ zP#$<;9&9^c(73d5A7+t3c6k66=JSJ9m<}q;v4IeoDiu0b0Efq9*#;U!sXVDV>I;@jWa8J8@ywDPif zktGf-tGAPt2&e24GBPr2e}B_AuHW=uifBy_4h~{<{q?j-8wUcgdV71z49go&^hvkg zzj*PYAnxwnW(5TwPEbH1Rx3-42d=yP3}<23?n$d_`(r|R#)u@BF|p1-TnlOUx!I#q zNZak~=bPPByqi4qEl-BIU%!t6VK!cj+e_Y4j92ECm#J_H&8rGcDmVW5WKj0@j_77& zz?jLt-8R?+z|Hnn&ndhc;q|?O(cXb7+4Iccg z*ww+M35vSC<%~t7o-xtVl3Q^!S=W8-JcKwlWFN?49^^k?vXB;W2pO6OC43=0B%zeV z4O;hogTDkWz-HAZjv{U)(QP0iKqC&Scwd~P1D?kC1?E+on7HgZkPF1A>O{4;qwYQ~ zyE>H^J5BIb$b(No&SIaFaPB`10RVzcS2Tz_acs{#JgKGZ#W+&;!9B@LQ+oH2-sl{k zQa$@poSbLKcVH0#0ZUBs@d42kHn2j30C#nV;^|dERd|hDwk7vekq(x$0>sg)E92&q zc|$Fz#l^)R(E8?Pg02;T=JoX;;I@_U%g5TeiAA;??TcOYHFwm@&OoM+vH)It7G@jvTGMWBz}MZ&p!KADKF8d=vj`c6)gBxtKg4k zJZr&>$6os#kj-m?U4DkeFeOv2#|=$_Gg6a#Lmy<|RN(gB49w&1fNzMq^%6nVgk8cq z)bB%s^g$hPm@uttAr3GVcUJoB-ClbNs-Gj00arl|v8AvZ?0X+uzz+`-P~wP#~sJS~) zo3BsDp8C9pBw{81)CXO$F!rpiv0_e&@XXij!l1xpm1MlT9!2d(dE>E)YVCOUYm6B) zP*dp5&CM%1)&%N!-c}ZqTNv>sKZ9L=v%MjKS*t1WobgTDMw69EsqyUU{Hgr?C884rY{*kpb$Wjv-on#aU_K;U{h>@sl<2 z9pN()(|?;OU5B1c8MxrXSRN0iI0D_zyo>ZLp2F}&adBsOvt9a{oIBJ(IY)umkGtl1@2uPc+?2>P&Mj|;uqHNG_J$iljvC;shRTYCmiQevRz{Q&`$tmvlgMCBf^8OX?M3+DUMhA#WKR%prR6XW zmdTHexg?W6LPkma*aCXFdIzCt$61?uIAID3ytpuP!Qs3ok$-gbo|ue`J8;z)Jr;C; zUipji>V-SIx<-1-%B$gdqFYK>7_eOcbJ3P=^;n&7S4&Iz2R-$ZB3e2H&y(~efB%F~ z+`yckJ!v!1;tZITGeb6`#A-7yxv9-7H=tF2797LEjB22NA3-*ZgEzjqCB{EY zPhe3)({PL9c4oqM5S`bToq*Z2MNX6|x{EZ*L{3P(DWnXh1l}0rO4Vql_(%@$jnz;{ ztYrUH2F_*Xi3F(|X;$*^aT}aljf4|Le2(Z;xfv*e>fj z`sWwEhTwsk-;kP`nr?_SukDG&b-t#K-!xrjaa5mh`$cfw3~O(12Z8AEJ^xnCdxhoJ zvf z=9F1kT7nu(w4%H`nC9qs9urkLA{_F48s*rv?ZWi3B16w;RT&Cd(txr5rROBY9#gX|6kqFR<&1Zk-+spNKUTGS!4Az zborvX#Rb_p|N7#6fOT3s}-}PI2%e zu4UfQn!x>#^+DGmsC!Vf>c*_a<8+Mjd zo)&m~RN1l~+#3NZqe>gu#u$hY8DVx;n%K(1eWFyKO}#%_4l%1t@YvwC&|wj487(XX z3g_nM36>DUEhzVqq)TqFvS%I2=LBpMm9 z&dYn1m&#@!e|4d9bUN6)+e)x3WUL_~QvZz;7Xs%kA(E`JM(e(D{C&VSJ8`pZ>4kUc9b0Q90lr3PUNV zFkxamo9F0ZqS-5NPa5bafDO64FK70`@G|q_j{~gJX%6C+H8(mVyiu&m-yR zXKE($*0B-i6WV~YjB{Z2@0~<{FGx0GUgrpq9WUjGWGn7(jzZM<@?FY z+qK=lUTXG0Fu1lQYb^NZ7QuXE6(0^0j*Ilb09VR%ltex^n`e*zT&V0wRCI#KzXV}dj;k>Jn<8(Xd|o^*e)6L=pw9WOPEqCWB7qERa4(xxHM0M zRjt+oSYBROmw@IA8|zn+%e^|qmh5cx;Qg>j3Zci-a=2?q{S@2KENr|45U4&}%5UL1 z2X+EtFGJ@mez>l3LTm;Mlv}Z!)Jbu0Nnn(8FV%N}h|Ejc?@_uyPUETWU@(U&j`)W# zrCqYeZYI`MBH%Ky*l*kzeHs1zpHqQrWPnzu@Z{9!FebrbuUolutLo>jQ#%ET z*9#+qAXR6%(YaH5%s33Z0|CHW_Gi802)oEG(p{97RvXF5{|e|aPJ@E*j>1W|n}<;G zOZ9Jt6(9Cv*TAqxuqs2#F z=#!Gq)0gbHv6SOsSr#6&O!-Z80OWO`^!}iAWmxx-y5)CsHl`o#%U>&Kv*nF*chRUyRU zOfLpLH|9$DXlGi?Gt@V+OVQAWCQpAos^vKIUs+$b!oX7Ozpf48`^;pfQN#ALH>R+^ z>*Ll+vw=mXuHDEt3c%yQqcZraUIk@Huv0-#!1vxF z3t4%P0TN%oeS3_=;E3CGM^pE~QxHa){;`Uyrq*6yE;&HA8XSx@>F*}|cWeb$f*FMI z^V~vhOGxeJq$@2@^#nmAqc6A%v1{Ma`Y`hxY=oQb2lAI z&50G!&9wGGP9yYl%vGeInW@p)yD*JX{|E2a6O3N7vy?8&mc0sB?VRs16O9|0;~4n+ zi{Wp(xaZ6-BGy1|9{G{8`&RZWOKx&s;+FCY+20c?RVF11oy0d*vlDaC;k0CWcJ|PI ztJqtu5X*XoM85IhEtu^r24`a!L=-4KDL?4i)!hs%KbS>-4&ZzjDEq-2B!3xVf7i1g zJ;$HGDE|n2xDhr4hisc(O=Lp&n(EUik3;k7Py9zz{ZeTvR#Ip%SSz~YdEHWyx_Rc_ z<+9f*Vab|vkxT*t`L7FGcXd%%x6Vt>piaXQ;?vbktOg`1{>);wDpeB!!1S!-Y&iE5 zIe1dl+&_d<8G5nHW=|BWdSmku?Azl!jDmleGY}>1_n^g0qseS#Z2X3Q` zo?0tmXH5LqK4)~+#@Pq~`pbYd;}51@t#w#&Cr5F-Lz^r!MB<`0In$Ng?3>*8RE82% zycM?~enj@PbD87Y85wzyNh4yj&y0>mU-C@H%TB(fyyT%nw`%!*Ri_yvFFLHKBro#P zzGiH-z9cvFJj&&05xi+$wSO-g)DB`1$A-)h9fcw#nU$>}OLN}?pgrGojZju;srT@83alGf4KE|0<*UX`k|~Z?3ifh+4Vv zO`IRDIrM&)gpC=Hj|}FxS^U-K$r!x+w|}jKP(@6;(vm)M zHX8g52dVPE@CH0x23StTI@qKJ4R6I3p+`n?@D%?zOsOIzCDl0ZH}ly^G`So8S(*S` z?WZh+DJ{Z|7d{E`_2|D0&om9@&Firx-w={5?$%OiC1DCTH$8COeg(RAIwI@SsB|!m zeOZ5*{h_MAUVq_uQp06#{GbU^m2AlSkVE7OzgkiCGcW*PCwU?JVOXHi=XX!4XxpRY zRu5c|d0C(g8n#IDU`zV`Z@^#$_}8|3<5>=G?5v0le@=UP#45D7ChxZLqS~P8%D-(K z5je`Zr8ZHpWIJKP*wQgMsdspI2*N+1-4$=D5w0R2J+fq=aqH!rW#mo=Iyg;oC1Cak z;A~5PAxn%x*#C`5Y9nOG8k8^*RhDJ@X7y_{IEnZkDWk%6yo%m@rS3QdR1n1AULIgw z?3VE|szJ(lmW7q$R+q+FB4``ZVhl)}*p5He1herW!BSs4N;Q7{J{YjMxAE8SMgfzL zljw8TOnwttQwQF9P)nZb_x~f`sUa4&ojQ}s7-|SSQS>oIZ3LBVuva1v2E-ym| z+GzHXzuxDM96nx-@m&A#01>(WpUA;5dt$I#0$zCch$a1){ItW`mjQMBdBLSOcpcZ% zSoJ2io7<0a|4Y-m7@7{FY=KPrvIpP!%jVIfk}OTdw)sr;MGtms!!szp?6U})6o5X6 zAL}0(RjvR^bItV5k~O@xD$jUIB#vyW2eXpo!7b)v!@;z~EKB+V_AJEL-*3i_X0NrJ zVk)0Yl1zZkZe#hN)(KwW`2EqIQt|*JinzZLZvd z?>!&HyN_Bgr0g8yp$ng^v)A#5;eA#?xvxq(ucra5J46G0f);(JgumEWlF|K#e-3K2 zUKG!+55!QQnTW+No;)m`mWgTXa2$Opxw4vpRWMt6qVTclapg?t{RpS&gVPTmi$sQl zFB7rEv7d-Vys{T8*=a7K_Aa~4s70yb+k-J$6@Gr73gbN0rhR@c)5}Eo7py&vJ_K*E zs5B5M9sJd#a=`XpyUBGRwf8_e%l_U^GoO_9WD#+%{j?7M8m_maw|vBF3k^=u=H-p2 z6ZW4vRs(PPUz>a|=H76GY?S`-W3IYWRmnyWEe8)ZK&hEqB)2h5I`WFjxrJuYP#9x<0GR-+lkr7CIE%^utsBa^tHKlNn;p;f}pWSF(Soa_zN0b&x z@v9?qQx2mA_9h9clxHz}w>HsMmW{dzu)`5H<&9~wm0c#<&^Josj~$Xo_JEu#SWhX* zveeX6(Bw`=S-w#kp+mD+ZdH+1SwAgHQ?(S^$)cHGuDNYnpnFGU$D}+6}X-6ZDULyFh1oU&+OJG-D)rK68RJio|?p4WeuP z)*-tZ<)13TG;v%6I~)$kgbP}_2|qcs4#No``BnoyNo^HzKzezX*mWKv5K#7xHBZjUqPMiz}$J20OtgY=|s%L z?Ee^l6y%qz|A@UZDUt!BmKz;Xs|G9#6+qFRuK4uH$A(2bFL>xC@`EJXnW<)(@OM52 zb}z1GfhCW~SkWCNAa94XREks4z|ONlfbup#mq@tf`#@d-&9dR6d-K0=2-V|d=M|+Unu)?F`DgffW%fx5m5ln6c_gx-OV}NzEWlCy!S(1Z_QPXAQ<#&n zrQGBOSIzVwC}xLiK|=bz^9lF(^?+?yibm->Sr?WW54+J@)GixH{&@7>hVz*pMLOz; zw%=vOqQl&j_V>DtbC$#L8?(MS4)VO*@>o@}%LzRGQxQU!* z87yZ~J4r7*pvc^$&M#C@l5HLy^<}4cD_3_0aqA*$isKFb;NWHT5xgK&p+R-ihLtEx z;&MD%rblpLt%@^xjV+Fi!8E?e@Q{cyXWW4Q#qo&$#c`TW)%Ju!Be=*YT?j=v>hA-0 z%nirab1r{YkNjTz59U1s(wQT`-$1G-gUZ=gro;C>0~yqFrDk2bSSvsTb1+DcUOz=7yRp`op_ z)vxmkv@}+bq_retX|LC%^dE`BYXd&`xWB2BAN%ZTCb$-8Ks7d1dwA8iOh2rh(;$?L$AEq65H`zvW zDCeKQ)xVgbg4Wu3WJ-*PCd@mz;>WpnorJRJ8Y@7=fh0;o3J))Vc2N#pQ)3ZCC&7LX zOJsDbroZ}e?l#F*gsMuGLj5u6CmHPLv>~z}lL%&;oi#t{21YU_98%h+TBbikO@2KX z5!-~1`4g~SX6L@ihZ44CUE5#^9ry4nk~jvp1G21lme$4HL$+D~=*O$S{V*9nwWZKp zm;vB~eojWGT}HPBY4a1qBsCB?dc)w|Zd7-cndPUj1^ERt?oVVZK`JMH!mjrog2-Kb~f+yLAo9M>QJSzNZIp^mll0rF$Ix6rr(j)aoO>x z0t1?}6%6!@UiIQHEc`48-gG&b4O3FS1z4#^7$TDWdseckaIyZ1_k~KS;#|tpeq)LA zrDwB(j0S8mtAejxu*i<*2IRM-v8vD8+prdcYMZ?W_!oMV%x-%r**kmSY6l;N2%@b~ zr^+_M4fm&61jaJGknM~F%j4HH@&2+uzpeRpKKpI1NZKqaZb{Q8gIG7Q+$sDq4Aiy$ zHKAn@eqfk2iIfa7OnYvd?w;!>%p74PIwX*jw91^+)`$Ud;gV?wwE`0EB7L4O+EF=) zFTd3vL2_7Hn0Jl?zu1yDp@O;D4riL4aMahZ$Bk>tK;9VF2caQ4`nrNa8jE*ftXl$c zsSy6tM3xp()~- z?`F3u9{Ki78hs?H@k_os7mT}zx!~!;gNaI!pWh~ElPBQ5au~*{IsdjEMbB9M$p?`u z3sQtZesRGKJxy@%;~nv1iP?z{aD?JSsDP zMfdT@D>t%d1?z!Qa+T*SeQ?m(0gFAUtHXy^lP*fn^P#f{Q}}}}q{*$5UeRoQ)DgHc zo@|Z(9#;KvfC$4^PB65n;b~G27p4WnYsZB_NBKVSXu8GHTcrw!<5e89(Jh{KpN{O? ziB;Pm&fK~ZpuZUzB%udjlUoP>_N)tByk{9NF-e>DKI9%OYFnN5eOmPSP=zA+4ivP( zs4D^%*S3zz${`DK4^Y4e^K{oKM{L zS^Ox}xAR=1gU7w0!E=_MrWKrAQ3lE2^hG?+9P0dSUIn1_%qa& z;h8-A*(Q>tZboyHvhUGE$Cv5K#B1&*TB^x?vaX-k47{`O*F}O!d{B!wMB!6Kwal}E zNwW)oRLYN&DDTVU{uU_p4v&iwQ0~Du9^mF1wCV3VkN7L`et4XsJ43i?h)g7Yywv<<8g(wR}8BuLVV>nck$v>1#|fm#3>cWJQcg@jrKd`hF1>b<~}k zM5zO&<8hdW>I0DO2hC2GZAgyxpu$IQLpOiV z{f-gN;wLBEOyy(h>s5Qr^4ewQ{Jb0jkX~az`SgBw6pU;;=s%5*fInHqo^73#iaP0o z*I(N>Mr{rhq7{~Q70DX^kF^^`-&cA!d8j`<)V==w#*V$@2>Y)Mhyze(AAd0I!V>q6 zBqh}aD#w@NcOS9HqJNs>4Aep};LqzXd9rl6k+Lw9;NayB? zp9?yX7lPCf6RiNJ_i^ix4SXe0agJev^yjJ%Mou#sSYkJK)00Bmi@qb&qI?j_m7Onn z(iIuGWQw7M=`@^;gBjvYVzhZT6m^Z#v--ZtNM5N7Cz;A3NZMGuK(4<_mvCR09501| zU)UnIg>ICPvr#RT-u@~TX_*7FX3Ch-zQagjg!-@7 zQ?NW`%^w}z37kz6RP~t?(W$;&;O0Rt`e&dA2!m_}nP@|`h0f1e#p}e>M)rmtikv05 zvGE{NfltJ#>XO53LjIu-xmN_wCJg_l>)$gqOSFe!ep;?4he4QgmcAukALccB5w?z^ zC2hofAz+`K;fPrJzrsL(IF;~!FP-VHN7{Q~ZhNqSpL`VeyN$FgV+b-$_i!Vj4}zg|HJk)s$6vX27hAzt`<$(BBk)A z^2~pI>YL8Tyxo>J0HB@*xs!hyKK*D%W3d0V+)89>B2{p~nRZlFV9rb{Ih}%vpG81V zH7YmQq*^M^PcdH%Qw7Y>8MyjRKen933@t4{0>OQP6Hem!&8j3Z(_NR0GZG^NoXCt>fqQvjx?xUOnv@u%0#D1kkvhIp zO)MvWxekC!@~LM%cUtEt3pZ}$hRw+j66;~F8$A8wKt|{&n9oWN-89>?_V#p#uR=TS zLcIjhcP-)^Ubd>hZK%eeCL@6?u1%}d^fww+*i^QQfg*>TBOBsJ*_)e3GO#I=4Ks7E z0SH<9@0-z2it-l=%(+ucL((a?l75j=m$8#@b57F$cqO$UrKJ4*0?g(Y{_UlXc$Dhd6l)_Vw z6)=U;)AOJIok?`H`>j2DnK>x;MoHHkzV{OOEmA4xS=H-jN*~Tk**-$+&5p6yP=IS2 zrthb5YgN?2nA9R_9WNms{vn3c+J8n{&A?!}3B(*ep#$~66k`k z?9UtCNb}0Ps3=pk!}F_c|CDFQ+%sfX>~rBVxwUrh$4&@;Gmq}#>sQHF4eu{J$hMFV zcM2h`8;ca&DkJLn+sVc_UWmW!VVaX=FSijDArt^z5-%HF-n_dpa3(aS(xfr#toy_M z{p-Ix6R|4)q(vL6?DTOu;pN_2)9~^6m~Um@`7Bf-^{Vnfo(#wDJ;_Zb&Ge^!Nb}gou0NyFEOvI>B)t0hvD*) z34TGDMJu&K33&i>QtX8S&On1t(ghZF92VADIEe5i4P!N7!NuQOYES~$)N?SP0TPuI zKC!guZ5BvF>aB?XAWH0Bnjt=R)N7yxSKOQEe!=e+RPB{~BP_GdfG;z>UTMN1at&Ln zmk;{t`i?c@&wrRIFR=N#{bbft*Cx?FtE*^z8QS7~HeK+qy)#Utc@l#HBH5N2TNohFGrTW!2?5kHK4sJd&g% zKDG%1hiuaYOo)oeZj70 z6zhhr=Yg!c%igLXQB4_x_Vly&p=FKdRMK3UKLVlorwIkxc3-q`A4Vl%rR#8O^>LAG9@=rr-kPp_Xqu;ve~YoF}ub$ zhWi-lj}8#!h46)I50vw^oVcqevv9Jr@K!wCEz~ql@oC?YeJK!vAZ?$#dbK!E@$|r?Xw$hOri1vruP`w-5 z-%iduHSk-$%rxYS7md{GsN&+SQbSC-INCwP*0)nfSfgX z8J>Pp51!QqRIl*+UyqvmJdnov;tbv9oI|C@d*POt=F&zk8Sl-Z)wyeNQO#!&3_j$2 zL51yS4X4jYMaR`&m!R}gyvc@|z$PBzc@K%`r`5RI?tj!WfIVF48W#CC-G&oMxgj(u zQ*;yr(NRn)y{{@0HE{3W2;4JTimyRLE1#lv?;)f8nkz Date: Tue, 27 Oct 2020 19:41:24 +0100 Subject: [PATCH 2/3] Respect fish bag capacity --- code/modules/fish/fishtank.dm | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/code/modules/fish/fishtank.dm b/code/modules/fish/fishtank.dm index 3e3303b53b4..6c8b2d06df5 100644 --- a/code/modules/fish/fishtank.dm +++ b/code/modules/fish/fishtank.dm @@ -310,7 +310,9 @@ while(egg_count > 0) //Loop until you've harvested all the eggs var/obj/item/fish_eggs/egg = pick(egg_list) //Select an egg at random if(egg != /obj/item/fish_eggs) // Don't harvest duds - egg = new egg(fish_bag || get_turf(user)) //Spawn the egg at the user's feet + egg = new egg(get_turf(user)) //Spawn the egg at the user's feet + if(fish_bag?.can_be_inserted(egg)) + fish_bag.handle_item_insertion(egg) else duds++ egg_list.Remove(egg) //Remove the egg from the egg_list @@ -346,14 +348,15 @@ else if(istype(user.l_hand, /obj/item/storage/bag/fish)) fish_bag = user.l_hand var/fish_name = fish_to_scoop.fish_name - if(fish_bag) - user.visible_message("[user.name] scoops \a [fish_name] from [src] into [fish_bag].", "You scoop \a [fish_name] out of [src] into [fish_bag].") - else - user.visible_message("[user.name] scoops \a [fish_name] from [src].", "You scoop \a [fish_name] out of [src].") // Move the fish in var/fish_item = fish_to_scoop.fish_item if(fish_item) - new fish_item(fish_bag || get_turf(user)) //Spawn the appropriate fish_item at the user's feet or in their held fish bag. + var/obj/item/I = new fish_item(get_turf(user)) + if(fish_bag?.can_be_inserted(I)) + fish_bag.handle_item_insertion(I) + else + fish_bag = null + user.visible_message("[user.name] scoops \a [fish_name] from [src].", "You scoop \a [fish_name] out of [src].") kill_fish(fish_to_scoop) //Kill the caught fish from the tank /obj/machinery/fishtank/proc/spill_water() @@ -682,10 +685,7 @@ fish_bag = user.r_hand else if(istype(user.l_hand, /obj/item/storage/bag/fish)) fish_bag = user.l_hand - if(fish_bag) - user.visible_message("[user.name] harvests some fish eggs from [src] into [fish_bag].", "You scoop the fish eggs out of [src] into [fish_bag].") - else - user.visible_message("[user.name] harvests some fish eggs from [src].", "You scoop the fish eggs out of [src].") + user.visible_message("[user.name] harvests some fish eggs from [src].", "You scoop the fish eggs out of [src].") harvest_eggs(user, fish_bag) else user.visible_message("[user.name] fails to harvest any fish eggs from [src].", "There are no fish eggs in [src] to scoop out.") From 818aab813aab07bafcb7ad812976c29dd353b22e Mon Sep 17 00:00:00 2001 From: mochi Date: Tue, 27 Oct 2020 19:52:26 +0100 Subject: [PATCH 3/3] Remove useless else --- code/modules/fish/fishtank.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/modules/fish/fishtank.dm b/code/modules/fish/fishtank.dm index 6c8b2d06df5..12c5d243b52 100644 --- a/code/modules/fish/fishtank.dm +++ b/code/modules/fish/fishtank.dm @@ -354,8 +354,6 @@ var/obj/item/I = new fish_item(get_turf(user)) if(fish_bag?.can_be_inserted(I)) fish_bag.handle_item_insertion(I) - else - fish_bag = null user.visible_message("[user.name] scoops \a [fish_name] from [src].", "You scoop \a [fish_name] out of [src].") kill_fish(fish_to_scoop) //Kill the caught fish from the tank