diff --git a/code/game/gamemodes/events/spacevines.dm b/code/game/gamemodes/events/spacevines.dm index 8eae7a0cd5d..7dbdbc62148 100644 --- a/code/game/gamemodes/events/spacevines.dm +++ b/code/game/gamemodes/events/spacevines.dm @@ -9,6 +9,7 @@ pass_flags = PASSTABLE | PASSGRILLE var/energy = 0 var/obj/effect/spacevine_controller/master = null + var/mob/living/buckled_mob New() return @@ -19,46 +20,73 @@ master.growth_queue -= src ..() - attackby(obj/item/weapon/W as obj, mob/user as mob) - if (!W || !user || !W.type) return - switch(W.type) - if(/obj/item/weapon/circular_saw) del src - if(/obj/item/weapon/kitchen/utensil/knife) del src - if(/obj/item/weapon/scalpel) del src - if(/obj/item/weapon/twohanded/fireaxe) del src - if(/obj/item/weapon/hatchet) del src - if(/obj/item/weapon/melee/energy) del src - //less effective weapons - if(/obj/item/weapon/wirecutters) - if(prob(25)) del src - if(/obj/item/weapon/shard) - if(prob(25)) del src +/obj/effect/spacevine/attackby(obj/item/weapon/W as obj, mob/user as mob) + if (!W || !user || !W.type) return + switch(W.type) + if(/obj/item/weapon/circular_saw) del src + if(/obj/item/weapon/kitchen/utensil/knife) del src + if(/obj/item/weapon/scalpel) del src + if(/obj/item/weapon/twohanded/fireaxe) del src + if(/obj/item/weapon/hatchet) del src + if(/obj/item/weapon/melee/energy) del src - else //weapons with subtypes - if(istype(W, /obj/item/weapon/melee/energy/sword)) del src - else if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - if(WT.remove_fuel(0, user)) del src - //TODO: add plant-b-gone - ..() + //less effective weapons + if(/obj/item/weapon/wirecutters) + if(prob(25)) del src + if(/obj/item/weapon/shard) + if(prob(25)) del src - attack_hand(mob/user as mob) - for(var/mob/M in src.loc) - if(M.buckled == src) - if(prob(50)) - if(M == user) - user << "\red You break free from the vines!" - else - user << "\red You rip away at the vines and free [M]!" - M << "\red [user] frees you from the vines!" - M.buckled = null + else //weapons with subtypes + if(istype(W, /obj/item/weapon/melee/energy/sword)) del src + else if(istype(W, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = W + if(WT.remove_fuel(0, user)) del src + else + manual_unbuckle(user) + return + //TODO: add plant-b-gone + ..() + + +/obj/effect/spacevine/attack_hand(mob/user as mob) + manual_unbuckle(user) + + +/obj/effect/spacevine/attack_paw(mob/user as mob) + manual_unbuckle(user) + +/obj/effect/spacevine/proc/unbuckle() + if(buckled_mob) + if(buckled_mob.buckled == src) //this is probably unneccesary, but it doesn't hurt + buckled_mob.buckled = null + buckled_mob.anchored = initial(buckled_mob.anchored) + buckled_mob.update_canmove() + buckled_mob = null + return + +/obj/effect/spacevine/proc/manual_unbuckle(mob/user as mob) + if(buckled_mob) + if(prob(50)) + if(buckled_mob.buckled == src) + if(buckled_mob != user) + buckled_mob.visible_message(\ + "[user.name] frees [buckled_mob.name] from the vines.",\ + "[user.name] frees you from the vines.",\ + "You hear shredding and ripping.") else - user << "\red You rip away at the vines..." - break //only process one captured mob. - - attack_paw(mob/user as mob) - return src.attack_hand(user) + buckled_mob.visible_message(\ + "[buckled_mob.name] struggles free of the vines.",\ + "You untangle the vines from around yourself.",\ + "You hear shredding and ripping.") + unbuckle() + else + var/text = pick("rips","tears","pulls") + user.visible_message(\ + "[user.name] [text] at the vines.",\ + "You [text] at the vines.",\ + "You hear shredding and ripping.") + return /obj/effect/spacevine_controller var/list/obj/effect/spacevine/vines = list() @@ -119,7 +147,7 @@ if(prob(20)) SV.grow() else //If tile is fully grown - SV.grab() + SV.buckle_mob() //if(prob(25)) SV.spread() @@ -140,12 +168,16 @@ src.icon_state = pick("Hvy1", "Hvy2", "Hvy3") energy = 2 -/obj/effect/spacevine/proc/grab() - for(var/mob/living/carbon/V in src.loc) - if((V.stat != DEAD) && (V.buckled != src)) //if mob not dead or captured - V.buckled = src - V << "\red The vines [pick("wind", "tangle")] around you!" - break //only capture one mob at a time. +/obj/effect/spacevine/proc/buckle_mob() + if(!buckled_mob && prob(25)) + for(var/mob/living/carbon/V in src.loc) + if((V.stat != DEAD) && (V.buckled != src)) //if mob not dead or captured + V.buckled = src + V.loc = src.loc + V.update_canmove() + src.buckled_mob = V + V << "The vines [pick("wind", "tangle", "tighten")] around you!" + break //only capture one mob at a time. /obj/effect/spacevine/proc/spread() var/direction = pick(cardinal)