From feeb0fa395cf39f6418595fa9628235db3cac10e Mon Sep 17 00:00:00 2001 From: "elly1989@rocketmail.com" Date: Fri, 29 Jun 2012 14:14:28 +0000 Subject: [PATCH] Runtime fix for resisting out of spacevines. Cleaned it up a bit so escaping being tangled up in vines is a little more intuitive. You'll either need something to cut them to remove them, or simply 'hit' them to unbuckle somebody tangled up. You can resist to untangle yourself. Reduced the frequency at which they tangle people by 75%, because it was just frustratingly frequent. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@3946 316c924e-a436-60f5-8080-3fe189b3f50e --- code/game/gamemodes/events/spacevines.dm | 118 ++++++++++++++--------- 1 file changed, 75 insertions(+), 43 deletions(-) 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)