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)