diff --git a/code/__DEFINES/achievements.dm b/code/__DEFINES/achievements.dm index 9da8ea2440a..acac49dcef8 100644 --- a/code/__DEFINES/achievements.dm +++ b/code/__DEFINES/achievements.dm @@ -32,6 +32,7 @@ #define MEDAL_VOID_ASCENSION "Void" #define MEDAL_TOOLBOX_SOUL "Toolsoul" #define MEDAL_CHEM_TUT "Beginner Chemist" +#define MEDAL_HOT_DAMN "Hot Damn!" //Skill medal hub IDs #define MEDAL_LEGENDARY_MINER "Legendary Miner" diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 4c77a25e21d..b5d5c55dc06 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -125,7 +125,7 @@ return SECONDARY_ATTACK_CALL_NORMAL /obj/attackby(obj/item/I, mob/living/user, params) - return ..() || ((obj_flags & CAN_BE_HIT) && I.attack_obj(src, user)) + return ..() || ((obj_flags & CAN_BE_HIT) && I.attack_obj(src, user, params)) /mob/living/attackby(obj/item/I, mob/living/user, params) if(..()) @@ -202,7 +202,7 @@ return SECONDARY_ATTACK_CALL_NORMAL /// The equivalent of the standard version of [/obj/item/proc/attack] but for object targets. -/obj/item/proc/attack_obj(obj/O, mob/living/user) +/obj/item/proc/attack_obj(obj/O, mob/living/user, params) if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_OBJ, O, user) & COMPONENT_CANCEL_ATTACK_CHAIN) return if(item_flags & NOBLUDGEON) diff --git a/code/datums/achievements/misc_achievements.dm b/code/datums/achievements/misc_achievements.dm index 0da38df8f30..26e779129aa 100644 --- a/code/datums/achievements/misc_achievements.dm +++ b/code/datums/achievements/misc_achievements.dm @@ -159,3 +159,9 @@ desc = "Passed the chemistry tutorial with perfect purity!" database_id = MEDAL_CHEM_TUT icon = "chem_tut" + +/datum/award/achievement/misc/hot_damn + name = "Hot Damn!" + desc = "Sometimes you need to make some noise to make a point." + database_id = MEDAL_HOT_DAMN + icon = "hotdamn" diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index 399d4661134..38913e32234 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -117,7 +117,7 @@ else return ..() -/obj/item/extinguisher/attack_obj(obj/O, mob/living/user) +/obj/item/extinguisher/attack_obj(obj/O, mob/living/user, params) if(AttemptRefill(O, user)) refilling = TRUE return FALSE diff --git a/code/game/objects/items/hand_items.dm b/code/game/objects/items/hand_items.dm index 313be3d7b4d..c113b79d3c1 100644 --- a/code/game/objects/items/hand_items.dm +++ b/code/game/objects/items/hand_items.dm @@ -113,6 +113,8 @@ attack_verb_continuous = list("slaps") attack_verb_simple = list("slap") hitsound = 'sound/effects/snap.ogg' + /// How many smaller table smacks we can do before we're out + var/table_smacks_left = 3 /obj/item/slapper/attack(mob/M, mob/living/carbon/human/user) if(ishuman(M)) @@ -126,6 +128,35 @@ "You hear a slap.") return +/obj/item/slapper/attack_obj(obj/O, mob/living/user, params) + if(!istype(O, /obj/structure/table)) + return ..() + + var/obj/structure/table/the_table = O + var/is_right_clicking = LAZYACCESS(params2list(params), RIGHT_CLICK) + + if(is_right_clicking && table_smacks_left == initial(table_smacks_left)) // so you can't do 2 weak slaps followed by a big slam + transform = transform.Scale(5) // BIG slap + if(HAS_TRAIT(user, TRAIT_HULK)) + transform = transform.Scale(2) + color = COLOR_GREEN + user.do_attack_animation(the_table) + if(ishuman(user)) + var/mob/living/carbon/human/human_user = user + if(istype(human_user.shoes, /obj/item/clothing/shoes/cowboy)) + human_user.say(pick("Hot damn!", "Hoo-wee!", "Got-dang!"), spans = list(SPAN_YELL), forced=TRUE) + human_user.client?.give_award(/datum/award/achievement/misc/hot_damn, human_user) + playsound(get_turf(the_table), 'sound/effects/tableslam.ogg', 110, TRUE) + user.visible_message("[user] slams [user.p_their()] fist down on [the_table]!", "You slam your fist down on [the_table]!") + qdel(src) + else + user.do_attack_animation(the_table) + playsound(get_turf(the_table), 'sound/effects/tableslam.ogg', 40, TRUE) + user.visible_message("[user] slaps [user.p_their()] hand on [the_table].", "You slap your hand on [the_table].", vision_distance=COMBAT_MESSAGE_RANGE) + table_smacks_left-- + if(table_smacks_left <= 0) + qdel(src) + /obj/item/noogie name = "noogie" desc = "Get someone in an aggressive grab then use this on them to ruin their day." diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm index 91e23bffc54..f4f64f591ff 100644 --- a/code/game/objects/items/inducer.dm +++ b/code/game/objects/items/inducer.dm @@ -33,7 +33,7 @@ if(cell && !(. & EMP_PROTECT_CONTENTS)) cell.emp_act(severity) -/obj/item/inducer/attack_obj(obj/O, mob/living/carbon/user) +/obj/item/inducer/attack_obj(obj/O, mob/living/carbon/user, params) if(user.combat_mode) return ..() diff --git a/code/game/objects/structures/lavaland/geyser.dm b/code/game/objects/structures/lavaland/geyser.dm index f2403da649b..fb1c6aa1d0e 100644 --- a/code/game/objects/structures/lavaland/geyser.dm +++ b/code/game/objects/structures/lavaland/geyser.dm @@ -79,7 +79,7 @@ var/list/layers = list("First Layer" = FIRST_DUCT_LAYER, "Second Layer" = SECOND_DUCT_LAYER, "Default Layer" = DUCT_LAYER_DEFAULT, "Fourth Layer" = FOURTH_DUCT_LAYER, "Fifth Layer" = FIFTH_DUCT_LAYER) -/obj/item/plunger/attack_obj(obj/O, mob/living/user) +/obj/item/plunger/attack_obj(obj/O, mob/living/user, params) if(layer_mode) SEND_SIGNAL(O, COMSIG_MOVABLE_CHANGE_DUCT_LAYER, O, target_layer) return ..() diff --git a/code/game/objects/structures/manned_turret.dm b/code/game/objects/structures/manned_turret.dm index 303b6ca9ee2..ccac75806c7 100644 --- a/code/game/objects/structures/manned_turret.dm +++ b/code/game/objects/structures/manned_turret.dm @@ -198,7 +198,7 @@ /obj/item/gun_control/CanItemAutoclick() return TRUE -/obj/item/gun_control/attack_obj(obj/O, mob/living/user) +/obj/item/gun_control/attack_obj(obj/O, mob/living/user, params) user.changeNext_move(CLICK_CD_MELEE) O.attacked_by(src, user) diff --git a/code/modules/cargo/coupon.dm b/code/modules/cargo/coupon.dm index ac77a994a03..78476cb01e0 100644 --- a/code/modules/cargo/coupon.dm +++ b/code/modules/cargo/coupon.dm @@ -30,7 +30,7 @@ discount_pct_off = text2num(discount_pct_off) name = "coupon - [round(discount_pct_off * 100)]% off [initial(discounted_pack.name)]" -/obj/item/coupon/attack_obj(obj/O, mob/living/user) +/obj/item/coupon/attack_obj(obj/O, mob/living/user, params) if(!istype(O, /obj/machinery/computer/cargo)) return ..() if(discount_pct_off == COUPON_OMEN) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 412ee81f2e6..3e6bcfd701d 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -65,7 +65,7 @@ Die() /obj/item/clothing/mask/facehugger/attackby(obj/item/O, mob/user, params) - return O.attack_obj(src, user) + return O.attack_obj(src, user, params) //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/mask/facehugger/attack_hand(mob/user, list/modifiers) diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm index e5d3a5b6e4f..04a7ac827f5 100644 --- a/code/modules/mob/living/carbon/emote.dm +++ b/code/modules/mob/living/carbon/emote.dm @@ -117,6 +117,7 @@ key = "slap" key_third_person = "slaps" hands_use_check = TRUE + cooldown = 3 SECONDS // to prevent endless table slamming /datum/emote/living/carbon/slap/run_emote(mob/user, params, type_override, intentional) . = ..() diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index a9696cea489..6ba7e2db63b 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -995,7 +995,7 @@ ..() shatter() -/obj/item/light/attack_obj(obj/O, mob/living/user) +/obj/item/light/attack_obj(obj/O, mob/living/user, params) ..() shatter() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index ffdbe8e4b7b..24efe69b527 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -394,7 +394,7 @@ return ..() return -/obj/item/gun/attack_obj(obj/O, mob/living/user) +/obj/item/gun/attack_obj(obj/O, mob/living/user, params) if(user.combat_mode) if(bayonet) O.attackby(bayonet, user) diff --git a/icons/UI_Icons/Achievements/Misc/hotdamn.png b/icons/UI_Icons/Achievements/Misc/hotdamn.png new file mode 100644 index 00000000000..5c278772f6f Binary files /dev/null and b/icons/UI_Icons/Achievements/Misc/hotdamn.png differ