")
- update_icon()
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/update_icon()
- if(!can_shoot())
- icon_state = "[initial(icon_state)]_empty"
- else
- icon_state = initial(icon_state)
-
/obj/item/weapon/gun/energy/kinetic_accelerator/crossbow
name = "mini energy crossbow"
desc = "A weapon favored by syndicate stealth specialists."
@@ -234,6 +99,9 @@
overheat_time = 20
holds_charge = TRUE
unique_frequency = TRUE
+ can_flashlight = 0
+ max_mod_capacity = 0
+ empty_state = null
/obj/item/weapon/gun/energy/kinetic_accelerator/crossbow/ninja
name = "energy dart thrower"
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 7b0bcda17d0..4a3afd18684 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -52,7 +52,7 @@
var/forcedodge = 0 //to pass through everything
var/dismemberment = 0 //The higher the number, the greater the bonus to dismembering. 0 will not dismember at all.
- var/log = 1 //whether print to admin attack logs or just keep it in the diary
+ var/log_override = FALSE //whether print to admin attack logs or just keep it in the diary
/obj/item/projectile/New()
permutated = list()
@@ -90,7 +90,8 @@
for(var/datum/reagent/R in reagents.reagent_list)
reagent_note += R.id + " ("
reagent_note += num2text(R.volume) + ") "
- add_logs(firer, L, "shot", src, reagent_note, print_attack_log = log)
+ if(!log_override && firer && original)
+ add_logs(firer, L, "shot", src, reagent_note)
return L.apply_effects(stun, weaken, paralyze, irradiate, slur, stutter, eyeblur, drowsy, blocked, stamina, jitter)
/obj/item/projectile/proc/vol_by_damage()
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index 872ee7c3f26..6cddc1c1b91 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -20,7 +20,7 @@
name = "practice laser"
damage = 0
nodamage = 1
- log = 0
+ log_override = TRUE
/obj/item/projectile/beam/scatter
name = "laser pellet"
@@ -75,7 +75,7 @@
damage_type = STAMINA
flag = "laser"
var/suit_types = list(/obj/item/clothing/suit/redtag, /obj/item/clothing/suit/bluetag)
- log = 0
+ log_override = TRUE
/obj/item/projectile/beam/lasertag/on_hit(atom/target, blocked = 0)
. = ..()
diff --git a/code/modules/projectiles/projectile/reusable.dm b/code/modules/projectiles/projectile/reusable.dm
index 17aaad71a2a..cb0ee34ad75 100644
--- a/code/modules/projectiles/projectile/reusable.dm
+++ b/code/modules/projectiles/projectile/reusable.dm
@@ -37,7 +37,7 @@
var/obj/item/weapon/pen/pen = null
edge = 0
embed = 0
- log = 0//it won't log even when there's a pen inside, but since the damage will be so low, I don't think there's any point in making it any more complex
+ log_override = TRUE//it won't log even when there's a pen inside, but since the damage will be so low, I don't think there's any point in making it any more complex
/obj/item/projectile/bullet/reusable/foam_dart/handle_drop()
if(dropped)
@@ -65,4 +65,4 @@
icon_state = "foamdart_riot"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
stamina = 25
- log = 1
+ log_override = FALSE
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index b1cdef1f73c..83a4ec0650c 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -201,62 +201,6 @@
playsound(src, 'sound/effects/snap.ogg', 50, 1)
qdel(src)
-/obj/item/projectile/kinetic
- name = "kinetic force"
- icon_state = null
- damage = 10
- damage_type = BRUTE
- flag = "bomb"
- range = 3
- var/splash = 0
-
-/obj/item/projectile/kinetic/super
- damage = 11
- range = 4
-
-/obj/item/projectile/kinetic/hyper
- damage = 12
- range = 5
- splash = 1
-
-obj/item/projectile/kinetic/New()
- var/turf/proj_turf = get_turf(src)
- if(!istype(proj_turf, /turf))
- return
- var/datum/gas_mixture/environment = proj_turf.return_air()
- var/pressure = environment.return_pressure()
- if(pressure < 50)
- name = "full strength kinetic force"
- damage *= 4
- ..()
-
-/obj/item/projectile/kinetic/on_range()
- new /obj/effect/kinetic_blast(loc)
- ..()
-
-/obj/item/projectile/kinetic/on_hit(atom/target)
- . = ..()
- var/turf/target_turf= get_turf(target)
- if(istype(target_turf, /turf/simulated/mineral))
- var/turf/simulated/mineral/M = target_turf
- M.gets_drilled(firer)
- new /obj/effect/kinetic_blast(target_turf)
- if(splash)
- for(var/turf/T in range(splash, target_turf))
- if(istype(T, /turf/simulated/mineral))
- var/turf/simulated/mineral/M = T
- M.gets_drilled(firer)
-
-/obj/effect/kinetic_blast
- name = "kinetic explosion"
- icon = 'icons/obj/projectiles.dmi'
- icon_state = "kinetic_blast"
- layer = 4.1
-
-/obj/effect/kinetic_blast/New()
- spawn(4)
- qdel(src)
-
/obj/item/projectile/beam/wormhole
name = "bluespace beam"
icon_state = "spark"
diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
index 8685056d9d3..278ec7ad82f 100644
--- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
+++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
@@ -373,10 +373,17 @@
if (O.reagents != null && O.reagents.has_reagent("nutriment"))
beaker.reagents.add_reagent(r_id, min(O.reagents.get_reagent_amount("nutriment"), space))
O.reagents.remove_reagent("nutriment", min(O.reagents.get_reagent_amount("nutriment"), space))
+ if (O.reagents != null && O.reagents.has_reagent("plantmatter"))
+ beaker.reagents.add_reagent(r_id, min(O.reagents.get_reagent_amount("plantmatter"), space))
+ O.reagents.remove_reagent("plantmatter", min(O.reagents.get_reagent_amount("plantmatter"), space))
else
if (O.reagents != null && O.reagents.has_reagent("nutriment"))
beaker.reagents.add_reagent(r_id, min(round(O.reagents.get_reagent_amount("nutriment")*abs(amount)), space))
O.reagents.remove_reagent("nutriment", min(O.reagents.get_reagent_amount("nutriment"), space))
+ if (O.reagents != null && O.reagents.has_reagent("plantmatter"))
+ beaker.reagents.add_reagent(r_id, min(round(O.reagents.get_reagent_amount("plantmatter")*abs(amount)), space))
+ O.reagents.remove_reagent("plantmatter", min(O.reagents.get_reagent_amount("plantmatter"), space))
+
else
O.reagents.trans_id_to(beaker, r_id, min(amount, space))
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index 0f6e202ba07..db77f30e76b 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -1,7 +1,3 @@
-#define SOLID 1
-#define LIQUID 2
-#define GAS 3
-
/datum/reagent
var/name = "Reagent"
var/id = "reagent"
diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm
index 6079bd3392b..b170f6b0867 100644
--- a/code/modules/reagents/reagent_containers/glass_containers.dm
+++ b/code/modules/reagents/reagent_containers/glass_containers.dm
@@ -39,7 +39,8 @@
/obj/machinery/smartfridge/,
/obj/machinery/biogenerator,
/obj/machinery/hydroponics,
- /obj/machinery/constructable_frame)
+ /obj/machinery/constructable_frame,
+ /obj/machinery/icemachine)
/obj/item/weapon/reagent_containers/glass/New()
..()
@@ -62,7 +63,8 @@
update_icon()
/obj/item/weapon/reagent_containers/glass/afterattack(obj/target, mob/user, proximity)
- if(!proximity) return
+ if(!proximity)
+ return
if(!is_open_container())
return
@@ -94,16 +96,16 @@
return
else if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us.
- if(!target.reagents.total_volume && target.reagents)
- to_chat(user, "[target] is empty.")
+ if(target.reagents && !target.reagents.total_volume)
+ to_chat(user, "[target] is empty and can't be refilled!")
return
if(reagents.total_volume >= reagents.maximum_volume)
- to_chat(user, "[src] is full.")
+ to_chat(user, "[src] is full.")
return
- var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this)
- to_chat(user, "You fill [src] with [trans] units of the contents of [target].")
+ var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this)
+ to_chat(user, "You fill [src] with [trans] unit\s of the contents of [target].")
else if(target.is_open_container() && target.reagents) //Something like a glass. Player probably wants to transfer TO it.
if(!reagents.total_volume)
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index 274c3efd623..cc4bf75ea45 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -34,7 +34,7 @@
to_chat(user, "[src] is full.")
return
- var/trans = A.reagents.trans_to(src, A:amount_per_transfer_from_this)
+ var/trans = A.reagents.trans_to(src, 50) //This is a static amount, otherwise, it'll take forever to fill.
to_chat(user, "You fill [src] with [trans] units of the contents of [A].")
return
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 4c2d2caa6b8..f050f6708e7 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -1,5 +1,3 @@
-#define AUTOIGNITION_WELDERFUEL 561.15
-
/obj/structure/reagent_dispensers
name = "Dispenser"
desc = "..."
@@ -9,109 +7,97 @@
anchored = 0
pressure_resistance = 2*ONE_ATMOSPHERE
- var/amount_per_transfer_from_this = 10
- var/possible_transfer_amounts = list(10,25,50,100)
+ var/tank_volume = 1000 //In units, how much the dispenser can hold
+ var/reagent_id = "water" //The ID of the reagent that the dispenser uses
/obj/structure/reagent_dispensers/attackby(obj/item/weapon/W, mob/user, params)
return
/obj/structure/reagent_dispensers/New()
- create_reagents(1000)
- if(!possible_transfer_amounts)
- verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT
+ create_reagents(tank_volume)
+ reagents.add_reagent(reagent_id, tank_volume)
..()
/obj/structure/reagent_dispensers/examine(mob/user)
if(!..(user, 2))
return
- to_chat(user, "It contains:")
- if(reagents && reagents.reagent_list.len)
- for(var/datum/reagent/R in reagents.reagent_list)
- to_chat(user, "[R.volume] units of [R.name]")
+ if(reagents.total_volume)
+ to_chat(user, "It has [reagents.total_volume] units left.")
else
- to_chat(user, "Nothing.")
+ to_chat(user, "It's empty.")
-/obj/structure/reagent_dispensers/verb/set_APTFT() //set amount_per_transfer_from_this
- set name = "Set transfer amount"
- set category = "Object"
- set src in view(1)
- if(usr.stat || !usr.canmove || usr.restrained())
- return
- var/N = input("Amount per transfer from this:","[src]") as null|anything in possible_transfer_amounts
- if(N)
- amount_per_transfer_from_this = N
+
+/obj/structure/reagent_dispensers/proc/boom()
+ visible_message("[src] ruptures!")
+ qdel(src)
/obj/structure/reagent_dispensers/ex_act(severity)
switch(severity)
- if(1.0)
- qdel(src)
- return
- if(2.0)
+ if(1)
+ boom()
+ if(2)
if(prob(50))
- new /obj/effect/effect/water(loc)
- qdel(src)
- return
- if(3.0)
+ boom()
+ if(3)
if(prob(5))
- new /obj/effect/effect/water(loc)
- qdel(src)
- return
- else
- return
+ boom()
/obj/structure/reagent_dispensers/blob_act()
if(prob(50))
- new /obj/effect/effect/water(loc)
- qdel(src)
-
-
-
-
-
+ boom()
//Dispensers
/obj/structure/reagent_dispensers/watertank
- name = "watertank"
- desc = "A watertank"
- icon = 'icons/obj/objects.dmi'
- icon_state = "watertank"
- amount_per_transfer_from_this = 10
+ name = "water tank"
+ desc = "A water tank."
+ icon_state = "water"
-/obj/structure/reagent_dispensers/watertank/New()
+/obj/structure/reagent_dispensers/watertank/boom()
+ playsound(loc, 'sound/effects/spray2.ogg', 50, 1, -6)
+ new /obj/effect/effect/water(loc)
+ for(var/turf/simulated/T in view(5, loc))
+ T.MakeSlippery()
+ for(var/mob/living/L in T)
+ L.adjust_fire_stacks(-20)
..()
- reagents.add_reagent("water",1000)
+
+/obj/structure/reagent_dispensers/watertank/high
+ name = "high-capacity water tank"
+ desc = "A highly-pressurized water tank made to hold gargantuan amounts of water.."
+ icon_state = "water_high" //I was gonna clean my room...
+ tank_volume = 100000
/obj/structure/reagent_dispensers/fueltank
- name = "fueltank"
- desc = "A fueltank"
- icon = 'icons/obj/objects.dmi'
- icon_state = "weldtank"
- amount_per_transfer_from_this = 10
+ name = "fuel tank"
+ desc = "A tank full of industrial welding fuel. Do not consume."
+ icon_state = "fuel"
+ reagent_id = "fuel"
var/obj/item/device/assembly_holder/rig = null
var/accepts_rig = 1
-/obj/structure/reagent_dispensers/fueltank/New()
+/obj/structure/reagent_dispensers/fueltank/Destroy()
+ if(rig)
+ qdel(rig)
+ rig = null
+ return ..()
+
+/obj/structure/reagent_dispensers/fueltank/bullet_act(obj/item/projectile/P)
..()
- reagents.add_reagent("fuel",1000)
+ if(!qdeleted(src)) //wasn't deleted by the projectile's effects.
+ if(!P.nodamage && ((P.damage_type == BURN) || (P.damage_type == BRUTE)))
+ message_admins("[key_name_admin(P.firer)] triggered a fueltank explosion.")
+ log_game("[key_name(P.firer)] triggered a fueltank explosion.")
+ boom()
-/obj/structure/reagent_dispensers/fueltank/bullet_act(obj/item/projectile/Proj)
- ..()
- if(istype(Proj) && !Proj.nodamage && ((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE)))
- message_admins("[key_name_admin(Proj.firer)] triggered a fueltank explosion.")
- log_game("[key_name(Proj.firer)] triggered a fueltank explosion.")
- boom()
+/obj/structure/reagent_dispensers/fueltank/boom()
+ explosion(loc, 0, 1, 5, 7, 10, flame_range = 5)
+ qdel(src)
-/obj/structure/reagent_dispensers/fueltank/proc/boom()
- explosion(loc,0,1,5,7,10, flame_range = 5)
- if(src)
- qdel(src)
-
-/obj/structure/reagent_dispensers/fueltank/blob_act(obj/effect/blob/B)
+/obj/structure/reagent_dispensers/fueltank/blob_act()
boom()
-
/obj/structure/reagent_dispensers/fueltank/ex_act()
boom()
@@ -133,34 +119,53 @@
usr.visible_message("[usr] begins to detach [rig] from [src].", "You begin to detach [rig] from [src].")
if(do_after(usr, 20, target = src))
usr.visible_message("[usr] detaches [rig] from [src].", "You detach [rig] from [src].")
- rig.loc = get_turf(usr)
+ rig.forceMove(get_turf(usr))
rig = null
- overlays = new/list()
+ overlays.Cut()
-/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/weapon/W, mob/user, params)
- if(istype(W,/obj/item/device/assembly_holder) && accepts_rig)
+/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/device/assembly_holder) && accepts_rig)
if(rig)
to_chat(user, "There is another device in the way.")
return ..()
- user.visible_message("[user] begins rigging [W] to [src].", "You begin rigging [W] to [src]")
+ user.visible_message("[user] begins rigging [I] to [src].", "You begin rigging [I] to [src]")
if(do_after(user, 20, target = src))
- user.visible_message("[user] rigs [W] to [src].", "You rig [W] to [src].")
+ user.visible_message("[user] rigs [I] to [src].", "You rig [I] to [src].")
- var/obj/item/device/assembly_holder/H = W
- if(istype(H.a_left,/obj/item/device/assembly/igniter) || istype(H.a_right,/obj/item/device/assembly/igniter))
+ var/obj/item/device/assembly_holder/H = I
+ if(istype(H.a_left, /obj/item/device/assembly/igniter) || istype(H.a_right, /obj/item/device/assembly/igniter))
msg_admin_attack("[key_name_admin(user)] rigged a fueltank for explosion (JMP)")
log_game("[key_name(user)] rigged fueltank a fueltank for explosion at [loc.x], [loc.y], [loc.z]")
- rig = W
+ rig = H
user.drop_item()
- W.loc = src
+ H.forceMove(src)
- var/icon/test = getFlatIcon(W)
- test.Shift(NORTH,1)
- test.Shift(EAST,6)
+ var/icon/test = getFlatIcon(H)
+ test.Shift(NORTH, 1)
+ test.Shift(EAST, 6)
overlays += test
- return ..()
+ if(istype(I, /obj/item/weapon/weldingtool))
+ if(!reagents.has_reagent("fuel"))
+ to_chat(user, "[src] is out of fuel!")
+ return
+ var/obj/item/weapon/weldingtool/W = I
+ if(!W.welding)
+ if(W.reagents.has_reagent("fuel", W.max_fuel))
+ to_chat(user, "Your [W] is already full!")
+ return
+ reagents.trans_to(W, W.max_fuel)
+ user.visible_message("[user] refills \his [W].", "You refill [W].")
+ playsound(src, 'sound/effects/refill.ogg', 50, 1)
+ W.update_icon()
+ else
+ user.visible_message("[user] catastrophically fails at refilling \his [W]!", "That was stupid of you.")
+ message_admins("[key_name_admin(user)] triggered a fueltank explosion.")
+ log_game("[key_name(user)] triggered a fueltank explosion.")
+ boom()
+ else
+ ..()
/obj/structure/reagent_dispensers/fueltank/Move()
..()
@@ -190,76 +195,65 @@
/obj/structure/reagent_dispensers/peppertank
- name = "Pepper Spray Refiller"
- desc = "Refill pepper spray canisters."
- icon = 'icons/obj/objects.dmi'
- icon_state = "peppertank"
+ name = "pepper spray refiller"
+ desc = "Contains condensed capsaicin for use in law \"enforcement.\""
+ icon_state = "pepper"
anchored = 1
density = 0
- amount_per_transfer_from_this = 45
-
-/obj/structure/reagent_dispensers/peppertank/New()
- ..()
- reagents.add_reagent("condensedcapsaicin",1000)
-
+ reagent_id = "condensedcapsaicin"
/obj/structure/reagent_dispensers/water_cooler
- name = "Water-Cooler"
- desc = "A machine that dispenses water to drink"
- amount_per_transfer_from_this = 5
+ name = "liquid cooler"
+ desc = "A machine that dispenses liquid to drink."
icon = 'icons/obj/vending.dmi'
icon_state = "water_cooler"
- possible_transfer_amounts = null
anchored = 1
+ tank_volume = 500
+ var/paper_cups = 25 //Paper cups left from the cooler
-/obj/structure/reagent_dispensers/water_cooler/New()
- ..()
- reagents.add_reagent("water",500)
+/obj/structure/reagent_dispensers/water_cooler/examine(mob/user)
+ if(!..(user, 2))
+ return
+ to_chat(user, "There are [paper_cups ? paper_cups : "no"] paper cups left.")
+/obj/structure/reagent_dispensers/water_cooler/attack_hand(mob/living/user)
+ if(!paper_cups)
+ to_chat(user, "There aren't any cups left!")
+ return
+ user.visible_message("[user] takes a cup from [src].", "You take a paper cup from [src].")
+ var/obj/item/weapon/reagent_containers/food/drinks/sillycup/S = new(get_turf(src))
+ user.put_in_hands(S)
+ paper_cups--
/obj/structure/reagent_dispensers/beerkeg
name = "beer keg"
- desc = "A beer keg"
- icon = 'icons/obj/objects.dmi'
- icon_state = "beertankTEMP"
- amount_per_transfer_from_this = 10
-
-/obj/structure/reagent_dispensers/beerkeg/New()
- ..()
- reagents.add_reagent("beer",1000)
+ desc = "Beer is liquid bread, it's good for you..."
+ icon_state = "beer"
+ reagent_id = "beer"
/obj/structure/reagent_dispensers/beerkeg/blob_act()
- explosion(loc,0,3,5,7,10)
+ explosion(loc, 0, 3, 5, 7, 10)
qdel(src)
/obj/structure/reagent_dispensers/virusfood
- name = "Virus Food Dispenser"
- desc = "A dispenser of virus food."
- icon = 'icons/obj/objects.dmi'
- icon_state = "virusfoodtank"
- amount_per_transfer_from_this = 10
+ name = "virus food dispenser"
+ desc = "A dispenser of low-potency virus mutagenic."
+ icon_state = "virus_food"
anchored = 1
density = 0
-
-/obj/structure/reagent_dispensers/virusfood/New()
- ..()
- reagents.add_reagent("virusfood", 1000)
+ reagent_id = "virusfood"
/obj/structure/reagent_dispensers/spacecleanertank
name = "space cleaner refiller"
desc = "Refills space cleaner bottles."
- icon = 'icons/obj/objects.dmi'
- icon_state = "spacecleanertank"
+ icon_state = "cleaner"
anchored = 1
density = 0
- amount_per_transfer_from_this = 250
-
-/obj/structure/reagent_dispensers/spacecleanertank/New()
- ..()
- reagents.add_reagent("cleaner",5000)
+ tank_volume = 5000
+ reagent_id = "cleaner"
/obj/structure/reagent_dispensers/fueltank/chem
- icon_state = "weldingtank_chem"
+ icon_state = "fuel_chem"
anchored = 1
density = 0
accepts_rig = 0
\ No newline at end of file
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index 2785683e378..3d57f950995 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -50,7 +50,7 @@
dir = newdir
update_move_direction()
-/obj/machinery/conveyor/set_dir(newdir)
+/obj/machinery/conveyor/setDir(newdir)
. = ..()
update_move_direction()
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 53b728f20b2..450b0b8982a 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -130,6 +130,14 @@
materials = list(MAT_METAL = 50, MAT_GLASS = 50)
build_path = /obj/item/weapon/airlock_electronics
category = list("initial", "Electronics")
+
+/datum/design/firelock_board
+ name = "Firelock Electronics"
+ id = "firelock_board"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 50, MAT_GLASS = 50)
+ build_path = /obj/item/weapon/firelock_electronics
+ category = list("initial", "Electronics")
/datum/design/apc_electronics
name="Power Control Module"
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index b3cd74cc320..c1d3c64d6b9 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -62,6 +62,16 @@
build_path = /obj/item/weapon/circuitboard/power_turbine
category = list ("Engineering Machinery")
+/datum/design/quantumpad
+ name = "Machine Board (Quantum Pad Board)"
+ desc = "The circuit board for a quantum telepad."
+ id = "quantumpad"
+ req_tech = list("programming" = 4, "bluespace" = 4, "plasmatech" = 3, "engineering" = 4)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 1000, "sacid" = 20)
+ build_path = /obj/item/weapon/circuitboard/quantumpad
+ category = list ("Teleportation Machinery")
+
/datum/design/telepad
name = "Machine Board (Telepad Board)"
desc = "Allows for the construction of circuit boards used to build a Telepad."
diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm
index 5ea86d2c7a3..779a0809577 100644
--- a/code/modules/research/designs/mechfabricator_designs.dm
+++ b/code/modules/research/designs/mechfabricator_designs.dm
@@ -1038,16 +1038,6 @@
construction_time = 120
category = list("Cyborg Upgrade Modules")
-/datum/design/borg_upgrade_hyperka
- name = "Cyborg Upgrade (Hyper-Kinetic Accelerator)"
- id = "borg_upgrade_hyperka"
- req_tech = list("materials" = 7, "powerstorage" = 5, "engineering" = 5, "magnets" = 5, "combat" = 4)
- build_type = MECHFAB //Reqs same as human Hyper KA
- materials = list(MAT_METAL = 8000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_GOLD = 2000, MAT_DIAMOND = 2000)
- build_path = /obj/item/borg/upgrade/hyperka
- construction_time = 120
- category = list("Cyborg Upgrade Modules")
-
/datum/design/borg_syndicate_module
name = "Cyborg Upgrade (Illegal Modules)"
id = "borg_syndicate_module"
@@ -1110,7 +1100,7 @@
name = "IPC Optical Sensor"
id = "ipc_optics"
build_type = MECHFAB
- build_path = /obj/item/organ/internal/optical_sensor
+ build_path = /obj/item/organ/internal/eyes/optical_sensor
materials = list(MAT_METAL=1000, MAT_GLASS=2500)
construction_time = 200
category = list("Misc")
diff --git a/code/modules/research/designs/mining_designs.dm b/code/modules/research/designs/mining_designs.dm
index 2b7d911f2b1..aa3014e2825 100644
--- a/code/modules/research/designs/mining_designs.dm
+++ b/code/modules/research/designs/mining_designs.dm
@@ -64,26 +64,6 @@
build_path = /obj/item/weapon/pickaxe/drill/jackhammer
category = list("Mining")
-/datum/design/superaccelerator
- name = "Super-Kinetic Accelerator"
- desc = "An upgraded version of the proto-kinetic accelerator, with superior damage, speed and range."
- id = "superaccelerator"
- req_tech = list("materials" = 5, "powerstorage" = 4, "engineering" = 4, "magnets" = 4, "combat" = 3)
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 8000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_URANIUM = 2000)
- build_path = /obj/item/weapon/gun/energy/kinetic_accelerator/super
- category = list("Mining")
-
-/datum/design/hyperaccelerator
- name = "Hyper-Kinetic Accelerator"
- desc = "An upgraded version of the proto-kinetic accelerator, with even more superior damage, speed and range."
- id = "hyperaccelerator"
- req_tech = list("materials" = 6, "powerstorage" = 6, "engineering" = 5, "magnets" = 6, "combat" = 4)
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 8000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_GOLD = 2000, MAT_DIAMOND = 2000)
- build_path = /obj/item/weapon/gun/energy/kinetic_accelerator/hyper
- category = list("Mining")
-
/datum/design/superresonator
name = "Upgraded Resonator"
desc = "An upgraded version of the resonator that allows more fields to be active at once."
@@ -92,4 +72,64 @@
build_type = PROTOLATHE
materials = list(MAT_METAL = 4000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_URANIUM = 2000)
build_path = /obj/item/weapon/resonator/upgraded
- category = list("Mining")
\ No newline at end of file
+ category = list("Mining")
+
+/datum/design/trigger_guard_mod
+ name = "Kinetic Accelerator Trigger Guard Mod"
+ desc = "A device which allows kinetic accelerators to be wielded by any organism."
+ id = "triggermod"
+ req_tech = list("materials" = 5, "powerstorage" = 4, "engineering" = 4, "magnets" = 4, "combat" = 3)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_GOLD = 1500, MAT_URANIUM = 1000)
+ build_path = /obj/item/borg/upgrade/modkit/trigger_guard
+ category = list("Mining")
+
+/datum/design/damage_mod
+ name = "Kinetic Accelerator Damage Mod"
+ desc = "A device which allows kinetic accelerators to deal more damage."
+ id = "damagemod"
+ req_tech = list("materials" = 5, "powerstorage" = 4, "engineering" = 4, "magnets" = 4, "combat" = 3)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_GOLD = 1500, MAT_URANIUM = 1000)
+ build_path = /obj/item/borg/upgrade/modkit/damage
+ category = list("Mining", "Cyborg Upgrade Modules")
+
+/datum/design/cooldown_mod
+ name = "Kinetic Accelerator Cooldown Mod"
+ desc = "A device which decreases the cooldown of a Kinetic Accelerator."
+ id = "cooldownmod"
+ req_tech = list("materials" = 5, "powerstorage" = 4, "engineering" = 4, "magnets" = 4, "combat" = 3)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_GOLD = 1500, MAT_URANIUM = 1000)
+ build_path = /obj/item/borg/upgrade/modkit/cooldown
+ category = list("Mining", "Cyborg Upgrade Modules")
+
+/datum/design/range_mod
+ name = "Kinetic Accelerator Range Mod"
+ desc = "A device which allows kinetic accelerators to fire at a further range."
+ id = "rangemod"
+ req_tech = list("materials" = 5, "powerstorage" = 4, "engineering" = 4, "magnets" = 4, "combat" = 3)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_GOLD = 1500, MAT_URANIUM = 1000)
+ build_path = /obj/item/borg/upgrade/modkit/range
+ category = list("Mining", "Cyborg Upgrade Modules")
+
+/datum/design/superaccelerator
+ name = "Kinetic Accelerator Pressure Mod"
+ desc = "A modification kit which allows Kinetic Accelerators to do more damage while indoors."
+ id = "indoormod"
+ req_tech = list("materials" = 5, "powerstorage" = 4, "engineering" = 4, "magnets" = 4, "combat" = 3)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_URANIUM = 2000)
+ build_path = /obj/item/borg/upgrade/modkit/indoors
+ category = list("Mining", "Cyborg Upgrade Modules")
+
+/datum/design/hyperaccelerator
+ name = "Kinetic Accelerator Mining AoE Mod"
+ desc = "A modification kit for Kinetic Accelerators which causes it to fire AoE blasts that destroy rock."
+ id = "hypermod"
+ req_tech = list("materials" = 7, "powerstorage" = 5, "engineering" = 5, "magnets" = 5, "combat" = 4)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list(MAT_METAL = 8000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_GOLD = 2000, MAT_DIAMOND = 2000)
+ build_path = /obj/item/borg/upgrade/modkit/aoe/turfs
+ category = list("Mining", "Cyborg Upgrade Modules")
\ No newline at end of file
diff --git a/code/modules/research/xenoarchaeology/machinery/coolant.dm b/code/modules/research/xenoarchaeology/machinery/coolant.dm
index f0750f6388e..ffbf02c23bc 100644
--- a/code/modules/research/xenoarchaeology/machinery/coolant.dm
+++ b/code/modules/research/xenoarchaeology/machinery/coolant.dm
@@ -9,43 +9,5 @@
/obj/structure/reagent_dispensers/coolanttank
name = "coolant tank"
desc = "A tank of industrial coolant"
- icon = 'icons/obj/objects.dmi'
icon_state = "coolanttank"
- amount_per_transfer_from_this = 10
-
-/obj/structure/reagent_dispensers/coolanttank/New()
- ..()
- reagents.add_reagent("coolant",1000)
-
-/obj/structure/reagent_dispensers/coolanttank/bullet_act(var/obj/item/projectile/Proj)
- if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet))
- if(!Proj.damage)
- explode()
-
-/obj/structure/reagent_dispensers/coolanttank/blob_act()
- explode()
-
-/obj/structure/reagent_dispensers/coolanttank/ex_act()
- explode()
-
-/obj/structure/reagent_dispensers/coolanttank/proc/explode()
- var/datum/effect/system/harmless_smoke_spread/S = new /datum/effect/system/harmless_smoke_spread
- //S.attach(src)
- S.set_up(5, 0, src.loc)
-
- playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
- spawn(0)
- S.start()
-
- var/datum/gas_mixture/env = src.loc.return_air()
- if(env)
- if(reagents.total_volume > 750)
- env.temperature = 0
- else if(reagents.total_volume > 500)
- env.temperature -= 100
- else
- env.temperature -= 50
-
- sleep(10)
- if(src)
- qdel(src)
+ reagent_id = "coolant"
\ No newline at end of file
diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index f1ad87ddc7c..5f01cf8e890 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -166,12 +166,36 @@
shuttle_master.emergencyLastCallLoc = null
emergency_shuttle_recalled.Announce("The emergency shuttle has been recalled.[shuttle_master.emergencyLastCallLoc ? " Recall signal traced. Results can be viewed on any communications console." : "" ]")
-/*
-/obj/docking_port/mobile/emergency/findTransitDock()
- . = shuttle_master.getDock("emergency_transit")
- if(.) return .
- return ..()
-*/
+/obj/docking_port/mobile/emergency/proc/is_hijacked()
+ for(var/mob/living/player in player_list)
+ if(player.mind)
+ if(player.stat != DEAD)
+ if(issilicon(player)) //Borgs are technically dead anyways
+ continue
+ if(isanimal(player)) //Poly does not own the shuttle
+ continue
+
+ var/special_role = player.mind.special_role
+ if(special_role)
+ if(special_role == SPECIAL_ROLE_TRAITOR) // traitors can hijack the shuttle
+ continue
+
+ if(special_role == SPECIAL_ROLE_CHANGELING) // changelings as well
+ continue
+
+ if(special_role == SPECIAL_ROLE_VAMPIRE || special_role == SPECIAL_ROLE_VAMPIRE_THRALL) // for traitorvamp
+ continue
+
+ if(special_role == SPECIAL_ROLE_NUKEOPS) // so can nukeops, for the hell of it
+ continue
+
+ if(special_role == SPECIAL_ROLE_SYNDICATE_DEATHSQUAD) // and the syndie deathsquad i guess
+ continue
+
+ if(get_area(player) == areaInstance)
+ return FALSE
+
+ return TRUE
/obj/docking_port/mobile/emergency/check()
@@ -232,10 +256,19 @@
//move each escape pod to its corresponding escape dock
for(var/obj/docking_port/mobile/pod/M in shuttle_master.mobile)
M.dock(shuttle_master.getDock("[M.id]_away"))
- //now move the actual emergency shuttle to centcomm
+
for(var/area/shuttle/escape/E in world)
E << 'sound/effects/hyperspace_end.ogg'
- dock(shuttle_master.getDock("emergency_away"))
+
+ // now move the actual emergency shuttle to centcomm
+ // unless the shuttle is "hijacked"
+ var/destination_dock = "emergency_away"
+ if(is_hijacked())
+ destination_dock = "emergency_syndicate"
+ priority_announcement.Announce("Corruption detected in shuttle navigation protocols. Please contact your supervisor.")
+
+ dock_id(destination_dock)
+
mode = SHUTTLE_ENDGAME
timer = 0
open_dock()
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index c6b276cf34c..d48d892a86f 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -489,8 +489,14 @@
// Instead of spending a lot of time trying to work out where to place
// our shuttle, just create it somewhere empty and send it to where
// it should go
- var/obj/docking_port/stationary/D = findRoundstartDock()
- return dock(D)
+ . = dock_id(roundstart_move)
+
+/obj/docking_port/mobile/proc/dock_id(id)
+ var/port = shuttle_master.getDock(id)
+ if(port)
+ . = dock(port)
+ else
+ . = null
/obj/effect/landmark/shuttle_import
name = "Shuttle Import"
diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm
index 1f82f0b0471..daf7214c80b 100644
--- a/code/modules/shuttle/supply.dm
+++ b/code/modules/shuttle/supply.dm
@@ -246,7 +246,10 @@
/obj/machinery/teleport/station,
/obj/machinery/teleport/hub,
/obj/machinery/telepad,
- /obj/machinery/clonepod
+ /obj/machinery/clonepod,
+ /obj/effect/hierophant,
+ /obj/item/device/warp_cube,
+ /obj/machinery/quantumpad
)
if(A)
if(is_type_in_list(A, blacklist))
diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm
index 0d029c8e1ce..16a22ea81f6 100644
--- a/code/modules/surgery/organs/organ.dm
+++ b/code/modules/surgery/organs/organ.dm
@@ -228,10 +228,10 @@ var/list/organ_cache = list()
/obj/item/organ/proc/take_damage(amount, var/silent=0)
if(tough)
return
- if(src.status & ORGAN_ROBOT)
- src.damage = between(0, src.damage + (amount * 0.8), max_damage)
+ if(status & ORGAN_ROBOT)
+ damage = between(0, damage + (amount * 0.8), max_damage)
else
- src.damage = between(0, src.damage + amount, max_damage)
+ damage = between(0, damage + amount, max_damage)
//only show this if the organ is not robotic
if(owner && parent_organ && amount > 0)
@@ -241,18 +241,18 @@ var/list/organ_cache = list()
/obj/item/organ/proc/robotize() //Being used to make robutt hearts, etc
robotic = 2
- src.status &= ~ORGAN_BROKEN
- src.status &= ~ORGAN_BLEEDING
- src.status &= ~ORGAN_SPLINTED
- src.status &= ~ORGAN_CUT_AWAY
- src.status &= ~ORGAN_ATTACHABLE
- src.status &= ~ORGAN_DESTROYED
- src.status |= ORGAN_ROBOT
- src.status |= ORGAN_ASSISTED
+ status &= ~ORGAN_BROKEN
+ status &= ~ORGAN_BLEEDING
+ status &= ~ORGAN_SPLINTED
+ status &= ~ORGAN_CUT_AWAY
+ status &= ~ORGAN_ATTACHABLE
+ status &= ~ORGAN_DESTROYED
+ status |= ORGAN_ROBOT
+ status |= ORGAN_ASSISTED
/obj/item/organ/proc/mechassist() //Used to add things like pacemakers, etc
- robotize()
- src.status &= ~ORGAN_ROBOT
+ robotize(1) //Skip the icon/name setting that occurs in robotize to avoid having to reset the icon file.
+ status &= ~ORGAN_ROBOT
robotic = 1
min_bruised_damage = 15
min_broken_damage = 35
@@ -325,7 +325,7 @@ var/list/organ_cache = list()
affected.internal_organs |= src
if(!target.get_int_organ(src))
target.internal_organs += src
- src.loc = target
+ loc = target
if(robotic)
status |= ORGAN_ROBOT
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index 8a5a6a6b158..8de7cccd2d6 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -201,7 +201,7 @@
/obj/item/organ/internal/heart/prepare_eat()
var/obj/S = ..()
- S.icon_state = "heart-off"
+ S.icon_state = dead_icon
return S
/obj/item/organ/internal/heart/cursed
@@ -343,16 +343,47 @@
parent_organ = "head"
slot = "eyes"
var/list/eye_colour = list(0,0,0)
+ var/list/colourmatrix = null
+ var/list/colourblind_matrix = MATRIX_GREYSCALE //Special colourblindness parameters. By default, it's black-and-white.
+ var/colourblind_darkview = null
+ var/dependent_disabilities = null //Gets set by eye-dependent disabilities such as colourblindness so the eyes can transfer the disability during transplantation.
+ var/dark_view = 2 //Default dark_view for Humans.
+ var/weld_proof = null //If set, the eyes will not take damage during welding. eg. IPC optical sensors do not take damage when they weld things while all other eyes will.
/obj/item/organ/internal/eyes/proc/update_colour()
dna.write_eyes_attributes(src)
-/obj/item/organ/internal/eyes/insert(mob/living/carbon/M, special = 0)
+/obj/item/organ/internal/eyes/proc/get_colourmatrix() //Returns a special colour matrix if the eyes are organic and the mob is colourblind, otherwise it uses the current one.
+ if(!robotic && owner.disabilities & COLOURBLIND)
+ return colourblind_matrix
+ else
+ return colourmatrix
+
+/obj/item/organ/internal/eyes/proc/get_dark_view() //Returns dark_view (if the eyes are organic) for see_invisible handling in species.dm to be autoprocessed by life().
+ if(!robotic && colourblind_darkview && owner.disabilities & COLOURBLIND) //Returns special darkview value if colourblind and it exists, otherwise reuse current.
+ return colourblind_darkview
+ else
+ return dark_view
+
+/obj/item/organ/internal/eyes/insert(mob/living/carbon/human/M, special = 0)
..()
if(istype(M) && eye_colour)
- var/mob/living/carbon/human/H = M
- // Apply our eye colour to the target.
- H.update_body()
+ M.update_body() //Apply our eye colour to the target.
+
+ if(!(M.disabilities & COLOURBLIND) && (dependent_disabilities & COLOURBLIND)) //If the eyes are colourblind and we're not, carry over the gene.
+ dependent_disabilities &= ~COLOURBLIND
+ M.dna.SetSEState(COLOURBLINDBLOCK,1)
+ genemutcheck(M,COLOURBLINDBLOCK,null,MUTCHK_FORCED)
+ else
+ M.update_client_colour() //If we're here, that means the mob acquired the colourblindness gene while they didn't have eyes. Better handle it.
+
+/obj/item/organ/internal/eyes/remove(mob/living/carbon/human/M, special = 0)
+ if(!special && (M.disabilities & COLOURBLIND)) //If special is set, that means these eyes are getting deleted (i.e. during set_species())
+ if(!(dependent_disabilities & COLOURBLIND)) //We only want to change COLOURBLINDBLOCK and such it the eyes are being surgically removed.
+ dependent_disabilities |= COLOURBLIND
+ M.dna.SetSEState(COLOURBLINDBLOCK,0)
+ genemutcheck(M,COLOURBLINDBLOCK,null,MUTCHK_FORCED)
+ . = ..()
/obj/item/organ/internal/eyes/surgeryize()
if(!owner)
@@ -362,6 +393,38 @@
owner.SetEyeBlurry(0)
owner.SetEyeBlind(0)
+/obj/item/organ/internal/robotize(var/icon_bypass) //If icon bypass isn't null, skip the processing here and go straight to the parent call.
+ if(!icon_bypass && !(status & ORGAN_ROBOT)) //Don't override the icons for the already-mechanical IPC organs.
+ var/list/states = icon_states('icons/obj/surgery.dmi') //Insensitive to specially-defined icon files for species like the Drask or whomever else. Everyone gets the same robotic heart.
+ if(slot == "heart" && ("[slot]-prosthetic-on" in states) && ("[slot]-prosthetic-off" in states)) //Give the robotic heart its robotic heart icons if they exist.
+ var/obj/item/organ/internal/heart/H = src
+ H.icon = icon('icons/obj/surgery.dmi')
+ H.icon_base = "[slot]-prosthetic"
+ H.dead_icon = "[slot]-prosthetic-off"
+ H.update_icon()
+ else if("[slot]-prosthetic" in states) //Give the robotic organ its robotic organ icons if they exist.
+ icon = icon('icons/obj/surgery.dmi')
+ icon_state = "[slot]-prosthetic"
+ name = "mechanical [slot]"
+ ..() //Go apply all the organ flags/robotic statuses.
+
+/obj/item/organ/internal/eyes/robotize()
+ colourmatrix = null
+ dark_view = 2
+ ..() //Make sure the organ's got the robotic status indicators before updating the client colour.
+ owner.update_client_colour(0) //Since both mechassisted and mechanical eyes give dark_view of 2 and full colour vision atm, just having this here is fine as mechassist() will call it anyway.
+
+/obj/item/organ/internal/mechassist()
+ ..() //Go back, call robotize(), adjust the robotic status indicators and the organ damage parameters.
+ var/list/states = icon_states(icon) //Sensitive to specially-defined icon files since the organs are not fully synthetic.
+ if(slot == "heart" && ("[organ_tag]-assisted-on" in states) && ("[organ_tag]-assisted-off" in states)) //Give the mechassisted heart its mechassisted heart icons if they exist.
+ var/obj/item/organ/internal/heart/H = src
+ H.icon_base = "[organ_tag]-assisted"
+ H.dead_icon = "[organ_tag]-assisted-off"
+ H.update_icon()
+ else if("[organ_tag]-assisted" in states) //Give the mechassisted organ its mechassisted organ icons if they exist.
+ icon_state = "[organ_tag]-assisted"
+ name = "mechanically assisted [initial(name)]" //Avoid setting the organ's name to something like "mechanically assisted mechanical eyes".
/obj/item/organ/internal/liver
name = "liver"
@@ -372,7 +435,6 @@
var/alcohol_intensity = 1
/obj/item/organ/internal/liver/process()
-
..()
if(!owner)
diff --git a/code/modules/surgery/organs/subtypes/abductor.dm b/code/modules/surgery/organs/subtypes/abductor.dm
new file mode 100644
index 00000000000..6fd234bc501
--- /dev/null
+++ b/code/modules/surgery/organs/subtypes/abductor.dm
@@ -0,0 +1,4 @@
+/obj/item/organ/internal/eyes/abductor
+ name = "abductor eyeballs"
+ dark_view = 3
+ species = "Abductor"
diff --git a/code/modules/surgery/organs/subtypes/diona.dm b/code/modules/surgery/organs/subtypes/diona.dm
index 48ad2fb3cea..c7044f92fb9 100644
--- a/code/modules/surgery/organs/subtypes/diona.dm
+++ b/code/modules/surgery/organs/subtypes/diona.dm
@@ -97,74 +97,42 @@
/obj/item/organ/diona/process()
return
-/obj/item/organ/internal/heart/diona
+/obj/item/organ/internal/heart/diona // Turns into a nymph instantly, no transplanting possible.
name = "neural strata"
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
- organ_tag = "heart" // Turns into a nymph instantly, no transplanting possible.
- origin_tech = "biotech=3"
- parent_organ = "chest"
- slot = "heart"
species = "Diona"
-/obj/item/organ/internal/brain/diona
+/obj/item/organ/internal/brain/diona // Turns into a nymph instantly, no transplanting possible.
name = "gas bladder"
- parent_organ = "head"
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
- organ_tag = "brain" // Turns into a nymph instantly, no transplanting possible.
- origin_tech = "biotech=3"
- slot = "brain"
species = "Diona"
-/obj/item/organ/internal/kidneys/diona
+/obj/item/organ/internal/kidneys/diona // Turns into a nymph instantly, no transplanting possible.
name = "polyp segment"
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
- organ_tag = "kidneys" // Turns into a nymph instantly, no transplanting possible.
- origin_tech = "biotech=3"
- parent_organ = "groin"
- slot = "kidneys"
species = "Diona"
-/obj/item/organ/internal/appendix/diona
+/obj/item/organ/internal/appendix/diona // Turns into a nymph instantly, no transplanting possible.
name = "anchoring ligament"
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
- organ_tag = "appendix" // Turns into a nymph instantly, no transplanting possible.
- origin_tech = "biotech=3"
- parent_organ = "groin"
- slot = "appendix"
species = "Diona"
-/obj/item/organ/internal/diona_receptor
+/obj/item/organ/internal/eyes/diona // Turns into a nymph instantly, no transplanting possible.
name = "receptor node"
- organ_tag = "eyes"
icon = 'icons/mob/alien.dmi'
icon_state = "claw"
- origin_tech = "biotech=3"
- parent_organ = "head"
- slot = "eyes"
species = "Diona"
-/obj/item/organ/internal/diona_receptor/surgeryize()
- if(!owner)
- return
- owner.CureNearsighted()
- owner.CureBlind()
- owner.SetEyeBlurry(0)
- owner.SetEyeBlind(0)
-
-
//TODO:Make absorb rads on insert
-/obj/item/organ/internal/liver/diona
+/obj/item/organ/internal/liver/diona // Turns into a nymph instantly, no transplanting possible.
name = "nutrient vessel"
- parent_organ = "chest"
- organ_tag = "liver"
icon = 'icons/mob/alien.dmi'
icon_state = "claw"
- slot = "liver"
alcohol_intensity = 0.5
species = "Diona"
diff --git a/code/modules/surgery/organs/subtypes/drask.dm b/code/modules/surgery/organs/subtypes/drask.dm
index b3b260a28a0..6e1e6662d0a 100644
--- a/code/modules/surgery/organs/subtypes/drask.dm
+++ b/code/modules/surgery/organs/subtypes/drask.dm
@@ -9,51 +9,29 @@
/obj/item/organ/internal/heart/drask
name = "drask heart"
icon = 'icons/obj/surgery_drask.dmi'
- icon_state = "heart-on"
- dead_icon = "heart-off"
- organ_tag = "heart"
parent_organ = "head"
- slot = "heart"
species = "Drask"
/obj/item/organ/internal/lungs/drask
- name = "lungs"
icon = 'icons/obj/surgery_drask.dmi'
- icon_state = "lungs"
- gender = PLURAL
- organ_tag = "lungs"
- parent_organ = "chest"
- slot = "lungs"
species = "Drask"
/obj/item/organ/internal/liver/drask
name = "metabolic strainer"
icon = 'icons/obj/surgery_drask.dmi'
- icon_state = "kidneys"
- gender = PLURAL
- organ_tag = "kidneys"
- parent_organ = "groin"
- slot = "kidneys"
alcohol_intensity = 0.8
species = "Drask"
/obj/item/organ/internal/brain/drask
- name = "brain"
icon = 'icons/obj/surgery_drask.dmi'
icon_state = "brain2"
- organ_tag = "brain"
- slot = "brain"
mmi_icon = 'icons/obj/surgery_drask.dmi'
mmi_icon_state = "mmi_full"
species = "Drask"
/obj/item/organ/internal/eyes/drask
- name = "eyes"
+ name = "drask eyeballs"
icon = 'icons/obj/surgery_drask.dmi'
- icon_state = "eyes"
- gender = PLURAL
- organ_tag = "eyes"
- parent_organ = "head"
- slot = "eyes"
desc = "Drask eyes. They look even stranger disembodied"
+ dark_view = 5
species = "Drask"
diff --git a/code/modules/surgery/organs/subtypes/grey.dm b/code/modules/surgery/organs/subtypes/grey.dm
index a47ab801d6f..6c06da373b7 100644
--- a/code/modules/surgery/organs/subtypes/grey.dm
+++ b/code/modules/surgery/organs/subtypes/grey.dm
@@ -14,3 +14,8 @@
/obj/item/organ/internal/brain/grey/remove(var/mob/living/carbon/M, var/special = 0)
. = ..()
M.remove_language("Psionic Communication")
+
+/obj/item/organ/internal/eyes/grey
+ name = "grey eyeballs"
+ dark_view = 5
+ species = "Grey"
diff --git a/code/modules/surgery/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm
index 0f402a42e5d..b3bb3f61e07 100644
--- a/code/modules/surgery/organs/subtypes/machine.dm
+++ b/code/modules/surgery/organs/subtypes/machine.dm
@@ -117,37 +117,26 @@
robotize()
..()
-/obj/item/organ/internal/optical_sensor
+/obj/item/organ/internal/eyes/optical_sensor
name = "optical sensor"
- organ_tag = "eyes"
- parent_organ = "head"
icon = 'icons/obj/robot_component.dmi'
icon_state = "camera"
- slot = "eyes"
status = ORGAN_ROBOT
species = "Machine"
// dead_icon = "camera_broken"
+ weld_proof = 1
-/obj/item/organ/internal/optical_sensor/New()
+/obj/item/organ/internal/eyes/optical_sensor/New()
robotize()
..()
-/obj/item/organ/internal/optical_sensor/remove(var/mob/living/user,special = 0)
+/obj/item/organ/internal/eyes/optical_sensor/remove(var/mob/living/user,special = 0)
if(!special)
to_chat(owner, "Error 404:Optical Sensors not found.")
. = ..()
-/obj/item/organ/internal/optical_sensor/surgeryize()
- if(!owner)
- return
- owner.CureNearsighted()
- owner.CureBlind()
- owner.SetEyeBlurry(0)
- owner.SetEyeBlind(0)
-
-
// Used for an MMI or posibrain being installed into a human.
/obj/item/organ/internal/brain/mmi_holder
name = "brain"
@@ -160,7 +149,6 @@
species = "Machine"
var/obj/item/device/mmi/stored_mmi
-
/obj/item/organ/internal/brain/mmi_holder/Destroy()
if(stored_mmi)
qdel(stored_mmi)
diff --git a/code/modules/surgery/organs/subtypes/nucleation.dm b/code/modules/surgery/organs/subtypes/nucleation.dm
index d234b666ae3..4223834501d 100644
--- a/code/modules/surgery/organs/subtypes/nucleation.dm
+++ b/code/modules/surgery/organs/subtypes/nucleation.dm
@@ -26,8 +26,6 @@
icon_state = "crystal-eyes"
organ_tag = "luminescent eyes"
light_color = "#1C1C00"
- parent_organ = "head"
- slot = "eyes"
species = "Nucleation"
/obj/item/organ/internal/eyes/luminescent_crystal/New()
@@ -35,8 +33,7 @@
..()
/obj/item/organ/internal/brain/crystal
- name = "crystalized brain"
+ name = "crystallized brain"
icon_state = "crystal-brain"
- organ_tag = "crystalized brain"
- slot = "brain"
+ organ_tag = "crystallized brain"
species = "Nucleation"
diff --git a/code/modules/surgery/organs/subtypes/shadow.dm b/code/modules/surgery/organs/subtypes/shadow.dm
new file mode 100644
index 00000000000..f81fc54bfb1
--- /dev/null
+++ b/code/modules/surgery/organs/subtypes/shadow.dm
@@ -0,0 +1,4 @@
+/obj/item/organ/internal/eyes/shadow
+ name = "dark orbs"
+ dark_view = 8
+ species = "Shadow"
diff --git a/code/modules/surgery/organs/subtypes/tajaran.dm b/code/modules/surgery/organs/subtypes/tajaran.dm
index e37686a05ca..746abd6e601 100644
--- a/code/modules/surgery/organs/subtypes/tajaran.dm
+++ b/code/modules/surgery/organs/subtypes/tajaran.dm
@@ -1,3 +1,16 @@
/obj/item/organ/internal/liver/tajaran
alcohol_intensity = 1.4
species = "Tajaran"
+
+/obj/item/organ/internal/eyes/tajaran /*Most Tajara see in full colour as a result of genetic augmentation, although it cost them their darksight (darksight = 2)
+ unless they choose otherwise by selecting the colourblind disability in character creation (darksight = 8 but colourblind).*/
+ name = "tajaran eyeballs"
+ species = "Tajaran"
+ colourblind_matrix = MATRIX_TAJ_CBLIND //The colour matrix and darksight parameters that the mob will recieve when they get the disability.
+ colourblind_darkview = 8
+
+/obj/item/organ/internal/eyes/tajaran/farwa //Being the lesser form of Tajara, Farwas have an utterly incurable version of their colourblindness.
+ name = "farwa eyeballs"
+ species = "Farwa"
+ colourmatrix = MATRIX_TAJ_CBLIND
+ dark_view = 8
diff --git a/code/modules/surgery/organs/subtypes/unathi.dm b/code/modules/surgery/organs/subtypes/unathi.dm
index a769bce7a02..0fb45319ce5 100644
--- a/code/modules/surgery/organs/subtypes/unathi.dm
+++ b/code/modules/surgery/organs/subtypes/unathi.dm
@@ -1,3 +1,8 @@
/obj/item/organ/internal/liver/unathi
alcohol_intensity = 0.8
species = "Unathi"
+
+/obj/item/organ/internal/eyes/unathi
+ name = "unathi eyeballs"
+ dark_view = 3
+ species = "Unathi"
diff --git a/code/modules/surgery/organs/subtypes/vulpkanin.dm b/code/modules/surgery/organs/subtypes/vulpkanin.dm
index ca47ac83ddd..af3d9deab09 100644
--- a/code/modules/surgery/organs/subtypes/vulpkanin.dm
+++ b/code/modules/surgery/organs/subtypes/vulpkanin.dm
@@ -1,3 +1,16 @@
/obj/item/organ/internal/liver/vulpkanin
alcohol_intensity = 1.4
species = "Vulpkanin"
+
+/obj/item/organ/internal/eyes/vulpkanin /*Most Vulpkanin see in full colour as a result of genetic augmentation, although it cost them their darksight (darksight = 2)
+ unless they choose otherwise by selecting the colourblind disability in character creation (darksight = 8 but colourblind).*/
+ name = "vulpkanin eyeballs"
+ species = "Vulpkanin"
+ colourblind_matrix = MATRIX_VULP_CBLIND //The colour matrix and darksight parameters that the mob will recieve when they get the disability.
+ colourblind_darkview = 8
+
+/obj/item/organ/internal/eyes/vulpkanin/wolpin //Being the lesser form of Vulpkanin, Wolpins have an utterly incurable version of their colourblindness.
+ name = "wolpin eyeballs"
+ species = "Wolpin"
+ colourmatrix = MATRIX_VULP_CBLIND
+ dark_view = 8
diff --git a/code/modules/surgery/organs/subtypes/wryn.dm b/code/modules/surgery/organs/subtypes/wryn.dm
index f51adb6054e..ee1a12fd1ab 100644
--- a/code/modules/surgery/organs/subtypes/wryn.dm
+++ b/code/modules/surgery/organs/subtypes/wryn.dm
@@ -7,3 +7,7 @@
parent_organ = "head"
slot = "hivenode"
species = "Wryn"
+
+/obj/item/organ/internal/eyes/wryn
+ dark_view = 3
+ species = "Wryn"
diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm
index f86cf41bcd0..73416045624 100644
--- a/code/modules/surgery/organs_internal.dm
+++ b/code/modules/surgery/organs_internal.dm
@@ -182,7 +182,7 @@
H.custom_pain("The pain in your [affected.name] is living hell!", 1)
else if(istype(tool, /obj/item/weapon/reagent_containers/food/snacks/organ))
- to_chat(user, "[tool] was biten by someone! It's too damaged to use!")
+ to_chat(user, "[tool] was bitten by someone! It's too damaged to use!")
return -1
..()
@@ -244,6 +244,8 @@
thing.forceMove(get_turf(target))
else
user.put_in_hands(thing)
+
+ target.update_icons()
else
user.visible_message("[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!",
"You can't extract anything from [target]'s [parse_zone(target_zone)]!")
diff --git a/html/changelog.html b/html/changelog.html
index 981a7ab0588..93108539e6c 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,12 +55,96 @@
-->
+
11 February 2017
+
Markolie updated:
+
+ - Ports over the remaining Lavaland loot items from /tg/ (most developed by KorPhaeron).
+ - Refactors the kinetic accelerator to use modkits instead of subtypes: these unique mods (such as more range or shorter cooldown) can be purchased from the mining vendor or built by R&D or robotics (developed by KorPhaeron).
+
+
+
10 February 2017
+
Fox McCloud updated:
+
+ - Fixes not being able to bloodcrawl in most sources of blood
+ - Fixes slaughter demon whisper not working at all
+ - Drying rack drying now properly uses NanoUI instead of a right-click verb
+ - Fixes produce appearing stuck in a drying rack when it was empty
+ - Fixes a few failed icon updates with the drying rack
+
+
KasparoVy, Krausus updated:
+
+ - Adds the colourblindness gene. It is eye-dependent, and can be transferred from person-to-person with the eye organ.
+ - Colourblindness can be detected by the advanced medical scanner just like blindness and short-sightedness.
+ - Vulpkanin and Tajara can now choose to be uniquely colourblind in exchange for fantastic darksight. The default option is colour vision but low darksight.
+ - Selecting mechanical or mechanically assisted eyes at character creation grants full colour vision, but standard Human darksight. This overrides the colour vision preference.
+ - Mechanical(ly assisted) internal organs such as hearts and eyes are now appropriately named, and have appropriate sprites.
+ - Vulpkanin and Tajara monkey-forms (Wolpins and Farwas) are incurably colourblind but have excellent darksight as they get nearly the same organs as their greater forms.
+ - Increases reliability of turning into a monkey.
+ - Fixes a bug with changelings lesser-forming, transforming and humanforming into a different identity.
+
+
Markolie updated:
+
+ - Firelocks can now be constructed and deconstructed.
+ - Firelocks no longer show a confirmation message when being opened.
+ - Various map fixes (vents, scrubbers, firelocks and intercoms). Also removes the firelocks covering the windows in escape/cargo.
+
+
tigercat2000 updated:
+
+ - Ported Goonstation slash /vg/ lighting. Pretty.
+
+
uraniummeltdown updated:
+
+ - Quantum Pads are now buildable in R&D!
+ - Quantum Pads, once built, can be linked to other Quantum Pads using a multitool. Using a Pad which has been linked will teleport everything on the sending pad to the linked pad!
+ - Pads do not need to be linked in pairs: Pad A can lead to Pad B which can lead to pad C.
+ - Upgrading a Quantum Pad will reduce the cooldown, charge-up time, and power consumption.
+ - Quantum Pads require a bluespace crystal, a micro manipulator, a capacitor and a cable piece.
+ - Events now scale better with population.
+ - Enabled immovable rod, slaughter demon and morph events.
+
+
+
08 February 2017
+
Fox McCloud updated:
+
+ - Grinding wheat and other products produces the proper reagents again
+
+
07 February 2017
+
Fox MCCloud updated:
+
+ - Tank transfer valves have in-hand icons
+ - Tank transfer valves with large tanks (ie: jetpacks) cannot fit in backpacks
+
+
Fox McCloud updated:
+
+ - fixes xeno eggs taking damgae from disablers
+ - adjusts most botany plant reagents to have "plantmatter" as opposed to nutriment
+ - Blumpkins now have plasma in them
+ - Fixes plant grown diona not being allied with plants and vines
+ - Water coolers now dispense cups when clicking on them with a free hand
+ - reagent tank dispensing amount based on the container instead of the tank
+ - Fixes beaker spilling when placing a beaker into an ice cream machine
+ - Adds in 100,000 unit water tanks to cargo for 12 points
+ - regular water tank cost reduced from 8 to 6 points
+ - Monkey cubes in boxes no longer start off wrapped
+ - All monkey cube boxes at cargo are the same price
+ - Fixes Nymphs not being able to cross over top of hydroponics trays
+ - Diona fertilizing and weed eating is handled by clicking on the tray as a nymph rather than verbs
+
+
KasparoVy updated:
+
+ - Storage implants are now checked for steal objective items.
+
+
Kyep updated:
+
+ - AI holograms now transfer between holopads as the AI moves around.
+
uraniummeltdown updated:
- Engineering and Science crates now have new sprites
- Changelings can recall the memories of an absorb victim
- Changelings will recall some speech of their absorb victims
+ - You can now create floor tiles from minerals. Be careful around plasma and uranium floors though.
06 February 2017
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 6fecebe4855..b27e7bece5a 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -3549,7 +3549,87 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscadd: Added Vox rad suit, bombsuit hood, paramedic EVA suit sprites from /vg/
- tweak: You can click AI displays as an AI to change them
2017-02-07:
+ Fox MCCloud:
+ - tweak: Tank transfer valves have in-hand icons
+ - tweak: 'Tank transfer valves with large tanks (ie: jetpacks) cannot fit in backpacks'
+ Fox McCloud:
+ - bugfix: fixes xeno eggs taking damgae from disablers
+ - tweak: adjusts most botany plant reagents to have "plantmatter" as opposed to
+ nutriment
+ - tweak: Blumpkins now have plasma in them
+ - bugfix: Fixes plant grown diona not being allied with plants and vines
+ - rscadd: Water coolers now dispense cups when clicking on them with a free hand
+ - tweak: reagent tank dispensing amount based on the container instead of the tank
+ - bugfix: Fixes beaker spilling when placing a beaker into an ice cream machine
+ - rscadd: Adds in 100,000 unit water tanks to cargo for 12 points
+ - tweak: regular water tank cost reduced from 8 to 6 points
+ - tweak: Monkey cubes in boxes no longer start off wrapped
+ - tweak: All monkey cube boxes at cargo are the same price
+ - bugfix: Fixes Nymphs not being able to cross over top of hydroponics trays
+ - tweak: Diona fertilizing and weed eating is handled by clicking on the tray as
+ a nymph rather than verbs
+ KasparoVy:
+ - rscadd: Storage implants are now checked for steal objective items.
+ Kyep:
+ - tweak: AI holograms now transfer between holopads as the AI moves around.
uraniummeltdown:
- rscadd: Engineering and Science crates now have new sprites
- bugfix: Changelings can recall the memories of an absorb victim
- rscadd: Changelings will recall some speech of their absorb victims
+ - rscadd: You can now create floor tiles from minerals. Be careful around plasma
+ and uranium floors though.
+2017-02-08:
+ Fox McCloud:
+ - bugfix: Grinding wheat and other products produces the proper reagents again
+2017-02-10:
+ Fox McCloud:
+ - bugfix: Fixes not being able to bloodcrawl in most sources of blood
+ - bugfix: Fixes slaughter demon whisper not working at all
+ - tweak: Drying rack drying now properly uses NanoUI instead of a right-click verb
+ - bugfix: Fixes produce appearing stuck in a drying rack when it was empty
+ - bugfix: Fixes a few failed icon updates with the drying rack
+ KasparoVy, Krausus:
+ - rscadd: Adds the colourblindness gene. It is eye-dependent, and can be transferred
+ from person-to-person with the eye organ.
+ - rscadd: Colourblindness can be detected by the advanced medical scanner just like
+ blindness and short-sightedness.
+ - rscadd: Vulpkanin and Tajara can now choose to be uniquely colourblind in exchange
+ for fantastic darksight. The default option is colour vision but low darksight.
+ - rscadd: Selecting mechanical or mechanically assisted eyes at character creation
+ grants full colour vision, but standard Human darksight. This overrides the
+ colour vision preference.
+ - rscadd: Mechanical(ly assisted) internal organs such as hearts and eyes are now
+ appropriately named, and have appropriate sprites.
+ - tweak: Vulpkanin and Tajara monkey-forms (Wolpins and Farwas) are incurably colourblind
+ but have excellent darksight as they get nearly the same organs as their greater
+ forms.
+ - bugfix: Increases reliability of turning into a monkey.
+ - bugfix: Fixes a bug with changelings lesser-forming, transforming and humanforming
+ into a different identity.
+ Markolie:
+ - rscadd: Firelocks can now be constructed and deconstructed.
+ - tweak: Firelocks no longer show a confirmation message when being opened.
+ - tweak: Various map fixes (vents, scrubbers, firelocks and intercoms). Also removes
+ the firelocks covering the windows in escape/cargo.
+ tigercat2000:
+ - rscadd: Ported Goonstation slash /vg/ lighting. Pretty.
+ uraniummeltdown:
+ - rscadd: Quantum Pads are now buildable in R&D!
+ - rscadd: Quantum Pads, once built, can be linked to other Quantum Pads using a
+ multitool. Using a Pad which has been linked will teleport everything on the
+ sending pad to the linked pad!
+ - rscadd: 'Pads do not need to be linked in pairs: Pad A can lead to Pad B which
+ can lead to pad C.'
+ - rscadd: Upgrading a Quantum Pad will reduce the cooldown, charge-up time, and
+ power consumption.
+ - rscadd: Quantum Pads require a bluespace crystal, a micro manipulator, a capacitor
+ and a cable piece.
+ - tweak: Events now scale better with population.
+ - tweak: Enabled immovable rod, slaughter demon and morph events.
+2017-02-11:
+ Markolie:
+ - rscadd: Ports over the remaining Lavaland loot items from /tg/ (most developed
+ by KorPhaeron).
+ - rscadd: 'Refactors the kinetic accelerator to use modkits instead of subtypes:
+ these unique mods (such as more range or shorter cooldown) can be purchased
+ from the mining vendor or built by R&D or robotics (developed by KorPhaeron).'
diff --git a/icons/effects/96x96.dmi b/icons/effects/96x96.dmi
index 01729aa70af..9111297a266 100644
Binary files a/icons/effects/96x96.dmi and b/icons/effects/96x96.dmi differ
diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi
index 8f402733260..ec06922a07d 100644
Binary files a/icons/effects/beam.dmi and b/icons/effects/beam.dmi differ
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 93a175f3efc..a7962c37ec1 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/effects/lighting_overlay.dmi b/icons/effects/lighting_overlay.dmi
deleted file mode 100644
index a5bee534b3d..00000000000
Binary files a/icons/effects/lighting_overlay.dmi and /dev/null differ
diff --git a/icons/effects/lighting_overlay.png b/icons/effects/lighting_overlay.png
new file mode 100644
index 00000000000..b317268b702
Binary files /dev/null and b/icons/effects/lighting_overlay.png differ
diff --git a/icons/mob/clothing/paranormal_hardsuit.dmi b/icons/mob/clothing/paranormal_hardsuit.dmi
new file mode 100644
index 00000000000..f06e81ab1e7
Binary files /dev/null and b/icons/mob/clothing/paranormal_hardsuit.dmi differ
diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi
index f74ebda9d34..97966c61dac 100644
Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index 3a6701fab2d..cecb8427e84 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index 634e23d2f8f..fe42152fb5f 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index e6b8d4ca621..d56a42ca099 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi
index 938d810a612..fd2947d7d69 100644
Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 24585cbdccc..f12fcf3d86c 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index a72971f450d..b98c786872a 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/doors/Doorfire.dmi b/icons/obj/doors/Doorfire.dmi
index 6686844372a..1f3999b774e 100644
Binary files a/icons/obj/doors/Doorfire.dmi and b/icons/obj/doors/Doorfire.dmi differ
diff --git a/icons/obj/guns/magic.dmi b/icons/obj/guns/magic.dmi
index 05c8aa7794f..b057d644918 100644
Binary files a/icons/obj/guns/magic.dmi and b/icons/obj/guns/magic.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index 65ac4ba2e40..1e8b80b314e 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi
index b0a35a3f35b..06afc67979c 100644
Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index ea68e3dbdbd..c02603ecd25 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index a5638d1db1b..2f055a0c491 100644
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/icons/obj/telescience.dmi b/icons/obj/telescience.dmi
index b692f566df1..dfc41198913 100644
Binary files a/icons/obj/telescience.dmi and b/icons/obj/telescience.dmi differ
diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi
new file mode 100644
index 00000000000..3de478d728d
Binary files /dev/null and b/icons/obj/tiles.dmi differ
diff --git a/icons/obj/vehicles.dmi b/icons/obj/vehicles.dmi
index 63515f5b2e5..2f528c44c77 100644
Binary files a/icons/obj/vehicles.dmi and b/icons/obj/vehicles.dmi differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index 1688122b563..66bd1893196 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ
diff --git a/nano/templates/adv_med.tmpl b/nano/templates/adv_med.tmpl
index 51b74a12fda..e88db47456a 100644
--- a/nano/templates/adv_med.tmpl
+++ b/nano/templates/adv_med.tmpl
@@ -52,10 +52,13 @@ Used In File(s): \code\game\machinery\adv_med.dm
Large growth detected in frontal lobe, possibly cancerous. Surgical removal is recommended.
{{/if}}
{{if data.occupant.blind}}
-
Pupils unresponsive.
+
Cataracts detected.
+ {{/if}}
+ {{if data.occupant.colourblind}}
+
Photoreceptor abnormalities detected.
{{/if}}
{{if data.occupant.nearsighted}}
-
Retinal misalignment detected
+
Retinal misalignment detected.
{{/if}}
diff --git a/nano/templates/smartfridge.tmpl b/nano/templates/smartfridge.tmpl
index 873487454dc..3c59892486d 100644
--- a/nano/templates/smartfridge.tmpl
+++ b/nano/templates/smartfridge.tmpl
@@ -10,6 +10,16 @@
{{/if}}
+
+ {{if data.can_dry}}
+
+ Drying:
+
+
+ {{:helper.link('On', 'power-off', {'dryingOn' : 1}, data.drying ? 'selected' : null)}}{{:helper.link('Off', 'close', {'dryingOff' : 1}, data.drying ? null : 'selected')}}
+
+ {{/if}}
+
{{if data.contents}}
{{for data.contents}}
diff --git a/paradise.dme b/paradise.dme
index 5ee09165223..b0a4b161f68 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -29,8 +29,10 @@
#include "code\__DEFINES\genetics.dm"
#include "code\__DEFINES\hud.dm"
#include "code\__DEFINES\hydroponics.dm"
+#include "code\__DEFINES\inventory.dm"
#include "code\__DEFINES\is_helpers.dm"
#include "code\__DEFINES\language.dm"
+#include "code\__DEFINES\layers.dm"
#include "code\__DEFINES\lighting.dm"
#include "code\__DEFINES\machines.dm"
#include "code\__DEFINES\math.dm"
@@ -40,6 +42,7 @@
#include "code\__DEFINES\preferences.dm"
#include "code\__DEFINES\process_scheduler.dm"
#include "code\__DEFINES\qdel.dm"
+#include "code\__DEFINES\reagents.dm"
#include "code\__DEFINES\role_preferences.dm"
#include "code\__DEFINES\rolebans.dm"
#include "code\__DEFINES\sight.dm"
@@ -87,7 +90,6 @@
#include "code\_globalvars\lists\names.dm"
#include "code\_globalvars\lists\objects.dm"
#include "code\_globalvars\lists\reagents.dm"
-#include "code\_onclick\_defines.dm"
#include "code\_onclick\adjacent.dm"
#include "code\_onclick\ai.dm"
#include "code\_onclick\click.dm"
@@ -398,7 +400,6 @@
#include "code\game\gamemodes\changeling\powers\hivemind.dm"
#include "code\game\gamemodes\changeling\powers\humanform.dm"
#include "code\game\gamemodes\changeling\powers\lesserform.dm"
-#include "code\game\gamemodes\changeling\powers\linglink.dm"
#include "code\game\gamemodes\changeling\powers\mimic_voice.dm"
#include "code\game\gamemodes\changeling\powers\mutations.dm"
#include "code\game\gamemodes\changeling\powers\panacea.dm"
@@ -526,6 +527,7 @@
#include "code\game\machinery\portable_tag_turret.dm"
#include "code\game\machinery\portable_turret.dm"
#include "code\game\machinery\programmable_unloader.dm"
+#include "code\game\machinery\quantum_pad.dm"
#include "code\game\machinery\recharger.dm"
#include "code\game\machinery\rechargestation.dm"
#include "code\game\machinery\recycler.dm"
@@ -1414,12 +1416,14 @@
#include "code\modules\library\computers\checkout.dm"
#include "code\modules\library\computers\public.dm"
#include "code\modules\lighting\__lighting_docs.dm"
-#include "code\modules\lighting\light_source.dm"
+#include "code\modules\lighting\lighting_area.dm"
#include "code\modules\lighting\lighting_atom.dm"
+#include "code\modules\lighting\lighting_corner.dm"
#include "code\modules\lighting\lighting_overlay.dm"
-#include "code\modules\lighting\lighting_process.dm"
-#include "code\modules\lighting\lighting_system.dm"
+#include "code\modules\lighting\lighting_setup.dm"
+#include "code\modules\lighting\lighting_source.dm"
#include "code\modules\lighting\lighting_turf.dm"
+#include "code\modules\lighting\~lighting_undefs.dm"
#include "code\modules\logic\converter.dm"
#include "code\modules\logic\dual_input.dm"
#include "code\modules\logic\logic_base.dm"
@@ -1451,8 +1455,13 @@
#include "code\modules\mining\laborcamp\laborshuttle.dm"
#include "code\modules\mining\laborcamp\laborstacker.dm"
#include "code\modules\mining\lavaland\ash_flora.dm"
-#include "code\modules\mining\lavaland\colossus_loot.dm"
#include "code\modules\mining\lavaland\necropolis_chests.dm"
+#include "code\modules\mining\lavaland\loot\ashdragon_loot.dm"
+#include "code\modules\mining\lavaland\loot\bubblegum_loot.dm"
+#include "code\modules\mining\lavaland\loot\colossus_loot.dm"
+#include "code\modules\mining\lavaland\loot\hierophant_loot.dm"
+#include "code\modules\mining\lavaland\loot\legion_loot.dm"
+#include "code\modules\mining\lavaland\loot\tendril_loot.dm"
#include "code\modules\mob\abilities.dm"
#include "code\modules\mob\death.dm"
#include "code\modules\mob\emote.dm"
@@ -1856,6 +1865,7 @@
#include "code\modules\projectiles\guns\rocket.dm"
#include "code\modules\projectiles\guns\syringe_gun.dm"
#include "code\modules\projectiles\guns\throw.dm"
+#include "code\modules\projectiles\guns\energy\kinetic_accelerator.dm"
#include "code\modules\projectiles\guns\energy\laser.dm"
#include "code\modules\projectiles\guns\energy\nuclear.dm"
#include "code\modules\projectiles\guns\energy\pulse.dm"
@@ -2096,6 +2106,7 @@
#include "code\modules\surgery\organs\skeleton.dm"
#include "code\modules\surgery\organs\vocal_cords.dm"
#include "code\modules\surgery\organs\wound.dm"
+#include "code\modules\surgery\organs\subtypes\abductor.dm"
#include "code\modules\surgery\organs\subtypes\diona.dm"
#include "code\modules\surgery\organs\subtypes\drask.dm"
#include "code\modules\surgery\organs\subtypes\grey.dm"
@@ -2103,6 +2114,7 @@
#include "code\modules\surgery\organs\subtypes\machine.dm"
#include "code\modules\surgery\organs\subtypes\misc.dm"
#include "code\modules\surgery\organs\subtypes\nucleation.dm"
+#include "code\modules\surgery\organs\subtypes\shadow.dm"
#include "code\modules\surgery\organs\subtypes\skrell.dm"
#include "code\modules\surgery\organs\subtypes\standard.dm"
#include "code\modules\surgery\organs\subtypes\tajaran.dm"