mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-21 04:57:57 +01:00
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:
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
)))
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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()
|
||||
. = ..()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user