mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-31 12:01:47 +00:00
* Makes the American sausage a sausage subtype & Advanced roasting stick fixes (#62193) Makes the American sausage a proper subtype of sausage, which makes it actually edible, apparently. It also makes it stick on the advanced roasting stick! The advanced roasting stick will no longer try to grill itself over a bonfire with a griddle installed, allowing you to use the actual bonfire for your roasting needs. There was actually a check that was supposed to limit the amount of times you could roast a sausage to a measly 1. It wasn't actually working. This PR removes that in favor of mad cooks creating these: * Makes the American sausage a sausage subtype & Advanced roasting stick fixes * fixes Co-authored-by: Sealed101 <75863639+Sealed101@users.noreply.github.com> Co-authored-by: jjpark-kb <55967837+jjpark-kb@users.noreply.github.com>
440 lines
16 KiB
Plaintext
440 lines
16 KiB
Plaintext
/obj/item/melee
|
|
item_flags = NEEDS_PERMIT
|
|
|
|
/obj/item/melee/proc/check_martial_counter(mob/living/carbon/human/target, mob/living/carbon/human/user)
|
|
if(target.check_block())
|
|
target.visible_message(span_danger("[target.name] blocks [src] and twists [user]'s arm behind [user.p_their()] back!"),
|
|
span_userdanger("You block the attack!"))
|
|
user.Stun(40)
|
|
return TRUE
|
|
|
|
|
|
/obj/item/melee/chainofcommand
|
|
name = "chain of command"
|
|
desc = "A tool used by great men to placate the frothing masses."
|
|
icon_state = "chain"
|
|
inhand_icon_state = "chain"
|
|
worn_icon_state = "whip"
|
|
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
|
|
flags_1 = CONDUCT_1
|
|
slot_flags = ITEM_SLOT_BELT
|
|
force = 10
|
|
throwforce = 7
|
|
wound_bonus = 15
|
|
bare_wound_bonus = 10
|
|
w_class = WEIGHT_CLASS_NORMAL
|
|
attack_verb_continuous = list("flogs", "whips", "lashes", "disciplines")
|
|
attack_verb_simple = list("flog", "whip", "lash", "discipline")
|
|
hitsound = 'sound/weapons/chainhit.ogg'
|
|
custom_materials = list(/datum/material/iron = 1000)
|
|
|
|
/obj/item/melee/chainofcommand/suicide_act(mob/user)
|
|
user.visible_message(span_suicide("[user] is strangling [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
|
|
return (OXYLOSS)
|
|
|
|
/obj/item/melee/synthetic_arm_blade
|
|
name = "synthetic arm blade"
|
|
desc = "A grotesque blade that on closer inspection seems to be made out of synthetic flesh, it still feels like it would hurt very badly as a weapon."
|
|
icon = 'icons/obj/changeling_items.dmi'
|
|
icon_state = "arm_blade"
|
|
inhand_icon_state = "arm_blade"
|
|
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
|
|
w_class = WEIGHT_CLASS_HUGE
|
|
force = 20
|
|
throwforce = 10
|
|
hitsound = 'sound/weapons/bladeslice.ogg'
|
|
attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts")
|
|
attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut")
|
|
sharpness = SHARP_EDGED
|
|
|
|
/obj/item/melee/synthetic_arm_blade/Initialize(mapload)
|
|
. = ..()
|
|
AddComponent(/datum/component/butchering, 60, 80) //very imprecise
|
|
|
|
/obj/item/melee/sabre
|
|
name = "officer's sabre"
|
|
desc = "An elegant weapon, its monomolecular edge is capable of cutting through flesh and bone with ease."
|
|
icon_state = "sabre"
|
|
inhand_icon_state = "sabre"
|
|
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
|
|
flags_1 = CONDUCT_1
|
|
obj_flags = UNIQUE_RENAME
|
|
force = 15
|
|
throwforce = 10
|
|
w_class = WEIGHT_CLASS_BULKY
|
|
block_chance = 50
|
|
armour_penetration = 75
|
|
sharpness = SHARP_EDGED
|
|
attack_verb_continuous = list("slashes", "cuts")
|
|
attack_verb_simple = list("slash", "cut")
|
|
hitsound = 'sound/weapons/rapierhit.ogg'
|
|
custom_materials = list(/datum/material/iron = 1000)
|
|
wound_bonus = 10
|
|
bare_wound_bonus = 25
|
|
|
|
/obj/item/melee/sabre/Initialize(mapload)
|
|
. = ..()
|
|
AddComponent(/datum/component/butchering, 30, 95, 5) //fast and effective, but as a sword, it might damage the results.
|
|
|
|
/obj/item/melee/sabre/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(attack_type == PROJECTILE_ATTACK)
|
|
final_block_chance = 0 //Don't bring a sword to a gunfight
|
|
return ..()
|
|
|
|
/obj/item/melee/sabre/on_exit_storage(datum/component/storage/concrete/S)
|
|
var/obj/item/storage/belt/sabre/B = S.real_location()
|
|
if(istype(B))
|
|
playsound(B, 'sound/items/unsheath.ogg', 25, TRUE)
|
|
|
|
/obj/item/melee/sabre/on_enter_storage(datum/component/storage/concrete/S)
|
|
var/obj/item/storage/belt/sabre/B = S.real_location()
|
|
if(istype(B))
|
|
playsound(B, 'sound/items/sheath.ogg', 25, TRUE)
|
|
|
|
/obj/item/melee/sabre/suicide_act(mob/living/user)
|
|
user.visible_message(span_suicide("[user] is trying to cut off all [user.p_their()] limbs with [src]! it looks like [user.p_theyre()] trying to commit suicide!"))
|
|
var/i = 0
|
|
ADD_TRAIT(src, TRAIT_NODROP, SABRE_SUICIDE_TRAIT)
|
|
if(iscarbon(user))
|
|
var/mob/living/carbon/Cuser = user
|
|
var/obj/item/bodypart/holding_bodypart = Cuser.get_holding_bodypart_of_item(src)
|
|
var/list/limbs_to_dismember
|
|
var/list/arms = list()
|
|
var/list/legs = list()
|
|
var/obj/item/bodypart/bodypart
|
|
|
|
for(bodypart in Cuser.bodyparts)
|
|
if(bodypart == holding_bodypart)
|
|
continue
|
|
if(bodypart.body_part & ARMS)
|
|
arms += bodypart
|
|
else if (bodypart.body_part & LEGS)
|
|
legs += bodypart
|
|
|
|
limbs_to_dismember = arms + legs
|
|
if(holding_bodypart)
|
|
limbs_to_dismember += holding_bodypart
|
|
|
|
var/speedbase = abs((4 SECONDS) / limbs_to_dismember.len)
|
|
for(bodypart in limbs_to_dismember)
|
|
i++
|
|
addtimer(CALLBACK(src, .proc/suicide_dismember, user, bodypart), speedbase * i)
|
|
addtimer(CALLBACK(src, .proc/manual_suicide, user), (5 SECONDS) * i)
|
|
return MANUAL_SUICIDE
|
|
|
|
/obj/item/melee/sabre/proc/suicide_dismember(mob/living/user, obj/item/bodypart/affecting)
|
|
if(!QDELETED(affecting) && affecting.dismemberable && affecting.owner == user && !QDELETED(user))
|
|
playsound(user, hitsound, 25, TRUE)
|
|
affecting.dismember(BRUTE)
|
|
user.adjustBruteLoss(20)
|
|
|
|
/obj/item/melee/sabre/proc/manual_suicide(mob/living/user, originally_nodropped)
|
|
if(!QDELETED(user))
|
|
user.adjustBruteLoss(200)
|
|
user.death(FALSE)
|
|
REMOVE_TRAIT(src, TRAIT_NODROP, SABRE_SUICIDE_TRAIT)
|
|
|
|
/obj/item/melee/beesword
|
|
name = "The Stinger"
|
|
desc = "Taken from a giant bee and folded over one thousand times in pure honey. Can sting through anything."
|
|
icon = 'icons/obj/items_and_weapons.dmi'
|
|
icon_state = "beesword"
|
|
inhand_icon_state = "stinger"
|
|
worn_icon_state = "stinger"
|
|
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
|
|
slot_flags = ITEM_SLOT_BELT
|
|
force = 5
|
|
w_class = WEIGHT_CLASS_BULKY
|
|
sharpness = SHARP_EDGED
|
|
throwforce = 10
|
|
block_chance = 20
|
|
armour_penetration = 65
|
|
attack_verb_continuous = list("slashes", "stings", "prickles", "pokes")
|
|
attack_verb_simple = list("slash", "sting", "prickle", "poke")
|
|
hitsound = 'sound/weapons/rapierhit.ogg'
|
|
|
|
/obj/item/melee/beesword/afterattack(atom/target, mob/user, proximity)
|
|
. = ..()
|
|
if(!proximity)
|
|
return
|
|
user.changeNext_move(CLICK_CD_RAPID)
|
|
if(iscarbon(target))
|
|
var/mob/living/carbon/H = target
|
|
H.reagents.add_reagent(/datum/reagent/toxin, 4)
|
|
|
|
/obj/item/melee/beesword/suicide_act(mob/living/user)
|
|
user.visible_message(span_suicide("[user] is stabbing [user.p_them()]self in the throat with [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
|
|
playsound(get_turf(src), hitsound, 75, TRUE, -1)
|
|
return TOXLOSS
|
|
|
|
/obj/item/melee/supermatter_sword
|
|
name = "supermatter sword"
|
|
desc = "In a station full of bad ideas, this might just be the worst."
|
|
icon = 'icons/obj/items_and_weapons.dmi'
|
|
icon_state = "supermatter_sword"
|
|
inhand_icon_state = "supermatter_sword"
|
|
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
|
|
slot_flags = null
|
|
w_class = WEIGHT_CLASS_BULKY
|
|
force = 0.001
|
|
armour_penetration = 1000
|
|
var/obj/machinery/power/supermatter_crystal/shard
|
|
var/balanced = 1
|
|
force_string = "INFINITE"
|
|
|
|
/obj/item/melee/supermatter_sword/Initialize(mapload)
|
|
. = ..()
|
|
shard = new /obj/machinery/power/supermatter_crystal(src)
|
|
qdel(shard.countdown)
|
|
shard.countdown = null
|
|
START_PROCESSING(SSobj, src)
|
|
visible_message(span_warning("[src] appears, balanced ever so perfectly on its hilt. This isn't ominous at all."))
|
|
|
|
/obj/item/melee/supermatter_sword/process()
|
|
if(balanced || throwing || ismob(src.loc) || isnull(src.loc))
|
|
return
|
|
if(!isturf(src.loc))
|
|
var/atom/target = src.loc
|
|
forceMove(target.loc)
|
|
consume_everything(target)
|
|
else
|
|
var/turf/T = get_turf(src)
|
|
if(!isspaceturf(T))
|
|
consume_turf(T)
|
|
|
|
/obj/item/melee/supermatter_sword/afterattack(target, mob/user, proximity_flag)
|
|
. = ..()
|
|
if(user && target == user)
|
|
user.dropItemToGround(src)
|
|
if(proximity_flag)
|
|
consume_everything(target)
|
|
|
|
/obj/item/melee/supermatter_sword/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
|
|
..()
|
|
if(ismob(hit_atom))
|
|
var/mob/M = hit_atom
|
|
if(src.loc == M)
|
|
M.dropItemToGround(src)
|
|
consume_everything(hit_atom)
|
|
|
|
/obj/item/melee/supermatter_sword/pickup(user)
|
|
..()
|
|
balanced = 0
|
|
|
|
/obj/item/melee/supermatter_sword/ex_act(severity, target)
|
|
visible_message(
|
|
span_danger("The blast wave smacks into [src] and rapidly flashes to ash."),
|
|
span_hear("You hear a loud crack as you are washed with a wave of heat.")
|
|
)
|
|
consume_everything()
|
|
|
|
/obj/item/melee/supermatter_sword/acid_act()
|
|
visible_message(span_danger("The acid smacks into [src] and rapidly flashes to ash."),\
|
|
span_hear("You hear a loud crack as you are washed with a wave of heat."))
|
|
consume_everything()
|
|
return TRUE
|
|
|
|
/obj/item/melee/supermatter_sword/bullet_act(obj/projectile/P)
|
|
visible_message(span_danger("[P] smacks into [src] and rapidly flashes to ash."),\
|
|
span_hear("You hear a loud crack as you are washed with a wave of heat."))
|
|
consume_everything(P)
|
|
return BULLET_ACT_HIT
|
|
|
|
/obj/item/melee/supermatter_sword/suicide_act(mob/user)
|
|
user.visible_message(span_suicide("[user] touches [src]'s blade. It looks like [user.p_theyre()] tired of waiting for the radiation to kill [user.p_them()]!"))
|
|
user.dropItemToGround(src, TRUE)
|
|
shard.Bumped(user)
|
|
|
|
/obj/item/melee/supermatter_sword/proc/consume_everything(target)
|
|
if(isnull(target))
|
|
shard.Consume()
|
|
else if(!isturf(target))
|
|
shard.Bumped(target)
|
|
else
|
|
consume_turf(target)
|
|
|
|
/obj/item/melee/supermatter_sword/proc/consume_turf(turf/T)
|
|
var/oldtype = T.type
|
|
var/turf/newT = T.ScrapeAway(flags = CHANGETURF_INHERIT_AIR)
|
|
if(newT.type == oldtype)
|
|
return
|
|
playsound(T, 'sound/effects/supermatter.ogg', 50, TRUE)
|
|
T.visible_message(span_danger("[T] smacks into [src] and rapidly flashes to ash."),\
|
|
span_hear("You hear a loud crack as you are washed with a wave of heat."))
|
|
shard.Consume()
|
|
|
|
/obj/item/melee/supermatter_sword/add_blood_DNA(list/blood_dna)
|
|
return FALSE
|
|
|
|
/obj/item/melee/curator_whip
|
|
name = "curator's whip"
|
|
desc = "Somewhat eccentric and outdated, it still stings like hell to be hit by."
|
|
icon_state = "whip"
|
|
inhand_icon_state = "chain"
|
|
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
|
|
worn_icon_state = "whip"
|
|
slot_flags = ITEM_SLOT_BELT
|
|
force = 15
|
|
w_class = WEIGHT_CLASS_NORMAL
|
|
attack_verb_continuous = list("flogs", "whips", "lashes", "disciplines")
|
|
attack_verb_simple = list("flog", "whip", "lash", "discipline")
|
|
hitsound = 'sound/weapons/whip.ogg'
|
|
|
|
/obj/item/melee/curator_whip/afterattack(target, mob/user, proximity_flag)
|
|
. = ..()
|
|
if(ishuman(target) && proximity_flag)
|
|
var/mob/living/carbon/human/H = target
|
|
H.drop_all_held_items()
|
|
H.visible_message(span_danger("[user] disarms [H]!"), span_userdanger("[user] disarmed you!"))
|
|
|
|
/obj/item/melee/roastingstick
|
|
name = "advanced roasting stick"
|
|
desc = "A telescopic roasting stick with a miniature shield generator designed to ensure entry into various high-tech shielded cooking ovens and firepits."
|
|
icon_state = "roastingstick"
|
|
inhand_icon_state = null
|
|
worn_icon_state = "tele_baton"
|
|
slot_flags = ITEM_SLOT_BELT
|
|
w_class = WEIGHT_CLASS_SMALL
|
|
item_flags = NONE
|
|
force = 0
|
|
attack_verb_continuous = list("hits", "pokes")
|
|
attack_verb_simple = list("hit", "poke")
|
|
/// The sausage attatched to our stick.
|
|
var/obj/item/food/sausage/held_sausage
|
|
/// Static list of things our roasting stick can interact with.
|
|
var/static/list/ovens
|
|
/// The beam that links to the oven we use
|
|
var/datum/beam/beam
|
|
/// Whether or stick is extended and can recieve sausage
|
|
var/extended = FALSE
|
|
|
|
/obj/item/melee/roastingstick/Initialize(mapload)
|
|
. = ..()
|
|
if (!ovens)
|
|
ovens = typecacheof(list(/obj/singularity, /obj/energy_ball, /obj/machinery/power/supermatter_crystal, /obj/structure/bonfire))
|
|
AddComponent(/datum/component/transforming, \
|
|
hitsound_on = hitsound, \
|
|
clumsy_check = FALSE)
|
|
RegisterSignal(src, COMSIG_TRANSFORMING_PRE_TRANSFORM, .proc/attempt_transform)
|
|
RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, .proc/on_transform)
|
|
|
|
/*
|
|
* Signal proc for [COMSIG_TRANSFORMING_PRE_TRANSFORM].
|
|
*
|
|
* If there is a sausage attached, returns COMPONENT_BLOCK_TRANSFORM.
|
|
*/
|
|
/obj/item/melee/roastingstick/proc/attempt_transform(obj/item/source, mob/user, active)
|
|
SIGNAL_HANDLER
|
|
|
|
if(held_sausage)
|
|
to_chat(user, span_warning("You can't retract [src] while [held_sausage] is attached!"))
|
|
return COMPONENT_BLOCK_TRANSFORM
|
|
|
|
/*
|
|
* Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM].
|
|
*
|
|
* Gives feedback on stick extension.
|
|
*/
|
|
/obj/item/melee/roastingstick/proc/on_transform(obj/item/source, mob/user, active)
|
|
SIGNAL_HANDLER
|
|
|
|
extended = active
|
|
inhand_icon_state = active ? "nullrod" : null
|
|
balloon_alert(user, "[active ? "extended" : "collapsed"] [src]")
|
|
playsound(user ? user : src, 'sound/weapons/batonextend.ogg', 50, TRUE)
|
|
return COMPONENT_NO_DEFAULT_MESSAGE
|
|
|
|
/obj/item/melee/roastingstick/attackby(atom/target, mob/user)
|
|
..()
|
|
if (istype(target, /obj/item/food/sausage))
|
|
if (!extended)
|
|
to_chat(user, span_warning("You must extend [src] to attach anything to it!"))
|
|
return
|
|
if (held_sausage)
|
|
to_chat(user, span_warning("[held_sausage] is already attached to [src]!"))
|
|
return
|
|
if (user.transferItemToLoc(target, src))
|
|
held_sausage = target
|
|
else
|
|
to_chat(user, span_warning("[target] doesn't seem to want to get on [src]!"))
|
|
update_appearance()
|
|
|
|
/obj/item/melee/roastingstick/attack_hand(mob/user, list/modifiers)
|
|
..()
|
|
if (held_sausage)
|
|
user.put_in_hands(held_sausage)
|
|
held_sausage = null
|
|
update_appearance()
|
|
|
|
/obj/item/melee/roastingstick/update_overlays()
|
|
. = ..()
|
|
if(held_sausage)
|
|
. += mutable_appearance(icon, "roastingstick_sausage")
|
|
|
|
/obj/item/melee/roastingstick/handle_atom_del(atom/target)
|
|
if (target == held_sausage)
|
|
held_sausage = null
|
|
update_appearance()
|
|
|
|
/obj/item/melee/roastingstick/afterattack(atom/target, mob/user, proximity)
|
|
. = ..()
|
|
if (!extended)
|
|
return
|
|
if (is_type_in_typecache(target, ovens))
|
|
if (istype(target, /obj/singularity) && get_dist(user, target) < 10)
|
|
to_chat(user, span_notice("You send [held_sausage] towards [target]."))
|
|
playsound(src, 'sound/items/rped.ogg', 50, TRUE)
|
|
beam = user.Beam(target,icon_state="rped_upgrade", time = 10 SECONDS)
|
|
else if (user.Adjacent(target))
|
|
to_chat(user, span_notice("You extend [src] towards [target]."))
|
|
playsound(src.loc, 'sound/weapons/batonextend.ogg', 50, TRUE)
|
|
finish_roasting(user, target)
|
|
return
|
|
else
|
|
return
|
|
finish_roasting(user, target)
|
|
|
|
/obj/item/melee/roastingstick/proc/finish_roasting(user, atom/target)
|
|
if(do_after(user, 100, target = user))
|
|
to_chat(user, span_notice("You finish roasting [held_sausage]."))
|
|
playsound(src,'sound/items/welder2.ogg',50,TRUE)
|
|
held_sausage.add_atom_colour(rgb(103,63,24), FIXED_COLOUR_PRIORITY)
|
|
held_sausage.name = "[target.name]-roasted [held_sausage.name]"
|
|
held_sausage.desc = "[held_sausage.desc] It has been cooked to perfection on \a [target]."
|
|
update_appearance()
|
|
else
|
|
QDEL_NULL(beam)
|
|
playsound(src, 'sound/weapons/batonextend.ogg', 50, TRUE)
|
|
to_chat(user, span_notice("You put [src] away."))
|
|
|
|
/obj/item/melee/cleric_mace
|
|
name = "cleric mace"
|
|
desc = "The grandson of the club, yet the grandfather of the baseball bat. Most notably used by holy orders in days past."
|
|
icon = 'icons/obj/items/cleric_mace.dmi'
|
|
icon_state = "default"
|
|
inhand_icon_state = "default"
|
|
worn_icon_state = "default_worn"
|
|
|
|
greyscale_config = /datum/greyscale_config/cleric_mace
|
|
greyscale_config_inhand_left = /datum/greyscale_config/cleric_mace_lefthand
|
|
greyscale_config_inhand_right = /datum/greyscale_config/cleric_mace_righthand
|
|
greyscale_config_worn = /datum/greyscale_config/cleric_mace
|
|
greyscale_colors = "#FFFFFF"
|
|
|
|
material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_GREYSCALE | MATERIAL_AFFECT_STATISTICS //Material type changes the prefix as well as the color.
|
|
custom_materials = list(/datum/material/iron = 12000) //Defaults to an Iron Mace.
|
|
slot_flags = ITEM_SLOT_BELT
|
|
force = 14
|
|
w_class = WEIGHT_CLASS_BULKY
|
|
throwforce = 8
|
|
block_chance = 10
|
|
armour_penetration = 50
|
|
attack_verb_continuous = list("smacks", "strikes", "cracks", "beats")
|
|
attack_verb_simple = list("smack", "strike", "crack", "beat")
|