mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-21 15:42:35 +00:00
1490 lines
44 KiB
Plaintext
1490 lines
44 KiB
Plaintext
/**********************Miner Lockers**************************/
|
|
|
|
/obj/structure/closet/secure_closet/miner
|
|
name = "shaft miner locker"
|
|
icon_state = "miningsec1"
|
|
icon_closed = "miningsec"
|
|
icon_locked = "miningsec1"
|
|
icon_opened = "miningsecopen"
|
|
icon_broken = "miningsecbroken"
|
|
icon_off = "miningsecoff"
|
|
req_access = list(access_mining)
|
|
|
|
/obj/structure/closet/secure_closet/miner/fill()
|
|
..()
|
|
if(prob(50))
|
|
new /obj/item/storage/backpack/industrial(src)
|
|
else
|
|
new /obj/item/storage/backpack/satchel_eng(src)
|
|
new /obj/item/device/radio/headset/headset_cargo(src)
|
|
new /obj/item/clothing/under/rank/miner(src)
|
|
new /obj/item/clothing/gloves/black(src)
|
|
new /obj/item/clothing/shoes/black(src)
|
|
new /obj/item/device/analyzer(src)
|
|
new /obj/item/storage/bag/ore(src)
|
|
new /obj/item/shovel(src)
|
|
new /obj/item/pickaxe(src)
|
|
new /obj/item/gun/custom_ka/frame01/prebuilt(src)
|
|
new /obj/item/ore_detector(src)
|
|
new /obj/item/key/minecarts(src)
|
|
new /obj/item/device/gps/mining(src)
|
|
new /obj/item/book/manual/ka_custom(src)
|
|
new /obj/item/clothing/accessory/storage/overalls/mining(src)
|
|
new /obj/item/clothing/head/bandana/miner(src)
|
|
|
|
/******************************Lantern*******************************/
|
|
|
|
/obj/item/device/flashlight/lantern
|
|
name = "lantern"
|
|
desc = "A mining lantern."
|
|
icon_state = "lantern"
|
|
item_state = "lantern"
|
|
item_icons = list(
|
|
slot_l_hand_str = 'icons/mob/items/lefthand_mining.dmi',
|
|
slot_r_hand_str = 'icons/mob/items/righthand_mining.dmi',
|
|
)
|
|
light_power = 1
|
|
brightness_on = 4
|
|
light_wedge = LIGHT_OMNI
|
|
light_color = LIGHT_COLOR_FIRE
|
|
|
|
/*****************************Pickaxe********************************/
|
|
|
|
/obj/item/pickaxe
|
|
name = "pickaxe"
|
|
desc = "The most basic of mining implements. Surely this is a joke?"
|
|
icon = 'icons/obj/tools.dmi'
|
|
icon_state = "pickaxe"
|
|
item_state = "pickaxe"
|
|
item_icons = list(
|
|
slot_l_hand_str = 'icons/mob/items/lefthand_mining.dmi',
|
|
slot_r_hand_str = 'icons/mob/items/righthand_mining.dmi',
|
|
)
|
|
flags = CONDUCT
|
|
slot_flags = SLOT_BELT
|
|
throwforce = 4.0
|
|
force = 10.0
|
|
w_class = ITEMSIZE_LARGE
|
|
matter = list(DEFAULT_WALL_MATERIAL = 3750)
|
|
var/digspeed //moving the delay to an item var so R&D can make improved picks. --NEO
|
|
origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1)
|
|
attack_verb = list("hit", "pierced", "sliced", "attacked")
|
|
hitsound = 'sound/weapons/rapidslice.ogg'
|
|
var/drill_sound = /decl/sound_category/pickaxe_sound
|
|
var/drill_verb = "excavating"
|
|
var/autodrill = 0 //pickaxes must be manually swung to mine, drills can mine rocks via bump
|
|
sharp = TRUE
|
|
|
|
var/can_wield = TRUE
|
|
|
|
var/excavation_amount = 40
|
|
var/wielded = FALSE
|
|
var/wield_sound = /decl/sound_category/generic_wield_sound
|
|
var/unwield_sound = null
|
|
var/force_unwielded = 5.0
|
|
var/force_wielded = 15.0
|
|
var/digspeed_unwielded = 30
|
|
var/digspeed_wielded = 5
|
|
var/drilling = FALSE
|
|
|
|
action_button_name = "Wield pick/drill"
|
|
|
|
/obj/item/pickaxe/proc/unwield()
|
|
wielded = FALSE
|
|
force = force_unwielded
|
|
digspeed = digspeed_unwielded
|
|
name = initial(name)
|
|
if(src.unwield_sound)
|
|
playsound(src.loc, unwield_sound, 25, 1)
|
|
update_icon()
|
|
|
|
/obj/item/pickaxe/proc/wield()
|
|
wielded = TRUE
|
|
force = force_wielded
|
|
digspeed = digspeed_wielded
|
|
if(src.wield_sound)
|
|
playsound(src.loc, wield_sound, 25, 1)
|
|
update_icon()
|
|
|
|
/obj/item/pickaxe/update_icon()
|
|
..()
|
|
if(wielded)
|
|
item_state = "[initial(icon_state)]-wielded"
|
|
else
|
|
item_state = initial(item_state)
|
|
update_held_icon()
|
|
|
|
/obj/item/pickaxe/mob_can_equip(M, slot, disable_warning = FALSE)
|
|
//Cannot equip wielded items.
|
|
if(wielded)
|
|
to_chat(M, SPAN_WARNING("Unwield the [initial(name)] first!"))
|
|
return FALSE
|
|
|
|
return ..()
|
|
|
|
/obj/item/pickaxe/dropped(mob/user)
|
|
//handles unwielding a twohanded weapon when dropped as well as clearing up the offhand
|
|
if(user)
|
|
var/obj/item/pickaxe/O = user.get_inactive_hand()
|
|
if(istype(O))
|
|
O.unwield()
|
|
return unwield()
|
|
|
|
/obj/item/pickaxe/pickup(mob/user)
|
|
..()
|
|
unwield()
|
|
|
|
/obj/item/pickaxe/attack_self(mob/user)
|
|
..()
|
|
|
|
if(!can_wield)
|
|
return
|
|
|
|
if(istype(user, /mob/living/carbon/human))
|
|
var/mob/living/carbon/human/H = user
|
|
if(issmall(H))
|
|
to_chat(user, SPAN_WARNING("It's too heavy for you to wield fully."))
|
|
return
|
|
else
|
|
return
|
|
|
|
if(!istype(user.get_active_hand(), src))
|
|
to_chat(user, SPAN_WARNING("You need to be holding \the [src] in your active hand."))
|
|
return
|
|
|
|
if(wielded) //Trying to unwield it
|
|
unwield()
|
|
to_chat(user, SPAN_NOTICE("You are now carrying \the [src] with one hand."))
|
|
|
|
var/obj/item/pickaxe/offhand/O = user.get_inactive_hand()
|
|
if(O && istype(O))
|
|
O.unwield()
|
|
|
|
else //Trying to wield it
|
|
if(user.get_inactive_hand())
|
|
to_chat(user, SPAN_WARNING("Your other hand needs to be empty."))
|
|
return
|
|
wield()
|
|
to_chat(user, SPAN_NOTICE("You grab \the [src] with both hands."))
|
|
|
|
var/obj/item/pickaxe/offhand/O = new(user) ////Let's reserve his other hand~
|
|
O.name = "[initial(name)] - offhand"
|
|
O.desc = "Your second grip on the [initial(name)]."
|
|
user.put_in_inactive_hand(O)
|
|
|
|
if(istype(user,/mob/living/carbon/human))
|
|
var/mob/living/carbon/human/H = user
|
|
H.update_inv_l_hand()
|
|
H.update_inv_r_hand()
|
|
|
|
return
|
|
|
|
/obj/item/pickaxe/ui_action_click()
|
|
if(src in usr)
|
|
attack_self(usr)
|
|
|
|
/obj/item/pickaxe/verb/wield_pick()
|
|
if(can_wield)
|
|
set name = "Wield pick/drill"
|
|
set category = "Object"
|
|
set src in usr
|
|
|
|
attack_self(usr)
|
|
|
|
/obj/item/pickaxe/offhand
|
|
w_class = ITEMSIZE_HUGE
|
|
icon = 'icons/obj/weapons.dmi'
|
|
icon_state = "offhand"
|
|
item_state = null
|
|
name = "offhand"
|
|
simulated = FALSE
|
|
action_button_name = null
|
|
drop_sound = null
|
|
pickup_sound = null
|
|
equip_sound = null
|
|
|
|
/obj/item/pickaxe/proc/copy_stats(obj/item/pickaxe/parent)
|
|
digspeed_wielded = parent.digspeed_wielded
|
|
excavation_amount = parent.excavation_amount
|
|
force = parent.force_wielded
|
|
|
|
/obj/item/pickaxe/offhand/unwield()
|
|
if(ismob(loc))
|
|
var/mob/living/our_mob = loc
|
|
our_mob.remove_from_mob(src)
|
|
|
|
qdel(src)
|
|
|
|
/obj/item/pickaxe/offhand/wield()
|
|
if (ismob(loc))
|
|
var/mob/living/our_mob = loc
|
|
our_mob.remove_from_mob(src)
|
|
|
|
qdel(src)
|
|
|
|
/obj/item/pickaxe/hammer
|
|
name = "sledgehammer"
|
|
desc = "A mining hammer made of reinforced metal. You feel like smashing your boss in the face with this."
|
|
icon_state = "sledgehammer"
|
|
icon = 'icons/obj/weapons.dmi'
|
|
|
|
/obj/item/pickaxe/silver
|
|
name = "silver pickaxe"
|
|
icon_state = "spickaxe"
|
|
item_state = "spickaxe"
|
|
origin_tech = list(TECH_MATERIAL = 3)
|
|
desc = "This makes no metallurgic sense."
|
|
excavation_amount = 50
|
|
|
|
digspeed_unwielded = 30
|
|
digspeed_wielded = 5
|
|
|
|
/obj/item/pickaxe/drill
|
|
name = "mining drill" // Can dig sand as well!
|
|
desc = "Yours is the drill that will pierce through the rock walls."
|
|
icon = 'icons/obj/contained_items/tools/drills.dmi'
|
|
icon_state = "miningdrill"
|
|
item_state = "miningdrill"
|
|
contained_sprite = TRUE
|
|
origin_tech = list(TECH_MATERIAL = 2, TECH_POWER = 3, TECH_ENGINEERING = 2)
|
|
drill_verb = "drilling"
|
|
autodrill = TRUE
|
|
drill_sound = 'sound/weapons/drill.ogg'
|
|
digspeed = 10
|
|
digspeed_unwielded = 15
|
|
force_unwielded = 15.0
|
|
excavation_amount = 100
|
|
|
|
can_wield = FALSE
|
|
force = 15.0
|
|
|
|
action_button_name = null
|
|
|
|
/obj/item/pickaxe/drill/weak
|
|
name = "shaft drill"
|
|
desc = "Baby's first mining drill. Slow, but reliable."
|
|
icon_state = "babydrill"
|
|
item_state = "babydrill"
|
|
digspeed = 5
|
|
digspeed_unwielded = 10
|
|
excavation_amount = 80
|
|
force = 10
|
|
|
|
/obj/item/pickaxe/jackhammer
|
|
name = "sonic jackhammer"
|
|
desc = "Cracks rocks with sonic blasts, perfect for killing cave lizards."
|
|
icon = 'icons/obj/contained_items/tools/drills.dmi'
|
|
icon_state = "jackhammer"
|
|
item_state = "jackhammer"
|
|
contained_sprite = TRUE
|
|
origin_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2)
|
|
drill_verb = "hammering"
|
|
autodrill = TRUE
|
|
drill_sound = 'sound/weapons/sonic_jackhammer.ogg'
|
|
digspeed = 5
|
|
digspeed_unwielded = 10
|
|
force_unwielded = 15.0
|
|
excavation_amount = 100
|
|
|
|
can_wield = FALSE
|
|
force = 25.0
|
|
|
|
action_button_name = null
|
|
|
|
/obj/item/pickaxe/gold
|
|
name = "golden pickaxe"
|
|
icon_state = "gpickaxe"
|
|
item_state = "gpickaxe"
|
|
digspeed = 10
|
|
origin_tech = list(TECH_MATERIAL = 4)
|
|
desc = "This makes no metallurgic sense."
|
|
excavation_amount = 40
|
|
|
|
digspeed_unwielded = 30
|
|
digspeed_wielded = 5
|
|
|
|
/obj/item/pickaxe/diamond
|
|
name = "diamond pickaxe"
|
|
icon_state = "dpickaxe"
|
|
item_state = "dpickaxe"
|
|
origin_tech = list(TECH_MATERIAL = 6, TECH_ENGINEERING = 4)
|
|
desc = "A pickaxe with a diamond pick head."
|
|
excavation_amount = 50
|
|
autodrill = TRUE
|
|
digspeed_unwielded = 10
|
|
digspeed_wielded = 1
|
|
force_wielded = 25.0
|
|
|
|
/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 = 'icons/obj/contained_items/tools/drills.dmi'
|
|
icon_state = "diamonddrill"
|
|
item_state = "diamonddrill"
|
|
contained_sprite = TRUE
|
|
digspeed = 3 //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"
|
|
autodrill = TRUE
|
|
drill_sound = 'sound/weapons/drill.ogg'
|
|
excavation_amount = 100
|
|
|
|
can_wield = 0
|
|
force = 20.0
|
|
digspeed = 2
|
|
digspeed_unwielded = 3
|
|
force_unwielded = 20.0
|
|
|
|
action_button_name = null
|
|
|
|
/obj/item/pickaxe/borgdrill
|
|
name = "cyborg mining drill"
|
|
icon = 'icons/obj/contained_items/tools/drills.dmi'
|
|
icon_state = "diamonddrill"
|
|
item_state = "jackhammer"
|
|
contained_sprite = TRUE
|
|
digspeed = 10
|
|
digspeed_unwielded = 10
|
|
force_unwielded = 25.0
|
|
desc = ""
|
|
drill_verb = "drilling"
|
|
autodrill = TRUE
|
|
drill_sound = 'sound/weapons/drill.ogg'
|
|
can_wield = FALSE
|
|
force = 15.0
|
|
excavation_amount = 100
|
|
|
|
action_button_name = null
|
|
|
|
/*****************************Shovel********************************/
|
|
|
|
/obj/item/shovel
|
|
name = "shovel"
|
|
desc = "A large tool for digging and moving dirt."
|
|
icon = 'icons/obj/tools.dmi'
|
|
item_icons = list(
|
|
slot_l_hand_str = 'icons/mob/items/lefthand_mining.dmi',
|
|
slot_r_hand_str = 'icons/mob/items/righthand_mining.dmi',
|
|
)
|
|
icon_state = "shovel"
|
|
item_state = "shovel"
|
|
flags = CONDUCT
|
|
slot_flags = SLOT_BELT
|
|
force = 8.0
|
|
throwforce = 4.0
|
|
w_class = ITEMSIZE_NORMAL
|
|
origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1)
|
|
matter = list(DEFAULT_WALL_MATERIAL = 50)
|
|
attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked")
|
|
sharp = FALSE
|
|
edge = TRUE
|
|
|
|
/obj/item/shovel/spade
|
|
name = "spade"
|
|
desc = "A small tool for digging and moving dirt."
|
|
item_icons = list(
|
|
slot_l_hand_str = 'icons/mob/items/lefthand_hydro.dmi',
|
|
slot_r_hand_str = 'icons/mob/items/righthand_hydro.dmi',
|
|
)
|
|
icon_state = "spade"
|
|
item_state = "spade"
|
|
force = 5.0
|
|
throwforce = 7.0
|
|
w_class = ITEMSIZE_SMALL
|
|
|
|
// Flags.
|
|
|
|
/obj/item/stack/flag
|
|
name = "beacons"
|
|
desc = "A stack of light emitting beacons."
|
|
singular_name = "flag"
|
|
amount = 25
|
|
max_amount = 25
|
|
w_class = ITEMSIZE_SMALL
|
|
icon = 'icons/obj/mining.dmi'
|
|
var/upright = FALSE
|
|
var/base_state
|
|
|
|
light_color = LIGHT_COLOR_TUNGSTEN
|
|
light_power = 1.8
|
|
|
|
/obj/item/stack/flag/Initialize()
|
|
. = ..()
|
|
base_state = icon_state
|
|
|
|
/obj/item/stack/flag/red
|
|
name = "red beacons"
|
|
singular_name = "red beacon"
|
|
icon_state = "redflag"
|
|
light_color = LIGHT_COLOR_RED
|
|
|
|
/obj/item/stack/flag/red/planted
|
|
name = "red beacon"
|
|
icon_state = "redflag_open"
|
|
amount = 1
|
|
upright = TRUE
|
|
anchored = TRUE
|
|
|
|
/obj/item/stack/flag/red/planted/Initialize()
|
|
..()
|
|
base_state = "redflag"
|
|
set_light(2)
|
|
|
|
/obj/item/stack/flag/yellow
|
|
name = "yellow beacons"
|
|
singular_name = "yellow beacon"
|
|
icon_state = "yellowflag"
|
|
light_color = LIGHT_COLOR_YELLOW
|
|
|
|
/obj/item/stack/flag/green
|
|
name = "green beacons"
|
|
singular_name = "green beacon"
|
|
icon_state = "greenflag"
|
|
light_color = LIGHT_COLOR_GREEN
|
|
|
|
/obj/item/stack/flag/purple
|
|
name = "purple beacons"
|
|
singular_name = "purple beacon"
|
|
icon_state = "purpflag"
|
|
light_color = LIGHT_COLOR_PURPLE
|
|
|
|
/obj/item/stack/flag/attackby(obj/item/W, mob/user)
|
|
if(upright && istype(W, src.type))
|
|
src.attack_hand(user)
|
|
else
|
|
..()
|
|
|
|
/obj/item/stack/flag/attack_hand(user)
|
|
if(upright)
|
|
upright = FALSE
|
|
icon_state = base_state
|
|
anchored = FALSE
|
|
set_light(0)
|
|
src.visible_message(SPAN_NOTICE("<b>[user]</b> turns \the [src] off."))
|
|
else
|
|
..()
|
|
|
|
/obj/item/stack/flag/attack_self(mob/user)
|
|
var/obj/item/stack/flag/F = locate() in get_turf(src)
|
|
|
|
var/turf/T = get_turf(src)
|
|
if(!T || !istype(T, /turf/unsimulated/floor/asteroid))
|
|
to_chat(user, SPAN_WARNING("The beacon won't stand up in this terrain."))
|
|
return
|
|
|
|
if(F?.upright)
|
|
to_chat(user, SPAN_WARNING("There is already a beacon here."))
|
|
return
|
|
|
|
var/obj/item/stack/flag/newflag = new src.type(T)
|
|
newflag.amount = 1
|
|
newflag.upright = TRUE
|
|
newflag.anchored = TRUE
|
|
newflag.name = newflag.singular_name
|
|
newflag.icon_state = "[newflag.base_state]_open"
|
|
newflag.visible_message(SPAN_NOTICE("<b>[user]</b> plants \the [newflag] firmly in the ground."))
|
|
newflag.set_light(2)
|
|
src.use(1)
|
|
|
|
/obj/item/stack/flag/purple/borg
|
|
name = "stationbound beacon deployer"
|
|
desc = "A stationbound-mounted beacon deployer, deploys standard purple beacons in accordance with the mining colour scheme. Uses a metal synthesizer to produce more."
|
|
charge_costs = list(1500)
|
|
uses_charge = TRUE
|
|
stacktype = /obj/item/stack/flag/purple
|
|
|
|
/**********************Miner Carts***********************/
|
|
|
|
// RRF refactored into RFD-M, found in RFD.dm
|
|
|
|
/obj/structure/track
|
|
name = "mine track"
|
|
desc = "Just like your grandpappy used to lay 'em in 1862."
|
|
icon = 'icons/obj/smoothtrack.dmi'
|
|
icon_state = "track15"
|
|
density = FALSE
|
|
anchored = TRUE
|
|
w_class = ITEMSIZE_NORMAL
|
|
layer = 2.44
|
|
|
|
/obj/structure/track/Initialize()
|
|
. = ..()
|
|
var/obj/structure/track/track = locate() in get_turf(src)
|
|
if(track && track != src)
|
|
qdel(src)
|
|
return
|
|
updateOverlays()
|
|
for(var/dir in cardinal)
|
|
var/obj/structure/track/R = locate(/obj/structure/track, get_step(src, dir))
|
|
if(R)
|
|
R.updateOverlays()
|
|
|
|
/obj/structure/track/Destroy()
|
|
for(var/dir in cardinal)
|
|
var/obj/structure/track/R = locate(/obj/structure/track, get_step(src, dir))
|
|
if(R)
|
|
R.updateOverlays()
|
|
return ..()
|
|
|
|
/obj/structure/track/ex_act(severity)
|
|
switch(severity)
|
|
if(1.0)
|
|
qdel(src)
|
|
if(2.0)
|
|
qdel(src)
|
|
return
|
|
|
|
/obj/structure/track/attackby(obj/item/C, mob/user)
|
|
if(istype(C, /obj/item/stack/tile/floor))
|
|
var/turf/T = get_turf(src)
|
|
T.attackby(C, user)
|
|
return
|
|
if(C.iswelder())
|
|
var/obj/item/weldingtool/WT = C
|
|
if(WT.remove_fuel(0, user))
|
|
to_chat(user, SPAN_NOTICE("You slice apart the track."))
|
|
new /obj/item/stack/rods(get_turf(src))
|
|
qdel(src)
|
|
return
|
|
|
|
/obj/structure/track/proc/updateOverlays()
|
|
set waitfor = FALSE
|
|
overlays = list()
|
|
|
|
var/dir_sum = 0
|
|
|
|
for(var/direction in cardinal)
|
|
if(locate(/obj/structure/track, get_step(src, direction)))
|
|
dir_sum += direction
|
|
|
|
icon_state = "track[dir_sum]"
|
|
return
|
|
|
|
/obj/vehicle/train/cargo/engine/mining
|
|
name = "mine cart engine"
|
|
desc = "A ridable electric minecart designed for pulling other mine carts."
|
|
icon = 'icons/obj/cart.dmi'
|
|
icon_state = "mining_engine"
|
|
on = FALSE
|
|
powered = TRUE
|
|
move_delay = -1
|
|
|
|
load_item_visible = TRUE
|
|
load_offset_x = 0
|
|
mob_offset_y = 15
|
|
active_engines = 1
|
|
|
|
light_power = 1
|
|
light_range = 6
|
|
light_wedge = LIGHT_WIDE
|
|
light_color = LIGHT_COLOR_FIRE
|
|
|
|
/obj/vehicle/train/cargo/engine/mining/Initialize()
|
|
. = ..()
|
|
cell = new /obj/item/cell/high(src)
|
|
key = null
|
|
var/image/I = new(icon = 'icons/obj/cart.dmi', icon_state = "[icon_state]_overlay", layer = src.layer + 0.2) //over mobs
|
|
add_overlay(I)
|
|
turn_off() //so engine verbs are correctly set
|
|
|
|
/obj/vehicle/train/cargo/engine/mining/attackby(obj/item/W, mob/user)
|
|
if(istype(W, /obj/item/key/minecarts))
|
|
if(!key)
|
|
user.drop_from_inventory(W, src)
|
|
key = W
|
|
verbs += /obj/vehicle/train/cargo/engine/verb/remove_key
|
|
return
|
|
..()
|
|
|
|
/obj/vehicle/train/cargo/engine/mining/Move(var/turf/destination)
|
|
return ((locate(/obj/structure/track) in destination)) ? ..() : FALSE
|
|
|
|
/obj/vehicle/train/cargo/engine/mining/update_car(var/train_length, var/active_engines)
|
|
return
|
|
|
|
/obj/vehicle/train/cargo/trolley/mining
|
|
name = "mine-cart"
|
|
desc = "A modern day twist to an ancient classic."
|
|
icon = 'icons/obj/cart.dmi'
|
|
icon_state = "mining_trailer"
|
|
anchored = FALSE
|
|
passenger_allowed = FALSE
|
|
move_delay = -1
|
|
|
|
load_item_visible = TRUE
|
|
load_offset_x = 1
|
|
load_offset_y = 15
|
|
mob_offset_y = 16
|
|
|
|
light_power = 1
|
|
light_range = 3
|
|
light_wedge = LIGHT_OMNI
|
|
light_color = LIGHT_COLOR_FIRE
|
|
|
|
/obj/vehicle/train/cargo/trolley/mining/Move(var/turf/destination)
|
|
return ((locate(/obj/structure/track) in destination)) ? ..() : FALSE
|
|
|
|
/obj/item/key/minecarts
|
|
name = "key"
|
|
desc = "A keyring with a small steel key, and a pickaxe shaped fob."
|
|
icon = 'icons/obj/vehicles.dmi'
|
|
icon_state = "mine_keys"
|
|
w_class = ITEMSIZE_TINY
|
|
|
|
/**********************Pinpointer**********************/
|
|
|
|
/obj/item/ore_radar
|
|
name = "scanner pad"
|
|
desc = "An antiquated device that can detect ore in a wide radius around the user."
|
|
icon = 'icons/obj/device.dmi'
|
|
icon_state = "pinoff"
|
|
flags = CONDUCT
|
|
slot_flags = SLOT_BELT
|
|
w_class = ITEMSIZE_SMALL
|
|
item_state = "electronic"
|
|
throw_speed = 4
|
|
throw_range = 20
|
|
matter = list(DEFAULT_WALL_MATERIAL = 500)
|
|
var/turf/simulated/mineral/random/sonar
|
|
var/active = 0
|
|
|
|
|
|
/obj/item/ore_radar/attack_self(mob/user)
|
|
if(!active)
|
|
active = TRUE
|
|
to_chat(user, SPAN_NOTICE("You activate the pinpointer."))
|
|
START_PROCESSING(SSfast_process, src)
|
|
else
|
|
active = FALSE
|
|
icon_state = "pinoff"
|
|
to_chat(user, SPAN_NOTICE("You deactivate the pinpointer."))
|
|
STOP_PROCESSING(SSfast_process, src)
|
|
|
|
/obj/item/ore_radar/process()
|
|
if(active)
|
|
workdisk()
|
|
else
|
|
STOP_PROCESSING(SSfast_process, src)
|
|
|
|
/obj/item/ore_radar/proc/workdisk()
|
|
if(!src.loc)
|
|
active = FALSE
|
|
|
|
if(!active)
|
|
return
|
|
|
|
var/closest = 15
|
|
|
|
for(var/turf/simulated/mineral/random/R in orange(14, loc))
|
|
if(!R.mineral)
|
|
continue
|
|
var/dist = get_dist(loc, R)
|
|
if(dist < closest)
|
|
closest = dist
|
|
sonar = R
|
|
|
|
if(!sonar)
|
|
icon_state = "pinonnull"
|
|
return
|
|
set_dir(get_dir(loc,sonar))
|
|
switch(get_dist(loc,sonar))
|
|
if(0)
|
|
icon_state = "pinondirect"
|
|
if(1 to 8)
|
|
icon_state = "pinonclose"
|
|
if(9 to 16)
|
|
icon_state = "pinonmedium"
|
|
if(16 to INFINITY)
|
|
icon_state = "pinonfar"
|
|
|
|
/**********************Jaunter**********************/
|
|
|
|
/obj/item/device/wormhole_jaunter
|
|
name = "wormhole jaunter"
|
|
desc = "A single use device harnessing outdated warp technology. The wormholes it creates are unpleasant to travel through, to say the least."
|
|
contained_sprite = TRUE
|
|
icon = 'icons/obj/mining_contained.dmi'
|
|
icon_state = "jaunter"
|
|
item_state = "jaunter"
|
|
throwforce = 0
|
|
w_class = ITEMSIZE_SMALL
|
|
throw_speed = 3
|
|
throw_range = 5
|
|
slot_flags = SLOT_BELT
|
|
origin_tech = list(TECH_BLUESPACE = 2, TECH_PHORON = 4, TECH_ENGINEERING = 4)
|
|
|
|
/obj/item/device/wormhole_jaunter/attack_self(mob/user)
|
|
user.visible_message(SPAN_NOTICE("\The [user] activates \the [src]!"))
|
|
feedback_add_details("jaunter", "U") // user activated
|
|
activate(user)
|
|
|
|
/obj/item/device/wormhole_jaunter/proc/turf_check(mob/user)
|
|
var/turf/device_turf = get_turf(user)
|
|
if(!device_turf || device_turf.z == 0)
|
|
to_chat(user, SPAN_NOTICE("You're having difficulties getting \the [src] to work."))
|
|
return FALSE
|
|
return TRUE
|
|
|
|
/obj/item/device/wormhole_jaunter/proc/get_destinations(mob/user)
|
|
var/list/destinations = list()
|
|
|
|
for(var/obj/item/device/radio/beacon/B in teleportbeacons)
|
|
var/turf/T = get_turf(B)
|
|
if(isStationLevel(T.z))
|
|
destinations += B
|
|
|
|
return destinations
|
|
|
|
/obj/item/device/wormhole_jaunter/proc/activate(mob/user)
|
|
if(!turf_check(user))
|
|
return
|
|
|
|
var/list/L = get_destinations(user)
|
|
if(!length(L))
|
|
to_chat(user, SPAN_NOTICE("\The [src] found no beacons in the world to anchor a wormhole to."))
|
|
return
|
|
var/chosen_beacon = pick(L)
|
|
var/obj/effect/portal/wormhole/jaunt_tunnel/J = new /obj/effect/portal/wormhole/jaunt_tunnel(get_turf(src), chosen_beacon, null, 100)
|
|
J.target = chosen_beacon
|
|
playsound(src,'sound/effects/sparks4.ogg', 50, 1)
|
|
qdel(src)
|
|
|
|
/obj/item/device/wormhole_jaunter/emp_act(power)
|
|
var/triggered = FALSE
|
|
if(power == 1)
|
|
triggered = TRUE
|
|
else if(power == 2 && prob(50))
|
|
triggered = TRUE
|
|
|
|
if(triggered)
|
|
usr.visible_message(SPAN_WARNING("\The [src] overloads and activates!"))
|
|
feedback_add_details("jaunter", "E") // EMP accidental activation
|
|
activate(usr)
|
|
|
|
/obj/effect/portal/wormhole/jaunt_tunnel
|
|
name = "jaunt tunnel"
|
|
icon = 'icons/obj/objects.dmi'
|
|
icon_state = "bhole3"
|
|
desc = "A stable hole in the universe made by a wormhole jaunter. Turbulent doesn't even begin to describe how rough passage through one of these is, but at least it will always get you somewhere near a beacon."
|
|
|
|
/obj/effect/portal/wormhole/jaunt_tunnel/teleport(atom/movable/M)
|
|
if(M.anchored || istype(M, /obj/effect))
|
|
return
|
|
single_spark(get_turf(M))
|
|
if(istype(M))
|
|
if(do_teleport(M, target, 6))
|
|
single_spark(get_turf(M))
|
|
playsound(M,'sound/weapons/resonator_blast.ogg',50,1)
|
|
if(iscarbon(M))
|
|
var/mob/living/carbon/L = M
|
|
L.Weaken(3)
|
|
if(ishuman(L))
|
|
shake_camera(L, 20, 1)
|
|
addtimer(CALLBACK(L, /mob/living/carbon/human.proc/vomit), 20)
|
|
|
|
/**********************Lazarus Injector**********************/
|
|
|
|
/obj/item/lazarus_injector
|
|
name = "lazarus injector"
|
|
desc = "An injector with a cocktail of nanomachines and chemicals, this device can seemingly raise animals from the dead. If no effect in 3 days please call customer support."
|
|
icon = 'icons/obj/syringe.dmi'
|
|
icon_state = "borghypo"
|
|
item_state = "hypo"
|
|
throwforce = 0
|
|
w_class = ITEMSIZE_SMALL
|
|
throw_speed = 3
|
|
throw_range = 5
|
|
var/loaded = TRUE
|
|
var/emagged = FALSE
|
|
var/malfunctioning = FALSE
|
|
var/revive_type = TYPE_ORGANIC //So you can't revive boss monsters or robots with it
|
|
origin_tech = list(TECH_BIO = 7, TECH_MATERIAL = 4)
|
|
|
|
/obj/item/lazarus_injector/afterattack(atom/target, mob/user, proximity_flag)
|
|
if(!loaded)
|
|
return
|
|
if(isliving(target) && proximity_flag)
|
|
if(istype(target, /mob/living/simple_animal))
|
|
var/mob/living/simple_animal/M = target
|
|
if(!(M.find_type() & revive_type))
|
|
to_chat(user, SPAN_INFO("\The [src] does not work on this sort of creature."))
|
|
return
|
|
if(M.stat == DEAD)
|
|
if(emagged) //if emagged, will set anything revived to the user's faction. convert station pets to the traitor side!
|
|
M.faction = user.faction
|
|
if(malfunctioning) //when EMP'd, will set the mob faction to its initial faction, so any taming will be reverted.
|
|
M.faction = initial(M.faction)
|
|
M.revive()
|
|
M.icon_state = M.icon_living
|
|
M.desc = initial(M.desc)
|
|
loaded = FALSE
|
|
user.visible_message(SPAN_NOTICE("\The [user] revives \the [M] by injecting it with \the [src]."))
|
|
feedback_add_details("lazarus_injector", "[M.type]")
|
|
playsound(src, 'sound/effects/refill.ogg', 50, TRUE)
|
|
return
|
|
else
|
|
to_chat(user, SPAN_INFO("\The [src] is only effective on the dead."))
|
|
return
|
|
else
|
|
to_chat(user, SPAN_INFO("\The [src] is only effective on lesser beings."))
|
|
return
|
|
|
|
/obj/item/lazarus_injector/emp_act()
|
|
if(!malfunctioning)
|
|
malfunctioning = TRUE
|
|
|
|
/obj/item/lazarus_injector/emag_act(mob/user)
|
|
if(!emagged)
|
|
to_chat(user, SPAN_WARNING("You overload \the [src]'s injection matrix."))
|
|
emagged = TRUE
|
|
|
|
/obj/item/lazarus_injector/examine(mob/user)
|
|
..()
|
|
if(!loaded)
|
|
to_chat(user, SPAN_INFO("\The [src] is empty."))
|
|
if(malfunctioning || emagged)
|
|
to_chat(user, SPAN_INFO("The display on \the [src] seems to be flickering."))
|
|
|
|
/**********************Point Transfer Card**********************/
|
|
|
|
/obj/item/card/mining_point_card
|
|
name = "mining points card"
|
|
desc = "A small card preloaded with mining points. Swipe your ID card over it to transfer the points, then discard."
|
|
icon_state = "data"
|
|
var/points = 500
|
|
|
|
/obj/item/card/mining_point_card/attackby(obj/item/I, mob/user, params)
|
|
if(istype(I, /obj/item/card/id))
|
|
if(points)
|
|
var/obj/item/card/id/C = I
|
|
C.mining_points += points
|
|
to_chat(user, SPAN_INFO("You transfer [points] points to \the [C]."))
|
|
points = 0
|
|
else
|
|
to_chat(user, SPAN_INFO("There's no points left on \the [src]."))
|
|
..()
|
|
|
|
/obj/item/card/mining_point_card/examine(mob/user)
|
|
..()
|
|
to_chat(user, SPAN_NOTICE("There's [points] point\s on the card."))
|
|
|
|
/**********************"Fultons"**********************/
|
|
|
|
var/list/total_extraction_beacons = list()
|
|
|
|
/obj/item/extraction_pack
|
|
name = "warp extraction pack"
|
|
desc = "A complex device that warps nonliving matter to nearby locations."
|
|
contained_sprite = TRUE
|
|
icon = 'icons/obj/mining_contained.dmi'
|
|
icon_state = "fulton"
|
|
w_class = ITEMSIZE_NORMAL
|
|
var/obj/structure/extraction_point/beacon
|
|
var/list/beacon_networks = list("station")
|
|
var/uses_left = 3
|
|
origin_tech = list(TECH_BLUESPACE = 3, TECH_PHORON = 4, TECH_ENGINEERING = 4)
|
|
|
|
/obj/item/extraction_pack/examine(mob/user)
|
|
. = ..()
|
|
to_chat(user, SPAN_NOTICE("It has [uses_left] uses remaining."))
|
|
|
|
/obj/item/extraction_pack/attack_self(mob/user)
|
|
var/list/possible_beacons = list()
|
|
for(var/B in total_extraction_beacons)
|
|
var/obj/structure/extraction_point/EP = B
|
|
if(EP.beacon_network in beacon_networks)
|
|
possible_beacons += EP
|
|
|
|
if(!length(possible_beacons))
|
|
to_chat(user, SPAN_NOTICE("There are no extraction beacons in existence!"))
|
|
return
|
|
|
|
else
|
|
var/A = input(user, "Select a beacon to connect to", "Warp Extraction Pack") in possible_beacons
|
|
if(!A)
|
|
return
|
|
beacon = A
|
|
|
|
/obj/item/extraction_pack/afterattack(atom/movable/A, mob/living/carbon/human/user)
|
|
if(istype(A, /obj/item/storage/bag/ore))
|
|
return
|
|
if(!beacon)
|
|
to_chat(user, SPAN_WARNING("\The [src] is not linked to a beacon, and cannot be used."))
|
|
return
|
|
if(!istype(A))
|
|
return
|
|
else
|
|
if(istype(A, /mob/living))
|
|
to_chat(user, SPAN_WARNING("\The [src] is not safe for use with living creatures, they wouldn't survive the trip back!"))
|
|
return
|
|
if(A.loc == user) // no extracting stuff you're holding
|
|
return
|
|
if(A.anchored)
|
|
return
|
|
var/turf/T = get_turf(A)
|
|
for(var/found_inhibitor in bluespace_inhibitors)
|
|
var/obj/machinery/anti_bluespace/AB = found_inhibitor
|
|
if(T.z != AB.z || get_dist(T, AB) > 8 || (AB.stat & (NOPOWER | BROKEN)))
|
|
continue
|
|
AB.use_power(AB.active_power_usage)
|
|
to_chat(user, SPAN_WARNING("A nearby bluespace inhibitor interferes with \the [src]!"))
|
|
return
|
|
to_chat(user, SPAN_NOTICE("You start attaching the pack to \the [A]..."))
|
|
if(do_after(user,50))
|
|
to_chat(user, SPAN_NOTICE("You attach the pack to \the [A] and activate it."))
|
|
uses_left--
|
|
if(uses_left <= 0)
|
|
user.drop_item(src)
|
|
single_spark(get_turf(A))
|
|
var/list/flooring_near_beacon = list()
|
|
for(var/turf/simulated/floor/floor in orange(1, beacon))
|
|
flooring_near_beacon += floor
|
|
if(length(flooring_near_beacon))
|
|
A.forceMove(pick(flooring_near_beacon))
|
|
else
|
|
A.forceMove(get_turf(beacon))
|
|
single_spark(get_turf(A))
|
|
if(uses_left <= 0)
|
|
qdel(src)
|
|
|
|
/obj/item/warp_core
|
|
name = "warp extraction beacon signaller"
|
|
desc = "Emits a signal which Warp-Item recovery devices can lock onto. Activate in hand to create a beacon."
|
|
desc_info = "You can activate this item in-hand to create a static beacon, or you can click on an ore box with it to allow the ore box to be linked to warp packed mining satchels."
|
|
icon = 'icons/obj/stock_parts.dmi'
|
|
icon_state = "subspace_amplifier"
|
|
origin_tech = list(TECH_BLUESPACE = 1, TECH_PHORON = 1, TECH_ENGINEERING = 2)
|
|
|
|
/obj/item/warp_core/attack_self(mob/user)
|
|
to_chat(user, SPAN_NOTICE("You start placing down the beacon..."))
|
|
if(do_after(user, 15))
|
|
to_chat(user, SPAN_NOTICE("You successfully deploy the beacon."))
|
|
new /obj/structure/extraction_point(get_turf(user))
|
|
qdel(src)
|
|
|
|
/obj/structure/extraction_point
|
|
name = "warp recovery beacon"
|
|
desc = "A beacon for the Warp-Item recovery system. Hit a beacon with a pack to link the pack to a beacon."
|
|
icon = 'icons/obj/mining.dmi'
|
|
icon_state = "extraction_point"
|
|
anchored = TRUE
|
|
density = FALSE
|
|
var/beacon_network = "station"
|
|
|
|
/obj/structure/extraction_point/Initialize()
|
|
. = ..()
|
|
var/area/area_name = get_area(src)
|
|
name += " ([rand(100,999)]) ([area_name.name])"
|
|
total_extraction_beacons += src
|
|
|
|
/obj/structure/extraction_point/Destroy()
|
|
total_extraction_beacons -= src
|
|
return ..()
|
|
|
|
/**********************Resonator**********************/
|
|
|
|
/obj/item/resonator
|
|
name = "resonator"
|
|
contained_sprite = TRUE
|
|
icon = 'icons/obj/mining_contained.dmi'
|
|
icon_state = "resonator"
|
|
item_state = "resonator"
|
|
desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It can also be activated without a target to create a field at the user's location, to act as a delayed time trap. It's more effective in a vacuum."
|
|
w_class = ITEMSIZE_NORMAL
|
|
force = 15
|
|
throwforce = 10
|
|
var/burst_time = 30
|
|
var/fieldlimit = 4
|
|
var/list/fields = list()
|
|
var/quick_burst_mod = 0.8
|
|
origin_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3)
|
|
|
|
/obj/item/resonator/upgraded
|
|
name = "upgraded resonator"
|
|
desc = "An upgraded version of the resonator that can produce more fields at once."
|
|
icon_state = "resonatoru"
|
|
item_state = "resonatoru"
|
|
origin_tech = list(TECH_MAGNET = 3, TECH_MATERIAL = 4, TECH_POWER = 2, TECH_ENGINEERING = 3)
|
|
fieldlimit = 8
|
|
quick_burst_mod = 1
|
|
burst_time = 15
|
|
|
|
/obj/item/resonator/proc/CreateResonance(target, creator)
|
|
var/turf/T = get_turf(target)
|
|
var/obj/effect/resonance/R = locate(/obj/effect/resonance) in T
|
|
if(R)
|
|
R.resonance_damage *= quick_burst_mod
|
|
R.burst(T)
|
|
return
|
|
if(fields.len < fieldlimit)
|
|
playsound(src, 'sound/weapons/resonator_fire.ogg', 50, TRUE)
|
|
var/obj/effect/resonance/RE = new /obj/effect/resonance(T, creator, burst_time, src)
|
|
fields += RE
|
|
|
|
/obj/item/resonator/attack_self(mob/user)
|
|
if(burst_time == 50)
|
|
burst_time = 30
|
|
to_chat(user, SPAN_INFO("You set the resonator's fields to detonate after 3 seconds."))
|
|
else
|
|
burst_time = 50
|
|
to_chat(user, SPAN_INFO("You set the resonator's fields to detonate after 5 seconds."))
|
|
|
|
/obj/item/resonator/afterattack(atom/target, mob/user, proximity_flag)
|
|
..()
|
|
if(user.Adjacent(target))
|
|
if(isturf(target))
|
|
CreateResonance(target, user)
|
|
|
|
/obj/effect/resonance
|
|
name = "resonance field"
|
|
desc = "A resonating field that significantly damages anything inside of it when the field eventually ruptures."
|
|
icon = 'icons/effects/effects.dmi'
|
|
icon_state = "shield2"
|
|
layer = 5
|
|
anchored = TRUE
|
|
mouse_opacity = 0
|
|
var/resonance_damage = 20
|
|
var/creator
|
|
var/obj/item/resonator/res
|
|
|
|
/obj/effect/resonance/New(loc, set_creator, timetoburst, set_resonator)
|
|
..()
|
|
creator = set_creator
|
|
res = set_resonator
|
|
var/turf/proj_turf = get_turf(src)
|
|
if(!istype(proj_turf))
|
|
return
|
|
var/datum/gas_mixture/environment = proj_turf.return_air()
|
|
var/pressure = environment.return_pressure()
|
|
if(pressure < 50)
|
|
name = "strong resonance field"
|
|
resonance_damage = 60
|
|
|
|
addtimer(CALLBACK(src, .proc/burst, loc), timetoburst)
|
|
|
|
/obj/effect/resonance/Destroy()
|
|
if(res)
|
|
res.fields -= src
|
|
return ..()
|
|
|
|
/obj/effect/resonance/proc/burst(turf/T)
|
|
playsound(src,'sound/weapons/resonator_blast.ogg',50,1)
|
|
if(istype(T, /turf/simulated/mineral))
|
|
var/turf/simulated/mineral/M = T
|
|
M.GetDrilled(1)
|
|
for(var/mob/living/L in T)
|
|
if(creator)
|
|
add_logs(creator, L, "used a resonator field on", "resonator")
|
|
to_chat(L, SPAN_DANGER("\The [src] ruptured with you in it!"))
|
|
L.apply_damage(resonance_damage, BRUTE)
|
|
qdel(src)
|
|
|
|
|
|
/******************************Ore Magnet*******************************/
|
|
/obj/item/oremagnet
|
|
name = "ore magnet"
|
|
contained_sprite = TRUE
|
|
icon = 'icons/obj/mining_contained.dmi'
|
|
icon_state = "magneto"
|
|
item_state = "magneto"
|
|
desc = "A handheld device that creates a well of negative force that attracts minerals of a very specific type, size, and state to its user."
|
|
w_class = ITEMSIZE_NORMAL
|
|
force = 10
|
|
throwforce = 5
|
|
origin_tech = list(TECH_MAGNET = 4, TECH_ENGINEERING = 3)
|
|
|
|
/obj/item/oremagnet/attack_self(mob/user)
|
|
if(use_check_and_message(user))
|
|
return
|
|
toggle_on(user)
|
|
|
|
/obj/item/oremagnet/process()
|
|
for(var/obj/item/ore/O in oview(7, loc))
|
|
if(prob(80))
|
|
step_to(O, get_turf(src), 0)
|
|
if(TICK_CHECK)
|
|
return
|
|
|
|
/obj/item/oremagnet/proc/toggle_on(mob/user)
|
|
if(!isprocessing)
|
|
START_PROCESSING(SSprocessing, src)
|
|
else
|
|
STOP_PROCESSING(SSprocessing, src)
|
|
if(user)
|
|
to_chat(user, "<span class='[isprocessing ? "notice" : "warning"]'>You switch [isprocessing ? "on" : "off"] [src].</span>")
|
|
|
|
/obj/item/oremagnet/Destroy()
|
|
STOP_PROCESSING(SSprocessing, src)
|
|
return ..()
|
|
|
|
/******************************Ore Summoner*******************************/
|
|
|
|
/obj/item/oreportal
|
|
name = "ore summoner"
|
|
contained_sprite = TRUE
|
|
icon = 'icons/obj/mining_contained.dmi'
|
|
icon_state = "supermagneto"
|
|
item_state = "jaunter"
|
|
desc = "A handheld device that creates a well of warp energy that teleports minerals of a very specific type, size, and state to its user."
|
|
w_class = ITEMSIZE_NORMAL
|
|
force = 15
|
|
throwforce = 5
|
|
origin_tech = list(TECH_BLUESPACE = 4, TECH_ENGINEERING = 3)
|
|
var/last_oresummon_time = 0
|
|
|
|
/obj/item/oreportal/attack_self(mob/user)
|
|
if(world.time - last_oresummon_time >= 25)
|
|
to_chat(user, SPAN_NOTICE("You pulse the ore summoner."))
|
|
last_oresummon_time = world.time
|
|
var/limit = 50
|
|
for(var/obj/item/ore/O in orange(7, user))
|
|
if(limit <= 0)
|
|
break
|
|
single_spark(get_turf(O))
|
|
do_teleport(O, user, 0)
|
|
limit -= 1
|
|
CHECK_TICK
|
|
else
|
|
to_chat(user, SPAN_NOTICE("The ore summoner is in the middle of some calibrations."))
|
|
return FALSE
|
|
|
|
/******************************Sculpting*******************************/
|
|
/obj/item/autochisel
|
|
name = "auto-chisel"
|
|
desc = "With an integrated AI chip and hair-trigger precision, this baby makes sculpting almost automatic!"
|
|
icon = 'icons/obj/contained_items/tools/drills.dmi'
|
|
icon_state = "chisel"
|
|
item_state = "jackhammer"
|
|
contained_sprite = TRUE
|
|
origin_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2)
|
|
|
|
#define TRUE_QDEL 3
|
|
/obj/structure/sculpting_block
|
|
name = "sculpting block"
|
|
desc = "A finely chiselled sculpting block, it is ready to be your canvas."
|
|
icon = 'icons/obj/mining.dmi'
|
|
icon_state = "sculpting_block"
|
|
density = TRUE
|
|
opacity = TRUE
|
|
anchored = FALSE
|
|
var/sculpted = FALSE
|
|
var/mob/living/T
|
|
var/times_carved = 0
|
|
var/busy_sculpting = FALSE
|
|
|
|
/obj/structure/sculpting_block/attackby(obj/item/C, mob/user)
|
|
if(C.iswrench())
|
|
visible_message("<b>[user]</b> starts to [anchored ? "un" : ""]anchor \the [src].", SPAN_NOTICE("You start to [anchored ? "un" : ""]anchor \the [src]."))
|
|
if(do_after(user, 5 SECONDS, TRUE))
|
|
playsound(src.loc, C.usesound, 100, 1)
|
|
anchored = !anchored
|
|
|
|
else if(istype(C, /obj/item/autochisel))
|
|
if(sculpted)
|
|
to_chat(user, SPAN_WARNING("\The [src] has already been sculpted!"))
|
|
return
|
|
if(busy_sculpting)
|
|
to_chat(user, SPAN_WARNING("Someone's already busy sculpting \the [src]!"))
|
|
return
|
|
|
|
busy_sculpting = TRUE
|
|
|
|
var/choice = input(user, "What would you like to sculpt?", "Sculpting Options") as null|anything in list("Sculpture", "Ladder")
|
|
if(!choice)
|
|
busy_sculpting = FALSE
|
|
return
|
|
choice = lowertext(choice)
|
|
var/result = sculpture_options(choice, user)
|
|
if(!result)
|
|
busy_sculpting = FALSE
|
|
return
|
|
|
|
user.visible_message(SPAN_NOTICE("\The [user] begins sculpting."), SPAN_NOTICE("You begin sculpting."))
|
|
|
|
if(prob(25))
|
|
playsound(loc, 'sound/items/screwdriver.ogg', 20, TRUE)
|
|
else
|
|
playsound(loc, /decl/sound_category/pickaxe_sound, 20, TRUE)
|
|
|
|
var/successfully_sculpted = FALSE
|
|
while(do_after(user, 2 SECONDS) && sculpture_process_check(choice, user))
|
|
if(times_carved <= 9)
|
|
times_carved++
|
|
playsound(loc, /decl/sound_category/pickaxe_sound, 20, TRUE)
|
|
continue
|
|
successfully_sculpted = TRUE
|
|
break
|
|
|
|
busy_sculpting = FALSE
|
|
|
|
if(!successfully_sculpted)
|
|
return
|
|
|
|
user.visible_message(SPAN_NOTICE("\The [user] finishes sculpting their magnum opus!"), SPAN_NOTICE("You finish sculpting a masterpiece."))
|
|
sculpted = finish_sculpture(choice, user)
|
|
if(sculpted == TRUE_QDEL)
|
|
qdel(src)
|
|
|
|
/obj/structure/sculpting_block/proc/sculpture_options(var/choice, var/mob/user)
|
|
switch(choice)
|
|
if("sculpture")
|
|
var/mob/living/old_T
|
|
if(T)
|
|
old_T = T
|
|
|
|
var/list/choices = list()
|
|
for(var/mob/living/M in view(7,user))
|
|
choices += M
|
|
T = input(user, "Who do you wish to sculpt?", "Sculpt Options") as null|anything in choices
|
|
if(!T)
|
|
to_chat(user, SPAN_NOTICE("You decide against sculpting for now."))
|
|
return FALSE
|
|
|
|
var/sculpting_coefficient = max(get_dist(user, T), 1)
|
|
if(sculpting_coefficient >= 7)
|
|
to_chat(user, SPAN_WARNING("You hardly remember what \the [T] really looks like! Bah!"))
|
|
T = null
|
|
return
|
|
|
|
if(old_T && T != old_T)
|
|
times_carved = 0
|
|
|
|
return TRUE
|
|
if("ladder")
|
|
var/turf/above = GET_ABOVE(src)
|
|
if(!above)
|
|
to_chat(user, SPAN_WARNING("There is nothing above you to make a ladder towards."))
|
|
return FALSE
|
|
if(!isopenturf(above))
|
|
to_chat(user, SPAN_WARNING("The tile above you isn't open and can't accomodate a ladder."))
|
|
return FALSE
|
|
return TRUE
|
|
|
|
/obj/structure/sculpting_block/proc/sculpture_process_check(var/choice, var/mob/user)
|
|
switch(choice)
|
|
if("sculpture")
|
|
if(!QDELETED(T) && get_dist(user, T) < 8)
|
|
return TRUE
|
|
return FALSE
|
|
if("ladder")
|
|
var/turf/above = GET_ABOVE(src)
|
|
if(!above)
|
|
to_chat(user, SPAN_WARNING("There is nothing above you to make a ladder towards."))
|
|
return FALSE
|
|
if(!isopenturf(above))
|
|
to_chat(user, SPAN_WARNING("The tile above you isn't open and can't accomodate a ladder."))
|
|
return FALSE
|
|
return TRUE
|
|
|
|
/obj/structure/sculpting_block/proc/finish_sculpture(var/choice, var/mob/user)
|
|
switch(choice)
|
|
if("sculpture")
|
|
appearance = T
|
|
appearance_flags = KEEP_TOGETHER
|
|
color = list( // for anyone interested, this is called a color matrix
|
|
0.35, 0.3, 0.25,
|
|
0.35, 0.3, 0.25,
|
|
0.35, 0.3, 0.25
|
|
)
|
|
pixel_y += 8
|
|
|
|
var/image/pedestal_underlay = image('icons/obj/mining.dmi', icon_state = "pedestal")
|
|
pedestal_underlay.appearance_flags = RESET_COLOR
|
|
pedestal_underlay.pixel_y -= 8
|
|
underlays += pedestal_underlay
|
|
|
|
obj_flags = OBJ_FLAG_ROTATABLE
|
|
|
|
var/title = sanitize(input(usr, "If you would like to name your art, do so here.", "Christen Your Sculpture", "") as text|null)
|
|
if(title)
|
|
name = title
|
|
else
|
|
name = T.name
|
|
|
|
var/legend = sanitize(input(usr, "If you would like to describe your art, do so here.", "Story Your Sculpture", "") as message|null)
|
|
if(legend)
|
|
desc = legend
|
|
else
|
|
desc = "This is a sculpture of [T.name]. All craftsmanship is of the highest quality. It is decorated with rock and more rock. It is covered with rock. On the item is an image of a rock. The rock is [T.name]."
|
|
|
|
T = null // null T out, we don't need the ref to them anymore
|
|
|
|
return TRUE
|
|
if("ladder")
|
|
var/turf/above = GET_ABOVE(src)
|
|
if(!above)
|
|
to_chat(user, SPAN_WARNING("There is nothing above you to make a ladder towards."))
|
|
return FALSE
|
|
if(!isopenturf(above))
|
|
to_chat(user, SPAN_WARNING("The tile above you isn't open and can't accomodate a ladder."))
|
|
return FALSE
|
|
|
|
new /obj/structure/ladder/up/mining(get_turf(src))
|
|
new /obj/structure/ladder/mining(above)
|
|
return TRUE_QDEL
|
|
|
|
#undef TRUE_QDEL
|
|
|
|
/******************************Gains Boroughs*******************************/
|
|
|
|
/obj/structure/punching_bag
|
|
name = "punching bag"
|
|
desc = "A punching bag. Better this than the Quartermaster."
|
|
icon = 'icons/obj/mining.dmi'
|
|
icon_state = "punchingbag"
|
|
anchored = TRUE
|
|
layer = 5.1
|
|
var/list/hit_sounds = list("swing_hit", "punch")
|
|
|
|
/obj/structure/punching_bag/attack_hand(mob/user as mob)
|
|
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
|
flick("[icon_state]2", src)
|
|
playsound(get_turf(src), pick(src.hit_sounds), 25, 1, -1)
|
|
|
|
/obj/structure/weightlifter
|
|
name = "weight machine"
|
|
desc = "Just looking at this thing makes you feel tired."
|
|
icon = 'icons/obj/mining.dmi'
|
|
icon_state = "fitnessweight"
|
|
density = TRUE
|
|
anchored = TRUE
|
|
|
|
/obj/structure/weightlifter/attack_hand(var/mob/living/carbon/human/user)
|
|
if(!istype(user))
|
|
return
|
|
if(in_use)
|
|
to_chat(user, "It's already in use - wait a bit.")
|
|
return
|
|
else
|
|
in_use = TRUE
|
|
icon_state = "fitnessweight-c"
|
|
user.dir = SOUTH
|
|
user.Stun(4)
|
|
user.forceMove(src.loc)
|
|
var/image/W = image('icons/obj/mining.dmi',"fitnessweight-w")
|
|
W.layer = 5.1
|
|
add_overlay(W)
|
|
var/bragmessage = pick("pushing it to the limit","going into overdrive","burning with determination","rising up to the challenge", "getting strong now","getting ripped")
|
|
user.visible_message(SPAN_NOTICE("<B>[user] is [bragmessage]!</B>"))
|
|
var/reps = 0
|
|
user.pixel_y = 5
|
|
while (reps++ < 6)
|
|
if (user.loc != src.loc)
|
|
break
|
|
|
|
for (var/innerReps = max(reps, 1), innerReps > 0, innerReps--)
|
|
sleep(3)
|
|
animate(user, pixel_y = (user.pixel_y == 3) ? 5 : 3, time = 3)
|
|
|
|
playsound(user,'sound/effects/spring.ogg', 60, 1)
|
|
|
|
sleep(3)
|
|
animate(user, pixel_y = 2, time = 3)
|
|
sleep(3)
|
|
playsound(user, 'sound/machines/click.ogg', 60, 1)
|
|
in_use = 0
|
|
animate(user, pixel_y = 0, time = 3)
|
|
var/finishmessage = pick("You feel stronger!","You feel like you can take on the world!","You feel robust!","You feel indestructible!")
|
|
icon_state = "fitnessweight"
|
|
cut_overlay(W)
|
|
to_chat(user, SPAN_NOTICE("[finishmessage]"))
|
|
user.adjustNutritionLoss(5)
|
|
user.adjustHydrationLoss(5)
|
|
|
|
/******************************Seismic Charge*******************************/
|
|
|
|
/obj/item/plastique/seismic
|
|
name = "seismic charge"
|
|
desc = "A complex mining device that utilizes a seismic detonation to eliminate weak asteroid turf in a wide radius."
|
|
origin_tech = list(TECH_MAGNET = 2, TECH_MATERIAL = 4, TECH_PHORON = 2)
|
|
timer = 15
|
|
|
|
/obj/item/plastique/seismic/explode(var/turf/location)
|
|
if(!target)
|
|
target = get_atom_on_turf(src)
|
|
if(!target)
|
|
target = src
|
|
QDEL_NULL(effect_overlay)
|
|
if(location)
|
|
new /obj/effect/overlay/temp/explosion(location)
|
|
playsound(location, 'sound/effects/Explosion1.ogg', 100, 1)
|
|
for(var/atom/A in range(4,location))
|
|
if(istype(A,/turf/simulated/mineral))
|
|
var/turf/simulated/mineral/M = A
|
|
M.GetDrilled(1)
|
|
else if(istype(A, /turf/simulated/wall) && prob(66))
|
|
var/turf/simulated/wall/W = A
|
|
W.ex_act(2)
|
|
else if(istype(A, /obj/structure/window))
|
|
var/obj/structure/window/WI = A
|
|
WI.ex_act(3)
|
|
else if(istype(A,/mob/living))
|
|
var/mob/living/LI = A
|
|
LI << 'sound/weapons/resonator_blast.ogg'
|
|
if(iscarbon(LI))
|
|
var/mob/living/carbon/L = A
|
|
L.Weaken(3)
|
|
shake_camera(L, 20, 1)
|
|
if(!isipc(L) && ishuman(L))
|
|
addtimer(CALLBACK(L, /mob/living/carbon/human.proc/vomit), 20)
|
|
|
|
addtimer(CALLBACK(src, .proc/drill, location), 2)
|
|
|
|
qdel(src)
|
|
|
|
/obj/item/plastique/seismic/proc/drill(var/turf/drill_loc)
|
|
for(var/turf/simulated/mineral/M in range(7,drill_loc))
|
|
if(prob(75))
|
|
M.GetDrilled(1)
|
|
|
|
/****************Himeo Voidsuit Kit*****************/
|
|
/obj/item/himeo_kit
|
|
name = "himeo voidsuit kit"
|
|
contained_sprite = TRUE
|
|
icon = 'icons/obj/mining_contained.dmi'
|
|
icon_state = "himeo_kit"
|
|
item_state = "himeo_kit"
|
|
desc = "A simple cardboard box containing the requisition forms, permits, and decal kits for a Himean voidsuit."
|
|
desc_fluff = "As part of a cost-cutting and productivity-enhancing initiative, NanoTrasen has authorized a number of Himean Type-76 'Fish Fur'\
|
|
for use by miners originating from the planet. Most of these suits are assembled in Cannington and painstakingly optimized on-site by their\
|
|
individual operator leading to a large trail of red tape as NanoTrasen is forced to inspect these suits to ensure their safety."
|
|
desc_info = "In order to convert a mining voidsuit into a Himean voidsuit, simply click on this box with a voidsuit or helmet in hand.\
|
|
The same process can be used to convert a Himean voidsuit back into a regular voidsuit. Make sure not to have a helmet or tank in the suit\
|
|
or else it will be deleted."
|
|
w_class = ITEMSIZE_SMALL
|
|
|
|
/obj/item/himeo_kit/attackby(obj/item/W as obj, mob/user as mob)
|
|
var/list/suit_options = list(
|
|
/obj/item/clothing/suit/space/void/mining = /obj/item/clothing/suit/space/void/mining/himeo,
|
|
/obj/item/clothing/head/helmet/space/void/mining = /obj/item/clothing/head/helmet/space/void/mining/himeo,
|
|
|
|
/obj/item/clothing/suit/space/void/engineering = /obj/item/clothing/suit/space/void/engineering/himeo,
|
|
/obj/item/clothing/head/helmet/space/void/engineering = /obj/item/clothing/head/helmet/space/void/engineering/himeo,
|
|
|
|
/obj/item/clothing/suit/space/void/atmos = /obj/item/clothing/suit/space/void/atmos/himeo,
|
|
/obj/item/clothing/head/helmet/space/void/atmos = /obj/item/clothing/head/helmet/space/void/atmos/himeo
|
|
)
|
|
var/reconverting = FALSE
|
|
var/voidsuit_product = suit_options[W.type]
|
|
if(!voidsuit_product)
|
|
for(var/thing in suit_options)
|
|
if(suit_options[thing] == W.type)
|
|
voidsuit_product = thing
|
|
reconverting = TRUE
|
|
break
|
|
if(voidsuit_product)
|
|
if(istype(W, /obj/item/clothing/suit/space/void) && W.contents.len)
|
|
to_chat(user, SPAN_NOTICE("Remove any accessories, helmets, magboots, or oxygen tanks before attempting to convert this voidsuit."))
|
|
return
|
|
user.drop_item(W)
|
|
qdel(W)
|
|
playsound(src.loc, 'sound/weapons/blade_open.ogg', 50, 1)
|
|
var/obj/item/P = new voidsuit_product(user.loc)
|
|
user.put_in_hands(P)
|
|
if(!reconverting)
|
|
to_chat(user, SPAN_NOTICE("Your permit for a [P] has been processed. Enjoy!"))
|
|
else
|
|
to_chat(user, SPAN_NOTICE("Your Himean voidsuit part has been reconverted into [P]."))
|
|
return
|
|
else
|
|
return ..() |