mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-27 17:41:50 +00:00
## About The Pull Request Adds 2 new species: Spirits and Ghosts Spirits are available roundstart during Halloween, Wabbajack and Xenobio's black slime extract Ghosts are available through Magic mirrors They fly around, and don't have legs and instead float around. They also can't get legs implanted onto themselves. They also do have organs, so they are affected by flashbangs, they do get hungry, they do need oxygen to survive (they don't take damage in space but they do suffocate & get slowdown), and can process chems. Gibbing a ghost gives ectoplasm, an ingredient for ghost burgers. Chaplains also got a buff here, null rod-type weapons' bane is now against Spirit mobs, rather than hardcoded revenants. This means it now includes Spirits/Ghosts, but also Soulscythes & Cult shades. Also re-adds https://github.com/tgstation/tgstation/pull/81630 which was reverted in https://github.com/tgstation/tgstation/pull/86506 which I assume was accidental. ### The difference between Spirits and Ghosts Ghosts have an innate ability to become incorporeal, which allows them to phase through walls and stuff. Using this will immediately make them drop any non-ghost limb/organ (not implants cause I thought it would be funny). This ability is not available if they have holy water in their system, and like revenants they also can't walk over blessed tiles with it. They are also invisible to cameras while using this (not the obscura though). Sprites taken from observers directly, if anyone wants to make custom sprites for them feel free. If anyone wants to make this obtainable somehow in-game as well I wouldn't be opposed, halloween is just where I thought it would fit most. This also adds a lot of fixes that I encountered trying to add this, from systems that have been neglected throughout the years. https://github.com/user-attachments/assets/e368d710-80a0-4c63-b271-1abe3dd41a5e ## Why It's Good For The Game We haven't gotten a new halloween species in a long time and thought it would be fun if you can play as an actual ghost, the soul that remains after a person passes, so Halloween feels more haunted. It's overall made in just good fun, with a bonus that Ghosts are a cool species to play with as well for Wizards & maybe Chaplains in the future (Dead sect when?) ## Changelog 🆑 add: Added a new halloween species: Spirits, a species without legs and instead floats. add: Added a new magic mirror species: Ghosts, like spirits but with the ability to become incorporeal, traversing through solid wall. fix: Mobs unable to use storage items now can't use storage items. fix: Mobs unable to use items can now not open airlocks & closets fix: Mobs unable to pick items up can no longer pick items up and immediately drop, moving one tile at a time. fix: Mobs with intentional missing limbs (Alien larva) no longer show their limbs as missing on examine (again) fix: Golems' pref page had a missing icon, it now has one. /🆑 --------- Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com>
380 lines
14 KiB
Plaintext
380 lines
14 KiB
Plaintext
/*****************Pickaxes & Drills & Shovels****************/
|
|
/obj/item/pickaxe
|
|
name = "pickaxe"
|
|
icon = 'icons/obj/mining.dmi'
|
|
icon_state = "pickaxe"
|
|
inhand_icon_state = "pickaxe"
|
|
icon_angle = -45
|
|
obj_flags = CONDUCTS_ELECTRICITY
|
|
slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK
|
|
force = 15
|
|
throwforce = 10
|
|
demolition_mod = 1.15
|
|
lefthand_file = 'icons/mob/inhands/equipment/mining_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi'
|
|
w_class = WEIGHT_CLASS_BULKY
|
|
custom_materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT)
|
|
tool_behaviour = TOOL_MINING
|
|
toolspeed = 1
|
|
usesound = list('sound/effects/pickaxe/picaxe1.ogg', 'sound/effects/pickaxe/picaxe2.ogg', 'sound/effects/pickaxe/picaxe3.ogg')
|
|
attack_verb_continuous = list("hits", "pierces", "slices", "attacks")
|
|
attack_verb_simple = list("hit", "pierce", "slice", "attack")
|
|
|
|
/obj/item/pickaxe/suicide_act(mob/living/user)
|
|
user.visible_message(span_suicide("[user] begins digging into [user.p_their()] chest! It looks like [user.p_theyre()] trying to commit suicide!"))
|
|
if(use_tool(user, user, 30, volume=50))
|
|
return BRUTELOSS
|
|
user.visible_message(span_suicide("[user] couldn't do it!"))
|
|
return SHAME
|
|
|
|
/obj/item/pickaxe/rusted
|
|
name = "rusty pickaxe"
|
|
desc = "A pickaxe that's been left to rust."
|
|
attack_verb_continuous = list("ineffectively hits")
|
|
attack_verb_simple = list("ineffectively hit")
|
|
force = 1
|
|
throwforce = 1
|
|
|
|
/obj/item/pickaxe/mini
|
|
name = "compact pickaxe"
|
|
desc = "A smaller, compact version of the standard pickaxe."
|
|
icon_state = "minipick"
|
|
worn_icon_state = "pickaxe"
|
|
force = 10
|
|
throwforce = 7
|
|
slot_flags = ITEM_SLOT_BELT
|
|
w_class = WEIGHT_CLASS_NORMAL
|
|
custom_materials = list(/datum/material/iron=HALF_SHEET_MATERIAL_AMOUNT)
|
|
|
|
/obj/item/pickaxe/silver
|
|
name = "silver-plated pickaxe"
|
|
icon_state = "spickaxe"
|
|
inhand_icon_state = "spickaxe"
|
|
toolspeed = 0.5 //mines faster than a normal pickaxe, bought from mining vendor
|
|
desc = "A silver-plated pickaxe that mines slightly faster than standard-issue."
|
|
force = 17
|
|
|
|
/obj/item/pickaxe/diamond
|
|
name = "diamond-tipped pickaxe"
|
|
icon_state = "dpickaxe"
|
|
inhand_icon_state = "dpickaxe"
|
|
toolspeed = 0.3
|
|
desc = "A pickaxe with a diamond pick head. Extremely robust at cracking rock walls and digging up dirt."
|
|
force = 19
|
|
|
|
/obj/item/pickaxe/drill
|
|
name = "mining drill"
|
|
icon_state = "handdrill"
|
|
inhand_icon_state = "handdrill"
|
|
icon_angle = 0
|
|
slot_flags = ITEM_SLOT_BELT
|
|
toolspeed = 0.6 //available from roundstart, faster than a pickaxe.
|
|
usesound = 'sound/items/weapons/drill.ogg'
|
|
hitsound = 'sound/items/weapons/drill.ogg'
|
|
desc = "An electric mining drill for the especially scrawny."
|
|
|
|
/obj/item/pickaxe/drill/diamonddrill
|
|
name = "diamond-tipped mining drill"
|
|
icon_state = "diamonddrill"
|
|
inhand_icon_state = "diamonddrill"
|
|
toolspeed = 0.2
|
|
desc = "Yours is the drill that will pierce the heavens!"
|
|
|
|
/obj/item/pickaxe/drill/jackhammer
|
|
name = "sonic jackhammer"
|
|
icon_state = "jackhammer"
|
|
inhand_icon_state = "jackhammer"
|
|
toolspeed = 0.1 //the epitome of powertools. extremely fast mining
|
|
usesound = 'sound/items/weapons/sonic_jackhammer.ogg'
|
|
hitsound = 'sound/items/weapons/sonic_jackhammer.ogg'
|
|
desc = "Cracks rocks with sonic blasts."
|
|
|
|
/obj/item/pickaxe/improvised
|
|
name = "improvised pickaxe"
|
|
desc = "A pickaxe made with a knife and crowbar taped together, how does it not break?"
|
|
icon_state = "ipickaxe"
|
|
inhand_icon_state = "ipickaxe"
|
|
worn_icon_state = "pickaxe"
|
|
force = 10
|
|
throwforce = 7
|
|
toolspeed = 3 //3 times slower than a normal pickaxe
|
|
slot_flags = ITEM_SLOT_BELT
|
|
w_class = WEIGHT_CLASS_NORMAL
|
|
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*6) //This number used to be insane and I'm just going to save your sanity and not tell you what it was.
|
|
|
|
/obj/item/shovel
|
|
name = "shovel"
|
|
desc = "A large tool for digging and moving dirt."
|
|
icon = 'icons/obj/mining.dmi'
|
|
icon_state = "shovel"
|
|
inhand_icon_state = "shovel"
|
|
icon_angle = 135
|
|
lefthand_file = 'icons/mob/inhands/equipment/mining_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi'
|
|
obj_flags = CONDUCTS_ELECTRICITY
|
|
slot_flags = ITEM_SLOT_BELT
|
|
force = 8
|
|
throwforce = 4
|
|
tool_behaviour = TOOL_SHOVEL
|
|
toolspeed = 1
|
|
usesound = 'sound/effects/shovel_dig.ogg'
|
|
w_class = WEIGHT_CLASS_NORMAL
|
|
custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*0.5)
|
|
attack_verb_continuous = list("bashes", "bludgeons", "thrashes", "whacks")
|
|
attack_verb_simple = list("bash", "bludgeon", "thrash", "whack")
|
|
sharpness = SHARP_EDGED
|
|
|
|
/obj/item/shovel/Initialize(mapload)
|
|
. = ..()
|
|
AddComponent(/datum/component/butchering, \
|
|
speed = 15 SECONDS, \
|
|
effectiveness = 40, \
|
|
)
|
|
//it's sharp, so it works, but barely.
|
|
AddElement(/datum/element/gravedigger)
|
|
|
|
/obj/item/shovel/suicide_act(mob/living/user)
|
|
user.visible_message(span_suicide("[user] begins digging their own grave! It looks like [user.p_theyre()] trying to commit suicide!"))
|
|
if(use_tool(user, user, 30, volume=50))
|
|
return BRUTELOSS
|
|
user.visible_message(span_suicide("[user] couldn't do it!"))
|
|
return SHAME
|
|
|
|
/obj/item/shovel/spade
|
|
name = "spade"
|
|
desc = "A small tool for digging and moving dirt."
|
|
icon_state = "spade"
|
|
inhand_icon_state = "spade"
|
|
icon_angle = -135
|
|
lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi'
|
|
force = 5
|
|
throwforce = 7
|
|
w_class = WEIGHT_CLASS_SMALL
|
|
|
|
/obj/item/shovel/spade/cyborg
|
|
name = "cyborg spade"
|
|
icon = 'icons/obj/items_cyborg.dmi'
|
|
icon_state = "sili_shovel"
|
|
icon_angle = 0
|
|
toolspeed = 0.6
|
|
worn_icon_state = null
|
|
|
|
/obj/item/shovel/serrated
|
|
name = "serrated bone shovel"
|
|
desc = "A wicked tool that cleaves through dirt just as easily as it does flesh. The design was styled after ancient lavaland tribal designs. \
|
|
It seems less capable of harming inorganic creatures. Who knows why."
|
|
icon_state = "shovel_bone"
|
|
worn_icon_state = "shovel_serr"
|
|
lefthand_file = 'icons/mob/inhands/equipment/mining_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi'
|
|
force = 10
|
|
throwforce = 12
|
|
w_class = WEIGHT_CLASS_NORMAL
|
|
tool_behaviour = TOOL_SHOVEL // hey, it's serrated.
|
|
toolspeed = 0.3
|
|
attack_verb_continuous = list("slashes", "impales", "stabs", "slices")
|
|
attack_verb_simple = list("slash", "impale", "stab", "slice")
|
|
sharpness = SHARP_EDGED
|
|
item_flags = CRUEL_IMPLEMENT
|
|
|
|
/obj/item/shovel/serrated/Initialize(mapload)
|
|
. = ..()
|
|
AddElement(/datum/element/bane, mob_biotypes = MOB_ORGANIC, damage_multiplier = 1) //You may be horridly cursed now, but at least you kill the living a whole lot more easily!
|
|
|
|
/obj/item/shovel/serrated/examine(mob/user)
|
|
. = ..()
|
|
if( !(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID)) )
|
|
return
|
|
. += span_deadsay("You feel an intense, strange craving to 'dig' straight through living flesh with this shovel. Why else would it be serrated? The thought is mesmerizing...")
|
|
|
|
// Coroner mail version
|
|
/obj/item/shovel/serrated/dull
|
|
name = "dull bone shovel"
|
|
desc = "An ancient, dull bone shovel with a strange design and markings. Visually, it seems pretty weak, but you get the feeling there's more to it than meets the eye..."
|
|
force = 8
|
|
throwforce = 10
|
|
toolspeed = 0.8
|
|
|
|
/obj/item/trench_tool
|
|
name = "entrenching tool"
|
|
desc = "The multi-purpose tool you always needed."
|
|
icon = 'icons/obj/mining.dmi'
|
|
icon_state = "trench_tool"
|
|
inhand_icon_state = "trench_tool"
|
|
icon_angle = -45
|
|
lefthand_file = 'icons/mob/inhands/equipment/mining_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi'
|
|
obj_flags = CONDUCTS_ELECTRICITY
|
|
force = 15
|
|
throwforce = 6
|
|
w_class = WEIGHT_CLASS_SMALL
|
|
tool_behaviour = TOOL_WRENCH
|
|
toolspeed = 0.75
|
|
usesound = 'sound/items/tools/ratchet.ogg'
|
|
attack_verb_continuous = list("bashes", "bludgeons", "thrashes", "whacks")
|
|
attack_verb_simple = list("bash", "bludgeon", "thrash", "whack")
|
|
wound_bonus = 10
|
|
|
|
/obj/item/trench_tool/get_all_tool_behaviours()
|
|
return list(TOOL_MINING, TOOL_SHOVEL, TOOL_WRENCH)
|
|
|
|
/obj/item/trench_tool/Initialize(mapload)
|
|
. = ..()
|
|
AddElement(/datum/element/update_icon_updates_onmob)
|
|
AddElement(/datum/element/gravedigger)
|
|
|
|
/obj/item/trench_tool/examine(mob/user)
|
|
. = ..()
|
|
. += span_notice("Use in hand to switch configuration.")
|
|
. += span_notice("It functions as a [tool_behaviour] tool.")
|
|
. += span_danger("<i>This weapon has no random critical hits.</i>")
|
|
|
|
/obj/item/trench_tool/update_icon_state()
|
|
. = ..()
|
|
switch(tool_behaviour)
|
|
if(TOOL_WRENCH)
|
|
icon_state = inhand_icon_state = initial(icon_state)
|
|
if(TOOL_SHOVEL)
|
|
icon_state = inhand_icon_state = "[initial(icon_state)]_shovel"
|
|
if(TOOL_MINING)
|
|
icon_state = inhand_icon_state = "[initial(icon_state)]_pick"
|
|
|
|
/obj/item/trench_tool/attack_self(mob/user, modifiers)
|
|
. = ..()
|
|
if(!user)
|
|
return
|
|
var/list/tool_list = list(
|
|
"Wrench" = image(icon = icon, icon_state = "trench_tool"),
|
|
"Shovel" = image(icon = icon, icon_state = "trench_tool_shovel"),
|
|
"Pick" = image(icon = icon, icon_state = "trench_tool_pick"),
|
|
)
|
|
var/tool_result = show_radial_menu(user, src, tool_list, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE)
|
|
if(!check_menu(user) || !tool_result)
|
|
return
|
|
switch(tool_result)
|
|
if("Wrench")
|
|
tool_behaviour = TOOL_WRENCH
|
|
sharpness = NONE
|
|
toolspeed = 0.75
|
|
update_weight_class(WEIGHT_CLASS_SMALL)
|
|
usesound = 'sound/items/tools/ratchet.ogg'
|
|
attack_verb_continuous = list("bashes", "bludgeons", "thrashes", "whacks")
|
|
attack_verb_simple = list("bash", "bludgeon", "thrash", "whack")
|
|
if("Shovel")
|
|
tool_behaviour = TOOL_SHOVEL
|
|
sharpness = SHARP_EDGED
|
|
toolspeed = 0.25
|
|
update_weight_class(WEIGHT_CLASS_NORMAL)
|
|
usesound = 'sound/effects/shovel_dig.ogg'
|
|
attack_verb_continuous = list("slashes", "impales", "stabs", "slices")
|
|
attack_verb_simple = list("slash", "impale", "stab", "slice")
|
|
if("Pick")
|
|
tool_behaviour = TOOL_MINING
|
|
sharpness = SHARP_POINTY
|
|
toolspeed = 0.5
|
|
update_weight_class(WEIGHT_CLASS_NORMAL)
|
|
usesound = 'sound/effects/pickaxe/picaxe1.ogg'
|
|
attack_verb_continuous = list("hits", "pierces", "slices", "attacks")
|
|
attack_verb_simple = list("hit", "pierce", "slice", "attack")
|
|
playsound(src, 'sound/items/tools/ratchet.ogg', 50, vary = TRUE)
|
|
update_appearance(UPDATE_ICON)
|
|
|
|
/obj/item/trench_tool/proc/check_menu(mob/user)
|
|
if(!istype(user))
|
|
return FALSE
|
|
if(user.incapacitated || !user.Adjacent(src))
|
|
return FALSE
|
|
return TRUE
|
|
|
|
/obj/item/shovel/giant_wrench
|
|
name = "Big Slappy"
|
|
desc = "A gigantic wrench made illegal because of its many incidents involving this tool."
|
|
icon_state = "giant_wrench"
|
|
icon = 'icons/obj/weapons/giant_wrench.dmi'
|
|
icon_angle = 0
|
|
inhand_icon_state = null
|
|
lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/64x64_righthand.dmi'
|
|
inhand_x_dimension = 64
|
|
inhand_y_dimension = 64
|
|
w_class = WEIGHT_CLASS_HUGE
|
|
slot_flags = NONE
|
|
toolspeed = 0.1
|
|
force = 30
|
|
throwforce = 20
|
|
block_chance = 30
|
|
throw_range = 2
|
|
demolition_mod = 2
|
|
armor_type = /datum/armor/giant_wrench
|
|
resistance_flags = FIRE_PROOF
|
|
wound_bonus = -10
|
|
attack_verb_continuous = list("bonks", "bludgeons", "pounds")
|
|
attack_verb_simple = list("bonk", "bludgeon", "pound")
|
|
drop_sound = 'sound/items/weapons/sonic_jackhammer.ogg'
|
|
pickup_sound = 'sound/items/handling/tools/crowbar_pickup.ogg'
|
|
hitsound = 'sound/items/weapons/sonic_jackhammer.ogg'
|
|
block_sound = 'sound/items/weapons/sonic_jackhammer.ogg'
|
|
item_flags = SLOWS_WHILE_IN_HAND | IMMUTABLE_SLOW
|
|
slowdown = 3
|
|
attack_speed = 1.2 SECONDS
|
|
/// The factor at which the recoil becomes less.
|
|
var/recoil_factor = 3
|
|
/// Wether we knock down and launch away out enemies when we attack.
|
|
var/do_launch = TRUE
|
|
|
|
/obj/item/shovel/giant_wrench/get_all_tool_behaviours()
|
|
return list(TOOL_SHOVEL, TOOL_WRENCH)
|
|
|
|
/datum/armor/giant_wrench
|
|
acid = 30
|
|
bomb = 100
|
|
bullet = 30
|
|
fire = 100
|
|
laser = 30
|
|
melee = 30
|
|
|
|
/obj/item/shovel/giant_wrench/Initialize(mapload)
|
|
. = ..()
|
|
transform = transform.Translate(-16, -16)
|
|
AddComponent(/datum/component/two_handed, require_twohands=TRUE)
|
|
AddComponent( \
|
|
/datum/component/transforming, \
|
|
force_on = 40, \
|
|
throwforce_on = throwforce, \
|
|
hitsound_on = hitsound, \
|
|
w_class_on = w_class, \
|
|
sharpness_on = SHARP_POINTY, \
|
|
clumsy_check = TRUE, \
|
|
inhand_icon_change = TRUE, \
|
|
)
|
|
RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform))
|
|
|
|
/// Used when the tool is transformed through the transforming component.
|
|
/obj/item/shovel/giant_wrench/proc/on_transform(obj/item/source, mob/user, active)
|
|
SIGNAL_HANDLER
|
|
|
|
usesound = (active ? 'sound/items/tools/ratchet.ogg' : initial(usesound))
|
|
block_chance = (active ? 0 : initial(block_chance))
|
|
recoil_factor = (active ? 2 : initial(recoil_factor))
|
|
do_launch = (active ? FALSE : initial(do_launch))
|
|
tool_behaviour = (active ? TOOL_WRENCH : initial(tool_behaviour))
|
|
armour_penetration = (active ? 30 : initial(armour_penetration))
|
|
if(user)
|
|
balloon_alert(user, "folded Big Slappy [active ? "open" : "closed"]")
|
|
playsound(src, 'sound/items/tools/ratchet.ogg', 50, TRUE)
|
|
return COMPONENT_NO_DEFAULT_MESSAGE
|
|
|
|
/obj/item/shovel/giant_wrench/attack(mob/living/target_mob, mob/living/user)
|
|
..()
|
|
if(QDELETED(target_mob))
|
|
return
|
|
if(do_launch)
|
|
var/atom/throw_target = get_edge_target_turf(target_mob, get_dir(user, get_step_away(target_mob, user)))
|
|
target_mob.throw_at(throw_target, 2, 2, user, gentle = TRUE)
|
|
target_mob.Knockdown(2 SECONDS)
|
|
var/body_zone = pick(user.get_all_limbs())
|
|
user.apply_damage(force / recoil_factor, BRUTE, body_zone, user.run_armor_check(body_zone, MELEE))
|
|
to_chat(user, span_danger("The weight of the Big Slappy recoils!"))
|
|
log_combat(user, user, "recoiled Big Slappy into")
|