Kills /obj/item/melee/transforming, replaces it with a transforming weapon component (#60761)

This PR kills off the transforming subtype of /obj/item/melee and replaces it with a component to handle the transforming behavior, /datum/component/transforming.

The transforming component handles updating the variables of an item when it's transformed. Things like force, sharpness, whetstone force bonus, and attack verbs. Similar to the two-handed component, but instead of transforming into a two-hander it remains a one handed weapon.

The "nemesis" behavior (dealing addition damage to certain factions) of the transforming subtype was moved to the cleaving saw only, since it was the only transforming item that used it. In the future, this can be made into a bespoke element/component as well.

The following weapons and items have been updated to use this component:

    Energy Swords / Sabers / Bananium Energy Sword
    Energy Circular Saw
    Energy Dagger
    Energy Axe
    Toy Energy Sword
    Holographic Energy Sword
    Switchblade
    Advanced Medical Tools (Laser scalpel, Mechanical Pinches, Searing Tool)
    Advanced Engineering Tools (Hand Drill, Jaws of Life / Syndicate Jaws of Life)
    Combat Wrench
    Cleaving Saw
    Telescopic Batons / Contractor Batons
    Roasting Stick
    Telescopic Riot Shield
    Energy Shield / Bananium Energy Shield

This PR also touches up the code around the various above items.
This commit is contained in:
MrMelbert
2021-08-23 13:45:54 -05:00
committed by GitHub
parent d8a1f27fff
commit b3e8eebdc9
76 changed files with 1084 additions and 835 deletions
@@ -59,65 +59,65 @@
//BANANIUM SWORD
/obj/item/melee/transforming/energy/sword/bananium
/obj/item/melee/energy/sword/bananium
name = "bananium sword"
desc = "An elegant weapon, for a more civilized age."
icon_state = "e_sword"
attack_verb_continuous = list("hits", "taps", "pokes")
attack_verb_simple = list("hit", "tap", "poke")
force = 0
throwforce = 0
force_on = 0
throwforce_on = 0
hitsound = null
attack_verb_on = list("slips")
clumsy_check = FALSE
sharpness = NONE
sword_color = "yellow"
heat = 0
embedding = null
light_color = COLOR_YELLOW
var/next_trombone_allowed = 0
sword_color_icon = "bananium"
active_heat = 0
/// Cooldown for making a trombone noise for failing to make a bananium desword
COOLDOWN_DECLARE(next_trombone_allowed)
/obj/item/melee/transforming/energy/sword/bananium/Initialize()
/obj/item/melee/energy/sword/bananium/make_transformable()
AddComponent(/datum/component/transforming, \
throw_speed_on = 4, \
attack_verb_continuous_on = list("slips"), \
attack_verb_simple_on = list("slip"), \
clumsy_check = FALSE)
RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, .proc/on_transform)
/obj/item/melee/energy/sword/bananium/on_transform(obj/item/source, mob/user, active)
. = ..()
adjust_slipperiness()
/* Adds or removes a slippery component, depending on whether the sword
* is active or not.
/*
* Adds or removes a slippery component, depending on whether the sword is active or not.
*/
/obj/item/melee/transforming/energy/sword/proc/adjust_slipperiness()
if(active)
/obj/item/melee/energy/sword/bananium/proc/adjust_slipperiness()
if(blade_active)
AddComponent(/datum/component/slippery, 60, GALOSHES_DONT_HELP)
else
qdel(GetComponent(/datum/component/slippery))
/obj/item/melee/transforming/energy/sword/bananium/attack(mob/living/M, mob/living/user)
..()
if(active)
/obj/item/melee/energy/sword/bananium/attack(mob/living/M, mob/living/user)
. = ..()
if(blade_active)
var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
slipper.Slip(src, M)
/obj/item/melee/transforming/energy/sword/bananium/throw_impact(atom/hit_atom, throwingdatum)
/obj/item/melee/energy/sword/bananium/throw_impact(atom/hit_atom, throwingdatum)
. = ..()
if(active)
if(blade_active)
var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
slipper.Slip(src, hit_atom)
/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))
next_trombone_allowed = world.time + 50
/obj/item/melee/energy/sword/bananium/attackby(obj/item/weapon, mob/living/user, params)
if(COOLDOWN_FINISHED(src, next_trombone_allowed) && istype(weapon, /obj/item/melee/energy/sword/bananium))
COOLDOWN_START(src, next_trombone_allowed, 5 SECONDS)
to_chat(user, span_warning("You slap the two swords together. Sadly, they do not seem to fit!"))
playsound(src, 'sound/misc/sadtrombone.ogg', 50)
return TRUE
return ..()
/obj/item/melee/transforming/energy/sword/bananium/transform_weapon(mob/living/user, supress_message_text)
. = ..()
adjust_slipperiness()
/obj/item/melee/transforming/energy/sword/bananium/ignition_effect(atom/A, mob/user)
return ""
/obj/item/melee/transforming/energy/sword/bananium/suicide_act(mob/user)
if(!active)
transform_weapon(user, TRUE)
/obj/item/melee/energy/sword/bananium/suicide_act(mob/user)
if(!blade_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)
slipper.Slip(src, user)
@@ -128,42 +128,39 @@
/obj/item/shield/energy/bananium
name = "bananium energy shield"
desc = "A shield that stops most melee attacks, protects user from almost all energy projectiles, and can be thrown to slip opponents."
icon_state = "bananaeshield"
throw_speed = 1
clumsy_check = 0
base_icon_state = "bananaeshield"
force = 0
throwforce = 0
throw_range = 5
on_force = 0
on_throwforce = 0
on_throw_speed = 1
/obj/item/shield/energy/bananium/Initialize()
active_force = 0
active_throwforce = 0
active_throw_speed = 1
can_clumsy_use = TRUE
/obj/item/shield/energy/bananium/on_transform(obj/item/source, mob/user, active)
. = ..()
adjust_slipperiness()
/* Adds or removes a slippery component, depending on whether the shield
* is active or not.
/*
* Adds or removes a slippery component, depending on whether the shield is active or not.
*/
/obj/item/shield/energy/bananium/proc/adjust_slipperiness()
if(active)
if(enabled)
AddComponent(/datum/component/slippery, 60, GALOSHES_DONT_HELP)
else
qdel(GetComponent(/datum/component/slippery))
/obj/item/shield/energy/bananium/attack_self(mob/living/carbon/human/user)
. = ..()
adjust_slipperiness()
/obj/item/shield/energy/bananium/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, gentle = FALSE, quickstart = TRUE)
if(active)
if(enabled)
if(iscarbon(thrower))
var/mob/living/carbon/C = thrower
C.throw_mode_on(THROW_MODE_TOGGLE) //so they can catch it on the return.
return ..()
/obj/item/shield/energy/bananium/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
if(active)
if(enabled)
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)
@@ -491,7 +491,7 @@
/obj/item/dnainjector/lasereyesmut = 7,
/obj/item/gun/magic/wand/fireball/inert = 3,
/obj/item/pneumatic_cannon = 15,
/obj/item/melee/transforming/energy/sword = 7,
/obj/item/melee/energy/sword = 7,
/obj/item/book/granter/spell/knock = 15,
/obj/item/book/granter/spell/summonitem = 20,
/obj/item/book/granter/spell/forcewall = 17,
+1 -1
View File
@@ -42,7 +42,7 @@
cost = CARGO_CRATE_VALUE * 80
unit_name = "major lava planet artifact"
export_types = list(/obj/item/hierophant_club,
/obj/item/melee/transforming/cleaving_saw,
/obj/item/melee/cleaving_saw,
/obj/item/organ/vocal_cords/colossus,
/obj/machinery/anomalous_crystal,
/obj/item/mayhem,
+3 -3
View File
@@ -63,7 +63,7 @@
/obj/item/storage/box/survival/engineer = 1,
)
glasses = /obj/item/clothing/glasses/thermal/eyepatch
l_pocket = /obj/item/melee/transforming/energy/sword/saber
l_pocket = /obj/item/melee/energy/sword/saber
/datum/outfit/centcom/ert/security
name = "ERT Security"
@@ -330,7 +330,7 @@
back = /obj/item/storage/backpack/ert/clown
backpack_contents = list(
/obj/item/gun/ballistic/revolver/reverse = 1,
/obj/item/melee/transforming/energy/sword/bananium = 1,
/obj/item/melee/energy/sword/bananium = 1,
/obj/item/shield/energy/bananium = 1,
/obj/item/storage/box/survival/engineer = 1,
)
@@ -512,7 +512,7 @@
gloves = /obj/item/clothing/gloves/tackler/combat/insulated
mask = /obj/item/clothing/mask/gas/sechailer/swat
shoes = /obj/item/clothing/shoes/combat/swat
l_pocket = /obj/item/melee/transforming/energy/sword/saber
l_pocket = /obj/item/melee/energy/sword/saber
r_pocket = /obj/item/shield/energy
l_hand = /obj/item/gun/energy/pulse/loyalpin
+3 -3
View File
@@ -236,7 +236,7 @@
gloves = /obj/item/clothing/gloves/color/black
glasses = /obj/item/clothing/glasses/sunglasses
shoes = /obj/item/clothing/shoes/sneakers/black
l_pocket = /obj/item/melee/transforming/energy/sword/saber
l_pocket = /obj/item/melee/energy/sword/saber
l_hand = /obj/item/storage/secure/briefcase
/datum/outfit/assassin/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
@@ -414,7 +414,7 @@
suit_store = /obj/item/tank/internals/oxygen
back = /obj/item/storage/backpack/holding
backpack_contents = list(
/obj/item/melee/transforming/energy/axe = 1,
/obj/item/melee/energy/axe = 1,
/obj/item/storage/part_replacer/bluespace/tier4 = 1,
/obj/item/gun/magic/wand/resurrection/debug = 1,
/obj/item/gun/magic/wand/death/debug = 1,
@@ -446,7 +446,7 @@
suit_store = /obj/item/tank/internals/oxygen
back = /obj/item/storage/backpack/holding
backpack_contents = list(
/obj/item/melee/transforming/energy/axe = 1,
/obj/item/melee/energy/axe = 1,
/obj/item/storage/part_replacer/bluespace/tier4 = 1,
/obj/item/gun/magic/wand/resurrection/debug = 1,
/obj/item/gun/magic/wand/death/debug = 1,
+2 -2
View File
@@ -417,7 +417,7 @@
hardsuit_type = "syndi"
w_class = WEIGHT_CLASS_NORMAL
armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 40, BOMB = 35, BIO = 100, RAD = 50, FIRE = 50, ACID = 90, WOUND = 25)
allowed = list(/obj/item/gun, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
allowed = list(/obj/item/gun, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi
jetpack = /obj/item/tank/jetpack/suit
cell = /obj/item/stock_parts/cell/hyper
@@ -1043,7 +1043,7 @@
inhand_icon_state = "syndie_hardsuit"
hardsuit_type = "syndi"
armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 40, BOMB = 35, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, WOUND = 30)
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi
slowdown = 0
shield_icon = "shield-red"
+1 -1
View File
@@ -16,7 +16,7 @@
desc = "A modified suit to allow space pirates to board shuttles and stations while avoiding the maw of the void. Comes with additional protection, and is lighter to move in."
icon_state = "spacepirate"
w_class = WEIGHT_CLASS_NORMAL
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/melee/transforming/energy/sword/pirate, /obj/item/clothing/glasses/eyepatch, /obj/item/reagent_containers/food/drinks/bottle/rum)
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/melee/energy/sword/pirate, /obj/item/clothing/glasses/eyepatch, /obj/item/reagent_containers/food/drinks/bottle/rum)
slowdown = 0
armor = list(MELEE = 30, BULLET = 50, LASER = 30,ENERGY = 40, BOMB = 30, BIO = 30, RAD = 30, FIRE = 60, ACID = 75)
strip_delay = 40
@@ -4,7 +4,7 @@
/obj/item/clothing/suit/space/eva/plasmaman
name = "EVA plasma envirosuit"
desc = "A special plasma containment suit designed to be space-worthy, as well as worn over other clothing. Like its smaller counterpart, it can automatically extinguish the wearer in a crisis, and holds twice as many charges."
allowed = list(/obj/item/gun, /obj/item/ammo_casing, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword, /obj/item/restraints/handcuffs, /obj/item/tank)
allowed = list(/obj/item/gun, /obj/item/ammo_casing, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/energy/sword, /obj/item/restraints/handcuffs, /obj/item/tank)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 100, ACID = 75)
resistance_flags = FIRE_PROOF
icon_state = "plasmaman_suit"
+1 -1
View File
@@ -12,7 +12,7 @@
inhand_icon_state = "space_suit_syndicate"
desc = "Has a tag on it: Totally not property of an enemy corporation, honest!"
w_class = WEIGHT_CLASS_NORMAL
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
armor = list(MELEE = 40, BULLET = 50, LASER = 30,ENERGY = 40, BOMB = 30, BIO = 30, RAD = 30, FIRE = 80, ACID = 85)
cell = /obj/item/stock_parts/cell/hyper
+1 -1
View File
@@ -18,7 +18,7 @@
desc = "Yarr."
icon_state = "pirate"
inhand_icon_state = "pirate"
allowed = list(/obj/item/melee/transforming/energy/sword/pirate, /obj/item/clothing/glasses/eyepatch, /obj/item/reagent_containers/food/drinks/bottle/rum)
allowed = list(/obj/item/melee/energy/sword/pirate, /obj/item/clothing/glasses/eyepatch, /obj/item/reagent_containers/food/drinks/bottle/rum)
species_exception = list(/datum/species/golem)
/obj/item/clothing/suit/pirate/armored
@@ -81,7 +81,7 @@
name = "Energy cake"
reqs = list(
/obj/item/food/cake/birthday = 1,
/obj/item/melee/transforming/energy/sword = 1,
/obj/item/melee/energy/sword = 1,
)
blacklist = list(/obj/item/food/cake/birthday/energy)
result = /obj/item/food/cake/birthday/energy
+15 -49
View File
@@ -7,63 +7,29 @@
// Items
//
/obj/item/holo
damtype = STAMINA
/obj/item/holo/esword
/obj/item/melee/energy/sword/holographic
name = "holographic energy sword"
desc = "May the force be with you. Sorta."
icon = 'icons/obj/transforming_energy.dmi'
icon_state = "sword0"
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
force = 3.0
damtype = STAMINA
throw_speed = 2
throw_range = 5
throwforce = 0
w_class = WEIGHT_CLASS_SMALL
hitsound = "swing_hit"
armour_penetration = 50
var/active = 0
var/saber_color
embedding = null
sword_color_icon = null
/obj/item/holo/esword/green/Initialize()
active_throwforce = 0
active_sharpness = NONE
active_heat = 0
/obj/item/melee/energy/sword/holographic/Initialize()
. = ..()
saber_color = "green"
if(!sword_color_icon)
sword_color_icon = pick("red", "blue", "green", "purple")
/obj/item/holo/esword/red/Initialize()
. = ..()
saber_color = "red"
/obj/item/melee/energy/sword/holographic/green
sword_color_icon = "green"
/obj/item/holo/esword/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(active)
return ..()
return 0
/obj/item/holo/esword/attack(target, mob/user)
..()
/obj/item/holo/esword/Initialize()
. = ..()
saber_color = pick("red","blue","green","purple")
/obj/item/holo/esword/attack_self(mob/living/user)
active = !active
if (active)
force = 30
icon_state = "sword[saber_color]"
w_class = WEIGHT_CLASS_BULKY
hitsound = 'sound/weapons/blade1.ogg'
playsound(user, 'sound/weapons/saberon.ogg', 20, TRUE)
to_chat(user, span_notice("[src] is now active."))
else
force = 3
icon_state = "sword0"
w_class = WEIGHT_CLASS_SMALL
hitsound = "swing_hit"
playsound(user, 'sound/weapons/saberoff.ogg', 20, TRUE)
to_chat(user, span_notice("[src] can now be concealed."))
return
/obj/item/melee/energy/sword/holographic/red
sword_color_icon = "red"
//BASKETBALL OBJECTS
+1 -1
View File
@@ -196,7 +196,7 @@
if(88)
new /obj/item/reagent_containers/food/drinks/bottle/lizardwine(src)
if(89)
new /obj/item/melee/transforming/energy/sword/bananium(src)
new /obj/item/melee/energy/sword/bananium(src)
if(90)
new /obj/item/dnainjector/wackymut(src)
if(91)
+86 -60
View File
@@ -795,88 +795,84 @@
//Blood-Drunk Miner: Cleaving Saw
/obj/item/melee/transforming/cleaving_saw
/obj/item/melee/cleaving_saw
name = "cleaving saw"
desc = "This saw, effective at drawing the blood of beasts, transforms into a long cleaver that makes use of centrifugal force."
force = 12
force_on = 20 //force when active
throwforce = 20
throwforce_on = 20
icon = 'icons/obj/lavaland/artefacts.dmi'
lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi'
righthand_file = 'icons/mob/inhands/64x64_righthand.dmi'
icon_state = "cleaving_saw"
worn_icon_state = "cleaving_saw"
attack_verb_continuous = list("attacks", "saws", "slices", "tears", "lacerates", "rips", "dices", "cuts")
attack_verb_simple = list("attack", "saw", "slice", "tear", "lacerate", "rip", "dice", "cut")
force = 12
throwforce = 20
inhand_x_dimension = 64
inhand_y_dimension = 64
icon_state = "cleaving_saw"
icon_state_on = "cleaving_saw_open"
worn_icon_state = "cleaving_saw"
slot_flags = ITEM_SLOT_BELT
attack_verb_off = list("attacks", "saws", "slices", "tears", "lacerates", "rips", "dices", "cuts")
attack_verb_on = list("cleaves", "swipes", "slashes", "chops")
hitsound = 'sound/weapons/bladeslice.ogg'
hitsound_on = 'sound/weapons/bladeslice.ogg'
w_class = WEIGHT_CLASS_BULKY
sharpness = SHARP_EDGED
faction_bonus_force = 30
nemesis_factions = list("mining", "boss")
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
var/transform_cooldown
/// Whether the saw is open or not
var/is_open = FALSE
/// List of factions we deal bonus damage to
var/list/nemesis_factions = list("mining", "boss")
/// Amount of damage we deal to the above factions
var/faction_bonus_force = 30
/// Whether the cleaver is actively AoE swiping something.
var/swiping = FALSE
/// Amount of bleed stacks gained per hit
var/bleed_stacks_per_hit = 3
/// Force when the saw is opened.
var/open_force = 20
/// Throwforce when the saw is opened.
var/open_throwforce = 20
/obj/item/melee/transforming/cleaving_saw/examine(mob/user)
/obj/item/melee/cleaving_saw/Initialize()
. = ..()
. += "<span class='notice'>It is [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"].\n"+\
"Both modes will build up existing bleed effects, doing a burst of high damage if the bleed is built up high enough.\n"+\
"Transforming it immediately after an attack causes the next attack to come out faster.</span>"
AddComponent(/datum/component/transforming, \
transform_cooldown_time = (CLICK_CD_MELEE * 0.25), \
force_on = open_force, \
throwforce_on = open_throwforce, \
sharpness_on = sharpness, \
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"))
RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, .proc/on_transform)
/obj/item/melee/transforming/cleaving_saw/suicide_act(mob/user)
user.visible_message(span_suicide("[user] is [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!"))
transform_cooldown = 0
transform_weapon(user, TRUE)
/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("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/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!"))
attack_self(user)
return BRUTELOSS
/obj/item/melee/transforming/cleaving_saw/transform_weapon(mob/living/user, supress_message_text)
if(transform_cooldown > world.time)
return FALSE
/obj/item/melee/cleaving_saw/melee_attack_chain(mob/user, atom/target, params)
. = ..()
if(.)
transform_cooldown = world.time + (CLICK_CD_MELEE * 0.5)
user.changeNext_move(CLICK_CD_MELEE * 0.25)
/obj/item/melee/transforming/cleaving_saw/transform_messages(mob/living/user, supress_message_text)
if(!supress_message_text)
if(active)
to_chat(user, span_notice("You open [src]. It will now cleave enemies in a wide arc and deal additional damage to fauna."))
else
to_chat(user, span_notice("You close [src]. It will now attack rapidly and cause fauna to bleed."))
playsound(user, 'sound/magic/clockwork/fellowship_armory.ogg', 35, TRUE, frequency = 90000 - (active * 30000))
/obj/item/melee/transforming/cleaving_saw/clumsy_transform_effect(mob/living/user)
if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
to_chat(user, span_warning("You accidentally cut yourself with [src], like a doofus!"))
user.take_bodypart_damage(10)
/obj/item/melee/transforming/cleaving_saw/melee_attack_chain(mob/user, atom/target, params)
..()
if(!active)
if(!is_open)
user.changeNext_move(CLICK_CD_MELEE * 0.5) //when closed, it attacks very rapidly
/obj/item/melee/transforming/cleaving_saw/nemesis_effects(mob/living/user, mob/living/target)
if(istype(target, /mob/living/simple_animal/hostile/asteroid/elite))
return
var/datum/status_effect/stacking/saw_bleed/B = target.has_status_effect(STATUS_EFFECT_SAWBLEED)
if(!B)
target.apply_status_effect(STATUS_EFFECT_SAWBLEED,bleed_stacks_per_hit)
else
B.add_stacks(bleed_stacks_per_hit)
/obj/item/melee/transforming/cleaving_saw/attack(mob/living/target, mob/living/carbon/human/user)
if(!active || swiping || !target.density || get_turf(target) == get_turf(user))
if(!active)
/obj/item/melee/cleaving_saw/attack(mob/living/target, mob/living/carbon/human/user)
if(!is_open || swiping || !target.density || get_turf(target) == get_turf(user))
if(!is_open)
faction_bonus_force = 0
..()
if(!active)
var/is_nemesis_faction = FALSE
for(var/found_faction in target.faction)
if(found_faction in nemesis_factions)
is_nemesis_faction = TRUE
force += faction_bonus_force
nemesis_effects(user, target)
break
. = ..()
if(is_nemesis_faction)
force -= faction_bonus_force
if(!is_open)
faction_bonus_force = initial(faction_bonus_force)
else
var/turf/user_turf = get_turf(user)
@@ -890,6 +886,36 @@
melee_attack_chain(user, living_target)
swiping = FALSE
/*
* If we're attacking [target]s in our nemesis list, apply unique effects.
*
* user - the mob attacking with the saw
* target - the mob being attacked
*/
/obj/item/melee/cleaving_saw/proc/nemesis_effects(mob/living/user, mob/living/target)
if(istype(target, /mob/living/simple_animal/hostile/asteroid/elite))
return
var/datum/status_effect/stacking/saw_bleed/existing_bleed = target.has_status_effect(STATUS_EFFECT_SAWBLEED)
if(existing_bleed)
existing_bleed.add_stacks(bleed_stacks_per_hit)
else
target.apply_status_effect(STATUS_EFFECT_SAWBLEED, bleed_stacks_per_hit)
/*
* Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM].
*
* Gives feedback and makes the nextmove after transforming much quicker.
*/
/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))
return COMPONENT_NO_DEFAULT_MESSAGE
//Legion: Staff of Storms
/obj/item/storm_staff
+1 -1
View File
@@ -591,7 +591,7 @@
armor = list(MELEE = 30, BULLET = 30, LASER = 10, ENERGY = 20, BOMB = 50, BIO = 100, RAD = 10, FIRE = 100, ACID = 100)
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/spear, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife, /obj/item/kinetic_crusher, /obj/item/resonator, /obj/item/melee/transforming/cleaving_saw)
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/spear, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife, /obj/item/kinetic_crusher, /obj/item/resonator, /obj/item/melee/cleaving_saw)
/obj/item/clothing/suit/space/hardsuit/berserker/Initialize()
@@ -519,7 +519,7 @@
name = "Syndicate Assault"
basic_modules = list(
/obj/item/assembly/flash/cyborg,
/obj/item/melee/transforming/energy/sword/cyborg,
/obj/item/melee/energy/sword/cyborg,
/obj/item/gun/energy/printer,
/obj/item/gun/ballistic/revolver/grenadelauncher/cyborg,
/obj/item/card/emag,
@@ -556,7 +556,7 @@
/obj/item/cautery,
/obj/item/surgicaldrill,
/obj/item/scalpel,
/obj/item/melee/transforming/energy/sword/cyborg/saw,
/obj/item/melee/energy/sword/cyborg/saw,
/obj/item/roller/robo,
/obj/item/crowbar/cyborg,
/obj/item/extinguisher/mini,
@@ -5,7 +5,7 @@
icon_state = "grievous"
health = 150
maxHealth = 150
baton_type = /obj/item/melee/transforming/energy/sword/saber
baton_type = /obj/item/melee/energy/sword/saber
base_speed = 4 //he's a fast fucker
var/block_chance = 50
weapon_force = 30
@@ -414,7 +414,7 @@
new /obj/item/toy/sword(Tsec)
if(ASSEMBLY_FIFTH_STEP)
if(istype(I, /obj/item/melee/transforming/energy/sword/saber))
if(istype(I, /obj/item/melee/energy/sword/saber))
if(swordamt < 3)
if(!user.temporarilyRemoveItemFromInventory(I))
return
@@ -439,7 +439,7 @@
icon_state = initial(icon_state)
to_chat(user, span_notice("You unbolt [src]'s energy swords."))
for(var/IS in 1 to swordamt)
new /obj/item/melee/transforming/energy/sword/saber(Tsec)
new /obj/item/melee/energy/sword/saber(Tsec)
//Firebot Assembly
@@ -41,8 +41,8 @@ Difficulty: Medium
ranged_cooldown_time = 1.6 SECONDS
pixel_x = -16
base_pixel_x = -16
crusher_loot = list(/obj/item/melee/transforming/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator, /obj/item/crusher_trophy/miner_eye)
loot = list(/obj/item/melee/transforming/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator)
crusher_loot = list(/obj/item/melee/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator, /obj/item/crusher_trophy/miner_eye)
loot = list(/obj/item/melee/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator)
wander = FALSE
del_on_death = TRUE
blood_volume = BLOOD_VOLUME_NORMAL
@@ -50,7 +50,7 @@ Difficulty: Medium
achievement_type = /datum/award/achievement/boss/blood_miner_kill
crusher_achievement_type = /datum/award/achievement/boss/blood_miner_crusher
score_achievement_type = /datum/award/score/blood_miner_score
var/obj/item/melee/transforming/cleaving_saw/miner/miner_saw
var/obj/item/melee/cleaving_saw/miner/miner_saw
var/time_until_next_transform = 0
var/dashing = FALSE
var/dash_cooldown = 0
@@ -119,13 +119,13 @@ Difficulty: Medium
shoot_ka()
transform_weapon()
/obj/item/melee/transforming/cleaving_saw/miner //nerfed saw because it is very murdery
/obj/item/melee/cleaving_saw/miner //nerfed saw because it is very murdery
force = 6
force_on = 10
open_force = 10
/obj/item/melee/transforming/cleaving_saw/miner/attack(mob/living/target, mob/living/carbon/human/user)
/obj/item/melee/cleaving_saw/miner/attack(mob/living/target, mob/living/carbon/human/user)
target.add_stun_absorption("miner", 10, INFINITY)
..()
. = ..()
target.stun_absorption -= "miner"
/obj/projectile/kinetic/miner
@@ -260,15 +260,14 @@ Difficulty: Medium
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/proc/transform_weapon()
if(time_until_next_transform <= world.time)
miner_saw.transform_cooldown = 0
miner_saw.transform_weapon(src, TRUE)
if(!miner_saw.active)
miner_saw.attack_self(src)
if(!miner_saw.is_open)
rapid_melee = 5 // 4 deci cooldown before changes, npcpool subsystem wait is 20, 20/4 = 5
else
rapid_melee = 3 // same thing but halved (slightly rounded up)
transform_stop_attack = TRUE
icon_state = "miner[miner_saw.active ? "_transformed":""]"
icon_living = "miner[miner_saw.active ? "_transformed":""]"
icon_state = "miner[miner_saw.is_open ? "_transformed":""]"
icon_living = "miner[miner_saw.is_open ? "_transformed":""]"
update_cooldowns(list(COOLDOWN_UPDATE_SET_TRANSFORM = rand(5 SECONDS, 10 SECONDS)))
/obj/effect/temp_visual/dir_setting/miner_death
@@ -25,7 +25,7 @@
unsuitable_atmos_damage = 7.5
speak_emote = list("yarrs")
loot = list(/obj/effect/mob_spawn/human/corpse/pirate,
/obj/item/melee/transforming/energy/sword/pirate)
/obj/item/melee/energy/sword/pirate)
del_on_death = 1
faction = list("pirate")
+41 -39
View File
@@ -122,6 +122,10 @@
desc = "It's an expensive [current_skin] fountain pen. The nib is quite sharp."
/obj/item/pen/attack_self(mob/living/carbon/user)
. = ..()
if(.)
return
var/deg = input(user, "What angle would you like to rotate the pen head to? (1-360)", "Rotate Pen Head") as null|num
if(deg && (deg > 0 && deg <= 360))
degrees = deg
@@ -216,62 +220,60 @@
/obj/item/pen/edagger
attack_verb_continuous = list("slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts") //these won't show up if the pen is off
attack_verb_simple = list("slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut")
sharpness = SHARP_EDGED
var/on = FALSE
sharpness = SHARP_POINTY
/// The real name of our item when extended.
var/hidden_name = "energy dagger"
/// Whether or pen is extended
var/extended = FALSE
/obj/item/pen/edagger/ComponentInitialize()
/obj/item/pen/edagger/Initialize()
. = ..()
AddComponent(/datum/component/butchering, 60, 100, 0, 'sound/weapons/blade1.ogg')
AddElement(/datum/element/update_icon_updates_onmob)
/obj/item/pen/edagger/get_sharpness()
return on * sharpness
AddComponent(/datum/component/butchering, _speed = 6 SECONDS, _butcher_sound = 'sound/weapons/blade1.ogg')
AddComponent(/datum/component/transforming, \
force_on = 18, \
throwforce_on = 35, \
throw_speed_on = 4, \
sharpness_on = SHARP_EDGED, \
w_class_on = WEIGHT_CLASS_NORMAL)
RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, .proc/on_transform)
/obj/item/pen/edagger/suicide_act(mob/user)
. = BRUTELOSS
if(on)
if(extended)
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!"))
attack_self(user)
/obj/item/pen/edagger/attack_self(mob/living/user)
if(on)
on = FALSE
force = initial(force)
throw_speed = initial(throw_speed)
w_class = initial(w_class)
name = initial(name)
hitsound = initial(hitsound)
embedding = list(embed_chance = EMBED_CHANCE)
throwforce = initial(throwforce)
playsound(user, 'sound/weapons/saberoff.ogg', 5, TRUE)
to_chat(user, span_warning("[src] can now be concealed."))
else
on = TRUE
force = 18
throw_speed = 4
w_class = WEIGHT_CLASS_NORMAL
name = "energy dagger"
hitsound = 'sound/weapons/blade1.ogg'
embedding = list(embed_chance = 100) //rule of cool
throwforce = 35
playsound(user, 'sound/weapons/saberon.ogg', 5, TRUE)
to_chat(user, span_warning("[src] is now active."))
updateEmbedding()
update_appearance()
/*
* Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM].
*
* Handles swapping their icon files to edagger related icon files -
* as they're supposed to look like a normal pen.
*/
/obj/item/pen/edagger/proc/on_transform(obj/item/source, mob/user, active)
SIGNAL_HANDLER
/obj/item/pen/edagger/update_icon_state()
if(on)
icon_state = inhand_icon_state = "edagger"
extended = active
if(active)
name = hidden_name
icon_state = "edagger"
inhand_icon_state = "edagger"
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
embedding = list(embed_chance = 100) // Rule of cool
else
icon_state = initial(icon_state) //looks like a normal pen when off.
name = initial(name)
icon_state = initial(icon_state)
inhand_icon_state = initial(inhand_icon_state)
lefthand_file = initial(lefthand_file)
righthand_file = initial(righthand_file)
return ..()
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)
return COMPONENT_NO_DEFAULT_MESSAGE
/obj/item/pen/survival
name = "survival pen"
+1 -1
View File
@@ -548,7 +548,7 @@
GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list(
/obj/item/gun/energy/plasmacutter,
/obj/item/melee/transforming/energy,
/obj/item/melee/energy,
/obj/item/dualsaber
)))
+1 -1
View File
@@ -162,7 +162,7 @@
/datum/outfit/lavaland_syndicate/comms
name = "Lavaland Syndicate Comms Agent"
r_hand = /obj/item/melee/transforming/energy/sword/saber
r_hand = /obj/item/melee/energy/sword/saber
mask = /obj/item/clothing/mask/chameleon/gps
suit = /obj/item/clothing/suit/armor/vest
+1 -1
View File
@@ -25,7 +25,7 @@
name = "perform lobotomy"
implements = list(
TOOL_SCALPEL = 85,
/obj/item/melee/transforming/energy/sword = 55,
/obj/item/melee/energy/sword = 55,
/obj/item/kitchen/knife = 35,
/obj/item/shard = 25,
/obj/item = 20)
+1 -1
View File
@@ -23,7 +23,7 @@
name = "incise heart"
implements = list(
TOOL_SCALPEL = 90,
/obj/item/melee/transforming/energy/sword = 45,
/obj/item/melee/energy/sword = 45,
/obj/item/kitchen/knife = 45,
/obj/item/shard = 25)
time = 16
+1 -1
View File
@@ -24,7 +24,7 @@
name = "remove lower duodenum"
implements = list(
TOOL_SCALPEL = 95,
/obj/item/melee/transforming/energy/sword = 65,
/obj/item/melee/energy/sword = 65,
/obj/item/kitchen/knife = 45,
/obj/item/shard = 35)
time = 52
+1 -1
View File
@@ -23,7 +23,7 @@
name = "remove damaged liver section"
implements = list(
TOOL_SCALPEL = 95,
/obj/item/melee/transforming/energy/sword = 65,
/obj/item/melee/energy/sword = 65,
/obj/item/kitchen/knife = 45,
/obj/item/shard = 35)
time = 52
+1 -1
View File
@@ -22,7 +22,7 @@
name = "excise damaged lung node"
implements = list(
TOOL_SCALPEL = 95,
/obj/item/melee/transforming/energy/sword = 65,
/obj/item/melee/energy/sword = 65,
/obj/item/kitchen/knife = 45,
/obj/item/shard = 35)
time = 42
+1 -1
View File
@@ -4,7 +4,7 @@
name = "make incision"
implements = list(
TOOL_SCALPEL = 100,
/obj/item/melee/transforming/energy/sword = 75,
/obj/item/melee/energy/sword = 75,
/obj/item/kitchen/knife = 65,
/obj/item/shard = 45,
/obj/item = 30) // 30% success with any sharp item.
+2 -2
View File
@@ -244,7 +244,7 @@
/obj/item/organ/cyberimp/arm/esword
name = "arm-mounted energy blade"
desc = "An illegal and highly dangerous cybernetic implant that can project a deadly blade of concentrated energy."
items_to_create = list(/obj/item/melee/transforming/energy/blade/hardlight)
items_to_create = list(/obj/item/melee/energy/blade/hardlight)
/obj/item/organ/cyberimp/arm/medibeam
name = "integrated medical beamgun"
@@ -283,7 +283,7 @@
/obj/item/organ/cyberimp/arm/combat
name = "combat cybernetics implant"
desc = "A powerful cybernetic implant that contains combat modules built into the user's arm."
items_to_create = list(/obj/item/melee/transforming/energy/blade/hardlight, /obj/item/gun/medbeam, /obj/item/borg/stun, /obj/item/assembly/flash/armimplant)
items_to_create = list(/obj/item/melee/energy/blade/hardlight, /obj/item/gun/medbeam, /obj/item/borg/stun, /obj/item/assembly/flash/armimplant)
/obj/item/organ/cyberimp/arm/combat/Initialize()
. = ..()
+73 -35
View File
@@ -68,28 +68,39 @@
name = "searing tool"
desc = "It projects a high power laser used for medical applications."
icon = 'icons/obj/surgery.dmi'
icon_state = "cautery_a"
icon_state = "e_cautery"
hitsound = 'sound/items/welder.ogg'
toolspeed = 0.7
light_system = MOVABLE_LIGHT
light_range = 1
light_color = COLOR_SOFT_RED
/obj/item/cautery/advanced/Initialize()
. = ..()
AddComponent(/datum/component/transforming, \
force_on = force, \
throwforce_on = throwforce, \
hitsound_on = hitsound, \
w_class_on = w_class, \
clumsy_check = FALSE)
RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, .proc/on_transform)
/obj/item/cautery/advanced/attack_self(mob/user)
playsound(get_turf(user), 'sound/weapons/tap.ogg', 50, TRUE)
if(tool_behaviour == TOOL_CAUTERY)
tool_behaviour = TOOL_DRILL
balloon_alert(user, "lenses set to drill")
icon_state = "surgicaldrill_a"
else
tool_behaviour = TOOL_CAUTERY
balloon_alert(user, "lenses set to mend")
icon_state = "cautery_a"
/*
* Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM].
*
* Toggles between drill and cautery and gives feedback to the user.
*/
/obj/item/cautery/advanced/proc/on_transform(obj/item/source, mob/user, active)
SIGNAL_HANDLER
tool_behaviour = (active ? TOOL_DRILL : TOOL_CAUTERY)
balloon_alert(user, "lenses set to [active ? "drill" : "mend"]")
playsound(user ? user : src, 'sound/weapons/tap.ogg', 50, TRUE)
return COMPONENT_NO_DEFAULT_MESSAGE
/obj/item/cautery/advanced/examine()
. = ..()
. += " It's set to [tool_behaviour == TOOL_CAUTERY ? "mending" : "drilling"] mode."
. += span_notice("It's set to [tool_behaviour == TOOL_CAUTERY ? "mending" : "drilling"] mode.")
/obj/item/surgicaldrill
name = "surgical drill"
@@ -251,7 +262,7 @@
name = "laser scalpel"
desc = "An advanced scalpel which uses laser technology to cut."
icon = 'icons/obj/surgery.dmi'
icon_state = "scalpel_a"
icon_state = "e_scalpel"
hitsound = 'sound/weapons/blade1.ogg'
force = 16
toolspeed = 0.7
@@ -260,47 +271,74 @@
light_color = LIGHT_COLOR_GREEN
sharpness = SHARP_EDGED
/obj/item/scalpel/advanced/Initialize()
. = ..()
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)
RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, .proc/on_transform)
/obj/item/scalpel/advanced/attack_self(mob/user)
playsound(get_turf(user), 'sound/machines/click.ogg', 50, TRUE)
if(tool_behaviour == TOOL_SCALPEL)
/*
* Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM].
*
* Toggles between saw and scalpel and updates the light / gives feedback to the user.
*/
/obj/item/scalpel/advanced/proc/on_transform(obj/item/source, mob/user, active)
SIGNAL_HANDLER
if(active)
tool_behaviour = TOOL_SAW
balloon_alert(user, "enabled bone-cutting mode")
set_light_range(2)
force += 1 //we don't want to ruin sharpened stuff
icon_state = "saw_a"
else
tool_behaviour = TOOL_SCALPEL
balloon_alert(user, "disabled bone-cutting mode")
set_light_range(1)
force -= 1
icon_state = "scalpel_a"
balloon_alert(user, "[active ? "enabled" : "disabled"] bone-cutting mode")
playsound(user ? user : src, 'sound/machines/click.ogg', 50, TRUE)
return COMPONENT_NO_DEFAULT_MESSAGE
/obj/item/scalpel/advanced/examine()
. = ..()
. += " It's set to [tool_behaviour == TOOL_SCALPEL ? "scalpel" : "saw"] mode."
. += span_notice("It's set to [tool_behaviour == TOOL_SCALPEL ? "scalpel" : "saw"] mode.")
/obj/item/retractor/advanced
name = "mechanical pinches"
desc = "An agglomerate of rods and gears."
icon = 'icons/obj/surgery.dmi'
icon_state = "retractor_a"
icon_state = "adv_retractor"
toolspeed = 0.7
/obj/item/retractor/advanced/attack_self(mob/user)
playsound(get_turf(user), 'sound/items/change_drill.ogg', 50, TRUE)
if(tool_behaviour == TOOL_RETRACTOR)
tool_behaviour = TOOL_HEMOSTAT
balloon_alert(user, "gears set to clamp")
icon_state = "hemostat_a"
else
tool_behaviour = TOOL_RETRACTOR
balloon_alert(user, "gears set to retract")
icon_state = "retractor_a"
/obj/item/retractor/advanced/Initialize()
. = ..()
AddComponent(/datum/component/transforming, \
force_on = force, \
throwforce_on = throwforce, \
hitsound_on = hitsound, \
w_class_on = w_class, \
clumsy_check = FALSE)
RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, .proc/on_transform)
/*
* Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM].
*
* Toggles between retractor and hemostat and gives feedback to the user.
*/
/obj/item/retractor/advanced/proc/on_transform(obj/item/source, mob/user, active)
SIGNAL_HANDLER
tool_behaviour = (active ? TOOL_HEMOSTAT : TOOL_RETRACTOR)
balloon_alert(user, "gears set to [active ? "clamp" : "retract"]")
playsound(user ? user : src, 'sound/items/change_drill.ogg', 50, TRUE)
return COMPONENT_NO_DEFAULT_MESSAGE
/obj/item/retractor/advanced/examine()
. = ..()
. += " It resembles a [tool_behaviour == TOOL_RETRACTOR ? "retractor" : "hemostat"]."
. += span_notice("It resembles a [tool_behaviour == TOOL_RETRACTOR ? "retractor" : "hemostat"].")
/obj/item/shears
name = "amputation shears"
+2 -3
View File
@@ -342,7 +342,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
name = "Bananium Energy Sword"
desc = "An energy sword that deals no damage, but will slip anyone it contacts, be it by melee attack, thrown \
impact, or just stepping on it. Beware friendly fire, as even anti-slip shoes will not protect against it."
item = /obj/item/melee/transforming/energy/sword/bananium
item = /obj/item/melee/energy/sword/bananium
cost = 3
surplus = 0
purchasable_from = UPLINK_CLOWN_OPS
@@ -415,7 +415,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
name = "Energy Sword"
desc = "The energy sword is an edged weapon with a blade of pure energy. The sword is small enough to be \
pocketed when inactive. Activating it produces a loud, distinctive noise."
item = /obj/item/melee/transforming/energy/sword/saber
item = /obj/item/melee/energy/sword/saber
cost = 8
purchasable_from = ~UPLINK_CLOWN_OPS
@@ -2035,4 +2035,3 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 1
purchasable_from = UPLINK_CLOWN_OPS
illegal_tech = FALSE