From b602e3d5e365ffd7fe90a6d7e62cbaf4903108e6 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Tue, 12 May 2015 23:00:02 -0400 Subject: [PATCH] Botany Fixes and Telescopic Scythes - Ports https://github.com/Baystation12/Baystation12/pull/9184 from Baystation - Prevents deconstruction of soil and invisible soil - Fixes #1011 - Adds a verb to eject tanks from hydroponics trays if one is inserted - Don't think anyone has actually done this, but it has been possible for a LONG time and will be more useful once I get the atmos portion of botany working - Fixes grown items not leaving behind their trash - Notably banana peels and corn cobs. Clowns and hillbillies rejoice! - Adds 15% chance for a watermelon to leave behind a pack of it's seeds when eaten. - Slicing watermelon will not produce seeds ever - Replaces the Janitorial ERT members' plant-b-gone sprays with new Telescopic Scythes! - Can be collapsed to fit on a belt or fit in pockets/bags - While collapsed, it loses a large amount of it's damage, is not considered sharp or as having an edge, and cannot cut vines like a normal scythe. Extended ones are functionally identical to normal scythes - Extending and collapsing a telescopic scythe has some awesome sounds from Freesound.org --- code/game/response_team.dm | 140 +++++++++--------- code/modules/hydroponics/grown.dm | 15 ++ code/modules/hydroponics/seed_mobs.dm | 2 +- .../hydroponics/spreading/spreading.dm | 22 ++- .../hydroponics/spreading/spreading_growth.dm | 5 +- .../spreading/spreading_response.dm | 23 ++- code/modules/hydroponics/trays/tray.dm | 18 +++ code/modules/hydroponics/trays/tray_soil.dm | 3 + code/modules/hydroponics/trays/tray_tools.dm | 62 +++++++- icons/obj/weapons.dmi | Bin 46072 -> 46653 bytes sound/weapons/blade_sheath.ogg | Bin 0 -> 12771 bytes sound/weapons/blade_unsheath.ogg | Bin 0 -> 9976 bytes 12 files changed, 203 insertions(+), 87 deletions(-) create mode 100644 sound/weapons/blade_sheath.ogg create mode 100644 sound/weapons/blade_unsheath.ogg diff --git a/code/game/response_team.dm b/code/game/response_team.dm index 9be2b5815bc..7fa7ebe40e0 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -17,39 +17,39 @@ var/can_call_ert if(!check_rights(R_EVENT)) return - + if(!ticker) usr << "\red The game hasn't started yet!" return - + if(ticker.current_state == 1) usr << "\red The round hasn't started yet!" return - + if(send_emergency_team) usr << "\red Central Command has already dispatched an emergency response team!" return - + if(alert("Do you want to dispatch an Emergency Response Team?",,"Yes","No") != "Yes") return - - + + if(get_security_level() != "red") // Allow admins to reconsider if the alert level isn't Red switch(alert("The station is not in red alert. Do you still want to dispatch a response team?",,"Yes","No")) if("No") return - + if(send_emergency_team) usr << "\red Central Command has already dispatched an emergency response team!" return - + if(pick_ert_type()) return message_admins("[key_name_admin(usr)] is dispatching an Emergency Response Team.", 1) log_admin("[key_name(usr)] used Dispatch Response Team.") trigger_armed_response_team(1) - + /client/proc/pick_ert_type() var/erttype = input("Which type of Emergency Response Team would you like to dispatch?","Emergency Response Team Type", "") as null|anything in response_team_types if(!erttype) @@ -68,15 +68,15 @@ var/can_call_ert if(!istype(usr,/mob/dead/observer) && !istype(usr,/mob/new_player)) usr << "You need to be an observer or new player to use this." return - + if(!send_emergency_team) usr << "No emergency response team is currently being sent." return - + if(jobban_isbanned(usr, "Emergency Response Team")) usr << "You are jobbanned from the emergency reponse team!" return - + var/player_age_check = check_client_age(usr.client, responseteam_age) if(player_age_check && config.use_age_restriction_for_antags) usr << "This role is not yet available to you. You need to wait another [player_age_check] days." @@ -86,11 +86,11 @@ var/can_call_ert usr << "\blue Upon using the antagHUD you forfeited the ability to join the round." return - if(response_team_members.len > 6) + if(response_team_members.len > 6) usr << "The emergency response team is already full!" return - for (var/obj/effect/landmark/L in landmarks_list) + for (var/obj/effect/landmark/L in landmarks_list) if (L.name == "Response Team") L.name = null @@ -122,13 +122,13 @@ var/can_call_ert var/deadcount = 0 for(var/mob/living/carbon/human/H in mob_list) if(H.client) // Monkeys and mice don't have a client, amirite? - if(H.stat == 2) + if(H.stat == 2) deadcount++ total++ - if(total == 0) + if(total == 0) return 0 - else + else return round(100 * deadcount / total) // counts the number of antagonists in % @@ -140,9 +140,9 @@ var/can_call_ert antagonists++ total++ - if(total == 0) + if(total == 0) return 0 - else + else return round(100 * antagonists / total) // Increments the ERT chance automatically, so that the later it is in the round, @@ -174,7 +174,7 @@ var/can_call_ert send_team_chance += percentage_antagonists() // the more antagonists, the higher the chance send_team_chance = min(send_team_chance, 100) - if(force) + if(force) send_team_chance = 100 // there's only a certain chance a team will be sent @@ -190,7 +190,7 @@ var/can_call_ert sleep(600 * 5) send_emergency_team = 0 // Can no longer join the ERT. -/* +/* var/area/security/nuke_storage/nukeloc = locate() //To find the nuke in the vault var/obj/machinery/nuclearbomb/nuke = locate() in nukeloc if(!nuke) @@ -289,9 +289,9 @@ var/can_call_ert else del(H) - //M.rebuild_appearance() + //M.rebuild_appearance() */ - + var/new_gender = alert(usr, "Please select your gender.", "Character Generation", "Male", "Female") if (new_gender) if(new_gender == "Male") @@ -347,7 +347,7 @@ var/can_call_ert equip_emergencyresponsesquad(M, "Commander", class) else equip_emergencyresponsesquad(M, class) - + return M /proc/equip_emergencyresponsesquad(var/mob/living/carbon/human/M, var/role, var/role2) @@ -364,13 +364,13 @@ var/can_call_ert M.equip_to_slot_or_del(new /obj/item/clothing/shoes/galoshes(M), slot_shoes) else M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/advance(M), slot_shoes) - + M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/commander(M), slot_wear_suit) var/obj/item/clothing/suit/space/rig/R = M.wear_suit R.helmet = new /obj/item/clothing/head/helmet/space/rig/ert/commander(M) M.equip_to_slot_or_del(R.helmet, slot_head) R.helmet.flags |= NODROP - + M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/swat(M), slot_wear_mask) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/commander(M), slot_back) @@ -389,8 +389,8 @@ var/can_call_ert M.equip_to_slot_or_del(pda, slot_wear_pda) M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_s_store) - M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_r_store) - + M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_r_store) + M.equip_to_slot_or_del(new /obj/item/weapon/pinpointer/advpinpointer(M), slot_in_backpack) switch(role2) @@ -398,62 +398,62 @@ var/can_call_ert M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud(M), slot_glasses) M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/security/response_team(M), slot_belt) - + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/night(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/handcuffs(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/nuclear(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/shield/riot/tele(M), slot_in_backpack) - + if("Medical") M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex/nitrile(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health/night(M), slot_glasses) M.equip_to_slot_or_del(new /obj/item/weapon/defibrillator/compact/combat/loaded(M), slot_belt) - + M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/fire(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/o2(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/toxin(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/CMO(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(M), slot_r_hand) - + if("Engineering") M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson/night(M), slot_glasses) M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt) - + M.equip_to_slot_or_del(new /obj/item/weapon/rcd/combat(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/rcd_ammo/large(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/rcd_ammo/large(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/full(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/stack/sheet/glass/full(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/stack/sheet/plasteel/full(M), slot_in_backpack) - + M.equip_to_slot_or_del(new /obj/item/stack/sheet/plasteel/full(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase/inflatable(M), slot_r_hand) - + if("Janitorial") M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/purple(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/janitor, slot_glasses) M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/janitor/full, slot_belt) - + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/night(src), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/lights/mixed(src), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/spray/plantbgone(src), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/scythe/tele(src), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/glass/bucket(src), slot_in_backpack) - - M.equip_to_slot_or_del(new /obj/item/weapon/mop/advanced(M), slot_r_hand) - + + M.equip_to_slot_or_del(new /obj/item/weapon/mop/advanced(M), slot_r_hand) + new /obj/structure/mopbucket/full(get_turf(M)) if("Security") M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/security(M), slot_wear_suit) - + var/obj/item/clothing/suit/space/rig/R = M.wear_suit R.helmet = new /obj/item/clothing/head/helmet/space/rig/ert/security(M) M.equip_to_slot_or_del(R.helmet, slot_head) R.helmet.flags |= NODROP - + M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/swat(M), slot_wear_mask) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/security(M), slot_back) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud(M), slot_glasses) @@ -472,11 +472,11 @@ var/can_call_ert pda.name = "PDA-[M.real_name] ([pda.ownjob])" pda.icon_state = "pda-security" M.equip_to_slot_or_del(pda, slot_wear_pda) - + M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_s_store) - M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_r_store) - M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs, slot_l_store) - + M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_r_store) + M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs, slot_l_store) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/night(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/handcuffs(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/nuclear(M), slot_in_backpack) @@ -488,18 +488,18 @@ var/can_call_ert M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex/nitrile(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/medical(M), slot_wear_suit) - + var/obj/item/clothing/suit/space/rig/R = M.wear_suit - R.helmet = new /obj/item/clothing/head/helmet/space/rig/ert/medical(M) + R.helmet = new /obj/item/clothing/head/helmet/space/rig/ert/medical(M) M.equip_to_slot_or_del(R.helmet, slot_head) R.helmet.flags |= NODROP - + M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/swat(M), slot_wear_mask) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/medical(M), slot_back) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health/night(M), slot_glasses) var/obj/item/weapon/card/id/W = new(src) - W.assignment = "Emergency Response Team Member" + W.assignment = "Emergency Response Team Member" W.registered_name = M.real_name W.name = "[M.real_name]'s ID Card (Emergency Response Team - Medic)" W.icon_state = "centcom" @@ -512,29 +512,29 @@ var/can_call_ert pda.name = "PDA-[M.real_name] ([pda.ownjob])" pda.icon_state = "pda-medical" M.equip_to_slot_or_del(pda, slot_wear_pda) - + M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_s_store) - M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_r_store) - + M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_r_store) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/fire(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/o2(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/toxin(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/CMO(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/defibrillator/compact/combat/loaded(M), slot_belt) - + M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(M), slot_r_hand) if("Engineering") M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/advance(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/engineer(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/engineer(M), slot_wear_suit) - + var/obj/item/clothing/suit/space/rig/R = M.wear_suit - R.helmet = new /obj/item/clothing/head/helmet/space/rig/ert/engineer(M) + R.helmet = new /obj/item/clothing/head/helmet/space/rig/ert/engineer(M) M.equip_to_slot_or_del(R.helmet, slot_head) R.helmet.flags |= NODROP - + M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/swat(M), slot_wear_mask) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson/night(M), slot_glasses) @@ -553,29 +553,29 @@ var/can_call_ert pda.name = "PDA-[M.real_name] ([pda.ownjob])" pda.icon_state = "pda-engineer" M.equip_to_slot_or_del(pda, slot_wear_pda) - + M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_s_store) - M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_r_store) + M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_r_store) M.equip_to_slot_or_del(new /obj/item/weapon/rcd/combat(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/rcd_ammo/large(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/rcd_ammo/large(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/full(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/stack/sheet/glass/full(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/stack/sheet/plasteel/full(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/stack/sheet/plasteel/full(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt) - + if("Janitorial") M.equip_to_slot_or_del(new /obj/item/clothing/shoes/galoshes(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/purple(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/janitor(M), slot_wear_suit) - + var/obj/item/clothing/suit/space/rig/R = M.wear_suit - R.helmet = new /obj/item/clothing/head/helmet/space/rig/ert/janitor(M) + R.helmet = new /obj/item/clothing/head/helmet/space/rig/ert/janitor(M) M.equip_to_slot_or_del(R.helmet, slot_head) R.helmet.flags |= NODROP - + M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/swat(M), slot_wear_mask) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/janitor(M), slot_back) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/janitor(M), slot_glasses) @@ -594,19 +594,19 @@ var/can_call_ert pda.name = "PDA-[M.real_name] ([pda.ownjob])" pda.icon_state = "pda-janitor" M.equip_to_slot_or_del(pda, slot_wear_pda) - + M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_s_store) - M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_r_store) + M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_r_store) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/night(src), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/lights/mixed(src), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/spray/plantbgone(src), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/scythe/tele(src), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/glass/bucket(src), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/janitor/full, slot_belt) - M.equip_to_slot_or_del(new /obj/item/weapon/mop/advanced(M), slot_r_hand) - + M.equip_to_slot_or_del(new /obj/item/weapon/mop/advanced(M), slot_r_hand) + new /obj/structure/mopbucket/full(get_turf(M)) /*/mob/living/carbon/human/proc/equip_strike_team(leader_selected = 0) Old ERT equip verb. diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 3bff511538b..967aa49a74a 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -54,9 +54,24 @@ rtotal += round(potency/reagent_data[2]) reagents.add_reagent(rid,max(1,rtotal)) update_desc() + update_trash() if(reagents.total_volume > 0) bitesize = 1+round(reagents.total_volume / 2, 1) +/obj/item/weapon/reagent_containers/food/snacks/grown/proc/update_trash() + if(!seed) + return + trash = seed.trash_type + if(seed.kitchen_tag) + if(seed.kitchen_tag == "watermelon") // 15% chance to leave behind a pack of watermelon seeds + if(prob(15)) + var/obj/item/seeds/seeds = new() + seeds.seed = seed + seeds.update_seed() + trash = seeds + else + trash = null + /obj/item/weapon/reagent_containers/food/snacks/grown/proc/update_desc() if(!seed) diff --git a/code/modules/hydroponics/seed_mobs.dm b/code/modules/hydroponics/seed_mobs.dm index 8b240124550..8d5d26df12b 100644 --- a/code/modules/hydroponics/seed_mobs.dm +++ b/code/modules/hydroponics/seed_mobs.dm @@ -13,7 +13,7 @@ spawn(75) if(!host.ckey && !host.client) host.death() // This seems redundant, but a lot of mobs don't - host.stat = 2 // handle death() properly. Better safe than etc. + host.stat = DEAD // handle death() properly. Better safe than etc. host.visible_message("[host] is malformed and unable to survive. It expires pitifully, leaving behind some seeds.") var/total_yield = rand(1,3) diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index dbfcdddcb36..b99e2ccf6b8 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -1,7 +1,7 @@ #define DEFAULT_SEED "glowshroom" #define VINE_GROWTH_STAGES 5 -/proc/spacevine_infestation() +/proc/spacevine_infestation(var/potency_min=70, var/potency_max=100, var/maturation_min=5, var/maturation_max=15) spawn() //to stop the secrets panel hanging var/list/turf/simulated/floor/turfs = list() //list of all the empty floor turfs in the hallway areas for(var/areapath in typesof(/area/hallway)) @@ -14,8 +14,15 @@ var/turf/simulated/floor/T = pick(turfs) var/datum/seed/seed = plant_controller.create_random_seed(1) seed.set_trait(TRAIT_SPREAD,2) // So it will function properly as vines. - seed.set_trait(TRAIT_POTENCY,rand(70,100)) // Guarantee a wide spread and powerful effects. - new /obj/effect/plant(T,seed) + seed.set_trait(TRAIT_POTENCY,rand(potency_min, potency_max)) // 70-100 potency will help guarantee a wide spread and powerful effects. + seed.set_trait(TRAIT_MATURATION,rand(maturation_min, maturation_max)) + + //make vine zero start off fully matured + var/obj/effect/plant/vine = new(T,seed) + vine.health = vine.max_health + vine.mature_time = 0 + vine.process() + message_admins("Event: Spacevines spawned at [T.loc] ([T.x],[T.y],[T.z])") /obj/effect/dead_plant @@ -56,6 +63,7 @@ var/spread_chance = 40 var/spread_distance = 3 var/evolve_chance = 2 + var/mature_time var/last_tick = 0 var/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/plant @@ -114,7 +122,8 @@ if(max_growth > 2 && prob(50)) max_growth-- //Ensure some variation in final sprite, makes the carpet of crap look less wonky. - spread_chance = seed.get_trait(TRAIT_POTENCY) * 4 + mature_time = world.time + seed.get_trait(TRAIT_MATURATION) + 15 //prevent vines from maturing until at least a few seconds after they've been created. + spread_chance = seed.get_trait(TRAIT_POTENCY) * 3 spread_distance = ((growth_type>0) ? round(spread_chance*0.6) : round(spread_chance*0.3)) update_icon() @@ -180,7 +189,8 @@ if(growth>2 && growth == max_growth) layer = 5 - opacity = 1 + if(seed.get_trait(TRAIT_SPREAD) == 2) + opacity = 1 if(!isnull(seed.chems["woodpulp"])) density = 1 else @@ -257,4 +267,4 @@ die_off() /obj/effect/plant/proc/is_mature() - return (health >= (max_health/3)) \ No newline at end of file + return (health >= (max_health/3) && world.time > mature_time) \ No newline at end of file diff --git a/code/modules/hydroponics/spreading/spreading_growth.dm b/code/modules/hydroponics/spreading/spreading_growth.dm index cdd06639a1c..6b589427b2e 100644 --- a/code/modules/hydroponics/spreading/spreading_growth.dm +++ b/code/modules/hydroponics/spreading/spreading_growth.dm @@ -72,7 +72,10 @@ update_neighbors() if(is_mature() && neighbors.len && prob(spread_chance)) - for(var/i=1,i<=seed.get_trait(TRAIT_YIELD),i++) + //spread to 1-3 adjacent turfs depending on yield trait. + var/max_spread = between(1, round(seed.get_trait(TRAIT_YIELD)*3/14), 3) + + for(var/i in 1 to max_spread) if(prob(spread_chance)) sleep(rand(3,5)) if(!neighbors.len) diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm index d175fdda221..228cd73fc24 100644 --- a/code/modules/hydroponics/spreading/spreading_response.dm +++ b/code/modules/hydroponics/spreading/spreading_response.dm @@ -7,8 +7,11 @@ if(!istype(M)) return - if(!buckled_mob && !M.buckled && !M.anchored && (M.small || prob(round(seed.get_trait(TRAIT_POTENCY)/2)))) - entangle(M) + if(!buckled_mob && !M.buckled && !M.anchored && (M.small || prob(round(seed.get_trait(TRAIT_POTENCY)/6)))) + //wait a tick for the Entered() proc that called HasProximity() to finish (and thus the moving animation), + //so we don't appear to teleport from two tiles away when moving into a turf adjacent to vines. + spawn(1) + entangle(M) /obj/effect/plant/attack_hand(mob/user as mob) // Todo, cause damage. @@ -60,13 +63,11 @@ if(buckled_mob) return - if(!Adjacent(victim)) + if(victim.buckled) return - victim.buckled = src - victim.update_canmove() - buckled_mob = victim - if(!victim.anchored && !victim.buckled && victim.loc != get_turf(src)) + //grabbing people + if(!victim.anchored && Adjacent(victim) && victim.loc != get_turf(src)) var/can_grab = 1 if(istype(victim, /mob/living/carbon/human)) var/mob/living/carbon/human/H = victim @@ -75,4 +76,10 @@ if(can_grab) src.visible_message("Tendrils lash out from \the [src] and drag \the [victim] in!") victim.loc = src.loc - victim << "Tendrils [pick("wind", "tangle", "tighten")] around you!" + + //entangling people + if(victim.loc == src.loc) + victim.buckled = src + victim.update_canmove() + buckled_mob = victim + victim << "Tendrils [pick("wind", "tangle", "tighten")] around you!" diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 112b503fec1..4e27c704b31 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -830,3 +830,21 @@ closed_system = !closed_system user << "You [closed_system ? "close" : "open"] the tray's lid." update_icon() + +/obj/machinery/portable_atmospherics/hydroponics/verb/eject_tank_verb() + set name = "Eject Internal Tank" + set category = "Object" + set src in view(1) + eject_tank(usr) + +/obj/machinery/portable_atmospherics/hydroponics/proc/eject_tank(var/mob/living/user) + if(!user || user.stat || user.restrained()) + return + + if(!holding) + usr << "\red There is no tank loaded into the [src] to eject." + + if(istype(holding, /obj/item/weapon/tank)) + usr << "\blue You eject the [holding.name] from the [src]." + holding.loc = loc + holding = null diff --git a/code/modules/hydroponics/trays/tray_soil.dm b/code/modules/hydroponics/trays/tray_soil.dm index bea2a8e82ed..ff47f069707 100644 --- a/code/modules/hydroponics/trays/tray_soil.dm +++ b/code/modules/hydroponics/trays/tray_soil.dm @@ -9,6 +9,8 @@ /obj/machinery/portable_atmospherics/hydroponics/soil/attackby(var/obj/item/O as obj, var/mob/user as mob) if(istype(O,/obj/item/weapon/tank)) return + else if(istype(O,/obj/item/weapon/crowbar)) + return else ..() @@ -17,6 +19,7 @@ verbs -= /obj/machinery/portable_atmospherics/hydroponics/verb/close_lid_verb verbs -= /obj/machinery/portable_atmospherics/hydroponics/verb/remove_label verbs -= /obj/machinery/portable_atmospherics/hydroponics/verb/setlight + verbs -= /obj/machinery/portable_atmospherics/hydroponics/verb/eject_tank_verb /obj/machinery/portable_atmospherics/hydroponics/soil/CanPass() return 1 diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm index d70035bdc84..7d69104e2b0 100644 --- a/code/modules/hydroponics/trays/tray_tools.dm +++ b/code/modules/hydroponics/trays/tray_tools.dm @@ -301,6 +301,7 @@ throw_speed = 2 throw_range = 3 w_class = 4.0 + var/extend = 1 flags = NOSHIELD slot_flags = SLOT_BACK origin_tech = "materials=2;combat=2" @@ -309,12 +310,71 @@ /obj/item/weapon/scythe/afterattack(atom/A, mob/user as mob, proximity) if(!proximity) return - if(istype(A, /obj/effect/plant)) + if(istype(A, /obj/effect/plant) && extend == 1) for(var/obj/effect/plant/B in orange(A,1)) if(prob(80)) B.die_off(1) qdel(A) +/obj/item/weapon/scythe/tele + icon_state = "tscythe0" + name = "telescopic scythe" + desc = "A sharp and curved blade on a collapsable fibremetal handle, this tool is the pinnacle of covert reaping technology." + force = 3.0 + sharp = 0 + edge = 0 + throw_speed = 2 + throw_range = 3 + w_class = 2.0 + extend = 0 + flags = NOSHIELD + slot_flags = SLOT_BELT + origin_tech = "materials=3;combat=3" + attack_verb = list("chopped", "sliced", "cut", "reaped") + hitsound = "swing_hit" + +/obj/item/weapon/scythe/tele/attack_self(mob/user as mob) + extend = !extend + if(extend) + user << "With a flick of the wrist, you extend the scythe. It's reaping time!" + icon_state = "tscythe1" + item_state = "scythe0" + slot_flags &= ~SLOT_BELT + w_class = 4 //doesnt fit in backpack when its on for balance + force = 13 //normal scythe damage + attack_verb = list("chopped", "sliced", "cut", "reaped") + hitsound = 'sound/weapons/bladeslice.ogg' + //Extend sound (blade unsheath) + playsound(src.loc, 'sound/weapons/blade_unsheath.ogg', 50, 1) //Sound credit to Qat of Freesound.org + else + user << "You collapse the scythe, folding it for easy storage." + icon_state = "tscythe0" + item_state = "tscythe0" //no sprite in other words + slot_flags |= SLOT_BELT + w_class = 2 + force = 3 //not so robust now + attack_verb = list("hit", "poked") + hitsound = "swing_hit" + //Collapse sound (blade sheath) + playsound(src.loc, 'sound/weapons/blade_sheath.ogg', 50, 1) //Sound credit to Q.K. of Freesound.org + if(istype(user,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = user + H.update_inv_l_hand() + H.update_inv_r_hand() + add_fingerprint(user) + if (!blood_DNA) return + if(blood_overlay && (blood_DNA.len >= 1)) //updates blood overlay, if any + overlays.Cut()//this might delete other item overlays as well but eeeeeeeh + + var/icon/I = new /icon(src.icon, src.icon_state) + I.Blend(new /icon('icons/effects/blood.dmi', rgb(255,255,255)),ICON_ADD) + I.Blend(new /icon('icons/effects/blood.dmi', "itemblood"),ICON_MULTIPLY) + blood_overlay = I + + overlays += blood_overlay + + return + /obj/item/weapon/rsp name = "\improper Rapid-Seed-Producer (RSP)" desc = "A device used to rapidly deploy seeds." diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index 67dbeb84163e9819f485357439b500b89895332e..041703a632a3036e844fe0393f24666340d73b4f 100644 GIT binary patch delta 4925 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 delta 4344 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 M8H|o87=ZG>04o2?sQ>@~ literal 0 HcmV?d00001 diff --git a/sound/weapons/blade_unsheath.ogg b/sound/weapons/blade_unsheath.ogg new file mode 100644 index 0000000000000000000000000000000000000000..befe44eeab910df8bb35f2c4d0312e9765a771da GIT binary patch literal 9976 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