diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm
index e26edd4ccb3..0052c80df84 100644
--- a/_maps/map_files/cyberiad/z2.dmm
+++ b/_maps/map_files/cyberiad/z2.dmm
@@ -3248,8 +3248,6 @@
/area/shuttle/assault_pod)
"iw" = (
/obj/structure/rack,
-/obj/item/clothing/suit/space/eva/plasmaman/wizard,
-/obj/item/clothing/head/helmet/space/eva/plasmaman/wizard,
/obj/item/clothing/mask/breath,
/obj/item/clothing/mask/breath/vox,
/obj/item/tank/plasma/plasmaman,
diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm
index 1ccb0cd0786..2f296960622 100644
--- a/code/__DEFINES/atmospherics.dm
+++ b/code/__DEFINES/atmospherics.dm
@@ -123,6 +123,7 @@
#define TANK_RUPTURE_PRESSURE (40.*ONE_ATMOSPHERE) //Tank spills all contents into atmosphere
#define TANK_FRAGMENT_PRESSURE (50.*ONE_ATMOSPHERE) //Boom 3x3 base explosion
#define TANK_FRAGMENT_SCALE (10.*ONE_ATMOSPHERE) //+1 for each SCALE kPa aboe threshold
+#define TANK_DEFAULT_RELEASE_PRESSURE 16
// Atmos alarm defines
#define ATMOS_ALARM_NONE 0
diff --git a/code/__DEFINES/sight.dm b/code/__DEFINES/sight.dm
index 54162cd0f96..58f557c4b75 100644
--- a/code/__DEFINES/sight.dm
+++ b/code/__DEFINES/sight.dm
@@ -32,3 +32,10 @@
#define SECHUD 1
#define MEDHUD 2
#define ANTAGHUD 3
+
+//for clothing visor toggles, these determine which vars to toggle
+#define VISOR_FLASHPROTECT (1<<0)
+#define VISOR_TINT (1<<1)
+#define VISOR_VISIONFLAGS (1<<2) //all following flags only matter for glasses
+#define VISOR_DARKNESSVIEW (1<<3)
+#define VISOR_INVISVIEW (1<<4)
\ No newline at end of file
diff --git a/code/_onclick/hud/blob_overmind.dm b/code/_onclick/hud/blob_overmind.dm
index 1e8f99814df..c1f14fc625d 100644
--- a/code/_onclick/hud/blob_overmind.dm
+++ b/code/_onclick/hud/blob_overmind.dm
@@ -49,8 +49,8 @@
/obj/screen/blob/Blobbernaut
icon_state = "ui_blobbernaut"
- name = "Produce Blobbernaut (20)"
- desc = "Produces a strong, but dumb blobbernaut from a factory blob for 20 resources.
The factory blob will be destroyed in the process."
+ name = "Produce Blobbernaut (60)"
+ desc = "Produces a strong, intelligent blobbernaut from a factory blob for 60 resources.
The factory blob will be destroyed in the process."
/obj/screen/blob/Blobbernaut/Click()
if(isovermind(usr))
diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm
index 3dde11b975d..e60200b967a 100644
--- a/code/_onclick/hud/parallax.dm
+++ b/code/_onclick/hud/parallax.dm
@@ -152,6 +152,8 @@
/datum/hud/proc/update_parallax()
var/client/C = mymob.client
var/turf/posobj = get_turf(C.eye)
+ if(!posobj)
+ return
var/area/areaobj = posobj.loc
// Update the movement direction of the parallax if necessary (for shuttles)
diff --git a/code/datums/action.dm b/code/datums/action.dm
index a5f63cc6fe4..6a2f02c2562 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -196,6 +196,14 @@
/datum/action/item_action/toggle_helmet_light
name = "Toggle Helmet Light"
+/datum/action/item_action/toggle_welding_screen/plasmaman
+ name = "Toggle Welding Screen"
+
+/datum/action/item_action/toggle_welding_screen/plasmaman/Trigger()
+ var/obj/item/clothing/head/helmet/space/plasmaman/H = target
+ if(istype(H))
+ H.toggle_welding_screen(owner)
+
/datum/action/item_action/toggle_helmet_mode
name = "Toggle Helmet Mode"
diff --git a/code/datums/outfits/plasmamen.dm b/code/datums/outfits/plasmamen.dm
new file mode 100644
index 00000000000..c14eafd08f2
--- /dev/null
+++ b/code/datums/outfits/plasmamen.dm
@@ -0,0 +1,178 @@
+/datum/outfit/plasmaman
+ name = "Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman
+ uniform = /obj/item/clothing/under/plasmaman
+ r_hand = /obj/item/tank/plasma/plasmaman/belt/full
+ mask = /obj/item/clothing/mask/breath
+
+/datum/outfit/plasmaman/bar
+ name = "Bartender Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/white
+ uniform = /obj/item/clothing/under/plasmaman/enviroslacks
+
+/datum/outfit/plasmaman/chef
+ name = "Chef Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/chef
+ uniform = /obj/item/clothing/under/plasmaman/chef
+
+/datum/outfit/plasmaman/botany
+ name = "Botany Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/botany
+ uniform = /obj/item/clothing/under/plasmaman/botany
+
+/datum/outfit/plasmaman/librarian
+ name = "Librarian Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/librarian
+ uniform = /obj/item/clothing/under/plasmaman/librarian
+
+/datum/outfit/plasmaman/chaplain
+ name = "Chaplain Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/chaplain
+ uniform = /obj/item/clothing/under/plasmaman/chaplain
+
+/datum/outfit/plasmaman/janitor
+ name = "Janitor Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/janitor
+ uniform = /obj/item/clothing/under/plasmaman/janitor
+
+/datum/outfit/plasmaman/security
+ name = "Security Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/security
+ uniform = /obj/item/clothing/under/plasmaman/security
+
+/datum/outfit/plasmaman/detective
+ name = "Detective Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/white
+ uniform = /obj/item/clothing/under/plasmaman/enviroslacks
+ l_ear = /obj/item/radio/headset/headset_sec
+
+/datum/outfit/plasmaman/warden
+ name = "Warden Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/security/warden
+ uniform = /obj/item/clothing/under/plasmaman/security/warden
+
+/datum/outfit/plasmaman/hos
+ name = "Head of Security Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/security/hos
+ uniform = /obj/item/clothing/under/plasmaman/security/hos
+
+/datum/outfit/plasmaman/cargo
+ name = "Cargo Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/cargo
+ uniform = /obj/item/clothing/under/plasmaman/cargo
+
+/datum/outfit/plasmaman/mining
+ name = "Mining Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/mining
+ uniform = /obj/item/clothing/under/plasmaman/mining
+
+/datum/outfit/plasmaman/medical
+ name = "Medical Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/medical
+ uniform = /obj/item/clothing/under/plasmaman/medical
+
+/datum/outfit/plasmaman/cmo
+ name = "Chief Medical Officer Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/cmo
+ uniform = /obj/item/clothing/under/plasmaman/cmo
+
+/datum/outfit/plasmaman/viro
+ name = "Virology Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/viro
+ uniform = /obj/item/clothing/under/plasmaman/viro
+
+/datum/outfit/plasmaman/chemist
+ name = "Chemist Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/chemist
+ uniform = /obj/item/clothing/under/plasmaman/chemist
+
+/datum/outfit/plasmaman/genetics
+ name = "Genetics Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/genetics
+ uniform = /obj/item/clothing/under/plasmaman/genetics
+
+/datum/outfit/plasmaman/science
+ name = "Science Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/science
+ uniform = /obj/item/clothing/under/plasmaman/science
+
+/datum/outfit/plasmaman/rd
+ name = "Research Director Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/rd
+ uniform = /obj/item/clothing/under/plasmaman/rd
+
+/datum/outfit/plasmaman/robotics
+ name = "Robotics Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/robotics
+ uniform = /obj/item/clothing/under/plasmaman/robotics
+
+/datum/outfit/plasmaman/engineering
+ name = "Engineering Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/engineering
+ uniform = /obj/item/clothing/under/plasmaman/engineering
+
+/datum/outfit/plasmaman/ce
+ name = "Chief Engineer Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/engineering/ce
+ uniform = /obj/item/clothing/under/plasmaman/engineering/ce
+
+/datum/outfit/plasmaman/atmospherics
+ name = "Atmospherics Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/atmospherics
+ uniform = /obj/item/clothing/under/plasmaman/atmospherics
+
+/datum/outfit/plasmaman/mime
+ name = "Plasmamime"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/mime
+ uniform = /obj/item/clothing/under/plasmaman/mime
+ mask = /obj/item/clothing/mask/gas/mime
+
+/datum/outfit/plasmaman/clown
+ name = "Plasmaclown"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/clown
+ uniform = /obj/item/clothing/under/plasmaman/clown
+ mask = /obj/item/clothing/mask/gas/clown_hat
+
+/datum/outfit/plasmaman/hop
+ name = "Head of Personnel Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/hop
+ uniform = /obj/item/clothing/under/plasmaman/hop
+
+/datum/outfit/plasmaman/captain
+ name = "Captain Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/captain
+ uniform = /obj/item/clothing/under/plasmaman/captain
+
+/datum/outfit/plasmaman/blueshield
+ name = "Blueshield Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/blueshield
+ uniform = /obj/item/clothing/under/plasmaman/blueshield
\ No newline at end of file
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 7a63fa1571f..9345387e304 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -160,12 +160,16 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
containername = "vox life support supplies crate"
/datum/supply_packs/emergency/plasmamansupport
- name = "Plasmaman Life Support Supplies"
- contains = list(/obj/item/clothing/mask/breath,
- /obj/item/tank/emergency_oxygen/plasma,
- /obj/item/clothing/suit/space/eva/plasmaman,
- /obj/item/clothing/head/helmet/space/eva/plasmaman)
- cost = 75
+ name = "Plasmaman Supply Kit"
+ contains = list(/obj/item/clothing/under/plasmaman,
+ /obj/item/clothing/under/plasmaman,
+ /obj/item/tank/plasma/plasmaman/belt/full,
+ /obj/item/tank/plasma/plasmaman/belt/full,
+ /obj/item/clothing/mask/breath,
+ /obj/item/clothing/mask/breath,
+ /obj/item/clothing/head/helmet/space/plasmaman,
+ /obj/item/clothing/head/helmet/space/plasmaman)
+ cost = 20
containertype = /obj/structure/closet/crate/secure/plasma
containername = "plasmaman life support supplies crate"
access = access_eva
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index bf2143b9784..f15f1dc742c 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -163,10 +163,10 @@
icon_state = "blobbernaut"
icon_living = "blobbernaut"
icon_dead = "blobbernaut_dead"
- health = 240
- maxHealth = 240
- melee_damage_lower = 20
- melee_damage_upper = 20
+ health = 200
+ maxHealth = 200
+ melee_damage_lower = 10
+ melee_damage_upper = 15
obj_damage = 60
attacktext = "hits"
attack_sound = 'sound/effects/blobattack.ogg'
@@ -175,18 +175,48 @@
maxbodytemp = 360
force_threshold = 10
mob_size = MOB_SIZE_LARGE
- environment_smash = ENVIRONMENT_SMASH_RWALLS
+ environment_smash = ENVIRONMENT_SMASH_STRUCTURES
pressure_resistance = 100 //100 kPa difference required to push
throw_pressure_limit = 120 //120 kPa difference required to throw
see_in_dark = 8
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
+/mob/living/simple_animal/hostile/blob/blobbernaut/Life(seconds, times_fired)
+ if(stat != DEAD && (getBruteLoss() || getFireLoss())) // Heal on blob structures
+ if(locate(/obj/structure/blob) in get_turf(src))
+ adjustBruteLoss(-0.25)
+ adjustFireLoss(-0.25)
+ else
+ adjustBruteLoss(0.2) // If you are at full health, you won't lose health. You'll need it. However the moment anybody sneezes on you, the decaying will begin.
+ adjustFireLoss(0.2)
+
/mob/living/simple_animal/hostile/blob/blobbernaut/blob_act()
return
+/mob/living/simple_animal/hostile/blob/blobbernaut/New()
+ ..()
+ if(name == "blobbernaut")
+ name = text("blobbernaut ([rand(1, 1000)])")
+
/mob/living/simple_animal/hostile/blob/blobbernaut/death(gibbed)
// Only execute the below if we successfully died
. = ..()
if(!.)
return FALSE
flick("blobbernaut_death", src)
+
+/mob/living/simple_animal/hostile/blob/blobbernaut/verb/communicate_overmind()
+ set category = "Blobbernaut"
+ set name = "Blob Telepathy"
+ set desc = "Send a message to the Overmind"
+
+ if(stat != DEAD)
+ blob_talk()
+
+/mob/living/simple_animal/hostile/blob/blobbernaut/proc/blob_talk()
+ var/message = input(src, "Announce to the overmind", "Blob Telepathy")
+ var/rendered = "Blob Telepathy, [name]([overmind]) states, \"[message]\""
+ if(message)
+ for(var/mob/M in GLOB.mob_list)
+ if(isovermind(M) || isobserver(M) || istype((M), /mob/living/simple_animal/hostile/blob/blobbernaut))
+ M.show_message(rendered, 2)
\ No newline at end of file
diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm
index 4489aaf707b..d4d9dc15c58 100644
--- a/code/game/gamemodes/blob/overmind.dm
+++ b/code/game/gamemodes/blob/overmind.dm
@@ -84,7 +84,7 @@
var/rendered = "Blob Telepathy, [name]([blob_reagent_datum.name]) [verb] \"[message]\""
for(var/mob/M in GLOB.mob_list)
- if(isovermind(M) || isobserver(M))
+ if(isovermind(M) || isobserver(M) || istype((M), /mob/living/simple_animal/hostile/blob/blobbernaut))
M.show_message(rendered, 2)
/mob/camera/blob/emote(act, m_type = 1, message = null, force)
diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm
index d6d4a91cf19..f90cfc94480 100644
--- a/code/game/gamemodes/blob/powers.dm
+++ b/code/game/gamemodes/blob/powers.dm
@@ -208,7 +208,7 @@
/mob/camera/blob/verb/create_blobbernaut()
set category = "Blob"
- set name = "Create Blobbernaut (20)"
+ set name = "Create Blobbernaut (60)"
set desc = "Create a powerful blob-being, a Blobbernaut"
var/turf/T = get_turf(src)
@@ -225,7 +225,7 @@
to_chat(src, "Unable to use this blob, find a factory blob.")
return
- if(!can_buy(20))
+ if(!can_buy(60))
return
var/mob/living/simple_animal/hostile/blob/blobbernaut/blobber = new /mob/living/simple_animal/hostile/blob/blobbernaut (get_turf(B))
@@ -234,6 +234,14 @@
blobber.color = blob_reagent_datum.complementary_color
blobber.overmind = src
blob_mobs.Add(blobber)
+ spawn()
+ var/list/candidates = pollCandidates("Do you want to play as a blobbernaut?", ROLE_BLOB, 1, 150)
+ if(candidates.len)
+ var/mob/C = pick(candidates)
+ if(C)
+ blobber.key = C.key
+ to_chat(blobber, "You are a blobbernaut! You must assist all blob lifeforms in their mission to consume everything!")
+ to_chat(blobber, "You heal while standing on blob structures, however you will decay slowly if you are damaged outside of the blob.")
return
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index e4274d18d49..fe0980a24cd 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -344,21 +344,6 @@
else
to_chat(C, "The veil cannot be torn here!")
-/obj/item/clothing/suit/space/eva/plasmaman/cultist
- name = "plasmaman cultist armor"
- icon_state = "plasmaman_cult"
- item_state = "plasmaman_cult"
- desc = "A bulky suit of armour, menacing with red energy. It looks like it would fit a plasmaman."
- slowdown = 1
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/cultist
- name = "plasmaman cultist helmet"
- icon_state = "plasmamanCult_helmet0"
- base_state = "plasmamanCult_helmet"
- desc = "A helmet designed by cultists. It glows menacingly with unearthly flames."
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
-
/obj/item/melee/cultblade/ghost
name = "eldritch sword"
force = 15
diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm
index 08633ef92f4..179425d320d 100644
--- a/code/game/gamemodes/cult/talisman.dm
+++ b/code/game/gamemodes/cult/talisman.dm
@@ -291,11 +291,8 @@
var/mob/living/carbon/human/H = user
user.visible_message("Otherworldly armor suddenly appears on [user]!", \
"You speak the words of the talisman, arming yourself!")
- if(isplasmaman(H))
- H.equip_to_slot(new /obj/item/clothing/suit/space/eva/plasmaman/cultist(H), slot_wear_suit)
- H.equip_to_slot(new /obj/item/clothing/head/helmet/space/eva/plasmaman/cultist(H), slot_head)
- else
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/hooded/cultrobes/alt(user), slot_wear_suit)
+
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/hooded/cultrobes/alt(user), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/storage/backpack/cultpack(user), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult(user), slot_shoes)
H.put_in_hands(new /obj/item/melee/cultblade(user))
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index cf808f3709d..2d7c9cff015 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -291,11 +291,9 @@ proc/issyndicate(mob/living/M as mob)
if("Plasmaman")
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(synd_mob), slot_wear_mask)
- synd_mob.equip_to_slot(new /obj/item/clothing/suit/space/eva/plasmaman/nuclear(synd_mob), slot_wear_suit)
- synd_mob.equip_to_slot(new /obj/item/clothing/head/helmet/space/eva/plasmaman/nuclear(synd_mob), slot_head)
synd_mob.equip_or_collect(new /obj/item/tank/plasma/plasmaman(synd_mob), slot_s_store)
- synd_mob.equip_or_collect(new /obj/item/plasmensuit_cartridge(synd_mob), slot_in_backpack)
- synd_mob.equip_or_collect(new /obj/item/plasmensuit_cartridge(synd_mob), slot_in_backpack)
+ synd_mob.equip_or_collect(new /obj/item/extinguisher_refill(synd_mob), slot_in_backpack)
+ synd_mob.equip_or_collect(new /obj/item/extinguisher_refill(synd_mob), slot_in_backpack)
synd_mob.internal = synd_mob.get_item_by_slot(slot_s_store)
synd_mob.update_action_buttons_icon()
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index 09de3f917bd..b11c43299ad 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -76,14 +76,19 @@ var/bomb_set
if(panel_open && (istype(O, /obj/item/multitool) || istype(O, /obj/item/wirecutters)))
return attack_hand(user)
-
- if(extended)
- if(istype(O, /obj/item/disk/nuclear))
- usr.drop_item()
- O.loc = src
+
+ if(istype(O, /obj/item/disk/nuclear))
+ if(extended)
+ if(!user.drop_item())
+ to_chat(user, "\The [O] is stuck to your hand!")
+ return
+ O.forceMove(src)
auth = O
add_fingerprint(user)
return attack_hand(user)
+ else
+ to_chat(user, "You need to deploy \the [src] first. Right click on the sprite, select 'Make Deployable' then click on \the [src] with an empty hand.")
+ return
if(anchored)
switch(removal_stage)
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 1d05204e381..1ce0bcd97e7 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -178,6 +178,12 @@
if(occupant && occupant.stat != DEAD)
to_chat(user, "Current clone cycle is [round(get_completion())]% complete.")
+/obj/machinery/clonepod/return_air() //non-reactive air
+ var/datum/gas_mixture/GM = new
+ GM.nitrogen = MOLES_O2STANDARD + MOLES_N2STANDARD
+ GM.temperature = T20C
+ return GM
+
/obj/machinery/clonepod/proc/get_completion()
. = (100 * ((occupant.health + 100) / (heal_level + 100)))
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index b8c0f3d02f4..1284a9a485c 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -510,6 +510,7 @@ About the new airlock wires panel:
else
to_chat(user, "There's a [note.name] pinned to the front...")
note.examine(user)
+ to_chat(user, "Use an empty hand on the airlock on grab mode to remove [note.name].")
if(panel_open)
switch(security_level)
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index db7c08b1863..aebe5097174 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -133,12 +133,9 @@ var/global/list/datum/stack_recipe/sinew_recipes = list ( \
can_strengthen_clothing = typecacheof(list(
/obj/item/clothing/suit/space/hardsuit/mining,
/obj/item/clothing/head/helmet/space/hardsuit/mining,
- /obj/item/clothing/suit/space/eva/plasmaman/miner,
- /obj/item/clothing/head/helmet/space/eva/plasmaman/miner,
/obj/item/clothing/suit/hooded/explorer,
/obj/item/clothing/head/hooded/explorer,
- /obj/item/clothing/suit/space/eva/plasmaman/explorer,
- /obj/item/clothing/head/helmet/space/eva/plasmaman/explorer
+ /obj/item/clothing/head/helmet/space/plasmaman/mining
))
/obj/item/stack/sheet/animalhide/goliath_hide/afterattack(atom/target, mob/user, proximity_flag)
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index fbdc403d758..45309b381c0 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -45,7 +45,7 @@
/obj/item/defibrillator/examine(mob/user)
..(user)
- to_chat(user,"Ctrl-click to remove the paddles from the defibrillator.")
+ to_chat(user, "Ctrl-click to remove the paddles from the defibrillator.")
/obj/item/defibrillator/proc/update_power()
if(bcell)
diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm
index c047fc82abd..72394db2733 100644
--- a/code/game/objects/items/weapons/tanks/jetpack.dm
+++ b/code/game/objects/items/weapons/tanks/jetpack.dm
@@ -163,6 +163,15 @@
to_chat(user, "The meter on [src] indicates you are almost out of air!")
playsound(user, 'sound/effects/alert.ogg', 50, 1)
+/obj/item/tank/jetpack/carbondioxide/mining
+ name = "mining jetpack"
+ icon_state = "jetpack-mining"
+ item_state = "jetpack-mining"
+ origin_tech = "materials=4;magnets=4;engineering=5"
+ desc = "A tank of compressed carbon dioxide for miners to use as propulsion in local space. The compact size allows for easy storage at the cost of capacity."
+ volume = 40
+ throw_range = 7
+ w_class = WEIGHT_CLASS_NORMAL //same as syndie harness
/obj/item/tank/jetpack/rig
name = "jetpack"
diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm
index 047f3d4ef3a..ea178aa3345 100644
--- a/code/game/objects/items/weapons/tanks/tank_types.dm
+++ b/code/game/objects/items/weapons/tanks/tank_types.dm
@@ -110,9 +110,12 @@ obj/item/tank/oxygen/empty/New()
air_contents.toxins = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
/obj/item/tank/plasma/plasmaman
- desc = "The lifeblood of plasmamen. Warning: Extremely flammable, do not inhale (unless you're a plasman)."
- icon_state = "plasma_fr"
- distribute_pressure = ONE_ATMOSPHERE*O2STANDARD
+ name = "plasma internals tank"
+ desc = "A tank of plasma gas designed specifically for use as internals, particularly for plasma-based lifeforms. If you're not a Plasmaman, you probably shouldn't use this."
+ icon_state = "plasmaman_tank"
+ item_state = "plasmaman_tank"
+ force = 10
+ distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE
/obj/item/tank/plasma/plasmaman/examine(mob/user)
if(..(user, 0))
@@ -120,6 +123,19 @@ obj/item/tank/oxygen/empty/New()
to_chat(user, text("The meter on the [src.name] indicates you are almost out of plasma!"))
user << sound('sound/effects/alert.ogg')
+
+/obj/item/tank/plasma/plasmaman/belt
+ icon_state = "plasmaman_tank_belt"
+ item_state = "plasmaman_tank_belt"
+ slot_flags = SLOT_BELT
+ force = 5
+ volume = 25
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/tank/plasma/plasmaman/belt/full/New()
+ ..()
+ air_contents.toxins = (10 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C)
+
/*
* Emergency Oxygen
*/
diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
index acedb317bb3..d22f0a59a61 100644
--- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
@@ -6,203 +6,194 @@
icon_state = "fireaxe1000"
icon_closed = "fireaxe1000"
icon_opened = "fireaxe1100"
- anchored = 1
- density = 0
+ anchored = TRUE
+ density = FALSE
armor = list(melee = 50, bullet = 50, laser = 50, energy = 100, bomb = 10, bio = 100, rad = 100)
- var/localopened = 0 //Setting this to keep it from behaviouring like a normal closet and obstructing movement in the map. -Agouri
- opened = 1
- var/hitstaken = 0
- locked = 1
- var/smashed = 0
+ var/localopened = FALSE //Setting this to keep it from behaviouring like a normal closet and obstructing movement in the map. -Agouri
+ opened = TRUE
+ var/hitstaken = FALSE
+ locked = TRUE
+ var/smashed = FALSE
- attackby(var/obj/item/O as obj, var/mob/living/user as mob) //Marker -Agouri
- //..() //That's very useful, Erro
+/obj/structure/closet/fireaxecabinet/examine(mob/user)
+ . = ..()
+ to_chat(user, "Use a multitool to lock/unlock it.")
- var/hasaxe = 0 //gonna come in handy later~
- if(fireaxe)
- hasaxe = 1
-
- if(isrobot(user) || src.locked)
- if(istype(O, /obj/item/multitool))
- to_chat(user, "Resetting circuitry...")
- playsound(user, 'sound/machines/lockreset.ogg', 50, 1)
- if(do_after(user, 20 * O.toolspeed, target = src))
- src.locked = 0
- to_chat(user, " You disable the locking modules.")
- update_icon()
- return
- else if(istype(O, /obj/item))
- user.changeNext_move(CLICK_CD_MELEE)
- var/obj/item/W = O
- if(src.smashed || src.localopened)
- if(localopened)
- localopened = 0
- icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
- return
- else
- user.do_attack_animation(src)
- playsound(user, 'sound/effects/Glasshit.ogg', 100, 1) //We don't want this playing every time
- if(W.force < 15)
- to_chat(user, "The cabinet's protective glass glances off the hit.")
- else
- src.hitstaken++
- if(src.hitstaken == 4)
- playsound(user, 'sound/effects/glassbr3.ogg', 100, 1) //Break cabinet, receive goodies. Cabinet's fucked for life after that.
- src.smashed = 1
- src.locked = 0
- src.localopened = 1
+/obj/structure/closet/fireaxecabinet/attackby(var/obj/item/O as obj, var/mob/living/user as mob) //Marker -Agouri
+ if(isrobot(user) || locked)
+ if(istype(O, /obj/item/multitool))
+ to_chat(user, "Resetting circuitry...")
+ playsound(user, 'sound/machines/lockreset.ogg', 50, 1)
+ if(do_after(user, 20 * O.toolspeed, target = src))
+ locked = FALSE
+ to_chat(user, " You disable the locking modules.")
update_icon()
return
- if(istype(O, /obj/item/twohanded/fireaxe) && src.localopened)
- if(!fireaxe)
- if(O:wielded)
- to_chat(user, "Unwield the axe first.")
- return
- fireaxe = O
- user.drop_item(O)
- src.contents += O
- to_chat(user, "You place the fire axe back in the [src.name].")
- update_icon()
- else
- if(src.smashed)
- return
- else
- localopened = !localopened
- if(localopened)
- icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
- else
- icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
- else
- if(src.smashed)
- return
- if(istype(O, /obj/item/multitool))
+ else if(istype(O, /obj/item))
+ user.changeNext_move(CLICK_CD_MELEE)
+ var/obj/item/W = O
+ if(smashed || localopened)
if(localopened)
- localopened = 0
- icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
- return
- else
- to_chat(user, "Resetting circuitry...")
- sleep(50)
- src.locked = 1
- to_chat(user, "You re-enable the locking modules.")
- playsound(user, 'sound/machines/lockenable.ogg', 50, 1)
- if(do_after(user, 20 * O.toolspeed, target = src))
- src.locked = 1
- to_chat(user, " You re-enable the locking modules.")
- return
+ localopened = FALSE
+ update_icon_closing()
+ return
+ else
+ user.do_attack_animation(src)
+ playsound(user, 'sound/effects/Glasshit.ogg', 100, 1) //We don't want this playing every time
+ if(W.force < 15)
+ to_chat(user, "The cabinet's protective glass glances off the hit.")
+ else
+ hitstaken++
+ if(hitstaken == 4)
+ playsound(user, 'sound/effects/glassbr3.ogg', 100, 1) //Break cabinet, receive goodies. Cabinet's fucked for life after that.
+ smashed = TRUE
+ locked = FALSE
+ localopened = TRUE
+ update_icon()
+ return
+ if(istype(O, /obj/item/twohanded/fireaxe) && localopened)
+ if(!fireaxe)
+ var/obj/item/twohanded/fireaxe/F = O
+ if(F.wielded)
+ to_chat(user, "Unwield \the [F] first.")
+ return
+ if(!user.unEquip(F, FALSE))
+ to_chat(user, "\The [F] stays stuck to your hands!")
+ return
+ fireaxe = F
+ contents += F
+ to_chat(user, "You place \the [F] back in the [name].")
+ update_icon()
+ else
+ if(smashed)
+ return
else
localopened = !localopened
if(localopened)
- icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
+ update_icon_opening()
else
- icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
-
-
-
-
- attack_hand(mob/user as mob)
-
- var/hasaxe = 0
- if(fireaxe)
- hasaxe = 1
-
- if(src.locked)
- to_chat(user, "The cabinet won't budge!")
+ update_icon_closing()
+ else
+ if(smashed)
return
- if(localopened)
- if(fireaxe)
- user.put_in_hands(fireaxe)
- fireaxe = null
- to_chat(user, "You take the fire axe from the [name].")
- src.add_fingerprint(user)
- update_icon()
- else
- if(src.smashed)
- return
- else
- localopened = !localopened
- if(localopened)
- src.icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
- else
- src.icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
-
- else
- localopened = !localopened //I'm pretty sure we don't need an if(src.smashed) in here. In case I'm wrong and it fucks up teh cabinet, **MARKER**. -Agouri
+ if(istype(O, /obj/item/multitool))
if(localopened)
- src.icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
+ localopened = FALSE
+ update_icon_closing()
+ return
else
- src.icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
-
- attack_tk(mob/user as mob)
- if(localopened && fireaxe)
- fireaxe.forceMove(loc)
- to_chat(user, "You telekinetically remove the fire axe.")
- fireaxe = null
- update_icon()
- return
- attack_hand(user)
-
- verb/toggle_openness() //nice name, huh? HUH?! -Erro //YEAH -Agouri
- set name = "Open/Close"
- set category = "Object"
-
- if(isrobot(usr) || src.locked || src.smashed)
- if(src.locked)
- to_chat(usr, "The cabinet won't budge!")
- else if(src.smashed)
- to_chat(usr, "The protective glass is broken!")
- return
-
- localopened = !localopened
- update_icon()
-
- verb/remove_fire_axe()
- set name = "Remove Fire Axe"
- set category = "Object"
-
- if(isrobot(usr))
- return
-
- if(localopened)
- if(fireaxe)
- usr.put_in_hands(fireaxe)
- fireaxe = null
- to_chat(usr, "You take the Fire axe from the [name].")
- else
- to_chat(usr, "The [src.name] is empty.")
+ to_chat(user, "Resetting circuitry...")
+ playsound(user, 'sound/machines/lockenable.ogg', 50, 1)
+ if(do_after(user, 20 * O.toolspeed, target = src))
+ locked = TRUE
+ to_chat(user, " You re-enable the locking modules.")
+ return
else
- to_chat(usr, "The [src.name] is closed.")
- update_icon()
-
- attack_ai(mob/user as mob)
- if(src.smashed)
- to_chat(user, "The security of the cabinet is compromised.")
- return
- else
- locked = !locked
- if(locked)
- to_chat(user, "Cabinet locked.")
+ localopened = !localopened
+ if(localopened)
+ update_icon_opening()
else
- to_chat(user, "Cabinet unlocked.")
+ update_icon_closing()
- update_icon() //Template: fireaxe[has fireaxe][is opened][hits taken][is smashed]. If you want the opening or closing animations, add "opening" or "closing" right after the numbers
- var/hasaxe = 0
+/obj/structure/closet/fireaxecabinet/attack_hand(mob/user as mob)
+ if(locked)
+ to_chat(user, "The cabinet won't budge!")
+ return
+ if(localopened)
if(fireaxe)
- hasaxe = 1
- icon_state = text("fireaxe[][][][]",hasaxe,src.localopened,src.hitstaken,src.smashed)
+ user.put_in_hands(fireaxe)
+ to_chat(user, "You take \the [fireaxe] from the [src].")
+ fireaxe = null
+
+ add_fingerprint(user)
+ update_icon()
+ else
+ if(smashed)
+ return
+ else
+ localopened = !localopened
+ if(localopened)
+ update_icon_opening()
+ else
+ update_icon_closing()
- open()
+ else
+ localopened = !localopened //I'm pretty sure we don't need an if(smashed) in here. In case I'm wrong and it fucks up teh cabinet, **MARKER**. -Agouri
+ if(localopened)
+ update_icon_opening()
+ else
+ update_icon_closing()
+
+/obj/structure/closet/fireaxecabinet/attack_tk(mob/user as mob)
+ if(localopened && fireaxe)
+ fireaxe.forceMove(loc)
+ to_chat(user, "You telekinetically remove \the [fireaxe].")
+ fireaxe = null
+ update_icon()
+ return
+ attack_hand(user)
+
+/obj/structure/closet/fireaxecabinet/verb/toggle_openness() //nice name, huh? HUH?! -Erro //YEAH -Agouri
+ set name = "Open/Close"
+ set category = "Object"
+
+ if(isrobot(usr) || locked || smashed)
+ if(locked)
+ to_chat(usr, "The cabinet won't budge!")
+ else if(smashed)
+ to_chat(usr, "The protective glass is broken!")
return
- close()
- return
\ No newline at end of file
+ localopened = !localopened
+ update_icon()
+
+/obj/structure/closet/fireaxecabinet/verb/remove_fire_axe()
+ set name = "Remove Fire Axe"
+ set category = "Object"
+
+ if(isrobot(usr))
+ return
+
+ if(localopened)
+ if(fireaxe)
+ usr.put_in_hands(fireaxe)
+ to_chat(usr, "You take \the [fireaxe] from the [src].")
+ fireaxe = null
+ else
+ to_chat(usr, "The [src] is empty.")
+ else
+ to_chat(usr, "The [src] is closed.")
+ update_icon()
+
+/obj/structure/closet/fireaxecabinet/attack_ai(mob/user as mob)
+ if(smashed)
+ to_chat(user, "The security of the cabinet is compromised.")
+ return
+ else
+ locked = !locked
+ if(locked)
+ to_chat(user, "Cabinet locked.")
+ else
+ to_chat(user, "Cabinet unlocked.")
+
+/obj/structure/closet/fireaxecabinet/proc/update_icon_opening()
+ var/hasaxe = fireaxe != null
+ icon_state = "fireaxe[hasaxe][localopened][hitstaken][smashed]opening"
+ spawn(10)
+ update_icon()
+
+/obj/structure/closet/fireaxecabinet/proc/update_icon_closing()
+ var/hasaxe = fireaxe != null
+ icon_state = "fireaxe[hasaxe][localopened][hitstaken][smashed]closing"
+ spawn(10)
+ update_icon()
+
+/obj/structure/closet/fireaxecabinet/update_icon() //Template: fireaxe[has fireaxe][is opened][hits taken][is smashed]. If you want the opening or closing animations, add "opening" or "closing" right after the numbers
+ var/hasaxe = fireaxe != null
+ icon_state = "fireaxe[hasaxe][localopened][hitstaken][smashed]"
+
+/obj/structure/closet/fireaxecabinet/open()
+ return
+
+/obj/structure/closet/fireaxecabinet/close()
+ return
\ No newline at end of file
diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm
index 345d35cb4aa..6d41209aa94 100644
--- a/code/game/objects/structures/signs.dm
+++ b/code/game/objects/structures/signs.dm
@@ -145,6 +145,12 @@
name = "\improper RADIOACTIVE AREA"
desc = "A warning sign which reads 'RADIOACTIVE AREA'."
+/obj/structure/sign/xeno_warning_mining
+ name = "DANGEROUS ALIEN LIFE"
+ desc = "A sign that warns would be travellers of hostile alien life in the vicinity."
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "xeno_warning"
+
/obj/structure/sign/redcross
name = "medbay"
desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here.'"
@@ -210,7 +216,7 @@
desc = "A glowing dragon invites you in."
icon_state = "chinese"
-/obj/structure/sign/science
+/obj/structure/sign/science
name = "\improper SCIENCE!"
desc = "A warning sign which reads 'SCIENCE!'"
icon_state = "science1"
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index 2d4092ff159..744cb44ea63 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -143,7 +143,7 @@
if("5")
karma_purchase(karma,45,"species","Slime People")
if("6")
- karma_purchase(karma,100,"species","Plasmaman")
+ karma_purchase(karma,45,"species","Plasmaman")
if("7")
karma_purchase(karma,30,"species","Drask")
if(href_list["KarmaRefund"])
@@ -401,7 +401,7 @@
if(!winexists(src, "asset_cache_browser")) // The client is using a custom skin, tell them.
to_chat(src, "Unable to access asset cache browser, if you are using a custom skin file, please allow DS to download the updated version, if you are not, then make a bug report. This is not a critical issue but can cause issues with resource downloading, as it is impossible to know when extra resources arrived to you.")
-
+
//This is down here because of the browse() calls in tooltip/New()
if(!tooltips)
tooltips = new /datum/tooltip(src)
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 19ce8a87516..39235918323 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -17,8 +17,10 @@
var/flash_protect = 0 //What level of bright light protection item has. 1 = Flashers, Flashes, & Flashbangs | 2 = Welding | -1 = OH GOD WELDING BURNT OUT MY RETINAS
var/tint = 0 //Sets the item's level of visual impairment tint, normally set to the same as flash_protect
var/up = 0 //but seperated to allow items to protect but not impair vision, like space helmets
+
var/visor_flags = 0 //flags that are added/removed when an item is adjusted up/down
var/visor_flags_inv = 0 //same as visor_flags, but for flags_inv
+ var/visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT | VISOR_VISIONFLAGS | VISOR_DARKNESSVIEW | VISOR_INVISVIEW //what to toggle when toggled with weldingvisortoggle()
var/toggle_message = null
var/alt_toggle_message = null
@@ -29,6 +31,39 @@
var/species_disguise = null
var/magical = FALSE
+/obj/item/clothing/proc/weldingvisortoggle(mob/user) //proc to toggle welding visors on helmets, masks, goggles, etc.
+ if(!can_use(user))
+ return FALSE
+
+ visor_toggling()
+
+ to_chat(user, "You adjust \the [src] [up ? "up" : "down"].")
+
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ C.head_update(src, forced = 1)
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
+ return TRUE
+
+/obj/item/clothing/proc/visor_toggling() //handles all the actual toggling of flags
+ up = !up
+ flags ^= visor_flags
+ flags_inv ^= visor_flags_inv
+ flags_cover ^= initial(flags_cover)
+ icon_state = "[initial(icon_state)][up ? "up" : ""]"
+ if(visor_vars_to_toggle & VISOR_FLASHPROTECT)
+ flash_protect ^= initial(flash_protect)
+ if(visor_vars_to_toggle & VISOR_TINT)
+ tint ^= initial(tint)
+
+/obj/item/clothing/proc/can_use(mob/user)
+ if(user && ismob(user))
+ if(!user.incapacitated())
+ return TRUE
+ return FALSE
+
//BS12: Species-restricted clothing check.
/obj/item/clothing/mob_can_equip(M as mob, slot)
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index cb3f629a4dd..ac6c3b6dd0b 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -30,6 +30,21 @@
return
return ..()
+/obj/item/clothing/glasses/visor_toggling()
+ ..()
+ if(visor_vars_to_toggle & VISOR_VISIONFLAGS)
+ vision_flags ^= initial(vision_flags)
+ if(visor_vars_to_toggle & VISOR_DARKNESSVIEW)
+ see_in_dark ^= initial(see_in_dark)
+ if(visor_vars_to_toggle & VISOR_INVISVIEW)
+ invis_view ^= initial(invis_view)
+
+/obj/item/clothing/glasses/weldingvisortoggle(mob/user)
+ . = ..()
+ if(. && user)
+ user.update_sight()
+ user.update_inv_glasses()
+
/obj/item/clothing/glasses/meson
name = "Optical Meson Scanner"
desc = "Used for seeing walls, floors, and stuff through anything."
@@ -330,40 +345,15 @@
actions_types = list(/datum/action/item_action/toggle)
flash_protect = 2
tint = 2
-
+ visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
)
-/obj/item/clothing/glasses/welding/attack_self()
- toggle()
-
-/obj/item/clothing/glasses/welding/proc/toggle()
- if(up)
- up = !up
- flags_cover |= GLASSESCOVERSEYES
- flags_inv |= HIDEEYES
- icon_state = initial(icon_state)
- to_chat(usr, "You flip the [src] down to protect your eyes.")
- flash_protect = 2
- tint = initial(tint) //better than istype
- else
- up = !up
- flags_cover &= ~GLASSESCOVERSEYES
- flags_inv &= ~HIDEEYES
- icon_state = "[initial(icon_state)]up"
- to_chat(usr, "You push the [src] up out of your face.")
- flash_protect = 0
- tint = 0
- var/mob/living/carbon/user = usr
- user.update_tint()
- user.update_inv_glasses()
-
- for(var/X in actions)
- var/datum/action/A = X
- A.UpdateButtonIcon()
+/obj/item/clothing/glasses/welding/attack_self(mob/user)
+ weldingvisortoggle(user)
/obj/item/clothing/glasses/welding/superior
name = "superior welding goggles"
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 35f346402f9..0501171d650 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -24,6 +24,7 @@
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
flags_inv = (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE)
actions_types = list(/datum/action/item_action/toggle)
+ visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
burn_state = FIRE_PROOF
sprite_sheets = list(
@@ -34,6 +35,9 @@
"Grey" = 'icons/mob/species/grey/helmet.dmi'
)
+/obj/item/clothing/head/welding/attack_self(mob/user)
+ weldingvisortoggle(user)
+
/obj/item/clothing/head/welding/flamedecal
name = "flame decal welding helmet"
desc = "A welding helmet adorned with flame decals, and several cryptic slogans of varying degrees of legibility."
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 289250befac..db7295809b1 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -33,34 +33,12 @@
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
origin_tech = "materials=2;engineering=3"
actions_types = list(/datum/action/item_action/toggle)
+ flags_inv = HIDEEARS|HIDEEYES|HIDEFACE
+ flags_cover = MASKCOVERSEYES
+ visor_flags_inv = HIDEEYES
-/obj/item/clothing/mask/gas/welding/attack_self()
- toggle()
-
-/obj/item/clothing/mask/gas/welding/proc/toggle()
- if(up)
- up = !src.up
- flags_cover |= (MASKCOVERSEYES)
- flags_inv |= (HIDEEYES)
- icon_state = initial(icon_state)
- to_chat(usr, "You flip the [src] down to protect your eyes.")
- flash_protect = 2
- tint = 2
- else
- up = !up
- flags_cover &= ~(MASKCOVERSEYES)
- flags_inv &= ~(HIDEEYES)
- icon_state = "[initial(icon_state)]up"
- to_chat(usr, "You push the [src] up out of your face.")
- flash_protect = 0
- tint = 0
- var/mob/living/carbon/user = usr
- user.update_tint()
- user.update_inv_wear_mask() //so our mob-overlays update
-
- for(var/X in actions)
- var/datum/action/A = X
- A.UpdateButtonIcon()
+/obj/item/clothing/mask/gas/welding/attack_self(mob/user)
+ weldingvisortoggle(user)
/obj/item/clothing/mask/gas/explorer
name = "explorer gas mask"
diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm
index e355aead650..fef732ed01b 100644
--- a/code/modules/clothing/spacesuits/plasmamen.dm
+++ b/code/modules/clothing/spacesuits/plasmamen.dm
@@ -1,427 +1,250 @@
-// PLASMEN SHIT
-// CAN'T WEAR UNLESS YOU'RE A PINK SKELETON
-/obj/item/clothing/suit/space/eva/plasmaman
- name = "plasmaman suit"
- desc = "A special containment suit designed to protect a plasmaman's volatile body from outside exposure and quickly extinguish it in emergencies."
- allowed = list(/obj/item/gun,/obj/item/ammo_casing,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/melee/energy/sword/saber,/obj/item/restraints/handcuffs,/obj/item/tank)
- slowdown = 0
- armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
- heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
- body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
- flags_inv = HIDEGLOVES|HIDESHOES
- max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
- icon = 'icons/obj/clothing/species/plasmaman/suits.dmi'
- species_restricted = list("Plasmaman")
- sprite_sheets = list(
- "Plasmaman" = 'icons/mob/species/plasmaman/suit.dmi'
- )
- flags = STOPSPRESSUREDMAGE
- icon_state = "plasmaman_suit"
- item_state = "plasmaman_suit"
-
- var/next_extinguish = 0
- var/extinguish_cooldown = 10 SECONDS
- var/max_extinguishes = 5
- var/extinguishes_left = 5 // Yeah yeah, reagents, blah blah blah. This should be simple.
-
-/obj/item/clothing/suit/space/eva/plasmaman/proc/Extinguish(var/mob/user)
- var/mob/living/carbon/human/H=user
- if(extinguishes_left)
- if(next_extinguish > world.time)
- return
-
- next_extinguish = world.time + extinguish_cooldown
- extinguishes_left--
- to_chat(user, "You hear a soft click and a hiss from your suit as it automatically extinguishes the fire.")
- if(!extinguishes_left)
- to_chat(user, "Onboard auto-extinguisher depleted, refill with a cartridge.")
- playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3)
- H.ExtinguishMob()
-
-/obj/item/clothing/suit/space/eva/plasmaman/attackby(var/obj/item/A as obj, mob/user as mob, params)
- ..()
- if(istype(A, /obj/item/plasmensuit_cartridge)) //This suit can only be reloaded by the appropriate cartridges, and only if it's got no more extinguishes left.
- if(!extinguishes_left)
- extinguishes_left = max_extinguishes //Full replenishment from the cartridge.
- to_chat(user, "You replenish \the [src] with the cartridge.")
- qdel(A)
- else
- to_chat(user, "The suit must be depleted before it can be refilled.")
-
-/obj/item/clothing/suit/space/eva/plasmaman/examine(mob/user)
- ..(user)
- to_chat(user, "There are [extinguishes_left] extinguisher canisters left in this suit.")
-
-/obj/item/plasmensuit_cartridge //Can be used to refill Plasmaman suits when they run out of autoextinguishes.
- name = "auto-extinguisher cartridge"
- desc = "A tiny and light fibreglass-framed auto-extinguisher cartridge."
- icon = 'icons/obj/items.dmi'
- icon_state = "miniFE0"
- item_state = "miniFE"
- hitsound = null //Ultralight and
- flags = null //non-conductive
- force = 0
- throwforce = 0
- w_class = WEIGHT_CLASS_SMALL //Fits in boxes.
- materials = list()
- attack_verb = list("tapped")
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman
- name = "plasmaman helmet"
- desc = "A special containment helmet designed to protect a plasmaman's volatile body from outside exposure and quickly extinguish it in emergencies."
- flags = STOPSPRESSUREDMAGE
+//I just want the light feature of the hardsuit helmet
+/obj/item/clothing/head/helmet/space/plasmaman
+ name = "plasma envirosuit helmet"
+ desc = "A special containment helmet that allows plasma-based lifeforms to exist safely in an oxygenated environment. It is space-worthy, and may be worn in tandem with other EVA gear."
+ icon_state = "plasmaman-helm"
+ item_state = "plasmaman-helm"
+ strip_delay = 80
+ flash_protect = 2
+ tint = 2
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 0)
+ resistance_flags = FIRE_PROOF
+ var/brightness_on = 4 //luminosity when the light is on
+ var/on = FALSE
+ var/smile = FALSE
+ var/smile_color = "#FF0000"
+ var/visor_icon = "envisor"
+ var/smile_state = "envirohelm_smile"
+ actions_types = list(/datum/action/item_action/toggle_helmet_light, /datum/action/item_action/toggle_welding_screen/plasmaman)
+ visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT
+ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
+ flags_cover = HEADCOVERSMOUTH|HEADCOVERSEYES
+ visor_flags_inv = HIDEEYES|HIDEFACE
icon = 'icons/obj/clothing/species/plasmaman/hats.dmi'
species_restricted = list("Plasmaman")
- sprite_sheets = list(
- "Plasmaman" = 'icons/mob/species/plasmaman/helmet.dmi'
- )
- icon_state = "plasmaman_helmet0"
- item_state = "plasmaman_helmet0"
- var/base_state = "plasmaman_helmet"
- var/brightness_on = 4 //luminosity when on
- var/on = 0
+ sprite_sheets = list("Plasmaman" = 'icons/mob/species/plasmaman/helmet.dmi')
+
+/obj/item/clothing/head/helmet/space/plasmaman/New()
+ ..()
+ visor_toggling()
+ update_icon()
+ cut_overlays()
+
+/obj/item/clothing/head/helmet/space/plasmaman/AltClick(mob/user)
+ if(!user.incapacitated() && Adjacent(user))
+ toggle_welding_screen(user)
+
+/obj/item/clothing/head/helmet/space/plasmaman/visor_toggling() //handles all the actual toggling of flags
+ up = !up
+ flags ^= visor_flags
+ flags_inv ^= visor_flags_inv
+ icon_state = "[initial(icon_state)]"
+ if(visor_vars_to_toggle & VISOR_FLASHPROTECT)
+ flash_protect ^= initial(flash_protect)
+ if(visor_vars_to_toggle & VISOR_TINT)
+ tint ^= initial(tint)
+
+/obj/item/clothing/head/helmet/space/plasmaman/proc/toggle_welding_screen(mob/living/user)
+ if(weldingvisortoggle(user))
+ if(on)
+ to_chat(user, "Your helmet's torch can't pass through your welding visor!")
+ on = FALSE
+ playsound(src, 'sound/mecha/mechmove03.ogg', 50, 1) //Visors don't just come from nothing
+ update_icon()
+ else
+ playsound(src, 'sound/mecha/mechmove03.ogg', 50, 1) //Visors don't just come from nothing
+ update_icon()
+
+/obj/item/clothing/head/helmet/space/plasmaman/update_icon()
+ cut_overlays()
+ add_overlay(visor_icon)
+ ..()
actions_types = list(/datum/action/item_action/toggle_helmet_light)
-/obj/item/clothing/head/helmet/space/eva/plasmaman/attack_self(mob/user)
- toggle_light(user)
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/proc/toggle_light(mob/user)
+/obj/item/clothing/head/helmet/space/plasmaman/attack_self(mob/user)
on = !on
- icon_state = "[base_state][on]"
+ icon_state = "[initial(icon_state)][on ? "-light":""]"
+ item_state = icon_state
+ user.update_inv_head() //So the mob overlay updates
if(on)
- set_light(brightness_on)
+ if(!up)
+ to_chat(user, "Your helmet's torch can't pass through your welding visor!")
+ set_light(0)
+ else
+ set_light(brightness_on)
else
set_light(0)
- if(istype(user,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = user
- H.update_inv_head()
-
for(var/X in actions)
- var/datum/action/A = X
+ var/datum/action/A=X
A.UpdateButtonIcon()
-/obj/item/clothing/head/helmet/space/eva/plasmaman/extinguish_light()
- if(on)
- toggle_light()
- visible_message("[src]'s light fades and turns off.")
-
-// ENGINEERING
-/obj/item/clothing/suit/space/eva/plasmaman/atmostech
- name = "plasmaman atmospheric suit"
- icon_state = "plasmamanAtmos_suit"
- armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0)
- max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/atmostech
- name = "plasmaman atmospheric helmet"
- icon_state = "plasmamanAtmos_helmet0"
- base_state = "plasmamanAtmos_helmet"
- armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0)
- max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- flash_protect = 2
-
-/obj/item/clothing/suit/space/eva/plasmaman/engineer
- name = "plasmaman engineer suit"
- icon_state = "plasmamanEngineer_suit"
- armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer
- name = "plasmaman engineer helmet"
- icon_state = "plasmamanEngineer_helmet0"
- base_state = "plasmamanEngineer_helmet"
- armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
- flash_protect = 2
-
-/obj/item/clothing/suit/space/eva/plasmaman/engineer/ce
- name = "plasmaman chief engineer suit"
- icon_state = "plasmaman_CE"
- max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
-
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer/ce
- name = "plasmaman chief engineer helmet"
- icon_state = "plasmaman_CE_helmet0"
- base_state = "plasmaman_CE_helmet"
- max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- flash_protect = 2
-
-//SERVICE
-/obj/item/clothing/suit/space/eva/plasmaman/assistant
- name = "plasmaman assistant suit"
- icon_state = "plasmamanAssistant_suit"
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/assistant
- name = "plasmaman assistant helmet"
- icon_state = "plasmamanAssistant_helmet0"
- base_state = "plasmamanAssistant_helmet"
-
-/obj/item/clothing/suit/space/eva/plasmaman/botanist
- name = "plasmaman botanist suit"
- icon_state = "plasmamanBotanist_suit"
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/botanist
- name = "plasmaman botanist helmet"
- icon_state = "plasmamanBotanist_helmet0"
- base_state = "plasmamanBotanist_helmet"
-
-/obj/item/clothing/suit/space/eva/plasmaman/chaplain
- name = "plasmaman chaplain suit"
- icon_state = "plasmamanChaplain_suit"
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/chaplain
- name = "plasmaman chaplain helmet"
- icon_state = "plasmamanChaplain_helmet0"
- base_state = "plasmamanChaplain_helmet"
-
-/obj/item/clothing/suit/space/eva/plasmaman/clown
- name = "plasmaman clown suit"
- icon_state = "plasmaman_Clown"
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/clown
- name = "plasmaman clown helmet"
- icon_state = "plasmaman_Clown_helmet0"
- base_state = "plasmaman_Clown_helmet"
-
-/obj/item/clothing/suit/space/eva/plasmaman/mime
- name = "plasmaman mime suit"
- icon_state = "plasmaman_Mime"
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/mime
- name = "plasmaman mime helmet"
- icon_state = "plasmaman_Mime_helmet0"
- base_state = "plasmaman_Mime_helmet"
-
-/obj/item/clothing/suit/space/eva/plasmaman/service
- name = "plasmaman service suit"
- icon_state = "plasmamanService_suit"
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/service
- name = "plasmaman service helmet"
- icon_state = "plasmamanService_helmet0"
- base_state = "plasmamanService_helmet"
-
-/obj/item/clothing/suit/space/eva/plasmaman/janitor
- name = "plasmaman janitor suit"
- icon_state = "plasmamanJanitor_suit"
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/janitor
- name = "plasmaman janitor helmet"
- icon_state = "plasmamanJanitor_helmet0"
- base_state = "plasmamanJanitor_helmet"
-
-
-//CARGO
-
-/obj/item/clothing/suit/space/eva/plasmaman/cargo
- name = "plasmaman cargo suit"
- icon_state = "plasmamanCargo_suit"
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/cargo
- name = "plasmaman cargo helmet"
- icon_state = "plasmamanCargo_helmet0"
- base_state = "plasmamanCargo_helmet"
-
-/obj/item/clothing/suit/space/eva/plasmaman/miner
- name = "plasmaman miner suit"
- icon_state = "plasmamanMiner_suit"
- armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
- slowdown = 1
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/miner
- name = "plasmaman miner helmet"
- icon_state = "plasmamanMiner_helmet0"
- base_state = "plasmamanMiner_helmet"
- armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
-
-/obj/item/clothing/suit/space/eva/plasmaman/explorer
- name = "plasmaman explorer suit"
- icon_state = "plasmamanExplorer_suit"
- armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 50)
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/explorer
- name = "plasmaman explorer helmet"
- icon_state = "plasmamanExplorer_helmet0"
- base_state = "plasmamanExplorer_helmet"
- armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 50)
-
-// MEDSCI
-
-/obj/item/clothing/suit/space/eva/plasmaman/medical
- name = "plasmaman medical suit"
- icon_state = "plasmamanMedical_suit"
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/medical
- name = "plasmaman medical helmet"
- icon_state = "plasmamanMedical_helmet0"
- base_state = "plasmamanMedical_helmet"
-
-/obj/item/clothing/suit/space/eva/plasmaman/medical/paramedic
- name = "plasmaman paramedic suit"
- icon_state = "plasmaman_Paramedic"
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/paramedic
- name = "plasmaman paramedic helmet"
- icon_state = "plasmaman_Paramedic_helmet0"
- base_state = "plasmaman_Paramedic_helmet"
-
-/obj/item/clothing/suit/space/eva/plasmaman/medical/chemist
- name = "plasmaman chemist suit"
- icon_state = "plasmaman_Chemist"
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/chemist
- name = "plasmaman chemist helmet"
- icon_state = "plasmaman_Chemist_helmet0"
- base_state = "plasmaman_Chemist_helmet"
-
-/obj/item/clothing/suit/space/eva/plasmaman/medical/cmo
- name = "plasmaman chief medical officer suit"
- icon_state = "plasmaman_CMO"
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/cmo
- name = "plasmaman chief medical officer helmet"
- icon_state = "plasmaman_CMO_helmet0"
- base_state = "plasmaman_CMO_helmet"
-
-/obj/item/clothing/suit/space/eva/plasmaman/medical/coroner
- name = "plasmaman coroner suit"
- icon_state = "plasmaman_Coroner"
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/coroner
- name = "plasmaman coroner helmet"
- icon_state = "plasmaman_Coroner_helmet0"
- base_state = "plasmaman_Coroner_helmet"
-
-/obj/item/clothing/suit/space/eva/plasmaman/medical/virologist
- name = "plasmaman virologist suit"
- icon_state = "plasmaman_Virologist"
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/virologist
- name = "plasmaman virologist helmet"
- icon_state = "plasmaman_Virologist_helmet0"
- base_state = "plasmaman_Virologist_helmet"
-
-/obj/item/clothing/suit/space/eva/plasmaman/science
- name = "plasmaman scientist suit"
- icon_state = "plasmamanScience_suit"
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/science
- name = "plasmaman scientist helmet"
- icon_state = "plasmamanScience_helmet0"
- base_state = "plasmamanScience_helmet"
-
-/obj/item/clothing/suit/space/eva/plasmaman/science/geneticist
- name = "plasmaman geneticist suit"
- icon_state = "plasmaman_Geneticist"
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/science/geneticist
- name = "plasmaman geneticist helmet"
- icon_state = "plasmaman_Geneticist_helmet0"
- base_state = "plasmaman_Geneticist_helmet"
-
-/obj/item/clothing/suit/space/eva/plasmaman/science/rd
- name = "plasmaman research director suit"
- icon_state = "plasmaman_RD"
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/science/rd
- name = "plasmaman research director helmet"
- icon_state = "plasmaman_RD_helmet0"
- base_state = "plasmaman_RD_helmet"
-
-//MAGISTRATE
-/obj/item/clothing/suit/space/eva/plasmaman/magistrate
- name = "plasmaman magistrate suit"
- icon_state = "plasmaman_HoS"
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/magistrate
- name = "plasmaman magistrate helmet"
- icon_state = "plasmaman_HoS_helmet0"
- base_state = "plasmaman_HoS_helmet"
-
-//NT REP
-/obj/item/clothing/suit/space/eva/plasmaman/nt_rep
- name = "plasmaman NT representative suit"
- icon_state = "plasmaman_rep"
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/nt_rep
- name = "plasmaman NT representative helmet"
- icon_state = "plasmaman_rep_helmet0"
- base_state = "plasmaman_rep_helmet"
-
-//SECURITY
-
-/obj/item/clothing/suit/space/eva/plasmaman/security
- name = "plasmaman security suit"
- icon_state = "plasmamanSecurity_suit"
- armor = list(melee = 15, bullet = 15, laser = 15, energy = 10, bomb = 10, bio = 100, rad = 50)
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/security
- name = "plasmaman security helmet"
- icon_state = "plasmamanSecurity_helmet0"
- base_state = "plasmamanSecurity_helmet"
- armor = list(melee = 15, bullet = 15, laser = 15, energy = 10, bomb = 10, bio = 100, rad = 50)
-
-/obj/item/clothing/suit/space/eva/plasmaman/security/hos
- name = "plasmaman head of security suit"
- icon_state = "plasmaman_HoS"
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hos
- name = "plasmaman head of security helmet"
- icon_state = "plasmaman_HoS_helmet0"
- base_state = "plasmaman_HoS_helmet"
-
-/obj/item/clothing/suit/space/eva/plasmaman/security/hop
- name = "plasmaman head of personnel suit"
- icon_state = "plasmaman_HoP"
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hop
- name = "plasmaman head of personnel helmet"
- icon_state = "plasmaman_HoP_helmet0"
- base_state = "plasmaman_HoP_helmet"
-
-/obj/item/clothing/suit/space/eva/plasmaman/security/captain
- name = "plasmaman captain suit"
- icon_state = "plasmaman_Captain"
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/security/captain
- name = "plasmaman captain helmet"
- icon_state = "plasmaman_Captain_helmet0"
- base_state = "plasmaman_Captain_helmet"
-
-
-//IAA/LAWYER
-/obj/item/clothing/suit/space/eva/plasmaman/lawyer
- name = "plasmaman lawyer suit"
- icon_state = "plasmamanlawyer_suit"
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/lawyer
- name = "plasmaman lawyer helmet"
- icon_state = "plasmamanlawyer_helmet0"
- base_state = "plasmamanlawyer_helmet"
-
-//NUKEOPS
-
-/obj/item/clothing/suit/space/eva/plasmaman/nuclear
- name = "blood red plasmaman suit"
- icon_state = "plasmaman_Nukeops"
- armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
- allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/gun,/obj/item/ammo_casing,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/melee/energy/sword/saber,/obj/item/restraints/handcuffs)
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/nuclear
- name = "blood red plasmaman helmet"
- icon_state = "plasmaman_Nukeops_helmet0"
- base_state = "plasmaman_Nukeops_helmet"
- armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
-
-//WIZARD
-/obj/item/clothing/suit/space/eva/plasmaman/wizard
- name = "robed plasmaman suit"
- icon_state = "plasmamanWizardBlue_suit"
- magical = TRUE
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/wizard
- name = "wizard hat"
- icon_state = "plasmamanWizardBlue_helmet0"
- base_state = "plasmamanWizardBlue_helmet"
- magical = TRUE
+/obj/item/clothing/head/helmet/space/plasmaman/security
+ name = "security plasma envirosuit helmet"
+ desc = "A plasmaman containment helmet designed for security officers, protecting them from being flashed and burning alive, along-side other undesirables."
+ icon_state = "security_envirohelm"
+ item_state = "security_envirohelm"
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 0)
+
+/obj/item/clothing/head/helmet/space/plasmaman/security/warden
+ name = "warden's plasma envirosuit helmet"
+ desc = "A plasmaman containment helmet designed for the warden, a pair of white stripes being added to differeciate them from other members of security."
+ icon_state = "warden_envirohelm"
+ item_state = "warden_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/security/hos
+ name = "security plasma envirosuit helmet"
+ desc = "A plasmaman containment helmet designed for the head of security."
+ icon_state = "hos_envirohelm"
+ item_state = "hos_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/medical
+ name = "medical's plasma envirosuit helmet"
+ desc = "An envriohelmet designed for plasmaman medical doctors, having two stripes down it's length to denote as much"
+ icon_state = "doctor_envirohelm"
+ item_state = "doctor_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/cmo
+ name = "chief medical officer's plasma envirosuit helmet"
+ desc = "An envriohelmet designed for plasmaman employed as the cheif medical officer."
+ icon_state = "cmo_envirohelm"
+ item_state = "cmo_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/genetics
+ name = "geneticist's plasma envirosuit helmet"
+ desc = "A plasmaman envirohelmet designed for geneticists."
+ icon_state = "geneticist_envirohelm"
+ item_state = "geneticist_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/viro
+ name = "virology plasma envirosuit helmet"
+ desc = "The helmet worn by the safest people on the station, those who are completely immune to the monstrosities they create."
+ icon_state = "virologist_envirohelm"
+ item_state = "virologist_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/chemist
+ name = "chemistry plasma envirosuit helmet"
+ desc = "A plasmaman envirosuit designed for chemists, two orange stripes going down it's face."
+ icon_state = "chemist_envirohelm"
+ item_state = "chemist_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/science
+ name = "science plasma envirosuit helmet"
+ desc = "A plasmaman envirohelmet designed for scientists."
+ icon_state = "scientist_envirohelm"
+ item_state = "scientist_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/rd
+ name = "research director plasma envirosuit helmet"
+ desc = "A plasmaman envirohelmet designed for the research director."
+ icon_state = "rd_envirohelm"
+ item_state = "rd_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/robotics
+ name = "robotics plasma envirosuit helmet"
+ desc = "A plasmaman envirohelmet designed for roboticists."
+ icon_state = "roboticist_envirohelm"
+ item_state = "roboticist_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/engineering
+ name = "engineering plasma envirosuit helmet"
+ desc = "A space-worthy helmet specially designed for engineer plasmamen, the usual purple stripes being replaced by engineering's orange."
+ icon_state = "engineer_envirohelm"
+ item_state = "engineer_envirohelm"
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 10)
+
+/obj/item/clothing/head/helmet/space/plasmaman/engineering/ce
+ name = "chief engineer's plasma envirosuit helmet"
+ desc = "A space-worthy helmet specially designed for chief engineer employed plasmamen."
+ icon_state = "ce_envirohelm"
+ item_state = "ce_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/atmospherics
+ name = "atmospherics plasma envirosuit helmet"
+ desc = "A space-worthy helmet specially designed for atmos technician plasmamen, the usual purple stripes being replaced by engineering's blue."
+ icon_state = "atmos_envirohelm"
+ item_state = "atmos_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/cargo
+ name = "cargo plasma envirosuit helmet"
+ desc = "An plasmaman envirohelmet designed for cargo techs and quartermasters."
+ icon_state = "cargo_envirohelm"
+ item_state = "cargo_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/mining
+ name = "mining plasma envirosuit helmet"
+ desc = "A khaki helmet given to plasmamen miners operating on lavaland."
+ icon_state = "explorer_envirohelm"
+ item_state = "explorer_envirohelm"
+ visor_icon = "explorer_envisor"
+
+/obj/item/clothing/head/helmet/space/plasmaman/chaplain
+ name = "chaplain's plasma envirosuit helmet"
+ desc = "An envirohelmet specially designed for only the most pious of plasmamen."
+ icon_state = "chap_envirohelm"
+ item_state = "chap_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/white
+ name = "white plasma envirosuit helmet"
+ desc = "A generic white envirohelm."
+ icon_state = "white_envirohelm"
+ item_state = "white_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/chef
+ name = "chef plasma envirosuit helmet"
+ desc = "An envirohelm designed for plasmamen chefs."
+ icon_state = "chef_envirohelm"
+ item_state = "chef_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/librarian
+ name = "librarian's plasma envirosuit helmet"
+ desc = "A slight modification on a tradiational voidsuit helmet, this helmet was Nano-Trasen's first solution to the *logistical problems* that come with employing plasmamen. Despite their limitations, these helmets still see use by historian and old-styled plasmamen alike."
+ icon_state = "prototype_envirohelm"
+ item_state = "prototype_envirohelm"
+ actions_types = list(/datum/action/item_action/toggle_welding_screen/plasmaman)
+ visor_icon = "prototype_envisor"
+
+/obj/item/clothing/head/helmet/space/plasmaman/botany
+ name = "botany plasma envirosuit helmet"
+ desc = "A green and blue envirohelmet designating it's wearer as a botanist. While not specially designed for it, it would protect against minor planet-related injuries."
+ icon_state = "botany_envirohelm"
+ item_state = "botany_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/janitor
+ name = "janitor's plasma envirosuit helmet"
+ desc = "A grey helmet bearing a pair of purple stripes, designating the wearer as a janitor."
+ icon_state = "janitor_envirohelm"
+ item_state = "janitor_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/mime
+ name = "mime envirosuit helmet"
+ desc = "The make-up is painted on, it's a miracle it doesn't chip. It's not very colourful."
+ icon_state = "mime_envirohelm"
+ item_state = "mime_envirohelm"
+ visor_icon = "mime_envisor"
+
+/obj/item/clothing/head/helmet/space/plasmaman/clown
+ name = "clown envirosuit helmet"
+ desc = "The make-up is painted on, it's a miracle it doesn't chip. 'HONK!'"
+ icon_state = "clown_envirohelm"
+ item_state = "clown_envirohelm"
+ visor_icon = "clown_envisor"
+
+/obj/item/clothing/head/helmet/space/plasmaman/hop
+ name = "head of personnel envirosuit helmet"
+ desc = "A plasmaman envirohelm that reeks of bureaucracy."
+ icon_state = "hop_envirohelm"
+ item_state = "hop_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/captain
+ name = "captain envirosuit helmet"
+ desc = "A plasmaman envirohelm designed with the insignia and markings befitting a captain."
+ icon_state = "cap_envirohelm"
+ item_state = "cap_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/blueshield
+ name = "blueshield envirosuit helmet"
+ desc = "A plasmaman envirohelm designed for the blueshield."
+ icon_state = "bs_envirohelm"
+ item_state = "bs_envirohelm"
\ No newline at end of file
diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm
index bfb326eae1d..e87e35a0dea 100644
--- a/code/modules/clothing/spacesuits/rig/modules/utility.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm
@@ -56,7 +56,7 @@
interface_desc = "A diamond-tipped industrial drill."
suit_overlay_active = "mounted-drill"
suit_overlay_inactive = "mounted-drill"
- device_type = /obj/item/pickaxe/diamonddrill
+ device_type = /obj/item/pickaxe/drill/diamonddrill
/obj/item/rig_module/device/orescanner
name = "ore scanner module"
diff --git a/code/modules/clothing/under/jobs/plasmamen/_plasmamen.dm b/code/modules/clothing/under/jobs/plasmamen/_plasmamen.dm
new file mode 100644
index 00000000000..5c38361e0b2
--- /dev/null
+++ b/code/modules/clothing/under/jobs/plasmamen/_plasmamen.dm
@@ -0,0 +1,55 @@
+/obj/item/clothing/under/plasmaman
+ name = "plasma envirosuit"
+ desc = "A special containment suit that allows plasma-based lifeforms to exist safely in an oxygenated environment, and automatically extinguishes them in a crisis. Despite being airtight, it's not spaceworthy."
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 0)
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
+ strip_delay = 80
+ var/next_extinguish = 0
+ var/extinguish_cooldown = 100
+ var/extinguishes_left = 5
+ icon = 'icons/obj/clothing/species/plasmaman/uniform.dmi'
+ species_restricted = list("Plasmaman")
+ sprite_sheets = list("Plasmaman" = 'icons/mob/species/plasmaman/uniform.dmi')
+ icon_state = "plasmaman"
+ item_state = "plasmaman"
+ item_color = "plasmaman"
+
+/obj/item/clothing/under/plasmaman/examine(mob/user)
+ ..()
+ to_chat(user, "There are [extinguishes_left] extinguisher charges left in this suit.")
+
+/obj/item/clothing/under/plasmaman/proc/Extinguish(mob/living/carbon/human/H)
+ if(!istype(H))
+ return
+
+ if(H.on_fire)
+ if(extinguishes_left)
+ if(next_extinguish > world.time)
+ return
+ next_extinguish = world.time + extinguish_cooldown
+ extinguishes_left--
+ H.visible_message("[H]'s suit automatically extinguishes [H.p_them()]!","Your suit automatically extinguishes you.")
+ if(!extinguishes_left)
+ to_chat(H, "Onboard auto-extinguisher depleted, refill with a cartridge.")
+ playsound(H.loc, 'sound/effects/spray.ogg', 10, 1, -3)
+ H.ExtinguishMob()
+ new /obj/effect/particle_effect/water(get_turf(H))
+ return FALSE
+
+/obj/item/clothing/under/plasmaman/attackby(obj/item/E, mob/user, params)
+ if (istype(E, /obj/item/extinguisher_refill))
+ if (extinguishes_left == 5)
+ to_chat(user, "The inbuilt extinguisher is full.")
+ return
+ else
+ extinguishes_left = 5
+ to_chat(user, "You refill the suit's built-in extinguisher, using up the cartridge.")
+ qdel(E)
+ else
+ return ..()
+
+/obj/item/extinguisher_refill
+ name = "envirosuit extinguisher cartridge"
+ desc = "A cartridge loaded with a compressed extinguisher mix, used to refill the automatic extinguisher on plasma envirosuits."
+ icon_state = "plasmarefill"
+ icon = 'icons/obj/device.dmi'
\ No newline at end of file
diff --git a/code/modules/clothing/under/jobs/plasmamen/civilian_service.dm b/code/modules/clothing/under/jobs/plasmamen/civilian_service.dm
new file mode 100644
index 00000000000..69697d3be6f
--- /dev/null
+++ b/code/modules/clothing/under/jobs/plasmamen/civilian_service.dm
@@ -0,0 +1,107 @@
+/obj/item/clothing/under/plasmaman/cargo
+ name = "cargo plasma envirosuit"
+ desc = "A joint envirosuit used by plasmamen quartermasters and cargo techs alike, due to the logistical problems of differenciating the two with the length of their pant legs."
+ icon_state = "cargo_envirosuit"
+ item_state = "cargo_envirosuit"
+ item_color = "cargo_envirosuit"
+
+/obj/item/clothing/under/plasmaman/mining
+ name = "mining plasma envirosuit"
+ desc = "An air-tight khaki suit designed for operations on lavaland by plasmamen."
+ icon_state = "explorer_envirosuit"
+ item_state = "explorer_envirosuit"
+ item_color = "explorer_envirosuit"
+
+
+/obj/item/clothing/under/plasmaman/chef
+ name = "chef's plasma envirosuit"
+ desc = "A white plasmaman envirosuit designed for cullinary practices. One might question why a member of a species that doesn't need to eat would become a chef."
+ icon_state = "chef_envirosuit"
+ item_state = "chef_envirosuit"
+ item_color = "chef_envirosuit"
+
+/obj/item/clothing/under/plasmaman/enviroslacks
+ name = "enviroslacks"
+ desc = "The pet project of a particularly posh plasmaman, this custom suit was quickly appropriated by Nano-Trasen for it's detectives, lawyers, and bar-tenders alike."
+ icon_state = "enviroslacks"
+ item_state = "enviroslacks"
+ item_color = "enviroslacks"
+
+/obj/item/clothing/under/plasmaman/chaplain
+ name = "chaplain's plasma envirosuit"
+ desc = "An envirosuit specially designed for only the most pious of plasmamen."
+ icon_state = "chap_envirosuit"
+ item_state = "chap_envirosuit"
+ item_color = "chap_envirosuit"
+
+/obj/item/clothing/under/plasmaman/librarian
+ name = "librarian's plasma envirosuit"
+ desc = "Made out of a modified voidsuit, this suit was Nano-Trasen's first solution to the *logistical problems* that come with employing plasmamen. Due to the modifications, the suit is no longer space-worthy. Despite their limitations, these suits are still in used by historian and old-styled plasmamen alike."
+ icon_state = "prototype_envirosuit"
+ item_state = "prototype_envirosuit"
+ item_color = "prototype_envirosuit"
+
+/obj/item/clothing/under/plasmaman/janitor
+ name = "janitor's plasma envirosuit"
+ desc = "A grey and purple envirosuit designated for plasmamen janitors."
+ icon_state = "janitor_envirosuit"
+ item_state = "janitor_envirosuit"
+ item_color = "janitor_envirosuit"
+
+/obj/item/clothing/under/plasmaman/botany
+ name = "botany envirosuit"
+ desc = "A green and blue envirosuit designed to protect plasmamen from minor plant-related injuries."
+ icon_state = "botany_envirosuit"
+ item_state = "botany_envirosuit"
+ item_color = "botany_envirosuit"
+
+
+/obj/item/clothing/under/plasmaman/mime
+ name = "mime envirosuit"
+ desc = "It's not very colourful."
+ icon_state = "mime_envirosuit"
+ item_state = "mime_envirosuit"
+ item_color = "mime_envirosuit"
+
+/obj/item/clothing/under/plasmaman/clown
+ name = "clown envirosuit"
+ desc = "'HONK!'"
+ icon_state = "clown_envirosuit"
+ item_state = "clown_envirosuit"
+ item_color = "clown_envirosuit"
+
+/obj/item/clothing/under/plasmaman/clown/Extinguish(mob/living/carbon/human/H)
+ if(!istype(H))
+ return
+
+ if(H.on_fire)
+ if(extinguishes_left)
+ if(next_extinguish > world.time)
+ return
+ next_extinguish = world.time + extinguish_cooldown
+ extinguishes_left--
+ H.visible_message("[H]'s suit spews out a tonne of space lube!", "Your suit spews out a tonne of space lube!")
+ H.ExtinguishMob()
+ new /obj/effect/particle_effect/foam(loc) //Truely terrifying.
+ return FALSE
+
+/obj/item/clothing/under/plasmaman/hop
+ name = "head of personnel envirosuit"
+ desc = "An envirosuit designed for plasmamen employed as the head of personnel."
+ icon_state = "hop_envirosuit"
+ item_state = "hop_envirosuit"
+ item_color = "hop_envirosuit"
+
+/obj/item/clothing/under/plasmaman/captain
+ name = "captain envirosuit"
+ desc = "An envirosuit designed for plasmamen employed as the captain."
+ icon_state = "cap_envirosuit"
+ item_state = "cap_envirosuit"
+ item_color = "cap_envirosuit"
+
+/obj/item/clothing/under/plasmaman/blueshield
+ name = "blueshield envirosuit"
+ desc = "An envirosuit designed for plasmamen employed as the blueshield."
+ icon_state = "bs_envirosuit"
+ item_state = "bs_envirosuit"
+ item_color = "bs_envirosuit"
\ No newline at end of file
diff --git a/code/modules/clothing/under/jobs/plasmamen/engineering.dm b/code/modules/clothing/under/jobs/plasmamen/engineering.dm
new file mode 100644
index 00000000000..e83eef2917c
--- /dev/null
+++ b/code/modules/clothing/under/jobs/plasmamen/engineering.dm
@@ -0,0 +1,22 @@
+/obj/item/clothing/under/plasmaman/engineering
+ name = "engineering plasma envirosuit"
+ desc = "An air-tight suit designed to be used by plasmamen exployed as engineers, the usual purple stripes being replaced by engineer's orange. It protects the user from fire and acid damage."
+ icon_state = "engineer_envirosuit"
+ item_state = "engineer_envirosuit"
+ item_color = "engineer_envirosuit"
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 10)
+
+/obj/item/clothing/under/plasmaman/engineering/ce
+ name = "chief engineer plasma envirosuit"
+ desc = "An air-tight suit designed to be used by plasmamen exployed as the chief engineer"
+ icon_state = "ce_envirosuit"
+ item_state = "ce_envirosuit"
+ item_color = "ce_envirosuit"
+
+/obj/item/clothing/under/plasmaman/atmospherics
+ name = "atmospherics plasma envirosuit"
+ desc = "An air-tight suit designed to be used by plasmamen exployed as atmos technicians, the usual purple stripes being replaced by atmos's blue."
+ icon_state = "atmos_envirosuit"
+ item_state = "atmos_envirosuit"
+ item_color = "atmos_envirosuit"
+
diff --git a/code/modules/clothing/under/jobs/plasmamen/medsci.dm b/code/modules/clothing/under/jobs/plasmamen/medsci.dm
new file mode 100644
index 00000000000..69e14c0e878
--- /dev/null
+++ b/code/modules/clothing/under/jobs/plasmamen/medsci.dm
@@ -0,0 +1,55 @@
+/obj/item/clothing/under/plasmaman/medical
+ name = "medical plasma envirosuit"
+ desc = "A suit designed for the station's more plasma-based doctors."
+ icon_state = "doctor_envirosuit"
+ item_state = "doctor_envirosuit"
+ item_color = "doctor_envirosuit"
+
+/obj/item/clothing/under/plasmaman/cmo
+ name = "cmo plasma envirosuit"
+ desc = "A suit designed for the station's more plasma-based chief medical officer."
+ icon_state = "cmo_envirosuit"
+ item_state = "cmo_envirosuit"
+ item_color = "cmo_envirosuit"
+
+/obj/item/clothing/under/plasmaman/science
+ name = "science plasma envirosuit"
+ desc = "A plasmaman envirosuit designed for scientists."
+ icon_state = "scientist_envirosuit"
+ item_state = "scientist_envirosuit"
+ item_color = "scientist_envirosuit"
+
+/obj/item/clothing/under/plasmaman/rd
+ name = "science plasma envirosuit"
+ desc = "A plasmaman envirosuit designed for the research director."
+ icon_state = "rd_envirosuit"
+ item_state = "rd_envirosuit"
+ item_color = "rd_envirosuit"
+
+/obj/item/clothing/under/plasmaman/robotics
+ name = "robotics plasma envirosuit"
+ desc = "A plasmaman envirosuit designed for roboticists."
+ icon_state = "roboticist_envirosuit"
+ item_state = "roboticist_envirosuit"
+ item_color = "roboticist_envirosuit"
+
+/obj/item/clothing/under/plasmaman/viro
+ name = "virology plasma envirosuit"
+ desc = "The suit worn by the safest people on the station, those who are completely immune to the monstrosities they create."
+ icon_state = "virologist_envirosuit"
+ item_state = "virologist_envirosuit"
+ item_color = "virologist_envirosuit"
+
+/obj/item/clothing/under/plasmaman/genetics
+ name = "genetics plasma envirosuit"
+ desc = "A plasmaman envirosuit designed for geneticists."
+ icon_state = "geneticist_envirosuit"
+ item_state = "geneticist_envirosuit"
+ item_color = "geneticist_envirosuit"
+
+/obj/item/clothing/under/plasmaman/chemist
+ name = "chemistry plasma envirosuit"
+ desc = "A plasmaman envirosuit designed for chemists."
+ icon_state = "chemist_envirosuit"
+ item_state = "chemist_envirosuit"
+ item_color = "chemist_envirosuit"
diff --git a/code/modules/clothing/under/jobs/plasmamen/security.dm b/code/modules/clothing/under/jobs/plasmamen/security.dm
new file mode 100644
index 00000000000..d6f85da06f7
--- /dev/null
+++ b/code/modules/clothing/under/jobs/plasmamen/security.dm
@@ -0,0 +1,21 @@
+/obj/item/clothing/under/plasmaman/security
+ name = "security plasma envirosuit"
+ desc = "A plasmaman containment suit designed for security officers, offering a limited amount of extra protection."
+ icon_state = "security_envirosuit"
+ item_state = "security_envirosuit"
+ item_color = "security_envirosuit"
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 0)
+
+/obj/item/clothing/under/plasmaman/security/warden
+ name = "warden plasma envirosuit"
+ desc = "A plasmaman containment suit designed for the warden, white stripes being added to differeciate them from other members of security."
+ icon_state = "warden_envirosuit"
+ item_state = "warden_envirosuit"
+ item_color = "warden_envirosuit"
+
+/obj/item/clothing/under/plasmaman/security/hos
+ name = "head of security plasma envirosuit"
+ desc = "A plasmaman containment suit designed for the head of security."
+ icon_state = "hos_envirosuit"
+ item_state = "hos_envirosuit"
+ item_color = "hos_envirosuit"
\ No newline at end of file
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index c7ad35e5f47..b7f395afce0 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -10,6 +10,9 @@
////////// Usable Items //////////
//////////////////////////////////
+#define USED_MOD_HELM 1
+#define USED_MOD_SUIT 2
+
/obj/item/fluff
var/used = 0
@@ -401,118 +404,6 @@
return
to_chat(user, "You can't modify [target]!")
-#define USED_MOD_HELM 1
-#define USED_MOD_SUIT 2
-
-/obj/item/fluff/shadey_plasman_modkit
- name = "plasmaman suit modkit"
- desc = "A kit containing nanites that are able to modify the look of a plasmaman suit and helmet without exposing the wearer to hostile environments."
- icon_state = "modkit"
- w_class = WEIGHT_CLASS_SMALL
- force = 0
- throwforce = 0
-
-/obj/item/fluff/shadey_plasman_modkit/afterattack(atom/target, mob/user, proximity)
- if(!proximity || !ishuman(user) || user.incapacitated())
- return
- var/mob/living/carbon/human/H = user
-
- if(istype(target, /obj/item/clothing/head/helmet/space/eva/plasmaman))
- if(used & USED_MOD_HELM)
- to_chat(H, "The kit's helmet modifier has already been used.")
- return
- to_chat(H, "You modify the appearance of [target].")
- used |= USED_MOD_HELM
-
- var/obj/item/clothing/head/helmet/space/eva/plasmaman/P = target
- P.name = "plasma containment helmet"
- P.desc = "A purpose-built containment helmet designed to keep plasma in, and everything else out."
- P.icon_state = "plasmaman_halo_helmet[P.on]"
- P.base_state = "plasmaman_halo_helmet"
-
- if(P == H.head)
- H.update_inv_head()
- return
- if(istype(target, /obj/item/clothing/suit/space/eva/plasmaman))
- if(used & USED_MOD_SUIT)
- to_chat(user, "The kit's suit modifier has already been used.")
- return
- to_chat(H, "You modify the appearance of [target].")
- used |= USED_MOD_SUIT
-
- var/obj/item/clothing/suit/space/eva/plasmaman/P = target
- P.name = "plasma containment suit"
- P.desc = "A feminine containment suit designed to keep plasma in, and everything else out. It's even got an overskirt."
- P.icon_state = "plasmaman_halo"
-
- if(P == H.wear_suit)
- H.update_inv_wear_suit()
- return
- to_chat(user, "You can't modify [target]!")
-
-/obj/item/fluff/lighty_plasman_modkit // LightFire53: Ikelos
- name = "plasmaman suit modkit"
- desc = "A kit containing nanites that are able to modify the look of a plasmaman suit and helmet without exposing the wearer to hostile environments."
- icon_state = "modkit"
- w_class = 2
- force = 0
- throwforce = 0
- var/picked_color = null
- var/list/helmets = list(
- "Blue" = "plasmaman_ikelosdefault_helmet",
- "Gold" = "plasmaman_ikelosgold_helmet",
- "Red" = "plasmaman_ikelossecurity_helmet")
- var/list/suits = list(
- "Blue" = "plasmaman_ikelosdefault",
- "Gold" = "plasmaman_ikelosgold",
- "Red" = "plasmaman_ikelossecurity")
-
-/obj/item/fluff/lighty_plasman_modkit/afterattack(atom/target, mob/user, proximity)
- if(!proximity || !ishuman(user) || user.incapacitated())
- return
- var/mob/living/carbon/human/H = user
-
- if(istype(target, /obj/item/clothing/head/helmet/space/eva/plasmaman))
- if(used & USED_MOD_HELM)
- to_chat(H, "The kit's helmet modifier has already been used.")
- return
-
- picked_color = input(H, "Which color would you like to paint [target]?", "Recolor") as null|anything in helmets
- var/obj/item/clothing/head/helmet/space/eva/plasmaman/P = target
-
- if(!picked_color)
- return
- P.icon_state = helmets[picked_color] + "[P.on]"
- P.base_state = helmets[picked_color]
-
- to_chat(H, "You modify the appearance of [target].")
- P.icon = 'icons/obj/custom_items.dmi'
- used |= USED_MOD_HELM
-
- if(P == H.head)
- H.update_inv_head()
- return
- if(istype(target, /obj/item/clothing/suit/space/eva/plasmaman))
- if(used & USED_MOD_SUIT)
- to_chat(user, "The kit's suit modifier has already been used.")
- return
- picked_color = input(H, "Which color would you like to paint [target]?", "Recolor") as null|anything in suits
- var/obj/item/clothing/suit/space/eva/plasmaman/P = target
-
- if(!picked_color)
- return
- P.icon_state = suits[picked_color]
-
- to_chat(H, "You modify the appearance of [target].")
- P.icon = 'icons/obj/custom_items.dmi'
- used |= USED_MOD_SUIT
-
- if(P == H.wear_suit)
- H.update_inv_wear_suit()
- return
- to_chat(user, "You can't modify [target]!")
-
-
/obj/item/fluff/merchant_sallet_modkit //Travelling Merchant: Trav Noble. This is what they spawn in with
name = "SG Helmet modkit"
desc = "A modkit that can make most helmets look like a Shellguard Helmet."
diff --git a/code/modules/events/grid_check.dm b/code/modules/events/grid_check.dm
index d8d1f46ad9b..67881662db5 100644
--- a/code/modules/events/grid_check.dm
+++ b/code/modules/events/grid_check.dm
@@ -45,6 +45,11 @@
continue
if(C.cell)
C.cell.charge = 0
+ for(var/obj/machinery/power/P in GLOB.machines)
+ var/area/current_area = get_area(P)
+ if((current_area.type in skipped_areas_apc) || (current_area.type in skipped_areas) || !is_station_level(P.z))
+ continue
+ P.malfunction = TRUE
/proc/power_restore(var/announce = 1)
var/list/skipped_areas = list(/area/turret_protected/ai)
@@ -67,6 +72,8 @@
S.input_attempt = S.last_input_attempt
S.update_icon()
S.power_change()
+ for(var/obj/machinery/power/P in GLOB.machines)
+ P.malfunction = FALSE
/proc/power_restore_quick(var/announce = 1)
if(announce)
diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm
index e96fd0e867b..3e4d4d143ec 100644
--- a/code/modules/mining/abandonedcrates.dm
+++ b/code/modules/mining/abandonedcrates.dm
@@ -40,9 +40,11 @@
if(21 to 25)
for(var/i in 1 to 5)
new /obj/item/poster/random_contraband(src)
- if(26 to 35)
+ if(26 to 30)
for(var/i in 1 to 3)
new /obj/item/reagent_containers/glass/beaker/noreact(src)
+ if(31 to 35)
+ new /obj/item/seeds/firelemon(src)
if(36 to 40)
new /obj/item/melee/baton(src)
if(41 to 45)
@@ -109,7 +111,7 @@
if(90)
new /obj/item/organ/internal/heart(src)
if(91)
- new /obj/item/soulstone(src)
+ new /obj/item/soulstone/anybody(src)
if(92)
new /obj/item/katana(src)
if(93)
diff --git a/code/modules/mining/coins.dm b/code/modules/mining/coins.dm
deleted file mode 100644
index 70d920cd38f..00000000000
--- a/code/modules/mining/coins.dm
+++ /dev/null
@@ -1,153 +0,0 @@
-/*****************************Coin********************************/
-
-/obj/item/coin
- icon = 'icons/obj/economy.dmi'
- name = "coin"
- icon_state = "coin__heads"
- flags = CONDUCT
- force = 1
- throwforce = 2
- w_class = WEIGHT_CLASS_TINY
- var/string_attached
- var/list/sideslist = list("heads","tails")
- var/cmineral = null
- var/cooldown = 0
- var/credits = 10
-
-/obj/item/coin/New()
- pixel_x = rand(0,16)-8
- pixel_y = rand(0,8)-8
-
- icon_state = "coin_[cmineral]_[sideslist[1]]"
- if(cmineral)
- name = "[cmineral] coin"
-
-/obj/item/coin/gold
- cmineral = "gold"
- icon_state = "coin_gold_heads"
- materials = list(MAT_GOLD = 400)
- credits = 160
-
-/obj/item/coin/silver
- cmineral = "silver"
- icon_state = "coin_silver_heads"
- materials = list(MAT_SILVER = 400)
- credits = 40
-
-/obj/item/coin/diamond
- cmineral = "diamond"
- icon_state = "coin_diamond_heads"
- materials = list(MAT_DIAMOND = 400)
- credits = 120
-
-/obj/item/coin/iron
- cmineral = "iron"
- icon_state = "coin_iron_heads"
- materials = list(MAT_METAL = 400)
- credits = 20
-
-/obj/item/coin/plasma
- cmineral = "plasma"
- icon_state = "coin_plasma_heads"
- materials = list(MAT_PLASMA = 400)
- credits = 80
-
-/obj/item/coin/uranium
- cmineral = "uranium"
- icon_state = "coin_uranium_heads"
- materials = list(MAT_URANIUM = 400)
- credits = 160
-
-/obj/item/coin/clown
- cmineral = "bananium"
- icon_state = "coin_bananium_heads"
- materials = list(MAT_BANANIUM = 400)
- credits = 600 //makes the clown cri
-
-/obj/item/coin/mime
- cmineral = "tranquillite"
- icon_state = "coin_tranquillite_heads"
- materials = list(MAT_TRANQUILLITE = 400)
- credits = 600 //makes the mime cri
-
-/obj/item/coin/adamantine
- cmineral = "adamantine"
- icon_state = "coin_adamantine_heads"
- credits = 400
-
-/obj/item/coin/mythril
- cmineral = "mythril"
- icon_state = "coin_mythril_heads"
- credits = 400
-
-/obj/item/coin/twoheaded
- cmineral = "iron"
- icon_state = "coin_iron_heads"
- desc = "Hey, this coin's the same on both sides!"
- sideslist = list("heads")
- credits = 20
-
-/obj/item/coin/antagtoken
- name = "antag token"
- icon_state = "coin_valid_valid"
- cmineral = "valid"
- desc = "A novelty coin that helps the heart know what hard evidence cannot prove."
- sideslist = list("valid", "salad")
- credits = 20
-
-/obj/item/coin/antagtoken/syndicate
- name = "syndicate coin"
- credits = 160
-
-/obj/item/coin/attackby(obj/item/W as obj, mob/user as mob, params)
- if(istype(W, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/CC = W
- if(string_attached)
- to_chat(user, "There already is a string attached to this coin.")
- return
-
- if(CC.use(1))
- overlays += image('icons/obj/economy.dmi',"coin_string_overlay")
- string_attached = 1
- to_chat(user, "You attach a string to the coin.")
- else
- to_chat(user, "You need one length of cable to attach a string to the coin.")
- return
-
- else if(istype(W,/obj/item/wirecutters))
- if(!string_attached)
- ..()
- return
-
- var/obj/item/stack/cable_coil/CC = new/obj/item/stack/cable_coil(user.loc)
- CC.amount = 1
- CC.update_icon()
- overlays = list()
- string_attached = null
- to_chat(user, "You detach the string from the coin.")
- else if(istype(W,/obj/item/weldingtool))
- var/obj/item/weldingtool/WT = W
- if(WT.welding && WT.remove_fuel(0, user))
- var/typelist = list("iron" = /obj/item/clothing/gloves/ring,
- "silver" = /obj/item/clothing/gloves/ring/silver,
- "gold" = /obj/item/clothing/gloves/ring/gold,
- "plasma" = /obj/item/clothing/gloves/ring/plasma,
- "uranium" = /obj/item/clothing/gloves/ring/uranium)
- var/typekey = typelist[cmineral]
- if(ispath(typekey))
- to_chat(user, "You make [src] into a ring.")
- new typekey(get_turf(loc))
- qdel(src)
- else ..()
-
-/obj/item/coin/attack_self(mob/user as mob)
- if(cooldown < world.time - 15)
- var/coinflip = pick(sideslist)
- cooldown = world.time
- flick("coin_[cmineral]_flip", src)
- icon_state = "coin_[cmineral]_[coinflip]"
- playsound(user.loc, 'sound/items/coinflip.ogg', 50, 1)
- if(do_after(user, 15, target = src))
- user.visible_message("[user] has flipped [src]. It lands on [coinflip].", \
- "You flip [src]. It lands on [coinflip].", \
- "You hear the clattering of loose change.")
diff --git a/code/modules/mining/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm
similarity index 100%
rename from code/modules/mining/explorer_gear.dm
rename to code/modules/mining/equipment/explorer_gear.dm
diff --git a/code/modules/mining/equipment/lazarus_injector.dm b/code/modules/mining/equipment/lazarus_injector.dm
new file mode 100644
index 00000000000..dcd0916d876
--- /dev/null
+++ b/code/modules/mining/equipment/lazarus_injector.dm
@@ -0,0 +1,122 @@
+/**********************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, making them become friendly to the user. Unfortunately, the process is useless on higher forms of life and incredibly costly, so these were hidden in storage until an executive thought they'd be great motivation for some of their employees."
+ icon = 'icons/obj/hypo.dmi'
+ icon_state = "lazarus_hypo"
+ item_state = "hypo"
+ origin_tech = "biotech=4;magnets=6"
+ throwforce = 0
+ w_class = WEIGHT_CLASS_SMALL
+ throw_speed = 3
+ throw_range = 5
+ var/loaded = 1
+ var/malfunctioning = 0
+ var/revive_type = SENTIENCE_ORGANIC //So you can't revive boss monsters or robots with it
+
+/obj/item/lazarus_injector/afterattack(atom/target, mob/user, proximity_flag)
+ if(!loaded)
+ return
+ if(istype(target, /mob/living) && proximity_flag)
+ if(istype(target, /mob/living/simple_animal))
+ var/mob/living/simple_animal/M = target
+ if(M.sentience_type != revive_type)
+ to_chat(user, "[src] does not work on this sort of creature.")
+ return
+ if(M.stat == DEAD)
+ M.faction = list("neutral")
+ M.revive()
+ M.can_collar = 1
+ if(istype(target, /mob/living/simple_animal/hostile))
+ var/mob/living/simple_animal/hostile/H = M
+ if(malfunctioning)
+ H.faction |= list("lazarus", "\ref[user]")
+ H.robust_searching = 1
+ H.friends += user
+ H.attack_same = 1
+ log_game("[user] has revived hostile mob [target] with a malfunctioning lazarus injector")
+ else
+ H.attack_same = 0
+ loaded = 0
+ user.visible_message("[user] injects [M] with [src], reviving it.")
+ playsound(src,'sound/effects/refill.ogg',50,1)
+ icon_state = "lazarus_empty"
+ return
+ else
+ to_chat(user, "[src] is only effective on the dead.")
+ return
+ else
+ to_chat(user, "[src] is only effective on lesser beings.")
+ return
+
+/obj/item/lazarus_injector/emag_act(mob/user)
+ if(!malfunctioning)
+ malfunctioning = 1
+ to_chat(user, "You override [src]'s safety protocols.")
+
+/obj/item/lazarus_injector/emp_act()
+ if(!malfunctioning)
+ malfunctioning = 1
+
+/obj/item/lazarus_injector/examine(mob/user)
+ ..(user)
+ if(!loaded)
+ to_chat(user, "[src] is empty.")
+ if(malfunctioning)
+ to_chat(user, "The display on [src] seems to be flickering.")
+
+/*********************Mob Capsule*************************/
+
+/obj/item/mobcapsule
+ name = "lazarus capsule"
+ desc = "It allows you to store and deploy lazarus-injected creatures easier."
+ icon = 'icons/obj/mobcap.dmi'
+ icon_state = "mobcap0"
+ w_class = WEIGHT_CLASS_TINY
+ throw_range = 20
+ var/mob/living/simple_animal/captured = null
+ var/colorindex = 0
+
+/obj/item/mobcapsule/Destroy()
+ if(captured)
+ captured.ghostize()
+ QDEL_NULL(captured)
+ return ..()
+
+/obj/item/mobcapsule/attack(var/atom/A, mob/user, prox_flag)
+ if(!istype(A, /mob/living/simple_animal) || isbot(A))
+ return ..()
+ capture(A, user)
+ return 1
+
+/obj/item/mobcapsule/proc/capture(var/mob/target, var/mob/U as mob)
+ var/mob/living/simple_animal/T = target
+ if(captured)
+ to_chat(U, "Capture failed!: The capsule already has a mob registered to it!")
+ else
+ if(istype(T) && "neutral" in T.faction)
+ T.forceMove(src)
+ T.name = "[U.name]'s [initial(T.name)]"
+ T.cancel_camera()
+ name = "Lazarus Capsule: [initial(T.name)]"
+ to_chat(U, "You placed a [T.name] inside the Lazarus Capsule!")
+ captured = T
+ else
+ to_chat(U, "You can't capture that mob!")
+
+/obj/item/mobcapsule/throw_impact(atom/A, mob/user)
+ ..()
+ if(captured)
+ dump_contents(user)
+
+/obj/item/mobcapsule/proc/dump_contents(mob/user)
+ if(captured)
+ captured.forceMove(get_turf(src))
+ captured = null
+
+/obj/item/mobcapsule/attack_self(mob/user)
+ colorindex += 1
+ if(colorindex >= 6)
+ colorindex = 0
+ icon_state = "mobcap[colorindex]"
+ update_icon()
\ No newline at end of file
diff --git a/code/modules/mining/equipment/mineral_scanner.dm b/code/modules/mining/equipment/mineral_scanner.dm
new file mode 100644
index 00000000000..6a706ca523f
--- /dev/null
+++ b/code/modules/mining/equipment/mineral_scanner.dm
@@ -0,0 +1,116 @@
+/**********************Mining Scanner**********************/
+/obj/item/mining_scanner
+ desc = "A scanner that checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results."
+ name = "manual mining scanner"
+ icon = 'icons/obj/device.dmi'
+ icon_state = "mining1"
+ item_state = "analyzer"
+ w_class = WEIGHT_CLASS_SMALL
+ flags = CONDUCT
+ slot_flags = SLOT_BELT
+ var/cooldown = 0
+ origin_tech = "engineering=1;magnets=1"
+
+/obj/item/mining_scanner/attack_self(mob/user)
+ if(!user.client)
+ return
+ if(!cooldown)
+ cooldown = 1
+ spawn(40)
+ cooldown = 0
+ var/list/mobs = list()
+ mobs |= user
+ mineral_scan_pulse(mobs, get_turf(user))
+
+
+//Debug item to identify all ore spread quickly
+/obj/item/mining_scanner/admin
+
+/obj/item/mining_scanner/admin/attack_self(mob/user)
+ for(var/turf/simulated/mineral/M in world)
+ if(M.scan_state)
+ M.icon_state = M.scan_state
+ qdel(src)
+
+/obj/item/t_scanner/adv_mining_scanner
+ desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear meson scanners for optimal results. This one has an extended range."
+ name = "advanced automatic mining scanner"
+ icon_state = "mining0"
+ item_state = "analyzer"
+ w_class = WEIGHT_CLASS_SMALL
+ flags = CONDUCT
+ slot_flags = SLOT_BELT
+ var/cooldown = 35
+ var/on_cooldown = 0
+ var/range = 7
+ var/meson = TRUE
+ origin_tech = "engineering=3;magnets=3"
+
+/obj/item/t_scanner/adv_mining_scanner/cyborg
+ flags = CONDUCT | NODROP
+
+/obj/item/t_scanner/adv_mining_scanner/material
+ meson = FALSE
+ desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results. This one has an extended range."
+
+/obj/item/t_scanner/adv_mining_scanner/lesser
+ name = "automatic mining scanner"
+ desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear meson scanners for optimal results."
+ range = 4
+ cooldown = 50
+
+/obj/item/t_scanner/adv_mining_scanner/lesser/material
+ desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results."
+ meson = FALSE
+
+/obj/item/t_scanner/adv_mining_scanner/scan()
+ if(!on_cooldown)
+ on_cooldown = 1
+ spawn(cooldown)
+ on_cooldown = 0
+ var/turf/t = get_turf(src)
+ var/list/mobs = recursive_mob_check(t, client_check = 1, sight_check = 0, include_radio = 0)
+ if(!mobs.len)
+ return
+ if(meson)
+ mineral_scan_pulse(mobs, t, range)
+ else
+ mineral_scan_pulse_material(mobs, t, range)
+
+//For use with mesons
+/proc/mineral_scan_pulse(list/mobs, turf/T, range = world.view)
+ var/list/minerals = list()
+ for(var/turf/simulated/mineral/M in range(range, T))
+ if(M.scan_state)
+ minerals += M
+ if(minerals.len)
+ for(var/mob/user in mobs)
+ if(user.client)
+ var/client/C = user.client
+ for(var/turf/simulated/mineral/M in minerals)
+ var/turf/F = get_turf(M)
+ var/image/I = image('icons/turf/mining.dmi', loc = F, icon_state = M.scan_state, layer = 18)
+ C.images += I
+ spawn(30)
+ if(C)
+ C.images -= I
+
+//For use with material scanners
+/proc/mineral_scan_pulse_material(list/mobs, turf/T, range = world.view)
+ var/list/minerals = list()
+ for(var/turf/simulated/mineral/M in range(range, T))
+ if(M.scan_state)
+ minerals += M
+ if(minerals.len)
+ for(var/turf/simulated/mineral/M in minerals)
+ var/obj/effect/temp_visual/mining_overlay/C = new/obj/effect/temp_visual/mining_overlay(M)
+ C.icon_state = M.scan_state
+
+/obj/effect/temp_visual/mining_overlay
+ layer = 18
+ icon = 'icons/turf/mining.dmi'
+ anchored = 1
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+ duration = 30
+ pixel_x = -4
+ pixel_y = -4
\ No newline at end of file
diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm
new file mode 100644
index 00000000000..4d47f88e065
--- /dev/null
+++ b/code/modules/mining/equipment/mining_tools.dm
@@ -0,0 +1,142 @@
+/*****************Pickaxes & Drills & Shovels****************/
+/obj/item/pickaxe
+ name = "pickaxe"
+ icon = 'icons/obj/items.dmi'
+ icon_state = "pickaxe"
+ flags = CONDUCT
+ slot_flags = SLOT_BELT
+ force = 15
+ throwforce = 10
+ item_state = "pickaxe"
+ w_class = WEIGHT_CLASS_BULKY
+ materials = list(MAT_METAL=2000) //one sheet, but where can you make them?
+ origin_tech = "materials=2;engineering=3"
+ attack_verb = list("hit", "pierced", "sliced", "attacked")
+ var/list/digsound = list('sound/effects/picaxe1.ogg','sound/effects/picaxe2.ogg','sound/effects/picaxe3.ogg')
+ var/drill_verb = "picking"
+ sharp = 1
+ var/excavation_amount = 100
+ usesound = 'sound/effects/picaxe1.ogg'
+ toolspeed = 1
+
+/obj/item/pickaxe/proc/playDigSound()
+ playsound(src, pick(digsound),20,1)
+
+/obj/item/pickaxe/emergency
+ name = "emergency disembarkation tool"
+ desc = "For extracting yourself from rough landings."
+
+/obj/item/pickaxe/safety
+ name = "safety pickaxe"
+ desc = "A pickaxe designed to be only effective at digging rock and ore, very ineffective as a weapon."
+ force = 1
+ throwforce = 1
+ attack_verb = list("ineffectively hit")
+
+/obj/item/pickaxe/mini
+ name = "compact pickaxe"
+ desc = "A smaller, compact version of the standard pickaxe."
+ icon_state = "minipick"
+ force = 10
+ throwforce = 7
+ w_class = WEIGHT_CLASS_NORMAL
+ materials = list(MAT_METAL = 1000)
+
+/obj/item/pickaxe/silver
+ name = "silver-plated pickaxe"
+ icon_state = "spickaxe"
+ item_state = "spickaxe"
+ origin_tech = "materials=3;engineering=4"
+ 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/gold
+ name = "golden pickaxe"
+ icon_state = "gpickaxe"
+ item_state = "gpickaxe"
+ origin_tech = "materials=4;engineering=4"
+ toolspeed = 0.4
+ desc = "A gold-plated pickaxe that mines faster than standard-issue."
+ force = 18
+
+/obj/item/pickaxe/diamond
+ name = "diamond-tipped pickaxe"
+ icon_state = "dpickaxe"
+ item_state = "dpickaxe"
+ origin_tech = "materials=5;engineering=4"
+ 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"
+ item_state = "jackhammer"
+ digsound = list('sound/weapons/drill.ogg')
+ toolspeed = 0.6 //available from roundstart, faster than a pickaxe.
+ hitsound = 'sound/weapons/drill.ogg'
+ usesound = 'sound/weapons/drill.ogg'
+ origin_tech = "materials=2;powerstorage=2;engineering=3"
+ desc = "An electric mining drill for the especially scrawny."
+
+/obj/item/pickaxe/drill/cyborg
+ name = "cyborg mining drill"
+ desc = "An integrated electric mining drill."
+ flags = NODROP
+
+/obj/item/pickaxe/drill/diamonddrill
+ name = "diamond-tipped mining drill"
+ icon_state = "diamonddrill"
+ origin_tech = "materials=6;powerstorage=4;engineering=4"
+ desc = "Yours is the drill that will pierce the heavens!"
+ toolspeed = 0.2
+
+/obj/item/pickaxe/drill/cyborg/diamond //This is the BORG version!
+ name = "diamond-tipped cyborg mining drill" //To inherit the NODROP flag, and easier to change borg specific drill mechanics.
+ icon_state = "diamonddrill"
+ toolspeed = 0.2
+
+/obj/item/pickaxe/drill/jackhammer
+ name = "sonic jackhammer"
+ icon_state = "jackhammer"
+ item_state = "jackhammer"
+ origin_tech = "materials=6;powerstorage=4;engineering=5;magnets=4"
+ digsound = list('sound/weapons/sonic_jackhammer.ogg')
+ hitsound = 'sound/weapons/sonic_jackhammer.ogg'
+ usesound = 'sound/weapons/sonic_jackhammer.ogg'
+ desc = "Cracks rocks with sonic blasts, and doubles as a demolition power tool for smashing walls."
+ toolspeed = 0.1 //the epitome of powertools. extremely fast mining, laughs at puny walls
+
+/obj/item/shovel
+ name = "shovel"
+ desc = "A large tool for digging and moving dirt."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "shovel"
+ flags = CONDUCT
+ slot_flags = SLOT_BELT
+ force = 8
+ throwforce = 4
+ item_state = "shovel"
+ w_class = WEIGHT_CLASS_NORMAL
+ materials = list(MAT_METAL=50)
+ origin_tech = "materials=2;engineering=2"
+ attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked")
+ usesound = 'sound/effects/shovel_dig.ogg'
+ toolspeed = 1
+
+/obj/item/shovel/spade
+ name = "spade"
+ desc = "A small tool for digging and moving dirt."
+ icon_state = "spade"
+ item_state = "spade"
+ force = 5
+ throwforce = 7
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/shovel/safety
+ name = "safety shovel"
+ desc = "A large tool for digging and moving dirt. Was modified with extra safety, making it ineffective as a weapon."
+ force = 1
+ throwforce = 1
+ attack_verb = list("ineffectively hit")
\ No newline at end of file
diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm
new file mode 100644
index 00000000000..2d96c46d161
--- /dev/null
+++ b/code/modules/mining/equipment/regenerative_core.dm
@@ -0,0 +1,139 @@
+/*********************Hivelord stabilizer****************/
+/obj/item/hivelordstabilizer
+ name = "hivelord stabilizer"
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle19"
+ desc = "Inject a hivelord core with this stabilizer to preserve its healing powers indefinitely."
+ w_class = WEIGHT_CLASS_TINY
+ origin_tech = "biotech=3"
+
+/obj/item/hivelordstabilizer/afterattack(obj/item/organ/internal/M, mob/user)
+ . = ..()
+ var/obj/item/organ/internal/hivelord_core/C = M
+ if(!istype(C, /obj/item/organ/internal/hivelord_core))
+ to_chat(user, "The stabilizer only works on certain types of monster organs, generally regenerative in nature.")
+ return ..()
+
+ C.preserved()
+ to_chat(user, "You inject the [M] with the stabilizer. It will no longer go inert.")
+ qdel(src)
+
+/************************Hivelord core*******************/
+/obj/item/organ/internal/hivelord_core
+ name = "hivelord remains"
+ desc = "All that remains of a hivelord. It can be used to help keep your body going, but it will rapidly decay into uselessness."
+ icon_state = "roro core 2"
+ flags = NOBLUDGEON
+ slot = "hivecore"
+ force = 0
+ actions_types = list(/datum/action/item_action/organ_action/use)
+ var/inert = 0
+ var/preserved = 0
+
+/obj/item/organ/internal/hivelord_core/New()
+ ..()
+ addtimer(CALLBACK(src, .proc/inert_check), 2400)
+
+/obj/item/organ/internal/hivelord_core/proc/inert_check()
+ if(!preserved)
+ go_inert()
+
+/obj/item/organ/internal/hivelord_core/proc/preserved(implanted = 0)
+ inert = FALSE
+ preserved = TRUE
+ update_icon()
+ desc = "All that remains of a hivelord. It is preserved, allowing you to use it to heal completely without danger of decay."
+ if(implanted)
+ feedback_add_details("hivelord_core", "[type]|implanted")
+ else
+ feedback_add_details("hivelord_core", "[type]|stabilizer")
+
+/obj/item/organ/internal/hivelord_core/proc/go_inert()
+ inert = TRUE
+ name = "decayed regenerative core"
+ desc = "All that remains of a hivelord. It has decayed, and is completely useless."
+ feedback_add_details("hivelord_core", "[src.type]|inert")
+ update_icon()
+
+/obj/item/organ/internal/hivelord_core/ui_action_click()
+ if(inert)
+ to_chat(owner, "[src] breaks down as it tries to activate.")
+ else
+ owner.revive()
+ qdel(src)
+
+/obj/item/organ/internal/hivelord_core/on_life()
+ ..()
+ if(owner.health < HEALTH_THRESHOLD_CRIT)
+ ui_action_click()
+
+///Handles applying the core, logging and status/mood events.
+/obj/item/organ/internal/hivelord_core/proc/applyto(atom/target, mob/user)
+ if(ishuman(target))
+ var/mob/living/carbon/human/H = target
+ if(inert)
+ to_chat(user, "[src] has decayed and can no longer be used to heal.")
+ return
+ else
+ if(H.stat == DEAD)
+ to_chat(user, "[src] is useless on the dead.")
+ return
+ if(H != user)
+ H.visible_message("[user] forces [H] to apply [src]... Black tendrils entangle and reinforce [H.p_them()]!")
+ feedback_add_details("hivelord_core","[src.type]|used|other")
+ else
+ to_chat(user, "You start to smear [src] on yourself. Disgusting tendrils hold you together and allow you to keep moving, but for how long?")
+ feedback_add_details("hivelord_core","[src.type]|used|self")
+ H.revive()
+ user.drop_item()
+ qdel(src)
+
+/obj/item/organ/internal/hivelord_core/afterattack(atom/target, mob/user, proximity_flag)
+ . = ..()
+ if(proximity_flag)
+ applyto(target, user)
+
+/obj/item/organ/internal/hivelord_core/attack_self(mob/user)
+ applyto(user, user)
+
+/obj/item/organ/internal/hivelord_core/insert(mob/living/carbon/M, special = 0)
+ ..()
+ if(!preserved && !inert)
+ preserved(TRUE)
+ owner.visible_message("[src] stabilizes as it's inserted.")
+
+/obj/item/organ/internal/hivelord_core/remove(mob/living/carbon/M, special = 0)
+ if(!inert && !special)
+ owner.visible_message("[src] rapidly decays as it's removed.")
+ go_inert()
+ return ..()
+
+/obj/item/organ/internal/hivelord_core/prepare_eat()
+ return null
+
+/*************************Legion core********************/
+/obj/item/organ/internal/hivelord_core/legion
+ name = "legion's soul"
+ desc = "A strange rock that crackles with power. It can be used to heal completely, but it will rapidly decay into uselessness."
+ icon_state = "legion_soul"
+
+/obj/item/organ/internal/hivelord_core/legion/New()
+ ..()
+ update_icon()
+
+/obj/item/organ/internal/hivelord_core/legion/update_icon()
+ icon_state = inert ? "legion_soul_inert" : "legion_soul"
+ cut_overlays()
+ if(!inert && !preserved)
+ add_overlay("legion_soul_crackle")
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
+
+/obj/item/organ/internal/hivelord_core/legion/go_inert()
+ ..()
+ desc = "[src] has become inert. It has decayed, and is completely useless."
+
+/obj/item/organ/internal/hivelord_core/legion/preserved(implanted = 0)
+ ..()
+ desc = "[src] has been stabilized. It is preserved, allowing you to use it to heal completely without danger of decay."
\ No newline at end of file
diff --git a/code/modules/mining/equipment/resonator.dm b/code/modules/mining/equipment/resonator.dm
new file mode 100644
index 00000000000..4c7c4e599ef
--- /dev/null
+++ b/code/modules/mining/equipment/resonator.dm
@@ -0,0 +1,116 @@
+/**********************Resonator**********************/
+/obj/item/resonator
+ name = "resonator"
+ icon = 'icons/obj/items.dmi'
+ icon_state = "resonator"
+ item_state = "resonator"
+ origin_tech = "magnets=3;engineering=3"
+ 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 vaccuum."
+ w_class = WEIGHT_CLASS_NORMAL
+ force = 15
+ throwforce = 10
+ var/burst_time = 30
+ var/fieldlimit = 4
+ var/list/fields = list()
+ var/quick_burst_mod = 0.8
+
+/obj/item/resonator/upgraded
+ name = "upgraded resonator"
+ desc = "An upgraded version of the resonator that can produce more fields at once."
+ icon_state = "resonator_u"
+ origin_tech = "materials=4;powerstorage=3;engineering=3;magnets=3"
+ fieldlimit = 6
+ quick_burst_mod = 1
+
+/obj/item/resonator/attack_self(mob/user)
+ if(burst_time == 50)
+ burst_time = 30
+ to_chat(user, "You set the resonator's fields to detonate after 3 seconds.")
+ else
+ burst_time = 50
+ to_chat(user, "You set the resonator's fields to detonate after 5 seconds.")
+
+/obj/item/resonator/proc/CreateResonance(target, mob/user)
+ var/turf/T = get_turf(target)
+ var/obj/effect/temp_visual/resonance/R = locate(/obj/effect/temp_visual/resonance) in T
+ if(R)
+ R.damage_multiplier = quick_burst_mod
+ R.burst()
+ return
+ if(LAZYLEN(fields) < fieldlimit)
+ new /obj/effect/temp_visual/resonance(T, user, src, burst_time)
+ user.changeNext_move(CLICK_CD_MELEE)
+
+/obj/item/resonator/pre_attackby(atom/target, mob/user, params)
+ if(check_allowed_items(target, 1))
+ CreateResonance(target, user)
+ return TRUE
+
+//resonance field, crushes rock, damages mobs
+/obj/effect/temp_visual/resonance
+ name = "resonance field"
+ desc = "A resonating field that significantly damages anything inside of it when the field eventually ruptures. More damaging in low pressure environments."
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "shield1"
+ layer = ABOVE_ALL_MOB_LAYER
+ duration = 50
+ var/resonance_damage = 20
+ var/damage_multiplier = 1
+ var/creator
+ var/obj/item/resonator/res
+
+/obj/effect/temp_visual/resonance/New(loc, set_creator, set_resonator, set_duration)
+ duration = set_duration
+ . = ..()
+ creator = set_creator
+ res = set_resonator
+ if(res)
+ res.fields += src
+ playsound(src,'sound/weapons/resonator_fire.ogg',50,1)
+ transform = matrix() * 0.75
+ animate(src, transform = matrix() * 1.5, time = duration)
+ deltimer(timerid)
+ timerid = addtimer(CALLBACK(src, .proc/burst), duration, TIMER_STOPPABLE)
+
+/obj/effect/temp_visual/resonance/Destroy()
+ if(res)
+ res.fields -= src
+ res = null
+ creator = null
+ return ..()
+
+/obj/effect/temp_visual/resonance/proc/check_pressure(turf/proj_turf)
+ if(!proj_turf)
+ proj_turf = get_turf(src)
+ resonance_damage = initial(resonance_damage)
+ if(lavaland_equipment_pressure_check(proj_turf))
+ name = "strong [initial(name)]"
+ resonance_damage *= 3
+ else
+ name = initial(name)
+ resonance_damage *= damage_multiplier
+
+/obj/effect/temp_visual/resonance/proc/burst()
+ var/turf/T = get_turf(src)
+ new /obj/effect/temp_visual/resonance_crush(T)
+ if(ismineralturf(T))
+ var/turf/simulated/mineral/M = T
+ M.gets_drilled(creator)
+ check_pressure(T)
+ playsound(T,'sound/weapons/resonator_blast.ogg',50,1)
+ for(var/mob/living/L in T)
+ if(creator)
+ add_attack_logs(creator, L, "Resonance field'ed")
+ to_chat(L, "[src] ruptured with you in it!")
+ L.apply_damage(resonance_damage, BRUTE)
+ qdel(src)
+
+/obj/effect/temp_visual/resonance_crush
+ icon_state = "shield1"
+ layer = ABOVE_ALL_MOB_LAYER
+ duration = 4
+
+/obj/effect/temp_visual/resonance_crush/New()
+ ..()
+ transform = matrix()*1.5
+ animate(src, transform = matrix() * 0.1, alpha = 50, time = 4)
\ No newline at end of file
diff --git a/code/modules/mining/equipment/vendor_items.dm b/code/modules/mining/equipment/vendor_items.dm
new file mode 100644
index 00000000000..8868d4655b5
--- /dev/null
+++ b/code/modules/mining/equipment/vendor_items.dm
@@ -0,0 +1,14 @@
+/**********************Mining Equipment Vendor Items**************************/
+//misc stuff you can buy from the vendor that has special code but doesn't really need its own file
+
+/**********************Facehugger toy**********************/
+/obj/item/clothing/mask/facehugger/toy
+ item_state = "facehugger_inactive"
+ desc = "A toy often used to play pranks on other miners by putting it in their beds. It takes a bit to recharge after latching onto something."
+ throwforce = 0
+ real = 0
+ sterile = 1
+ tint = 3 //Makes it feel more authentic when it latches on
+
+/obj/item/clothing/mask/facehugger/toy/Die()
+ return
diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm
new file mode 100644
index 00000000000..7ab7276bb9e
--- /dev/null
+++ b/code/modules/mining/equipment/wormhole_jaunter.dm
@@ -0,0 +1,77 @@
+/**********************Jaunter**********************/
+/obj/item/wormhole_jaunter
+ name = "wormhole jaunter"
+ desc = "A single use device harnessing outdated wormhole technology, Nanotrasen has since turned its eyes to bluespace for more accurate teleportation. The wormholes it creates are unpleasant to travel through, to say the least.\nThanks to modifications provided by the Free Golems, this jaunter can be worn on the belt to provide protection from chasms."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "Jaunter"
+ item_state = "electronic"
+ throwforce = 0
+ w_class = WEIGHT_CLASS_SMALL
+ throw_speed = 3
+ throw_range = 5
+ origin_tech = "bluespace=2"
+ slot_flags = SLOT_BELT
+
+/obj/item/wormhole_jaunter/attack_self(mob/user)
+ user.visible_message("[user.name] activates the [name]!")
+ activate(user, TRUE)
+
+/obj/item/wormhole_jaunter/proc/turf_check(mob/user)
+ var/turf/device_turf = get_turf(user)
+ if(!device_turf || !is_teleport_allowed(device_turf.z))
+ to_chat(user, "You're having difficulties getting the [name] to work.")
+ return FALSE
+ return TRUE
+
+/obj/item/wormhole_jaunter/proc/get_destinations(mob/user)
+ var/list/destinations = list()
+
+ for(var/obj/item/radio/beacon/B in world)
+ var/turf/T = get_turf(B)
+ if(is_station_level(T.z))
+ destinations += B
+
+ return destinations
+
+/obj/item/wormhole_jaunter/proc/activate(mob/user, adjacent)
+ if(!turf_check(user))
+ return
+
+ var/list/L = get_destinations(user)
+ if(!L.len)
+ to_chat(user, "The [name] found no beacons in the world to anchor a wormhole to.")
+ return
+ var/chosen_beacon = pick(L)
+ var/obj/effect/portal/jaunt_tunnel/J = new(get_turf(src), get_turf(chosen_beacon), src, 100)
+ if(adjacent)
+ try_move_adjacent(J)
+ else
+ J.teleport(user)
+ playsound(src,'sound/effects/sparks4.ogg',50,1)
+ qdel(src)
+
+/obj/item/wormhole_jaunter/proc/chasm_react(mob/user)
+ if(user.get_item_by_slot(slot_belt) == src)
+ to_chat(user, "Your [name] activates, saving you from the chasm!")
+ activate(user, FALSE)
+ else
+ to_chat(user, "[src] is not attached to your belt, preventing it from saving you from the chasm. RIP.")
+
+/obj/effect/portal/jaunt_tunnel
+ name = "jaunt tunnel"
+ icon = 'icons/effects/effects.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."
+ failchance = 0
+
+/obj/effect/portal/jaunt_tunnel/teleport(atom/movable/M)
+ . = ..()
+ if(.)
+ // KERPLUNK
+ playsound(M,'sound/weapons/resonator_blast.ogg', 50, 1)
+ if(iscarbon(M))
+ var/mob/living/carbon/L = M
+ L.Weaken(6)
+ if(ishuman(L))
+ shake_camera(L, 20, 1)
+ addtimer(CALLBACK(L, /mob/living/carbon.proc/vomit), 20)
\ No newline at end of file
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
deleted file mode 100644
index 37569b7b58e..00000000000
--- a/code/modules/mining/equipment_locker.dm
+++ /dev/null
@@ -1,1151 +0,0 @@
-/**********************Ore Redemption Unit**************************/
-//Turns all the various mining machines into a single unit to speed up mining and establish a point system
-
-/obj/machinery/mineral/ore_redemption
- name = "ore redemption machine"
- desc = "A machine that accepts ore and instantly transforms it into workable material sheets. Points for ore are generated based on type and can be redeemed at a mining equipment vendor."
- icon = 'icons/obj/machines/mining_machines.dmi'
- icon_state = "ore_redemption"
- density = TRUE
- anchored = TRUE
- input_dir = NORTH
- output_dir = SOUTH
- req_access = list(access_mineral_storeroom)
- speed_process = TRUE
- layer = BELOW_OBJ_LAYER
- var/req_access_reclaim = access_mining_station
- var/obj/item/card/id/inserted_id
- var/points = 0
- var/ore_pickup_rate = 15
- var/sheet_per_ore = 1
- var/point_upgrade = 1
- var/list/ore_values = list("sand" = 1, "iron" = 1, "plasma" = 15, "silver" = 16, "gold" = 18, "titanium" = 30, "uranium" = 30, "diamond" = 50, "bluespace crystal" = 50, "bananium" = 60, "tranquillite" = 60)
- var/message_sent = FALSE
- var/list/ore_buffer = list()
- var/datum/research/files
- var/obj/item/disk/design_disk/inserted_disk
- var/list/supply_consoles = list("Science", "Robotics", "Research Director's Desk", "Mechanic", "Engineering" = list("metal", "glass", "plasma"), "Chief Engineer's Desk" = list("metal", "glass", "plasma"), "Atmospherics" = list("metal", "glass", "plasma"), "Bar" = list("uranium", "plasma"), "Virology" = list("plasma", "uranium", "gold"))
-
-/obj/machinery/mineral/ore_redemption/New()
- ..()
- AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TRANQUILLITE, MAT_TITANIUM, MAT_BLUESPACE), INFINITY, FALSE, /obj/item/stack)
- files = new /datum/research/smelter(src)
- component_parts = list()
- component_parts += new /obj/item/circuitboard/ore_redemption(null)
- component_parts += new /obj/item/stock_parts/matter_bin(null)
- component_parts += new /obj/item/stock_parts/manipulator(null)
- component_parts += new /obj/item/stock_parts/micro_laser(null)
- component_parts += new /obj/item/assembly/igniter(null)
- component_parts += new /obj/item/stock_parts/console_screen(null)
- RefreshParts()
-
-/obj/machinery/mineral/ore_redemption/upgraded/New()
- ..()
- component_parts = list()
- component_parts += new /obj/item/circuitboard/ore_redemption(null)
- component_parts += new /obj/item/stock_parts/matter_bin/super(null)
- component_parts += new /obj/item/stock_parts/manipulator/pico(null)
- component_parts += new /obj/item/stock_parts/micro_laser/ultra(null)
- component_parts += new /obj/item/assembly/igniter(null)
- component_parts += new /obj/item/stock_parts/console_screen(null)
- RefreshParts()
-
-/obj/machinery/mineral/ore_redemption/golem
- req_access = list(access_free_golems)
- req_access_reclaim = access_free_golems
-
-/obj/machinery/mineral/ore_redemption/golem/New()
- ..()
- component_parts = list()
- component_parts += new /obj/item/circuitboard/ore_redemption/golem(null)
- component_parts += new /obj/item/stock_parts/matter_bin(null)
- component_parts += new /obj/item/stock_parts/manipulator(null)
- component_parts += new /obj/item/stock_parts/micro_laser(null)
- component_parts += new /obj/item/assembly/igniter(null)
- component_parts += new /obj/item/stock_parts/console_screen(null)
- RefreshParts()
-
-/obj/machinery/mineral/ore_redemption/Destroy()
- QDEL_NULL(files)
- GET_COMPONENT(materials, /datum/component/material_container)
- materials.retrieve_all()
- return ..()
-
-/obj/machinery/mineral/ore_redemption/RefreshParts()
- var/ore_pickup_rate_temp = 15
- var/point_upgrade_temp = 1
- var/sheet_per_ore_temp = 1
- for(var/obj/item/stock_parts/matter_bin/B in component_parts)
- sheet_per_ore_temp = 0.65 + (0.35 * B.rating)
- for(var/obj/item/stock_parts/manipulator/M in component_parts)
- ore_pickup_rate_temp = 15 * M.rating
- for(var/obj/item/stock_parts/micro_laser/L in component_parts)
- point_upgrade_temp = 0.65 + (0.35 * L.rating)
- ore_pickup_rate = ore_pickup_rate_temp
- point_upgrade = point_upgrade_temp
- sheet_per_ore = sheet_per_ore_temp
-
-/obj/machinery/mineral/ore_redemption/proc/smelt_ore(obj/item/stack/ore/O)
-
- ore_buffer -= O
-
- if(O && O.refined_type)
- points += O.points * point_upgrade * O.amount
-
- GET_COMPONENT(materials, /datum/component/material_container)
- var/material_amount = materials.get_item_material_amount(O)
-
- if(!material_amount)
- qdel(O) //no materials, incinerate it
-
- else if(!materials.has_space(material_amount * sheet_per_ore * O.amount)) //if there is no space, eject it
- unload_mineral(O)
-
- else
- materials.insert_item(O, sheet_per_ore) //insert it
- qdel(O)
-
-/obj/machinery/mineral/ore_redemption/proc/can_smelt_alloy(datum/design/D)
- if(D.make_reagents.len)
- return FALSE
-
- var/build_amount = 0
-
- GET_COMPONENT(materials, /datum/component/material_container)
- for(var/mat_id in D.materials)
- var/M = D.materials[mat_id]
- var/datum/material/redemption_mat = materials.materials[mat_id]
-
- if(!M || !redemption_mat)
- return FALSE
-
- var/smeltable_sheets = round(redemption_mat.amount / M)
-
- if(!smeltable_sheets)
- return FALSE
-
- if(!build_amount)
- build_amount = smeltable_sheets
-
- build_amount = min(build_amount, smeltable_sheets)
-
- return build_amount
-
-/obj/machinery/mineral/ore_redemption/proc/process_ores(list/ores_to_process)
- var/current_amount = 0
- for(var/ore in ores_to_process)
- if(current_amount >= ore_pickup_rate)
- break
- smelt_ore(ore)
-
-/obj/machinery/mineral/ore_redemption/proc/send_console_message()
- if(!is_station_level(z))
- return
- message_sent = TRUE
- var/area/A = get_area(src)
- var/msg = "Now available in [A]:
"
-
- var/has_minerals = FALSE
- var/mineral_name = null
- GET_COMPONENT(materials, /datum/component/material_container)
- for(var/mat_id in materials.materials)
- var/datum/material/M = materials.materials[mat_id]
- var/mineral_amount = M.amount / MINERAL_MATERIAL_AMOUNT
- mineral_name = capitalize(M.name)
- if(mineral_amount)
- has_minerals = TRUE
- msg += "[mineral_name]: [mineral_amount] sheets
"
-
- if(!has_minerals)
- return
-
- for(var/obj/machinery/requests_console/D in allConsoles)
- if(D.department in src.supply_consoles)
- if(supply_consoles[D.department] == null || (mineral_name in supply_consoles[D.department]))
- D.createMessage("Ore Redemption Machine", "New Minerals Available!", msg, 1)
-
-/obj/machinery/mineral/ore_redemption/process()
- if(panel_open || !powered())
- return
- var/atom/input = get_step(src, input_dir)
- var/obj/structure/ore_box/OB = locate() in input
- if(OB)
- input = OB
-
- for(var/obj/item/stack/ore/O in input)
- if(QDELETED(O))
- continue
- ore_buffer |= O
- O.forceMove(src)
- CHECK_TICK
-
- if(LAZYLEN(ore_buffer))
- message_sent = FALSE
- process_ores(ore_buffer)
- else if(!message_sent)
- send_console_message()
-
-/obj/machinery/mineral/ore_redemption/attackby(obj/item/W, mob/user, params)
- if(exchange_parts(user, W))
- return
- if(default_unfasten_wrench(user, W))
- return
- if(default_deconstruction_screwdriver(user, "ore_redemption-open", "ore_redemption", W))
- updateUsrDialog()
- return
- if(default_deconstruction_crowbar(W))
- return
-
- if(!powered())
- return
- if(istype(W, /obj/item/card/id))
- var/obj/item/card/id/I = user.get_active_hand()
- if(istype(I) && !istype(inserted_id))
- if(!user.drop_item())
- return
- I.forceMove(src)
- inserted_id = I
- interact(user)
- return
-
- if(ismultitool(W) && panel_open)
- input_dir = turn(input_dir, -90)
- output_dir = turn(output_dir, -90)
- to_chat(user, "You change [src]'s I/O settings, setting the input to [dir2text(input_dir)] and the output to [dir2text(output_dir)].")
- return
-
- if(istype(W, /obj/item/disk/design_disk))
- if(user.drop_item())
- W.forceMove(src)
- inserted_disk = W
- interact(user)
- return TRUE
-
- return ..()
-
-/obj/machinery/mineral/ore_redemption/attack_hand(mob/user)
- if(..())
- return
- interact(user)
-
-/obj/machinery/mineral/ore_redemption/interact(mob/user)
- var/dat = "This machine only accepts ore. Gibtonite and Slag are not accepted.
"
- dat += "Current unclaimed points: [points]
"
-
- if(inserted_id)
- dat += "You have [inserted_id.mining_points] mining points collected. Eject ID.
"
- dat += "Claim points.
"
- else
- dat += "No ID inserted. Insert ID.
"
-
- GET_COMPONENT(materials, /datum/component/material_container)
- for(var/mat_id in materials.materials)
- var/datum/material/M = materials.materials[mat_id]
- if(M.amount)
- var/sheet_amount = M.amount / MINERAL_MATERIAL_AMOUNT
- dat += "[capitalize(M.name)]: [sheet_amount] "
- if(sheet_amount >= 1)
- dat += "Release
"
- else
- dat += "Release
"
-
- dat += "
Alloys:
"
-
- for(var/v in files.known_designs)
- var/datum/design/D = files.known_designs[v]
- if(can_smelt_alloy(D))
- dat += "[D.name]: Smelt
"
- else
- dat += "[D.name]: Smelt
"
-
- dat += "
Mineral Value List:
[get_ore_values()]
"
-
- if(inserted_disk)
- dat += "Eject disk
"
- dat += "Uploadable designs: "
-
- if(inserted_disk.blueprint)
- var/datum/design/D = inserted_disk.blueprint
- if(D.build_type & SMELTER)
- dat += "Name: [D.name]
Upload to smelter"
-
- dat += "
"
- else
- dat += "Insert design disk
"
-
- var/datum/browser/popup = new(user, "ore_redemption_machine", "Ore Redemption Machine", 400, 500)
- popup.set_content(dat)
- popup.open()
- return
-
-/obj/machinery/mineral/ore_redemption/proc/get_ore_values()
- var/dat = ""
- for(var/ore in ore_values)
- var/value = ore_values[ore]
- dat += "| [capitalize(ore)] | [value * point_upgrade] |
"
- dat += "
"
- return dat
-
-/obj/machinery/mineral/ore_redemption/Topic(href, href_list)
- if(..())
- return
- GET_COMPONENT(materials, /datum/component/material_container)
- if(href_list["eject_id"])
- usr.put_in_hands(inserted_id)
- inserted_id = null
- if(href_list["claim"])
- if(inserted_id)
- if(req_access_reclaim in inserted_id.access)
- inserted_id.mining_points += points
- points = 0
- else
- to_chat(usr, "Required access not found.")
- else if(href_list["insert_id"])
- var/obj/item/card/id/I = usr.get_active_hand()
- if(istype(I))
- if(!usr.drop_item())
- return
- I.forceMove(src)
- inserted_id = I
- else
- to_chat(usr, "Not a valid ID!")
- if(href_list["eject_disk"])
- if(inserted_disk)
- inserted_disk.forceMove(loc)
- inserted_disk = null
- if(href_list["insert_disk"])
- var/obj/item/disk/design_disk/D = usr.get_active_hand()
- if(istype(D))
- if(!usr.drop_item())
- return
- D.forceMove(src)
- inserted_disk = D
- if(href_list["upload"])
- if(inserted_disk && inserted_disk.blueprint)
- files.AddDesign2Known(inserted_disk.blueprint)
-
- if(href_list["release"])
- if(check_access(inserted_id) || allowed(usr)) //Check the ID inside, otherwise check the user
- var/mat_id = href_list["release"]
- if(!materials.materials[mat_id])
- return
-
- var/datum/material/mat = materials.materials[mat_id]
- var/stored_amount = mat.amount / MINERAL_MATERIAL_AMOUNT
-
- if(!stored_amount)
- return
-
- var/desired = input("How many sheets?", "How many sheets to eject?", 1) as null|num
- var/sheets_to_remove = round(min(desired,50,stored_amount))
-
- var/out = get_step(src, output_dir)
- materials.retrieve_sheets(sheets_to_remove, mat_id, out)
-
- else
- to_chat(usr, "Required access not found.")
-
- if(href_list["alloy"])
- var/alloy_id = href_list["alloy"]
- var/datum/design/alloy = files.FindDesignByID(alloy_id)
- if((check_access(inserted_id) || allowed(usr)) && alloy)
- var/desired = input("How many sheets?", "How many sheets would you like to smelt?", 1) as null|num
- if(desired < 1) // Stops an exploit that lets you build negative alloys and get free materials
- return
- var/smelt_amount = can_smelt_alloy(alloy)
- var/amount = round(min(desired,50,smelt_amount))
- materials.use_amount(alloy.materials, amount)
-
- var/output = new alloy.build_path(src)
- if(istype(output, /obj/item/stack/sheet))
- var/obj/item/stack/sheet/mineral/produced_alloy = output
- produced_alloy.amount = amount
- unload_mineral(produced_alloy)
- else
- unload_mineral(output)
-
- else
- to_chat(usr, "Required access not found.")
- updateUsrDialog()
-
-/obj/machinery/mineral/ore_redemption/ex_act(severity, target)
- do_sparks(5, 1, src)
- if(severity == 1)
- if(prob(50))
- qdel(src)
- else if(severity == 2)
- if(prob(25))
- qdel(src)
-
-/obj/machinery/mineral/ore_redemption/power_change()
- ..()
- update_icon()
- if(inserted_id && !powered())
- visible_message("The ID slot indicator light flickers on [src] as it spits out a card before powering down.")
- inserted_id.forceMove(loc)
-
-/obj/machinery/mineral/ore_redemption/update_icon()
- if(powered())
- icon_state = initial(icon_state)
- else
- icon_state = "[initial(icon_state)]-off"
-
-/**********************Mining Equipment Locker**************************/
-
-/obj/machinery/mineral/equipment_vendor
- name = "mining equipment vendor"
- desc = "An equipment vendor for miners, points collected at an ore redemption machine can be spent here."
- icon = 'icons/obj/machines/mining_machines.dmi'
- icon_state = "mining"
- density = 1
- anchored = 1.0
- var/obj/item/card/id/inserted_id
- var/list/prize_list = list( //if you add something to this, please, for the love of god, sort it by price/type. use tabs and not spaces.
- new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10),
- new /datum/data/mining_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 100),
- new /datum/data/mining_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 300),
- new /datum/data/mining_equipment("Whiskey", /obj/item/reagent_containers/food/drinks/bottle/whiskey, 100),
- new /datum/data/mining_equipment("Absinthe", /obj/item/reagent_containers/food/drinks/bottle/absinthe/premium, 100),
- new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150),
- new /datum/data/mining_equipment("Soap", /obj/item/soap/nanotrasen, 200),
- new /datum/data/mining_equipment("Laser Pointer", /obj/item/laser_pointer, 300),
- new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300),
- new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/hivelordstabilizer, 400),
- new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000),
- new /datum/data/mining_equipment("Point Transfer Card", /obj/item/card/mining_point_card, 500),
- new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 400),
- new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400),
- new /datum/data/mining_equipment("GAR Meson Scanners", /obj/item/clothing/glasses/meson/gar, 500),
- new /datum/data/mining_equipment("Explorer's Webbing", /obj/item/storage/belt/mining, 500),
- new /datum/data/mining_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/autoinjector/survival, 500),
- new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 600),
- new /datum/data/mining_equipment("Tracking Implant Kit", /obj/item/storage/box/minertracker, 600),
- new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 750),
- new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/kinetic_crusher, 750),
- new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750),
- new /datum/data/mining_equipment("Advanced Scanner", /obj/item/t_scanner/adv_mining_scanner, 800),
- new /datum/data/mining_equipment("Resonator", /obj/item/resonator, 800),
- new /datum/data/mining_equipment("Fulton Pack", /obj/item/extraction_pack, 1000),
- new /datum/data/mining_equipment("Lazarus Injector", /obj/item/lazarus_injector, 1000),
- new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000),
- new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffel/mining_conscript, 1500),
- new /datum/data/mining_equipment("Jetpack", /obj/item/tank/jetpack/carbondioxide/mining, 2000),
- new /datum/data/mining_equipment("Mining Hardsuit", /obj/item/clothing/suit/space/hardsuit/mining, 2000),
- new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000),
- new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500),
- new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500),
- new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000),
- new /datum/data/mining_equipment("Nanotrasen Minebot", /obj/item/mining_drone_cube, 800),
- new /datum/data/mining_equipment("Minebot Melee Upgrade", /obj/item/mine_bot_upgrade, 400),
- new /datum/data/mining_equipment("Minebot Armor Upgrade", /obj/item/mine_bot_upgrade/health, 400),
- new /datum/data/mining_equipment("Minebot Cooldown Upgrade", /obj/item/borg/upgrade/modkit/cooldown/minebot, 600),
- new /datum/data/mining_equipment("Minebot AI Upgrade", /obj/item/slimepotion/sentience/mining, 1000),
- new /datum/data/mining_equipment("KA Minebot Passthrough", /obj/item/borg/upgrade/modkit/minebot_passthrough, 100),
- new /datum/data/mining_equipment("Lazarus Capsule", /obj/item/mobcapsule, 800),
- new /datum/data/mining_equipment("Lazarus Capsule belt", /obj/item/storage/belt/lazarus, 200),
- new /datum/data/mining_equipment("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100),
- new /datum/data/mining_equipment("KA Adjustable Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer/adjustable, 150),
- new /datum/data/mining_equipment("KA Super Chassis", /obj/item/borg/upgrade/modkit/chassis_mod, 250),
- new /datum/data/mining_equipment("KA Hyper Chassis", /obj/item/borg/upgrade/modkit/chassis_mod/orange, 300),
- new /datum/data/mining_equipment("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000),
- new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000),
- new /datum/data/mining_equipment("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000),
- new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000)
- )
-
-/obj/machinery/mineral/equipment_vendor/golem
- name = "golem ship equipment vendor"
-
-/obj/machinery/mineral/equipment_vendor/golem/New()
- ..()
- component_parts = list()
- component_parts += new /obj/item/circuitboard/mining_equipment_vendor/golem(null)
- component_parts += new /obj/item/stock_parts/matter_bin(null)
- component_parts += new /obj/item/stock_parts/matter_bin(null)
- component_parts += new /obj/item/stock_parts/matter_bin(null)
- component_parts += new /obj/item/stock_parts/console_screen(null)
- RefreshParts()
-
-/obj/machinery/mineral/equipment_vendor/golem/Initialize()
- . = ..()
- desc += "\nIt seems a few selections have been added."
- prize_list += list(
- new /datum/data/mining_equipment("Extra Id", /obj/item/card/id/golem, 250),
- new /datum/data/mining_equipment("Science Backpack", /obj/item/storage/backpack/science, 250),
- new /datum/data/mining_equipment("Full Toolbelt", /obj/item/storage/belt/utility/full/multitool, 250),
- new /datum/data/mining_equipment("Monkey Cube", /obj/item/reagent_containers/food/snacks/monkeycube, 250),
- new /datum/data/mining_equipment("Royal Cape of the Liberator", /obj/item/bedsheet/rd/royal_cape, 500),
- new /datum/data/mining_equipment("Grey Slime Extract", /obj/item/slime_extract/grey, 1000),
- new /datum/data/mining_equipment("KA Trigger Modification Kit", /obj/item/borg/upgrade/modkit/trigger_guard, 1000),
- new /datum/data/mining_equipment("Shuttle Console Board", /obj/item/circuitboard/shuttle/golem_ship, 2000),
- new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/storage/box/rndboards, 2000)
-
- )
-
-/datum/data/mining_equipment
- var/equipment_name = "generic"
- var/equipment_path = null
- var/cost = 0
-
-/datum/data/mining_equipment/New(name, path, equipment_cost)
- equipment_name = name
- equipment_path = path
- cost = equipment_cost
-
-/obj/machinery/mineral/equipment_vendor/New()
- ..()
- component_parts = list()
- component_parts += new /obj/item/circuitboard/mining_equipment_vendor(null)
- component_parts += new /obj/item/stock_parts/matter_bin(null)
- component_parts += new /obj/item/stock_parts/matter_bin(null)
- component_parts += new /obj/item/stock_parts/matter_bin(null)
- component_parts += new /obj/item/stock_parts/console_screen(null)
- RefreshParts()
-
-/obj/machinery/mineral/equipment_vendor/power_change()
- ..()
- update_icon()
- if(inserted_id && !powered())
- visible_message("The ID slot indicator light flickers on \the [src] as it spits out a card before powering down.")
- inserted_id.forceMove(loc)
-
-/obj/machinery/mineral/equipment_vendor/update_icon()
- if(powered())
- icon_state = initial(icon_state)
- else
- icon_state = "[initial(icon_state)]-off"
-
-/obj/machinery/mineral/equipment_vendor/attack_hand(mob/user)
- if(..())
- return
- interact(user)
-
-/obj/machinery/mineral/equipment_vendor/attack_ghost(mob/user)
- interact(user)
-
-/obj/machinery/mineral/equipment_vendor/interact(mob/user)
- user.set_machine(src)
-
- var/dat
- dat +=""
- if(istype(inserted_id))
- dat += "You have [inserted_id.mining_points] mining points collected.
Eject ID."
- else
- dat += "No ID inserted.
Insert ID."
- dat += "
"
- dat += "
Equipment point cost list:
"
- for(var/datum/data/mining_equipment/prize in prize_list)
- dat += "| [prize.equipment_name] | [prize.cost] | Purchase |
"
- dat += "
"
- var/datum/browser/popup = new(user, "miningvendor", "Mining Equipment Vendor", 400, 350)
- popup.set_content(dat)
- popup.open()
-
-/obj/machinery/mineral/equipment_vendor/Topic(href, href_list)
- if(..())
- return 1
-
- if(href_list["choice"])
- if(istype(inserted_id))
- if(href_list["choice"] == "eject")
- inserted_id.loc = loc
- inserted_id.verb_pickup()
- inserted_id = null
- else if(href_list["choice"] == "insert")
- var/obj/item/card/id/I = usr.get_active_hand()
- if(istype(I))
- if(!usr.drop_item())
- return
- I.loc = src
- inserted_id = I
- else
- to_chat(usr, "No valid ID.")
-
- if(href_list["purchase"])
- if(istype(inserted_id))
- var/datum/data/mining_equipment/prize = locate(href_list["purchase"])
- if(!prize || !(prize in prize_list) || prize.cost > inserted_id.mining_points)
- return
-
- inserted_id.mining_points -= prize.cost
- new prize.equipment_path(src.loc)
- updateUsrDialog()
-
-/obj/machinery/mineral/equipment_vendor/attackby(obj/item/I, mob/user, params)
- if(default_deconstruction_screwdriver(user, "mining-open", "mining", I))
- updateUsrDialog()
- return
- if(panel_open)
- if(istype(I, /obj/item/crowbar))
- if(inserted_id)
- inserted_id.forceMove(loc) //Prevents deconstructing the ORM from deleting whatever ID was inside it.
- default_deconstruction_crowbar(I)
- return 1
- if(istype(I, /obj/item/mining_voucher))
- if(!powered())
- return
- else
- RedeemVoucher(I, user)
- return
- if(istype(I,/obj/item/card/id))
- if(!powered())
- return
- else
- var/obj/item/card/id/C = usr.get_active_hand()
- if(istype(C) && !istype(inserted_id))
- if(!usr.drop_item())
- return
- C.forceMove(src)
- inserted_id = C
- interact(user)
- return
- ..()
-
-/obj/machinery/mineral/equipment_vendor/proc/RedeemVoucher(obj/item/mining_voucher/voucher, mob/redeemer)
- var/items = list("Survival Capsule and Explorer's Webbing", "Resonator Kit", "Minebot Kit", "Extraction and Rescue Kit", "Crusher Kit", "Mining Conscription Kit")
-
- var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in items
- if(!selection || !Adjacent(redeemer) || QDELETED(voucher) || voucher.loc != redeemer)
- return
-
- var/drop_location = drop_location()
- switch(selection)
- if("Survival Capsule and Explorer's Webbing")
- new /obj/item/storage/belt/mining(drop_location)
- if("Resonator Kit")
- new /obj/item/extinguisher/mini(drop_location)
- new /obj/item/resonator(drop_location)
- if("Minebot Kit")
- new /obj/item/mining_drone_cube(drop_location)
- new /obj/item/weldingtool/hugetank(drop_location)
- new /obj/item/clothing/head/welding(drop_location)
- if("Extraction and Rescue Kit")
- new /obj/item/extraction_pack(drop_location)
- new /obj/item/fulton_core(drop_location)
- new /obj/item/stack/marker_beacon/thirty(drop_location)
- if("Crusher Kit")
- new /obj/item/extinguisher/mini(drop_location)
- new /obj/item/twohanded/kinetic_crusher(drop_location)
- if("Mining Conscription Kit")
- new /obj/item/storage/backpack/duffel/mining_conscript(drop_location)
-
- qdel(voucher)
-
-/obj/machinery/mineral/equipment_vendor/ex_act(severity, target)
- do_sparks(5, 1, src)
- if(prob(50 / severity) && severity < 3)
- qdel(src)
-
-/**********************Mining Equipment Locker Items**************************/
-
-/**********************Mining Equipment Voucher**********************/
-
-/obj/item/mining_voucher
- name = "mining voucher"
- desc = "A token to redeem a piece of equipment. Use it on a mining equipment vendor."
- icon = 'icons/obj/items.dmi'
- icon_state = "mining_voucher"
- w_class = WEIGHT_CLASS_TINY
-
-/**********************Mining Point Card**********************/
-
-/obj/item/card/mining_point_card
- name = "mining point 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, "You transfer [points] points to [C].")
- points = 0
- else
- to_chat(user, "There's no points left on [src].")
- ..()
-
-/obj/item/card/mining_point_card/examine(mob/user)
- ..(user)
- to_chat(user, "There's [points] points on the card.")
-
-/**********************Conscription Kit**********************/
-
-/obj/item/card/id/mining_access_card
- name = "mining access card"
- desc = "A small card, that when used on any ID, will add mining access."
- icon_state = "data_1"
-
-/obj/item/card/id/mining_access_card/afterattack(atom/movable/AM, mob/user, proximity)
- . = ..()
- if(istype(AM, /obj/item/card/id) && proximity)
- var/obj/item/card/id/I = AM
- I.access |= list(access_mining, access_mining_station, access_mineral_storeroom, access_cargo)
- to_chat(user, "You upgrade [I] with mining access.")
- qdel(src)
-
-/obj/item/storage/backpack/duffel/mining_conscript
- name = "mining conscription kit"
- desc = "A kit containing everything a crewmember needs to support a shaft miner in the field."
-
-/obj/item/storage/backpack/duffel/mining_conscript/New()
- ..()
- new /obj/item/clothing/glasses/meson(src)
- new /obj/item/t_scanner/adv_mining_scanner/lesser(src)
- new /obj/item/storage/bag/ore(src)
- new /obj/item/clothing/suit/hooded/explorer(src)
- new /obj/item/encryptionkey/headset_cargo(src)
- new /obj/item/clothing/mask/gas/explorer(src)
- new /obj/item/card/id/mining_access_card(src)
- new /obj/item/gun/energy/kinetic_accelerator(src)
- new /obj/item/kitchen/knife/combat/survival(src)
- new /obj/item/flashlight/seclite(src)
-
-/**********************Jaunter**********************/
-
-/obj/item/wormhole_jaunter
- name = "wormhole jaunter"
- desc = "A single use device harnessing outdated wormhole technology, Nanotrasen has since turned its eyes to bluespace for more accurate teleportation. The wormholes it creates are unpleasant to travel through, to say the least.\nThanks to modifications provided by the Free Golems, this jaunter can be worn on the belt to provide protection from chasms."
- icon = 'icons/obj/items.dmi'
- icon_state = "Jaunter"
- item_state = "electronic"
- throwforce = 0
- w_class = WEIGHT_CLASS_SMALL
- throw_speed = 3
- throw_range = 5
- origin_tech = "bluespace=2"
- slot_flags = SLOT_BELT
-
-/obj/item/wormhole_jaunter/attack_self(mob/user)
- user.visible_message("[user.name] activates the [name]!")
- activate(user, TRUE)
-
-/obj/item/wormhole_jaunter/proc/turf_check(mob/user)
- var/turf/device_turf = get_turf(user)
- if(!device_turf || !is_teleport_allowed(device_turf.z))
- to_chat(user, "You're having difficulties getting the [name] to work.")
- return FALSE
- return TRUE
-
-/obj/item/wormhole_jaunter/proc/get_destinations(mob/user)
- var/list/destinations = list()
-
- for(var/obj/item/radio/beacon/B in world)
- var/turf/T = get_turf(B)
- if(is_station_level(T.z))
- destinations += B
-
- return destinations
-
-/obj/item/wormhole_jaunter/proc/activate(mob/user, adjacent)
- if(!turf_check(user))
- return
-
- var/list/L = get_destinations(user)
- if(!L.len)
- to_chat(user, "The [name] found no beacons in the world to anchor a wormhole to.")
- return
- var/chosen_beacon = pick(L)
- var/obj/effect/portal/jaunt_tunnel/J = new(get_turf(src), get_turf(chosen_beacon), src, 100)
- if(adjacent)
- try_move_adjacent(J)
- else
- J.teleport(user)
- playsound(src,'sound/effects/sparks4.ogg',50,1)
- qdel(src)
-
-/obj/item/wormhole_jaunter/proc/chasm_react(mob/user)
- if(user.get_item_by_slot(slot_belt) == src)
- to_chat(user, "Your [name] activates, saving you from the chasm!")
- activate(user, FALSE)
- else
- to_chat(user, "[src] is not attached to your belt, preventing it from saving you from the chasm. RIP.")
-
-/obj/effect/portal/jaunt_tunnel
- name = "jaunt tunnel"
- icon = 'icons/effects/effects.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."
- failchance = 0
-
-/obj/effect/portal/jaunt_tunnel/teleport(atom/movable/M)
- . = ..()
- if(.)
- // KERPLUNK
- playsound(M,'sound/weapons/resonator_blast.ogg', 50, 1)
- if(iscarbon(M))
- var/mob/living/carbon/L = M
- L.Weaken(6)
- if(ishuman(L))
- shake_camera(L, 20, 1)
- addtimer(CALLBACK(L, /mob/living/carbon.proc/vomit), 20)
-
-/**********************Resonator**********************/
-
-/obj/item/resonator
- name = "resonator"
- icon = 'icons/obj/items.dmi'
- icon_state = "resonator"
- item_state = "resonator"
- origin_tech = "magnets=3;engineering=3"
- 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 vaccuum."
- w_class = WEIGHT_CLASS_NORMAL
- force = 15
- throwforce = 10
- var/burst_time = 30
- var/fieldlimit = 4
- var/list/fields = list()
- var/quick_burst_mod = 0.8
-
-/obj/item/resonator/upgraded
- name = "upgraded resonator"
- desc = "An upgraded version of the resonator that can produce more fields at once."
- icon_state = "resonator_u"
- origin_tech = "materials=4;powerstorage=3;engineering=3;magnets=3"
- fieldlimit = 6
- quick_burst_mod = 1
-
-/obj/item/resonator/attack_self(mob/user)
- if(burst_time == 50)
- burst_time = 30
- to_chat(user, "You set the resonator's fields to detonate after 3 seconds.")
- else
- burst_time = 50
- to_chat(user, "You set the resonator's fields to detonate after 5 seconds.")
-
-/obj/item/resonator/proc/CreateResonance(target, mob/user)
- var/turf/T = get_turf(target)
- var/obj/effect/temp_visual/resonance/R = locate(/obj/effect/temp_visual/resonance) in T
- if(R)
- R.damage_multiplier = quick_burst_mod
- R.burst()
- return
- if(LAZYLEN(fields) < fieldlimit)
- new /obj/effect/temp_visual/resonance(T, user, src, burst_time)
- user.changeNext_move(CLICK_CD_MELEE)
-
-/obj/item/resonator/pre_attackby(atom/target, mob/user, params)
- if(check_allowed_items(target, 1))
- CreateResonance(target, user)
- return TRUE
-
-/obj/effect/temp_visual/resonance
- name = "resonance field"
- desc = "A resonating field that significantly damages anything inside of it when the field eventually ruptures. More damaging in low pressure environments."
- icon = 'icons/effects/effects.dmi'
- icon_state = "shield1"
- duration = 50
- var/resonance_damage = 20
- var/damage_multiplier = 1
- var/creator
- var/obj/item/resonator/res
-
-/obj/effect/temp_visual/resonance/New(loc, set_creator, set_resonator, set_duration)
- duration = set_duration
- . = ..()
- creator = set_creator
- res = set_resonator
- if(res)
- res.fields += src
- playsound(src,'sound/weapons/resonator_fire.ogg',50,1)
- transform = matrix() * 0.75
- animate(src, transform = matrix() * 1.5, time = duration)
- deltimer(timerid)
- timerid = addtimer(CALLBACK(src, .proc/burst), duration, TIMER_STOPPABLE)
-
-/obj/effect/temp_visual/resonance/Destroy()
- if(res)
- res.fields -= src
- res = null
- creator = null
- return ..()
-
-/obj/effect/temp_visual/resonance/proc/check_pressure(turf/proj_turf)
- if(!proj_turf)
- proj_turf = get_turf(src)
- resonance_damage = initial(resonance_damage)
- if(lavaland_equipment_pressure_check(proj_turf))
- name = "strong [initial(name)]"
- resonance_damage *= 3
- else
- name = initial(name)
- resonance_damage *= damage_multiplier
-
-/obj/effect/temp_visual/resonance/proc/burst()
- var/turf/T = get_turf(src)
- new /obj/effect/temp_visual/resonance_crush(T)
- if(ismineralturf(T))
- var/turf/simulated/mineral/M = T
- M.gets_drilled(creator)
- check_pressure(T)
- playsound(T,'sound/weapons/resonator_blast.ogg',50,1)
- for(var/mob/living/L in T)
- if(creator)
- add_attack_logs(creator, L, "Resonance field'ed")
- to_chat(L, "[src] ruptured with you in it!")
- L.apply_damage(resonance_damage, BRUTE)
- qdel(src)
-
-/obj/effect/temp_visual/resonance_crush
- icon_state = "shield1"
- layer = ABOVE_ALL_MOB_LAYER
- duration = 4
-
-/obj/effect/temp_visual/resonance_crush/New()
- ..()
- transform = matrix()*1.5
- animate(src, transform = matrix() * 0.1, alpha = 50, time = 4)
-
-/**********************Facehugger toy**********************/
-
-/obj/item/clothing/mask/facehugger/toy
- item_state = "facehugger_inactive"
- desc = "A toy often used to play pranks on other miners by putting it in their beds. It takes a bit to recharge after latching onto something."
- throwforce = 0
- real = 0
- sterile = 1
- tint = 3 //Makes it feel more authentic when it latches on
-
-/obj/item/clothing/mask/facehugger/toy/Die()
- return
-
-
-/**********************Mining drone cube**********************/
-
-/obj/item/mining_drone_cube
- name = "mining drone cube"
- desc = "Compressed mining drone, ready for deployment. Just press the button to activate!"
- w_class = WEIGHT_CLASS_SMALL
- icon = 'icons/obj/aibots.dmi'
- icon_state = "minedronecube"
- item_state = "electronic"
-
-/obj/item/mining_drone_cube/attack_self(mob/user)
- user.visible_message("\The [src] suddenly expands into a fully functional mining drone!", \
- "You press center button on \the [src]. The device suddenly expands into a fully functional mining drone!")
- new /mob/living/simple_animal/hostile/mining_drone(get_turf(src))
- qdel(src)
-
-/**********************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, making them become friendly to the user. Unfortunately, the process is useless on higher forms of life and incredibly costly, so these were hidden in storage until an executive thought they'd be great motivation for some of their employees."
- icon = 'icons/obj/hypo.dmi'
- icon_state = "lazarus_hypo"
- item_state = "hypo"
- origin_tech = "biotech=4;magnets=6"
- throwforce = 0
- w_class = WEIGHT_CLASS_SMALL
- throw_speed = 3
- throw_range = 5
- var/loaded = 1
- var/malfunctioning = 0
- var/revive_type = SENTIENCE_ORGANIC //So you can't revive boss monsters or robots with it
-
-/obj/item/lazarus_injector/afterattack(atom/target, mob/user, proximity_flag)
- if(!loaded)
- return
- if(istype(target, /mob/living) && proximity_flag)
- if(istype(target, /mob/living/simple_animal))
- var/mob/living/simple_animal/M = target
- if(M.sentience_type != revive_type)
- to_chat(user, "[src] does not work on this sort of creature.")
- return
- if(M.stat == DEAD)
- M.faction = list("neutral")
- M.revive()
- M.can_collar = 1
- if(istype(target, /mob/living/simple_animal/hostile))
- var/mob/living/simple_animal/hostile/H = M
- if(malfunctioning)
- H.faction |= list("lazarus", "\ref[user]")
- H.robust_searching = 1
- H.friends += user
- H.attack_same = 1
- log_game("[user] has revived hostile mob [target] with a malfunctioning lazarus injector")
- else
- H.attack_same = 0
- loaded = 0
- user.visible_message("[user] injects [M] with [src], reviving it.")
- playsound(src,'sound/effects/refill.ogg',50,1)
- icon_state = "lazarus_empty"
- return
- else
- to_chat(user, "[src] is only effective on the dead.")
- return
- else
- to_chat(user, "[src] is only effective on lesser beings.")
- return
-
-/obj/item/lazarus_injector/emag_act(mob/user)
- if(!malfunctioning)
- malfunctioning = 1
- to_chat(user, "You override [src]'s safety protocols.")
-
-/obj/item/lazarus_injector/emp_act()
- if(!malfunctioning)
- malfunctioning = 1
-
-/obj/item/lazarus_injector/examine(mob/user)
- ..(user)
- if(!loaded)
- to_chat(user, "[src] is empty.")
- if(malfunctioning)
- to_chat(user, "The display on [src] seems to be flickering.")
-
-/**********************Mining Scanner**********************/
-
-/obj/item/mining_scanner
- desc = "A scanner that checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results."
- name = "manual mining scanner"
- icon = 'icons/obj/device.dmi'
- icon_state = "mining1"
- item_state = "analyzer"
- w_class = WEIGHT_CLASS_SMALL
- flags = CONDUCT
- slot_flags = SLOT_BELT
- var/cooldown = 0
- origin_tech = "engineering=1;magnets=1"
-
-/obj/item/mining_scanner/attack_self(mob/user)
- if(!user.client)
- return
- if(!cooldown)
- cooldown = 1
- spawn(40)
- cooldown = 0
- var/list/mobs = list()
- mobs |= user
- mineral_scan_pulse(mobs, get_turf(user))
-
-
-//Debug item to identify all ore spread quickly
-/obj/item/mining_scanner/admin
-
-/obj/item/mining_scanner/admin/attack_self(mob/user)
- for(var/turf/simulated/mineral/M in world)
- if(M.scan_state)
- M.icon_state = M.scan_state
- qdel(src)
-
-/obj/item/t_scanner/adv_mining_scanner
- desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear meson scanners for optimal results. This one has an extended range."
- name = "advanced automatic mining scanner"
- icon_state = "mining0"
- item_state = "analyzer"
- w_class = WEIGHT_CLASS_SMALL
- flags = CONDUCT
- slot_flags = SLOT_BELT
- var/cooldown = 35
- var/on_cooldown = 0
- var/range = 7
- var/meson = TRUE
- origin_tech = "engineering=3;magnets=3"
-
-/obj/item/t_scanner/adv_mining_scanner/cyborg
- flags = CONDUCT | NODROP
-
-/obj/item/t_scanner/adv_mining_scanner/material
- meson = FALSE
- desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results. This one has an extended range."
-
-/obj/item/t_scanner/adv_mining_scanner/lesser
- name = "automatic mining scanner"
- desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear meson scanners for optimal results."
- range = 4
- cooldown = 50
-
-/obj/item/t_scanner/adv_mining_scanner/lesser/material
- desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results."
- meson = FALSE
-
-/obj/item/t_scanner/adv_mining_scanner/scan()
- if(!on_cooldown)
- on_cooldown = 1
- spawn(cooldown)
- on_cooldown = 0
- var/turf/t = get_turf(src)
- var/list/mobs = recursive_mob_check(t, client_check = 1, sight_check = 0, include_radio = 0)
- if(!mobs.len)
- return
- if(meson)
- mineral_scan_pulse(mobs, t, range)
- else
- mineral_scan_pulse_material(mobs, t, range)
-
-//For use with mesons
-/proc/mineral_scan_pulse(list/mobs, turf/T, range = world.view)
- var/list/minerals = list()
- for(var/turf/simulated/mineral/M in range(range, T))
- if(M.scan_state)
- minerals += M
- if(minerals.len)
- for(var/mob/user in mobs)
- if(user.client)
- var/client/C = user.client
- for(var/turf/simulated/mineral/M in minerals)
- var/turf/F = get_turf(M)
- var/image/I = image('icons/turf/mining.dmi', loc = F, icon_state = M.scan_state, layer = 18)
- C.images += I
- spawn(30)
- if(C)
- C.images -= I
-
-//For use with material scanners
-/proc/mineral_scan_pulse_material(list/mobs, turf/T, range = world.view)
- var/list/minerals = list()
- for(var/turf/simulated/mineral/M in range(range, T))
- if(M.scan_state)
- minerals += M
- if(minerals.len)
- for(var/turf/simulated/mineral/M in minerals)
- var/obj/effect/temp_visual/mining_overlay/C = new/obj/effect/temp_visual/mining_overlay(M)
- C.icon_state = M.scan_state
-
-/obj/effect/temp_visual/mining_overlay
- layer = 18
- icon = 'icons/turf/mining.dmi'
- anchored = 1
- mouse_opacity = MOUSE_OPACITY_TRANSPARENT
- duration = 30
- pixel_x = -4
- pixel_y = -4
-
-/**********************Xeno Warning Sign**********************/
-/obj/structure/sign/xeno_warning_mining
- name = "DANGEROUS ALIEN LIFE"
- desc = "A sign that warns would be travellers of hostile alien life in the vicinity."
- icon = 'icons/obj/mining.dmi'
- icon_state = "xeno_warning"
-
-/**********************Mining Jetpack**********************/
-/obj/item/tank/jetpack/carbondioxide/mining
- name = "mining jetpack"
- icon_state = "jetpack-mining"
- item_state = "jetpack-mining"
- origin_tech = "materials=4;magnets=4;engineering=5"
- desc = "A tank of compressed carbon dioxide for miners to use as propulsion in local space. The compact size allows for easy storage at the cost of capacity."
- volume = 40
- throw_range = 7
- w_class = WEIGHT_CLASS_NORMAL //same as syndie harness
-
-/*********************Hivelord stabilizer****************/
-
-/obj/item/hivelordstabilizer
- name = "hivelord stabilizer"
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle19"
- desc = "Inject a hivelord core with this stabilizer to preserve its healing powers indefinitely."
- w_class = WEIGHT_CLASS_TINY
- origin_tech = "biotech=3"
-
-/obj/item/hivelordstabilizer/afterattack(obj/item/organ/internal/M, mob/user)
- var/obj/item/organ/internal/hivelord_core/C = M
- if(!istype(C, /obj/item/organ/internal/hivelord_core))
- to_chat(user, "The stabilizer only works on hivelord cores.")
- return ..()
- C.preserved = 1
- to_chat(user, "You inject the hivelord core with the stabilizer. It will no longer go inert.")
- qdel(src)
\ No newline at end of file
diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm
index 03b8404b1f0..46daf596f8c 100644
--- a/code/modules/mining/machine_processing.dm
+++ b/code/modules/mining/machine_processing.dm
@@ -7,7 +7,7 @@
var/output_dir = SOUTH
/obj/machinery/mineral/proc/unload_mineral(atom/movable/S)
- S.forceMove(loc)
+ S.forceMove(drop_location())
var/turf/T = get_step(src,output_dir)
if(T)
S.forceMove(T)
diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm
new file mode 100644
index 00000000000..696be4c6bfb
--- /dev/null
+++ b/code/modules/mining/machine_redemption.dm
@@ -0,0 +1,391 @@
+/**********************Ore Redemption Unit**************************/
+//Turns all the various mining machines into a single unit to speed up mining and establish a point system
+
+/obj/machinery/mineral/ore_redemption
+ name = "ore redemption machine"
+ desc = "A machine that accepts ore and instantly transforms it into workable material sheets. Points for ore are generated based on type and can be redeemed at a mining equipment vendor."
+ icon = 'icons/obj/machines/mining_machines.dmi'
+ icon_state = "ore_redemption"
+ density = TRUE
+ anchored = TRUE
+ input_dir = NORTH
+ output_dir = SOUTH
+ req_access = list(access_mineral_storeroom)
+ speed_process = TRUE
+ layer = BELOW_OBJ_LAYER
+ var/req_access_reclaim = access_mining_station
+ var/obj/item/card/id/inserted_id
+ var/points = 0
+ var/ore_pickup_rate = 15
+ var/sheet_per_ore = 1
+ var/point_upgrade = 1
+ var/list/ore_values = list("sand" = 1, "iron" = 1, "plasma" = 15, "silver" = 16, "gold" = 18, "titanium" = 30, "uranium" = 30, "diamond" = 50, "bluespace crystal" = 50, "bananium" = 60, "tranquillite" = 60)
+ var/message_sent = FALSE
+ var/list/ore_buffer = list()
+ var/datum/research/files
+ var/obj/item/disk/design_disk/inserted_disk
+ var/list/supply_consoles = list("Science", "Robotics", "Research Director's Desk", "Mechanic", "Engineering" = list("metal", "glass", "plasma"), "Chief Engineer's Desk" = list("metal", "glass", "plasma"), "Atmospherics" = list("metal", "glass", "plasma"), "Bar" = list("uranium", "plasma"), "Virology" = list("plasma", "uranium", "gold"))
+
+/obj/machinery/mineral/ore_redemption/New()
+ ..()
+ AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TRANQUILLITE, MAT_TITANIUM, MAT_BLUESPACE), INFINITY, FALSE, /obj/item/stack)
+ files = new /datum/research/smelter(src)
+ component_parts = list()
+ component_parts += new /obj/item/circuitboard/ore_redemption(null)
+ component_parts += new /obj/item/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/stock_parts/manipulator(null)
+ component_parts += new /obj/item/stock_parts/micro_laser(null)
+ component_parts += new /obj/item/assembly/igniter(null)
+ component_parts += new /obj/item/stock_parts/console_screen(null)
+ RefreshParts()
+
+/obj/machinery/mineral/ore_redemption/upgraded/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/circuitboard/ore_redemption(null)
+ component_parts += new /obj/item/stock_parts/matter_bin/super(null)
+ component_parts += new /obj/item/stock_parts/manipulator/pico(null)
+ component_parts += new /obj/item/stock_parts/micro_laser/ultra(null)
+ component_parts += new /obj/item/assembly/igniter(null)
+ component_parts += new /obj/item/stock_parts/console_screen(null)
+ RefreshParts()
+
+/obj/machinery/mineral/ore_redemption/golem
+ req_access = list(access_free_golems)
+ req_access_reclaim = access_free_golems
+
+/obj/machinery/mineral/ore_redemption/golem/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/circuitboard/ore_redemption/golem(null)
+ component_parts += new /obj/item/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/stock_parts/manipulator(null)
+ component_parts += new /obj/item/stock_parts/micro_laser(null)
+ component_parts += new /obj/item/assembly/igniter(null)
+ component_parts += new /obj/item/stock_parts/console_screen(null)
+ RefreshParts()
+
+/obj/machinery/mineral/ore_redemption/Destroy()
+ QDEL_NULL(files)
+ GET_COMPONENT(materials, /datum/component/material_container)
+ materials.retrieve_all()
+ return ..()
+
+/obj/machinery/mineral/ore_redemption/RefreshParts()
+ var/ore_pickup_rate_temp = 15
+ var/point_upgrade_temp = 1
+ var/sheet_per_ore_temp = 1
+ for(var/obj/item/stock_parts/matter_bin/B in component_parts)
+ sheet_per_ore_temp = 0.65 + (0.35 * B.rating)
+ for(var/obj/item/stock_parts/manipulator/M in component_parts)
+ ore_pickup_rate_temp = 15 * M.rating
+ for(var/obj/item/stock_parts/micro_laser/L in component_parts)
+ point_upgrade_temp = 0.65 + (0.35 * L.rating)
+ ore_pickup_rate = ore_pickup_rate_temp
+ point_upgrade = point_upgrade_temp
+ sheet_per_ore = sheet_per_ore_temp
+
+/obj/machinery/mineral/ore_redemption/proc/smelt_ore(obj/item/stack/ore/O)
+
+ ore_buffer -= O
+
+ if(O && O.refined_type)
+ points += O.points * point_upgrade * O.amount
+
+ GET_COMPONENT(materials, /datum/component/material_container)
+ var/material_amount = materials.get_item_material_amount(O)
+
+ if(!material_amount)
+ qdel(O) //no materials, incinerate it
+
+ else if(!materials.has_space(material_amount * sheet_per_ore * O.amount)) //if there is no space, eject it
+ unload_mineral(O)
+
+ else
+ materials.insert_item(O, sheet_per_ore) //insert it
+ qdel(O)
+
+/obj/machinery/mineral/ore_redemption/proc/can_smelt_alloy(datum/design/D)
+ if(D.make_reagents.len)
+ return FALSE
+
+ var/build_amount = 0
+
+ GET_COMPONENT(materials, /datum/component/material_container)
+ for(var/mat_id in D.materials)
+ var/M = D.materials[mat_id]
+ var/datum/material/redemption_mat = materials.materials[mat_id]
+
+ if(!M || !redemption_mat)
+ return FALSE
+
+ var/smeltable_sheets = round(redemption_mat.amount / M)
+
+ if(!smeltable_sheets)
+ return FALSE
+
+ if(!build_amount)
+ build_amount = smeltable_sheets
+
+ build_amount = min(build_amount, smeltable_sheets)
+
+ return build_amount
+
+/obj/machinery/mineral/ore_redemption/proc/process_ores(list/ores_to_process)
+ var/current_amount = 0
+ for(var/ore in ores_to_process)
+ if(current_amount >= ore_pickup_rate)
+ break
+ smelt_ore(ore)
+
+/obj/machinery/mineral/ore_redemption/proc/send_console_message()
+ if(!is_station_level(z))
+ return
+ message_sent = TRUE
+ var/area/A = get_area(src)
+ var/msg = "Now available in [A]:
"
+
+ var/has_minerals = FALSE
+ var/mineral_name = null
+ GET_COMPONENT(materials, /datum/component/material_container)
+ for(var/mat_id in materials.materials)
+ var/datum/material/M = materials.materials[mat_id]
+ var/mineral_amount = M.amount / MINERAL_MATERIAL_AMOUNT
+ mineral_name = capitalize(M.name)
+ if(mineral_amount)
+ has_minerals = TRUE
+ msg += "[mineral_name]: [mineral_amount] sheets
"
+
+ if(!has_minerals)
+ return
+
+ for(var/obj/machinery/requests_console/D in allConsoles)
+ if(D.department in src.supply_consoles)
+ if(supply_consoles[D.department] == null || (mineral_name in supply_consoles[D.department]))
+ D.createMessage("Ore Redemption Machine", "New Minerals Available!", msg, 1)
+
+/obj/machinery/mineral/ore_redemption/process()
+ if(panel_open || !powered())
+ return
+ var/atom/input = get_step(src, input_dir)
+ var/obj/structure/ore_box/OB = locate() in input
+ if(OB)
+ input = OB
+
+ for(var/obj/item/stack/ore/O in input)
+ if(QDELETED(O))
+ continue
+ ore_buffer |= O
+ O.forceMove(src)
+ CHECK_TICK
+
+ if(LAZYLEN(ore_buffer))
+ message_sent = FALSE
+ process_ores(ore_buffer)
+ else if(!message_sent)
+ send_console_message()
+
+/obj/machinery/mineral/ore_redemption/attackby(obj/item/W, mob/user, params)
+ if(exchange_parts(user, W))
+ return
+ if(default_unfasten_wrench(user, W))
+ return
+ if(default_deconstruction_screwdriver(user, "ore_redemption-open", "ore_redemption", W))
+ updateUsrDialog()
+ return
+ if(default_deconstruction_crowbar(W))
+ return
+
+ if(!powered())
+ return
+ if(istype(W, /obj/item/card/id))
+ var/obj/item/card/id/I = user.get_active_hand()
+ if(istype(I) && !istype(inserted_id))
+ if(!user.drop_item())
+ return
+ I.forceMove(src)
+ inserted_id = I
+ interact(user)
+ return
+
+ if(ismultitool(W) && panel_open)
+ input_dir = turn(input_dir, -90)
+ output_dir = turn(output_dir, -90)
+ to_chat(user, "You change [src]'s I/O settings, setting the input to [dir2text(input_dir)] and the output to [dir2text(output_dir)].")
+ return
+
+ if(istype(W, /obj/item/disk/design_disk))
+ if(user.drop_item())
+ W.forceMove(src)
+ inserted_disk = W
+ interact(user)
+ return TRUE
+
+ return ..()
+
+/obj/machinery/mineral/ore_redemption/attack_hand(mob/user)
+ if(..())
+ return
+ interact(user)
+
+/obj/machinery/mineral/ore_redemption/interact(mob/user)
+ var/dat = "This machine only accepts ore. Gibtonite and Slag are not accepted.
"
+ dat += "Current unclaimed points: [points]
"
+
+ if(inserted_id)
+ dat += "You have [inserted_id.mining_points] mining points collected. Eject ID.
"
+ dat += "Claim points.
"
+ else
+ dat += "No ID inserted. Insert ID.
"
+
+ GET_COMPONENT(materials, /datum/component/material_container)
+ for(var/mat_id in materials.materials)
+ var/datum/material/M = materials.materials[mat_id]
+ if(M.amount)
+ var/sheet_amount = M.amount / MINERAL_MATERIAL_AMOUNT
+ dat += "[capitalize(M.name)]: [sheet_amount] "
+ if(sheet_amount >= 1)
+ dat += "Release
"
+ else
+ dat += "Release
"
+
+ dat += "
Alloys:
"
+
+ for(var/v in files.known_designs)
+ var/datum/design/D = files.known_designs[v]
+ if(can_smelt_alloy(D))
+ dat += "[D.name]: Smelt
"
+ else
+ dat += "[D.name]: Smelt
"
+
+ dat += "
Mineral Value List:
[get_ore_values()]
"
+
+ if(inserted_disk)
+ dat += "Eject disk
"
+ dat += "Uploadable designs: "
+
+ if(inserted_disk.blueprint)
+ var/datum/design/D = inserted_disk.blueprint
+ if(D.build_type & SMELTER)
+ dat += "Name: [D.name]
Upload to smelter"
+
+ dat += "
"
+ else
+ dat += "Insert design disk
"
+
+ var/datum/browser/popup = new(user, "ore_redemption_machine", "Ore Redemption Machine", 400, 500)
+ popup.set_content(dat)
+ popup.open()
+ return
+
+/obj/machinery/mineral/ore_redemption/proc/get_ore_values()
+ var/dat = ""
+ for(var/ore in ore_values)
+ var/value = ore_values[ore]
+ dat += "| [capitalize(ore)] | [value * point_upgrade] |
"
+ dat += "
"
+ return dat
+
+/obj/machinery/mineral/ore_redemption/Topic(href, href_list)
+ if(..())
+ return
+ GET_COMPONENT(materials, /datum/component/material_container)
+ if(href_list["eject_id"])
+ usr.put_in_hands(inserted_id)
+ inserted_id = null
+ if(href_list["claim"])
+ if(inserted_id)
+ if(req_access_reclaim in inserted_id.access)
+ inserted_id.mining_points += points
+ points = 0
+ else
+ to_chat(usr, "Required access not found.")
+ else if(href_list["insert_id"])
+ var/obj/item/card/id/I = usr.get_active_hand()
+ if(istype(I))
+ if(!usr.drop_item())
+ return
+ I.forceMove(src)
+ inserted_id = I
+ else
+ to_chat(usr, "Not a valid ID!")
+ if(href_list["eject_disk"])
+ if(inserted_disk)
+ inserted_disk.forceMove(loc)
+ inserted_disk = null
+ if(href_list["insert_disk"])
+ var/obj/item/disk/design_disk/D = usr.get_active_hand()
+ if(istype(D))
+ if(!usr.drop_item())
+ return
+ D.forceMove(src)
+ inserted_disk = D
+ if(href_list["upload"])
+ if(inserted_disk && inserted_disk.blueprint)
+ files.AddDesign2Known(inserted_disk.blueprint)
+
+ if(href_list["release"])
+ if(check_access(inserted_id) || allowed(usr)) //Check the ID inside, otherwise check the user
+ var/mat_id = href_list["release"]
+ if(!materials.materials[mat_id])
+ return
+
+ var/datum/material/mat = materials.materials[mat_id]
+ var/stored_amount = mat.amount / MINERAL_MATERIAL_AMOUNT
+
+ if(!stored_amount)
+ return
+
+ var/desired = input("How many sheets?", "How many sheets to eject?", 1) as null|num
+ var/sheets_to_remove = round(min(desired,50,stored_amount))
+
+ var/out = get_step(src, output_dir)
+ materials.retrieve_sheets(sheets_to_remove, mat_id, out)
+
+ else
+ to_chat(usr, "Required access not found.")
+
+ if(href_list["alloy"])
+ var/alloy_id = href_list["alloy"]
+ var/datum/design/alloy = files.FindDesignByID(alloy_id)
+ if((check_access(inserted_id) || allowed(usr)) && alloy)
+ var/desired = input("How many sheets?", "How many sheets would you like to smelt?", 1) as null|num
+ if(desired < 1) // Stops an exploit that lets you build negative alloys and get free materials
+ return
+ var/smelt_amount = can_smelt_alloy(alloy)
+ var/amount = round(min(desired,50,smelt_amount))
+ materials.use_amount(alloy.materials, amount)
+
+ var/output = new alloy.build_path(src)
+ if(istype(output, /obj/item/stack/sheet))
+ var/obj/item/stack/sheet/mineral/produced_alloy = output
+ produced_alloy.amount = amount
+ unload_mineral(produced_alloy)
+ else
+ unload_mineral(output)
+
+ else
+ to_chat(usr, "Required access not found.")
+ updateUsrDialog()
+
+/obj/machinery/mineral/ore_redemption/ex_act(severity, target)
+ do_sparks(5, 1, src)
+ if(severity == 1)
+ if(prob(50))
+ qdel(src)
+ else if(severity == 2)
+ if(prob(25))
+ qdel(src)
+
+/obj/machinery/mineral/ore_redemption/power_change()
+ ..()
+ update_icon()
+ if(inserted_id && !powered())
+ visible_message("The ID slot indicator light flickers on [src] as it spits out a card before powering down.")
+ inserted_id.forceMove(loc)
+
+/obj/machinery/mineral/ore_redemption/update_icon()
+ if(powered())
+ icon_state = initial(icon_state)
+ else
+ icon_state = "[initial(icon_state)]-off"
\ No newline at end of file
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
new file mode 100644
index 00000000000..229b9053ae6
--- /dev/null
+++ b/code/modules/mining/machine_vending.dm
@@ -0,0 +1,311 @@
+/**********************Mining Equipment Locker**************************/
+
+/obj/machinery/mineral/equipment_vendor
+ name = "mining equipment vendor"
+ desc = "An equipment vendor for miners, points collected at an ore redemption machine can be spent here."
+ icon = 'icons/obj/machines/mining_machines.dmi'
+ icon_state = "mining"
+ density = 1
+ anchored = 1.0
+ var/obj/item/card/id/inserted_id
+ var/list/prize_list = list( //if you add something to this, please, for the love of god, sort it by price/type. use tabs and not spaces.
+ new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10),
+ new /datum/data/mining_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 100),
+ new /datum/data/mining_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 300),
+ new /datum/data/mining_equipment("Whiskey", /obj/item/reagent_containers/food/drinks/bottle/whiskey, 100),
+ new /datum/data/mining_equipment("Absinthe", /obj/item/reagent_containers/food/drinks/bottle/absinthe/premium, 100),
+ new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150),
+ new /datum/data/mining_equipment("Soap", /obj/item/soap/nanotrasen, 200),
+ new /datum/data/mining_equipment("Laser Pointer", /obj/item/laser_pointer, 300),
+ new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300),
+ new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/hivelordstabilizer, 400),
+ new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000),
+ new /datum/data/mining_equipment("Point Transfer Card", /obj/item/card/mining_point_card, 500),
+ new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 400),
+ new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400),
+ new /datum/data/mining_equipment("GAR Meson Scanners", /obj/item/clothing/glasses/meson/gar, 500),
+ new /datum/data/mining_equipment("Explorer's Webbing", /obj/item/storage/belt/mining, 500),
+ new /datum/data/mining_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/autoinjector/survival, 500),
+ new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 600),
+ new /datum/data/mining_equipment("Tracking Implant Kit", /obj/item/storage/box/minertracker, 600),
+ new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 750),
+ new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/kinetic_crusher, 750),
+ new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750),
+ new /datum/data/mining_equipment("Advanced Scanner", /obj/item/t_scanner/adv_mining_scanner, 800),
+ new /datum/data/mining_equipment("Resonator", /obj/item/resonator, 800),
+ new /datum/data/mining_equipment("Fulton Pack", /obj/item/extraction_pack, 1000),
+ new /datum/data/mining_equipment("Lazarus Injector", /obj/item/lazarus_injector, 1000),
+ new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000),
+ new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffel/mining_conscript, 1500),
+ new /datum/data/mining_equipment("Jetpack", /obj/item/tank/jetpack/carbondioxide/mining, 2000),
+ new /datum/data/mining_equipment("Mining Hardsuit", /obj/item/clothing/suit/space/hardsuit/mining, 2000),
+ new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000),
+ new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500),
+ new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500),
+ new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000),
+ new /datum/data/mining_equipment("Nanotrasen Minebot", /obj/item/mining_drone_cube, 800),
+ new /datum/data/mining_equipment("Minebot Melee Upgrade", /obj/item/mine_bot_upgrade, 400),
+ new /datum/data/mining_equipment("Minebot Armor Upgrade", /obj/item/mine_bot_upgrade/health, 400),
+ new /datum/data/mining_equipment("Minebot Cooldown Upgrade", /obj/item/borg/upgrade/modkit/cooldown/minebot, 600),
+ new /datum/data/mining_equipment("Minebot AI Upgrade", /obj/item/slimepotion/sentience/mining, 1000),
+ new /datum/data/mining_equipment("KA Minebot Passthrough", /obj/item/borg/upgrade/modkit/minebot_passthrough, 100),
+ new /datum/data/mining_equipment("Lazarus Capsule", /obj/item/mobcapsule, 800),
+ new /datum/data/mining_equipment("Lazarus Capsule belt", /obj/item/storage/belt/lazarus, 200),
+ new /datum/data/mining_equipment("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100),
+ new /datum/data/mining_equipment("KA Adjustable Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer/adjustable, 150),
+ new /datum/data/mining_equipment("KA Super Chassis", /obj/item/borg/upgrade/modkit/chassis_mod, 250),
+ new /datum/data/mining_equipment("KA Hyper Chassis", /obj/item/borg/upgrade/modkit/chassis_mod/orange, 300),
+ new /datum/data/mining_equipment("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000),
+ new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000),
+ new /datum/data/mining_equipment("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000),
+ new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000)
+ )
+
+/obj/machinery/mineral/equipment_vendor/golem
+ name = "golem ship equipment vendor"
+
+/obj/machinery/mineral/equipment_vendor/golem/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/circuitboard/mining_equipment_vendor/golem(null)
+ component_parts += new /obj/item/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/stock_parts/console_screen(null)
+ RefreshParts()
+
+/obj/machinery/mineral/equipment_vendor/golem/Initialize()
+ . = ..()
+ desc += "\nIt seems a few selections have been added."
+ prize_list += list(
+ new /datum/data/mining_equipment("Extra Id", /obj/item/card/id/golem, 250),
+ new /datum/data/mining_equipment("Science Backpack", /obj/item/storage/backpack/science, 250),
+ new /datum/data/mining_equipment("Full Toolbelt", /obj/item/storage/belt/utility/full/multitool, 250),
+ new /datum/data/mining_equipment("Monkey Cube", /obj/item/reagent_containers/food/snacks/monkeycube, 250),
+ new /datum/data/mining_equipment("Royal Cape of the Liberator", /obj/item/bedsheet/rd/royal_cape, 500),
+ new /datum/data/mining_equipment("Grey Slime Extract", /obj/item/slime_extract/grey, 1000),
+ new /datum/data/mining_equipment("KA Trigger Modification Kit", /obj/item/borg/upgrade/modkit/trigger_guard, 1000),
+ new /datum/data/mining_equipment("Shuttle Console Board", /obj/item/circuitboard/shuttle/golem_ship, 2000),
+ new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/storage/box/rndboards, 2000)
+
+ )
+
+/datum/data/mining_equipment
+ var/equipment_name = "generic"
+ var/equipment_path = null
+ var/cost = 0
+
+/datum/data/mining_equipment/New(name, path, equipment_cost)
+ equipment_name = name
+ equipment_path = path
+ cost = equipment_cost
+
+/obj/machinery/mineral/equipment_vendor/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/circuitboard/mining_equipment_vendor(null)
+ component_parts += new /obj/item/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/stock_parts/console_screen(null)
+ RefreshParts()
+
+/obj/machinery/mineral/equipment_vendor/power_change()
+ ..()
+ update_icon()
+ if(inserted_id && !powered())
+ visible_message("The ID slot indicator light flickers on \the [src] as it spits out a card before powering down.")
+ inserted_id.forceMove(loc)
+
+/obj/machinery/mineral/equipment_vendor/update_icon()
+ if(powered())
+ icon_state = initial(icon_state)
+ else
+ icon_state = "[initial(icon_state)]-off"
+
+/obj/machinery/mineral/equipment_vendor/attack_hand(mob/user)
+ if(..())
+ return
+ interact(user)
+
+/obj/machinery/mineral/equipment_vendor/attack_ghost(mob/user)
+ interact(user)
+
+/obj/machinery/mineral/equipment_vendor/interact(mob/user)
+ user.set_machine(src)
+
+ var/dat
+ dat +=""
+ if(istype(inserted_id))
+ dat += "You have [inserted_id.mining_points] mining points collected.
Eject ID."
+ else
+ dat += "No ID inserted.
Insert ID."
+ dat += "
"
+ dat += "
Equipment point cost list:
"
+ for(var/datum/data/mining_equipment/prize in prize_list)
+ dat += "| [prize.equipment_name] | [prize.cost] | Purchase |
"
+ dat += "
"
+ var/datum/browser/popup = new(user, "miningvendor", "Mining Equipment Vendor", 400, 350)
+ popup.set_content(dat)
+ popup.open()
+
+/obj/machinery/mineral/equipment_vendor/Topic(href, href_list)
+ if(..())
+ return 1
+
+ if(href_list["choice"])
+ if(istype(inserted_id))
+ if(href_list["choice"] == "eject")
+ inserted_id.loc = loc
+ inserted_id.verb_pickup()
+ inserted_id = null
+ else if(href_list["choice"] == "insert")
+ var/obj/item/card/id/I = usr.get_active_hand()
+ if(istype(I))
+ if(!usr.drop_item())
+ return
+ I.loc = src
+ inserted_id = I
+ else
+ to_chat(usr, "No valid ID.")
+
+ if(href_list["purchase"])
+ if(istype(inserted_id))
+ var/datum/data/mining_equipment/prize = locate(href_list["purchase"])
+ if(!prize || !(prize in prize_list) || prize.cost > inserted_id.mining_points)
+ return
+
+ inserted_id.mining_points -= prize.cost
+ new prize.equipment_path(src.loc)
+ updateUsrDialog()
+
+/obj/machinery/mineral/equipment_vendor/attackby(obj/item/I, mob/user, params)
+ if(default_deconstruction_screwdriver(user, "mining-open", "mining", I))
+ updateUsrDialog()
+ return
+ if(panel_open)
+ if(istype(I, /obj/item/crowbar))
+ if(inserted_id)
+ inserted_id.forceMove(loc) //Prevents deconstructing the ORM from deleting whatever ID was inside it.
+ default_deconstruction_crowbar(I)
+ return 1
+ if(istype(I, /obj/item/mining_voucher))
+ if(!powered())
+ return
+ else
+ RedeemVoucher(I, user)
+ return
+ if(istype(I,/obj/item/card/id))
+ if(!powered())
+ return
+ else
+ var/obj/item/card/id/C = usr.get_active_hand()
+ if(istype(C) && !istype(inserted_id))
+ if(!usr.drop_item())
+ return
+ C.forceMove(src)
+ inserted_id = C
+ interact(user)
+ return
+ ..()
+
+/obj/machinery/mineral/equipment_vendor/proc/RedeemVoucher(obj/item/mining_voucher/voucher, mob/redeemer)
+ var/items = list("Survival Capsule and Explorer's Webbing", "Resonator Kit", "Minebot Kit", "Extraction and Rescue Kit", "Crusher Kit", "Mining Conscription Kit")
+
+ var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in items
+ if(!selection || !Adjacent(redeemer) || QDELETED(voucher) || voucher.loc != redeemer)
+ return
+
+ var/drop_location = drop_location()
+ switch(selection)
+ if("Survival Capsule and Explorer's Webbing")
+ new /obj/item/storage/belt/mining(drop_location)
+ if("Resonator Kit")
+ new /obj/item/extinguisher/mini(drop_location)
+ new /obj/item/resonator(drop_location)
+ if("Minebot Kit")
+ new /obj/item/mining_drone_cube(drop_location)
+ new /obj/item/weldingtool/hugetank(drop_location)
+ new /obj/item/clothing/head/welding(drop_location)
+ if("Extraction and Rescue Kit")
+ new /obj/item/extraction_pack(drop_location)
+ new /obj/item/fulton_core(drop_location)
+ new /obj/item/stack/marker_beacon/thirty(drop_location)
+ if("Crusher Kit")
+ new /obj/item/extinguisher/mini(drop_location)
+ new /obj/item/twohanded/kinetic_crusher(drop_location)
+ if("Mining Conscription Kit")
+ new /obj/item/storage/backpack/duffel/mining_conscript(drop_location)
+
+ qdel(voucher)
+
+/obj/machinery/mineral/equipment_vendor/ex_act(severity, target)
+ do_sparks(5, 1, src)
+ if(prob(50 / severity) && severity < 3)
+ qdel(src)
+
+/**********************Mining Equipment Locker Items**************************/
+
+/**********************Mining Equipment Voucher**********************/
+
+/obj/item/mining_voucher
+ name = "mining voucher"
+ desc = "A token to redeem a piece of equipment. Use it on a mining equipment vendor."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "mining_voucher"
+ w_class = WEIGHT_CLASS_TINY
+
+/**********************Mining Point Card**********************/
+
+/obj/item/card/mining_point_card
+ name = "mining point 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, "You transfer [points] points to [C].")
+ points = 0
+ else
+ to_chat(user, "There's no points left on [src].")
+ ..()
+
+/obj/item/card/mining_point_card/examine(mob/user)
+ ..(user)
+ to_chat(user, "There's [points] points on the card.")
+
+/**********************Conscription Kit**********************/
+
+/obj/item/card/id/mining_access_card
+ name = "mining access card"
+ desc = "A small card, that when used on any ID, will add mining access."
+ icon_state = "data_1"
+
+/obj/item/card/id/mining_access_card/afterattack(atom/movable/AM, mob/user, proximity)
+ . = ..()
+ if(istype(AM, /obj/item/card/id) && proximity)
+ var/obj/item/card/id/I = AM
+ I.access |= list(access_mining, access_mining_station, access_mineral_storeroom, access_cargo)
+ to_chat(user, "You upgrade [I] with mining access.")
+ qdel(src)
+
+/obj/item/storage/backpack/duffel/mining_conscript
+ name = "mining conscription kit"
+ desc = "A kit containing everything a crewmember needs to support a shaft miner in the field."
+
+/obj/item/storage/backpack/duffel/mining_conscript/New()
+ ..()
+ new /obj/item/clothing/glasses/meson(src)
+ new /obj/item/t_scanner/adv_mining_scanner/lesser(src)
+ new /obj/item/storage/bag/ore(src)
+ new /obj/item/clothing/suit/hooded/explorer(src)
+ new /obj/item/encryptionkey/headset_cargo(src)
+ new /obj/item/clothing/mask/gas/explorer(src)
+ new /obj/item/card/id/mining_access_card(src)
+ new /obj/item/gun/energy/kinetic_accelerator(src)
+ new /obj/item/kitchen/knife/combat/survival(src)
+ new /obj/item/flashlight/seclite(src)
\ No newline at end of file
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 87b919ea238..f350633a4c2 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -75,157 +75,6 @@
desc = "A mining lantern."
brightness_on = 6 // luminosity when on
-/*****************************Pickaxe********************************/
-
-/obj/item/pickaxe
- name = "pickaxe"
- icon = 'icons/obj/items.dmi'
- icon_state = "pickaxe"
- flags = CONDUCT
- slot_flags = SLOT_BELT
- force = 15
- throwforce = 10
- item_state = "pickaxe"
- w_class = WEIGHT_CLASS_BULKY
- materials = list(MAT_METAL=2000) //one sheet, but where can you make them?
- origin_tech = "materials=2;engineering=3"
- attack_verb = list("hit", "pierced", "sliced", "attacked")
- var/list/digsound = list('sound/effects/picaxe1.ogg','sound/effects/picaxe2.ogg','sound/effects/picaxe3.ogg')
- var/drill_verb = "picking"
- sharp = 1
- var/excavation_amount = 100
- usesound = 'sound/effects/picaxe1.ogg'
- toolspeed = 1
-
-/obj/item/pickaxe/proc/playDigSound()
- playsound(src, pick(digsound),20,1)
-
-/obj/item/pickaxe/emergency
- name = "emergency disembarkation tool"
- desc = "For extracting yourself from rough landings."
-
-/obj/item/pickaxe/safety
- name = "safety pickaxe"
- desc = "A pickaxe designed to be only effective at digging rock and ore, very ineffective as a weapon."
- force = 1
- throwforce = 1
- attack_verb = list("ineffectively hit")
-
-/obj/item/pickaxe/mini
- name = "compact pickaxe"
- desc = "A smaller, compact version of the standard pickaxe."
- icon_state = "minipick"
- force = 10
- throwforce = 7
- w_class = WEIGHT_CLASS_NORMAL
- materials = list(MAT_METAL = 1000)
-
-/obj/item/pickaxe/silver
- name = "silver-plated pickaxe"
- icon_state = "spickaxe"
- item_state = "spickaxe"
- origin_tech = "materials=3;engineering=4"
- desc = "A silver-plated pickaxe that mines slightly faster than standard-issue."
- toolspeed = 0.75
-
-/obj/item/pickaxe/gold
- name = "golden pickaxe"
- icon_state = "gpickaxe"
- item_state = "gpickaxe"
- origin_tech = "materials=4;engineering=4"
- desc = "A gold-plated pickaxe that mines faster than standard-issue."
- toolspeed = 0.6
-
-/obj/item/pickaxe/diamond
- name = "diamond-tipped pickaxe"
- icon_state = "dpickaxe"
- item_state = "dpickaxe"
- origin_tech = "materials=5;engineering=4"
- desc = "A pickaxe with a diamond pick head. Extremely robust at cracking rock walls and digging up dirt."
- toolspeed = 0.5
-
-/obj/item/pickaxe/drill
- name = "mining drill"
- icon_state = "handdrill"
- item_state = "jackhammer"
- digsound = list('sound/weapons/drill.ogg')
- hitsound = 'sound/weapons/drill.ogg'
- usesound = 'sound/weapons/drill.ogg'
- origin_tech = "materials=2;powerstorage=2;engineering=3"
- desc = "An electric mining drill for the especially scrawny."
- toolspeed = 0.5
-
-/obj/item/pickaxe/drill/cyborg
- name = "cyborg mining drill"
- desc = "An integrated electric mining drill."
- flags = NODROP
-
-/obj/item/pickaxe/drill/diamonddrill
- name = "diamond-tipped mining drill"
- icon_state = "diamonddrill"
- origin_tech = "materials=6;powerstorage=4;engineering=4"
- desc = "Yours is the drill that will pierce the heavens!"
- toolspeed = 0.25
-
-/obj/item/pickaxe/diamonddrill/traitor //Pocket-sized traitor diamond drill.
- name = "supermatter drill"
- icon_state = "smdrill"
- origin_tech = "materials=6;powerstorage=4;engineering=4;syndicate=3"
- desc = "Microscopic supermatter crystals cover the head of this tiny drill."
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/pickaxe/drill/cyborg/diamond //This is the BORG version!
- name = "diamond-tipped cyborg mining drill" //To inherit the NODROP flag, and easier to change borg specific drill mechanics.
- icon_state = "diamonddrill"
- toolspeed = 0.25
-
-/obj/item/pickaxe/drill/jackhammer
- name = "sonic jackhammer"
- icon_state = "jackhammer"
- item_state = "jackhammer"
- origin_tech = "materials=6;powerstorage=4;engineering=5;magnets=4"
- digsound = list('sound/weapons/sonic_jackhammer.ogg')
- hitsound = 'sound/weapons/sonic_jackhammer.ogg'
- usesound = 'sound/weapons/sonic_jackhammer.ogg'
- desc = "Cracks rocks with sonic blasts, and doubles as a demolition power tool for smashing walls."
- toolspeed = 0.1
-
-/*****************************Shovel********************************/
-
-/obj/item/shovel
- name = "shovel"
- desc = "A large tool for digging and moving dirt."
- icon = 'icons/obj/items.dmi'
- icon_state = "shovel"
- flags = CONDUCT
- slot_flags = SLOT_BELT
- force = 8
- throwforce = 4
- item_state = "shovel"
- w_class = WEIGHT_CLASS_NORMAL
- materials = list(MAT_METAL=50)
- origin_tech = "materials=2;engineering=2"
- attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked")
- usesound = 'sound/effects/shovel_dig.ogg'
- toolspeed = 1
-
-/obj/item/shovel/spade
- name = "spade"
- desc = "A small tool for digging and moving dirt."
- icon_state = "spade"
- item_state = "spade"
- force = 5
- throwforce = 7
- w_class = WEIGHT_CLASS_SMALL
- toolspeed = 2
-
-/obj/item/shovel/safety
- name = "safety shovel"
- desc = "A large tool for digging and moving dirt. Was modified with extra safety, making it ineffective as a weapon."
- force = 1
- throwforce = 1
- attack_verb = list("ineffectively hit")
-
/**********************Mining car (Crate like thing, not the rail car)**************************/
/obj/structure/closet/crate/miningcar
@@ -234,60 +83,4 @@
icon_state = "miningcar"
density = 1
icon_opened = "miningcaropen"
- icon_closed = "miningcar"
-
-/*********************Mob Capsule*************************/
-
-/obj/item/mobcapsule
- name = "lazarus capsule"
- desc = "It allows you to store and deploy lazarus-injected creatures easier."
- icon = 'icons/obj/mobcap.dmi'
- icon_state = "mobcap0"
- w_class = WEIGHT_CLASS_TINY
- throw_range = 20
- var/mob/living/simple_animal/captured = null
- var/colorindex = 0
-
-/obj/item/mobcapsule/Destroy()
- if(captured)
- captured.ghostize()
- QDEL_NULL(captured)
- return ..()
-
-/obj/item/mobcapsule/attack(var/atom/A, mob/user, prox_flag)
- if(!istype(A, /mob/living/simple_animal) || isbot(A))
- return ..()
- capture(A, user)
- return 1
-
-/obj/item/mobcapsule/proc/capture(var/mob/target, var/mob/U as mob)
- var/mob/living/simple_animal/T = target
- if(captured)
- to_chat(U, "Capture failed!: The capsule already has a mob registered to it!")
- else
- if(istype(T) && "neutral" in T.faction)
- T.forceMove(src)
- T.name = "[U.name]'s [initial(T.name)]"
- T.cancel_camera()
- name = "Lazarus Capsule: [initial(T.name)]"
- to_chat(U, "You placed a [T.name] inside the Lazarus Capsule!")
- captured = T
- else
- to_chat(U, "You can't capture that mob!")
-
-/obj/item/mobcapsule/throw_impact(atom/A, mob/user)
- ..()
- if(captured)
- dump_contents(user)
-
-/obj/item/mobcapsule/proc/dump_contents(mob/user)
- if(captured)
- captured.forceMove(get_turf(src))
- captured = null
-
-/obj/item/mobcapsule/attack_self(mob/user)
- colorindex += 1
- if(colorindex >= 6)
- colorindex = 0
- icon_state = "mobcap[colorindex]"
- update_icon()
+ icon_closed = "miningcar"
\ No newline at end of file
diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm
index 2ff2a686439..e7036ad4f2f 100644
--- a/code/modules/mining/minebot.dm
+++ b/code/modules/mining/minebot.dm
@@ -303,6 +303,7 @@
qdel(src)
//AI
+
/obj/item/slimepotion/sentience/mining
name = "minebot AI upgrade"
desc = "Can be used to grant sentience to minebots."
@@ -325,5 +326,21 @@
if(M.stored_gun)
M.stored_gun.overheat_time += base_cooldown_add
+/**********************Mining drone cube**********************/
+
+/obj/item/mining_drone_cube
+ name = "mining drone cube"
+ desc = "Compressed mining drone, ready for deployment. Just press the button to activate!"
+ w_class = WEIGHT_CLASS_SMALL
+ icon = 'icons/obj/aibots.dmi'
+ icon_state = "minedronecube"
+ item_state = "electronic"
+
+/obj/item/mining_drone_cube/attack_self(mob/user)
+ user.visible_message("\The [src] suddenly expands into a fully functional mining drone!", \
+ "You press center button on \the [src]. The device suddenly expands into a fully functional mining drone!")
+ new /mob/living/simple_animal/hostile/mining_drone(get_turf(src))
+ qdel(src)
+
#undef MINEDRONE_COLLECT
-#undef MINEDRONE_ATTACK
+#undef MINEDRONE_ATTACK
\ No newline at end of file
diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ores_coins.dm
similarity index 70%
rename from code/modules/mining/ore.dm
rename to code/modules/mining/ores_coins.dm
index 236bcec1231..120dacad800 100644
--- a/code/modules/mining/ore.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -303,8 +303,165 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
qdel(src)
-/obj/item/stack/ore/ex_act()
- return
+/obj/item/stack/ore/ex_act(severity)
+ if(!severity || severity >= 2)
+ return
+ qdel(src)
+
+
+/*****************************Coin********************************/
+
+/obj/item/coin
+ icon = 'icons/obj/economy.dmi'
+ name = "coin"
+ icon_state = "coin__heads"
+ flags = CONDUCT
+ force = 1
+ throwforce = 2
+ w_class = WEIGHT_CLASS_TINY
+ var/string_attached
+ var/list/sideslist = list("heads","tails")
+ var/cmineral = null
+ var/cooldown = 0
+ var/credits = 10
+
+/obj/item/coin/New()
+ pixel_x = rand(0,16)-8
+ pixel_y = rand(0,8)-8
+
+ icon_state = "coin_[cmineral]_[sideslist[1]]"
+ if(cmineral)
+ name = "[cmineral] coin"
+
+/obj/item/coin/gold
+ cmineral = "gold"
+ icon_state = "coin_gold_heads"
+ materials = list(MAT_GOLD = 400)
+ credits = 160
+
+/obj/item/coin/silver
+ cmineral = "silver"
+ icon_state = "coin_silver_heads"
+ materials = list(MAT_SILVER = 400)
+ credits = 40
+
+/obj/item/coin/diamond
+ cmineral = "diamond"
+ icon_state = "coin_diamond_heads"
+ materials = list(MAT_DIAMOND = 400)
+ credits = 120
+
+/obj/item/coin/iron
+ cmineral = "iron"
+ icon_state = "coin_iron_heads"
+ materials = list(MAT_METAL = 400)
+ credits = 20
+
+/obj/item/coin/plasma
+ cmineral = "plasma"
+ icon_state = "coin_plasma_heads"
+ materials = list(MAT_PLASMA = 400)
+ credits = 80
+
+/obj/item/coin/uranium
+ cmineral = "uranium"
+ icon_state = "coin_uranium_heads"
+ materials = list(MAT_URANIUM = 400)
+ credits = 160
+
+/obj/item/coin/clown
+ cmineral = "bananium"
+ icon_state = "coin_bananium_heads"
+ materials = list(MAT_BANANIUM = 400)
+ credits = 600 //makes the clown cri
+
+/obj/item/coin/mime
+ cmineral = "tranquillite"
+ icon_state = "coin_tranquillite_heads"
+ materials = list(MAT_TRANQUILLITE = 400)
+ credits = 600 //makes the mime cri
+
+/obj/item/coin/adamantine
+ cmineral = "adamantine"
+ icon_state = "coin_adamantine_heads"
+ credits = 400
+
+/obj/item/coin/mythril
+ cmineral = "mythril"
+ icon_state = "coin_mythril_heads"
+ credits = 400
+
+/obj/item/coin/twoheaded
+ cmineral = "iron"
+ icon_state = "coin_iron_heads"
+ desc = "Hey, this coin's the same on both sides!"
+ sideslist = list("heads")
+ credits = 20
+
+/obj/item/coin/antagtoken
+ name = "antag token"
+ icon_state = "coin_valid_valid"
+ cmineral = "valid"
+ desc = "A novelty coin that helps the heart know what hard evidence cannot prove."
+ sideslist = list("valid", "salad")
+ credits = 20
+
+/obj/item/coin/antagtoken/syndicate
+ name = "syndicate coin"
+ credits = 160
+
+/obj/item/coin/attackby(obj/item/W as obj, mob/user as mob, params)
+ if(istype(W, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/CC = W
+ if(string_attached)
+ to_chat(user, "There already is a string attached to this coin.")
+ return
+
+ if(CC.use(1))
+ overlays += image('icons/obj/economy.dmi',"coin_string_overlay")
+ string_attached = 1
+ to_chat(user, "You attach a string to the coin.")
+ else
+ to_chat(user, "You need one length of cable to attach a string to the coin.")
+ return
+
+ else if(istype(W,/obj/item/wirecutters))
+ if(!string_attached)
+ ..()
+ return
+
+ var/obj/item/stack/cable_coil/CC = new/obj/item/stack/cable_coil(user.loc)
+ CC.amount = 1
+ CC.update_icon()
+ overlays = list()
+ string_attached = null
+ to_chat(user, "You detach the string from the coin.")
+ else if(istype(W,/obj/item/weldingtool))
+ var/obj/item/weldingtool/WT = W
+ if(WT.welding && WT.remove_fuel(0, user))
+ var/typelist = list("iron" = /obj/item/clothing/gloves/ring,
+ "silver" = /obj/item/clothing/gloves/ring/silver,
+ "gold" = /obj/item/clothing/gloves/ring/gold,
+ "plasma" = /obj/item/clothing/gloves/ring/plasma,
+ "uranium" = /obj/item/clothing/gloves/ring/uranium)
+ var/typekey = typelist[cmineral]
+ if(ispath(typekey))
+ to_chat(user, "You make [src] into a ring.")
+ new typekey(get_turf(loc))
+ qdel(src)
+ else ..()
+
+/obj/item/coin/attack_self(mob/user as mob)
+ if(cooldown < world.time - 15)
+ var/coinflip = pick(sideslist)
+ cooldown = world.time
+ flick("coin_[cmineral]_flip", src)
+ icon_state = "coin_[cmineral]_[coinflip]"
+ playsound(user.loc, 'sound/items/coinflip.ogg', 50, 1)
+ if(do_after(user, 15, target = src))
+ user.visible_message("[user] has flipped [src]. It lands on [coinflip].", \
+ "You flip [src]. It lands on [coinflip].", \
+ "You hear the clattering of loose change.")
#undef GIBTONITE_QUALITY_LOW
#undef GIBTONITE_QUALITY_MEDIUM
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index a8dbaa7ac2f..82b98a3732e 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -1128,6 +1128,7 @@ so that different stomachs can handle things in different ways VB*/
var/obj/item/clothing/C = I
if(C.tint || initial(C.tint))
update_tint()
+ update_sight()
if(I.flags_inv & HIDEMASK || forced)
update_inv_wear_mask()
update_inv_head()
diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm
index 785d737aec2..b75132c7bc6 100644
--- a/code/modules/mob/living/carbon/human/species/plasmaman.dm
+++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm
@@ -6,21 +6,19 @@
dangerous_existence = TRUE //So so much
//language = "Clatter"
- species_traits = list(IS_WHITELISTED, NO_BLOOD, NOTRANSSTING)
+ species_traits = list(IS_WHITELISTED, RADIMMUNE, NO_BLOOD, NOTRANSSTING)
forced_heartattack = TRUE // Plasmamen have no blood, but they should still get heart-attacks
skinned_type = /obj/item/stack/sheet/mineral/plasma // We're low on plasma, R&D! *eyes plasmaman co-worker intently*
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
- //default_mutations=list(SKELETON) // This screws things up
-
butt_sprite = "plasma"
breathid = "tox"
- heat_level_1 = 350 // Heat damage level 1 above this point.
- heat_level_2 = 400 // Heat damage level 2 above this point.
- heat_level_3 = 500 // Heat damage level 3 above this point.
+ burn_mod = 1.5
+ heatmod = 1.5
+ brute_mod = 1.5
//Has default darksight of 2.
@@ -48,136 +46,118 @@
message = replacetext(message, "s", stutter("ss"))
return message
-/datum/species/plasmaman/after_equip_job(datum/job/J, mob/living/carbon/human/H)
- var/assigned_role = H.mind && H.mind.assigned_role ? H.mind.assigned_role : "Civilian"
- // Unequip existing suits and hats.
- H.unEquip(H.wear_suit)
- H.unEquip(H.head)
- if(assigned_role != "Clown")
- H.unEquip(H.wear_mask)
-
- H.equip_or_collect(new /obj/item/clothing/mask/breath(H), slot_wear_mask)
- var/suit=/obj/item/clothing/suit/space/eva/plasmaman/assistant
- var/helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/assistant
- var/tank_slot = slot_s_store
- var/tank_slot_name = "suit storage"
-
- switch(assigned_role)
- if("Scientist","Roboticist")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/science
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science
- if("Geneticist")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/science/geneticist
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science/geneticist
- if("Research Director")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/science/rd
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science/rd
- if("Station Engineer", "Mechanic")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/engineer
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer
- if("Chief Engineer")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/engineer/ce
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer/ce
- if("Life Support Specialist")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/atmostech
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/atmostech
- if("Detective")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/security
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security
- if("Warden","Security Officer","Security Pod Pilot")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/security
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security
- if("Internal Affairs Agent")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/lawyer
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/lawyer
- if("Magistrate")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/magistrate
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/magistrate
- if("Head of Security", "Special Operations Officer")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/security/hos
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hos
- if("Captain", "Blueshield")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/security/captain
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/captain
- if("Head of Personnel")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/security/hop
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hop
- if("Nanotrasen Representative", "Nanotrasen Navy Officer")
- suit = /obj/item/clothing/suit/space/eva/plasmaman/nt_rep
- helm = /obj/item/clothing/head/helmet/space/eva/plasmaman/nt_rep
- if("Medical Doctor","Brig Physician","Virologist")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/medical
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical
- if("Paramedic")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/paramedic
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/paramedic
- if("Chemist")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/chemist
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/chemist
- if("Chief Medical Officer")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/cmo
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/cmo
- if("Coroner")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/coroner
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/coroner
- if("Virologist")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/virologist
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/virologist
- if("Bartender", "Chef")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/service
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/service
- if("Cargo Technician", "Quartermaster")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/cargo
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/cargo
- if("Shaft Miner")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/explorer
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/explorer
- if("Botanist")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/botanist
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/botanist
+/datum/species/plasmaman/before_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE)
+ var/current_job = J.title
+ var/datum/outfit/plasmaman/O = new /datum/outfit/plasmaman
+ switch(current_job)
if("Chaplain")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/chaplain
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/chaplain
- if("Janitor")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/janitor
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/janitor
- if("Civilian", "Barber")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/assistant
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/assistant
- if("Clown")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/clown
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/clown
- if("Mime")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/mime
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/mime
- if("Syndicate Officer")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/nuclear
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/nuclear
+ O = new /datum/outfit/plasmaman/chaplain
- if((H.mind.special_role == SPECIAL_ROLE_WIZARD) || (H.mind.special_role == SPECIAL_ROLE_WIZARD_APPRENTICE))
- H.equip_to_slot(new /obj/item/clothing/suit/space/eva/plasmaman/wizard(H), slot_wear_suit)
- H.equip_to_slot(new /obj/item/clothing/head/helmet/space/eva/plasmaman/wizard(H), slot_head)
- else
- H.equip_or_collect(new suit(H), slot_wear_suit)
- H.equip_or_collect(new helm(H), slot_head)
- H.equip_or_collect(new /obj/item/tank/plasma/plasmaman(H), tank_slot) // Bigger plasma tank from Raggy.
- H.equip_or_collect(new /obj/item/plasmensuit_cartridge(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/plasmensuit_cartridge(H), slot_in_backpack) //Two refill cartridges for their suit. Can fit in boxes.
- to_chat(H, "You are now running on plasma internals from the [H.s_store] in your [tank_slot_name]. You must breathe plasma in order to survive, and are extremely flammable.")
- H.internal = H.get_item_by_slot(tank_slot)
+ if("Librarian")
+ O = new /datum/outfit/plasmaman/librarian
+
+ if("Janitor")
+ O = new /datum/outfit/plasmaman/janitor
+
+ if("Botanist")
+ O = new /datum/outfit/plasmaman/botany
+
+ if("Bartender", "Internal Affairs Agent", "Magistrate", "Nanotrasen Representative", "Nanotrasen Navy Officer")
+ O = new /datum/outfit/plasmaman/bar
+
+ if("Chef")
+ O = new /datum/outfit/plasmaman/chef
+
+ if("Security Officer", "Security Pod Pilot", "Special Operations Officer")
+ O = new /datum/outfit/plasmaman/security
+
+ if("Detective")
+ O = new /datum/outfit/plasmaman/detective
+
+ if("Warden")
+ O = new /datum/outfit/plasmaman/warden
+
+ if("Head of Security")
+ O = new /datum/outfit/plasmaman/hos
+
+ if("Cargo Technician", "Quartermaster")
+ O = new /datum/outfit/plasmaman/cargo
+
+ if("Shaft Miner")
+ O = new /datum/outfit/plasmaman/mining
+
+ if("Medical Doctor", "Brig Physician", "Paramedic", "Coroner")
+ O = new /datum/outfit/plasmaman/medical
+
+ if("Chief Medical Officer")
+ O = new /datum/outfit/plasmaman/cmo
+
+ if("Chemist")
+ O = new /datum/outfit/plasmaman/chemist
+
+ if("Geneticist")
+ O = new /datum/outfit/plasmaman/genetics
+
+ if("Roboticist")
+ O = new /datum/outfit/plasmaman/robotics
+
+ if("Virologist")
+ O = new /datum/outfit/plasmaman/viro
+
+ if("Scientist")
+ O = new /datum/outfit/plasmaman/science
+
+ if("Research Director")
+ O = new /datum/outfit/plasmaman/rd
+
+ if("Station Engineer", "Mechanic")
+ O = new /datum/outfit/plasmaman/engineering
+
+ if("Chief Engineer")
+ O = new /datum/outfit/plasmaman/ce
+
+ if("Atmospheric Technician")
+ O = new /datum/outfit/plasmaman/atmospherics
+
+ if("Mime")
+ O = new /datum/outfit/plasmaman/mime
+
+ if("Clown")
+ O = new /datum/outfit/plasmaman/clown
+
+ if("Head of Personnel")
+ O = new /datum/outfit/plasmaman/hop
+
+ if("Captain")
+ O = new /datum/outfit/plasmaman/captain
+
+ if("Blueshield")
+ O = new /datum/outfit/plasmaman/blueshield
+
+ H.equipOutfit(O, visualsOnly)
+ H.internal = H.r_hand
H.update_action_buttons_icon()
+ return FALSE
/datum/species/plasmaman/handle_life(mob/living/carbon/human/H)
- if(!istype(H.wear_suit, /obj/item/clothing/suit/space/eva/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/eva/plasmaman))
- var/datum/gas_mixture/environment = H.loc.return_air()
- if(environment && environment.oxygen && environment.oxygen >= OXYCONCEN_PLASMEN_IGNITION) //Plasmamen so long as there's enough oxygen (0.5 moles, same as it takes to burn gaseous plasma).
- H.adjust_fire_stacks(0.5)
- if(!H.on_fire && H.fire_stacks > 0)
- H.visible_message("[H]'s body reacts with the atmosphere and bursts into flames!","Your body reacts with the atmosphere and bursts into flame!")
- H.IgniteMob()
+ var/datum/gas_mixture/environment = H.loc.return_air()
+ var/atmos_sealed = FALSE
+ if (H.wear_suit && H.head && istype(H.wear_suit, /obj/item/clothing) && istype(H.head, /obj/item/clothing))
+ var/obj/item/clothing/CS = H.wear_suit
+ var/obj/item/clothing/CH = H.head
+ if (CS.flags & CH.flags & STOPSPRESSUREDMAGE)
+ atmos_sealed = TRUE
+ if((!istype(H.w_uniform, /obj/item/clothing/under/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/plasmaman)) && !atmos_sealed)
+ if(environment)
+ if(environment.total_moles())
+ if(environment.oxygen && environment.oxygen >= OXYCONCEN_PLASMEN_IGNITION) //Same threshhold that extinguishes fire
+ H.adjust_fire_stacks(0.5)
+ if(!H.on_fire && H.fire_stacks > 0)
+ H.visible_message("[H]'s body reacts with the atmosphere and bursts into flames!","Your body reacts with the atmosphere and bursts into flame!")
+ H.IgniteMob()
else
- if(H.on_fire && H.fire_stacks > 0)
- var/obj/item/clothing/suit/space/eva/plasmaman/P = H.wear_suit
+ if(H.fire_stacks)
+ var/obj/item/clothing/under/plasmaman/P = H.w_uniform
if(istype(P))
P.Extinguish(H)
H.update_fire()
diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm
index 30653023751..379eb183292 100644
--- a/code/modules/mob/living/carbon/human/status_procs.dm
+++ b/code/modules/mob/living/carbon/human/status_procs.dm
@@ -7,19 +7,19 @@
/mob/living/carbon/human/SetStunned(amount, updating = 1, force = 0)
if(dna.species)
amount = amount * dna.species.stun_mod
- ..()
+ return ..()
/mob/living/carbon/human/SetWeakened(amount, updating = 1, force = 0)
if(dna.species)
amount = amount * dna.species.stun_mod
- ..()
+ return ..()
/mob/living/carbon/human/SetParalysis(amount, updating = 1, force = 0)
if(dna.species)
amount = amount * dna.species.stun_mod
- ..()
+ return ..()
/mob/living/carbon/human/SetSleeping(amount, updating = 1, no_alert = FALSE)
if(dna.species)
amount = amount * dna.species.stun_mod
- ..()
\ No newline at end of file
+ return ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 83d77896459..a682a61d68d 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -940,29 +940,31 @@ var/global/list/damage_icon_parts = list()
if(inv)
inv.update_icon()
if(wear_mask && (istype(wear_mask, /obj/item/clothing/mask) || istype(wear_mask, /obj/item/clothing/accessory)))
- var/obj/item/organ/external/head/head_organ = get_organ("head")
- var/datum/sprite_accessory/alt_heads/alternate_head
- if(head_organ.alt_head && head_organ.alt_head != "None")
- alternate_head = GLOB.alt_heads_list[head_organ.alt_head]
+ if(!(slot_wear_mask in check_obscured_slots()))
+ var/obj/item/organ/external/head/head_organ = get_organ("head")
+ var/datum/sprite_accessory/alt_heads/alternate_head
+ if(head_organ.alt_head && head_organ.alt_head != "None")
+ alternate_head = GLOB.alt_heads_list[head_organ.alt_head]
- var/mutable_appearance/standing
- var/icon/mask_icon = new(wear_mask.icon)
- if(wear_mask.icon_override)
- mask_icon = new(wear_mask.icon_override)
- standing = mutable_appearance(wear_mask.icon_override, "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]", layer = -FACEMASK_LAYER)
- else if(wear_mask.sprite_sheets && wear_mask.sprite_sheets[dna.species.name])
- mask_icon = new(wear_mask.sprite_sheets[dna.species.name])
- standing = mutable_appearance(wear_mask.sprite_sheets[dna.species.name], "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]", layer = -FACEMASK_LAYER)
- else
- standing = mutable_appearance('icons/mob/mask.dmi', "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]", layer = -FACEMASK_LAYER)
+ var/mutable_appearance/standing
+ var/icon/mask_icon = new(wear_mask.icon)
+ if(wear_mask.icon_override)
+ mask_icon = new(wear_mask.icon_override)
+ standing = mutable_appearance(wear_mask.icon_override, "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]", layer = -FACEMASK_LAYER)
+ else if(wear_mask.sprite_sheets && wear_mask.sprite_sheets[dna.species.name])
+ mask_icon = new(wear_mask.sprite_sheets[dna.species.name])
+ standing = mutable_appearance(wear_mask.sprite_sheets[dna.species.name], "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]", layer = -FACEMASK_LAYER)
+ else
+ standing = mutable_appearance('icons/mob/mask.dmi', "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]", layer = -FACEMASK_LAYER)
- if(!istype(wear_mask, /obj/item/clothing/mask/cigarette) && wear_mask.blood_DNA)
- var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "maskblood")
- bloodsies.color = wear_mask.blood_color
- standing.overlays += bloodsies
- standing.alpha = wear_mask.alpha
- standing.color = wear_mask.color
- overlays_standing[FACEMASK_LAYER] = standing
+ if(!istype(wear_mask, /obj/item/clothing/mask/cigarette) && wear_mask.blood_DNA)
+ var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "maskblood")
+ bloodsies.color = wear_mask.blood_color
+ standing.overlays += bloodsies
+
+ standing.alpha = wear_mask.alpha
+ standing.color = wear_mask.color
+ overlays_standing[FACEMASK_LAYER] = standing
apply_overlay(FACEMASK_LAYER)
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index 06043025f7c..51d5820d2bf 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -107,6 +107,8 @@
aiRestorePowerRoutine = 0
update_blind_effects()
update_sight()
+ to_chat(src, "Here are your current laws:")
+ show_laws()
return
switch(PRP)
@@ -126,8 +128,6 @@
theAPC.attack_ai(src)
apc_override = 0
aiRestorePowerRoutine = 3
- to_chat(src, "Here are your current laws:")
- src.show_laws() //WHY THE FUCK IS THIS HERE
sleep(50)
theAPC = null
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
index c90a06a9fb8..43d239c59ce 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
@@ -55,80 +55,6 @@
return FALSE
mouse_opacity = MOUSE_OPACITY_ICON
-/obj/item/organ/internal/hivelord_core
- name = "hivelord remains"
- desc = "All that remains of a hivelord, it seems to be what allows it to break pieces of itself off without being hurt... its healing properties will soon become inert if not used quickly."
- icon_state = "roro core 2"
- flags = NOBLUDGEON
- slot = "hivecore"
- force = 0
- actions_types = list(/datum/action/item_action/organ_action/use)
- var/inert = 0
- var/preserved = 0
-
-/obj/item/organ/internal/hivelord_core/New()
- ..()
- addtimer(CALLBACK(src, .proc/inert_check), 2400)
-
-/obj/item/organ/internal/hivelord_core/proc/inert_check()
- if(owner)
- preserved(implanted = 1)
- else if(preserved)
- preserved()
- else
- go_inert()
-
-/obj/item/organ/internal/hivelord_core/proc/preserved(implanted = 0)
- inert = FALSE
- preserved = TRUE
- update_icon()
-
- if(implanted)
- feedback_add_details("hivelord_core", "[type]|implanted")
- else
- feedback_add_details("hivelord_core", "[type]|stabilizer")
-
-
-/obj/item/organ/internal/hivelord_core/proc/go_inert()
- inert = TRUE
- desc = "The remains of a hivelord that have become useless, having been left alone too long after being harvested."
- feedback_add_details("hivelord_core", "[src.type]|inert")
- update_icon()
-
-/obj/item/organ/internal/hivelord_core/ui_action_click()
- owner.revive()
- qdel(src)
-
-/obj/item/organ/internal/hivelord_core/on_life()
- ..()
- if(owner.health < HEALTH_THRESHOLD_CRIT)
- ui_action_click()
-
-/obj/item/organ/internal/hivelord_core/afterattack(atom/target, mob/user, proximity_flag)
- if(proximity_flag && ishuman(target))
- var/mob/living/carbon/human/H = target
- if(inert)
- to_chat(user, "[src] has become inert, its healing properties are no more.")
- return
- else
- if(H.stat == DEAD)
- to_chat(user, "[src] are useless on the dead.")
- return
- if(H != user)
- H.visible_message("[user] forces [H] to apply [src]... They quickly regenerate all injuries!")
- feedback_add_details("hivelord_core","[src.type]|used|other")
- else
- to_chat(user, "You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments.")
- feedback_add_details("hivelord_core","[src.type]|used|self")
- playsound(src.loc,'sound/items/eatfood.ogg', rand(10,50), 1)
- H.revive()
- user.drop_item()
- qdel(src)
- ..()
-
-/obj/item/organ/internal/hivelord_core/prepare_eat()
- return null
-
/mob/living/simple_animal/hostile/asteroid/hivelordbrood
name = "hivelord brood"
desc = "A fragment of the original Hivelord, rallying behind its original. One isn't much of a threat, but..."
@@ -326,34 +252,6 @@
H.forceMove(L)
qdel(src)
-/obj/item/organ/internal/hivelord_core/legion
- name = "legion's soul"
- desc = "A strange rock that still crackles with power... its \
- healing properties will soon become inert if not used quickly."
- icon_state = "legion_soul"
-
-/obj/item/organ/internal/hivelord_core/legion/New()
- ..()
- update_icon()
-
-/obj/item/organ/internal/hivelord_core/legion/update_icon()
- icon_state = inert ? "legion_soul_inert" : "legion_soul"
- overlays.Cut()
- if(!inert && !preserved)
- overlays += image(icon, "legion_soul_crackle")
- for(var/X in actions)
- var/datum/action/A = X
- A.UpdateButtonIcon()
-
-/obj/item/organ/internal/hivelord_core/legion/go_inert()
- . = ..()
- desc = "[src] has become inert, it crackles no more and is useless for \
- healing injuries."
-
-/obj/item/organ/internal/hivelord_core/legion/preserved(implanted = 0)
- ..()
- desc = "[src] has been stabilized. It no longer crackles with power, but it's healing properties are preserved indefinitely."
-
/obj/item/legion_skull
name = "legion's head"
desc = "The once living, now empty eyes of the former human's skull cut deep into your soul."
diff --git a/code/modules/nano/interaction/base.dm b/code/modules/nano/interaction/base.dm
index e4e5dd1a33b..e7f06137781 100644
--- a/code/modules/nano/interaction/base.dm
+++ b/code/modules/nano/interaction/base.dm
@@ -24,6 +24,8 @@
return STATUS_UPDATE // Ghosts can view updates
/mob/living/silicon/ai/shared_nano_interaction()
+ if(apc_override)
+ return STATUS_INTERACTIVE
if(lacks_power())
return STATUS_CLOSE
if(check_unable(1, 0))
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index 33741d1475b..0ee03a2b272 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -15,6 +15,7 @@
use_power = NO_POWER_USE
idle_power_usage = 0
active_power_usage = 0
+ var/malfunction = FALSE
/obj/machinery/power/Destroy()
disconnect_from_network()
@@ -30,7 +31,7 @@
// Non-machines should use add_delayedload(), delayed_surplus(), newavail()
/obj/machinery/power/proc/add_avail(amount)
- if(powernet)
+ if(powernet && !malfunction)
powernet.newavail += amount
return TRUE
else
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index bab7dc94e0d..9342b3afd29 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -85,7 +85,7 @@
holder = item
- holder.flags |= NODROP | DROPDEL
+ holder.flags |= NODROP
holder.unacidable = 1
holder.slot_flags = null
holder.w_class = WEIGHT_CLASS_HUGE
diff --git a/code/modules/vehicle/ambulance.dm b/code/modules/vehicle/ambulance.dm
index 6b15018de49..ac225003c52 100644
--- a/code/modules/vehicle/ambulance.dm
+++ b/code/modules/vehicle/ambulance.dm
@@ -102,6 +102,10 @@
anchored = FALSE
throw_pressure_limit = INFINITY //Throwing an ambulance trolley can kill the process scheduler.
+/obj/structure/bed/amb_trolley/examine(mob/user)
+ . = ..()
+ to_chat(user, "Drag [src]'s sprite over the ambulance to (de)attach it.")
+
/obj/structure/bed/amb_trolley/MouseDrop(obj/over_object as obj)
..()
if(istype(over_object, /obj/vehicle/ambulance))
diff --git a/html/changelogs/AutoChangeLog-pr-11862.yml b/html/changelogs/AutoChangeLog-pr-11862.yml
new file mode 100644
index 00000000000..ecd4aa0fa8b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11862.yml
@@ -0,0 +1,4 @@
+author: "Ty-Omaha"
+delete-after: True
+changes:
+ - bugfix: "Fixed a bug where hotwiring solar panels would allow for the station to remain powered in the Grid Check power failure event."
diff --git a/html/changelogs/AutoChangeLog-pr-11941.yml b/html/changelogs/AutoChangeLog-pr-11941.yml
new file mode 100644
index 00000000000..5654ca5bdcf
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11941.yml
@@ -0,0 +1,10 @@
+author: "farie82"
+delete-after: True
+changes:
+ - rscadd: "Adds tip text to the examine text of the ambulance trolley about how to attach it"
+ - rscadd: "Adds tip text to the nuke when trying to use the NAD before deploying it"
+ - rscadd: "Adds tip text to the fire axe cabinet about how to lock/unlock it"
+ - rscadd: "Adds tip text to airlocks if they have a note on them about how to remove the note"
+ - bugfix: "Can't put the NAD in the nuke now when it has the NODROP flag"
+ - bugfix: "Locking a fire axe cabinet is less weird now. No odd 5 seconds sleep"
+ - bugfix: "Can't put a nodrop fire axe in fire axe cabinets now. Duping them"
diff --git a/html/changelogs/AutoChangeLog-pr-11948.yml b/html/changelogs/AutoChangeLog-pr-11948.yml
new file mode 100644
index 00000000000..a7048eee037
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11948.yml
@@ -0,0 +1,9 @@
+author: "EmanTheAlmighty"
+delete-after: True
+changes:
+ - rscadd: "Blobbernauts can now be controlled by players through a prompt which appears when they are spawned by blobs."
+ - rscadd: "Blobbernauts and blobs can now communicate with each other."
+ - rscadd: "Blobbernauts now regenerate health overtime when standing on blob structures."
+ - rscadd: "Blobbernauts will slowly lose health if they are not standing on blob structures while not at full health.
+balance: Blobbernauts have been nerfed, they now have less health, deal less damage and cannot break walls anymore.
+balance: Blob's \"Produce Blobbernaut\" ability has been made more expensive to use, now costing 60 resources instead of 20."
diff --git a/html/changelogs/AutoChangeLog-pr-11987.yml b/html/changelogs/AutoChangeLog-pr-11987.yml
new file mode 100644
index 00000000000..e7ed3c0b338
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11987.yml
@@ -0,0 +1,13 @@
+author: "Fox McCloud"
+delete-after: True
+changes:
+ - tweak: "Plasmamen dramatically overhauled."
+ - rscadd: "Plasmamen can be cloned without burning to death in the clonepod"
+ - rscdel: "Plasmamen no longer start with spacesuits"
+ - rscadd: "Plasmamen start off with jumpsuits that seal to protect against oxygen. This allows for you to customize their appearance more"
+ - tweak: "Plasmamen helmets now allow you to see a Plasmaman's actual face; should be able to see their eye color and mouth color now"
+ - tweak: "Plasmamen take 50% extra brute and burn"
+ - rscadd: "Plasmamen are immune to radiation"
+ - tweak: "Plasmamen start out with a small tank that can fit on a belt or in a pocket; it should be enough to last an entire shift"
+ - rscadd: "Plasmaman helmets now have built in welding goggles"
+ - tweak: "Plasmaman karma cost lowered from 100 to 45"
diff --git a/html/changelogs/AutoChangeLog-pr-12038.yml b/html/changelogs/AutoChangeLog-pr-12038.yml
new file mode 100644
index 00000000000..f241cfc6c23
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12038.yml
@@ -0,0 +1,4 @@
+author: "Shadow-Quill"
+delete-after: True
+changes:
+ - bugfix: "AIs not being able to restore their own power if in an area with an APC."
diff --git a/html/changelogs/AutoChangeLog-pr-12066.yml b/html/changelogs/AutoChangeLog-pr-12066.yml
new file mode 100644
index 00000000000..71c585e6514
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12066.yml
@@ -0,0 +1,11 @@
+author: "Fox McCloud"
+delete-after: True
+changes:
+ - tweak: "Ores can be destroyed by devastating explosions"
+ - tweak: "silver, gold, and diamond pickaxes do a bit more damage and mine faster than before"
+ - tweak: "drills slightly slower, but diamond drills slightly faster"
+ - tweak: "Spade is the same speed as a shovel"
+ - tweak: "Hivelord stabilizer will now make a hivelord core/legion soul stabilize and be preserved, even if it was previously inert"
+ - tweak: "can use a hivelord core in your active hand to apply it to yourself"
+ - rscadd: "soulstone in the abandoned locked crates can now be used by anyone"
+ - rscadd: "Adds firelemon seeds to the abandoned locked crates as potential loot"
diff --git a/html/changelogs/AutoChangeLog-pr-12079.yml b/html/changelogs/AutoChangeLog-pr-12079.yml
new file mode 100644
index 00000000000..06e129f082d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12079.yml
@@ -0,0 +1,4 @@
+author: "Fox McCloud"
+delete-after: True
+changes:
+ - bugfix: "Fixes stuns and weakens related to reagents"
diff --git a/html/changelogs/AutoChangeLog-pr-12081.yml b/html/changelogs/AutoChangeLog-pr-12081.yml
new file mode 100644
index 00000000000..931893453db
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12081.yml
@@ -0,0 +1,4 @@
+author: "farie82"
+delete-after: True
+changes:
+ - bugfix: "Implants like the IPC charging work again. They won't get deleted after first use"
diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi
index a1e80aa5e65..5c272f8c8e9 100644
Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ
diff --git a/icons/mob/species/plasmaman/helmet.dmi b/icons/mob/species/plasmaman/helmet.dmi
index bd5465857d8..ebcb096aa7b 100644
Binary files a/icons/mob/species/plasmaman/helmet.dmi and b/icons/mob/species/plasmaman/helmet.dmi differ
diff --git a/icons/mob/species/plasmaman/mask.dmi b/icons/mob/species/plasmaman/mask.dmi
index 1acdc5e581f..73ff04e9288 100644
Binary files a/icons/mob/species/plasmaman/mask.dmi and b/icons/mob/species/plasmaman/mask.dmi differ
diff --git a/icons/mob/species/plasmaman/suit.dmi b/icons/mob/species/plasmaman/suit.dmi
deleted file mode 100644
index c4d1a7a2b3c..00000000000
Binary files a/icons/mob/species/plasmaman/suit.dmi and /dev/null differ
diff --git a/icons/mob/species/plasmaman/uniform.dmi b/icons/mob/species/plasmaman/uniform.dmi
new file mode 100644
index 00000000000..6667746c438
Binary files /dev/null and b/icons/mob/species/plasmaman/uniform.dmi differ
diff --git a/icons/obj/clothing/species/plasmaman/hats.dmi b/icons/obj/clothing/species/plasmaman/hats.dmi
index fc76e521d55..60282c030fe 100644
Binary files a/icons/obj/clothing/species/plasmaman/hats.dmi and b/icons/obj/clothing/species/plasmaman/hats.dmi differ
diff --git a/icons/obj/clothing/species/plasmaman/suits.dmi b/icons/obj/clothing/species/plasmaman/suits.dmi
deleted file mode 100644
index 78ddd94dedb..00000000000
Binary files a/icons/obj/clothing/species/plasmaman/suits.dmi and /dev/null differ
diff --git a/icons/obj/clothing/species/plasmaman/uniform.dmi b/icons/obj/clothing/species/plasmaman/uniform.dmi
new file mode 100644
index 00000000000..bc3f4d59a50
Binary files /dev/null and b/icons/obj/clothing/species/plasmaman/uniform.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 32bdd67ec05..b5c25d474d1 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/tank.dmi b/icons/obj/tank.dmi
index 72cce42bd79..7496d65027c 100644
Binary files a/icons/obj/tank.dmi and b/icons/obj/tank.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 6e7184a0b37..df6ac49652c 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -353,6 +353,7 @@
#include "code\datums\looping_sounds\weather.dm"
#include "code\datums\outfits\outfit.dm"
#include "code\datums\outfits\outfit_admin.dm"
+#include "code\datums\outfits\plasmamen.dm"
#include "code\datums\outfits\vv_outfit.dm"
#include "code\datums\ruins\lavaland.dm"
#include "code\datums\ruins\space.dm"
@@ -1403,6 +1404,11 @@
#include "code\modules\clothing\under\jobs\engineering.dm"
#include "code\modules\clothing\under\jobs\medsci.dm"
#include "code\modules\clothing\under\jobs\security.dm"
+#include "code\modules\clothing\under\jobs\plasmamen\_plasmamen.dm"
+#include "code\modules\clothing\under\jobs\plasmamen\civilian_service.dm"
+#include "code\modules\clothing\under\jobs\plasmamen\engineering.dm"
+#include "code\modules\clothing\under\jobs\plasmamen\medsci.dm"
+#include "code\modules\clothing\under\jobs\plasmamen\security.dm"
#include "code\modules\countdown\countdown.dm"
#include "code\modules\crafting\craft.dm"
#include "code\modules\crafting\guncrafting.dm"
@@ -1646,23 +1652,30 @@
#include "code\modules\martial_arts\sleeping_carp.dm"
#include "code\modules\martial_arts\wrestleing.dm"
#include "code\modules\mining\abandonedcrates.dm"
-#include "code\modules\mining\coins.dm"
-#include "code\modules\mining\equipment_locker.dm"
-#include "code\modules\mining\explorer_gear.dm"
#include "code\modules\mining\fulton.dm"
#include "code\modules\mining\machine_processing.dm"
+#include "code\modules\mining\machine_redemption.dm"
#include "code\modules\mining\machine_stacking.dm"
#include "code\modules\mining\machine_unloading.dm"
+#include "code\modules\mining\machine_vending.dm"
#include "code\modules\mining\mine_items.dm"
#include "code\modules\mining\minebot.dm"
#include "code\modules\mining\mint.dm"
#include "code\modules\mining\money_bag.dm"
-#include "code\modules\mining\ore.dm"
+#include "code\modules\mining\ores_coins.dm"
#include "code\modules\mining\satchel_ore_boxdm.dm"
#include "code\modules\mining\shelters.dm"
+#include "code\modules\mining\equipment\explorer_gear.dm"
#include "code\modules\mining\equipment\kinetic_crusher.dm"
+#include "code\modules\mining\equipment\lazarus_injector.dm"
#include "code\modules\mining\equipment\marker_beacons.dm"
+#include "code\modules\mining\equipment\mineral_scanner.dm"
+#include "code\modules\mining\equipment\mining_tools.dm"
+#include "code\modules\mining\equipment\regenerative_core.dm"
+#include "code\modules\mining\equipment\resonator.dm"
#include "code\modules\mining\equipment\survival_pod.dm"
+#include "code\modules\mining\equipment\vendor_items.dm"
+#include "code\modules\mining\equipment\wormhole_jaunter.dm"
#include "code\modules\mining\laborcamp\laborshuttle.dm"
#include "code\modules\mining\laborcamp\laborstacker.dm"
#include "code\modules\mining\lavaland\ash_flora.dm"