From 07b6d278a113f0ce797fd3f43041d752bccd789f Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Sat, 1 Feb 2020 04:48:40 +0100
Subject: [PATCH] fixed and brutalized clown op slippery weapons a little.
---
code/__DEFINES/mobs.dm | 8 +-
code/datums/components/slippery.dm | 5 +-
.../game/gamemodes/clown_ops/clown_weapons.dm | 20 +++--
code/game/objects/items/grenades/grenade.dm | 6 +-
code/game/turfs/open.dm | 75 +++++++++----------
code/game/turfs/space/space.dm | 3 +-
.../mob/living/carbon/carbon_movement.dm | 4 +-
7 files changed, 61 insertions(+), 60 deletions(-)
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 8d2913629a..a7d6056ab9 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -200,9 +200,11 @@
#define NO_SLIP_WHEN_WALKING (1<<0)
#define SLIDE (1<<1)
#define GALOSHES_DONT_HELP (1<<2)
-#define SLIDE_ICE (1<<3)
-#define SLIP_WHEN_CRAWLING (1<<4) //clown planet ruin
-#define SLIP_WHEN_JOGGING (1<<5) //slips prevented by walking are also dodged if the mob is not sprinting or fatigued... unless this flag is on.
+#define FLYING_DOESNT_HELP (1<<3)
+#define SLIDE_ICE (1<<4)
+#define SLIP_WHEN_CRAWLING (1<<5) //clown planet ruin amongst others
+#define SLIP_WHEN_JOGGING (1<<6) //slips prevented by walking are also dodged if the mob is nor sprinting or fatigued... unless this flag is on.
+
#define MAX_CHICKENS 50
diff --git a/code/datums/components/slippery.dm b/code/datums/components/slippery.dm
index 6682c3901d..c7ceab671d 100644
--- a/code/datums/components/slippery.dm
+++ b/code/datums/components/slippery.dm
@@ -9,7 +9,8 @@
callback = _callback
RegisterSignal(parent, list(COMSIG_MOVABLE_CROSSED, COMSIG_ATOM_ENTERED), .proc/Slip)
-/datum/component/slippery/proc/Slip(datum/source, atom/movable/AM)
+/datum/component/slippery/proc/Slip(datum/source, atom/movable/AM, extra_flags = NONE)
var/mob/victim = AM
- if(istype(victim) && !victim.is_flying() && victim.slip(intensity, parent, lube_flags) && callback)
+ var/lube = lube_flags | extra_flags
+ if(istype(victim) && victim.slip(intensity, parent, lube) && callback)
callback.Invoke(victim)
diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm
index e443d6ad37..af57372129 100644
--- a/code/game/gamemodes/clown_ops/clown_weapons.dm
+++ b/code/game/gamemodes/clown_ops/clown_weapons.dm
@@ -57,10 +57,8 @@
/obj/item/melee/transforming/energy/sword/bananium
name = "bananium sword"
desc = "An elegant weapon, for a more civilized age."
- force = 0
- throwforce = 0
- force_on = 0
- throwforce_on = 0
+ force_on = 15
+ throwforce_on = 15
hitsound = null
attack_verb_on = list("slipped")
clumsy_check = FALSE
@@ -72,7 +70,7 @@
/obj/item/melee/transforming/energy/sword/bananium/Initialize()
. = ..()
- AddComponent(/datum/component/slippery, 60, GALOSHES_DONT_HELP)
+ AddComponent(/datum/component/slippery, 81, GALOSHES_DONT_HELP)
var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
slipper.signal_enabled = active
@@ -80,13 +78,13 @@
..()
if(active)
var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
- slipper.Slip(M)
+ slipper.Slip(src, M, FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING)
/obj/item/melee/transforming/energy/sword/bananium/throw_impact(atom/hit_atom, throwingdatum)
. = ..()
if(active)
var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
- slipper.Slip(hit_atom)
+ slipper.Slip(src, hit_atom, FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING)
/obj/item/melee/transforming/energy/sword/bananium/attackby(obj/item/I, mob/living/user, params)
if((world.time > next_trombone_allowed) && istype(I, /obj/item/melee/transforming/energy/sword/bananium))
@@ -109,7 +107,7 @@
transform_weapon(user, TRUE)
user.visible_message("[user] is [pick("slitting [user.p_their()] stomach open with", "falling on")] [src]! It looks like [user.p_theyre()] trying to commit seppuku, but the blade slips off of [user.p_them()] harmlessly!")
var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
- slipper.Slip(user)
+ slipper.Slip(src, user, FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING)
return SHAME
//BANANIUM SHIELD
@@ -129,7 +127,7 @@
/obj/item/shield/energy/bananium/Initialize()
. = ..()
- AddComponent(/datum/component/slippery, 60, GALOSHES_DONT_HELP)
+ AddComponent(/datum/component/slippery, 81, GALOSHES_DONT_HELP)
var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
slipper.signal_enabled = active
@@ -150,7 +148,7 @@
var/caught = hit_atom.hitby(src, FALSE, FALSE, throwingdatum=throwingdatum)
if(iscarbon(hit_atom) && !caught)//if they are a carbon and they didn't catch it
var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
- slipper.Slip(hit_atom)
+ slipper.Slip(src, hit_atom, FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING)
if(thrownby && !caught)
throw_at(thrownby, throw_range+2, throw_speed, null, 1)
else
@@ -212,7 +210,7 @@
M.equip_to_slot_or_del(the_stash, SLOT_WEAR_MASK, TRUE, TRUE, TRUE, TRUE)
/obj/item/clothing/mask/fakemoustache/sticky
- var/unstick_time = 600
+ var/unstick_time = 2 MINUTES
/obj/item/clothing/mask/fakemoustache/sticky/Initialize()
. = ..()
diff --git a/code/game/objects/items/grenades/grenade.dm b/code/game/objects/items/grenades/grenade.dm
index 16a5e6d1d3..77b4b33a8c 100644
--- a/code/game/objects/items/grenades/grenade.dm
+++ b/code/game/objects/items/grenades/grenade.dm
@@ -34,12 +34,12 @@
/obj/item/grenade/proc/clown_check(mob/living/carbon/human/user)
var/clumsy = HAS_TRAIT(user, TRAIT_CLUMSY)
- if(clumsy && (clumsy_check == GRENADE_CLUMSY_FUMBLE))
- if(prob(50))
+ if(clumsy)
+ if(clumsy_check == GRENADE_CLUMSY_FUMBLE && prob(50))
to_chat(user, "Huh? How does this thing work?")
preprime(user, 5, FALSE)
return FALSE
- else if(!clumsy && (clumsy_check == GRENADE_NONCLUMSY_FUMBLE))
+ else if(clumsy_check == GRENADE_NONCLUMSY_FUMBLE && !(user.mind && HAS_TRAIT(user.mind, TRAIT_CLOWN_MENTALITY)))
to_chat(user, "You pull the pin on [src]. Attached to it is a pink ribbon that says, \"HONK\"")
preprime(user, 5, FALSE)
return FALSE
diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm
index 577c45a7f0..c4c7ab2d7b 100644
--- a/code/game/turfs/open.dm
+++ b/code/game/turfs/open.dm
@@ -245,48 +245,47 @@
return TRUE
/turf/open/handle_slip(mob/living/carbon/C, knockdown_amount, obj/O, lube)
- if(C.movement_type & FLYING)
- return 0
- if(has_gravity(src))
- var/obj/buckled_obj
- if(C.buckled)
- buckled_obj = C.buckled
- if(!(lube&GALOSHES_DONT_HELP)) //can't slip while buckled unless it's lube.
- return 0
- else
- if(!(lube&SLIP_WHEN_CRAWLING) && (C.lying || !(C.status_flags & CANKNOCKDOWN))) // can't slip unbuckled mob if they're lying or can't fall.
- return 0
- if(lube & NO_SLIP_WHEN_WALKING)
- if(C.m_intent == MOVE_INTENT_WALK)
- return 0
- if(ishuman(C) && !(lube & SLIP_WHEN_JOGGING))
- var/mob/living/carbon/human/H = C
- if(!H.sprinting && H.getStaminaLoss() <= 20)
- return 0
- if(!(lube&SLIDE_ICE))
- to_chat(C, "You slipped[ O ? " on the [O.name]" : ""]!")
- playsound(C.loc, 'sound/misc/slip.ogg', 50, 1, -3)
+ if(!(lube & FLYING_DOESNT_HELP) && (C.movement_type & FLYING || !has_gravity(src)))
+ return FALSE
+ var/obj/buckled_obj
+ if(C.buckled)
+ buckled_obj = C.buckled
+ if(!(lube&GALOSHES_DONT_HELP)) //can't slip while buckled unless it's lube.
+ return FALSE
+ else
+ if(!(lube&SLIP_WHEN_CRAWLING) && (C.lying || !(C.status_flags & CANKNOCKDOWN))) // can't slip unbuckled mob if they're lying or can't fall.
+ return FALSE
+ if(lube & NO_SLIP_WHEN_WALKING)
+ if(C.m_intent == MOVE_INTENT_WALK)
+ return FALSE
+ if(ishuman(C) && !(lube & SLIP_WHEN_JOGGING))
+ var/mob/living/carbon/human/H = C
+ if(!H.sprinting && H.getStaminaLoss() <= 20)
+ return FALSE
+ if(!(lube&SLIDE_ICE))
+ to_chat(C, "You slipped[ O ? " on the [O.name]" : ""]!")
+ playsound(C.loc, 'sound/misc/slip.ogg', 50, 1, -3)
- SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "slipped", /datum/mood_event/slipped)
- for(var/obj/item/I in C.held_items)
- C.accident(I)
+ SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "slipped", /datum/mood_event/slipped)
+ for(var/obj/item/I in C.held_items)
+ C.accident(I)
- var/olddir = C.dir
- if(!(lube & SLIDE_ICE))
- C.Knockdown(knockdown_amount)
- C.stop_pulling()
- else
- C.Stun(20)
+ var/olddir = C.dir
+ if(!(lube & SLIDE_ICE))
+ C.Knockdown(knockdown_amount)
+ C.stop_pulling()
+ else
+ C.Stun(20)
- if(buckled_obj)
- buckled_obj.unbuckle_mob(C)
- lube |= SLIDE_ICE
+ if(buckled_obj)
+ buckled_obj.unbuckle_mob(C)
+ lube |= SLIDE_ICE
- if(lube&SLIDE)
- new /datum/forced_movement(C, get_ranged_target_turf(C, olddir, 4), 1, FALSE, CALLBACK(C, /mob/living/carbon/.proc/spin, 1, 1))
- else if(lube&SLIDE_ICE)
- new /datum/forced_movement(C, get_ranged_target_turf(C, olddir, 1), 1, FALSE) //spinning would be bad for ice, fucks up the next dir
- return 1
+ if(lube&SLIDE)
+ new /datum/forced_movement(C, get_ranged_target_turf(C, olddir, 4), 1, FALSE, CALLBACK(C, /mob/living/carbon/.proc/spin, 1, 1))
+ else if(lube&SLIDE_ICE)
+ new /datum/forced_movement(C, get_ranged_target_turf(C, olddir, 1), 1, FALSE) //spinning would be bad for ice, fucks up the next dir
+ return TRUE
/turf/open/proc/MakeSlippery(wet_setting = TURF_WET_WATER, min_wet_time = 0, wet_time_to_add = 0, max_wet_time = MAXIMUM_WET_TIME, permanent)
AddComponent(/datum/component/wet_floor, wet_setting, min_wet_time, wet_time_to_add, max_wet_time, permanent)
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index 5278374abd..7bf7c5221a 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -89,7 +89,8 @@
return TRUE
/turf/open/space/handle_slip()
- return
+ if(lube & FLYING_DOESNT_HELP)
+ return ..()
/turf/open/space/attackby(obj/item/C, mob/user, params)
..()
diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm
index 155b0fc7de..4a99e9c89e 100644
--- a/code/modules/mob/living/carbon/carbon_movement.dm
+++ b/code/modules/mob/living/carbon/carbon_movement.dm
@@ -13,8 +13,8 @@
. += SOFTCRIT_ADD_SLOWDOWN
/mob/living/carbon/slip(knockdown_amount, obj/O, lube)
- if(movement_type & FLYING)
- return 0
+ if(movement_type & FLYING && !(lube & FLYING_DOESNT_HELP))
+ return FALSE
if(!(lube&SLIDE_ICE))
log_combat(src, (O ? O : get_turf(src)), "slipped on the", null, ((lube & SLIDE) ? "(LUBE)" : null))
return loc.handle_slip(src, knockdown_amount, O, lube)