Files
30fbcfe9b4 Belts & Trashbags (#7443)
requires #6644 

Entirely replaces how (most) belts perform insertion checks.

This pretty much allows belts to hold most things.

Armor vests are next.

Trashbags will also use the systems we use on main.

Closes #7256 and #7435

---------

Co-authored-by: silicons <silicons@silicons.dev>
2025-12-28 22:05:06 -05:00

430 lines
13 KiB
Plaintext

/******************************Lantern*******************************/
/obj/item/flashlight/lantern
name = "lantern"
icon_state = "lantern"
desc = "A mining lantern."
brightness_on = 6 // luminosity when on
light_color = "#ff9933" // A slight yellow/orange color.
light_wedge = LIGHT_OMNI
worth_intrinsic = 45
/*****************************Pickaxe********************************/
/obj/item/pickaxe
name = "mining drill"
desc = "The most basic of mining drills, for short excavations and small mineral extractions."
icon = 'icons/obj/items.dmi'
slot_flags = SLOT_BELT
damage_force = 15.0
throw_force = 4.0
icon_state = "pickaxe"
item_state = "jackhammer"
w_class = WEIGHT_CLASS_BULKY
materials_base = list(MAT_STEEL = 3750)
worth_intrinsic = 75
suit_storage_class = SUIT_STORAGE_CLASS_HARDWEAR
belt_storage_class = BELT_CLASS_LARGE
var/digspeed = 40 //moving the delay to an item var so R&D can make improved picks. --NEO
var/sand_dig = FALSE
origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1)
attack_verb = list("hit", "pierced", "sliced", "attacked")
var/drill_sound = 'sound/weapons/Genhit.ogg'
var/drill_verb = "drilling"
damage_mode = DAMAGE_MODE_SHARP
var/active = 1
var/excavation_amount = 200
var/destroy_artefacts = FALSE // some mining tools will destroy artefacts completely while avoiding side-effects.
/obj/item/pickaxe/bone
name = "bone pickaxe"
icon_state = "bpickaxe"
item_state = "bpickaxe"
digspeed = 30
origin_tech = list(TECH_MATERIAL = 1)
desc = "A sturdy pick fashioned from some animal's bone, wound with powerful sinew."
/obj/item/pickaxe/bronze
name = "bronze pickaxe"
icon_state = "brpickaxe"
item_state = "brpickaxe"
digspeed = 30
origin_tech = list(TECH_MATERIAL = 1)
desc = "A primitive pickaxe made of bronze, and a handle of bone."
/obj/item/pickaxe/silver
name = "silver pickaxe"
icon_state = "spickaxe"
item_state = "spickaxe"
digspeed = 30
origin_tech = list(TECH_MATERIAL = 3)
desc = "This makes no metallurgic sense."
/obj/item/pickaxe/drill
name = "advanced mining drill" // Can dig sand as well!
icon_state = "handdrill"
item_state = "jackhammer"
digspeed = 30
origin_tech = list(TECH_MATERIAL = 2, TECH_POWER = 3, TECH_ENGINEERING = 2)
desc = "Yours is the drill that will pierce through the rock walls."
drill_verb = "drilling"
sand_dig = TRUE
worth_intrinsic = 125
/obj/item/pickaxe/jackhammer
name = "sonic jackhammer"
icon_state = "jackhammer"
item_state = "jackhammer"
digspeed = 20 //faster than drill, but cannot dig
origin_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2)
desc = "Cracks rocks with sonic blasts, perfect for killing cave lizards."
drill_verb = "hammering"
worth_intrinsic = 250
/obj/item/pickaxe/gold
name = "golden pickaxe"
icon_state = "gpickaxe"
item_state = "gpickaxe"
digspeed = 20
origin_tech = list(TECH_MATERIAL = 4)
desc = "This makes no metallurgic sense."
drill_verb = "picking"
/obj/item/pickaxe/plasmacutter
name = "plasma cutter"
icon_state = "plasmacutter"
item_state = "gun"
w_class = WEIGHT_CLASS_NORMAL //it is smaller than the pickaxe
damage_type = DAMAGE_TYPE_BURN
digspeed = 20 //Can slice though normal walls, all girders, or be used in reinforced wall deconstruction/ light thermite on fire
origin_tech = list(TECH_MATERIAL = 4, TECH_PHORON = 3, TECH_ENGINEERING = 3)
desc = "A rock cutter that uses bursts of hot plasma. You could use it to cut limbs off of xenos! Or, you know, mine stuff."
drill_verb = "cutting"
drill_sound = 'sound/items/Welder.ogg'
damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE
worth_intrinsic = 175
/obj/item/pickaxe/diamond
name = "diamond pickaxe"
icon_state = "dpickaxe"
item_state = "dpickaxe"
digspeed = 10
origin_tech = list(TECH_MATERIAL = 6, TECH_ENGINEERING = 4)
desc = "A pickaxe with a diamond pick head."
drill_verb = "picking"
/obj/item/pickaxe/diamonddrill // When people ask about the badass leader of the mining tools, they are talking about ME!
name = "diamond mining drill"
icon_state = "diamonddrill"
item_state = "jackhammer"
digspeed = 5 //Digs through walls, girders, and can dig up sand
origin_tech = list(TECH_MATERIAL = 6, TECH_POWER = 4, TECH_ENGINEERING = 5)
desc = "Yours is the drill that will pierce the heavens!"
drill_verb = "drilling"
sand_dig = TRUE
worth_intrinsic = 350
/obj/item/pickaxe/borgdrill
name = "enhanced sonic jackhammer"
icon_state = "jackhammer"
item_state = "jackhammer"
digspeed = 15
desc = "Cracks rocks with sonic blasts. This one seems like an improved design."
drill_verb = "hammering"
sand_dig = TRUE
/obj/item/pickaxe/icepick //Cannot actually lobotomize people. Yet.
name = "icepick"
desc = "A simple icepick, for all your digging, climbing, and lobotomizing needs."
slot_flags = SLOT_BELT
damage_force = 12
throw_force = 15 //Discount shuriken.
icon_state = "icepick"
item_state = "spickaxe" //im lazy fuck u
w_class = WEIGHT_CLASS_SMALL
materials_base = list(MAT_STEEL = 2750, MAT_TITANIUM = 2000)
digspeed = 25 //More expensive than a diamond pick, a lot smaller but decently slower.
origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1)
attack_verb = list("mined", "pierced", "stabbed", "attacked")
drill_verb = "picking"
worth_intrinsic = 75
//Snowflake drill that works like a chainsaw! How fun. Honestly they should probably all work like this or something. I dunno. Might be a fun mining overhaul later.
/obj/item/pickaxe/tyrmalin
name = "\improper Tyrmalin excavator"
desc = "A mining drill built from scrap parts, often found on Tyrmalin mining operations. No two are alike."
icon_state = "goblindrill"
item_state = "goblindrill"
digspeed = 25
destroy_artefacts = TRUE
var/max_fuel = 100
active = 0
var/jam_chance = 15
worth_intrinsic = 75
/obj/item/pickaxe/tyrmalin/Initialize(mapload)
. = ..()
digspeed = rand(10, 50) // let's go gambling!
if (digspeed > 25)
desc += pick(" This one has a cracked engine block...",
" Seems like it got damaged in shipping...",
" There's a worrying grinding noise in the gearbox...",
" The drill head's barely intact...",
" You hear an incessant knocking coming from the engine...")
var/datum/reagent_holder/R = new/datum/reagent_holder(max_fuel)
reagents = R
R.my_atom = src
R.add_reagent("fuel", max_fuel)
START_PROCESSING(SSobj, src)
/obj/item/pickaxe/tyrmalin/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/pickaxe/tyrmalin/proc/turnOn(mob/user as mob)
if(active)
return
to_chat(user, "You start pulling the string on \the [src].")
//visible_message("[usr] starts pulling the string on the [src].")
if(get_fuel() <= 0)
if(do_after(user, 15))
to_chat(user, "\The [src] won't start!")
else
to_chat(user, "You fumble with the string.")
else
if(do_after(user, 15))
to_chat(user, "You start \the [src] up with a loud grinding!")
//visible_message("[usr] starts \the [src] up with a loud grinding!")
attack_verb = list("shredded", "ripped", "torn")
playsound(src, 'sound/weapons/chainsaw_startup.ogg',40,1)
damage_force = 15
damage_mode |= DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE
active = TRUE
update_icon()
else
to_chat(user, "You fumble with the string.")
/obj/item/pickaxe/tyrmalin/proc/turnOff(mob/user as mob)
if(!active) return
to_chat(user, "You switch the gas nozzle on the drill, turning it off.")
attack_verb = list("bluntly hit", "beat", "knocked")
playsound(user, 'sound/weapons/chainsaw_turnoff.ogg',40,1)
damage_force = 3
damage_mode = initial(damage_mode)
active = FALSE
update_icon()
/obj/item/pickaxe/tyrmalin/attack_self(mob/user, datum/event_args/actor/actor)
. = ..()
if(.)
return
if(!active)
turnOn(user)
else
turnOff(user)
/obj/item/pickaxe/tyrmalin/afterattack(atom/target, mob/user, clickchain_flags, list/params)
if(!(clickchain_flags & CLICKCHAIN_HAS_PROXIMITY)) return
..()
if(active)
playsound(src, 'sound/weapons/chainsaw_attack.ogg',40,1)
if(target && active)
if(get_fuel() > 0)
reagents.remove_reagent("fuel", 1)
if(jam_chance && active)
if(prob(jam_chance))
user.action_feedback(SPAN_WARNING("\The [src] jolts as it stalls out!"))
turnOff()
else
return
if (istype(target, /obj/structure/reagent_dispensers/fueltank) || istype(target, /obj/item/reagent_containers/portable_fuelcan) && get_dist(src,target) <= 1)
to_chat(usr, "<span class='notice'>You begin filling the tank on the [src].</span>")
if(do_after(usr, 15))
target.reagents.trans_to_obj(src, max_fuel)
playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6)
to_chat(usr, "<span class='notice'>[src] succesfully refueled.</span>")
else
to_chat(usr, "<span class='notice'>Don't move while you're refilling the [src].</span>")
/obj/item/pickaxe/tyrmalin/process(delta_time)
if(!active)
return
if(get_fuel() > 0)
reagents.remove_reagent("fuel", 1)
playsound(src, 'sound/weapons/chainsaw_turnoff.ogg',15,1)
if(get_fuel() <= 0)
visible_message(SPAN_WARNING("\The [src] sputters to a stop!"))
turnOff()
/obj/item/pickaxe/tyrmalin/proc/get_fuel()
return reagents.get_reagent_amount("fuel")
/obj/item/pickaxe/tyrmalin/examine(mob/user, dist)
. = ..()
if(max_fuel)
. += "<span class = 'notice'>The [src] feels like it contains roughtly [get_fuel()] units of fuel left.</span>"
/obj/item/pickaxe/tyrmalin/update_icon()
if(active)
icon_state = "goblindrill1"
item_state = "goblindrill1"
else
icon_state = "goblindrill"
item_state = "goblindrill"
/*****************************Shovel********************************/
/obj/item/shovel
name = "shovel"
desc = "A large tool for digging and moving dirt."
icon = 'icons/obj/items.dmi'
icon_state = "shovel"
slot_flags = SLOT_BELT
damage_force = 8.0
throw_force = 4.0
item_state = "shovel"
w_class = WEIGHT_CLASS_NORMAL
origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1)
materials_base = list(MAT_STEEL = 50)
attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked")
damage_mode = DAMAGE_MODE_EDGE
worth_intrinsic = 50
suit_storage_class = SUIT_STORAGE_CLASS_HARDWEAR
var/digspeed = 40
/obj/item/shovel/bone
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 tribal designs."
icon = 'icons/obj/mining.dmi'
icon_state = "shovel_bone"
damage_force = 15
throw_force = 12
tool_speed = 0.7
attack_verb = list("slashed", "impaled", "stabbed", "sliced")
damage_mode = DAMAGE_MODE_SHARP | DAMAGE_MODE_EDGE
/obj/item/shovel/bronze
name = "bronze shovel"
desc = "A simple shovel made of bronze. Its wide head seems to be much simpler then modern shovels."
icon = 'icons/obj/lavaland.dmi'
icon_state = "shovel_bronze"
/obj/item/shovel/spade
name = "spade"
desc = "A small tool for digging and moving dirt."
icon_state = "spade"
item_state = "spade"
damage_force = 5.0
throw_force = 7.0
w_class = WEIGHT_CLASS_SMALL
/obj/item/shovel/spade/bone
name = "primitive spade"
desc = "A small shove cruedly fashioned out of some beast's scapula."
icon = 'icons/obj/mining.dmi'
icon_state = "spade_bone"
/obj/item/shovel/spade/bronze
name = "primitive spade"
desc = "A small shovel made of bronze. The design seems to have some ritual purposes."
icon = 'icons/obj/lavaland.dmi'
icon_state = "spade_bronze"
/**********************Mining car (Crate like thing, not the rail car)**************************/
/obj/structure/closet/crate/miningcar
desc = "A mining car. This one doesn't work on rails, but has to be dragged."
name = "Mining car (not for rails)"
closet_appearance = null
icon = 'icons/obj/storage.dmi'
icon_state = "miningcar"
density = 1
icon_opened = "miningcaropen"
icon_closed = "miningcar"
/obj/structure/closet/crate/miningcar/update_icon()
// Flags.
/obj/item/stack/flag
name = "flags"
desc = "Some colourful flags."
singular_name = "flag"
icon = 'icons/obj/mining.dmi'
amount = 10
max_amount = 10
zmm_flags = ZMM_MANGLE_PLANES
suit_storage_class = SUIT_STORAGE_CLASS_SOFTWEAR | SUIT_STORAGE_CLASS_HARDWEAR
var/upright = 0
var/base_state
/obj/item/stack/flag/Initialize(mapload, new_amount, merge)
. = ..()
base_state = icon_state
/obj/item/stack/flag/blue
name = "blue flags"
singular_name = "blue flag"
icon_state = "blueflag"
/obj/item/stack/flag/red
name = "red flags"
singular_name = "red flag"
icon_state = "redflag"
/obj/item/stack/flag/yellow
name = "yellow flags"
singular_name = "yellow flag"
icon_state = "yellowflag"
/obj/item/stack/flag/green
name = "green flags"
singular_name = "green flag"
icon_state = "greenflag"
/obj/item/stack/flag/attackby(obj/item/W as obj, mob/user as mob)
if(upright && istype(W,src.type))
src.attack_hand(user)
else
..()
/obj/item/stack/flag/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args)
if(upright)
upright = 0
icon_state = base_state
anchored = 0
src.visible_message("<b>[user]</b> knocks down [src].")
else
..()
/obj/item/stack/flag/attack_self(mob/user, datum/event_args/actor/actor)
. = ..()
if(.)
return
var/obj/item/stack/flag/F = locate() in get_turf(src)
var/turf/T = get_turf(src)
if(!T || !istype(T,/turf/simulated/mineral))
to_chat(user, "The flag won't stand up in this terrain.")
return
if(F && F.upright)
to_chat(user, "There is already a flag here.")
return
var/obj/item/stack/flag/newflag = new src.type(T)
newflag.amount = 1
newflag.upright = 1
newflag.anchored = 1
newflag.name = newflag.singular_name
newflag.icon_state = "[newflag.base_state]_open"
newflag.visible_message("<b>[user]</b> plants [newflag] firmly in the ground.")
src.use(1)