diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 4caa3e1d0dd..1a64238c992 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -632,6 +632,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_APC_SHOCKING "apc_shocking" /// Properly wielded two handed item #define TRAIT_WIELDED "wielded" +/// A transforming item that is actively extended / transformed +#define TRAIT_TRANSFORM_ACTIVE "active_transform" /// Buckling yourself to objects with this trait won't immobilize you #define TRAIT_NO_IMMOBILIZE "no_immobilize" /// Prevents stripping this equipment diff --git a/code/datums/actions/mobs/transform_weapon.dm b/code/datums/actions/mobs/transform_weapon.dm index 884f4fa36dc..3cc70e4f748 100644 --- a/code/datums/actions/mobs/transform_weapon.dm +++ b/code/datums/actions/mobs/transform_weapon.dm @@ -20,9 +20,7 @@ var/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/BDM = owner var/obj/item/melee/cleaving_saw/miner/miner_saw = BDM.miner_saw miner_saw.attack_self(owner) - if(!miner_saw.is_open) - BDM.rapid_melee = 5 // 4 deci cooldown before changes, npcpool subsystem wait is 20, 20/4 = 5 - else - BDM.rapid_melee = 3 // same thing but halved (slightly rounded up) - BDM.icon_state = "miner[miner_saw.is_open ? "_transformed":""]" - BDM.icon_living = "miner[miner_saw.is_open ? "_transformed":""]" + var/saw_open = HAS_TRAIT(miner_saw, TRAIT_TRANSFORM_ACTIVE) + BDM.rapid_melee = saw_open ? 3 : 5 + BDM.icon_state = "miner[saw_open ? "_transformed":""]" + BDM.icon_living = "miner[saw_open ? "_transformed":""]" diff --git a/code/datums/components/transforming.dm b/code/datums/components/transforming.dm index 52b334e31f0..d704ca2098d 100644 --- a/code/datums/components/transforming.dm +++ b/code/datums/components/transforming.dm @@ -37,24 +37,24 @@ /// If we get sharpened with a whetstone, save the bonus here for later use if we un/redeploy var/sharpened_bonus = 0 /// Dictate whether we change inhands or not - var/inhand_icon_change + var/inhand_icon_change = TRUE /// Cooldown in between transforms COOLDOWN_DECLARE(transform_cooldown) /datum/component/transforming/Initialize( - start_transformed = FALSE, - transform_cooldown_time = 0 SECONDS, - force_on = 0, - throwforce_on = 0, - throw_speed_on = 2, - sharpness_on = NONE, - hitsound_on = 'sound/weapons/blade1.ogg', - w_class_on = WEIGHT_CLASS_BULKY, - clumsy_check = TRUE, - list/attack_verb_continuous_on, - list/attack_verb_simple_on, - inhand_icon_change = TRUE, - ) + start_transformed = FALSE, + transform_cooldown_time = 0 SECONDS, + force_on = 0, + throwforce_on = 0, + throw_speed_on = 2, + sharpness_on = NONE, + hitsound_on = 'sound/weapons/blade1.ogg', + w_class_on = WEIGHT_CLASS_BULKY, + clumsy_check = TRUE, + list/attack_verb_continuous_on, + list/attack_verb_simple_on, + inhand_icon_change = TRUE, +) if(!isitem(parent)) return COMPONENT_INCOMPATIBLE @@ -120,7 +120,7 @@ if(do_transform(source, user)) clumsy_transform_effect(user) - . = COMPONENT_CANCEL_ATTACK_CHAIN + return COMPONENT_CANCEL_ATTACK_CHAIN /* * Transform the weapon into its alternate form, calling [toggle_active]. @@ -153,7 +153,7 @@ /datum/component/transforming/proc/default_transform_message(obj/item/source, mob/user) if(user) source.balloon_alert(user, "[active ? "enabled" : "disabled"] [source]") - playsound(user ? user : source.loc, 'sound/weapons/batonextend.ogg', 50, TRUE) + playsound(source, 'sound/weapons/batonextend.ogg', 50, TRUE) /* * Toggle active between true and false, and call @@ -175,6 +175,7 @@ * source - the item being transformed / parent */ /datum/component/transforming/proc/set_active(obj/item/source) + ADD_TRAIT(source, TRAIT_TRANSFORM_ACTIVE, REF(src)) if(sharpness_on) source.sharpness = sharpness_on if(force_on) @@ -203,6 +204,7 @@ * source - the item being un-transformed / parent */ /datum/component/transforming/proc/set_inactive(obj/item/source) + REMOVE_TRAIT(source, TRAIT_TRANSFORM_ACTIVE, REF(src)) if(sharpness_on) source.sharpness = initial(source.sharpness) if(force_on) @@ -245,8 +247,8 @@ var/hurt_self_verb_continuous = LAZYLEN(attack_verb_continuous_on) ? pick(attack_verb_continuous_on) : "hits" user.visible_message( span_warning("[user] triggers [parent] while holding it backwards and [hurt_self_verb_continuous] themself, like a doofus!"), - span_warning("You trigger [parent] while holding it backwards and [hurt_self_verb_simple] yourself, like a doofus!") - ) + span_warning("You trigger [parent] while holding it backwards and [hurt_self_verb_simple] yourself, like a doofus!"), + ) user.take_bodypart_damage(10) return TRUE return FALSE diff --git a/code/game/objects/items/boxcutter.dm b/code/game/objects/items/boxcutter.dm index ebf5eac5bbc..2d7f0190183 100644 --- a/code/game/objects/items/boxcutter.dm +++ b/code/game/objects/items/boxcutter.dm @@ -13,10 +13,6 @@ w_class = WEIGHT_CLASS_SMALL resistance_flags = FIRE_PROOF force = 0 - var/start_extended = FALSE - /// Whether or not the boxcutter has been readied - var/on = FALSE - var/on_sound = 'sound/items/boxcutter_activate.ogg' /// Used on Initialize, how much time to cut cable restraints and zipties. var/snap_time_weak_handcuffs = 0 SECONDS /// Used on Initialize, how much time to cut real handcuffs. Null means it can't. @@ -30,8 +26,8 @@ effectiveness = 100, \ ) - AddComponent(/datum/component/transforming, \ - start_transformed = start_extended, \ + AddComponent( \ + /datum/component/transforming, \ force_on = 10, \ throwforce_on = 4, \ throw_speed_on = throw_speed, \ @@ -47,8 +43,7 @@ /obj/item/boxcutter/proc/on_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER - on = active - playsound(src, on_sound, 50) + playsound(src, 'sound/items/boxcutter_activate.ogg', 50) tool_behaviour = (active ? TOOL_KNIFE : NONE) if(active) AddElement(/datum/element/cuffsnapping, snap_time_weak_handcuffs, snap_time_strong_handcuffs) diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index 305cf688266..f1cca87b88d 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -322,13 +322,15 @@ /obj/item/melee/baton/telescopic/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = active_force, \ hitsound_on = hitsound, \ w_class_on = WEIGHT_CLASS_NORMAL, \ clumsy_check = FALSE, \ attack_verb_continuous_on = list("smacks", "strikes", "cracks", "beats"), \ - attack_verb_simple_on = list("smack", "strike", "crack", "beat")) + attack_verb_simple_on = list("smack", "strike", "crack", "beat"), \ + ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) /obj/item/melee/baton/telescopic/suicide_act(mob/living/user) @@ -361,8 +363,9 @@ src.active = active inhand_icon_state = active ? on_inhand_icon_state : null // When inactive, there is no inhand icon_state. - balloon_alert(user, active ? "extended" : "collapsed") - playsound(user ? user : src, on_sound, 50, TRUE) + if(user) + balloon_alert(user, active ? "extended" : "collapsed") + playsound(src, on_sound, 50, TRUE) return COMPONENT_NO_DEFAULT_MESSAGE /obj/item/melee/baton/telescopic/contractor_baton diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 917b161b049..06efb0d7fd6 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -16,8 +16,6 @@ /// The color of this energy based sword, for use in editing the icon_state. var/sword_color_icon - /// Whether our blade is active or not. - var/blade_active = FALSE /// Force while active. var/active_force = 30 /// Throwforce while active. @@ -48,9 +46,11 @@ /obj/item/melee/energy/Initialize(mapload) . = ..() make_transformable() - AddComponent(/datum/component/butchering, \ - speed = 5 SECONDS, \ - butcher_sound = active_hitsound, \ + AddElement(/datum/element/update_icon_updates_onmob) + AddComponent( + /datum/component/butchering, \ + speed = 5 SECONDS, \ + butcher_sound = active_hitsound, \ ) /obj/item/melee/energy/Destroy() @@ -61,7 +61,8 @@ * Gives our item the transforming component, passing in our various vars. */ /obj/item/melee/energy/proc/make_transformable() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = active_force, \ throwforce_on = active_throwforce, \ throw_speed_on = 4, \ @@ -70,12 +71,11 @@ w_class_on = active_w_class, \ attack_verb_continuous_on = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts"), \ attack_verb_simple_on = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut"), \ - inhand_icon_change = FALSE, \ ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) /obj/item/melee/energy/suicide_act(mob/living/user) - if(!blade_active) + if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) attack_self(user) user.visible_message(span_suicide("[user] is [pick("slitting [user.p_their()] stomach open with", "falling on")] [src]! It looks like [user.p_theyre()] trying to commit seppuku!")) return (BRUTELOSS|FIRELOSS) @@ -85,7 +85,7 @@ open_flame() /obj/item/melee/energy/ignition_effect(atom/atom, mob/user) - if(!heat && !blade_active) + if(!heat && !HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) return "" var/in_mouth = "" @@ -97,27 +97,28 @@ playsound(loc, hitsound, get_clamped_volume(), TRUE, -1) add_fingerprint(user) -/* +/obj/item/melee/energy/update_icon_state() + . = ..() + if(!sword_color_icon) + return + if(HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) + icon_state = "[base_icon_state]_on_[sword_color_icon]" // "esword_on_red" + inhand_icon_state = icon_state + else + icon_state = base_icon_state + inhand_icon_state = base_icon_state + +/** * Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM]. * - * Updates our icon to have the correct color, - * updates the amount of heat our item gives out, - * enables / disables embedding, and - * starts / stops processing. + * Updates some of the stuff the transforming comp doesn't, such as heat and embedding. * * Also gives feedback to the user and activates or deactives the glow. */ /obj/item/melee/energy/proc/on_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER - blade_active = active if(active) - if(sword_color_icon) - icon_state = "[icon_state]_[sword_color_icon]" - inhand_icon_state = "[inhand_icon_state]_on_[sword_color_icon]" - if(ismob(loc)) - var/mob/loc_mob = loc - loc_mob.update_held_items() if(embedding) updateEmbedding() heat = active_heat @@ -131,8 +132,9 @@ tool_behaviour = (active ? TOOL_SAW : NONE) //Lets energy weapons cut trees. Also lets them do bonecutting surgery, which is kinda metal! if(user) balloon_alert(user, "[name] [active ? "enabled":"disabled"]") - playsound(user ? user : src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 35, TRUE) + playsound(src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 35, TRUE) set_light_on(active) + update_appearance(UPDATE_ICON_STATE) return COMPONENT_NO_DEFAULT_MESSAGE /// Energy axe - extremely strong. @@ -141,6 +143,7 @@ desc = "An energized battle axe." icon_state = "axe" inhand_icon_state = "axe" + base_icon_state = "axe" lefthand_file = 'icons/mob/inhands/weapons/axes_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/axes_righthand.dmi' hitsound = 'sound/weapons/bladeslice.ogg' @@ -161,12 +164,14 @@ active_w_class = WEIGHT_CLASS_HUGE /obj/item/melee/energy/axe/make_transformable() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = active_force, \ throwforce_on = active_throwforce, \ throw_speed_on = throw_speed, \ sharpness_on = sharpness, \ - w_class_on = active_w_class) + w_class_on = active_w_class, \ + ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) /obj/item/melee/energy/axe/suicide_act(mob/living/user) @@ -178,6 +183,7 @@ name = "energy sword" desc = "May the force be within you." icon_state = "e_sword" + base_icon_state = "e_sword" inhand_icon_state = "e_sword" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' @@ -192,9 +198,9 @@ embedding = list("embed_chance" = 75, "impact_pain_mult" = 10) /obj/item/melee/energy/sword/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) - if(blade_active) - return ..() - return FALSE + if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) + return FALSE + return ..() /obj/item/melee/energy/sword/cyborg name = "cyborg energy sword" @@ -207,14 +213,14 @@ return var/obj/item/stock_parts/cell/our_cell = user.cell - if(blade_active && !(our_cell.use(hitcost))) + if(HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE) && !(our_cell.use(hitcost))) attack_self(user) to_chat(user, span_notice("It's out of charge!")) return return ..() /obj/item/melee/energy/sword/cyborg/cyborg_unequip(mob/user) - if(!blade_active) + if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) return attack_self(user) @@ -246,7 +252,7 @@ "blue" = LIGHT_COLOR_LIGHT_CYAN, "green" = LIGHT_COLOR_GREEN, "purple" = LIGHT_COLOR_LAVENDER, - ) + ) /// Whether this saber has been multitooled. var/hacked = FALSE var/hacked_color @@ -261,19 +267,22 @@ /obj/item/melee/energy/sword/saber/process() . = ..() - if(blade_active && hacked) - if(!LAZYLEN(possible_sword_colors)) - possible_sword_colors = list( - "red" = COLOR_SOFT_RED, - "blue" = LIGHT_COLOR_LIGHT_CYAN, - "green" = LIGHT_COLOR_GREEN, - "purple" = LIGHT_COLOR_LAVENDER, - ) - possible_sword_colors -= hacked_color - hacked_color = pick(possible_sword_colors) - set_light_color(possible_sword_colors[hacked_color]) + if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE) || !hacked) + return + + if(!LAZYLEN(possible_sword_colors)) + possible_sword_colors = list( + "red" = COLOR_SOFT_RED, + "blue" = LIGHT_COLOR_LIGHT_CYAN, + "green" = LIGHT_COLOR_GREEN, + "purple" = LIGHT_COLOR_LAVENDER, + ) possible_sword_colors -= hacked_color + hacked_color = pick(possible_sword_colors) + set_light_color(possible_sword_colors[hacked_color]) + possible_sword_colors -= hacked_color + /obj/item/melee/energy/sword/saber/red sword_color_icon = "red" @@ -293,16 +302,14 @@ hacked = TRUE sword_color_icon = "rainbow" to_chat(user, span_warning("RNBW_ENGAGE")) - if(force >= active_force) - icon_state = "[initial(icon_state)]_on_rainbow" - inhand_icon_state = "[initial(inhand_icon_state)]_on_rainbow" - user.update_held_items() + update_appearance(UPDATE_ICON_STATE) /obj/item/melee/energy/sword/pirate name = "energy cutlass" desc = "Arrrr matey." icon_state = "e_cutlass" inhand_icon_state = "e_cutlass" + base_icon_state = "e_cutlass" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' light_color = COLOR_RED @@ -312,6 +319,7 @@ name = "energy blade" desc = "A concentrated beam of energy in the shape of a blade. Very stylish... and lethal." icon_state = "blade" + base_icon_state = "blade" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' hitsound = 'sound/weapons/blade1.ogg' @@ -324,7 +332,6 @@ sharpness = SHARP_EDGED heat = 3500 w_class = WEIGHT_CLASS_BULKY - blade_active = TRUE /// Our linked spark system that emits from our sword. var/datum/effect_system/spark_spread/spark_system @@ -335,6 +342,7 @@ spark_system.set_up(5, 0, src) spark_system.attach(src) START_PROCESSING(SSobj, src) + ADD_TRAIT(src, TRAIT_TRANSFORM_ACTIVE, INNATE_TRAIT) // Functions as an extended esword /obj/item/melee/energy/blade/Destroy() QDEL_NULL(spark_system) @@ -348,3 +356,4 @@ desc = "An extremely sharp blade made out of hard light. Packs quite a punch." icon_state = "lightblade" inhand_icon_state = "lightblade" + base_icon_state = "lightblade" diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 4c017783273..9043d0e9af3 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -355,14 +355,13 @@ var/static/list/ovens /// The beam that links to the oven we use var/datum/beam/beam - /// Whether or stick is extended and can recieve sausage - var/extended = FALSE /obj/item/melee/roastingstick/Initialize(mapload) . = ..() if (!ovens) ovens = typecacheof(list(/obj/singularity, /obj/energy_ball, /obj/machinery/power/supermatter_crystal, /obj/structure/bonfire)) - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ hitsound_on = hitsound, \ clumsy_check = FALSE, \ inhand_icon_change = FALSE, \ @@ -390,16 +389,16 @@ /obj/item/melee/roastingstick/proc/on_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER - extended = active inhand_icon_state = active ? "nullrod" : null - balloon_alert(user, "[active ? "extended" : "collapsed"] [src]") - playsound(user ? user : src, 'sound/weapons/batonextend.ogg', 50, TRUE) + if(user) + balloon_alert(user, "[active ? "extended" : "collapsed"] [src]") + playsound(src, 'sound/weapons/batonextend.ogg', 50, TRUE) return COMPONENT_NO_DEFAULT_MESSAGE /obj/item/melee/roastingstick/attackby(atom/target, mob/user) ..() if (istype(target, /obj/item/food/sausage)) - if (!extended) + if (!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) to_chat(user, span_warning("You must extend [src] to attach anything to it!")) return if (held_sausage) @@ -430,7 +429,7 @@ /obj/item/melee/roastingstick/afterattack(atom/target, mob/user, proximity) . = ..() - if (!extended) + if (!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) return if (!is_type_in_typecache(target, ovens)) return diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index b06ea245dbd..d41397301b3 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -244,8 +244,6 @@ throw_speed = 3 breakable_by_damage = FALSE block_sound = 'sound/weapons/block_blade.ogg' - /// Whether the shield is currently extended and protecting the user. - var/enabled = FALSE /// Force of the shield when active. var/active_force = 10 /// Throwforce of the shield when active. @@ -257,19 +255,21 @@ /obj/item/shield/energy/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = active_force, \ throwforce_on = active_throwforce, \ throw_speed_on = active_throw_speed, \ hitsound_on = hitsound, \ - clumsy_check = !can_clumsy_use) + clumsy_check = !can_clumsy_use, \ + ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) /obj/item/shield/energy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) return FALSE /obj/item/shield/energy/IsReflect() - return enabled + return HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE) /* * Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM]. @@ -277,10 +277,9 @@ /obj/item/shield/energy/proc/on_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER - enabled = active - - balloon_alert(user, "[active ? "activated":"deactivated"]") - playsound(user ? user : src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 35, TRUE) + if(user) + balloon_alert(user, active ? "activated" : "deactivated") + playsound(src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 35, TRUE) return COMPONENT_NO_DEFAULT_MESSAGE /obj/item/shield/riot/tele @@ -296,27 +295,28 @@ throw_speed = 3 throw_range = 4 w_class = WEIGHT_CLASS_NORMAL - /// Whether the shield is extended and protecting the user.. - var/extended = FALSE /obj/item/shield/riot/tele/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = 8, \ throwforce_on = 5, \ throw_speed_on = 2, \ hitsound_on = hitsound, \ w_class_on = WEIGHT_CLASS_BULKY, \ attack_verb_continuous_on = list("smacks", "strikes", "cracks", "beats"), \ - attack_verb_simple_on = list("smack", "strike", "crack", "beat")) + attack_verb_simple_on = list("smack", "strike", "crack", "beat"), \ + ) + RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) /obj/item/shield/riot/tele/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) - if(extended) + if(HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) return ..() return FALSE -/* +/** * Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM]. * * Allows it to be placed on back slot when active. @@ -324,10 +324,10 @@ /obj/item/shield/riot/tele/proc/on_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER - extended = active slot_flags = active ? ITEM_SLOT_BACK : null - playsound(user ? user : src, 'sound/weapons/batonextend.ogg', 50, TRUE) - balloon_alert(user, "[active ? "extended" : "collapsed"]") + if(user) + balloon_alert(user, active ? "extended" : "collapsed") + playsound(src, 'sound/weapons/batonextend.ogg', 50, TRUE) return COMPONENT_NO_DEFAULT_MESSAGE #undef BATON_BASH_COOLDOWN diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index 9203c8a123e..034e274d3cd 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -109,7 +109,8 @@ /obj/item/crowbar/power/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = force, \ throwforce_on = throwforce, \ hitsound_on = hitsound, \ @@ -128,8 +129,9 @@ SIGNAL_HANDLER tool_behaviour = (active ? TOOL_WIRECUTTER : TOOL_CROWBAR) - balloon_alert(user, "attached [active ? "cutting" : "prying"]") - playsound(user ? user : src, 'sound/items/change_jaws.ogg', 50, TRUE) + if(user) + balloon_alert(user, "attached [active ? "cutting" : "prying"]") + playsound(src, 'sound/items/change_jaws.ogg', 50, TRUE) if(tool_behaviour == TOOL_CROWBAR) RemoveElement(/datum/element/cuffsnapping, snap_time_weak_handcuffs, snap_time_strong_handcuffs) else diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index d9ad265ced8..adb9058be65 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -103,7 +103,8 @@ /obj/item/screwdriver/power/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = force, \ throwforce_on = throwforce, \ hitsound_on = hitsound, \ @@ -122,8 +123,9 @@ SIGNAL_HANDLER tool_behaviour = (active ? TOOL_WRENCH : TOOL_SCREWDRIVER) - balloon_alert(user, "attached [active ? "bolt bit" : "screw bit"]") - playsound(user ? user : src, 'sound/items/change_drill.ogg', 50, TRUE) + if(user) + balloon_alert(user, "attached [active ? "bolt bit" : "screw bit"]") + playsound(src, 'sound/items/change_drill.ogg', 50, TRUE) return COMPONENT_NO_DEFAULT_MESSAGE /obj/item/screwdriver/power/examine() diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm index c8a7ac74c80..20bf3884f34 100644 --- a/code/game/objects/items/tools/wrench.dm +++ b/code/game/objects/items/tools/wrench.dm @@ -103,12 +103,14 @@ /obj/item/wrench/combat/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = 6, \ throwforce_on = 8, \ hitsound_on = hitsound, \ w_class_on = WEIGHT_CLASS_NORMAL, \ - clumsy_check = FALSE) + clumsy_check = FALSE, \ + ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) /* @@ -119,15 +121,10 @@ /obj/item/wrench/combat/proc/on_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER - if(active) - tool_behaviour = TOOL_WRENCH - toolspeed = 1 - else - tool_behaviour = initial(tool_behaviour) - toolspeed = initial(toolspeed) - - balloon_alert(user, "[name] [active ? "active, woe!":"restrained"]") - playsound(user ? user : src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 5, TRUE) + tool_behaviour = active ? TOOL_WRENCH : initial(tool_behaviour) + if(user) + balloon_alert(user, "[name] [active ? "active, woe!":"restrained"]") + playsound(src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 5, TRUE) return COMPONENT_NO_DEFAULT_MESSAGE /obj/item/wrench/bolter diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 82d2ac2adb5..45337d70c28 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -409,7 +409,8 @@ /obj/item/toy/sword/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ throw_speed_on = throw_speed, \ hitsound_on = hitsound, \ clumsy_check = FALSE, \ @@ -432,8 +433,11 @@ */ /obj/item/toy/sword/proc/on_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER - balloon_alert(user, "[active ? "flicked out":"pushed in"] [src]") - playsound(user ? user : src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 20, TRUE) + + if(user) + balloon_alert(user, "[active ? "flicked out":"pushed in"] [src]") + + playsound(src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 20, TRUE) update_appearance(UPDATE_ICON) return COMPONENT_NO_DEFAULT_MESSAGE @@ -464,9 +468,7 @@ /obj/item/toy/sword/update_icon_state() . = ..() - var/datum/component/transforming/transforming_comp = GetComponent(/datum/component/transforming) - var/active = transforming_comp?.active - var/last_part = active ? "_on[saber_color ? "_[saber_color]" : null]" : null + var/last_part = HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE) ? "_on[saber_color ? "_[saber_color]" : null]" : null icon_state = "[initial(icon_state)][last_part]" inhand_icon_state = "[initial(inhand_icon_state)][last_part]" diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 3eda40d51ab..5fad2e4e28a 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -428,7 +428,8 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 effectiveness = 100, \ ) - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ start_transformed = start_extended, \ force_on = 20, \ throwforce_on = 23, \ @@ -503,13 +504,15 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/cane/white/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = 7, \ hitsound_on = hitsound, \ w_class_on = WEIGHT_CLASS_BULKY, \ clumsy_check = FALSE, \ attack_verb_continuous_on = list("smacks", "strikes", "cracks", "beats"), \ - attack_verb_simple_on = list("smack", "strike", "crack", "beat")) + attack_verb_simple_on = list("smack", "strike", "crack", "beat"), \ + ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) ADD_TRAIT(src, TRAIT_BLIND_TOOL, INNATE_TRAIT) @@ -521,8 +524,9 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/cane/white/proc/on_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER - balloon_alert(user, active ? "extended" : "collapsed") - playsound(user ? user : src, 'sound/weapons/batonextend.ogg', 50, TRUE) + if(user) + balloon_alert(user, active ? "extended" : "collapsed") + playsound(src, 'sound/weapons/batonextend.ogg', 50, TRUE) return COMPONENT_NO_DEFAULT_MESSAGE /obj/item/staff diff --git a/code/modules/antagonists/clown_ops/clown_weapons.dm b/code/modules/antagonists/clown_ops/clown_weapons.dm index c1f6c030d20..6e1821e52ee 100644 --- a/code/modules/antagonists/clown_ops/clown_weapons.dm +++ b/code/modules/antagonists/clown_ops/clown_weapons.dm @@ -99,11 +99,13 @@ COOLDOWN_DECLARE(next_trombone_allowed) /obj/item/melee/energy/sword/bananium/make_transformable() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ throw_speed_on = 4, \ attack_verb_continuous_on = list("slips"), \ attack_verb_simple_on = list("slip"), \ - clumsy_check = FALSE) + clumsy_check = FALSE, \ + ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) /obj/item/melee/energy/sword/bananium/on_transform(obj/item/source, mob/user, active) @@ -114,20 +116,20 @@ * Adds or removes a slippery component, depending on whether the sword is active or not. */ /obj/item/melee/energy/sword/bananium/proc/adjust_slipperiness() - if(blade_active) + if(HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) AddComponent(/datum/component/slippery, 60, GALOSHES_DONT_HELP) else qdel(GetComponent(/datum/component/slippery)) /obj/item/melee/energy/sword/bananium/attack(mob/living/M, mob/living/user) . = ..() - if(blade_active) + if(HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) slipper.Slip(src, M) /obj/item/melee/energy/sword/bananium/throw_impact(atom/hit_atom, throwingdatum) . = ..() - if(blade_active) + if(HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) slipper.Slip(src, hit_atom) @@ -140,7 +142,7 @@ return ..() /obj/item/melee/energy/sword/bananium/suicide_act(mob/living/user) - if(!blade_active) + if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) attack_self(user) user.visible_message(span_suicide("[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) @@ -172,7 +174,7 @@ * Adds or removes a slippery and boomerang component, depending on whether the shield is active or not. */ /obj/item/shield/energy/bananium/proc/adjust_comedy() - if(enabled) + if(HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) AddComponent(/datum/component/slippery, 60, GALOSHES_DONT_HELP) AddComponent(/datum/component/boomerang, throw_range+2, TRUE) else @@ -180,7 +182,7 @@ qdel(GetComponent(/datum/component/boomerang)) /obj/item/shield/energy/bananium/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - if(enabled) + if(HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) 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) diff --git a/code/modules/mining/lavaland/megafauna_loot.dm b/code/modules/mining/lavaland/megafauna_loot.dm index 7e5f7398c4e..619a60188b3 100644 --- a/code/modules/mining/lavaland/megafauna_loot.dm +++ b/code/modules/mining/lavaland/megafauna_loot.dm @@ -848,8 +848,6 @@ hitsound = 'sound/weapons/bladeslice.ogg' w_class = WEIGHT_CLASS_BULKY sharpness = SHARP_EDGED - /// Whether the saw is open or not - var/is_open = FALSE /// List of factions we deal bonus damage to var/list/nemesis_factions = list(FACTION_MINING, FACTION_BOSS) /// Amount of damage we deal to the above factions @@ -865,7 +863,8 @@ /obj/item/melee/cleaving_saw/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ transform_cooldown_time = (CLICK_CD_MELEE * 0.25), \ force_on = open_force, \ throwforce_on = open_throwforce, \ @@ -873,26 +872,28 @@ hitsound_on = hitsound, \ w_class_on = w_class, \ attack_verb_continuous_on = list("cleaves", "swipes", "slashes", "chops"), \ - attack_verb_simple_on = list("cleave", "swipe", "slash", "chop")) + attack_verb_simple_on = list("cleave", "swipe", "slash", "chop"), \ + ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) /obj/item/melee/cleaving_saw/examine(mob/user) . = ..() - . += span_notice("It is [is_open ? "open, will cleave enemies in a wide arc and deal additional damage to fauna":"closed, and can be used for rapid consecutive attacks that cause fauna to bleed"].") + . += span_notice("It is [HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE) ? "open, will cleave enemies in a wide arc and deal additional damage to fauna":"closed, and can be used for rapid consecutive attacks that cause fauna to bleed"].") . += span_notice("Both modes will build up existing bleed effects, doing a burst of high damage if the bleed is built up high enough.") . += span_notice("Transforming it immediately after an attack causes the next attack to come out faster.") /obj/item/melee/cleaving_saw/suicide_act(mob/living/user) - user.visible_message(span_suicide("[user] is [is_open ? "closing [src] on [user.p_their()] neck" : "opening [src] into [user.p_their()] chest"]! It looks like [user.p_theyre()] trying to commit suicide!")) + user.visible_message(span_suicide("[user] is [HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE) ? "closing [src] on [user.p_their()] neck" : "opening [src] into [user.p_their()] chest"]! It looks like [user.p_theyre()] trying to commit suicide!")) attack_self(user) return BRUTELOSS /obj/item/melee/cleaving_saw/melee_attack_chain(mob/user, atom/target, params) . = ..() - if(!is_open) + if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) user.changeNext_move(CLICK_CD_MELEE * 0.5) //when closed, it attacks very rapidly /obj/item/melee/cleaving_saw/attack(mob/living/target, mob/living/carbon/human/user) + var/is_open = HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE) if(!is_open || swiping || !target.density || get_turf(target) == get_turf(user)) if(!is_open) faction_bonus_force = 0 @@ -943,11 +944,10 @@ /obj/item/melee/cleaving_saw/proc/on_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER - is_open = active user.changeNext_move(CLICK_CD_MELEE * 0.25) - - balloon_alert(user, "[active ? "opened":"closed"] [src]") - playsound(user ? user : src, 'sound/magic/clockwork/fellowship_armory.ogg', 35, TRUE, frequency = 90000 - (is_open * 30000)) + if(user) + balloon_alert(user, "[active ? "opened" : "closed"] [src]") + playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', 35, TRUE, frequency = 90000 - (active * 30000)) return COMPONENT_NO_DEFAULT_MESSAGE //Legion: Staff of Storms diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index be6b4d2478c..ea62ba176d1 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -268,8 +268,6 @@ var/hidden_desc = "It's a normal black ink pe- Wait. That's a thing used to stab people!" /// The real icons used when extended. var/hidden_icon = "edagger" - /// Whether or pen is extended - var/extended = FALSE /obj/item/pen/edagger/Initialize(mapload) . = ..() @@ -277,7 +275,8 @@ speed = 6 SECONDS, \ butcher_sound = 'sound/weapons/blade1.ogg', \ ) - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = 18, \ throwforce_on = 35, \ throw_speed_on = 4, \ @@ -289,7 +288,7 @@ RegisterSignal(src, COMSIG_DETECTIVE_SCANNED, PROC_REF(on_scan)) /obj/item/pen/edagger/suicide_act(mob/living/user) - if(extended) + if(HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) user.visible_message(span_suicide("[user] forcefully rams the pen into their mouth!")) else user.visible_message(span_suicide("[user] is holding a pen up to their mouth! It looks like [user.p_theyre()] trying to commit suicide!")) @@ -305,7 +304,6 @@ /obj/item/pen/edagger/proc/on_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER - extended = active if(active) name = hidden_name desc = hidden_desc @@ -324,8 +322,9 @@ embedding = list(embed_chance = EMBED_CHANCE) updateEmbedding() - balloon_alert(user, "[hidden_name] [active ? "active":"concealed"]") - playsound(user ? user : src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 5, TRUE) + if(user) + balloon_alert(user, "[hidden_name] [active ? "active" : "concealed"]") + playsound(src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 5, TRUE) set_light_on(active) return COMPONENT_NO_DEFAULT_MESSAGE @@ -363,12 +362,11 @@ desc = "A pen with an extendable screwdriver tip. This one has a yellow cap." icon_state = "pendriver" toolspeed = 1.2 // gotta have some downside - /// whether the pen is extended - var/extended = FALSE /obj/item/pen/screwdriver/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ throwforce_on = 5, \ w_class_on = WEIGHT_CLASS_SMALL, \ sharpness_on = TRUE, \ @@ -378,24 +376,14 @@ RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(toggle_screwdriver)) AddElement(/datum/element/update_icon_updates_onmob) - -/obj/item/pen/screwdriver/vv_edit_var(var_name, var_value) - if(var_name == NAMEOF(src, extended)) - if(var_value != extended) - var/datum/component/transforming/transforming_comp = GetComponent(/datum/component/transforming) - transforming_comp.on_attack_self(src) - datum_flags |= DF_VAR_EDITED - return - return ..() - /obj/item/pen/screwdriver/proc/toggle_screwdriver(obj/item/source, mob/user, active) SIGNAL_HANDLER - extended = active + if(user) - balloon_alert(user, "[extended ? "extended" : "retracted"]") + balloon_alert(user, active ? "extended" : "retracted") playsound(src, 'sound/weapons/batonextend.ogg', 50, TRUE) - if(!extended) + if(!active) tool_behaviour = initial(tool_behaviour) RemoveElement(/datum/element/eyestab) else @@ -407,5 +395,5 @@ /obj/item/pen/screwdriver/update_icon_state() . = ..() - icon_state = "[initial(icon_state)][extended ? "_out":null]" + icon_state = "[initial(icon_state)][HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE) ? "_out" : null]" inhand_icon_state = initial(inhand_icon_state) //since transforming component switches the icon. diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index a6b122383a8..1f2affb6e7a 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -193,7 +193,7 @@ else if(istype(item, /obj/item/boxcutter)) var/obj/item/boxcutter/boxcutter_item = item - if(boxcutter_item.on) + if(HAS_TRAIT(boxcutter_item, TRAIT_TRANSFORM_ACTIVE)) if(!attempt_pre_unwrap_contents(user, time = 0.5 SECONDS)) return unwrap_contents() diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 76a313020f7..cabcc48e4eb 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -82,12 +82,14 @@ /obj/item/cautery/advanced/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = force, \ throwforce_on = throwforce, \ hitsound_on = hitsound, \ w_class_on = w_class, \ - clumsy_check = FALSE) + clumsy_check = FALSE, \ + ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) /* @@ -331,14 +333,16 @@ /obj/item/scalpel/advanced/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = force + 1, \ throwforce_on = throwforce, \ throw_speed_on = throw_speed, \ sharpness_on = sharpness, \ hitsound_on = hitsound, \ w_class_on = w_class, \ - clumsy_check = FALSE) + clumsy_check = FALSE, \ + ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) /* @@ -378,12 +382,14 @@ /obj/item/retractor/advanced/Initialize(mapload) . = ..() - AddComponent(/datum/component/transforming, \ + AddComponent( \ + /datum/component/transforming, \ force_on = force, \ throwforce_on = throwforce, \ hitsound_on = hitsound, \ w_class_on = w_class, \ - clumsy_check = FALSE) + clumsy_check = FALSE, \ + ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) /* diff --git a/icons/mob/inhands/weapons/swords_lefthand.dmi b/icons/mob/inhands/weapons/swords_lefthand.dmi index b9825c07859..dd1aba84b7d 100644 Binary files a/icons/mob/inhands/weapons/swords_lefthand.dmi and b/icons/mob/inhands/weapons/swords_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/swords_righthand.dmi b/icons/mob/inhands/weapons/swords_righthand.dmi index 297221ed1dd..25ae8d3517a 100644 Binary files a/icons/mob/inhands/weapons/swords_righthand.dmi and b/icons/mob/inhands/weapons/swords_righthand.dmi differ