diff --git a/ATTRIBUTIONS.md b/ATTRIBUTIONS.md
index 3e5639a521..abaf97a0b9 100644
--- a/ATTRIBUTIONS.md
+++ b/ATTRIBUTIONS.md
@@ -80,3 +80,9 @@
**Creator:** VerySoft (https://github.com/TS-Rogue-Star/Rogue-Star/pull/435)
**URL:** [Website](https://rogue-star.net/)
**License:** Permission granting in writing for use by Virgo and Chomp with proper attribution
+
+**File:** `icons/mob/turkey.dmi`
+**Title:** Turkey
+**Creator:** VerySoft (https://github.com/TS-Rogue-Star/Rogue-Star/pull/669)
+**URL:** [Website](https://rogue-star.net/)
+**License:** Permission granted in writing for use by Virgo and Chomp with proper attribution
diff --git a/code/ATMOSPHERICS/components/unary/heat_exchanger.dm b/code/ATMOSPHERICS/components/unary/heat_exchanger.dm
index 7b6a5621eb..078c97af8a 100644
--- a/code/ATMOSPHERICS/components/unary/heat_exchanger.dm
+++ b/code/ATMOSPHERICS/components/unary/heat_exchanger.dm
@@ -36,11 +36,11 @@
if(!partner)
return 0
- if(!air_master || air_master.current_cycle <= update_cycle)
+ if(!SSair || SSair.current_cycle <= update_cycle)
return 0
- update_cycle = air_master.current_cycle
- partner.update_cycle = air_master.current_cycle
+ update_cycle = SSair.current_cycle
+ partner.update_cycle = SSair.current_cycle
var/air_heat_capacity = air_contents.heat_capacity()
var/other_air_heat_capacity = partner.air_contents.heat_capacity()
diff --git a/code/ZAS/Atom.dm b/code/ZAS/Atom.dm
index bfe6fa2ad4..eeb01b4249 100644
--- a/code/ZAS/Atom.dm
+++ b/code/ZAS/Atom.dm
@@ -36,11 +36,11 @@
//Convenience function for atoms to update turfs they occupy
/atom/movable/proc/update_nearby_tiles(need_rebuild)
- if(!air_master)
+ if(!SSair)
return 0
for(var/turf/simulated/turf in locs)
- air_master.mark_for_update(turf)
+ SSair.mark_for_update(turf)
return 1
diff --git a/code/ZAS/Connection.dm b/code/ZAS/Connection.dm
index 21be29d25e..688eb12992 100644
--- a/code/ZAS/Connection.dm
+++ b/code/ZAS/Connection.dm
@@ -5,7 +5,7 @@
/*
Overview:
- Connections are made between turfs by air_master.connect(). They represent a single point where two zones converge.
+ Connections are made between turfs by SSair.connect(). They represent a single point where two zones converge.
Class Vars:
A - Always a simulated turf.
@@ -60,19 +60,19 @@ Class Procs:
/connection/New(turf/simulated/A, turf/simulated/B)
#ifdef ZASDBG
- ASSERT(air_master.has_valid_zone(A))
- //ASSERT(air_master.has_valid_zone(B))
+ ASSERT(HAS_VALID_ZONE(A))
+ //ASSERT(HAS_VALID_ZONE(B))
#endif
src.A = A
src.B = B
zoneA = A.zone
if(!istype(B))
mark_space()
- edge = air_master.get_edge(A.zone,B)
+ edge = SSair.get_edge(A.zone,B)
edge.add_connection(src)
else
zoneB = B.zone
- edge = air_master.get_edge(A.zone,B.zone)
+ edge = SSair.get_edge(A.zone,B.zone)
edge.add_connection(src)
/connection/proc/mark_direct()
@@ -108,7 +108,7 @@ Class Procs:
erase()
return
- var/block_status = air_master.air_blocked(A,B)
+ var/block_status = SSair.air_blocked(A,B)
if(block_status & AIR_BLOCKED)
//to_world("Blocked connection.")
erase()
@@ -133,7 +133,7 @@ Class Procs:
return
else
edge.remove_connection(src)
- edge = air_master.get_edge(A.zone, B)
+ edge = SSair.get_edge(A.zone, B)
edge.add_connection(src)
zoneA = A.zone
@@ -155,7 +155,7 @@ Class Procs:
//to_world("Zones changed, \...")
if(A.zone && B.zone)
edge.remove_connection(src)
- edge = air_master.get_edge(A.zone, B.zone)
+ edge = SSair.get_edge(A.zone, B.zone)
edge.add_connection(src)
zoneA = A.zone
zoneB = B.zone
diff --git a/code/ZAS/ConnectionGroup.dm b/code/ZAS/ConnectionGroup.dm
index 0be44bb358..85b2545d36 100644
--- a/code/ZAS/ConnectionGroup.dm
+++ b/code/ZAS/ConnectionGroup.dm
@@ -2,7 +2,7 @@
Overview:
These are what handle gas transfers between zones and into space.
- They are found in a zone's edges list and in air_master.edges.
+ They are found in a zone's edges list and in SSair.edges.
Each edge updates every air tick due to their role in gas transfer.
They come in two flavors, /connection_edge/zone and /connection_edge/unsimulated.
As the type names might suggest, they handle inter-zone and spacelike connections respectively.
@@ -82,7 +82,7 @@ Class Procs:
/connection_edge/proc/contains_zone(zone/Z)
/connection_edge/proc/erase()
- air_master.remove_edge(src)
+ SSair.remove_edge(src)
//to_world("[type] Erased.")
/connection_edge/proc/tick()
@@ -169,19 +169,19 @@ Class Procs:
if(equiv)
if(direct)
erase()
- air_master.merge(A, B)
+ SSair.merge(A, B)
return
else
A.air.equalize(B.air)
- air_master.mark_edge_sleeping(src)
+ SSair.mark_edge_sleeping(src)
- air_master.mark_zone_update(A)
- air_master.mark_zone_update(B)
+ SSair.mark_zone_update(A)
+ SSair.mark_zone_update(B)
/connection_edge/zone/recheck()
// Edges with only one side being vacuum need processing no matter how close.
if(!A.air.compare(B.air, vacuum_exception = 1))
- air_master.mark_edge_active(src)
+ SSair.mark_edge_active(src)
//Helper proc to get connections for a zone.
/connection_edge/zone/proc/get_connected_zone(zone/from)
@@ -233,16 +233,16 @@ Class Procs:
if(equiv)
A.air.copy_from(air)
- air_master.mark_edge_sleeping(src)
+ SSair.mark_edge_sleeping(src)
- air_master.mark_zone_update(A)
+ SSair.mark_zone_update(A)
/connection_edge/unsimulated/recheck()
// Edges with only one side being vacuum need processing no matter how close.
// Note: This handles the glaring flaw of a room holding pressure while exposed to space, but
// does not specially handle the less common case of a simulated room exposed to an unsimulated pressurized turf.
if(!A.air.compare(air, vacuum_exception = 1))
- air_master.mark_edge_active(src)
+ SSair.mark_edge_active(src)
/proc/ShareHeat(datum/gas_mixture/A, datum/gas_mixture/B, connecting_tiles)
//This implements a simplistic version of the Stefan-Boltzmann law.
diff --git a/code/ZAS/ConnectionManager.dm b/code/ZAS/ConnectionManager.dm
index 3890cd85f5..8d7e270cde 100644
--- a/code/ZAS/ConnectionManager.dm
+++ b/code/ZAS/ConnectionManager.dm
@@ -16,7 +16,7 @@ Class Procs:
Preferable to accessing the connection directly because it checks validity.
place(connection/c, d)
- Called by air_master.connect(). Sets the connection in the specified direction to c.
+ Called by SSair.connect(). Sets the connection in the specified direction to c.
update_all()
Called after turf/update_air_properties(). Updates the validity of all connections on this turf.
diff --git a/code/ZAS/Controller.dm b/code/ZAS/Controller.dm
deleted file mode 100644
index 7f7b575246..0000000000
--- a/code/ZAS/Controller.dm
+++ /dev/null
@@ -1,231 +0,0 @@
-var/datum/controller/subsystem/air/air_master
-
-var/tick_multiplier = 2
-
-/*
-
-Overview:
- The air controller does everything. There are tons of procs in here.
-
-Class Vars:
- zones - All zones currently holding one or more turfs.
- edges - All processing edges.
-
- tiles_to_update - Tiles scheduled to update next tick.
- zones_to_update - Zones which have had their air changed and need air archival.
- active_hotspots - All processing fire objects.
-
- active_zones - The number of zones which were archived last tick. Used in debug verbs.
- next_id - The next UID to be applied to a zone. Mostly useful for debugging purposes as zones do not need UIDs to function.
-
-Class Procs:
-
- mark_for_update(turf/T)
- Adds the turf to the update list. When updated, update_air_properties() will be called.
- When stuff changes that might affect airflow, call this. It's basically the only thing you need.
-
- add_zone(zone/Z) and remove_zone(zone/Z)
- Adds zones to the zones list. Does not mark them for update.
-
- air_blocked(turf/A, turf/B)
- Returns a bitflag consisting of:
- AIR_BLOCKED - The connection between turfs is physically blocked. No air can pass.
- ZONE_BLOCKED - There is a door between the turfs, so zones cannot cross. Air may or may not be permeable.
-
- has_valid_zone(turf/T)
- Checks the presence and validity of T's zone.
- May be called on unsimulated turfs, returning 0.
-
- merge(zone/A, zone/B)
- Called when zones have a direct connection and equivalent pressure and temperature.
- Merges the zones to create a single zone.
-
- connect(turf/simulated/A, turf/B)
- Called by turf/update_air_properties(). The first argument must be simulated.
- Creates a connection between A and B.
-
- mark_zone_update(zone/Z)
- Adds zone to the update list. Unlike mark_for_update(), this one is called automatically whenever
- air is returned from a simulated turf.
-
- equivalent_pressure(zone/A, zone/B)
- Currently identical to A.air.compare(B.air). Returns 1 when directly connected zones are ready to be merged.
-
- get_edge(zone/A, zone/B)
- get_edge(zone/A, turf/B)
- Gets a valid connection_edge between A and B, creating a new one if necessary.
-
- has_same_air(turf/A, turf/B)
- Used to determine if an unsimulated edge represents a specific turf.
- Simulated edges use connection_edge/contains_zone() for the same purpose.
- Returns 1 if A has identical gases and temperature to B.
-
- remove_edge(connection_edge/edge)
- Called when an edge is erased. Removes it from processing.
-
-*/
-
-//
-// The rest of the air subsystem is defined in air.dm
-//
-
-/datum/controller/subsystem/air
- //Geometry lists
- var/list/zones = list()
- var/list/edges = list()
- //Geometry updates lists
- var/list/tiles_to_update = list()
- var/list/zones_to_update = list()
- var/list/active_fire_zones = list()
- var/list/active_hotspots = list()
- var/list/active_edges = list()
-
- var/active_zones = 0
- var/current_cycle = 0
- var/next_id = 1 //Used to keep track of zone UIDs.
-
-/datum/controller/subsystem/air/proc/add_zone(zone/z)
- zones.Add(z)
- z.name = "Zone [next_id++]"
- mark_zone_update(z)
-
-/datum/controller/subsystem/air/proc/remove_zone(zone/z)
- zones.Remove(z)
- zones_to_update.Remove(z)
-
-/datum/controller/subsystem/air/proc/air_blocked(turf/A, turf/B)
- #ifdef ZASDBG
- ASSERT(isturf(A))
- ASSERT(isturf(B))
- #endif
- var/ablock = A.c_airblock(B)
- if(ablock == BLOCKED) return BLOCKED
- return ablock | B.c_airblock(A)
-
-/datum/controller/subsystem/air/proc/has_valid_zone(turf/simulated/T)
- #ifdef ZASDBG
- ASSERT(istype(T))
- #endif
- return istype(T) && T.zone && !T.zone.invalid
-
-/datum/controller/subsystem/air/proc/merge(zone/A, zone/B)
- #ifdef ZASDBG
- ASSERT(istype(A))
- ASSERT(istype(B))
- ASSERT(!A.invalid)
- ASSERT(!B.invalid)
- ASSERT(A != B)
- #endif
- if(A.contents.len < B.contents.len)
- A.c_merge(B)
- mark_zone_update(B)
- else
- B.c_merge(A)
- mark_zone_update(A)
-
-/datum/controller/subsystem/air/proc/connect(turf/simulated/A, turf/simulated/B)
- #ifdef ZASDBG
- ASSERT(istype(A))
- ASSERT(isturf(B))
- ASSERT(A.zone)
- ASSERT(!A.zone.invalid)
- //ASSERT(B.zone)
- ASSERT(A != B)
- #endif
-
- var/block = air_master.air_blocked(A,B)
- if(block & AIR_BLOCKED) return
-
- var/direct = !(block & ZONE_BLOCKED)
- var/space = !istype(B)
-
- if(!space)
- if(min(A.zone.contents.len, B.zone.contents.len) < ZONE_MIN_SIZE || (direct && (equivalent_pressure(A.zone,B.zone) || current_cycle == 0)))
- merge(A.zone,B.zone)
- return
-
- var/a_to_b = get_dir(A,B)
- var/b_to_a = get_dir(B,A)
-
- if(!A.connections) A.connections = new
- if(!B.connections) B.connections = new
-
- if(A.connections.get(a_to_b)) return
- if(B.connections.get(b_to_a)) return
- if(!space)
- if(A.zone == B.zone) return
-
-
- var/connection/c = new /connection(A,B)
-
- A.connections.place(c, a_to_b)
- B.connections.place(c, b_to_a)
-
- if(direct) c.mark_direct()
-
-/datum/controller/subsystem/air/proc/mark_for_update(turf/T)
- #ifdef ZASDBG
- ASSERT(isturf(T))
- #endif
- if(T.needs_air_update) return
- tiles_to_update |= T
- #ifdef ZASDBG
- T.add_overlay(mark)
- #endif
- T.needs_air_update = 1
-
-/datum/controller/subsystem/air/proc/mark_zone_update(zone/Z)
- #ifdef ZASDBG
- ASSERT(istype(Z))
- #endif
- if(Z.needs_update) return
- zones_to_update.Add(Z)
- Z.needs_update = 1
-
-/datum/controller/subsystem/air/proc/mark_edge_sleeping(connection_edge/E)
- #ifdef ZASDBG
- ASSERT(istype(E))
- #endif
- if(E.sleeping) return
- active_edges.Remove(E)
- E.sleeping = 1
-
-/datum/controller/subsystem/air/proc/mark_edge_active(connection_edge/E)
- #ifdef ZASDBG
- ASSERT(istype(E))
- #endif
- if(!E.sleeping) return
- active_edges.Add(E)
- E.sleeping = 0
-
-/datum/controller/subsystem/air/proc/equivalent_pressure(zone/A, zone/B)
- return A.air.compare(B.air)
-
-/datum/controller/subsystem/air/proc/get_edge(zone/A, zone/B)
-
- if(istype(B))
- for(var/connection_edge/zone/edge in A.edges)
- if(edge.contains_zone(B)) return edge
- var/connection_edge/edge = new/connection_edge/zone(A,B)
- edges.Add(edge)
- edge.recheck()
- return edge
- else
- for(var/connection_edge/unsimulated/edge in A.edges)
- if(has_same_air(edge.B,B)) return edge
- var/connection_edge/edge = new/connection_edge/unsimulated(A,B)
- edges.Add(edge)
- edge.recheck()
- return edge
-
-/datum/controller/subsystem/air/proc/has_same_air(turf/A, turf/B)
- if(A.oxygen != B.oxygen) return 0
- if(A.nitrogen != B.nitrogen) return 0
- if(A.phoron != B.phoron) return 0
- if(A.carbon_dioxide != B.carbon_dioxide) return 0
- if(A.temperature != B.temperature) return 0
- return 1
-
-/datum/controller/subsystem/air/proc/remove_edge(connection_edge/E)
- edges.Remove(E)
- if(!E.sleeping) active_edges.Remove(E)
diff --git a/code/ZAS/Diagnostic.dm b/code/ZAS/Diagnostic.dm
index 7126588a30..15fcd89347 100644
--- a/code/ZAS/Diagnostic.dm
+++ b/code/ZAS/Diagnostic.dm
@@ -8,12 +8,12 @@
/*
if(!check_rights(R_DEBUG)) return
- var/result = air_master.Tick()
+ var/result = SSair.Tick()
if(result)
to_chat(src, "Successfully Processed.")
else
- to_chat(src, "Failed to process! ([air_master.tick_progress])")
+ to_chat(src, "Failed to process! ([SSair.tick_progress])")
*/
/client/proc/Zone_Info(turf/T as null|turf)
diff --git a/code/ZAS/Fire.dm b/code/ZAS/Fire.dm
index 46871cc785..9cbf665f83 100644
--- a/code/ZAS/Fire.dm
+++ b/code/ZAS/Fire.dm
@@ -58,7 +58,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin
fuel_objs.Cut()
if(!fire_tiles.len)
- air_master.active_fire_zones.Remove(src)
+ SSair.active_fire_zones.Remove(src)
/zone/proc/remove_liquidfuel(var/used_liquid_fuel, var/remove_fire=0)
if(!fuel_objs.len)
@@ -94,7 +94,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin
return 1
fire = new(src, fl)
- air_master.active_fire_zones |= zone
+ SSair.active_fire_zones |= zone
var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in src
zone.fire_tiles |= src
@@ -191,7 +191,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin
set_light(3, 1, color)
firelevel = fl
- air_master.active_hotspots.Add(src)
+ SSair.active_hotspots.Add(src)
/obj/fire/proc/fire_color(var/env_temperature)
var/temperature = max(4000*sqrt(firelevel/vsc.fire_firelevel_multiplier), env_temperature)
@@ -209,7 +209,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin
T.fire = null
loc = null
- air_master.active_hotspots.Remove(src)
+ SSair.active_hotspots.Remove(src)
/turf/simulated/var/fire_protection = 0 //Protects newly extinguished tiles from being overrun again.
diff --git a/code/ZAS/Turf.dm b/code/ZAS/Turf.dm
index c05e708036..a67970c63a 100644
--- a/code/ZAS/Turf.dm
+++ b/code/ZAS/Turf.dm
@@ -41,9 +41,8 @@
if(istype(unsim, /turf/simulated))
var/turf/simulated/sim = unsim
- if(air_master.has_valid_zone(sim))
-
- air_master.connect(sim, src)
+ if(HAS_VALID_ZONE(sim))
+ SSair.connect(sim, src)
/*
Simple heuristic for determining if removing the turf from it's zone will not partition the zone (A very bad thing).
@@ -162,7 +161,7 @@
var/turf/simulated/sim = unsim
sim.open_directions |= reverse_dir[d]
- if(air_master.has_valid_zone(sim))
+ if(HAS_VALID_ZONE(sim))
//Might have assigned a zone, since this happens for each direction.
if(!zone)
@@ -195,7 +194,7 @@
if(verbose) to_world("Connecting to [sim.zone]")
#endif
- air_master.connect(src, sim)
+ SSair.connect(src, sim)
#ifdef ZASDBG
@@ -210,7 +209,7 @@
if(!postponed) postponed = list()
postponed.Add(unsim)
- if(!air_master.has_valid_zone(src)) //Still no zone, make a new one.
+ if(!HAS_VALID_ZONE(src)) //Still no zone, make a new one.
var/zone/newzone = new/zone()
newzone.add(src)
@@ -223,7 +222,7 @@
//At this point, a zone should have happened. If it hasn't, don't add more checks, fix the bug.
for(var/turf/T in postponed)
- air_master.connect(src, T)
+ SSair.connect(src, T)
/turf/proc/post_update_air_properties()
if(connections) connections.update_all()
@@ -279,7 +278,7 @@
/turf/simulated/return_air()
if(zone)
if(!zone.invalid)
- air_master.mark_zone_update(zone)
+ SSair.mark_zone_update(zone)
return zone.air
else
if(!air)
diff --git a/code/ZAS/Zone.dm b/code/ZAS/Zone.dm
index d07a280d04..b6d012afe7 100644
--- a/code/ZAS/Zone.dm
+++ b/code/ZAS/Zone.dm
@@ -56,7 +56,7 @@ Class Procs:
/zone/var/list/graphic_remove = list()
/zone/New()
- air_master.add_zone(src)
+ SSair.add_zone(src)
air.temperature = TCMB
air.group_multiplier = 1
air.volume = CELL_VOLUME
@@ -65,7 +65,7 @@ Class Procs:
#ifdef ZASDBG
ASSERT(!invalid)
ASSERT(istype(T))
- ASSERT(!air_master.has_valid_zone(T))
+ ASSERT(!HAS_VALID_ZONE(T))
#endif
var/datum/gas_mixture/turf_air = T.return_air()
@@ -75,7 +75,7 @@ Class Procs:
if(T.fire)
var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in T
fire_tiles.Add(T)
- air_master.active_fire_zones |= src
+ SSair.active_fire_zones |= src
if(fuel) fuel_objs += fuel
if(air.graphic)
T.update_graphic(air.graphic)
@@ -122,11 +122,11 @@ Class Procs:
if(E.contains_zone(into))
continue //don't need to rebuild this edge
for(var/turf/T in E.connecting_turfs)
- air_master.mark_for_update(T)
+ SSair.mark_for_update(T)
/zone/proc/c_invalidate()
invalid = 1
- air_master.remove_zone(src)
+ SSair.remove_zone(src)
#ifdef ZASDBG
for(var/turf/simulated/T in contents)
T.dbg(invalid_zone)
@@ -141,7 +141,7 @@ Class Procs:
T.update_graphic(graphic_remove = air_graphic) //we need to remove the overlays so they're not doubled when the zone is rebuilt
//T.dbg(invalid_zone)
T.needs_air_update = 0 //Reset the marker so that it will be added to the list.
- air_master.mark_for_update(T)
+ SSair.mark_for_update(T)
/zone/proc/add_tile_air(datum/gas_mixture/tile_air)
//air.volume += CELL_VOLUME
@@ -152,7 +152,7 @@ Class Procs:
air.group_multiplier = contents.len+1
/zone/proc/tick()
- if(air.temperature >= PHORON_FLASHPOINT && !(src in air_master.active_fire_zones) && air.check_combustability() && contents.len)
+ if(air.temperature >= PHORON_FLASHPOINT && !(src in SSair.active_fire_zones) && air.check_combustability() && contents.len)
var/turf/T = pick(contents)
if(istype(T))
T.create_fire(vsc.fire_firelevel_multiplier)
@@ -171,7 +171,7 @@ Class Procs:
to_chat(M,name)
for(var/g in air.gas)
to_chat(M, "[gas_data.name[g]]: [air.gas[g]]")
- to_chat(M, "P: [air.return_pressure()] kPa V: [air.volume]L T: [air.temperature]°K ([air.temperature - T0C]°C)")
+ to_chat(M, "P: [air.return_pressure()] kPa V: [air.volume]L T: [air.temperature]�K ([air.temperature - T0C]�C)")
to_chat(M, "O2 per N2: [(air.gas["nitrogen"] ? air.gas["oxygen"]/air.gas["nitrogen"] : "N/A")] Moles: [air.total_moles]")
to_chat(M, "Simulated: [contents.len] ([air.group_multiplier])")
//to_chat(M, "Unsimulated: [unsimulated_contents.len]")
@@ -192,4 +192,4 @@ Class Procs:
to_chat(M, "Space Edges: [space_edges] ([space_coefficient] connections)")
//for(var/turf/T in unsimulated_contents)
- // to_chat(M, "[T] at ([T.x],[T.y])")
\ No newline at end of file
+ // to_chat(M, "[T] at ([T.x],[T.y])")
diff --git a/code/ZAS/_docs.dm b/code/ZAS/_docs.dm
index 382f1f0abb..822c8ac7b2 100644
--- a/code/ZAS/_docs.dm
+++ b/code/ZAS/_docs.dm
@@ -15,7 +15,7 @@ Every air tick:
Important Functions:
-air_master.mark_for_update(turf)
+SSair.mark_for_update(turf)
When stuff happens, call this. It works on everything. You basically don't need to worry about any other
functions besides CanPass().
diff --git a/code/__defines/ZAS.dm b/code/__defines/ZAS.dm
index ba2b4b73e7..c8289fdc27 100644
--- a/code/__defines/ZAS.dm
+++ b/code/__defines/ZAS.dm
@@ -11,3 +11,5 @@
#define ATMOS_PASS_NO 2 // Never blocks air or zones.
#define ATMOS_PASS_DENSITY 3 // Blocks air and zones if density = TRUE, allows both if density = FALSE
#define ATMOS_PASS_PROC 4 // Call CanZASPass() using c_airblock
+
+#define HAS_VALID_ZONE(T) (T.zone && !T.zone.invalid)
diff --git a/code/__defines/chemistry.dm b/code/__defines/chemistry.dm
index 63ea0e136f..8213aa200f 100644
--- a/code/__defines/chemistry.dm
+++ b/code/__defines/chemistry.dm
@@ -41,6 +41,7 @@
#define CE_DARKSIGHT "darksight" // Gives perfect vision in dark
#define REAGENTS_PER_SHEET 20
+#define REAGENTS_PER_ORE 20
// Attached to CE_ANTIBIOTIC
#define ANTIBIO_NORM 1
diff --git a/code/__defines/faction.dm b/code/__defines/faction.dm
index 2d975b6cbb..766c2d51aa 100644
--- a/code/__defines/faction.dm
+++ b/code/__defines/faction.dm
@@ -105,6 +105,7 @@
#define FACTION_SWARMER "swarmer"
#define FACTION_TEPPI "teppi"
#define FACTION_TUNNELCLOWN "tunnelclown"
+#define FACTION_TURKEY "turkey"
#define FACTION_WILD_ANIMAL "wild animal"
#define FACTION_WOLFGIRL "wolfgirl"
#define FACTION_WOLFTAUR "wolftaur"
diff --git a/code/__defines/items_clothing.dm b/code/__defines/items_clothing.dm
index a7dba8be88..2a0b2ce9de 100644
--- a/code/__defines/items_clothing.dm
+++ b/code/__defines/items_clothing.dm
@@ -40,6 +40,9 @@
#define ACCESSORY_SLOT_ARMOR_M 0x8000
#define ACCESSORY_SLOT_HELM_C 0x10000 //24 bit - higher than 0x80000 will overflow
+#define ACCESSORY_SLOT_RING 0x20000 //rings, knuckledusters
+#define ACCESSORY_SLOT_WRIST 0x40000 //wristwatches, wrist PDA maybe?
+
// Bitmasks for the /obj/item/var/flags_inv variable. These determine when a piece of clothing hides another, i.e. a helmet hiding glasses.
// WARNING: The following flags apply only to the external suit!
#define HIDEGLOVES 0x1
diff --git a/code/__defines/jobs.dm b/code/__defines/jobs.dm
index c20f5e3cd9..70e38c6876 100644
--- a/code/__defines/jobs.dm
+++ b/code/__defines/jobs.dm
@@ -201,6 +201,7 @@
#define JOB_ALT_CONSTRUCTION_ENGINEER "Construction Engineer"
#define JOB_ALT_ENGINEERING_CONTRACTOR "Engineering Contractor"
#define JOB_ALT_COMPUTER_TECHNICIAN "Computer Technician"
+ #define JOB_ALT_SALVAGE_TECHNICIAN "Salvage Technician"
#define JOB_ATMOSPHERIC_TECHNICIAN "Atmospheric Technician"
// Atmospheric Technician alt titles
diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm
index 1f76dcac9a..80d66f555d 100644
--- a/code/_helpers/game.dm
+++ b/code/_helpers/game.dm
@@ -172,7 +172,7 @@
if(ismob(I))
if(!sight_check || isInSight(I, O))
- L |= recursive_content_check(I, L, recursion_limit - 1, client_check, sight_check, include_mobs, include_objects)
+ L |= recursive_content_check(I, L, recursion_limit - 1, client_check, sight_check, include_mobs, include_objects, ignore_show_messages)
if(include_mobs)
if(client_check)
var/mob/M = I
@@ -185,7 +185,7 @@
var/obj/check_obj = I
if(ignore_show_messages || check_obj.show_messages)
if(!sight_check || isInSight(I, O))
- L |= recursive_content_check(I, L, recursion_limit - 1, client_check, sight_check, include_mobs, include_objects)
+ L |= recursive_content_check(I, L, recursion_limit - 1, client_check, sight_check, include_mobs, include_objects, ignore_show_messages)
if(include_objects)
L |= I
diff --git a/code/_helpers/text.dm b/code/_helpers/text.dm
index 520b98d39a..725335f267 100644
--- a/code/_helpers/text.dm
+++ b/code/_helpers/text.dm
@@ -343,16 +343,17 @@
//The icon var could be local in the proc, but it's a waste of resources
// to always create it and then throw it out.
/var/icon/text_tag_icons = 'icons/chattags.dmi'
-/var/list/text_tag_cache = list()
+GLOBAL_LIST_EMPTY(text_tag_cache)
+
/proc/create_text_tag(var/tagname, var/tagdesc = tagname, var/client/C = null)
if(!(C && C.prefs?.read_preference(/datum/preference/toggle/chat_tags)))
return tagdesc
- if(!text_tag_cache[tagname])
- var/icon/tag = icon(text_tag_icons, tagname)
- text_tag_cache[tagname] = tag
+ if(!GLOB.text_tag_cache[tagname])
+ var/datum/asset/spritesheet/chatassets = get_asset_datum(/datum/asset/spritesheet/chat)
+ GLOB.text_tag_cache[tagname] = chatassets.icon_tag(tagname)
if(!C.tgui_panel.is_ready() || C.tgui_panel.oldchat)
return ""
- return icon2html(text_tag_cache[tagname], C, extra_classes = "text_tag")
+ return GLOB.text_tag_cache[tagname]
/proc/create_text_tag_old(var/tagname, var/tagdesc = tagname, var/client/C = null)
if(!(C && C.prefs?.read_preference(/datum/preference/toggle/chat_tags)))
@@ -620,3 +621,8 @@
return json_decode(data)
catch
return null
+
+/// Removes all non-alphanumerics from the text, keep in mind this can lead to id conflicts
+/proc/sanitize_css_class_name(name)
+ var/static/regex/regex = new(@"[^a-zA-Z0-9]","g")
+ return replacetext(name, regex, "")
diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm
index d852798dab..8b5c5d0325 100644
--- a/code/_helpers/unsorted.dm
+++ b/code/_helpers/unsorted.dm
@@ -974,7 +974,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
if(toupdate.len)
for(var/turf/simulated/T1 in toupdate)
- air_master.mark_for_update(T1)
+ SSair.mark_for_update(T1)
return copiedobjs
diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm
index 857ce225f6..2955d9d721 100644
--- a/code/controllers/master_controller.dm
+++ b/code/controllers/master_controller.dm
@@ -11,8 +11,6 @@ var/global/datum/controller/game_controller/master_controller //Set in world.New
var/global/controller_iteration = 0
var/global/last_tick_duration = 0
-var/global/pipe_processing_killed = 0
-
/datum/controller/game_controller
var/list/shuttle_list // For debugging and VV
diff --git a/code/controllers/subsystems/air.dm b/code/controllers/subsystems/air.dm
index 1e5f1506ec..e008086d04 100644
--- a/code/controllers/subsystems/air.dm
+++ b/code/controllers/subsystems/air.dm
@@ -1,3 +1,60 @@
+/*
+Overview:
+ SSair does everything. There are tons of procs in here.
+
+Class Vars:
+ zones - All zones currently holding one or more turfs.
+ edges - All processing edges.
+
+ tiles_to_update - Tiles scheduled to update next tick.
+ zones_to_update - Zones which have had their air changed and need air archival.
+ active_hotspots - All processing fire objects.
+
+ active_zones - The number of zones which were archived last tick. Used in debug verbs.
+ next_id - The next UID to be applied to a zone. Mostly useful for debugging purposes as zones do not need UIDs to function.
+
+Class Procs:
+
+ mark_for_update(turf/T)
+ Adds the turf to the update list. When updated, update_air_properties() will be called.
+ When stuff changes that might affect airflow, call this. It's basically the only thing you need.
+
+ add_zone(zone/Z) and remove_zone(zone/Z)
+ Adds zones to the zones list. Does not mark them for update.
+
+ air_blocked(turf/A, turf/B)
+ Returns a bitflag consisting of:
+ AIR_BLOCKED - The connection between turfs is physically blocked. No air can pass.
+ ZONE_BLOCKED - There is a door between the turfs, so zones cannot cross. Air may or may not be permeable.
+
+ merge(zone/A, zone/B)
+ Called when zones have a direct connection and equivalent pressure and temperature.
+ Merges the zones to create a single zone.
+
+ connect(turf/simulated/A, turf/B)
+ Called by turf/update_air_properties(). The first argument must be simulated.
+ Creates a connection between A and B.
+
+ mark_zone_update(zone/Z)
+ Adds zone to the update list. Unlike mark_for_update(), this one is called automatically whenever
+ air is returned from a simulated turf.
+
+ equivalent_pressure(zone/A, zone/B)
+ Currently identical to A.air.compare(B.air). Returns 1 when directly connected zones are ready to be merged.
+
+ get_edge(zone/A, zone/B)
+ get_edge(zone/A, turf/B)
+ Gets a valid connection_edge between A and B, creating a new one if necessary.
+
+ has_same_air(turf/A, turf/B)
+ Used to determine if an unsimulated edge represents a specific turf.
+ Simulated edges use connection_edge/contains_zone() for the same purpose.
+ Returns 1 if A has identical gases and temperature to B.
+
+ remove_edge(connection_edge/edge)
+ Called when an edge is erased. Removes it from processing.
+*/
+
// Air update stages
#define SSAIR_TURFS 1
#define SSAIR_EDGES 2
@@ -30,8 +87,19 @@ SUBSYSTEM_DEF(air)
// This is used to tell CI WHERE the edges are.
var/list/startup_active_edge_log = list()
-/datum/controller/subsystem/air/PreInit()
- air_master = src
+ //Geometry lists
+ var/list/zones = list()
+ var/list/edges = list()
+ //Geometry updates lists
+ var/list/tiles_to_update = list()
+ var/list/zones_to_update = list()
+ var/list/active_fire_zones = list()
+ var/list/active_hotspots = list()
+ var/list/active_edges = list()
+
+ var/active_zones = 0
+ var/current_cycle = 0
+ var/next_id = 1 //Used to keep track of zone UIDs.
/datum/controller/subsystem/air/Initialize(timeofday)
report_progress("Processing Geometry...")
@@ -109,7 +177,7 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun
log_and_message_admins("SSair: Was told to start a new run, but the previous run wasn't finished! currentrun.len=[currentrun.len], current_step=[current_step]")
resumed = TRUE
else
- current_cycle++ // Begin a new air_master cycle!
+ current_cycle++ // Begin a new SSair cycle!
current_step = SSAIR_TURFS // Start with Step 1 of course
INTERNAL_PROCESS_STEP(SSAIR_TURFS, TRUE, process_tiles_to_update, cost_turfs, SSAIR_EDGES)
@@ -118,7 +186,7 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun
INTERNAL_PROCESS_STEP(SSAIR_HOTSPOTS, FALSE, process_active_hotspots, cost_hotspots, SSAIR_ZONES)
INTERNAL_PROCESS_STEP(SSAIR_ZONES, FALSE, process_zones_to_update, cost_zones, SSAIR_DONE)
- // Okay, we're done! Woo! Got thru a whole air_master cycle!
+ // Okay, we're done! Woo! Got thru a whole SSair cycle!
if(LAZYLEN(currentrun) || current_step != SSAIR_DONE)
log_and_message_admins("SSair: Was not able to complete a full air cycle despite reaching the end of fire(). This shouldn't happen.")
else
@@ -305,9 +373,162 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun
next_fire = world.time + wait
can_fire = TRUE // Unpause
-//
-// The procs from the ZAS Air Controller are in ZAS/Controller.dm
-//
+/datum/controller/subsystem/air/proc/add_zone(zone/z)
+ zones.Add(z)
+ z.name = "Zone [next_id++]"
+ mark_zone_update(z)
+
+/datum/controller/subsystem/air/proc/remove_zone(zone/z)
+ zones.Remove(z)
+ zones_to_update.Remove(z)
+
+/datum/controller/subsystem/air/proc/air_blocked(turf/A, turf/B)
+ #ifdef ZASDBG
+ ASSERT(isturf(A))
+ ASSERT(isturf(B))
+ #endif
+ var/ablock = A.c_airblock(B)
+ if(ablock == BLOCKED)
+ return BLOCKED
+ return ablock | B.c_airblock(A)
+
+/datum/controller/subsystem/air/proc/merge(zone/A, zone/B)
+ #ifdef ZASDBG
+ ASSERT(istype(A))
+ ASSERT(istype(B))
+ ASSERT(!A.invalid)
+ ASSERT(!B.invalid)
+ ASSERT(A != B)
+ #endif
+ if(A.contents.len < B.contents.len)
+ A.c_merge(B)
+ mark_zone_update(B)
+ else
+ B.c_merge(A)
+ mark_zone_update(A)
+
+/datum/controller/subsystem/air/proc/connect(turf/simulated/A, turf/simulated/B)
+ #ifdef ZASDBG
+ ASSERT(istype(A))
+ ASSERT(isturf(B))
+ ASSERT(A.zone)
+ ASSERT(!A.zone.invalid)
+ //ASSERT(B.zone)
+ ASSERT(A != B)
+ #endif
+
+ var/block = SSair.air_blocked(A,B)
+ if(block & AIR_BLOCKED) return
+
+ var/direct = !(block & ZONE_BLOCKED)
+ var/space = !istype(B)
+
+ if(!space)
+ if(min(A.zone.contents.len, B.zone.contents.len) < ZONE_MIN_SIZE || (direct && (equivalent_pressure(A.zone,B.zone) || current_cycle == 0)))
+ merge(A.zone,B.zone)
+ return
+
+ var/a_to_b = get_dir(A,B)
+ var/b_to_a = get_dir(B,A)
+
+ if(!A.connections)
+ A.connections = new
+ if(!B.connections)
+ B.connections = new
+
+ if(A.connections.get(a_to_b))
+ return
+ if(B.connections.get(b_to_a))
+ return
+ if(!space)
+ if(A.zone == B.zone)
+ return
+
+
+ var/connection/c = new /connection(A,B)
+
+ A.connections.place(c, a_to_b)
+ B.connections.place(c, b_to_a)
+
+ if(direct) c.mark_direct()
+
+/datum/controller/subsystem/air/proc/mark_for_update(turf/T)
+ #ifdef ZASDBG
+ ASSERT(isturf(T))
+ #endif
+ if(T.needs_air_update)
+ return
+ tiles_to_update |= T
+ #ifdef ZASDBG
+ T.add_overlay(mark)
+ #endif
+ T.needs_air_update = 1
+
+/datum/controller/subsystem/air/proc/mark_zone_update(zone/Z)
+ #ifdef ZASDBG
+ ASSERT(istype(Z))
+ #endif
+ if(Z.needs_update)
+ return
+ zones_to_update.Add(Z)
+ Z.needs_update = 1
+
+/datum/controller/subsystem/air/proc/mark_edge_sleeping(connection_edge/E)
+ #ifdef ZASDBG
+ ASSERT(istype(E))
+ #endif
+ if(E.sleeping)
+ return
+ active_edges.Remove(E)
+ E.sleeping = 1
+
+/datum/controller/subsystem/air/proc/mark_edge_active(connection_edge/E)
+ #ifdef ZASDBG
+ ASSERT(istype(E))
+ #endif
+ if(!E.sleeping)
+ return
+ active_edges.Add(E)
+ E.sleeping = 0
+
+/datum/controller/subsystem/air/proc/equivalent_pressure(zone/A, zone/B)
+ return A.air.compare(B.air)
+
+/datum/controller/subsystem/air/proc/get_edge(zone/A, zone/B)
+ if(istype(B))
+ for(var/connection_edge/zone/edge in A.edges)
+ if(edge.contains_zone(B))
+ return edge
+ var/connection_edge/edge = new /connection_edge/zone(A,B)
+ edges.Add(edge)
+ edge.recheck()
+ return edge
+ else
+ for(var/connection_edge/unsimulated/edge in A.edges)
+ if(has_same_air(edge.B,B))
+ return edge
+ var/connection_edge/edge = new /connection_edge/unsimulated(A,B)
+ edges.Add(edge)
+ edge.recheck()
+ return edge
+
+/datum/controller/subsystem/air/proc/has_same_air(turf/A, turf/B)
+ if(A.oxygen != B.oxygen)
+ return FALSE
+ if(A.nitrogen != B.nitrogen)
+ return FALSE
+ if(A.phoron != B.phoron)
+ return FALSE
+ if(A.carbon_dioxide != B.carbon_dioxide)
+ return FALSE
+ if(A.temperature != B.temperature)
+ return FALSE
+ return TRUE
+
+/datum/controller/subsystem/air/proc/remove_edge(connection_edge/E)
+ edges.Remove(E)
+ if(!E.sleeping)
+ active_edges.Remove(E)
#undef SSAIR_TURFS
#undef SSAIR_EDGES
diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm
index 702dbfddae..165748c64b 100644
--- a/code/controllers/verbs.dm
+++ b/code/controllers/verbs.dm
@@ -89,7 +89,6 @@
//Goon PS stuff, and other yet-to-be-subsystem things.
options["LEGACY: master_controller"] = master_controller
- options["LEGACY: air_master"] = air_master
options["LEGACY: job_master"] = job_master
options["LEGACY: radio_controller"] = radio_controller
options["LEGACY: emergency_shuttle"] = emergency_shuttle
diff --git a/code/datums/autolathe/arms.dm b/code/datums/autolathe/arms.dm
index 9bceaf27e6..41caf5a74d 100644
--- a/code/datums/autolathe/arms.dm
+++ b/code/datums/autolathe/arms.dm
@@ -443,7 +443,7 @@
/datum/category_item/autolathe/arms/knuckledusters
name = "knuckle dusters"
- path =/obj/item/clothing/gloves/knuckledusters
+ path =/obj/item/clothing/accessory/knuckledusters
hidden = 1
/datum/category_item/autolathe/arms/tacknife
diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm
index b664a349a6..6505817fb5 100644
--- a/code/datums/diseases/_MobProcs.dm
+++ b/code/datums/diseases/_MobProcs.dm
@@ -80,7 +80,7 @@
if(prob(15/D.permeability_mod))
return
- if(nutrition > 300 && prob(nutrition/10))
+ if(nutrition > 300 && prob(nutrition/50))
return
var/list/zone_weights = list(
@@ -178,16 +178,13 @@
return FALSE
var/disease = tgui_input_list(usr, "Choose virus", "Viruses", subtypesof(/datum/disease), subtypesof(/datum/disease))
- var/mob/living/carbon/human/H = tgui_input_list(usr, "Choose infectee", human_mob_list)
+ var/mob/living/carbon/human/H = tgui_input_list(usr, "Choose infectee", "Characters", human_mob_list)
var/datum/disease/D = new disease
if(isnull(D) || isnull(H))
return FALSE
- if(H.stat == DEAD)
- return FALSE
-
if(!H.HasDisease(D))
H.ForceContractDisease(D)
diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm
index 6ae5cdbb9e..22cdabb1dd 100644
--- a/code/datums/diseases/_disease.dm
+++ b/code/datums/diseases/_disease.dm
@@ -91,7 +91,7 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease))
var/cures_found = 0
for(var/C_id in cures)
- if(affected_mob.reagents.has_reagent(C_id))
+ if(affected_mob.bloodstr.has_reagent(C_id) || affected_mob.ingested.has_reagent(C_id))
cures_found++
if(needs_all_cures && cures_found < length(cures))
@@ -106,7 +106,7 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease))
if((spread_flags & SPECIAL || spread_flags & NON_CONTAGIOUS || spread_flags & BLOOD) && !force_spread)
return
- if(affected_mob.reagents.has_reagent("spaceacilin") || (affected_mob.nutrition > 300 && prob(affected_mob.nutrition/10)))
+ if(affected_mob.bloodstr.has_reagent("spaceacillin") || (affected_mob.nutrition > 300 && prob(affected_mob.nutrition/50)))
return
var/spread_range = 1
diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm
index 4e593ea7f1..6eda375458 100644
--- a/code/datums/diseases/advance/advance.dm
+++ b/code/datums/diseases/advance/advance.dm
@@ -2,7 +2,7 @@ GLOBAL_LIST_EMPTY(archive_diseases)
GLOBAL_LIST_INIT(advance_cures, list(
"sodiumchloride", "sugar", "orangejuice",
- "spaceacilin", "glucose", "ethanol",
+ "spaceacillin", "glucose", "ethanol",
"dyloteane", "impedrezene", "hepanephrodaxon",
"gold", "silver"
))
@@ -16,6 +16,7 @@ GLOBAL_LIST_INIT(advance_cures, list(
spread_text = "Unknown"
viable_mobtypes = list(/mob/living/carbon/human)
+ var/s_processing = FALSE
var/list/symptoms = list()
var/id = ""
@@ -36,7 +37,7 @@ GLOBAL_LIST_INIT(advance_cures, list(
return
/datum/disease/advance/Destroy()
- if(processing)
+ if(s_processing)
for(var/datum/symptom/S in symptoms)
S.End(src)
return ..()
@@ -46,8 +47,8 @@ GLOBAL_LIST_INIT(advance_cures, list(
return FALSE
if(symptoms && length(symptoms))
- if(!processing)
- processing = TRUE
+ if(!s_processing)
+ s_processing = TRUE
for(var/datum/symptom/S in symptoms)
S.Start(src)
@@ -361,7 +362,7 @@ GLOBAL_LIST_INIT(advance_cures, list(
for(var/datum/disease/advance/AD in active_diseases)
AD.Refresh()
- H = tgui_input_list(usr, "Choose infectee", human_mob_list)
+ H = tgui_input_list(usr, "Choose infectee", "Infectees", human_mob_list)
if(isnull(H))
return FALSE
diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/advance/symptoms/cough.dm
index bdf04a9fdf..00a33e9ce6 100644
--- a/code/datums/diseases/advance/symptoms/cough.dm
+++ b/code/datums/diseases/advance/symptoms/cough.dm
@@ -10,7 +10,8 @@ Coughing
Low Level.
BONUS
- Will force the affected mob to drop small items!
+ Will force the affected mob to drop small items.
+ Small spread if not wearing a mask
//////////////////////////////////////
*/
@@ -36,4 +37,6 @@ BONUS
var/obj/item/I = M.get_active_hand()
if(I && I.w_class == ITEMSIZE_SMALL)
M.drop_item()
+ if(!M.wear_mask) // Small spread if not wearing a mask
+ A.spread(2)
return
diff --git a/code/datums/diseases/advance/symptoms/fever.dm b/code/datums/diseases/advance/symptoms/fever.dm
index a9e027da9c..6e252e56cd 100644
--- a/code/datums/diseases/advance/symptoms/fever.dm
+++ b/code/datums/diseases/advance/symptoms/fever.dm
@@ -35,6 +35,6 @@ Bonus
return
/datum/symptom/fever/proc/Heat(var/mob/living/M, var/datum/disease/advance/A)
- var/get_heat = (sqrt(21+A.totalTransmittable()*2))+(sqrt(20+A.totalStageSpeed()*3))
+ var/get_heat = (sqrtor0(21+A.totalTransmittable()*2))+(sqrtor0(20+A.totalStageSpeed()*3))
M.bodytemperature = min(M.bodytemperature + (get_heat * A.stage), BODYTEMP_HEAT_DAMAGE_LIMIT - 1)
return TRUE
diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm
index 28c9002c3a..e91efab1c7 100644
--- a/code/datums/diseases/advance/symptoms/flesh_eating.dm
+++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm
@@ -37,6 +37,6 @@ Bonus
return
/datum/symptom/flesh_eating/proc/Flesheat(mob/living/M, datum/disease/advance/A)
- var/get_damage = ((sqrt(16-A.totalStealth()))*5)
+ var/get_damage = ((sqrtor0(16-A.totalStealth()))*5)
M.adjustBruteLoss(get_damage)
return 1
diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm
index 1c21959872..1138d4adba 100644
--- a/code/datums/diseases/advance/symptoms/heal.dm
+++ b/code/datums/diseases/advance/symptoms/heal.dm
@@ -33,7 +33,7 @@ Bonus
return
/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A)
- var/get_damage = (sqrt(20+A.totalStageSpeed())*(1+rand()))
+ var/get_damage = max(0, (sqrtor0(20+A.totalStageSpeed())*(1+rand())))
M.adjustToxLoss(-get_damage)
return TRUE
@@ -144,7 +144,7 @@ Bonus
level = 5
/datum/symptom/heal/dna/Heal(var/mob/living/carbon/M, var/datum/disease/advance/A)
- var/amt_healed = (sqrt(20+A.totalStageSpeed()*(3+rand())))-(sqrt(16+A.totalStealth()*rand()))
+ var/amt_healed = max(0, (sqrtor0(20+A.totalStageSpeed()*(3+rand())))-(sqrtor0(16+A.totalStealth()*rand())))
M.adjustBrainLoss(-amt_healed)
M.radiation = max(M.radiation - 3, 0)
return TRUE
diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm
index 6f1f3ac9d3..8e19382f94 100644
--- a/code/datums/diseases/advance/symptoms/sensory.dm
+++ b/code/datums/diseases/advance/symptoms/sensory.dm
@@ -30,14 +30,14 @@ Bonus
var/mob/living/M = A.affected_mob
if(A.stage >= 3)
- M.slurring = min(0, M.slurring-4)
- M.druggy = min(0, M.druggy-4)
+ M.slurring = max(0, M.slurring-4)
+ M.druggy = max(0, M.druggy-4)
M.reagents.remove_reagent("ethanol", 3)
if(A.stage >= 4)
- M.drowsyness = min(0, M.drowsyness-4)
+ M.drowsyness = max(0, M.drowsyness-4)
if(M.reagents.has_reagent("bliss"))
M.reagents.del_reagent("bliss")
- M.hallucination = min(0, M.hallucination-4)
+ M.hallucination = max(0, M.hallucination-4)
if(A.stage >= 5)
if(M.reagents.get_reagent_amount("alkysine") < 10)
M.reagents.add_reagent("alkysine", 5)
diff --git a/code/datums/diseases/advance/symptoms/shivering.dm b/code/datums/diseases/advance/symptoms/shivering.dm
index 375850ef40..f4a3059d7c 100644
--- a/code/datums/diseases/advance/symptoms/shivering.dm
+++ b/code/datums/diseases/advance/symptoms/shivering.dm
@@ -34,6 +34,6 @@ Bonus
return
/datum/symptom/shivering/proc/Chill(mob/living/M, datum/disease/advance/A)
- var/get_cold = (sqrt(16+A.totalStealth()*2))+(sqrt(21+A.totalResistance()*2))
+ var/get_cold = (sqrtor0(16+A.totalStealth()*2))+(sqrtor0(21+A.totalResistance()*2))
M.bodytemperature = max(M.bodytemperature - (get_cold * A.stage), BODYTEMP_COLD_DAMAGE_LIMIT + 1)
return 1
diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm
index d60baaa11a..63f2ab00e1 100644
--- a/code/datums/diseases/advance/symptoms/sneeze.dm
+++ b/code/datums/diseases/advance/symptoms/sneeze.dm
@@ -34,8 +34,10 @@ Bonus
M.emote("sniff")
else
M.emote("sneeze")
- A.spread(5)
- if(prob(30))
+ if(!M.wear_mask) // Spread only if they're not covering their face
+ A.spread(5)
+
+ if(prob(30) && !M.wear_mask) // Same for mucus
var/obj/effect/decal/cleanable/mucus/icky = new(get_turf(M))
icky.viruses |= A.Copy()
diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm
index c6b6cf0f17..487f466761 100644
--- a/code/datums/diseases/cold.dm
+++ b/code/datums/diseases/cold.dm
@@ -3,8 +3,9 @@
max_stages = 3
spread_text = "Airborne"
spread_flags = AIRBORNE
- cure_text = "Rest & Spaceacilin"
- cures = list("spaceacilin")
+ cure_text = "Rest & Spaceacillin"
+ cures = list("spaceacillin", "chicken_soup")
+ needs_all_cures = FALSE
agent = "XY-rhinovirus"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey)
permeability_mod = 0.5
diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm
index 6a30af6f85..2962f48e9b 100644
--- a/code/datums/diseases/flu.dm
+++ b/code/datums/diseases/flu.dm
@@ -2,8 +2,9 @@
name = "The Flu"
max_stages = 3
spread_text = "Airborne"
- cure_text = "Spaceacilin"
- cures = list("spaceacilin")
+ cure_text = "Spaceacillin"
+ cures = list("spaceacillin", "chicken_soup")
+ needs_all_cures = FALSE
cure_chance = 10
agent = "H13N1 flu virion"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey)
diff --git a/code/datums/diseases/roanoake.dm b/code/datums/diseases/roanoake.dm
index 91d476b3c7..412ff16ae7 100644
--- a/code/datums/diseases/roanoake.dm
+++ b/code/datums/diseases/roanoake.dm
@@ -4,9 +4,9 @@
stage_prob = 2
spread_text = "Blood and close contact"
spread_flags = BLOOD
- cure_text = "Spaceacilin"
+ cure_text = "Spaceacillin"
agent = "Chimera cells"
- cures = list("spaceacilin")
+ cures = list("spaceacillin")
cure_chance = 10
viable_mobtypes = list(/mob/living/carbon/human)
desc = "If left untreated, subject will become a xenochimera upon perishing."
diff --git a/code/datums/outfits/horror_killers.dm b/code/datums/outfits/horror_killers.dm
index aa45f4e23d..6f38c18df0 100644
--- a/code/datums/outfits/horror_killers.dm
+++ b/code/datums/outfits/horror_killers.dm
@@ -5,7 +5,6 @@
gloves = /obj/item/clothing/gloves/black
mask = /obj/item/clothing/mask/gas/clown_hat
head = /obj/item/clothing/head/chaplain_hood
- l_ear = /obj/item/radio/headset
glasses = /obj/item/clothing/glasses/thermal/plain/monocle
suit = /obj/item/clothing/suit/storage/hooded/chaplain_hoodie
r_pocket = /obj/item/bikehorn
@@ -15,6 +14,10 @@
id_type = /obj/item/card/id/syndicate/station_access
id_pda_assignment = "Tunnel Clown!"
+ headset = /obj/item/radio/headset
+ headset_alt = /obj/item/radio/headset/alt
+ headset_earbud = /obj/item/radio/headset/earbud
+
/decl/hierarchy/outfit/masked_killer
name = "Masked Killer"
uniform = /obj/item/clothing/under/overalls
@@ -22,13 +25,16 @@
gloves = /obj/item/clothing/gloves/sterile/latex
mask = /obj/item/clothing/mask/surgical
head = /obj/item/clothing/head/welding
- l_ear = /obj/item/radio/headset
glasses = /obj/item/clothing/glasses/thermal/plain/monocle
suit = /obj/item/clothing/suit/storage/apron
l_pocket = /obj/item/material/knife/tacknife
r_pocket = /obj/item/surgical/scalpel
r_hand = /obj/item/material/twohanded/fireaxe
+ headset = /obj/item/radio/headset
+ headset_alt = /obj/item/radio/headset/alt
+ headset_earbud = /obj/item/radio/headset/earbud
+
/decl/hierarchy/outfit/masked_killer/post_equip(var/mob/living/carbon/human/H)
var/victim = get_mannequin(H.ckey)
for(var/obj/item/carried_item in H.get_equipped_items(TRUE))
@@ -39,7 +45,6 @@
uniform = /obj/item/clothing/under/suit_jacket{ starting_accessories=list(/obj/item/clothing/accessory/wcoat) }
shoes = /obj/item/clothing/shoes/black
gloves = /obj/item/clothing/gloves/black
- l_ear = /obj/item/radio/headset
glasses = /obj/item/clothing/glasses/sunglasses
l_pocket = /obj/item/melee/energy/sword
mask = /obj/item/clothing/mask/gas/clown_hat
@@ -49,6 +54,10 @@
pda_slot = slot_belt
pda_type = /obj/item/pda/heads
+ headset = /obj/item/radio/headset
+ headset_alt = /obj/item/radio/headset/alt
+ headset_earbud = /obj/item/radio/headset/earbud
+
/decl/hierarchy/outfit/professional/post_equip(var/mob/living/carbon/human/H)
var/obj/item/storage/secure/briefcase/sec_briefcase = new(H)
for(var/obj/item/briefcase_item in sec_briefcase)
diff --git a/code/datums/outfits/jobs/special_vr.dm b/code/datums/outfits/jobs/special_vr.dm
index bc88232d13..0e1fcf2a70 100644
--- a/code/datums/outfits/jobs/special_vr.dm
+++ b/code/datums/outfits/jobs/special_vr.dm
@@ -4,24 +4,30 @@
gloves = /obj/item/clothing/gloves/white
shoes = /obj/item/clothing/shoes/laceup
head = /obj/item/clothing/head/beret/centcom/officer
- l_ear = /obj/item/radio/headset/centcom
glasses = /obj/item/clothing/glasses/omnihud/all
id_type = /obj/item/card/id/centcom
pda_type = /obj/item/pda/centcom
flags = OUTFIT_EXTENDED_SURVIVAL|OUTFIT_COMPREHENSIVE_SURVIVAL
+ headset = /obj/item/radio/headset/centcom
+ headset_alt = /obj/item/radio/headset/centcom
+ headset_earbud = /obj/item/radio/headset/centcom
+
/decl/hierarchy/outfit/job/emergency_responder
name = OUTFIT_JOB_NAME("Emergency Responder")
uniform = /obj/item/clothing/under/ert
shoes = /obj/item/clothing/shoes/boots/swat
gloves = /obj/item/clothing/gloves/swat
- l_ear = /obj/item/radio/headset/ert
glasses = /obj/item/clothing/glasses/sunglasses
back = /obj/item/storage/backpack/satchel
id_type = /obj/item/card/id/centcom/ERT
pda_type = /obj/item/pda/centcom
flags = OUTFIT_EXTENDED_SURVIVAL|OUTFIT_COMPREHENSIVE_SURVIVAL
+ headset = /obj/item/radio/headset/ert
+ headset_alt = /obj/item/radio/headset/ert
+ headset_earbud = /obj/item/radio/headset/ert
+
/decl/hierarchy/outfit/job/emergency_responder/post_equip(var/mob/living/carbon/human/H)
..()
ert.add_antagonist(H.mind)
diff --git a/code/datums/outfits/military/military.dm b/code/datums/outfits/military/military.dm
index d3f9555794..fb47db35f5 100644
--- a/code/datums/outfits/military/military.dm
+++ b/code/datums/outfits/military/military.dm
@@ -2,4 +2,6 @@
name = "Military Uniform"
hierarchy_type = /decl/hierarchy/outfit/military
- l_ear = /obj/item/radio/headset
\ No newline at end of file
+ headset = /obj/item/radio/headset
+ headset_alt = /obj/item/radio/headset
+ headset_earbud = /obj/item/radio/headset
\ No newline at end of file
diff --git a/code/datums/outfits/misc.dm b/code/datums/outfits/misc.dm
index 556bf1d052..ef36b85038 100644
--- a/code/datums/outfits/misc.dm
+++ b/code/datums/outfits/misc.dm
@@ -29,7 +29,6 @@
/decl/hierarchy/outfit/soviet_soldier/admiral
name = "Soviet admiral"
head = /obj/item/clothing/head/hgpiratecap
- l_ear = /obj/item/radio/headset/heads/captain
glasses = /obj/item/clothing/glasses/thermal/plain/eyepatch
suit = /obj/item/clothing/suit/hgpirate
@@ -37,10 +36,13 @@
id_type = /obj/item/card/id/centcom //station
id_pda_assignment = "Admiral"
+ headset = /obj/item/radio/headset/heads/captain
+ headset_alt = /obj/item/radio/headset/heads/captain
+ headset_earbud = /obj/item/radio/headset/heads/captain
+
/decl/hierarchy/outfit/merchant
name = "Merchant"
shoes = /obj/item/clothing/shoes/black
- l_ear = /obj/item/radio/headset
uniform = /obj/item/clothing/under/color/grey
id_slot = slot_wear_id
id_type = /obj/item/card/id/civilian //merchant
@@ -48,6 +50,10 @@
pda_type = /obj/item/pda/chef //cause I like the look
id_pda_assignment = "Merchant"
+ headset = /obj/item/radio/headset
+ headset_alt = /obj/item/radio/headset
+ headset_earbud = /obj/item/radio/headset
+
/decl/hierarchy/outfit/merchant/vox
name = "Merchant - Vox"
shoes = /obj/item/clothing/shoes/boots/jackboots/toeless
diff --git a/code/datums/outfits/nanotrasen.dm b/code/datums/outfits/nanotrasen.dm
index 4bf6c4f861..3fde80dd0b 100644
--- a/code/datums/outfits/nanotrasen.dm
+++ b/code/datums/outfits/nanotrasen.dm
@@ -3,7 +3,6 @@
uniform = /obj/item/clothing/under/rank/centcom
shoes = /obj/item/clothing/shoes/laceup
gloves = /obj/item/clothing/gloves/white
- l_ear = /obj/item/radio/headset/heads/hop
glasses = /obj/item/clothing/glasses/sunglasses
id_slot = slot_wear_id
@@ -11,6 +10,10 @@
pda_slot = slot_r_store
pda_type = /obj/item/pda/heads
+ headset = /obj/item/radio/headset/heads/hop
+ headset_alt = /obj/item/radio/headset/heads/hop
+ headset_earbud = /obj/item/radio/headset/heads/hop
+
/decl/hierarchy/outfit/nanotrasen/representative
name = "Nanotrasen representative"
belt = /obj/item/clipboard
@@ -19,14 +22,20 @@
/decl/hierarchy/outfit/nanotrasen/officer
name = "Nanotrasen officer"
head = /obj/item/clothing/head/beret/centcom/officer
- l_ear = /obj/item/radio/headset/heads/captain
belt = /obj/item/gun/energy
id_pda_assignment = "NanoTrasen Navy Officer"
+ headset = /obj/item/radio/headset/heads/captain
+ headset_alt = /obj/item/radio/headset/heads/captain
+ headset_earbud = /obj/item/radio/headset/heads/captain
+
/decl/hierarchy/outfit/nanotrasen/captain
name = "Nanotrasen captain"
uniform = /obj/item/clothing/under/rank/centcom_captain
- l_ear = /obj/item/radio/headset/heads/captain
head = /obj/item/clothing/head/beret/centcom/captain
belt = /obj/item/gun/energy
id_pda_assignment = "NanoTrasen Navy Captain"
+
+ headset = /obj/item/radio/headset/heads/captain
+ headset_alt = /obj/item/radio/headset/heads/captain
+ headset_earbud = /obj/item/radio/headset/heads/captain
diff --git a/code/datums/outfits/outfit_vr.dm b/code/datums/outfits/outfit_vr.dm
index 537f13d834..c343a36964 100644
--- a/code/datums/outfits/outfit_vr.dm
+++ b/code/datums/outfits/outfit_vr.dm
@@ -3,7 +3,6 @@
uniform = /obj/item/clothing/under/solgov/utility/army/urban
shoes = /obj/item/clothing/shoes/boots/jackboots
gloves = /obj/item/clothing/gloves/combat
- l_ear = /obj/item/radio/headset/centcom
r_pocket = /obj/item/ammo_magazine/m95
l_pocket = /obj/item/ammo_magazine/m95
l_hand = /obj/item/ammo_magazine/m95
@@ -15,6 +14,10 @@
suit = /obj/item/clothing/suit/armor/combat/USDF
belt = /obj/item/storage/belt/security/tactical
+ headset = /obj/item/radio/headset/centcom
+ headset_alt = /obj/item/radio/headset/centcom
+ headset_earbud = /obj/item/radio/headset/centcom
+
/decl/hierarchy/outfit/USDF/Marine/equip_id(mob/living/carbon/human/H)
var/obj/item/card/id/C = ..()
C.name = "[H.real_name]'s military ID Card"
@@ -29,7 +32,6 @@
name = "USDF officer"
head = /obj/item/clothing/head/dress/army/command
shoes = /obj/item/clothing/shoes/boots/jackboots
- l_ear = /obj/item/radio/headset/centcom
uniform = /obj/item/clothing/under/solgov/mildress/army/command
back = /obj/item/storage/backpack/satchel
belt = /obj/item/gun/projectile/revolver/consul
@@ -38,6 +40,10 @@
r_hand = /obj/item/clothing/accessory/holster/hip
l_hand = /obj/item/clothing/accessory/tie/black
+ headset = /obj/item/radio/headset/centcom
+ headset_alt = /obj/item/radio/headset/centcom
+ headset_earbud = /obj/item/radio/headset/centcom
+
/decl/hierarchy/outfit/USDF/Officer/equip_id(mob/living/carbon/human/H)
var/obj/item/card/id/C = ..()
C.name = "[H.real_name]'s military ID Card"
@@ -51,7 +57,6 @@
/decl/hierarchy/outfit/solcom/representative
name = "SolCom Representative"
shoes = /obj/item/clothing/shoes/laceup
- l_ear = /obj/item/radio/headset/centcom
uniform = /obj/item/clothing/under/suit_jacket/navy
back = /obj/item/storage/backpack/satchel
l_pocket = /obj/item/pen/blue
@@ -59,6 +64,10 @@
r_hand = /obj/item/pda/centcom
l_hand = /obj/item/clipboard
+ headset = /obj/item/radio/headset/centcom
+ headset_alt = /obj/item/radio/headset/centcom
+ headset_earbud = /obj/item/radio/headset/centcom
+
/decl/hierarchy/outfit/solcom/representative/equip_id(mob/living/carbon/human/H)
var/obj/item/card/id/C = ..()
C.name = "[H.real_name]'s SolCom ID Card"
@@ -74,7 +83,6 @@
head = /obj/item/clothing/head/helmet/combat/imperial
shoes =/obj/item/clothing/shoes/leg_guard/combat/imperial
gloves = /obj/item/clothing/gloves/arm_guard/combat/imperial
- l_ear = /obj/item/radio/headset/syndicate
uniform = /obj/item/clothing/under/imperial
mask = /obj/item/clothing/mask/gas/imperial
suit = /obj/item/clothing/suit/armor/combat/imperial
@@ -86,12 +94,15 @@
l_hand = /obj/item/shield/energy/imperial
suit_store = /obj/item/gun/energy/imperial
+ headset = /obj/item/radio/headset/syndicate
+ headset_alt = /obj/item/radio/headset/syndicate
+ headset_earbud = /obj/item/radio/headset/syndicate
+
/decl/hierarchy/outfit/imperial/officer
name = "Imperial officer"
head = /obj/item/clothing/head/helmet/combat/imperial/centurion
shoes = /obj/item/clothing/shoes/leg_guard/combat/imperial
gloves = /obj/item/clothing/gloves/arm_guard/combat/imperial
- l_ear = /obj/item/radio/headset/syndicate
uniform = /obj/item/clothing/under/imperial
mask = /obj/item/clothing/mask/gas/imperial
suit = /obj/item/clothing/suit/armor/combat/imperial/centurion
@@ -102,6 +113,10 @@
l_hand = /obj/item/shield/energy/imperial
suit_store = /obj/item/gun/energy/imperial
+ headset = /obj/item/radio/headset/syndicate
+ headset_alt = /obj/item/radio/headset/syndicate
+ headset_earbud = /obj/item/radio/headset/syndicate
+
/*
SOUTHERN CROSS OUTFITS
Keep outfits simple. Spawn with basic uniforms and minimal gear. Gear instead goes in lockers. Keep this in mind if editing.
diff --git a/code/datums/outfits/spec_op.dm b/code/datums/outfits/spec_op.dm
index 8fd2cb6ae4..22da415b98 100644
--- a/code/datums/outfits/spec_op.dm
+++ b/code/datums/outfits/spec_op.dm
@@ -2,7 +2,6 @@
name = "Special ops - Officer"
uniform = /obj/item/clothing/under/syndicate/combat
suit = /obj/item/clothing/suit/armor/swat/officer
- l_ear = /obj/item/radio/headset/ert
glasses = /obj/item/clothing/glasses/thermal/plain/eyepatch
mask = /obj/item/clothing/mask/smokable/cigarette/cigar/havana
head = /obj/item/clothing/head/beret //deathsquad
@@ -16,6 +15,10 @@
id_desc = "Special operations ID."
id_pda_assignment = "Special Operations Officer"
+ headset = /obj/item/radio/headset/ert
+ headset_alt = /obj/item/radio/headset/ert
+ headset_earbud = /obj/item/radio/headset/ert
+
/decl/hierarchy/outfit/spec_op_officer/space
name = "Special ops - Officer in space"
suit = /obj/item/clothing/suit/armor/swat //obj/item/clothing/suit/space/void/swat
@@ -29,7 +32,6 @@
uniform = /obj/item/clothing/under/ert
shoes = /obj/item/clothing/shoes/boots/swat
gloves = /obj/item/clothing/gloves/swat
- l_ear = /obj/item/radio/headset/ert
belt = /obj/item/gun/energy/gun
glasses = /obj/item/clothing/glasses/sunglasses
back = /obj/item/storage/backpack/satchel
@@ -37,6 +39,10 @@
id_slot = slot_wear_id
id_type = /obj/item/card/id/centcom/ERT
+ headset = /obj/item/radio/headset/ert
+ headset_alt = /obj/item/radio/headset/ert
+ headset_earbud = /obj/item/radio/headset/ert
+
/decl/hierarchy/outfit/death_command
name = "Spec ops - Death commando"
@@ -55,7 +61,6 @@
name = "Spec ops - Mercenary"
uniform = /obj/item/clothing/under/syndicate
shoes = /obj/item/clothing/shoes/boots/combat
- l_ear = /obj/item/radio/headset/syndicate
belt = /obj/item/storage/belt/security
glasses = /obj/item/clothing/glasses/sunglasses
gloves = /obj/item/clothing/gloves/swat
@@ -66,4 +71,8 @@
id_type = /obj/item/card/id/syndicate
id_pda_assignment = "Mercenary"
+ headset = /obj/item/radio/headset/syndicate
+ headset_alt = /obj/item/radio/headset/alt/syndicate
+ headset_earbud = /obj/item/radio/headset/earbud/syndicate
+
flags = OUTFIT_HAS_BACKPACK
diff --git a/code/datums/outfits/wizardry.dm b/code/datums/outfits/wizardry.dm
index 96836b3edc..0cb82f75f2 100644
--- a/code/datums/outfits/wizardry.dm
+++ b/code/datums/outfits/wizardry.dm
@@ -1,7 +1,6 @@
/decl/hierarchy/outfit/wizard
uniform = /obj/item/clothing/under/color/lightpurple
shoes = /obj/item/clothing/shoes/sandal
- l_ear = /obj/item/radio/headset
r_pocket = /obj/item/teleportation_scroll
l_hand = /obj/item/staff
r_hand = /obj/item/spellbook
@@ -9,6 +8,10 @@
backpack_contents = list(/obj/item/storage/box = 1)
hierarchy_type = /decl/hierarchy/outfit/wizard
+ headset = /obj/item/radio/headset
+ headset_alt = /obj/item/radio/headset
+ headset_earbud = /obj/item/radio/headset
+
/decl/hierarchy/outfit/wizard/blue
name = "Wizard - Blue"
head = /obj/item/clothing/head/wizard
diff --git a/code/datums/supplypacks/hydroponics.dm b/code/datums/supplypacks/hydroponics.dm
index 84712a9f74..fad0054a36 100644
--- a/code/datums/supplypacks/hydroponics.dm
+++ b/code/datums/supplypacks/hydroponics.dm
@@ -95,6 +95,13 @@
containername = "Chicken crate"
access = access_hydroponics
+/datum/supply_pack/hydro/turkey
+ name = "Turkey crate"
+ cost = 25
+ containertype = /obj/structure/largecrate/animal/turkey
+ containername = "Turkey crate"
+ access = access_hydroponics
+
/datum/supply_pack/hydro/seeds
name = "Seeds crate"
contains = list(
diff --git a/code/datums/supplypacks/misc.dm b/code/datums/supplypacks/misc.dm
index d03ab2b620..bc1690c7d8 100644
--- a/code/datums/supplypacks/misc.dm
+++ b/code/datums/supplypacks/misc.dm
@@ -80,6 +80,7 @@
/obj/item/toy/plushie/slimeplushie,
/obj/item/toy/plushie/box,
/obj/item/toy/plushie/borgplushie,
+ /obj/item/toy/plushie/borgplushie/drake/eng,
/obj/item/toy/plushie/borgplushie/medihound,
/obj/item/toy/plushie/borgplushie/scrubpuppy,
/obj/item/toy/plushie/foxbear,
diff --git a/code/datums/supplypacks/supply.dm b/code/datums/supplypacks/supply.dm
index 68a6b420c0..b8bcd3f7ba 100644
--- a/code/datums/supplypacks/supply.dm
+++ b/code/datums/supplypacks/supply.dm
@@ -175,7 +175,7 @@
/obj/item/material/knife/tacknife/survival,
/obj/item/material/knife/machete,
/obj/item/clothing/accessory/holster/machete,
- /obj/item/clothing/gloves/watch/survival
+ /obj/item/clothing/accessory/watch/survival
)
cost=25
containertype = /obj/structure/closet/crate/secure/xion
@@ -200,7 +200,7 @@
/obj/item/clothing/head/pilot_vr,
/obj/item/clothing/under/rank/pilot1,
/obj/item/gun/energy/gun/protector/pilotgun/locked,
- /obj/item/clothing/gloves/watch/survival
+ /obj/item/clothing/accessory/watch/survival
)
cost=20
containertype = /obj/structure/closet/crate/secure/xion
@@ -236,7 +236,7 @@
/obj/item/clothing/accessory/holster/machete,
/obj/item/storage/box/explorerkeys,
/obj/item/mapping_unit,
- /obj/item/clothing/gloves/watch/survival
+ /obj/item/clothing/accessory/watch/survival
)
cost = 75
containertype = /obj/structure/closet/crate/secure/xion
diff --git a/code/datums/uplink/stealthy_weapons.dm b/code/datums/uplink/stealthy_weapons.dm
index 29c8009211..39cc3bf9ae 100644
--- a/code/datums/uplink/stealthy_weapons.dm
+++ b/code/datums/uplink/stealthy_weapons.dm
@@ -58,12 +58,6 @@
item_cost = 20
path = /obj/item/pen/blade/fountain
-/datum/uplink_item/item/stealthy_weapons/angrybuzzer
- name = "Morphium Shock Ring"
- desc = "An enigmatic ring used to create powerful electric shocks when punching. Can be used as a brute-force method of defibrillation."
- item_cost = 40
- path = /obj/item/clothing/gloves/ring/buzzer
-
/datum/uplink_item/item/stealthy_weapons/huntingtrap
name = "Camonetted Beartraps"
desc = "A box of unique beartraps which will partially cloak when deployed, allowing for more effective hunting."
diff --git a/code/game/jobs/job/assistant.dm b/code/game/jobs/job/assistant.dm
index 6aa9753352..e3eca95cd3 100644
--- a/code/game/jobs/job/assistant.dm
+++ b/code/game/jobs/job/assistant.dm
@@ -57,3 +57,118 @@
title_blurb = "A " + JOB_ALT_RESIDENT + " is an individual who resides on the station, frequently in a different part of the station than what is seen. \
They are considered to be part of the crew for most purposes, but have no real authority."
title_outfit = /decl/hierarchy/outfit/job/assistant/resident
+
+//////////////////////////////////
+// Intern
+//////////////////////////////////
+
+/datum/job/intern
+ title = JOB_INTERN
+ flag = INTERN
+ departments = list(DEPARTMENT_CIVILIAN)
+ department_flag = ENGSEC // Ran out of bits
+ faction = FACTION_STATION
+ total_positions = -1
+ spawn_positions = -1
+ supervisors = "the staff from the department you're interning in"
+ selection_color = "#555555"
+ economic_modifier = 2
+ access = list() //See /datum/job/intern/get_access()
+ minimal_access = list() //See /datum/job/intern/get_access()
+ outfit_type = /decl/hierarchy/outfit/job/assistant/intern
+ alt_titles = list(JOB_ALT_APPRENTICE_ENGINEER = /datum/alt_title/intern_eng,
+ JOB_ALT_MEDICAL_INTERN = /datum/alt_title/intern_med,
+ JOB_ALT_RESEARCH_INTERN = /datum/alt_title/intern_sci,
+ JOB_ALT_SECURITY_CADET = /datum/alt_title/intern_sec,
+ JOB_ALT_JR_CARGO_TECH = /datum/alt_title/intern_crg,
+ JOB_ALT_SERVER = /datum/alt_title/server,
+ JOB_ALT_ASSISTANT = /datum/alt_title/assistant)
+ job_description = "An " + JOB_INTERN + " does whatever is requested of them, often doing so in process of learning \
+ another job. Though they are part of the crew, they have no real authority."
+ timeoff_factor = 0 // Interns, noh
+ requestable = FALSE
+
+/datum/alt_title/intern_eng
+ title = JOB_ALT_APPRENTICE_ENGINEER
+ title_blurb = "An " + JOB_ALT_APPRENTICE_ENGINEER + " attempts to provide whatever the Engineering department needs. They are not proper Engineers, and are \
+ often in training to become an Engineer. An " + JOB_ALT_APPRENTICE_ENGINEER + " has no real authority."
+ title_outfit = /decl/hierarchy/outfit/job/assistant/engineer
+
+/datum/alt_title/intern_med
+ title = JOB_ALT_MEDICAL_INTERN
+ title_blurb = "A " + JOB_ALT_MEDICAL_INTERN + " attempts to provide whatever the Medical department needs. They are not proper Doctors, and are \
+ often in training to become a Doctor. A " + JOB_ALT_MEDICAL_INTERN + " has no real authority."
+ title_outfit = /decl/hierarchy/outfit/job/assistant/medic
+
+/datum/alt_title/intern_sci
+ title = JOB_ALT_RESEARCH_INTERN
+ title_blurb = "A " + JOB_ALT_RESEARCH_INTERN + " attempts to provide whatever the Research department needs. They are not proper " + JOB_SCIENTIST + "s, and are \
+ often in training to become a " + JOB_SCIENTIST + ". A " + JOB_ALT_RESEARCH_INTERN + " has no real authority."
+ title_outfit = /decl/hierarchy/outfit/job/assistant/scientist
+
+/datum/alt_title/intern_sec
+ title = JOB_ALT_SECURITY_CADET
+ title_blurb = "A " + JOB_ALT_SECURITY_CADET + " attempts to provide whatever the Security department needs. They are not proper Officers, and are \
+ often in training to become an Officer. A " + JOB_ALT_SECURITY_CADET + " has no real authority."
+ title_outfit = /decl/hierarchy/outfit/job/assistant/officer
+
+/datum/alt_title/intern_crg
+ title = JOB_ALT_JR_CARGO_TECH
+ title_blurb = "A " + JOB_ALT_JR_CARGO_TECH + " attempts to provide whatever the Cargo department needs. They are not proper Cargo Technicians, and are \
+ often in training to become a " + JOB_CARGO_TECHNICIAN + ". A " + JOB_ALT_JR_CARGO_TECH + " has no real authority."
+ title_outfit = /decl/hierarchy/outfit/job/assistant/cargo
+/*
+/datum/alt_title/intern_exp
+ title = "Jr. " + JOB_EXPLORER + ""
+ title_blurb = "A Jr. " + JOB_EXPLORER + " attempts to provide whatever the Exploration department needs. They are not proper " + JOB_EXPLORER + "s, and are \
+ often in training to become an " + JOB_EXPLORER + ". A Jr. " + JOB_EXPLORER + " has no real authority."
+ title_outfit = /decl/hierarchy/outfit/job/assistant/explorer
+*/
+/datum/alt_title/server
+ title = JOB_ALT_SERVER
+ title_blurb = "A " + JOB_ALT_SERVER + " helps out kitchen and diner staff with various tasks, primarily food delivery. A " + JOB_ALT_SERVER + " has no real authority."
+ title_outfit = /decl/hierarchy/outfit/job/service/server
+
+/datum/alt_title/assistant
+ title = JOB_ALT_ASSISTANT
+ title_blurb = "An " + JOB_ALT_ASSISTANT + " helps out wherever they might be needed. They have no authority, but can volunteer to help if help is needed."
+ title_outfit = /decl/hierarchy/outfit/job/service/server
+
+/datum/job/intern/New()
+ ..()
+ if(config)
+ total_positions = CONFIG_GET(number/limit_interns)
+ spawn_positions = CONFIG_GET(number/limit_interns)
+
+/datum/job/intern/get_access()
+ if(CONFIG_GET(flag/assistant_maint))
+ return list(access_maint_tunnels)
+ else
+ return list()
+
+//////////////////////////////////
+// Visitor
+//////////////////////////////////
+
+/datum/job/assistant // Visitor
+ title = JOB_ALT_VISITOR
+ supervisors = "nobody! You don't work here"
+ job_description = "A " + JOB_ALT_VISITOR + " is just there to visit the place. They have no real authority or responsibility."
+ timeoff_factor = 0
+ requestable = FALSE
+ alt_titles = list("Guest" = /datum/alt_title/guest, "Traveler" = /datum/alt_title/traveler)
+
+/datum/job/assistant/New()
+ ..()
+ if(config)
+ total_positions = CONFIG_GET(number/limit_visitors)
+ spawn_positions = CONFIG_GET(number/limit_visitors)
+
+/datum/job/assistant/get_access()
+ return list()
+
+/datum/alt_title/guest
+ title = "Guest"
+
+/datum/alt_title/traveler
+ title = "Traveler"
diff --git a/code/game/jobs/job/assistant_vr.dm b/code/game/jobs/job/assistant_vr.dm
deleted file mode 100644
index c28d801acb..0000000000
--- a/code/game/jobs/job/assistant_vr.dm
+++ /dev/null
@@ -1,115 +0,0 @@
-//////////////////////////////////
-// Intern
-//////////////////////////////////
-
-/datum/job/intern
- title = JOB_INTERN
- flag = INTERN
- departments = list(DEPARTMENT_CIVILIAN)
- department_flag = ENGSEC // Ran out of bits
- faction = FACTION_STATION
- total_positions = -1
- spawn_positions = -1
- supervisors = "the staff from the department you're interning in"
- selection_color = "#555555"
- economic_modifier = 2
- access = list() //See /datum/job/intern/get_access()
- minimal_access = list() //See /datum/job/intern/get_access()
- outfit_type = /decl/hierarchy/outfit/job/assistant/intern
- alt_titles = list(JOB_ALT_APPRENTICE_ENGINEER = /datum/alt_title/intern_eng,
- JOB_ALT_MEDICAL_INTERN = /datum/alt_title/intern_med,
- JOB_ALT_RESEARCH_INTERN = /datum/alt_title/intern_sci,
- JOB_ALT_SECURITY_CADET = /datum/alt_title/intern_sec,
- JOB_ALT_JR_CARGO_TECH = /datum/alt_title/intern_crg,
- JOB_ALT_SERVER = /datum/alt_title/server,
- JOB_ALT_ASSISTANT = /datum/alt_title/assistant)
- job_description = "An " + JOB_INTERN + " does whatever is requested of them, often doing so in process of learning \
- another job. Though they are part of the crew, they have no real authority."
- timeoff_factor = 0 // Interns, noh
- requestable = FALSE
-
-/datum/alt_title/intern_eng
- title = JOB_ALT_APPRENTICE_ENGINEER
- title_blurb = "An " + JOB_ALT_APPRENTICE_ENGINEER + " attempts to provide whatever the Engineering department needs. They are not proper Engineers, and are \
- often in training to become an Engineer. An " + JOB_ALT_APPRENTICE_ENGINEER + " has no real authority."
- title_outfit = /decl/hierarchy/outfit/job/assistant/engineer
-
-/datum/alt_title/intern_med
- title = JOB_ALT_MEDICAL_INTERN
- title_blurb = "A " + JOB_ALT_MEDICAL_INTERN + " attempts to provide whatever the Medical department needs. They are not proper Doctors, and are \
- often in training to become a Doctor. A " + JOB_ALT_MEDICAL_INTERN + " has no real authority."
- title_outfit = /decl/hierarchy/outfit/job/assistant/medic
-
-/datum/alt_title/intern_sci
- title = JOB_ALT_RESEARCH_INTERN
- title_blurb = "A " + JOB_ALT_RESEARCH_INTERN + " attempts to provide whatever the Research department needs. They are not proper " + JOB_SCIENTIST + "s, and are \
- often in training to become a " + JOB_SCIENTIST + ". A " + JOB_ALT_RESEARCH_INTERN + " has no real authority."
- title_outfit = /decl/hierarchy/outfit/job/assistant/scientist
-
-/datum/alt_title/intern_sec
- title = JOB_ALT_SECURITY_CADET
- title_blurb = "A " + JOB_ALT_SECURITY_CADET + " attempts to provide whatever the Security department needs. They are not proper Officers, and are \
- often in training to become an Officer. A " + JOB_ALT_SECURITY_CADET + " has no real authority."
- title_outfit = /decl/hierarchy/outfit/job/assistant/officer
-
-/datum/alt_title/intern_crg
- title = JOB_ALT_JR_CARGO_TECH
- title_blurb = "A " + JOB_ALT_JR_CARGO_TECH + " attempts to provide whatever the Cargo department needs. They are not proper Cargo Technicians, and are \
- often in training to become a " + JOB_CARGO_TECHNICIAN + ". A " + JOB_ALT_JR_CARGO_TECH + " has no real authority."
- title_outfit = /decl/hierarchy/outfit/job/assistant/cargo
-/*
-/datum/alt_title/intern_exp
- title = "Jr. " + JOB_EXPLORER + ""
- title_blurb = "A Jr. " + JOB_EXPLORER + " attempts to provide whatever the Exploration department needs. They are not proper " + JOB_EXPLORER + "s, and are \
- often in training to become an " + JOB_EXPLORER + ". A Jr. " + JOB_EXPLORER + " has no real authority."
- title_outfit = /decl/hierarchy/outfit/job/assistant/explorer
-*/
-/datum/alt_title/server
- title = JOB_ALT_SERVER
- title_blurb = "A " + JOB_ALT_SERVER + " helps out kitchen and diner staff with various tasks, primarily food delivery. A " + JOB_ALT_SERVER + " has no real authority."
- title_outfit = /decl/hierarchy/outfit/job/service/server
-
-/datum/alt_title/assistant
- title = JOB_ALT_ASSISTANT
- title_blurb = "An " + JOB_ALT_ASSISTANT + " helps out wherever they might be needed. They have no authority, but can volunteer to help if help is needed."
- title_outfit = /decl/hierarchy/outfit/job/service/server
-
-/datum/job/intern/New()
- ..()
- if(config)
- total_positions = CONFIG_GET(number/limit_interns)
- spawn_positions = CONFIG_GET(number/limit_interns)
-
-/datum/job/intern/get_access()
- if(CONFIG_GET(flag/assistant_maint))
- return list(access_maint_tunnels)
- else
- return list()
-
-
-//////////////////////////////////
-// Visitor
-//////////////////////////////////
-
-/datum/job/assistant // Visitor
- title = JOB_ALT_VISITOR
- supervisors = "nobody! You don't work here"
- job_description = "A " + JOB_ALT_VISITOR + " is just there to visit the place. They have no real authority or responsibility."
- timeoff_factor = 0
- requestable = FALSE
- alt_titles = list("Guest" = /datum/alt_title/guest, "Traveler" = /datum/alt_title/traveler)
-
-/datum/job/assistant/New()
- ..()
- if(config)
- total_positions = CONFIG_GET(number/limit_visitors)
- spawn_positions = CONFIG_GET(number/limit_visitors)
-
-/datum/job/assistant/get_access()
- return list()
-
-/datum/alt_title/guest
- title = "Guest"
-
-/datum/alt_title/traveler
- title = "Traveler"
diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm
index 6c16ac4376..767ac32923 100644
--- a/code/game/jobs/job/captain.dm
+++ b/code/game/jobs/job/captain.dm
@@ -28,11 +28,16 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
ideal_age_by_species = list(SPECIES_HUMAN_VATBORN = 55) /// Vatborn live shorter, no other race eligible for captain besides human/skrell
banned_job_species = list(SPECIES_UNATHI, SPECIES_TAJ, SPECIES_DIONA, SPECIES_PROMETHEAN, SPECIES_ZADDAT, "mechanical", "digital")
+ disallow_jobhop = TRUE
+ pto_type = PTO_CIVILIAN
+ dept_time_required = 80 //Pending something more complicated
+
outfit_type = /decl/hierarchy/outfit/job/captain
job_description = "The " + JOB_SITE_MANAGER + " manages the other Command Staff, and through them the rest of the station. Though they have access to everything, \
they do not understand everything, and are expected to delegate tasks to the appropriate crew member. The " + JOB_SITE_MANAGER + " is expected to \
have an understanding of Standard Operating Procedure, and is subject to it, and legal action, in the same way as every other crew member."
- alt_titles = list(JOB_ALT_OVERSEER= /datum/alt_title/overseer)
+ alt_titles = list(JOB_ALT_OVERSEER= /datum/alt_title/overseer, JOB_ALT_FACILITY_DIRECTOR = /datum/alt_title/facility_director, JOB_ALT_CHIEF_SUPERVISOR = /datum/alt_title/chief_supervisor,
+ JOB_ALT_CAPTAIN = /datum/alt_title/captain)
/*
@@ -45,11 +50,22 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
/datum/job/captain/get_access()
return get_all_station_access().Copy()
+/datum/job/captain/get_request_reasons()
+ return list("Training crew", "Assembling expedition team")
// Captain Alt Titles
/datum/alt_title/overseer
title = JOB_ALT_OVERSEER
+/datum/alt_title/facility_director
+ title = JOB_ALT_FACILITY_DIRECTOR
+
+/datum/alt_title/chief_supervisor
+ title = JOB_ALT_CHIEF_SUPERVISOR
+
+/datum/alt_title/captain
+ title = JOB_ALT_CAPTAIN
+
//////////////////////////////////
// Head of Personnel
//////////////////////////////////
@@ -75,29 +91,42 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
ideal_age_by_species = list(SPECIES_UNATHI = 140, SPECIES_TESHARI = 27, "mechanical" = 20, SPECIES_HUMAN_VATBORN = 20)
banned_job_species = list(SPECIES_PROMETHEAN, SPECIES_ZADDAT, "digital", SPECIES_DIONA)
+ disallow_jobhop = TRUE
+ pto_type = PTO_CIVILIAN
+ departments = list(DEPARTMENT_COMMAND, DEPARTMENT_CIVILIAN)
+ departments_managed = list(DEPARTMENT_CIVILIAN, DEPARTMENT_CARGO, DEPARTMENT_PLANET)
+ dept_time_required = 60
+
outfit_type = /decl/hierarchy/outfit/job/hop
job_description = "The " + JOB_HEAD_OF_PERSONNEL + " manages the Service department, the Exploration team, and most other civilians. They also \
manage the Supply department, through the " + JOB_QUARTERMASTER + ". In addition, the " + JOB_HEAD_OF_PERSONNEL + " oversees the personal accounts \
of the crew, including their money and access. If necessary, the " + JOB_HEAD_OF_PERSONNEL + " is first in line to assume Acting Command."
- alt_titles = list(JOB_ALT_CREW_RESOURCE_OFFICER = /datum/alt_title/cro)
- access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers,
- access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
- access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
- access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
- access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
- access_hop, access_RC_announce, access_keycard_auth, access_gateway)
- minimal_access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers,
- access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
- access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
- access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
- access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
- access_hop, access_RC_announce, access_keycard_auth, access_gateway)
+ access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers, access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, access_hop, access_RC_announce, access_clown, access_tomfoolery, access_mime, access_keycard_auth, access_gateway, access_entertainment)
+ minimal_access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers,access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, access_hop, access_RC_announce, access_clown, access_tomfoolery, access_mime, access_keycard_auth, access_gateway, access_entertainment)
+
+ alt_titles = list(JOB_ALT_CREW_RESOURCE_OFFICER = /datum/alt_title/cro, JOB_ALT_DEPUTY_MANAGER = /datum/alt_title/deputy_manager, JOB_ALT_STAFF_MANAGER = /datum/alt_title/staff_manager,
+ JOB_ALT_FACILITY_STEWARD = /datum/alt_title/facility_steward, JOB_ALT_FIRST_MATE = /datum/alt_title/first_mate)
+
+/datum/job/hop/get_request_reasons()
+ return list("ID modification", "Training crew", "Assembling expedition team")
// HOP Alt Titles
/datum/alt_title/cro
title = JOB_ALT_CREW_RESOURCE_OFFICER
+/datum/alt_title/deputy_manager
+ title = JOB_ALT_DEPUTY_MANAGER
+
+/datum/alt_title/staff_manager
+ title = JOB_ALT_STAFF_MANAGER
+
+/datum/alt_title/facility_steward
+ title = JOB_ALT_FACILITY_STEWARD
+
+/datum/alt_title/first_mate
+ title = JOB_ALT_FIRST_MATE
+
//////////////////////////////////
// Command Secretary
//////////////////////////////////
@@ -116,9 +145,29 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
minimal_player_age = 5
economic_modifier = 7
+ disallow_jobhop = TRUE
+ pto_type = PTO_CIVILIAN
+ alt_titles = list(JOB_ALT_COMMAND_LIAISON = /datum/alt_title/command_liaison, JOB_ALT_COMMAND_ASSISTANT = /datum/alt_title/command_assistant, JOB_ALT_COMMAND_INTERN = /datum/alt_title/command_intern,
+ JOB_ALT_BRIDGE_SECRETARY = /datum/alt_title/bridge_secretary, JOB_ALT_BRIDGE_ASSISTANT = /datum/alt_title/bridge_assistant)
+
access = list(access_heads, access_keycard_auth)
minimal_access = list(access_heads, access_keycard_auth)
outfit_type = /decl/hierarchy/outfit/job/secretary
job_description = "A " + JOB_COMMAND_SECRETARY + " handles paperwork duty for the Heads of Staff, so they can better focus on managing their departments. \
They are not Heads of Staff, and have no real authority."
+
+/datum/alt_title/command_liaison
+ title = JOB_ALT_COMMAND_LIAISON
+
+/datum/alt_title/command_assistant
+ title = JOB_ALT_COMMAND_ASSISTANT
+
+/datum/alt_title/command_intern
+ title = JOB_ALT_COMMAND_INTERN
+
+/datum/alt_title/bridge_secretary
+ title = JOB_ALT_BRIDGE_SECRETARY
+
+/datum/alt_title/bridge_assistant
+ title = JOB_ALT_BRIDGE_ASSISTANT
diff --git a/code/game/jobs/job/captain_vr.dm b/code/game/jobs/job/captain_vr.dm
deleted file mode 100644
index c127d8dfd4..0000000000
--- a/code/game/jobs/job/captain_vr.dm
+++ /dev/null
@@ -1,78 +0,0 @@
-/datum/job/captain
- disallow_jobhop = TRUE
- pto_type = PTO_CIVILIAN
- dept_time_required = 80 //Pending something more complicated
- alt_titles = list(JOB_ALT_OVERSEER= /datum/alt_title/overseer, JOB_ALT_FACILITY_DIRECTOR = /datum/alt_title/facility_director, JOB_ALT_CHIEF_SUPERVISOR = /datum/alt_title/chief_supervisor,
- JOB_ALT_CAPTAIN = /datum/alt_title/captain)
-
-/datum/alt_title/facility_director
- title = JOB_ALT_FACILITY_DIRECTOR
-
-/datum/alt_title/chief_supervisor
- title = JOB_ALT_CHIEF_SUPERVISOR
-
-/datum/alt_title/captain
- title = JOB_ALT_CAPTAIN
-
-/datum/job/captain/get_request_reasons()
- return list("Training crew", "Assembling expedition team")
-
-/datum/job/hop
- disallow_jobhop = TRUE
- pto_type = PTO_CIVILIAN
- departments = list(DEPARTMENT_COMMAND, DEPARTMENT_CIVILIAN)
- departments_managed = list(DEPARTMENT_CIVILIAN, DEPARTMENT_CARGO, DEPARTMENT_PLANET)
- dept_time_required = 60
-
- alt_titles = list(JOB_ALT_CREW_RESOURCE_OFFICER = /datum/alt_title/cro, JOB_ALT_DEPUTY_MANAGER = /datum/alt_title/deputy_manager, JOB_ALT_STAFF_MANAGER = /datum/alt_title/staff_manager,
- JOB_ALT_FACILITY_STEWARD = /datum/alt_title/facility_steward, JOB_ALT_FIRST_MATE = /datum/alt_title/first_mate)
-
- access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers,
- access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
- access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
- access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
- access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
- access_hop, access_RC_announce, access_clown, access_tomfoolery, access_mime, access_keycard_auth, access_gateway, access_entertainment)
- minimal_access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers,
- access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
- access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
- access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
- access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
- access_hop, access_RC_announce, access_clown, access_tomfoolery, access_mime, access_keycard_auth, access_gateway, access_entertainment)
-
-/datum/alt_title/deputy_manager
- title = JOB_ALT_DEPUTY_MANAGER
-
-/datum/alt_title/staff_manager
- title = JOB_ALT_STAFF_MANAGER
-
-/datum/alt_title/facility_steward
- title = JOB_ALT_FACILITY_STEWARD
-
-/datum/alt_title/first_mate
- title = JOB_ALT_FIRST_MATE
-
-/datum/job/hop/get_request_reasons()
- return list("ID modification", "Training crew", "Assembling expedition team")
-
-
-/datum/job/secretary
- disallow_jobhop = TRUE
- pto_type = PTO_CIVILIAN
- alt_titles = list(JOB_ALT_COMMAND_LIAISON = /datum/alt_title/command_liaison, JOB_ALT_COMMAND_ASSISTANT = /datum/alt_title/command_assistant, JOB_ALT_COMMAND_INTERN = /datum/alt_title/command_intern,
- JOB_ALT_BRIDGE_SECRETARY = /datum/alt_title/bridge_secretary, JOB_ALT_BRIDGE_ASSISTANT = /datum/alt_title/bridge_assistant)
-
-/datum/alt_title/command_liaison
- title = JOB_ALT_COMMAND_LIAISON
-
-/datum/alt_title/command_assistant
- title = JOB_ALT_COMMAND_ASSISTANT
-
-/datum/alt_title/command_intern
- title = JOB_ALT_COMMAND_INTERN
-
-/datum/alt_title/bridge_secretary
- title = JOB_ALT_BRIDGE_SECRETARY
-
-/datum/alt_title/bridge_assistant
- title = JOB_ALT_BRIDGE_ASSISTANT
diff --git a/code/game/jobs/job/cargo.dm b/code/game/jobs/job/cargo.dm
new file mode 100644
index 0000000000..ad56749de6
--- /dev/null
+++ b/code/game/jobs/job/cargo.dm
@@ -0,0 +1,122 @@
+//Cargo
+//////////////////////////////////
+// Quartermaster
+//////////////////////////////////
+/datum/job/qm
+ title = JOB_QUARTERMASTER
+ flag = QUARTERMASTER
+ departments = list(DEPARTMENT_CARGO)
+ sorting_order = 1 // QM is above the cargo techs, but below the HoP.
+ departments_managed = list(DEPARTMENT_CARGO)
+ department_flag = CIVILIAN
+ faction = FACTION_STATION
+ total_positions = 1
+ spawn_positions = 1
+ pto_type = PTO_CARGO
+ supervisors = "the " + JOB_HEAD_OF_PERSONNEL
+ selection_color = "#9b633e"
+ economic_modifier = 5
+ access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station, access_RC_announce)
+ minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station, access_RC_announce)
+ banned_job_species = list("digital", SPECIES_PROMETHEAN)
+
+ ideal_character_age = 40
+ dept_time_required = 20
+
+ outfit_type = /decl/hierarchy/outfit/job/cargo/qm
+ job_description = "The " + JOB_QUARTERMASTER + " manages the Supply department, checking cargo orders and ensuring supplies get to where they are needed."
+ alt_titles = list(JOB_ALT_SUPPLY_CHIEF = /datum/alt_title/supply_chief, JOB_ALT_LOGISTICS_MANAGER = /datum/alt_title/logistics_manager, JOB_ALT_CARGO_SUPERVISOR = /datum/alt_title/cargo_supervisor)
+
+/datum/job/qm/get_request_reasons()
+ return list("Training crew")
+
+// Quartermaster Alt Titles
+/datum/alt_title/supply_chief
+ title = JOB_ALT_SUPPLY_CHIEF
+
+/datum/alt_title/logistics_manager
+ title = JOB_ALT_LOGISTICS_MANAGER
+
+/datum/alt_title/cargo_supervisor
+ title = JOB_ALT_CARGO_SUPERVISOR
+
+//////////////////////////////////
+// Cargo Tech
+//////////////////////////////////
+/datum/job/cargo_tech
+ title = JOB_CARGO_TECHNICIAN
+ flag = CARGOTECH
+ departments = list(DEPARTMENT_CARGO)
+ department_flag = CIVILIAN
+ faction = FACTION_STATION
+ total_positions = 3
+ spawn_positions = 3
+ pto_type = PTO_CARGO
+ supervisors = "the " + JOB_QUARTERMASTER + " and the " + JOB_HEAD_OF_PERSONNEL
+ selection_color = "#7a4f33"
+ access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_mining, access_mining_station)
+ minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting)
+
+ outfit_type = /decl/hierarchy/outfit/job/cargo/cargo_tech
+ job_description = "A " + JOB_CARGO_TECHNICIAN + " fills and delivers cargo orders. They are encouraged to return delivered crates to the Cargo Shuttle, \
+ because Central Command gives a partial refund."
+
+ alt_titles = list(JOB_ALT_CARGO_LOADER = /datum/alt_title/cargo_loader, JOB_ALT_CARGO_HANDLER = /datum/alt_title/cargo_handler, JOB_ALT_SUPPLY_COURIER = /datum/alt_title/supply_courier,
+ JOB_ALT_DISPOSALS_SORTER = /datum/alt_title/disposal_sorter)
+
+/datum/alt_title/supply_courier
+ title = JOB_ALT_SUPPLY_COURIER
+ title_blurb = "A " + JOB_ALT_SUPPLY_COURIER + " is usually tasked with delivering packages or cargo directly to whoever requires it."
+
+/datum/alt_title/cargo_loader
+ title = JOB_ALT_CARGO_LOADER
+ title_blurb = "A " + JOB_ALT_CARGO_LOADER + " is usually tasked with more menial labor within Supply department, such as loading and unloading supply shuttle."
+
+/datum/alt_title/cargo_handler
+ title = JOB_ALT_CARGO_HANDLER
+ title_blurb = "A " + JOB_ALT_CARGO_HANDLER + " is usually tasked with more menial labor within Supply department, such as loading and unloading supply shuttle."
+
+/datum/alt_title/disposal_sorter
+ title = JOB_ALT_DISPOSALS_SORTER
+ title_blurb = "A " + JOB_ALT_DISPOSALS_SORTER + " is usually tasked with operating disposals delivery system, sorting the trash and tagging parcels for delivery."
+
+//////////////////////////////////
+// Shaft Miner
+//////////////////////////////////
+
+/datum/job/mining
+ title = JOB_SHAFT_MINER
+ flag = MINER
+ departments = list(DEPARTMENT_CARGO)
+ department_flag = CIVILIAN
+ faction = FACTION_STATION
+ total_positions = 4
+ spawn_positions = 4
+ pto_type = PTO_CARGO
+ supervisors = "the " + JOB_QUARTERMASTER + " and the " + JOB_HEAD_OF_PERSONNEL
+ selection_color = "#7a4f33"
+ economic_modifier = 5
+ access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_mining, access_mining_station)
+ minimal_access = list(access_mining, access_mining_station, access_mailsorting)
+
+ outfit_type = /decl/hierarchy/outfit/job/cargo/mining
+ job_description = "A " + JOB_SHAFT_MINER + " mines and processes minerals to be delivered to departments that need them."
+ alt_titles = list(JOB_ALT_DEEP_SPACE_MINER = /datum/alt_title/deep_space_miner, JOB_ALT_DRILL_TECHNICIAN = /datum/alt_title/drill_tech, JOB_ALT_PROSPECTOR = /datum/alt_title/prospector,
+ JOB_ALT_EXCAVATOR = /datum/alt_title/excavator)
+
+/datum/job/mining/get_request_reasons()
+ return list("Assembling expedition team")
+
+/datum/alt_title/drill_tech
+ title = JOB_ALT_DRILL_TECHNICIAN
+ title_blurb = "A " + JOB_ALT_DRILL_TECHNICIAN + " specializes in operating and maintaining the machinery needed to extract ore from veins deep below the surface."
+
+/datum/alt_title/deep_space_miner
+ title = JOB_ALT_DEEP_SPACE_MINER
+ title_blurb = "A " + JOB_ALT_DEEP_SPACE_MINER + " specializes primarily in mining operations in zero-g environments, mostly in asteroid and debris fields."
+
+/datum/alt_title/prospector
+ title = JOB_ALT_PROSPECTOR
+
+/datum/alt_title/excavator
+ title = JOB_ALT_EXCAVATOR
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index 663edab0a4..0604b872e4 100644
--- a/code/game/jobs/job/civilian.dm
+++ b/code/game/jobs/job/civilian.dm
@@ -12,6 +12,7 @@
faction = FACTION_STATION
total_positions = 2
spawn_positions = 2
+ pto_type = PTO_CIVILIAN
supervisors = "the " + JOB_HEAD_OF_PERSONNEL
selection_color = "#515151"
access = list(access_hydroponics, access_bar, access_kitchen)
@@ -19,7 +20,7 @@
outfit_type = /decl/hierarchy/outfit/job/service/bartender
job_description = "A " + JOB_BARTENDER + " mixes drinks for the crew. They generally have permission to charge for drinks or deny service to unruly patrons."
- alt_titles = list(JOB_ALT_BARISTA = /datum/alt_title/barista)
+ alt_titles = list(JOB_ALT_BARKEEPR = /datum/alt_title/barkeeper, JOB_ALT_BARMAID = /datum/alt_title/barmaid, JOB_ALT_BARISTA = /datum/alt_title/barista, JOB_ALT_MIXOLOGIST = /datum/alt_title/mixologist)
// Bartender Alt Titles
/datum/alt_title/barista
@@ -28,6 +29,15 @@
or deny service to unruly patrons."
title_outfit = /decl/hierarchy/outfit/job/service/bartender/barista
+/datum/alt_title/barkeeper
+ title = JOB_ALT_BARKEEPR
+
+/datum/alt_title/barmaid
+ title = JOB_ALT_BARMAID
+
+/datum/alt_title/mixologist
+ title = JOB_ALT_MIXOLOGIST
+
//////////////////////////////////
// Chef
//////////////////////////////////
@@ -40,6 +50,7 @@
faction = FACTION_STATION
total_positions = 2
spawn_positions = 2
+ pto_type = PTO_CIVILIAN
supervisors = "the "+ JOB_HEAD_OF_PERSONNEL
selection_color = "#515151"
access = list(access_hydroponics, access_bar, access_kitchen)
@@ -47,13 +58,20 @@
outfit_type = /decl/hierarchy/outfit/job/service/chef
job_description = "A " + JOB_CHEF + " cooks food for the crew. They generally have permission to charge for food or deny service to unruly diners."
- alt_titles = list(JOB_ALT_COOK = /datum/alt_title/cook)
+ alt_titles = list(JOB_ALT_SOUSCHEF = /datum/alt_title/souschef, JOB_ALT_COOK = /datum/alt_title/cook, JOB_ALT_KITCHEN_WORKER = /datum/alt_title/kitchen_worker)
// Chef Alt Titles
/datum/alt_title/cook
title = JOB_ALT_COOK
title_blurb = "A " + JOB_ALT_COOK + " has the same duties, though they may be less experienced."
+/datum/alt_title/souschef
+ title = JOB_ALT_SOUSCHEF
+
+/datum/alt_title/kitchen_worker
+ title = JOB_ALT_KITCHEN_WORKER
+ title_blurb = "A " + JOB_ALT_KITCHEN_WORKER + " has the same duties, though they may be less experienced."
+
//////////////////////////////////
// Botanist
//////////////////////////////////
@@ -66,6 +84,7 @@
faction = FACTION_STATION
total_positions = 2
spawn_positions = 2
+ pto_type = PTO_CIVILIAN
supervisors = "the " + JOB_HEAD_OF_PERSONNEL
selection_color = "#515151"
access = list(access_hydroponics, access_bar, access_kitchen)
@@ -73,89 +92,30 @@
outfit_type = /decl/hierarchy/outfit/job/service/gardener
job_description = "A " + JOB_BOTANIST+ " grows plants for the " + JOB_CHEF + " and " + JOB_BARTENDER + "."
- alt_titles = list(JOB_ALT_GARDENER = /datum/alt_title/gardener)
+ alt_titles = list(JOB_ALT_HYDROPONICIST = /datum/alt_title/hydroponicist, JOB_ALT_CULTIVATOR = /datum/alt_title/cultivator, JOB_ALT_FARMER = /datum/alt_title/farmer,
+ JOB_ALT_GARDENER = /datum/alt_title/gardener, JOB_ALT_FLORIST = /datum/alt_title/florsit, JOB_ALT_RANCHER = /datum/alt_title/rancher)
//Botanist Alt Titles
/datum/alt_title/gardener
title = JOB_ALT_GARDENER
title_blurb = "A " + JOB_ALT_GARDENER + " may be less professional than their counterparts, and are more likely to tend to the public gardens if they aren't needed elsewhere."
-//Cargo
-//////////////////////////////////
-// Quartermaster
-//////////////////////////////////
-/datum/job/qm
- title = JOB_QUARTERMASTER
- flag = QUARTERMASTER
- departments = list(DEPARTMENT_CARGO)
- sorting_order = 1 // QM is above the cargo techs, but below the HoP.
- departments_managed = list(DEPARTMENT_CARGO)
- department_flag = CIVILIAN
- faction = FACTION_STATION
- total_positions = 1
- spawn_positions = 1
- supervisors = "the " + JOB_HEAD_OF_PERSONNEL
- selection_color = "#9b633e"
- economic_modifier = 5
- access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station, access_RC_announce)
- minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station, access_RC_announce)
- banned_job_species = list("digital", SPECIES_PROMETHEAN)
+/datum/alt_title/hydroponicist
+ title = JOB_ALT_HYDROPONICIST
- ideal_character_age = 40
+/datum/alt_title/cultivator
+ title = JOB_ALT_CULTIVATOR
- outfit_type = /decl/hierarchy/outfit/job/cargo/qm
- job_description = "The " + JOB_QUARTERMASTER + " manages the Supply department, checking cargo orders and ensuring supplies get to where they are needed."
- alt_titles = list(JOB_ALT_SUPPLY_CHIEF = /datum/alt_title/supply_chief)
+/datum/alt_title/farmer
+ title = JOB_ALT_FARMER
-// Quartermaster Alt Titles
-/datum/alt_title/supply_chief
- title = JOB_ALT_SUPPLY_CHIEF
+/datum/alt_title/florsit
+ title = JOB_ALT_FLORIST
+ title_blurb = "A " + JOB_ALT_FLORIST + " may be less professional than their counterparts, and are more likely to tend to the public gardens if they aren't needed elsewhere."
-//////////////////////////////////
-// Cargo Tech
-//////////////////////////////////
-/datum/job/cargo_tech
- title = JOB_CARGO_TECHNICIAN
- flag = CARGOTECH
- departments = list(DEPARTMENT_CARGO)
- department_flag = CIVILIAN
- faction = FACTION_STATION
- total_positions = 2
- spawn_positions = 2
- supervisors = "the " + JOB_QUARTERMASTER + " and the " + JOB_HEAD_OF_PERSONNEL
- selection_color = "#7a4f33"
- access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_mining, access_mining_station)
- minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting)
-
- outfit_type = /decl/hierarchy/outfit/job/cargo/cargo_tech
- job_description = "A " + JOB_CARGO_TECHNICIAN + " fills and delivers cargo orders. They are encouraged to return delivered crates to the Cargo Shuttle, \
- because Central Command gives a partial refund."
-
-//////////////////////////////////
-// Shaft Miner
-//////////////////////////////////
-
-/datum/job/mining
- title = JOB_SHAFT_MINER
- flag = MINER
- departments = list(DEPARTMENT_CARGO)
- department_flag = CIVILIAN
- faction = FACTION_STATION
- total_positions = 3
- spawn_positions = 3
- supervisors = "the " + JOB_QUARTERMASTER + " and the " + JOB_HEAD_OF_PERSONNEL
- selection_color = "#7a4f33"
- economic_modifier = 5
- access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_mining, access_mining_station)
- minimal_access = list(access_mining, access_mining_station, access_mailsorting)
-
- outfit_type = /decl/hierarchy/outfit/job/cargo/mining
- job_description = "A " + JOB_SHAFT_MINER + " mines and processes minerals to be delivered to departments that need them."
- alt_titles = list(JOB_ALT_DRILL_TECHNICIAN = /datum/alt_title/drill_tech)
-
-/datum/alt_title/drill_tech
- title = JOB_ALT_DRILL_TECHNICIAN
- title_blurb = "A " + JOB_ALT_DRILL_TECHNICIAN + " specializes in operating and maintaining the machinery needed to extract ore from veins deep below the surface."
+/datum/alt_title/rancher
+ title = JOB_ALT_RANCHER
+ title_blurb = "A " + JOB_ALT_RANCHER + " is tasked with the care, feeding, raising, and harvesting of livestock."
//Service
//////////////////////////////////
@@ -167,8 +127,9 @@
departments = list(DEPARTMENT_CIVILIAN)
department_flag = CIVILIAN
faction = FACTION_STATION
- total_positions = 2
- spawn_positions = 2
+ total_positions = 3
+ spawn_positions = 3
+ pto_type = PTO_CIVILIAN
supervisors = "the " + JOB_HEAD_OF_PERSONNEL
selection_color = "#515151"
access = list(access_janitor, access_maint_tunnels)
@@ -176,12 +137,23 @@
outfit_type = /decl/hierarchy/outfit/job/service/janitor
job_description = "A " + JOB_JANITOR + " keeps the station clean, as long as it doesn't interfere with active crime scenes."
- alt_titles = list(JOB_ALT_CUSTODIAN = /datum/alt_title/custodian)
+ alt_titles = list(JOB_ALT_CUSTODIAN = /datum/alt_title/custodian, JOB_ALT_SANITATION_TECHNICIAN = /datum/alt_title/sanitation_tech,
+ JOB_ALT_MAID = /datum/alt_title/maid, JOB_ALT_GARBAGE_COLLECTOR = /datum/alt_title/garbage_collector)
// Janitor Alt Titles
/datum/alt_title/custodian
title = JOB_ALT_CUSTODIAN
+/datum/alt_title/sanitation_tech
+ title = JOB_ALT_SANITATION_TECHNICIAN
+
+/datum/alt_title/maid
+ title = JOB_ALT_MAID
+
+/datum/alt_title/garbage_collector
+ title = JOB_ALT_GARBAGE_COLLECTOR
+ title_blurb = "A " + JOB_ALT_GARBAGE_COLLECTOR + " keeps the station clean, though focuses moreso on collecting larger trash, with wet cleaning being secondary task."
+
//More or less assistants
//////////////////////////////////
// Librarian
@@ -192,8 +164,9 @@
departments = list(DEPARTMENT_CIVILIAN)
department_flag = CIVILIAN
faction = FACTION_STATION
- total_positions = 1
- spawn_positions = 1
+ total_positions = 2
+ spawn_positions = 2
+ pto_type = PTO_CIVILIAN
supervisors = "the " + JOB_HEAD_OF_PERSONNEL
selection_color = "#515151"
access = list(access_library, access_maint_tunnels)
@@ -201,7 +174,9 @@
outfit_type = /decl/hierarchy/outfit/job/librarian
job_description = "The " + JOB_LIBRARIAN + " curates the book selection in the Library, so the crew might enjoy it."
- alt_titles = list(JOB_ALT_JOURNALIST = /datum/alt_title/journalist, JOB_ALT_WRITER = /datum/alt_title/writer)
+ alt_titles = list(JOB_ALT_JOURNALIST = /datum/alt_title/journalist, JOB_ALT_REPORTER = /datum/alt_title/reporter, JOB_ALT_WRITER = /datum/alt_title/writer,
+ JOB_ALT_HISTORIAN = /datum/alt_title/historian, JOB_ALT_ARCHIVIST = /datum/alt_title/archivist, JOB_ALT_PROFESSOR = /datum/alt_title/professor,
+ JOB_ALT_ACADEMIC = /datum/alt_title/academic, JOB_ALT_PHILOSOPHER = /datum/alt_title/philosopher, JOB_ALT_CURATOR = /datum/alt_title/curator)
// Librarian Alt Titles
/datum/alt_title/journalist
@@ -213,6 +188,34 @@
title = JOB_ALT_WRITER
title_blurb = "The " + JOB_ALT_WRITER + " uses the Library as a quiet place to write whatever it is they choose to write."
+/datum/alt_title/reporter
+ title = JOB_ALT_REPORTER
+ title_blurb = "The " + JOB_ALT_REPORTER + " uses the Library as a base of operations, from which they can report the news and goings-on on the station with their camera."
+
+/datum/alt_title/historian
+ title = JOB_ALT_HISTORIAN
+ title_blurb = "The " + JOB_ALT_HISTORIAN + " uses the Library as a base of operation to record any important events occurring on station."
+
+/datum/alt_title/archivist
+ title = JOB_ALT_ARCHIVIST
+ title_blurb = "The " + JOB_ALT_ARCHIVIST + " uses the Library as a base of operation to record any important events occurring on station."
+
+/datum/alt_title/professor
+ title = JOB_ALT_PROFESSOR
+ title_blurb = "The " + JOB_ALT_PROFESSOR + " uses the Library as a base of operations to share their vast knowledge with the crew."
+
+/datum/alt_title/academic
+ title = JOB_ALT_ACADEMIC
+ title_blurb = "The " + JOB_ALT_ACADEMIC + " uses the Library as a base of operations to share their vast knowledge with the crew."
+
+/datum/alt_title/philosopher
+ title = JOB_ALT_PHILOSOPHER
+ title_blurb = "The " + JOB_ALT_PHILOSOPHER + " uses the Library as a base of operation to ruminate on nature of life and other great questions, and share their opinions with the crew."
+
+/datum/alt_title/curator
+ title = JOB_ALT_CURATOR
+ title_blurb = "The " + JOB_ALT_CURATOR + " uses the Library as a base of operation to gather the finest of art for display and preservation."
+
//////////////////////////////////
// Internal Affairs Agent
//////////////////////////////////
@@ -226,6 +229,8 @@
faction = FACTION_STATION
total_positions = 2
spawn_positions = 2
+ pto_type = PTO_CIVILIAN
+ disallow_jobhop = TRUE
supervisors = "company officials and Corporate Regulations"
selection_color = "#515151"
economic_modifier = 7
@@ -238,10 +243,233 @@
job_description = "An " + JOB_INTERNAL_AFFAIRS_AGENT + " makes sure that the crew is following Standard Operating Procedure. They also \
handle complaints against crew members, and can have issues brought to the attention of Central Command, \
assuming their paperwork is in order."
+ alt_titles = list(JOB_ALT_INTERNAL_AFFAIRS_LIAISON = /datum/alt_title/ia_liaison, JOB_ALT_INTERNAL_AFFAIRS_DELEGATE = /datum/alt_title/ia_delegate,
+ JOB_ALT_INTERNAL_AFFAIRS_INVESTIGATOR = /datum/alt_title/ia_investigator)
-/*
-/datum/job/lawyer/equip(var/mob/living/carbon/human/H)
- . = ..()
- if(.)
- H.implant_loyalty(H)
-*/
+/datum/alt_title/ia_liaison
+ title = JOB_ALT_INTERNAL_AFFAIRS_LIAISON
+
+/datum/alt_title/ia_delegate
+ title = JOB_ALT_INTERNAL_AFFAIRS_DELEGATE
+
+/datum/alt_title/ia_investigator
+ title = JOB_ALT_INTERNAL_AFFAIRS_INVESTIGATOR
+
+//////////////////////////////////
+// Pilot
+//////////////////////////////////
+
+/datum/job/pilot
+ title = JOB_PILOT
+ flag = PILOT
+ departments = list(DEPARTMENT_CIVILIAN)
+ department_flag = CIVILIAN
+ faction = FACTION_STATION
+ total_positions = 2
+ spawn_positions = 2
+ supervisors = "the " + JOB_HEAD_OF_PERSONNEL
+ selection_color = "#515151"
+ economic_modifier = 5
+ minimal_player_age = 3
+ pto_type = PTO_CIVILIAN
+ access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot)
+ minimal_access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot)
+ outfit_type = /decl/hierarchy/outfit/job/pilot
+ job_description = "A " + JOB_PILOT + " flies the various shuttles in the Virgo-Erigone System."
+ alt_titles = list(JOB_ALT_COPILOT = /datum/alt_title/co_pilot, JOB_ALT_NAVIGATOR = /datum/alt_title/navigator, JOB_ALT_HELMSMAN = /datum/alt_title/helmsman)
+
+/datum/alt_title/co_pilot
+ title = JOB_ALT_COPILOT
+ title_blurb = "A Co-" + JOB_ALT_COPILOT + " is there primarily to assist main pilot as well as learn from them"
+
+/datum/alt_title/navigator
+ title = JOB_ALT_NAVIGATOR
+
+/datum/alt_title/helmsman
+ title = JOB_ALT_HELMSMAN
+
+/datum/job/pilot/get_request_reasons()
+ return list("Assembling expedition team")
+
+//////////////////////////////////
+// Entertainer
+//////////////////////////////////
+
+/datum/job/entertainer
+ title = JOB_ENTERTAINER
+ flag = ENTERTAINER
+ departments = list(DEPARTMENT_CIVILIAN)
+ department_flag = CIVILIAN
+ faction = FACTION_STATION
+ total_positions = 4
+ spawn_positions = 4
+ supervisors = "the " + JOB_HEAD_OF_PERSONNEL
+ selection_color = "#515151"
+ access = list(access_entertainment)
+ minimal_access = list(access_entertainment)
+ pto_type = PTO_CIVILIAN
+
+ outfit_type = /decl/hierarchy/outfit/job/assistant/entertainer
+ job_description = "An " + JOB_ENTERTAINER + " does just that, entertains! Put on plays, play music, sing songs, tell stories, or read your favorite fanfic."
+ alt_titles = list(JOB_ALT_PERFORMER = /datum/alt_title/performer, JOB_ALT_MUSICIAN = /datum/alt_title/musician, JOB_ALT_STAGEHAND = /datum/alt_title/stagehand,
+ JOB_ALT_ACTOR = /datum/alt_title/actor, JOB_ALT_DANCER = /datum/alt_title/dancer, JOB_ALT_SINGER = /datum/alt_title/singer,
+ JOB_ALT_MAGICIAN = /datum/alt_title/magician, JOB_ALT_COMEDIAN = /datum/alt_title/comedian, JOB_ALT_ARTIST = /datum/alt_title/tragedian,
+ JOB_ALT_ARTIST = /datum/alt_title/artist, JOB_ALT_GAME_MASTER = /datum/alt_title/game_master)
+
+// Entertainer Alt Titles
+/datum/alt_title/actor
+ title = JOB_ALT_ACTOR
+ title_blurb = "An " + JOB_ALT_ACTOR + " is someone who acts out a role! Whatever sort of character it is, get into it and impress people with power of comedy and tragedy!"
+
+/datum/alt_title/performer
+ title = JOB_ALT_PERFORMER
+ title_blurb = "A " + JOB_ALT_PERFORMER + " is someone who performs! Whatever sort of performance will come to your mind, the world's a stage!"
+
+/datum/alt_title/musician
+ title = JOB_ALT_MUSICIAN
+ title_blurb = "A " + JOB_ALT_MUSICIAN + " is someone who makes music with a wide variety of musical instruments!"
+
+/datum/alt_title/stagehand
+ title = JOB_ALT_STAGEHAND
+ title_blurb = "A " + JOB_ALT_STAGEHAND + " typically performs everything the rest of the entertainers don't. Operate lights, shutters, windows, or narrate through your voicebox!"
+
+/datum/alt_title/dancer
+ title = JOB_ALT_DANCER
+ title_blurb = "A " + JOB_ALT_DANCER + " is someone who impresses people through power of their own body! From waltz to breakdance, as long as crowd as cheering!"
+
+/datum/alt_title/singer
+ title = JOB_ALT_SINGER
+ title_blurb = "A " + JOB_ALT_SINGER + " is someone with gift of melodious voice! Impress people with your vocal range!"
+
+/datum/alt_title/magician
+ title = JOB_ALT_MAGICIAN
+ title_blurb = "A " + JOB_ALT_MAGICIAN + " is someone who awes those around them with impossible! Show off your repertoire of magic tricks, while keeping the secret hidden!"
+
+/datum/alt_title/comedian
+ title = JOB_ALT_COMEDIAN
+ title_blurb = "A " + JOB_ALT_COMEDIAN + " will focus on making people laugh with the power of wit! Telling jokes, stand-up comedy, you are here to make others smile!"
+
+/datum/alt_title/tragedian
+ title = JOB_ALT_ARTIST
+ title_blurb = "A " + JOB_ALT_ARTIST + " will focus on making people think about life and world around them! Life is a tragedy, and who's better to convey its emotions than you?"
+
+/datum/alt_title/artist
+ title = JOB_ALT_ARTIST
+ title_blurb = "An " + JOB_ALT_ARTIST + "'s calling is to create beautiful arts! Whatever form may they take, create and have people astonished with your creativity."
+
+/datum/alt_title/game_master
+ title = JOB_ALT_GAME_MASTER
+ title_blurb = "A " + JOB_ALT_GAME_MASTER + " provides recreation for the crew by hosting variety of games. From cards to roleplaying to something more personalized."
+
+//////////////////////////////////
+// Entrepreneur
+//////////////////////////////////
+
+/datum/job/entrepreneur
+ title = JOB_ENTREPRENEUR
+ flag = ENTREPRENEUR
+ departments = list(DEPARTMENT_CIVILIAN)
+ department_flag = CIVILIAN
+ faction = FACTION_STATION
+ total_positions = 4
+ spawn_positions = 4
+ supervisors = "the " + JOB_HEAD_OF_PERSONNEL
+ selection_color = "#515151"
+ access = list()
+ minimal_access = list()
+ pto_type = PTO_CIVILIAN
+
+ outfit_type = /decl/hierarchy/outfit/job/assistant/entrepreneur
+ job_description = "An " + JOB_ENTREPRENEUR + " is basically a visitor that obtained special permission to offer personal services to people on station. \
+ They will offer people these services and, potentially, even demand payment!"
+ alt_titles = list(JOB_ALT_LAWYER = /datum/alt_title/lawyer, JOB_ALT_PRIVATE_EYE = /datum/alt_title/private_eye, JOB_ALT_BODYGUARD = /datum/alt_title/bodyguard,
+ JOB_ALT_PERSONAL_PHYSICIAN = /datum/alt_title/personal_physician, JOB_ALT_DENTIST = /datum/alt_title/dentist, JOB_ALT_FITNESS_INSTRUCTOR = /datum/alt_title/fitness_instructor,
+ JOB_ALT_YOGA_TEACHER = /datum/alt_title/yoga_teacher, JOB_ALT_MASSEUSE = /datum/alt_title/masseuse, JOB_ALT_TRADESPERSON = /datum/alt_title/tradesperson,
+ JOB_ALT_STREAMER = /datum/alt_title/streamer, JOB_ALT_INFLUENCER = /datum/alt_title/influencer, JOB_ALT_PARANORMAL_INVESTIGATOR = /datum/alt_title/paranormal_investigator,
+ JOB_ALT_PERSONAL_SECRETARY = /datum/alt_title/personal_secretary, JOB_ALT_STYLIST = /datum/alt_title/stylist, JOB_ALT_FISHER = /datum/alt_title/fisher,
+ JOB_ALT_FORTUNE_TELLER = /datum/alt_title/fortune_teller, JOB_ALT_SPIRIT_HEALER = /datum/alt_title/spirit_healer)
+
+/datum/alt_title/lawyer
+ title = JOB_ALT_LAWYER
+ title_blurb = "A " + JOB_ALT_LAWYER + " is knowledgable in various legal systems, including station's operations. They can try to offer their legal counsel, although nobody is really obliged to listen."
+ title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/personal_secretary
+
+/datum/alt_title/private_eye
+ title = JOB_ALT_PRIVATE_EYE
+ title_blurb = "A " + JOB_ALT_PRIVATE_EYE + " is a detective that has no credentials or equipment. But if someone wants something found without security's knowledge, they are the one to go to."
+ title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/private_eye
+
+/datum/alt_title/bodyguard
+ title = JOB_ALT_BODYGUARD
+ title_blurb = "A " + JOB_ALT_BODYGUARD + " offers service of personal protection. They may not be allowed any weapons, but their own body is weapon enough."
+ title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/bodyguard
+
+/datum/alt_title/personal_physician
+ title = JOB_ALT_PERSONAL_PHYSICIAN
+ title_blurb = "A " + JOB_ALT_PERSONAL_PHYSICIAN + " is a doctor dedicated less to Hippocratic Oath and more to the moneymaking grind. Their license may be expired, but the grindset never will be."
+ title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/personal_physician
+
+/datum/alt_title/dentist
+ title = JOB_ALT_DENTIST
+ title_blurb = "A " + JOB_ALT_DENTIST + " is a doctor that specializes in oral care. Company may not recognize them as a proper doctor, but surely their customers will."
+ title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/dentist
+
+/datum/alt_title/fitness_instructor
+ title = JOB_ALT_FITNESS_INSTRUCTOR
+ title_blurb = "A " + JOB_ALT_FITNESS_INSTRUCTOR + " dedicates themselves to improving the health of the crew through physical activity, and boy, do they need the help."
+ title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/fitness_instructor
+
+/datum/alt_title/yoga_teacher
+ title = JOB_ALT_YOGA_TEACHER
+ title_blurb = "A " + JOB_ALT_YOGA_TEACHER + " is similar to a fitness instructor, but rather than turning the round bodies into firm ones, they focus on helping people find balance and harmony."
+ title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/yoga_teacher
+
+/datum/alt_title/masseuse
+ title = JOB_ALT_MASSEUSE
+ title_blurb = "A " + JOB_ALT_MASSEUSE + " is master of physical therapy and working others' bodies with their hands."
+ title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/masseuse
+
+/datum/alt_title/tradesperson
+ title = JOB_ALT_TRADESPERSON
+ title_blurb = "A " + JOB_ALT_TRADESPERSON + " is someone attempting to make money via the most obvious act of all - buying and selling. Now if only customs allowed you to bring your goods along..."
+ title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/tradesperson
+
+/datum/alt_title/streamer
+ title = JOB_ALT_STREAMER
+ title_blurb = "A " + JOB_ALT_STREAMER + " is here to entertain. Not the crew! Their audience across exonet!"
+ title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/streamer
+
+/datum/alt_title/influencer
+ title = JOB_ALT_INFLUENCER
+ title_blurb = "An " + JOB_ALT_INFLUENCER + " has lucked out with some exonet following, and was given permission to go onstation to provide free exposure. Don't let it go to your head."
+ title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/influencer
+
+/datum/alt_title/paranormal_investigator
+ title = JOB_ALT_PARANORMAL_INVESTIGATOR
+ title_blurb = "A " + JOB_ALT_PARANORMAL_INVESTIGATOR + " looks beyond what is accepted by modern science, and searches for the true unknown. Aliens, alternate dimensions, ghosts... The truth is out there!"
+ title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/paranormal_investigator
+
+/datum/alt_title/personal_secretary
+ title = JOB_ALT_PERSONAL_SECRETARY
+ title_blurb = "A " + JOB_ALT_PERSONAL_SECRETARY + " offers services of general assistance. Although it's doubtful anyone will ever actually need those."
+ title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/personal_secretary
+
+/datum/alt_title/stylist
+ title = JOB_ALT_STYLIST
+ title_blurb = "A " + JOB_ALT_STYLIST + " offers fashion advice, as well as helps with adjusting appearance of the crew to better suit their beauty standards."
+ title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/stylist
+
+/datum/alt_title/fisher
+ title = JOB_ALT_FISHER
+ title_blurb = "A " + JOB_ALT_FISHER + " is a capable angler, who is good at obtaining large amounts of marine goods. Whether you generously give them to station or attempt to make a quick thaler by selling, it's up to you!"
+ title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/fisher
+
+/datum/alt_title/fortune_teller
+ title = JOB_ALT_FORTUNE_TELLER
+ title_blurb = "A " + JOB_ALT_FORTUNE_TELLER + " peers into the future, and offers these visions to others. Occasionally those visions may even come true!"
+ title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/fortune_teller
+
+/datum/alt_title/spirit_healer
+ title = JOB_ALT_SPIRIT_HEALER
+ title_blurb = "A " + JOB_ALT_SPIRIT_HEALER + " offers alternative forms of medicine. Rituals, magic rocks, seances... It totally works. What's that about placebo?"
+ title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/spirit_healer
diff --git a/code/game/jobs/job/civilian_chaplain.dm b/code/game/jobs/job/civilian_chaplain.dm
index 1220e3ee88..a980fd2325 100644
--- a/code/game/jobs/job/civilian_chaplain.dm
+++ b/code/game/jobs/job/civilian_chaplain.dm
@@ -7,6 +7,7 @@
faction = FACTION_STATION
total_positions = 1
spawn_positions = 1
+ pto_type = PTO_CIVILIAN
supervisors = "the " + JOB_HEAD_OF_PERSONNEL
selection_color = "#515151"
access = list(access_morgue, access_chapel_office, access_crematorium, access_maint_tunnels)
@@ -14,13 +15,34 @@
outfit_type = /decl/hierarchy/outfit/job/chaplain
job_description = "The " + JOB_CHAPLAIN + " ministers to the spiritual needs of the crew."
- alt_titles = list(JOB_ALT_COUNSELOR = /datum/alt_title/counselor)
+ alt_titles = list(JOB_ALT_MISSIONARY = /datum/alt_title/missionary, JOB_ALT_PREACHER = /datum/alt_title/preacher, JOB_ALT_PRIEST = /datum/alt_title/priest,
+ JOB_ALT_NUN = /datum/alt_title/nun, JOB_ALT_MONK = /datum/alt_title/monk, JOB_ALT_COUNSELOR = /datum/alt_title/counselor,
+ JOB_ALT_GURU = /datum/alt_title/guru)
// Chaplain Alt Titles
/datum/alt_title/counselor
title = JOB_ALT_COUNSELOR
title_blurb = "The " + JOB_ALT_COUNSELOR + " attends to the emotional needs of the crew, without a specific medicinal or spiritual focus."
+/datum/alt_title/guru
+ title = JOB_ALT_GURU
+ title_blurb = "The " + JOB_ALT_GURU + " primarily tries to offer spiritual guidance to those who come seeking it."
+
+/datum/alt_title/missionary
+ title = JOB_ALT_MISSIONARY
+
+/datum/alt_title/preacher
+ title = JOB_ALT_PREACHER
+
+/datum/alt_title/priest
+ title = JOB_ALT_PRIEST
+
+/datum/alt_title/nun
+ title = JOB_ALT_NUN
+
+/datum/alt_title/monk
+ title = JOB_ALT_MONK
+
/datum/job/chaplain/equip(var/mob/living/carbon/human/H, var/alt_title, var/ask_questions = TRUE)
. = ..()
if(!.)
diff --git a/code/game/jobs/job/civilian_vr.dm b/code/game/jobs/job/civilian_vr.dm
deleted file mode 100644
index bd4093e403..0000000000
--- a/code/game/jobs/job/civilian_vr.dm
+++ /dev/null
@@ -1,426 +0,0 @@
-/datum/job/bartender
- pto_type = PTO_CIVILIAN
- alt_titles = list(JOB_ALT_BARKEEPR = /datum/alt_title/barkeeper, JOB_ALT_BARMAID = /datum/alt_title/barmaid, JOB_ALT_BARISTA = /datum/alt_title/barista, JOB_ALT_MIXOLOGIST = /datum/alt_title/mixologist)
-
-/datum/alt_title/barkeeper
- title = JOB_ALT_BARKEEPR
-
-/datum/alt_title/barmaid
- title = JOB_ALT_BARMAID
-
-/datum/alt_title/mixologist
- title = JOB_ALT_MIXOLOGIST
-
-
-/datum/job/chef
- total_positions = 2 //IT TAKES A LOT TO MAKE A STEW
- spawn_positions = 2 //A PINCH OF SALT AND LAUGHTER, TOO
- pto_type = PTO_CIVILIAN
- alt_titles = list(JOB_ALT_SOUSCHEF = /datum/alt_title/souschef, JOB_ALT_COOK = /datum/alt_title/cook, JOB_ALT_KITCHEN_WORKER = /datum/alt_title/kitchen_worker)
-
-/datum/alt_title/souschef
- title = JOB_ALT_SOUSCHEF
-
-/datum/alt_title/kitchen_worker
- title = JOB_ALT_KITCHEN_WORKER
- title_blurb = "A " + JOB_ALT_KITCHEN_WORKER + " has the same duties, though they may be less experienced."
-
-
-/datum/job/hydro
- spawn_positions = 2
- pto_type = PTO_CIVILIAN
- alt_titles = list(JOB_ALT_HYDROPONICIST = /datum/alt_title/hydroponicist, JOB_ALT_CULTIVATOR = /datum/alt_title/cultivator, JOB_ALT_FARMER = /datum/alt_title/farmer,
- JOB_ALT_GARDENER = /datum/alt_title/gardener, JOB_ALT_FLORIST = /datum/alt_title/florsit, JOB_ALT_RANCHER = /datum/alt_title/rancher)
-
-/datum/alt_title/hydroponicist
- title = JOB_ALT_HYDROPONICIST
-
-/datum/alt_title/cultivator
- title = JOB_ALT_CULTIVATOR
-
-/datum/alt_title/farmer
- title = JOB_ALT_FARMER
-
-/datum/alt_title/florsit
- title = JOB_ALT_FLORIST
- title_blurb = "A " + JOB_ALT_FLORIST + " may be less professional than their counterparts, and are more likely to tend to the public gardens if they aren't needed elsewhere."
-
-/datum/alt_title/rancher
- title = JOB_ALT_RANCHER
- title_blurb = "A " + JOB_ALT_RANCHER + " is tasked with the care, feeding, raising, and harvesting of livestock."
-
-
-/datum/job/qm
- pto_type = PTO_CARGO
- dept_time_required = 20
- alt_titles = list(JOB_ALT_SUPPLY_CHIEF = /datum/alt_title/supply_chief, JOB_ALT_LOGISTICS_MANAGER = /datum/alt_title/logistics_manager, JOB_ALT_CARGO_SUPERVISOR = /datum/alt_title/cargo_supervisor)
-
-/datum/alt_title/logistics_manager
- title = JOB_ALT_LOGISTICS_MANAGER
-
-/datum/alt_title/cargo_supervisor
- title = JOB_ALT_CARGO_SUPERVISOR
-
-/datum/job/qm/get_request_reasons()
- return list("Training crew")
-
-
-/datum/job/cargo_tech
- total_positions = 3
- spawn_positions = 3
- pto_type = PTO_CARGO
- alt_titles = list(JOB_ALT_CARGO_LOADER = /datum/alt_title/cargo_loader, JOB_ALT_CARGO_HANDLER = /datum/alt_title/cargo_handler, JOB_ALT_SUPPLY_COURIER = /datum/alt_title/supply_courier,
- JOB_ALT_DISPOSALS_SORTER = /datum/alt_title/disposal_sorter)
-
-/datum/alt_title/supply_courier
- title = JOB_ALT_SUPPLY_COURIER
- title_blurb = "A " + JOB_ALT_SUPPLY_COURIER + " is usually tasked with delivering packages or cargo directly to whoever requires it."
-
-/datum/alt_title/cargo_loader
- title = JOB_ALT_CARGO_LOADER
- title_blurb = "A " + JOB_ALT_CARGO_LOADER + " is usually tasked with more menial labor within Supply department, such as loading and unloading supply shuttle."
-
-/datum/alt_title/cargo_handler
- title = JOB_ALT_CARGO_HANDLER
- title_blurb = "A " + JOB_ALT_CARGO_HANDLER + " is usually tasked with more menial labor within Supply department, such as loading and unloading supply shuttle."
-
-/datum/alt_title/disposal_sorter
- title = JOB_ALT_DISPOSALS_SORTER
- title_blurb = "A " + JOB_ALT_DISPOSALS_SORTER + " is usually tasked with operating disposals delivery system, sorting the trash and tagging parcels for delivery."
-
-
-/datum/job/mining
- total_positions = 4
- spawn_positions = 4
- pto_type = PTO_CARGO
- alt_titles = list(JOB_ALT_DEEP_SPACE_MINER = /datum/alt_title/deep_space_miner, JOB_ALT_DRILL_TECHNICIAN = /datum/alt_title/drill_tech, JOB_ALT_PROSPECTOR = /datum/alt_title/prospector,
- JOB_ALT_EXCAVATOR = /datum/alt_title/excavator)
-
-/datum/alt_title/deep_space_miner
- title = JOB_ALT_DEEP_SPACE_MINER
- title_blurb = "A " + JOB_ALT_DEEP_SPACE_MINER + " specializes primarily in mining operations in zero-g environments, mostly in asteroid and debris fields."
-
-/datum/alt_title/prospector
- title = JOB_ALT_PROSPECTOR
-
-/datum/alt_title/excavator
- title = JOB_ALT_EXCAVATOR
-
-/datum/job/mining/get_request_reasons()
- return list("Assembling expedition team")
-
-
-/datum/job/janitor //Lots of janitor substations on station.
- total_positions = 3
- spawn_positions = 3
- pto_type = PTO_CIVILIAN
- alt_titles = list(JOB_ALT_CUSTODIAN = /datum/alt_title/custodian, JOB_ALT_SANITATION_TECHNICIAN = /datum/alt_title/sanitation_tech,
- JOB_ALT_MAID = /datum/alt_title/maid, JOB_ALT_GARBAGE_COLLECTOR = /datum/alt_title/garbage_collector)
-
-/datum/alt_title/sanitation_tech
- title = JOB_ALT_SANITATION_TECHNICIAN
-
-/datum/alt_title/maid
- title = JOB_ALT_MAID
-
-/datum/alt_title/garbage_collector
- title = JOB_ALT_GARBAGE_COLLECTOR
- title_blurb = "A " + JOB_ALT_GARBAGE_COLLECTOR + " keeps the station clean, though focuses moreso on collecting larger trash, with wet cleaning being secondary task."
-
-
-/datum/job/librarian
- total_positions = 2
- spawn_positions = 2
- alt_titles = list(JOB_ALT_JOURNALIST = /datum/alt_title/journalist, JOB_ALT_REPORTER = /datum/alt_title/reporter, JOB_ALT_WRITER = /datum/alt_title/writer,
- JOB_ALT_HISTORIAN = /datum/alt_title/historian, JOB_ALT_ARCHIVIST = /datum/alt_title/archivist, JOB_ALT_PROFESSOR = /datum/alt_title/professor,
- JOB_ALT_ACADEMIC = /datum/alt_title/academic, JOB_ALT_PHILOSOPHER = /datum/alt_title/philosopher, JOB_ALT_CURATOR = /datum/alt_title/curator)
- pto_type = PTO_CIVILIAN
-
-/datum/alt_title/reporter
- title = JOB_ALT_REPORTER
- title_blurb = "The " + JOB_ALT_REPORTER + " uses the Library as a base of operations, from which they can report the news and goings-on on the station with their camera."
-
-/datum/alt_title/historian
- title = JOB_ALT_HISTORIAN
- title_blurb = "The " + JOB_ALT_HISTORIAN + " uses the Library as a base of operation to record any important events occurring on station."
-
-/datum/alt_title/archivist
- title = JOB_ALT_ARCHIVIST
- title_blurb = "The " + JOB_ALT_ARCHIVIST + " uses the Library as a base of operation to record any important events occurring on station."
-
-/datum/alt_title/professor
- title = JOB_ALT_PROFESSOR
- title_blurb = "The " + JOB_ALT_PROFESSOR + " uses the Library as a base of operations to share their vast knowledge with the crew."
-
-/datum/alt_title/academic
- title = JOB_ALT_ACADEMIC
- title_blurb = "The " + JOB_ALT_ACADEMIC + " uses the Library as a base of operations to share their vast knowledge with the crew."
-
-/datum/alt_title/philosopher
- title = JOB_ALT_PHILOSOPHER
- title_blurb = "The " + JOB_ALT_PHILOSOPHER + " uses the Library as a base of operation to ruminate on nature of life and other great questions, and share their opinions with the crew."
-
-/datum/alt_title/curator
- title = JOB_ALT_CURATOR
- title_blurb = "The " + JOB_ALT_CURATOR + " uses the Library as a base of operation to gather the finest of art for display and preservation."
-
-/datum/job/lawyer
- disallow_jobhop = TRUE
- pto_type = PTO_CIVILIAN
- alt_titles = list(JOB_ALT_INTERNAL_AFFAIRS_LIAISON = /datum/alt_title/ia_liaison, JOB_ALT_INTERNAL_AFFAIRS_DELEGATE = /datum/alt_title/ia_delegate,
- JOB_ALT_INTERNAL_AFFAIRS_INVESTIGATOR = /datum/alt_title/ia_investigator)
-
-/datum/alt_title/ia_liaison
- title = JOB_ALT_INTERNAL_AFFAIRS_LIAISON
-
-/datum/alt_title/ia_delegate
- title = JOB_ALT_INTERNAL_AFFAIRS_DELEGATE
-
-/datum/alt_title/ia_investigator
- title = JOB_ALT_INTERNAL_AFFAIRS_INVESTIGATOR
-
-
-/datum/job/chaplain
- pto_type = PTO_CIVILIAN
- alt_titles = list(JOB_ALT_MISSIONARY = /datum/alt_title/missionary, JOB_ALT_PREACHER = /datum/alt_title/preacher, JOB_ALT_PRIEST = /datum/alt_title/priest,
- JOB_ALT_NUN = /datum/alt_title/nun, JOB_ALT_MONK = /datum/alt_title/monk, JOB_ALT_COUNSELOR = /datum/alt_title/counselor,
- JOB_ALT_GURU = /datum/alt_title/guru)
-
-/datum/alt_title/guru
- title = JOB_ALT_GURU
- title_blurb = "The " + JOB_ALT_GURU + " primarily tries to offer spiritual guidance to those who come seeking it."
-
-/datum/alt_title/missionary
- title = JOB_ALT_MISSIONARY
-
-/datum/alt_title/preacher
- title = JOB_ALT_PREACHER
-
-/datum/alt_title/priest
- title = JOB_ALT_PRIEST
-
-/datum/alt_title/nun
- title = JOB_ALT_NUN
-
-/datum/alt_title/monk
- title = JOB_ALT_MONK
-
-
-//////////////////////////////////
-// Pilot
-//////////////////////////////////
-
-/datum/job/pilot
- title = JOB_PILOT
- flag = PILOT
- departments = list(DEPARTMENT_CIVILIAN)
- department_flag = CIVILIAN
- faction = FACTION_STATION
- total_positions = 2
- spawn_positions = 2
- supervisors = "the " + JOB_HEAD_OF_PERSONNEL
- selection_color = "#515151"
- economic_modifier = 5
- minimal_player_age = 3
- pto_type = PTO_CIVILIAN
- access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot)
- minimal_access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot)
- outfit_type = /decl/hierarchy/outfit/job/pilot
- job_description = "A " + JOB_PILOT + " flies the various shuttles in the Virgo-Erigone System."
- alt_titles = list(JOB_ALT_COPILOT = /datum/alt_title/co_pilot, JOB_ALT_NAVIGATOR = /datum/alt_title/navigator, JOB_ALT_HELMSMAN = /datum/alt_title/helmsman)
-
-/datum/alt_title/co_pilot
- title = JOB_ALT_COPILOT
- title_blurb = "A Co-" + JOB_ALT_COPILOT + " is there primarily to assist main pilot as well as learn from them"
-
-/datum/alt_title/navigator
- title = JOB_ALT_NAVIGATOR
-
-/datum/alt_title/helmsman
- title = JOB_ALT_HELMSMAN
-
-/datum/job/pilot/get_request_reasons()
- return list("Assembling expedition team")
-
-//////////////////////////////////
-// Entertainer
-//////////////////////////////////
-
-/datum/job/entertainer
- title = JOB_ENTERTAINER
- flag = ENTERTAINER
- departments = list(DEPARTMENT_CIVILIAN)
- department_flag = CIVILIAN
- faction = FACTION_STATION
- total_positions = 4
- spawn_positions = 4
- supervisors = "the " + JOB_HEAD_OF_PERSONNEL
- selection_color = "#515151"
- access = list(access_entertainment)
- minimal_access = list(access_entertainment)
- pto_type = PTO_CIVILIAN
-
- outfit_type = /decl/hierarchy/outfit/job/assistant/entertainer
- job_description = "An " + JOB_ENTERTAINER + " does just that, entertains! Put on plays, play music, sing songs, tell stories, or read your favorite fanfic."
- alt_titles = list(JOB_ALT_PERFORMER = /datum/alt_title/performer, JOB_ALT_MUSICIAN = /datum/alt_title/musician, JOB_ALT_STAGEHAND = /datum/alt_title/stagehand,
- JOB_ALT_ACTOR = /datum/alt_title/actor, JOB_ALT_DANCER = /datum/alt_title/dancer, JOB_ALT_SINGER = /datum/alt_title/singer,
- JOB_ALT_MAGICIAN = /datum/alt_title/magician, JOB_ALT_COMEDIAN = /datum/alt_title/comedian, JOB_ALT_ARTIST = /datum/alt_title/tragedian,
- JOB_ALT_ARTIST = /datum/alt_title/artist, JOB_ALT_GAME_MASTER = /datum/alt_title/game_master)
-
-// Entertainer Alt Titles
-/datum/alt_title/actor
- title = JOB_ALT_ACTOR
- title_blurb = "An " + JOB_ALT_ACTOR + " is someone who acts out a role! Whatever sort of character it is, get into it and impress people with power of comedy and tragedy!"
-
-/datum/alt_title/performer
- title = JOB_ALT_PERFORMER
- title_blurb = "A " + JOB_ALT_PERFORMER + " is someone who performs! Whatever sort of performance will come to your mind, the world's a stage!"
-
-/datum/alt_title/musician
- title = JOB_ALT_MUSICIAN
- title_blurb = "A " + JOB_ALT_MUSICIAN + " is someone who makes music with a wide variety of musical instruments!"
-
-/datum/alt_title/stagehand
- title = JOB_ALT_STAGEHAND
- title_blurb = "A " + JOB_ALT_STAGEHAND + " typically performs everything the rest of the entertainers don't. Operate lights, shutters, windows, or narrate through your voicebox!"
-
-/datum/alt_title/dancer
- title = JOB_ALT_DANCER
- title_blurb = "A " + JOB_ALT_DANCER + " is someone who impresses people through power of their own body! From waltz to breakdance, as long as crowd as cheering!"
-
-/datum/alt_title/singer
- title = JOB_ALT_SINGER
- title_blurb = "A " + JOB_ALT_SINGER + " is someone with gift of melodious voice! Impress people with your vocal range!"
-
-/datum/alt_title/magician
- title = JOB_ALT_MAGICIAN
- title_blurb = "A " + JOB_ALT_MAGICIAN + " is someone who awes those around them with impossible! Show off your repertoire of magic tricks, while keeping the secret hidden!"
-
-/datum/alt_title/comedian
- title = JOB_ALT_COMEDIAN
- title_blurb = "A " + JOB_ALT_COMEDIAN + " will focus on making people laugh with the power of wit! Telling jokes, stand-up comedy, you are here to make others smile!"
-
-/datum/alt_title/tragedian
- title = JOB_ALT_ARTIST
- title_blurb = "A " + JOB_ALT_ARTIST + " will focus on making people think about life and world around them! Life is a tragedy, and who's better to convey its emotions than you?"
-
-/datum/alt_title/artist
- title = JOB_ALT_ARTIST
- title_blurb = "An " + JOB_ALT_ARTIST + "'s calling is to create beautiful arts! Whatever form may they take, create and have people astonished with your creativity."
-
-/datum/alt_title/game_master
- title = JOB_ALT_GAME_MASTER
- title_blurb = "A " + JOB_ALT_GAME_MASTER + " provides recreation for the crew by hosting variety of games. From cards to roleplaying to something more personalized."
-
-//////////////////////////////////
-// Entrepreneur
-//////////////////////////////////
-
-/datum/job/entrepreneur
- title = JOB_ENTREPRENEUR
- flag = ENTREPRENEUR
- departments = list(DEPARTMENT_CIVILIAN)
- department_flag = CIVILIAN
- faction = FACTION_STATION
- total_positions = 4
- spawn_positions = 4
- supervisors = "the " + JOB_HEAD_OF_PERSONNEL
- selection_color = "#515151"
- access = list()
- minimal_access = list()
- pto_type = PTO_CIVILIAN
-
- outfit_type = /decl/hierarchy/outfit/job/assistant/entrepreneur
- job_description = "An " + JOB_ENTREPRENEUR + " is basically a visitor that obtained special permission to offer personal services to people on station. \
- They will offer people these services and, potentially, even demand payment!"
- alt_titles = list(JOB_ALT_LAWYER = /datum/alt_title/lawyer, JOB_ALT_PRIVATE_EYE = /datum/alt_title/private_eye, JOB_ALT_BODYGUARD = /datum/alt_title/bodyguard,
- JOB_ALT_PERSONAL_PHYSICIAN = /datum/alt_title/personal_physician, JOB_ALT_DENTIST = /datum/alt_title/dentist, JOB_ALT_FITNESS_INSTRUCTOR = /datum/alt_title/fitness_instructor,
- JOB_ALT_YOGA_TEACHER = /datum/alt_title/yoga_teacher, JOB_ALT_MASSEUSE = /datum/alt_title/masseuse, JOB_ALT_TRADESPERSON = /datum/alt_title/tradesperson,
- JOB_ALT_STREAMER = /datum/alt_title/streamer, JOB_ALT_INFLUENCER = /datum/alt_title/influencer, JOB_ALT_PARANORMAL_INVESTIGATOR = /datum/alt_title/paranormal_investigator,
- JOB_ALT_PERSONAL_SECRETARY = /datum/alt_title/personal_secretary, JOB_ALT_STYLIST = /datum/alt_title/stylist, JOB_ALT_FISHER = /datum/alt_title/fisher,
- JOB_ALT_FORTUNE_TELLER = /datum/alt_title/fortune_teller, JOB_ALT_SPIRIT_HEALER = /datum/alt_title/spirit_healer)
-
-/datum/alt_title/lawyer
- title = JOB_ALT_LAWYER
- title_blurb = "A " + JOB_ALT_LAWYER + " is knowledgable in various legal systems, including station's operations. They can try to offer their legal counsel, although nobody is really obliged to listen."
- title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/personal_secretary
-
-/datum/alt_title/private_eye
- title = JOB_ALT_PRIVATE_EYE
- title_blurb = "A " + JOB_ALT_PRIVATE_EYE + " is a detective that has no credentials or equipment. But if someone wants something found without security's knowledge, they are the one to go to."
- title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/private_eye
-
-/datum/alt_title/bodyguard
- title = JOB_ALT_BODYGUARD
- title_blurb = "A " + JOB_ALT_BODYGUARD + " offers service of personal protection. They may not be allowed any weapons, but their own body is weapon enough."
- title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/bodyguard
-
-/datum/alt_title/personal_physician
- title = JOB_ALT_PERSONAL_PHYSICIAN
- title_blurb = "A " + JOB_ALT_PERSONAL_PHYSICIAN + " is a doctor dedicated less to Hippocratic Oath and more to the moneymaking grind. Their license may be expired, but the grindset never will be."
- title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/personal_physician
-
-/datum/alt_title/dentist
- title = JOB_ALT_DENTIST
- title_blurb = "A " + JOB_ALT_DENTIST + " is a doctor that specializes in oral care. Company may not recognize them as a proper doctor, but surely their customers will."
- title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/dentist
-
-/datum/alt_title/fitness_instructor
- title = JOB_ALT_FITNESS_INSTRUCTOR
- title_blurb = "A " + JOB_ALT_FITNESS_INSTRUCTOR + " dedicates themselves to improving the health of the crew through physical activity, and boy, do they need the help."
- title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/fitness_instructor
-
-/datum/alt_title/yoga_teacher
- title = JOB_ALT_YOGA_TEACHER
- title_blurb = "A " + JOB_ALT_YOGA_TEACHER + " is similar to a fitness instructor, but rather than turning the round bodies into firm ones, they focus on helping people find balance and harmony."
- title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/yoga_teacher
-
-/datum/alt_title/masseuse
- title = JOB_ALT_MASSEUSE
- title_blurb = "A " + JOB_ALT_MASSEUSE + " is master of physical therapy and working others' bodies with their hands."
- title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/masseuse
-
-/datum/alt_title/tradesperson
- title = JOB_ALT_TRADESPERSON
- title_blurb = "A " + JOB_ALT_TRADESPERSON + " is someone attempting to make money via the most obvious act of all - buying and selling. Now if only customs allowed you to bring your goods along..."
- title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/tradesperson
-
-/datum/alt_title/streamer
- title = JOB_ALT_STREAMER
- title_blurb = "A " + JOB_ALT_STREAMER + " is here to entertain. Not the crew! Their audience across exonet!"
- title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/streamer
-
-/datum/alt_title/influencer
- title = JOB_ALT_INFLUENCER
- title_blurb = "An " + JOB_ALT_INFLUENCER + " has lucked out with some exonet following, and was given permission to go onstation to provide free exposure. Don't let it go to your head."
- title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/influencer
-
-/datum/alt_title/paranormal_investigator
- title = JOB_ALT_PARANORMAL_INVESTIGATOR
- title_blurb = "A " + JOB_ALT_PARANORMAL_INVESTIGATOR + " looks beyond what is accepted by modern science, and searches for the true unknown. Aliens, alternate dimensions, ghosts... The truth is out there!"
- title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/paranormal_investigator
-
-/datum/alt_title/personal_secretary
- title = JOB_ALT_PERSONAL_SECRETARY
- title_blurb = "A " + JOB_ALT_PERSONAL_SECRETARY + " offers services of general assistance. Although it's doubtful anyone will ever actually need those."
- title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/personal_secretary
-
-/datum/alt_title/stylist
- title = JOB_ALT_STYLIST
- title_blurb = "A " + JOB_ALT_STYLIST + " offers fashion advice, as well as helps with adjusting appearance of the crew to better suit their beauty standards."
- title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/stylist
-
-/datum/alt_title/fisher
- title = JOB_ALT_FISHER
- title_blurb = "A " + JOB_ALT_FISHER + " is a capable angler, who is good at obtaining large amounts of marine goods. Whether you generously give them to station or attempt to make a quick thaler by selling, it's up to you!"
- title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/fisher
-
-/datum/alt_title/fortune_teller
- title = JOB_ALT_FORTUNE_TELLER
- title_blurb = "A " + JOB_ALT_FORTUNE_TELLER + " peers into the future, and offers these visions to others. Occasionally those visions may even come true!"
- title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/fortune_teller
-
-/datum/alt_title/spirit_healer
- title = JOB_ALT_SPIRIT_HEALER
- title_blurb = "A " + JOB_ALT_SPIRIT_HEALER + " offers alternative forms of medicine. Rituals, magic rocks, seances... It totally works. What's that about placebo?"
- title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/spirit_healer
diff --git a/code/game/jobs/job/department.dm b/code/game/jobs/job/department.dm
index 47d6de97ad..87ad819e24 100644
--- a/code/game/jobs/job/department.dm
+++ b/code/game/jobs/job/department.dm
@@ -60,7 +60,7 @@
name = "Miscellaneous"
short_name = "Misc"
color = "#666666"
- sorting_order = 0
+ sorting_order = -5
assignable = FALSE
/datum/department/synthetic
diff --git a/code/game/jobs/job/department_vr.dm b/code/game/jobs/job/department_vr.dm
deleted file mode 100644
index 2af1d8e94f..0000000000
--- a/code/game/jobs/job/department_vr.dm
+++ /dev/null
@@ -1,6 +0,0 @@
-/datum/department/misc
- name = "Off-Duty"
- short_name = "Offduty"
- color = "#666666"
- sorting_order = -5
- assignable = FALSE
\ No newline at end of file
diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm
index 576739d659..c4a6b350f8 100644
--- a/code/game/jobs/job/engineering.dm
+++ b/code/game/jobs/job/engineering.dm
@@ -22,15 +22,20 @@
ideal_age_by_species = list(SPECIES_UNATHI = 140, "mechanical" = 20, SPECIES_HUMAN_VATBORN = 20)
banned_job_species = list(SPECIES_TESHARI, SPECIES_DIONA, SPECIES_PROMETHEAN, SPECIES_ZADDAT, "digital")
+ disallow_jobhop = TRUE
+ pto_type = PTO_ENGINEERING
+ dept_time_required = 60
access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels,
- access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
- access_heads, access_construction, access_sec_doors,
- access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload)
+ access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
+ access_heads, access_construction,
+ access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload, access_gateway)
+
minimal_access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels,
- access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
- access_heads, access_construction, access_sec_doors,
- access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload)
+ access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
+ access_heads, access_construction,
+ access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload, access_gateway)
+ alt_titles = list(JOB_ALT_HEAD_ENGINEER = /datum/alt_title/head_engineer, JOB_ALT_FOREMAN = /datum/alt_title/foreman, JOB_ALT_MAINTENANCE_MANAGER = /datum/alt_title/maintenance_manager)
minimal_player_age = 7
outfit_type = /decl/hierarchy/outfit/job/engineering/chief_engineer
@@ -38,6 +43,18 @@
of manpower as much as they handle hands-on operations and repairs. They are also expected to keep the rest of the station informed of \
any structural threats to the station that may be hazardous to health or disruptive to work."
+/datum/job/chief_engineer/get_request_reasons()
+ return list("Engine setup", "Construction project", "Repairs necessary", "Training crew", "Assembling expedition team")
+
+/datum/alt_title/head_engineer
+ title = JOB_ALT_HEAD_ENGINEER
+
+/datum/alt_title/foreman
+ title = JOB_ALT_FOREMAN
+
+/datum/alt_title/maintenance_manager
+ title = JOB_ALT_MAINTENANCE_MANAGER
+
//////////////////////////////////
// Engineer
//////////////////////////////////
@@ -52,10 +69,12 @@
supervisors = "the "+ JOB_CHIEF_ENGINEER
selection_color = "#5B4D20"
economic_modifier = 5
+ pto_type = PTO_ENGINEERING
+
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics)
minimal_access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction)
- alt_titles = list(JOB_ALT_MAINTENANCE_TECHNICIAN = /datum/alt_title/maint_tech,
- JOB_ALT_ENGINE_TECHNICIAN = /datum/alt_title/engine_tech, JOB_ALT_ELECTRICIAN = /datum/alt_title/electrician)
+ alt_titles = list(JOB_ALT_MAINTENANCE_TECHNICIAN = /datum/alt_title/maint_tech, JOB_ALT_ENGINE_TECHNICIAN = /datum/alt_title/engine_tech,
+ JOB_ALT_ELECTRICIAN = /datum/alt_title/electrician, JOB_ALT_CONSTRUCTION_ENGINEER = /datum/alt_title/construction_engi, JOB_ALT_ENGINEERING_CONTRACTOR = /datum/alt_title/engineering_contractor, JOB_ALT_COMPUTER_TECHNICIAN = /datum/alt_title/computer_tech)
minimal_player_age = 3
min_age_by_species = list(SPECIES_PROMETHEAN = 2)
@@ -64,6 +83,9 @@
job_description = "An " + JOB_ENGINEER + " keeps the station running. They repair damages, keep the atmosphere stable, and ensure that power is being \
generated and distributed. On quiet shifts, they may be called upon to make cosmetic alterations to the station."
+/datum/job/engineer/get_request_reasons()
+ return list("Engine setup", "Construction project", "Repairs necessary", "Assembling expedition team")
+
// Engineer Alt Titles
/datum/alt_title/maint_tech
title = JOB_ALT_MAINTENANCE_TECHNICIAN
@@ -80,6 +102,23 @@
title_blurb = "An " + JOB_ALT_ELECTRICIAN + "'s primary duty is making sure power is properly distributed thoughout the station, utilizing solars, substations, and other \
methods to ensure every department has power in an emergency."
+/datum/alt_title/construction_engi
+ title = JOB_ALT_CONSTRUCTION_ENGINEER
+ title_blurb = "A " + JOB_ALT_CONSTRUCTION_ENGINEER + " fulfills similar duties to other engineers, but usually occupies spare time with construction of extra facilities in dedicated areas or \
+ as additions to station layout."
+
+/datum/alt_title/engineering_contractor
+ title = JOB_ALT_ENGINEERING_CONTRACTOR
+ title_blurb = "An " + JOB_ALT_ENGINEERING_CONTRACTOR + " fulfills similar duties to other engineers, but isn't directly employed by NT proper."
+
+/datum/alt_title/computer_tech
+ title = JOB_ALT_COMPUTER_TECHNICIAN
+ title_blurb = "A " + JOB_ALT_COMPUTER_TECHNICIAN + " fulfills similar duties to other engineers, but specializes in working with software and computers. They also often deal with integrated circuits."
+
+/datum/alt_title/salvage_tech
+ title = JOB_ALT_SALVAGE_TECHNICIAN
+ title_blurb = "A " + JOB_ALT_SALVAGE_TECHNICIAN + " is responsible for breaking down debris and obsolete equipment to recover useful components and materials."
+
//////////////////////////////////
// Atmos Tech
//////////////////////////////////
@@ -90,16 +129,36 @@
department_flag = ENGSEC
faction = FACTION_STATION
total_positions = 3
- spawn_positions = 2
+ spawn_positions = 3
+ pto_type = PTO_ENGINEERING
supervisors = "the " + JOB_CHIEF_ENGINEER
selection_color = "#5B4D20"
economic_modifier = 5
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_external_airlocks)
minimal_access = list(access_eva, access_engine, access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction, access_external_airlocks)
+ alt_titles = list(JOB_ALT_ATMOSPHERIC_ENGINEER = /datum/alt_title/atmos_engi, JOB_ALT_ATMOSPHERIC_MAINTAINER = /datum/alt_title/atmos_maint, JOB_ALT_DISPOSALS_TECHNICIAN = /datum/alt_title/disposals_tech,
+ JOB_ALT_FUEL_TECHNICIAN = /datum/alt_title/refuel_tech)
+
minimal_player_age = 3
min_age_by_species = list(SPECIES_PROMETHEAN = 2)
outfit_type = /decl/hierarchy/outfit/job/engineering/atmos
job_description = "An " + JOB_ATMOSPHERIC_TECHNICIAN + " is primarily concerned with keeping the station's atmosphere breathable. They are expected to have a good \
understanding of the pipes, vents, and scrubbers that move gasses around the station, and to be familiar with proper firefighting procedure."
+
+/datum/job/atmos/get_request_reasons()
+ return list("Construction project", "Repairs necessary", "Assembling expedition team")
+
+/datum/alt_title/refuel_tech
+ title = JOB_ALT_FUEL_TECHNICIAN
+
+/datum/alt_title/atmos_maint
+ title = JOB_ALT_ATMOSPHERIC_MAINTAINER
+
+/datum/alt_title/atmos_engi
+ title = JOB_ALT_ATMOSPHERIC_ENGINEER
+
+/datum/alt_title/disposals_tech
+ title = JOB_ALT_DISPOSALS_TECHNICIAN
+ title_blurb = "A " + JOB_ALT_DISPOSALS_TECHNICIAN + " is an " + JOB_ATMOSPHERIC_TECHNICIAN + " still and can fulfill all the same duties, although specializes more in disposals delivery system's operations and configurations."
diff --git a/code/game/jobs/job/engineering_vr.dm b/code/game/jobs/job/engineering_vr.dm
deleted file mode 100644
index 17b70731db..0000000000
--- a/code/game/jobs/job/engineering_vr.dm
+++ /dev/null
@@ -1,71 +0,0 @@
-/datum/job/chief_engineer
- disallow_jobhop = TRUE
- pto_type = PTO_ENGINEERING
- dept_time_required = 60
-
- access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels,
- access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
- access_heads, access_construction,
- access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload, access_gateway)
-
- minimal_access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels,
- access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
- access_heads, access_construction,
- access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload, access_gateway)
- alt_titles = list(JOB_ALT_HEAD_ENGINEER = /datum/alt_title/head_engineer, JOB_ALT_FOREMAN = /datum/alt_title/foreman, JOB_ALT_MAINTENANCE_MANAGER = /datum/alt_title/maintenance_manager)
-
-/datum/alt_title/head_engineer
- title = JOB_ALT_HEAD_ENGINEER
-
-/datum/alt_title/foreman
- title = JOB_ALT_FOREMAN
-
-/datum/alt_title/maintenance_manager
- title = JOB_ALT_MAINTENANCE_MANAGER
-
-/datum/job/chief_engineer/get_request_reasons()
- return list("Engine setup", "Construction project", "Repairs necessary", "Training crew", "Assembling expedition team")
-
-
-/datum/job/engineer
- pto_type = PTO_ENGINEERING
- alt_titles = list(JOB_ALT_MAINTENANCE_TECHNICIAN = /datum/alt_title/maint_tech, JOB_ALT_ENGINE_TECHNICIAN = /datum/alt_title/engine_tech,
- JOB_ALT_ELECTRICIAN = /datum/alt_title/electrician, JOB_ALT_CONSTRUCTION_ENGINEER = /datum/alt_title/construction_engi, JOB_ALT_ENGINEERING_CONTRACTOR = /datum/alt_title/engineering_contractor, JOB_ALT_COMPUTER_TECHNICIAN = /datum/alt_title/computer_tech)
-
-/datum/alt_title/construction_engi
- title = JOB_ALT_CONSTRUCTION_ENGINEER
- title_blurb = "A " + JOB_ALT_CONSTRUCTION_ENGINEER + " fulfills similar duties to other engineers, but usually occupies spare time with construction of extra facilities in dedicated areas or \
- as additions to station layout."
-
-/datum/alt_title/engineering_contractor
- title = JOB_ALT_ENGINEERING_CONTRACTOR
- title_blurb = "An " + JOB_ALT_ENGINEERING_CONTRACTOR + " fulfills similar duties to other engineers, but isn't directly employed by NT proper."
-
-/datum/job/engineer/get_request_reasons()
- return list("Engine setup", "Construction project", "Repairs necessary", "Assembling expedition team")
-
-/datum/alt_title/computer_tech
- title = JOB_ALT_COMPUTER_TECHNICIAN
- title_blurb = "A " + JOB_ALT_COMPUTER_TECHNICIAN + " fulfills similar duties to other engineers, but specializes in working with software and computers. They also often deal with integrated circuits."
-
-/datum/job/atmos
- spawn_positions = 3
- pto_type = PTO_ENGINEERING
- alt_titles = list(JOB_ALT_ATMOSPHERIC_ENGINEER = /datum/alt_title/atmos_engi, JOB_ALT_ATMOSPHERIC_MAINTAINER = /datum/alt_title/atmos_maint, JOB_ALT_DISPOSALS_TECHNICIAN = /datum/alt_title/disposals_tech,
- JOB_ALT_FUEL_TECHNICIAN = /datum/alt_title/refuel_tech)
-
-/datum/alt_title/atmos_maint
- title = JOB_ALT_ATMOSPHERIC_MAINTAINER
-
-/datum/alt_title/atmos_engi
- title = JOB_ALT_ATMOSPHERIC_ENGINEER
-
-/datum/alt_title/disposals_tech
- title = JOB_ALT_DISPOSALS_TECHNICIAN
- title_blurb = "A " + JOB_ALT_DISPOSALS_TECHNICIAN + " is an " + JOB_ATMOSPHERIC_TECHNICIAN + " still and can fulfill all the same duties, although specializes more in disposals delivery system's operations and configurations."
-
-/datum/alt_title/refuel_tech
- title = JOB_ALT_FUEL_TECHNICIAN
-
-/datum/job/atmos/get_request_reasons()
- return list("Construction project", "Repairs necessary", "Assembling expedition team")
diff --git a/code/game/jobs/job/exploration_vr.dm b/code/game/jobs/job/exploration.dm
similarity index 100%
rename from code/game/jobs/job/exploration_vr.dm
rename to code/game/jobs/job/exploration.dm
diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm
index b191d67072..d01d60e4be 100644
--- a/code/game/jobs/job/job.dm
+++ b/code/game/jobs/job/job.dm
@@ -39,6 +39,29 @@
// Description of the job's role and minimum responsibilities.
var/job_description = "This Job doesn't have a description! Please report it!"
+ //Requires a ckey to be whitelisted in jobwhitelist.txt
+ var/whitelist_only = 0
+
+ //Does not display this job on the occupation setup screen
+ var/latejoin_only = 0
+
+ //Every hour playing this role gains this much time off. (Can be negative for off duty jobs!)
+ var/timeoff_factor = 3
+
+ //What type of PTO is that job earning?
+ var/pto_type
+
+ //Disallow joining as this job midround from off-duty position via going on-duty
+ var/disallow_jobhop = FALSE
+
+ //Time required in the department as other jobs before playing this one (in hours)
+ var/dept_time_required = 0
+
+ //Do we forbid ourselves from earning PTO?
+ var/playtime_only = FALSE
+
+ var/requestable = TRUE
+
/datum/job/New()
. = ..()
department_accounts = department_accounts || departments_managed
@@ -184,3 +207,47 @@
if(brain_type in banned_job_species)
return TRUE
*/
+
+
+// Check client-specific availability rules.
+/datum/job/proc/player_has_enough_pto(client/C)
+ return timeoff_factor >= 0 || (C && LAZYACCESS(C.department_hours, pto_type) > 0)
+
+/datum/job/proc/player_has_enough_playtime(client/C)
+ return (available_in_playhours(C) == 0)
+
+/datum/job/proc/available_in_playhours(client/C)
+ if(C && CONFIG_GET(flag/use_playtime_restriction_for_jobs) && dept_time_required)
+ if(isnum(C.play_hours[pto_type])) // Has played that department before
+ return max(0, dept_time_required - C.play_hours[pto_type])
+ else // List doesn't have that entry, maybe never played, maybe invalid PTO type (you should fix that...)
+ return dept_time_required // Could be 0, too, which is fine! They can play that
+ return 0
+
+// Special treatment for some the more complicated heads
+
+// Captain gets every department combined
+/datum/job/captain/available_in_playhours(client/C)
+ if(C && CONFIG_GET(flag/use_playtime_restriction_for_jobs) && dept_time_required)
+ var/remaining_time_needed = dept_time_required
+ for(var/key in C.play_hours)
+ if(isnum(C.play_hours[key]) && !(key == PTO_TALON))
+ remaining_time_needed = max(0, remaining_time_needed - C.play_hours[key])
+ return remaining_time_needed
+ return 0
+
+// HoP gets civilian, cargo, and exploration combined
+/datum/job/hop/available_in_playhours(client/C)
+ if(C && CONFIG_GET(flag/use_playtime_restriction_for_jobs) && dept_time_required)
+ var/remaining_time_needed = dept_time_required
+ if(isnum(C.play_hours[PTO_CIVILIAN]))
+ remaining_time_needed = max(0, remaining_time_needed - C.play_hours[PTO_CIVILIAN])
+ if(isnum(C.play_hours[PTO_CARGO]))
+ remaining_time_needed = max(0, remaining_time_needed - C.play_hours[PTO_CARGO])
+ if(isnum(C.play_hours[PTO_EXPLORATION]))
+ remaining_time_needed = max(0, remaining_time_needed - C.play_hours[PTO_EXPLORATION])
+ return remaining_time_needed
+ return 0
+
+/datum/job/proc/get_request_reasons()
+ return list()
diff --git a/code/game/jobs/job/job_vr.dm b/code/game/jobs/job/job_vr.dm
deleted file mode 100644
index 3796714b5e..0000000000
--- a/code/game/jobs/job/job_vr.dm
+++ /dev/null
@@ -1,66 +0,0 @@
-/datum/job
- //Requires a ckey to be whitelisted in jobwhitelist.txt
- var/whitelist_only = 0
-
- //Does not display this job on the occupation setup screen
- var/latejoin_only = 0
-
- //Every hour playing this role gains this much time off. (Can be negative for off duty jobs!)
- var/timeoff_factor = 3
-
- //What type of PTO is that job earning?
- var/pto_type
-
- //Disallow joining as this job midround from off-duty position via going on-duty
- var/disallow_jobhop = FALSE
-
- //Time required in the department as other jobs before playing this one (in hours)
- var/dept_time_required = 0
-
- //Do we forbid ourselves from earning PTO?
- var/playtime_only = FALSE
-
- var/requestable = TRUE
-
-// Check client-specific availability rules.
-/datum/job/proc/player_has_enough_pto(client/C)
- return timeoff_factor >= 0 || (C && LAZYACCESS(C.department_hours, pto_type) > 0)
-
-/datum/job/proc/player_has_enough_playtime(client/C)
- return (available_in_playhours(C) == 0)
-
-/datum/job/proc/available_in_playhours(client/C)
- if(C && CONFIG_GET(flag/use_playtime_restriction_for_jobs) && dept_time_required)
- if(isnum(C.play_hours[pto_type])) // Has played that department before
- return max(0, dept_time_required - C.play_hours[pto_type])
- else // List doesn't have that entry, maybe never played, maybe invalid PTO type (you should fix that...)
- return dept_time_required // Could be 0, too, which is fine! They can play that
- return 0
-
-// Special treatment for some the more complicated heads
-
-// Captain gets every department combined
-/datum/job/captain/available_in_playhours(client/C)
- if(C && CONFIG_GET(flag/use_playtime_restriction_for_jobs) && dept_time_required)
- var/remaining_time_needed = dept_time_required
- for(var/key in C.play_hours)
- if(isnum(C.play_hours[key]) && !(key == PTO_TALON))
- remaining_time_needed = max(0, remaining_time_needed - C.play_hours[key])
- return remaining_time_needed
- return 0
-
-// HoP gets civilian, cargo, and exploration combined
-/datum/job/hop/available_in_playhours(client/C)
- if(C && CONFIG_GET(flag/use_playtime_restriction_for_jobs) && dept_time_required)
- var/remaining_time_needed = dept_time_required
- if(isnum(C.play_hours[PTO_CIVILIAN]))
- remaining_time_needed = max(0, remaining_time_needed - C.play_hours[PTO_CIVILIAN])
- if(isnum(C.play_hours[PTO_CARGO]))
- remaining_time_needed = max(0, remaining_time_needed - C.play_hours[PTO_CARGO])
- if(isnum(C.play_hours[PTO_EXPLORATION]))
- remaining_time_needed = max(0, remaining_time_needed - C.play_hours[PTO_EXPLORATION])
- return remaining_time_needed
- return 0
-
-/datum/job/proc/get_request_reasons()
- return list()
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index 9298028eb9..c8a96efad9 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -16,11 +16,13 @@
req_admin_notify = 1
economic_modifier = 10
access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads,
- access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
- access_keycard_auth, access_sec_doors, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels)
+ access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
+ access_keycard_auth, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels, access_gateway)
+
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads,
- access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
- access_keycard_auth, access_sec_doors, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels)
+ access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
+ access_keycard_auth, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels, access_gateway)
+ alt_titles = list(JOB_ALT_CHIEF_PHYSICIAN = /datum/alt_title/chief_physician, JOB_ALT_MEDICAL_DIRECTOR = /datum/alt_title/medical_director, JOB_ALT_HEALTHCARE_MANAGER = /datum/alt_title/healthcare_manager)
minimum_character_age = 25
min_age_by_species = list(SPECIES_UNATHI = 70, "mechanical" = 10, SPECIES_HUMAN_VATBORN = 14)
@@ -29,12 +31,28 @@
ideal_age_by_species = list(SPECIES_UNATHI = 140, "mechanical" = 20, SPECIES_HUMAN_VATBORN = 20)
banned_job_species = list(SPECIES_TESHARI, SPECIES_DIONA, SPECIES_PROMETHEAN, SPECIES_ZADDAT, "digital")
+ disallow_jobhop = TRUE
+ pto_type = PTO_MEDICAL
+ dept_time_required = 60
+
outfit_type = /decl/hierarchy/outfit/job/medical/cmo
job_description = "The CMO manages the Medical department and is a position requiring experience and skill; their goal is to ensure that their \
staff keep the station's crew healthy and whole. They are primarily interested in making sure that patients are safely found and \
transported to Medical for treatment. They are expected to keep the crew informed about threats to their health and safety, and \
about the importance of Suit Sensors."
+/datum/job/cmo/get_request_reasons()
+ return list("Surgery pending", "Viral outbreak", "Training crew", "Assembling expedition team")
+
+/datum/alt_title/chief_physician
+ title = JOB_ALT_CHIEF_PHYSICIAN
+
+/datum/alt_title/medical_director
+ title = JOB_ALT_MEDICAL_DIRECTOR
+
+/datum/alt_title/healthcare_manager
+ title = JOB_ALT_HEALTHCARE_MANAGER
+
//////////////////////////////////
// Medical Doctor
//////////////////////////////////
@@ -45,7 +63,8 @@
department_flag = MEDSCI
faction = FACTION_STATION
total_positions = 5
- spawn_positions = 3
+ spawn_positions = 5
+ pto_type = PTO_MEDICAL
supervisors = "the " + JOB_CHIEF_MEDICAL_OFFICER
selection_color = "#013D3B"
economic_modifier = 7
@@ -55,14 +74,15 @@
job_description = "A " + JOB_MEDICAL_DOCTOR + " is a Jack-of-All-Trades Medical title, covering a variety of skill levels and minor specializations. They are likely \
familiar with basic first aid, and a number of accompanying medications, and can generally save, if not cure, a majority of the \
patients they encounter."
- alt_titles = list(
- JOB_ALT_SURGEON = /datum/alt_title/surgeon,
- JOB_ALT_EMERGENCY_PHYSICIAN = /datum/alt_title/emergency_physician,
- JOB_ALT_NURSE = /datum/alt_title/nurse,
- JOB_ALT_VIROLOGIST = /datum/alt_title/virologist)
+ alt_titles = list(JOB_ALT_PHYSICIAN = /datum/alt_title/physician, JOB_ALT_MEDICAL_PRACTITIONER = /datum/alt_title/medical_practitioner, JOB_ALT_SURGEON = /datum/alt_title/surgeon,
+ JOB_ALT_EMERGENCY_PHYSICIAN = /datum/alt_title/emergency_physician, JOB_ALT_NURSE = /datum/alt_title/nurse, JOB_ALT_ORDERLY = /datum/alt_title/orderly,
+ JOB_ALT_VIROLOGIST = /datum/alt_title/virologist, JOB_ALT_MEDICAL_CONTRACTOR = /datum/alt_title/medical_contractor)
min_age_by_species = list(SPECIES_PROMETHEAN = 3)
+/datum/job/doctor/get_request_reasons()
+ return list("Surgery pending", "Viral outbreak", "Assembling expedition team")
+
//Medical Doctor Alt Titles
/datum/alt_title/surgeon
title = JOB_ALT_SURGEON
@@ -90,7 +110,22 @@
to produce the various types of virus foods or mutagens."
title_outfit = /decl/hierarchy/outfit/job/medical/doctor/virologist
-//Chemist is a medical job damnit //YEAH FUCK YOU SCIENCE -Pete //Guys, behave -Erro
+/datum/alt_title/physician
+ title = JOB_ALT_PHYSICIAN
+
+/datum/alt_title/medical_practitioner
+ title = JOB_ALT_MEDICAL_PRACTITIONER
+
+/datum/alt_title/orderly
+ title = JOB_ALT_ORDERLY
+ title_blurb = "An " + JOB_ALT_ORDERLY + " acts as Medbay's general helping hand, assisting any doctor that might need some form of help, as well as handling manual \
+ and dirty labor around the department."
+ title_outfit = /decl/hierarchy/outfit/job/medical/doctor/nurse
+
+/datum/alt_title/medical_contractor
+ title = JOB_ALT_MEDICAL_CONTRACTOR
+ title_blurb = "A " + JOB_ALT_MEDICAL_CONTRACTOR + " can be anything from a full-blown doctor to the likes of a nurse or orderly, but isn't directly employed by NT proper."
+
//////////////////////////////////
// Chemist
//////////////////////////////////
@@ -102,6 +137,7 @@
faction = FACTION_STATION
total_positions = 2
spawn_positions = 2
+ pto_type = PTO_MEDICAL
supervisors = "the " + JOB_CHIEF_MEDICAL_OFFICER
selection_color = "#013D3B"
economic_modifier = 5
@@ -113,13 +149,17 @@
outfit_type = /decl/hierarchy/outfit/job/medical/chemist
job_description = "A " + JOB_CHEMIST + " produces and maintains a stock of basic to advanced chemicals for medical and occasionally research use. \
They are likely to know the use and dangers of many lab-produced chemicals."
- alt_titles = list(JOB_ALT_PHARMACIST = /datum/alt_title/pharmacist)
+ alt_titles = list(JOB_ALT_PHARMACIST = /datum/alt_title/pharmacist, JOB_ALT_PHARMACOLOGIST = /datum/alt_title/pharmacologist)
// Chemist Alt Titles
/datum/alt_title/pharmacist
title = JOB_ALT_PHARMACIST
title_blurb = "A " + JOB_ALT_PHARMACIST + " focuses on the chemical needs of the Medical Department, and often offers to fill crew prescriptions at their discretion."
+/datum/alt_title/pharmacologist
+ title = JOB_ALT_PHARMACOLOGIST
+ title_blurb = "A " + JOB_ALT_PHARMACOLOGIST + " focuses on the chemical needs of the Medical Department, primarily specializing in producing more advanced forms of medicine."
+
/* I'm commenting out Geneticist so you can't actually see it in the job menu, given that you can't play as one - Jon.
//////////////////////////////////
// Geneticist
@@ -154,6 +194,7 @@
faction = FACTION_STATION
total_positions = 1
spawn_positions = 1
+ pto_type = PTO_MEDICAL
economic_modifier = 5
supervisors = "the " + JOB_CHIEF_MEDICAL_OFFICER
selection_color = "#013D3B"
@@ -162,7 +203,7 @@
outfit_type = /decl/hierarchy/outfit/job/medical/psychiatrist
job_description = "A " + JOB_PSYCHIATRIST + " provides mental health services to crew members in need. They may also be called upon to determine whatever \
ails the mentally unwell, frequently under Security supervision. They understand the effects of various psychoactive drugs."
- alt_titles = list(JOB_ALT_PSYCHOLOGIST = /datum/alt_title/psychologist)
+ alt_titles = list(JOB_ALT_PSYCHOLOGIST = /datum/alt_title/psychologist, JOB_ALT_PSYCHOANALYST = /datum/alt_title/psychoanalyst, JOB_ALT_PSYCHOTHERAPIST = /datum/alt_title/psychotherapist)
banned_job_species = list(SPECIES_PROMETHEAN, SPECIES_DIONA)
//Psychiatrist Alt Titles
@@ -172,6 +213,18 @@
called upon to determine whatever ails the mentally unwell, frequently under Security supervision."
title_outfit = /decl/hierarchy/outfit/job/medical/psychiatrist/psychologist
+/datum/alt_title/psychoanalyst
+ title = JOB_ALT_PSYCHOANALYST
+ title_blurb = "A " + JOB_ALT_PSYCHOANALYST + " provides mental health services to crew members in need, focusing more on therapy than medication. They may also be \
+ called upon to determine whatever ails the mentally unwell, frequently under Security supervision."
+ title_outfit = /decl/hierarchy/outfit/job/medical/psychiatrist/psychologist
+
+/datum/alt_title/psychotherapist
+ title = JOB_ALT_PSYCHOTHERAPIST
+ title_blurb = "A " + JOB_ALT_PSYCHOTHERAPIST + " provides mental health services to crew members in need, focusing more on therapy than medication. They may also be \
+ called upon to determine whatever ails the mentally unwell, frequently under Security supervision."
+ title_outfit = /decl/hierarchy/outfit/job/medical/psychiatrist/psychologist
+
//////////////////////////////////
// Paramedic
//////////////////////////////////
@@ -181,8 +234,9 @@
departments = list(DEPARTMENT_MEDICAL)
department_flag = MEDSCI
faction = FACTION_STATION
- total_positions = 2
- spawn_positions = 2
+ total_positions = 3
+ spawn_positions = 3
+ pto_type = PTO_MEDICAL
supervisors = "the " + JOB_CHIEF_MEDICAL_OFFICER
selection_color = "#013D3B"
economic_modifier = 4
@@ -191,14 +245,26 @@
outfit_type = /decl/hierarchy/outfit/job/medical/paramedic
job_description = "A " + JOB_PARAMEDIC + " is primarily concerned with the recovery of patients who are unable to make it to the Medical Department on their own. \
They may also be called upon to keep patients stable when Medical is busy or understaffed."
- alt_titles = list(JOB_ALT_EMERGENCY_MEDICAL_TECHNICIAN = /datum/alt_title/emt)
+ alt_titles = list(JOB_ALT_EMERGENCY_MEDICAL_TECHNICIAN = /datum/alt_title/emt, JOB_ALT_MEDICAL_RESPONDER = /datum/alt_title/medical_responder, JOB_ALT_SEARCH_AND_RESCUE = /datum/alt_title/sar)
banned_job_species = list(SPECIES_DIONA)
min_age_by_species = list(SPECIES_PROMETHEAN = 2)
+/datum/job/paramedic/get_request_reasons()
+ return list("Assembling expedition team")
+
// Paramedic Alt Titles
/datum/alt_title/emt
title = JOB_ALT_EMERGENCY_MEDICAL_TECHNICIAN
title_blurb = "An " + JOB_ALT_EMERGENCY_MEDICAL_TECHNICIAN + " is primarily concerned with the recovery of patients who are unable to make it to the Medical Department on their \
own. They are capable of keeping a patient stabilized until they reach the hands of someone with more training."
title_outfit = /decl/hierarchy/outfit/job/medical/paramedic/emt
+
+/datum/alt_title/medical_responder
+ title = JOB_ALT_MEDICAL_RESPONDER
+ title_blurb = "A " + JOB_ALT_MEDICAL_RESPONDER + " is primarily concerned with the recovery of patients who are unable to make it to the Medical Department on their \
+ own. They are capable of keeping a patient stabilized until they reach the hands of someone with more training."
+ title_outfit = /decl/hierarchy/outfit/job/medical/paramedic/emt
+
+/datum/alt_title/sar
+ title = JOB_ALT_SEARCH_AND_RESCUE
diff --git a/code/game/jobs/job/medical_vr.dm b/code/game/jobs/job/medical_vr.dm
deleted file mode 100644
index 9d08fdfcf2..0000000000
--- a/code/game/jobs/job/medical_vr.dm
+++ /dev/null
@@ -1,97 +0,0 @@
-/datum/job/cmo
- disallow_jobhop = TRUE
- pto_type = PTO_MEDICAL
- dept_time_required = 60
-
- access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads,
- access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
- access_keycard_auth, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels, access_gateway)
-
- minimal_access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads,
- access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
- access_keycard_auth, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels, access_gateway)
- alt_titles = list(JOB_ALT_CHIEF_PHYSICIAN = /datum/alt_title/chief_physician, JOB_ALT_MEDICAL_DIRECTOR = /datum/alt_title/medical_director, JOB_ALT_HEALTHCARE_MANAGER = /datum/alt_title/healthcare_manager)
-
-/datum/alt_title/chief_physician
- title = JOB_ALT_CHIEF_PHYSICIAN
-
-/datum/alt_title/medical_director
- title = JOB_ALT_MEDICAL_DIRECTOR
-
-/datum/alt_title/healthcare_manager
- title = JOB_ALT_HEALTHCARE_MANAGER
-
-/datum/job/cmo/get_request_reasons()
- return list("Surgery pending", "Viral outbreak", "Training crew", "Assembling expedition team")
-
-
-/datum/job/doctor
- spawn_positions = 5
- pto_type = PTO_MEDICAL
- alt_titles = list(JOB_ALT_PHYSICIAN = /datum/alt_title/physician, JOB_ALT_MEDICAL_PRACTITIONER = /datum/alt_title/medical_practitioner, JOB_ALT_SURGEON = /datum/alt_title/surgeon,
- JOB_ALT_EMERGENCY_PHYSICIAN = /datum/alt_title/emergency_physician, JOB_ALT_NURSE = /datum/alt_title/nurse, JOB_ALT_ORDERLY = /datum/alt_title/orderly,
- JOB_ALT_VIROLOGIST = /datum/alt_title/virologist, JOB_ALT_MEDICAL_CONTRACTOR = /datum/alt_title/medical_contractor)
-
-/datum/alt_title/physician
- title = JOB_ALT_PHYSICIAN
-
-/datum/alt_title/medical_practitioner
- title = JOB_ALT_MEDICAL_PRACTITIONER
-
-/datum/alt_title/orderly
- title = JOB_ALT_ORDERLY
- title_blurb = "An " + JOB_ALT_ORDERLY + " acts as Medbay's general helping hand, assisting any doctor that might need some form of help, as well as handling manual \
- and dirty labor around the department."
- title_outfit = /decl/hierarchy/outfit/job/medical/doctor/nurse
-
-/datum/alt_title/medical_contractor
- title = JOB_ALT_MEDICAL_CONTRACTOR
- title_blurb = "A " + JOB_ALT_MEDICAL_CONTRACTOR + " can be anything from a full-blown doctor to the likes of a nurse or orderly, but isn't directly employed by NT proper."
-
-/datum/job/doctor/get_request_reasons()
- return list("Surgery pending", "Viral outbreak", "Assembling expedition team")
-
-
-/datum/job/chemist
- pto_type = PTO_MEDICAL
- alt_titles = list(JOB_ALT_PHARMACIST = /datum/alt_title/pharmacist, JOB_ALT_PHARMACOLOGIST = /datum/alt_title/pharmacologist)
-
-/datum/alt_title/pharmacologist
- title = JOB_ALT_PHARMACOLOGIST
- title_blurb = "A " + JOB_ALT_PHARMACOLOGIST + " focuses on the chemical needs of the Medical Department, primarily specializing in producing more advanced forms of medicine."
-
-
-/datum/job/psychiatrist
- pto_type = PTO_MEDICAL
- alt_titles = list(JOB_ALT_PSYCHOLOGIST = /datum/alt_title/psychologist, JOB_ALT_PSYCHOANALYST = /datum/alt_title/psychoanalyst, JOB_ALT_PSYCHOTHERAPIST = /datum/alt_title/psychotherapist)
-
-/datum/alt_title/psychoanalyst
- title = JOB_ALT_PSYCHOANALYST
- title_blurb = "A " + JOB_ALT_PSYCHOANALYST + " provides mental health services to crew members in need, focusing more on therapy than medication. They may also be \
- called upon to determine whatever ails the mentally unwell, frequently under Security supervision."
- title_outfit = /decl/hierarchy/outfit/job/medical/psychiatrist/psychologist
-
-/datum/alt_title/psychotherapist
- title = JOB_ALT_PSYCHOTHERAPIST
- title_blurb = "A " + JOB_ALT_PSYCHOTHERAPIST + " provides mental health services to crew members in need, focusing more on therapy than medication. They may also be \
- called upon to determine whatever ails the mentally unwell, frequently under Security supervision."
- title_outfit = /decl/hierarchy/outfit/job/medical/psychiatrist/psychologist
-
-
-/datum/job/paramedic
- pto_type = PTO_MEDICAL
- alt_titles = list(JOB_ALT_EMERGENCY_MEDICAL_TECHNICIAN = /datum/alt_title/emt, JOB_ALT_MEDICAL_RESPONDER = /datum/alt_title/medical_responder, JOB_ALT_SEARCH_AND_RESCUE = /datum/alt_title/sar)
- total_positions = 3
- spawn_positions = 3
-
-/datum/alt_title/medical_responder
- title = JOB_ALT_MEDICAL_RESPONDER
- title_blurb = "A " + JOB_ALT_MEDICAL_RESPONDER + " is primarily concerned with the recovery of patients who are unable to make it to the Medical Department on their \
- own. They are capable of keeping a patient stabilized until they reach the hands of someone with more training."
- title_outfit = /decl/hierarchy/outfit/job/medical/paramedic/emt
-
-/datum/alt_title/sar
- title = JOB_ALT_SEARCH_AND_RESCUE
-
-/datum/job/paramedic/get_request_reasons()
- return list("Assembling expedition team")
diff --git a/code/game/jobs/job/offduty_vr.dm b/code/game/jobs/job/offduty.dm
similarity index 100%
rename from code/game/jobs/job/offduty_vr.dm
rename to code/game/jobs/job/offduty.dm
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index c67dbe59ad..a7d158ec30 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -16,13 +16,13 @@
req_admin_notify = 1
economic_modifier = 15
access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
- access_tox_storage, access_teleporter, access_sec_doors,
+ access_tox_storage, access_teleporter,
access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage,
- access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_network)
+ access_RC_announce, access_keycard_auth, access_tcomsat, access_xenoarch, access_eva, access_network, access_xenobotany)
minimal_access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
- access_tox_storage, access_teleporter, access_sec_doors,
+ access_tox_storage, access_teleporter,
access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage,
- access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_network)
+ access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network, access_xenobotany)
minimum_character_age = 25
minimal_player_age = 14
@@ -30,19 +30,34 @@
ideal_character_age = 50
ideal_age_by_species = list(SPECIES_UNATHI = 140, "mechanical" = 20, SPECIES_HUMAN_VATBORN = 20)
banned_job_species = list(SPECIES_TESHARI, SPECIES_DIONA, SPECIES_PROMETHEAN, SPECIES_ZADDAT, "digital")
+ disallow_jobhop = TRUE
+ pto_type = PTO_SCIENCE
+ dept_time_required = 60
outfit_type = /decl/hierarchy/outfit/job/science/rd
job_description = "The " + JOB_RESEARCH_DIRECTOR + " manages and maintains the Research department. They are required to ensure the safety of the entire crew, \
at least with regards to anything occurring in the Research department, and to inform the crew of any disruptions that \
might originate from Research. The " + JOB_RESEARCH_DIRECTOR + " often has at least passing knowledge of most of the Research department, but \
are encouraged to allow their staff to perform their own duties."
- alt_titles = list(JOB_ALT_RESEARCH_SUPERVISOR = /datum/alt_title/research_supervisor)
+ alt_titles = list(JOB_ALT_RESEARCH_SUPERVISOR = /datum/alt_title/research_supervisor, JOB_ALT_RESEARCH_MANAGER = /datum/alt_title/research_manager,
+ JOB_ALT_HEAD_OF_DEVELOPMENT = /datum/alt_title/head_of_development,JOB_ALT_HEAD_SCIENTIST = /datum/alt_title/head_scientist)
+/datum/job/rd/get_request_reasons()
+ return list("Repairs needed", "Training crew", "Assembling expedition team")
// " + JOB_RESEARCH_DIRECTOR + " Alt Titles
/datum/alt_title/research_supervisor
title = JOB_ALT_RESEARCH_SUPERVISOR
+/datum/alt_title/research_manager
+ title = JOB_ALT_RESEARCH_MANAGER
+
+/datum/alt_title/head_of_development
+ title = JOB_ALT_HEAD_OF_DEVELOPMENT
+
+/datum/alt_title/head_scientist
+ title = JOB_ALT_HEAD_SCIENTIST
+
//////////////////////////////////
// Scientist
//////////////////////////////////
@@ -53,11 +68,12 @@
department_flag = MEDSCI
faction = FACTION_STATION
total_positions = 5
- spawn_positions = 3
+ spawn_positions = 5
+ pto_type = PTO_SCIENCE
supervisors = "the " + JOB_RESEARCH_DIRECTOR
selection_color = "#633D63"
economic_modifier = 7
- access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch)
+ access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch, access_xenobotany)
minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch)
min_age_by_species = list(SPECIES_PROMETHEAN = 2)
banned_job_species = list("digital")
@@ -68,8 +84,12 @@
job_description = "A " + JOB_SCIENTIST + " is a generalist working in the Research department, with general knowledge of the scientific process, as well as \
the principles and requirements of Research and Development. They may also formulate experiments of their own devising, if \
they find an appropriate topic."
- alt_titles = list(JOB_ALT_XENOARCHAEOLOGIST = /datum/alt_title/xenoarch, JOB_ALT_ANOMALIST = /datum/alt_title/anomalist, \
- JOB_ALT_PHORON_RESEARCHER = /datum/alt_title/phoron_research)
+ alt_titles = list(JOB_ALT_RESEARCHER = /datum/alt_title/researcher, JOB_ALT_LAB_ASSISTANT = /datum/alt_title/lab_assistant, JOB_ALT_XENOARCHAEOLOGIST = /datum/alt_title/xenoarch,
+ JOB_ALT_XENOPALEONTOLOGIST = /datum/alt_title/xenopaleontologist, JOB_ALT_ANOMALIST = /datum/alt_title/anomalist, JOB_ALT_PHORON_RESEARCHER = /datum/alt_title/phoron_research,
+ JOB_ALT_GAS_PHYSICIST = /datum/alt_title/gas_physicist, JOB_ALT_CIRCUIT_DESIGNER = /datum/alt_title/circuit_designer, JOB_ALT_CIRCUIT_PROGRAMMER = /datum/alt_title/circuit_programmer)
+
+/datum/job/scientist/get_request_reasons()
+ return list("Assembling expedition team")
// Scientist Alt Titles
/datum/alt_title/xenoarch
@@ -88,6 +108,35 @@
Many " + JOB_ALT_PHORON_RESEARCHER + "s are interested in the combustability and explosive properties of gaseous phoron, as well as the specific hazards \
of working with the substance in that state."
+/datum/alt_title/researcher
+ title = JOB_ALT_RESEARCHER
+
+/datum/alt_title/lab_assistant
+ title = JOB_ALT_LAB_ASSISTANT
+ title_blurb = "A " + JOB_ALT_LAB_ASSISTANT + " is a lower-level member of research staff, whose main purpose is to help scientists with their specialized work in more menial fashion, while also \
+ learning the specializations in process."
+
+/datum/alt_title/xenopaleontologist
+ title = JOB_ALT_XENOPALEONTOLOGIST
+ title_blurb = "A " + JOB_ALT_XENOPALEONTOLOGIST + " enters digsites in search of fossils and other ancient remants of alien life. These digsites are frequently in vacuum or other inhospitable \
+ locations, and as such a " + JOB_ALT_XENOPALEONTOLOGIST + " should be prepared to handle hostile evironmental conditions."
+
+/datum/alt_title/gas_physicist
+ title = JOB_ALT_GAS_PHYSICIST
+ title_blurb = "A " + JOB_ALT_GAS_PHYSICIST + " is a specialist in various practical applications of gasses, but currently focuses their attention on phoron, and has knowledge of its practical uses and dangers. \
+ Many " + JOB_ALT_GAS_PHYSICIST + "s are interested in the combustability and explosive properties of gaseous phoron, as well as the specific hazards \
+ of working with the substance in that state."
+
+/datum/alt_title/circuit_designer
+ title = JOB_ALT_CIRCUIT_DESIGNER
+ title_blurb = "A " + JOB_ALT_CIRCUIT_DESIGNER + " is a " + JOB_SCIENTIST + " whose expertise is working with integrated circuits. They are familar with the workings and programming of those devices. \
+ They work to create various useful devices using the capabilities of integrated circuitry."
+
+/datum/alt_title/circuit_programmer
+ title = JOB_ALT_CIRCUIT_PROGRAMMER
+ title_blurb = "A " + JOB_ALT_CIRCUIT_PROGRAMMER + " is a " + JOB_SCIENTIST + " whose expertise is working with integrated circuits. They are familar with the workings and programming of those devices. \
+ They work to create various useful devices using the capabilities of integrated circuitry."
+
//////////////////////////////////
// Xenobiologist
//////////////////////////////////
@@ -98,7 +147,8 @@
department_flag = MEDSCI
faction = FACTION_STATION
total_positions = 3
- spawn_positions = 2
+ spawn_positions = 3
+ pto_type = PTO_SCIENCE
supervisors = "the " + JOB_RESEARCH_DIRECTOR
selection_color = "#633D63"
economic_modifier = 7
@@ -112,15 +162,21 @@
outfit_type = /decl/hierarchy/outfit/job/science/xenobiologist
job_description = "A " + JOB_XENOBIOLOGIST + " studies esoteric lifeforms, usually in the relative safety of their lab. They attempt to find ways to benefit \
from the byproducts of these lifeforms, and their main subject at present is the Giant Slime."
-/*VR edit start
- alt_titles = list(JOB_XENOBOTANIST = /datum/alt_title/xenobot)
- Xenibiologist Alt Titles
+ alt_titles = list(JOB_ALT_XENOZOOLOGIST = /datum/alt_title/xenozoologist, JOB_ALT_XENOANTHROPOLOGIST = /datum/alt_title/xenoanthropologist)
+
+// Xenobiologist Alt Titles
/datum/alt_title/xenobot
title = JOB_XENOBOTANIST
title_blurb = "A " + JOB_XENOBOTANIST + " grows and cares for a variety of abnormal, custom made, and frequently dangerous plant life. When the products of these plants \
is both safe and beneficial to the station, they may choose to introduce it to the rest of the crew."
-VR edit end*/
+
+/datum/alt_title/xenozoologist
+ title = JOB_ALT_XENOZOOLOGIST
+
+/datum/alt_title/xenoanthropologist
+ title = JOB_ALT_XENOANTHROPOLOGIST
+ title_blurb = JOB_ALT_XENOANTHROPOLOGIST + " still heavily focuses their study on alien lifeforms, but their specialty leans more towards fellow sapient beings than simple animals."
//////////////////////////////////
// Roboticist
@@ -131,8 +187,9 @@ VR edit end*/
departments = list(DEPARTMENT_RESEARCH)
department_flag = MEDSCI
faction = FACTION_STATION
- total_positions = 2
+ total_positions = 3
spawn_positions = 2
+ pto_type = PTO_SCIENCE
supervisors = "the " + JOB_RESEARCH_DIRECTOR
selection_color = "#633D63"
economic_modifier = 5
@@ -145,7 +202,14 @@ VR edit end*/
outfit_type = /decl/hierarchy/outfit/job/science/roboticist
job_description = "A " + JOB_ROBOTICIST + " maintains and repairs the station's synthetics, including crew with prosthetic limbs. \
They can also assist the station by producing simple robots and even pilotable exosuits."
- alt_titles = list(JOB_ALT_BIOMECHANICAL_ENGINEER = /datum/alt_title/biomech, JOB_ALT_MECHATRONIC_ENGINEER = /datum/alt_title/mech_tech)
+ alt_titles = list(
+ JOB_ALT_ASSEMBLY_TECHNICIAN = /datum/alt_title/assembly_tech,
+ JOB_ALT_BIOMECHANICAL_ENGINEER = /datum/alt_title/biomech,
+ JOB_ALT_MECHATRONIC_ENGINEER = /datum/alt_title/mech_tech,
+ JOB_ALT_SOFTWARE_ENGINEER = /datum/alt_title/software_engi)
+
+/datum/job/roboticist/get_request_reasons()
+ return list("Repairs needed")
// Roboticist Alt Titles
/datum/alt_title/biomech
@@ -157,3 +221,41 @@ VR edit end*/
title = JOB_ALT_MECHATRONIC_ENGINEER
title_blurb = "A " + JOB_ALT_MECHATRONIC_ENGINEER + " focuses on the construction and maintenance of Exosuits, and should be well versed in their use. \
They may also be called upon to work on synthetics and prosthetics, if needed."
+
+/datum/alt_title/software_engi
+ title = JOB_ALT_SOFTWARE_ENGINEER
+ title_blurb = "A " + JOB_ALT_SOFTWARE_ENGINEER + " specializes in working with software and firmware. They also often deal with integrated circuits."
+
+/datum/alt_title/assembly_tech
+ title = JOB_ALT_ASSEMBLY_TECHNICIAN
+
+//////////////////////////////////
+// Xenobotanist
+//////////////////////////////////
+/datum/job/xenobotanist
+ title = JOB_XENOBOTANIST
+ flag = XENOBOTANIST
+ departments = list(DEPARTMENT_RESEARCH)
+ department_flag = MEDSCI
+ faction = FACTION_STATION
+ total_positions = 2
+ spawn_positions = 2
+ supervisors = "the " + JOB_RESEARCH_DIRECTOR
+ selection_color = "#633D63"
+ economic_modifier = 7
+ access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobotany, access_hydroponics)
+ minimal_access = list(access_research, access_xenobotany, access_hydroponics, access_tox_storage)
+ pto_type = PTO_SCIENCE
+
+ minimal_player_age = 14
+
+ outfit_type = /decl/hierarchy/outfit/job/science/xenobiologist
+ job_description = "A " + JOB_XENOBOTANIST + " grows and cares for a variety of abnormal, custom made, and frequently dangerous plant life. When the products of these plants \
+ are both safe and beneficial to the station, they may choose to introduce it to the rest of the crew."
+ alt_titles = list(JOB_ALT_XENOHYDROPONICIST = /datum/alt_title/xenohydroponicist, JOB_ALT_XENOFLORIST = /datum/alt_title/xenoflorist)
+
+/datum/alt_title/xenoflorist
+ title = JOB_ALT_XENOFLORIST
+
+/datum/alt_title/xenohydroponicist
+ title = JOB_ALT_XENOHYDROPONICIST
\ No newline at end of file
diff --git a/code/game/jobs/job/science_vr.dm b/code/game/jobs/job/science_vr.dm
deleted file mode 100644
index c0505e4109..0000000000
--- a/code/game/jobs/job/science_vr.dm
+++ /dev/null
@@ -1,134 +0,0 @@
-/datum/job/rd
- disallow_jobhop = TRUE
- pto_type = PTO_SCIENCE
- dept_time_required = 60
-
- access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
- access_tox_storage, access_teleporter,
- access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage,
- access_RC_announce, access_keycard_auth, access_tcomsat, access_xenoarch, access_eva, access_network, access_xenobotany)
- minimal_access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
- access_tox_storage, access_teleporter,
- access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage,
- access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network, access_xenobotany)
- alt_titles = list(JOB_ALT_RESEARCH_SUPERVISOR = /datum/alt_title/research_supervisor, JOB_ALT_RESEARCH_MANAGER = /datum/alt_title/research_manager,
- JOB_ALT_HEAD_OF_DEVELOPMENT = /datum/alt_title/head_of_development,JOB_ALT_HEAD_SCIENTIST = /datum/alt_title/head_scientist)
-
-/datum/alt_title/research_manager
- title = JOB_ALT_RESEARCH_MANAGER
-
-/datum/alt_title/head_of_development
- title = JOB_ALT_HEAD_OF_DEVELOPMENT
-
-/datum/alt_title/head_scientist
- title = JOB_ALT_HEAD_SCIENTIST
-
-/datum/job/rd/get_request_reasons()
- return list("Repairs needed", "Training crew", "Assembling expedition team")
-
-
-/datum/job/scientist
- spawn_positions = 5
- pto_type = PTO_SCIENCE
- alt_titles = list(JOB_ALT_RESEARCHER = /datum/alt_title/researcher, JOB_ALT_LAB_ASSISTANT = /datum/alt_title/lab_assistant, JOB_ALT_XENOARCHAEOLOGIST = /datum/alt_title/xenoarch,
- JOB_ALT_XENOPALEONTOLOGIST = /datum/alt_title/xenopaleontologist, JOB_ALT_ANOMALIST = /datum/alt_title/anomalist, JOB_ALT_PHORON_RESEARCHER = /datum/alt_title/phoron_research,
- JOB_ALT_GAS_PHYSICIST = /datum/alt_title/gas_physicist, JOB_ALT_CIRCUIT_DESIGNER = /datum/alt_title/circuit_designer, JOB_ALT_CIRCUIT_PROGRAMMER = /datum/alt_title/circuit_programmer)
-
-
- access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch, access_xenobotany)
- minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch) // Unchanged (for now?), mostly here for reference
-
-/datum/alt_title/researcher
- title = JOB_ALT_RESEARCHER
-
-/datum/alt_title/lab_assistant
- title = JOB_ALT_LAB_ASSISTANT
- title_blurb = "A " + JOB_ALT_LAB_ASSISTANT + " is a lower-level member of research staff, whose main purpose is to help scientists with their specialized work in more menial fashion, while also \
- learning the specializations in process."
-
-/datum/alt_title/xenopaleontologist
- title = JOB_ALT_XENOPALEONTOLOGIST
- title_blurb = "A " + JOB_ALT_XENOPALEONTOLOGIST + " enters digsites in search of fossils and other ancient remants of alien life. These digsites are frequently in vacuum or other inhospitable \
- locations, and as such a " + JOB_ALT_XENOPALEONTOLOGIST + " should be prepared to handle hostile evironmental conditions."
-
-/datum/alt_title/gas_physicist
- title = JOB_ALT_GAS_PHYSICIST
- title_blurb = "A " + JOB_ALT_GAS_PHYSICIST + " is a specialist in various practical applications of gasses, but currently focuses their attention on phoron, and has knowledge of its practical uses and dangers. \
- Many " + JOB_ALT_GAS_PHYSICIST + "s are interested in the combustability and explosive properties of gaseous phoron, as well as the specific hazards \
- of working with the substance in that state."
-
-/datum/alt_title/circuit_designer
- title = JOB_ALT_CIRCUIT_DESIGNER
- title_blurb = "A " + JOB_ALT_CIRCUIT_DESIGNER + " is a " + JOB_SCIENTIST + " whose expertise is working with integrated circuits. They are familar with the workings and programming of those devices. \
- They work to create various useful devices using the capabilities of integrated circuitry."
-
-/datum/alt_title/circuit_programmer
- title = JOB_ALT_CIRCUIT_PROGRAMMER
- title_blurb = "A " + JOB_ALT_CIRCUIT_PROGRAMMER + " is a " + JOB_SCIENTIST + " whose expertise is working with integrated circuits. They are familar with the workings and programming of those devices. \
- They work to create various useful devices using the capabilities of integrated circuitry."
-
-/datum/job/scientist/get_request_reasons()
- return list("Assembling expedition team")
-
-/datum/job/xenobiologist
- spawn_positions = 3
- pto_type = PTO_SCIENCE
- alt_titles = list(JOB_ALT_XENOZOOLOGIST = /datum/alt_title/xenozoologist, JOB_ALT_XENOANTHROPOLOGIST = /datum/alt_title/xenoanthropologist)
-
-/datum/alt_title/xenozoologist
- title = JOB_ALT_XENOZOOLOGIST
-
-/datum/alt_title/xenoanthropologist
- title = JOB_ALT_XENOANTHROPOLOGIST
- title_blurb = JOB_ALT_XENOANTHROPOLOGIST + " still heavily focuses their study on alien lifeforms, but their specialty leans more towards fellow sapient beings than simple animals."
-
-
-/datum/job/roboticist
- total_positions = 3
- pto_type = PTO_SCIENCE
- alt_titles = list(
- JOB_ALT_ASSEMBLY_TECHNICIAN = /datum/alt_title/assembly_tech,
- JOB_ALT_BIOMECHANICAL_ENGINEER = /datum/alt_title/biomech,
- JOB_ALT_MECHATRONIC_ENGINEER = /datum/alt_title/mech_tech,
- JOB_ALT_SOFTWARE_ENGINEER = /datum/alt_title/software_engi)
-
-/datum/alt_title/software_engi
- title = JOB_ALT_SOFTWARE_ENGINEER
- title_blurb = "A " + JOB_ALT_SOFTWARE_ENGINEER + " specializes in working with software and firmware. They also often deal with integrated circuits."
-
-/datum/alt_title/assembly_tech
- title = JOB_ALT_ASSEMBLY_TECHNICIAN
-
-/datum/job/roboticist/get_request_reasons()
- return list("Repairs needed")
-
-//////////////////////////////////
-// Xenobotanist
-//////////////////////////////////
-/datum/job/xenobotanist
- title = JOB_XENOBOTANIST
- flag = XENOBOTANIST
- departments = list(DEPARTMENT_RESEARCH)
- department_flag = MEDSCI
- faction = FACTION_STATION
- total_positions = 2
- spawn_positions = 2
- supervisors = "the " + JOB_RESEARCH_DIRECTOR
- selection_color = "#633D63"
- economic_modifier = 7
- access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobotany, access_hydroponics)
- minimal_access = list(access_research, access_xenobotany, access_hydroponics, access_tox_storage)
- pto_type = PTO_SCIENCE
-
- minimal_player_age = 14
-
- outfit_type = /decl/hierarchy/outfit/job/science/xenobiologist
- job_description = "A " + JOB_XENOBOTANIST + " grows and cares for a variety of abnormal, custom made, and frequently dangerous plant life. When the products of these plants \
- are both safe and beneficial to the station, they may choose to introduce it to the rest of the crew."
- alt_titles = list(JOB_ALT_XENOHYDROPONICIST = /datum/alt_title/xenohydroponicist, JOB_ALT_XENOFLORIST = /datum/alt_title/xenoflorist)
-
-/datum/alt_title/xenoflorist
- title = JOB_ALT_XENOFLORIST
-
-/datum/alt_title/xenohydroponicist
- title = JOB_ALT_XENOHYDROPONICIST
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index 372d459e62..db2a0e051c 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -16,26 +16,31 @@
req_admin_notify = 1
economic_modifier = 10
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
- access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
- access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
- access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)
+ access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
+ access_construction,
+ access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
- access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
- access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
- access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)
+ access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
+ access_construction,
+ access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)
minimum_character_age = 25
min_age_by_species = list(SPECIES_HUMAN_VATBORN = 14)
minimal_player_age = 14
ideal_character_age = 50
ideal_age_by_species = list(SPECIES_HUMAN_VATBORN = 20)
banned_job_species = list(SPECIES_TESHARI, SPECIES_DIONA, SPECIES_PROMETHEAN, SPECIES_ZADDAT, "digital", SPECIES_UNATHI, "mechanical")
+ disallow_jobhop = TRUE
+ pto_type = PTO_SECURITY
+ dept_time_required = 60
outfit_type = /decl/hierarchy/outfit/job/security/hos
job_description = " The " + JOB_HEAD_OF_SECURITY + " manages the Security Department, keeping the station safe and making sure the rules are followed. They are expected to \
keep the other Department Heads, and the rest of the crew, aware of developing situations that may be a threat. If necessary, the HoS may \
perform the duties of absent Security roles, such as distributing gear from the Armory."
- alt_titles = list(JOB_ALT_SECURITY_COMMANDER = /datum/alt_title/sec_commander, JOB_ALT_CHIEF_OF_SECURITY = /datum/alt_title/sec_chief)
+ alt_titles = list(JOB_ALT_SECURITY_COMMANDER = /datum/alt_title/sec_commander, JOB_ALT_CHIEF_OF_SECURITY = /datum/alt_title/sec_chief, JOB_ALT_SECURITY_MANAGER = /datum/alt_title/security_manager)
+/datum/job/hos/get_request_reasons()
+ return list("Wildlife management", "Forensic investigation", "Training crew", "Assembling expedition team")
// Head of Security Alt Titles
/datum/alt_title/sec_commander
@@ -44,6 +49,9 @@
/datum/alt_title/sec_chief
title = JOB_ALT_CHIEF_OF_SECURITY
+/datum/alt_title/security_manager
+ title = JOB_ALT_SECURITY_MANAGER
+
//////////////////////////////////
// Warden
//////////////////////////////////
@@ -59,17 +67,32 @@
supervisors = "the " + JOB_HEAD_OF_SECURITY
selection_color = "#601C1C"
economic_modifier = 5
+ pto_type = PTO_SECURITY
+ dept_time_required = 20
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_morgue, access_external_airlocks)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_external_airlocks)
minimal_player_age = 5
banned_job_species = list(SPECIES_ZADDAT, SPECIES_PROMETHEAN, SPECIES_TESHARI, SPECIES_DIONA)
-
+ alt_titles = list(JOB_ALT_BRIG_SENTRY = /datum/alt_title/brig_sentry, JOB_ALT_ARMORY_SUPERINTENDENT = /datum/alt_title/armory_superintendent, JOB_ALT_MASTERATARMS = /datum/alt_title/master_at_arms)
outfit_type = /decl/hierarchy/outfit/job/security/warden
job_description = "The " + JOB_WARDEN + " watches over the physical Security Department, making sure the Brig and Armoury are secure and in order at all times. They oversee \
prisoners that have been processed and brigged, and are responsible for their well being. The " + JOB_WARDEN + " is also in charge of distributing \
Armoury gear in a crisis, and retrieving it when the crisis has passed. In an emergency, the " + JOB_WARDEN + " may be called upon to direct the \
Security Department as a whole."
+/datum/job/warden/get_request_reasons()
+ return list("Wildlife management")
+
+//Warden Alt Titles
+/datum/alt_title/brig_sentry
+ title = JOB_ALT_BRIG_SENTRY
+
+/datum/alt_title/armory_superintendent
+ title = JOB_ALT_ARMORY_SUPERINTENDENT
+
+/datum/alt_title/master_at_arms
+ title = JOB_ALT_MASTERATARMS
+
//////////////////////////////////
// Detective
//////////////////////////////////
@@ -81,6 +104,7 @@
faction = FACTION_STATION
total_positions = 2
spawn_positions = 2
+ pto_type = PTO_SECURITY
supervisors = "the " + JOB_HEAD_OF_SECURITY
selection_color = "#601C1C"
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_eva, access_external_airlocks, access_brig) //Vorestation edit - access_brig
@@ -92,7 +116,10 @@
outfit_type = /decl/hierarchy/outfit/job/security/detective
job_description = "A " + JOB_DETECTIVE + " works to help Security find criminals who have not properly been identified, through interviews and forensic work. \
For crimes only witnessed after the fact, or those with no survivors, they attempt to piece together what they can from pure evidence."
- alt_titles = list(JOB_ALT_FORENSIC_TECHNICIAN = /datum/alt_title/forensic_tech)
+ alt_titles = list(JOB_ALT_INVESTIGATOR = /datum/alt_title/investigator, JOB_ALT_SECURITY_INSPECTOR = /datum/alt_title/security_inspector, JOB_ALT_FORENSIC_TECHNICIAN = /datum/alt_title/forensic_tech)
+
+/datum/job/detective/get_request_reasons()
+ return list("Forensic investigation")
// Detective Alt Titles
/datum/alt_title/forensic_tech
@@ -100,6 +127,12 @@
title_blurb = "A " + JOB_ALT_FORENSIC_TECHNICIAN + " works more with hard evidence and labwork than a " + JOB_DETECTIVE + ", but they share the purpose of solving crimes."
title_outfit = /decl/hierarchy/outfit/job/security/detective/forensic
+/datum/alt_title/investigator
+ title = JOB_ALT_INVESTIGATOR
+
+/datum/alt_title/security_inspector
+ title = JOB_ALT_SECURITY_INSPECTOR
+
//////////////////////////////////
// Security Officer
//////////////////////////////////
@@ -109,8 +142,9 @@
departments = list(DEPARTMENT_SECURITY)
department_flag = ENGSEC
faction = FACTION_STATION
- total_positions = 4
- spawn_positions = 4
+ total_positions = 5
+ spawn_positions = 5
+ pto_type = PTO_SECURITY
supervisors = "the " + JOB_HEAD_OF_SECURITY
selection_color = "#601C1C"
economic_modifier = 4
@@ -123,13 +157,29 @@
job_description = "A " + JOB_SECURITY_OFFICER + " is concerned with maintaining the safety and security of the station as a whole, dealing with external threats and \
apprehending criminals. A " + JOB_SECURITY_OFFICER + " is responsible for the health, safety, and processing of any prisoner they arrest. \
No one is above the Law, not Security or Command."
- alt_titles = list(JOB_ALT_JUNIOR_OFFICER = /datum/alt_title/junior_officer)
+ alt_titles = list(JOB_ALT_PATROL_OFFICER = /datum/alt_title/patrol_officer, JOB_ALT_SECURITY_GUARD = /datum/alt_title/security_guard,
+ JOB_ALT_SECURITY_DEPUTY = /datum/alt_title/security_guard, JOB_ALT_JUNIOR_OFFICER = /datum/alt_title/junior_officer, JOB_ALT_SECURITY_CONTRACTOR = /datum/alt_title/security_contractor)
min_age_by_species = list(SPECIES_PROMETHEAN = 3)
+/datum/job/officer/get_request_reasons()
+ return list("Wildlife management", "Assembling expedition team")
+
// Security Officer Alt Titles
/datum/alt_title/junior_officer
title = JOB_ALT_JUNIOR_OFFICER
title_blurb = "A " + JOB_ALT_JUNIOR_OFFICER + " is an inexperienced " + JOB_SECURITY_OFFICER + ". They likely have training, but not experience, and are frequently \
paired off with a more senior co-worker. Junior Officers may also be expected to take over the boring duties of other Officers \
including patrolling the station or maintaining specific posts."
+
+/datum/alt_title/patrol_officer
+ title = JOB_ALT_PATROL_OFFICER
+
+/datum/alt_title/security_guard
+ title = JOB_ALT_SECURITY_GUARD
+
+/datum/alt_title/security_deputy
+ title = JOB_ALT_SECURITY_DEPUTY
+
+/datum/alt_title/security_contractor
+ title = JOB_ALT_SECURITY_CONTRACTOR
diff --git a/code/game/jobs/job/security_vr.dm b/code/game/jobs/job/security_vr.dm
deleted file mode 100644
index b7c196b334..0000000000
--- a/code/game/jobs/job/security_vr.dm
+++ /dev/null
@@ -1,75 +0,0 @@
-/datum/job/hos
- disallow_jobhop = TRUE
- pto_type = PTO_SECURITY
- dept_time_required = 60
-
- access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
- access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
- access_construction,
- access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)
- minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
- access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
- access_construction,
- access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)
- alt_titles = list(JOB_ALT_SECURITY_COMMANDER = /datum/alt_title/sec_commander, JOB_ALT_CHIEF_OF_SECURITY = /datum/alt_title/sec_chief, JOB_ALT_SECURITY_MANAGER = /datum/alt_title/security_manager)
-
-/datum/alt_title/security_manager
- title = JOB_ALT_SECURITY_MANAGER
-
-/datum/job/hos/get_request_reasons()
- return list("Wildlife management", "Forensic investigation", "Training crew", "Assembling expedition team")
-
-
-/datum/job/warden
- pto_type = PTO_SECURITY
- dept_time_required = 20
- alt_titles = list(JOB_ALT_BRIG_SENTRY = /datum/alt_title/brig_sentry, JOB_ALT_ARMORY_SUPERINTENDENT = /datum/alt_title/armory_superintendent, JOB_ALT_MASTERATARMS = /datum/alt_title/master_at_arms)
-
-/datum/alt_title/brig_sentry
- title = JOB_ALT_BRIG_SENTRY
-
-/datum/alt_title/armory_superintendent
- title = JOB_ALT_ARMORY_SUPERINTENDENT
-
-/datum/alt_title/master_at_arms
- title = JOB_ALT_MASTERATARMS
-
-/datum/job/warden/get_request_reasons()
- return list("Wildlife management")
-
-
-/datum/job/detective
- pto_type = PTO_SECURITY
- alt_titles = list(JOB_ALT_INVESTIGATOR = /datum/alt_title/investigator, JOB_ALT_SECURITY_INSPECTOR = /datum/alt_title/security_inspector, JOB_ALT_FORENSIC_TECHNICIAN = /datum/alt_title/forensic_tech)
-
-/datum/alt_title/investigator
- title = JOB_ALT_INVESTIGATOR
-
-/datum/alt_title/security_inspector
- title = JOB_ALT_SECURITY_INSPECTOR
-
-/datum/job/detective/get_request_reasons()
- return list("Forensic investigation")
-
-
-/datum/job/officer
- total_positions = 5
- spawn_positions = 5
- pto_type = PTO_SECURITY
- alt_titles = list(JOB_ALT_PATROL_OFFICER = /datum/alt_title/patrol_officer, JOB_ALT_SECURITY_GUARD = /datum/alt_title/security_guard,
- JOB_ALT_SECURITY_DEPUTY = /datum/alt_title/security_guard, JOB_ALT_JUNIOR_OFFICER = /datum/alt_title/junior_officer, JOB_ALT_SECURITY_CONTRACTOR = /datum/alt_title/security_contractor)
-
-/datum/alt_title/patrol_officer
- title = JOB_ALT_PATROL_OFFICER
-
-/datum/alt_title/security_guard
- title = JOB_ALT_SECURITY_GUARD
-
-/datum/alt_title/security_deputy
- title = JOB_ALT_SECURITY_DEPUTY
-
-/datum/alt_title/security_contractor
- title = JOB_ALT_SECURITY_CONTRACTOR
-
-/datum/job/officer/get_request_reasons()
- return list("Wildlife management", "Assembling expedition team")
diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm
index 6a5812af07..cce3f69603 100644
--- a/code/game/jobs/job/silicon.dm
+++ b/code/game/jobs/job/silicon.dm
@@ -19,6 +19,8 @@
has_headset = FALSE
assignable = FALSE
mob_type = JOB_SILICON_AI
+ disallow_jobhop = TRUE
+ pto_type = PTO_CIVILIAN
outfit_type = /decl/hierarchy/outfit/job/silicon/ai
job_description = "The " + JOB_AI + " oversees the operation of the station and its crew, but has no real authority over them. \
The " + JOB_AI + " is required to follow its Laws, and Lawbound Synthetics that are linked to it are expected to follow \
@@ -46,8 +48,10 @@
departments = list(DEPARTMENT_SYNTHETIC)
department_flag = ENGSEC
faction = FACTION_STATION
- total_positions = 2
- spawn_positions = 2
+ pto_type = PTO_CYBORG
+ minimal_player_age = 3 //1 day is a little too little time
+ total_positions = 4 //Along with one able to spawn later in the round.
+ spawn_positions = 3 //Let's have 3 able to spawn in roundstart
supervisors = "your Laws and the " + JOB_AI //Nodrak
selection_color = "#254C25"
minimal_player_age = 1
diff --git a/code/game/jobs/job/silicon_vr.dm b/code/game/jobs/job/silicon_vr.dm
deleted file mode 100644
index f5df1e3acf..0000000000
--- a/code/game/jobs/job/silicon_vr.dm
+++ /dev/null
@@ -1,9 +0,0 @@
-/datum/job/ai
- disallow_jobhop = TRUE
- pto_type = PTO_CIVILIAN
-
-/datum/job/cyborg
- pto_type = PTO_CYBORG
- minimal_player_age = 3 //1 day is a little too little time
- total_positions = 4 //Along with one able to spawn later in the round.
- spawn_positions = 3 //Let's have 3 able to spawn in roundstart
\ No newline at end of file
diff --git a/code/game/jobs/job/special_vr.dm b/code/game/jobs/job/special.dm
similarity index 100%
rename from code/game/jobs/job/special_vr.dm
rename to code/game/jobs/job/special.dm
diff --git a/code/game/machinery/computer/arcade_vr.dm b/code/game/machinery/computer/arcade_vr.dm
index a1d4ebb069..80daaceb52 100644
--- a/code/game/machinery/computer/arcade_vr.dm
+++ b/code/game/machinery/computer/arcade_vr.dm
@@ -22,7 +22,6 @@
/obj/item/toy/redbutton = 2,
/obj/item/toy/gnome = 2,
/obj/item/toy/AI = 2,
- /obj/item/clothing/gloves/ring/buzzer/toy = 2,
/obj/item/storage/box/handcuffs/fake = 2,
/obj/item/toy/nuke = 2,
/obj/item/toy/minigibber = 2,
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 2f70e0436e..8055af222c 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -437,12 +437,12 @@
return ..(M)
/obj/machinery/door/update_nearby_tiles(need_rebuild)
- if(!air_master)
+ if(!SSair)
return 0
for(var/turf/simulated/turf in locs)
update_heat_protection(turf)
- air_master.mark_for_update(turf)
+ SSair.mark_for_update(turf)
return 1
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index d4477eeac0..4502ed9334 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -501,15 +501,15 @@
update_nearby_tiles(need_rebuild)
- if(!air_master) return 0
+ if(!SSair) return 0
var/turf/simulated/source = loc
var/turf/simulated/destination = get_step(source,dir)
update_heat_protection(loc)
- if(istype(source)) air_master.tiles_to_update += source
- if(istype(destination)) air_master.tiles_to_update += destination
+ if(istype(source)) SSair.tiles_to_update += source
+ if(istype(destination)) SSair.tiles_to_update += destination
return 1
*/
diff --git a/code/game/objects/effects/chem/coating.dm b/code/game/objects/effects/chem/coating.dm
index 2e9ad26049..13a3cb4c39 100644
--- a/code/game/objects/effects/chem/coating.dm
+++ b/code/game/objects/effects/chem/coating.dm
@@ -34,3 +34,5 @@
/obj/effect/decal/cleanable/chemcoating/update_icon()
..()
color = reagents.get_color()
+ cut_overlays()
+ add_janitor_hud_overlay()
diff --git a/code/game/objects/effects/decals/Cleanable/aliens.dm b/code/game/objects/effects/decals/Cleanable/aliens.dm
index 57a32434af..37cf4c29a7 100644
--- a/code/game/objects/effects/decals/Cleanable/aliens.dm
+++ b/code/game/objects/effects/decals/Cleanable/aliens.dm
@@ -13,6 +13,8 @@
/obj/effect/decal/cleanable/blood/gibs/xeno/update_icon()
color = "#FFFFFF"
+ cut_overlays()
+ add_janitor_hud_overlay()
/obj/effect/decal/cleanable/blood/gibs/xeno/up
random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6","xgibup1","xgibup1","xgibup1")
@@ -30,4 +32,4 @@
random_icon_states = list("xgibmid1", "xgibmid2", "xgibmid3")
/obj/effect/decal/cleanable/blood/xtracks
- basecolor = "#05EE05"
\ No newline at end of file
+ basecolor = "#05EE05"
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index 184bee8bed..a27bff7038 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -70,6 +70,8 @@ var/global/list/image/splatter_cache=list()
else
name = initial(name)
desc = initial(desc)
+ cut_overlays()
+ add_janitor_hud_overlay()
/obj/effect/decal/cleanable/blood/Crossed(mob/living/carbon/human/perp)
if(perp.is_incorporeal())
@@ -210,6 +212,7 @@ var/global/list/image/splatter_cache=list()
icon = blood
cut_overlays()
add_overlay(giblets)
+ add_janitor_hud_overlay()
/obj/effect/decal/cleanable/blood/gibs/up
random_icon_states = list("gib1", "gib2", "gib3", "gib5", "gib6","gibup1","gibup1","gibup1")
diff --git a/code/game/objects/effects/decals/Cleanable/robots.dm b/code/game/objects/effects/decals/Cleanable/robots.dm
index b0980966a3..26a4fb11af 100644
--- a/code/game/objects/effects/decals/Cleanable/robots.dm
+++ b/code/game/objects/effects/decals/Cleanable/robots.dm
@@ -10,6 +10,8 @@
/obj/effect/decal/cleanable/blood/gibs/robot/update_icon()
color = "#FFFFFF"
+ cut_overlays()
+ add_janitor_hud_overlay()
/obj/effect/decal/cleanable/blood/gibs/robot/dry() //pieces of robots do not dry up like
return
@@ -49,4 +51,4 @@
/obj/effect/decal/cleanable/blood/oil/streak
random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5")
- amount = 2
\ No newline at end of file
+ amount = 2
diff --git a/code/game/objects/effects/decals/Cleanable/tracks.dm b/code/game/objects/effects/decals/Cleanable/tracks.dm
index 3d9e74ca6a..400a6124a4 100644
--- a/code/game/objects/effects/decals/Cleanable/tracks.dm
+++ b/code/game/objects/effects/decals/Cleanable/tracks.dm
@@ -142,6 +142,7 @@ var/global/list/image/fluidtrack_cache=list()
stack[stack_idx]=track
add_overlay(I)
updatedtracks=0 // Clear our memory of updated tracks.
+ add_janitor_hud_overlay()
/obj/effect/decal/cleanable/blood/tracks/footprints
name = "wet footprints"
diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm
index 7338689e33..a56798eae9 100644
--- a/code/game/objects/effects/decals/cleanable.dm
+++ b/code/game/objects/effects/decals/cleanable.dm
@@ -12,7 +12,6 @@ generic_filth = TRUE means when the decal is saved, it will be switched out for
var/generic_filth = FALSE
var/age = 0
var/list/random_icon_states = list()
- var/obj/effect/decal/jan_hud/jan_icon = null
/obj/effect/decal/cleanable/Initialize(var/mapload, var/_age)
if(!isnull(_age))
@@ -21,12 +20,11 @@ generic_filth = TRUE means when the decal is saved, it will be switched out for
src.icon_state = pick(src.random_icon_states)
if(!mapload || !CONFIG_GET(flag/persistence_ignore_mapload))
SSpersistence.track_value(src, /datum/persistent/filth)
- jan_icon = new/obj/effect/decal/jan_hud(src.loc)
. = ..()
+ update_icon()
/obj/effect/decal/cleanable/Destroy()
SSpersistence.forget_value(src, /datum/persistent/filth)
- QDEL_NULL(jan_icon)
. = ..()
/obj/effect/decal/cleanable/clean_blood(var/ignore = 0)
@@ -40,13 +38,25 @@ generic_filth = TRUE means when the decal is saved, it will be switched out for
src.icon_state = pick(src.random_icon_states)
..()
-/obj/effect/decal/jan_hud
- plane = PLANE_JANHUD
- layer = BELOW_MOB_LAYER
- vis_flags = VIS_HIDE
- persist_storable = FALSE
- icon = 'icons/mob/hud.dmi'
- mouse_opacity = 0
-/obj/effect/decal/jan_hud/Initialize()
- src.icon_state = "janhud[rand(1,9)]"
+/obj/effect/decal/cleanable/update_icon()
+ // Overrides should not inheret from this, and instead replace it entirely to match this in some form.
+ // add_janitor_hud_overlay() does not pre-cut overlays, so cut_overlays() must be called first.
+ // This is so it may be used with update_icon() overrides that use overlays, while adding the janitor overlay at the end.
+ cut_overlays()
+ add_janitor_hud_overlay()
+
+
+/obj/effect/decal/cleanable/proc/add_janitor_hud_overlay()
+ // This was original a seperate object that followed the grime, it got stuck in everything you can imagine!
+ // It also likely doubled the memory use of every cleanable decal on station...
+ var/image/hud = image('icons/mob/hud.dmi', src, "janhud[rand(1,9)]")
+ hud.appearance_flags = (RESET_COLOR|PIXEL_SCALE|KEEP_APART)
+ hud.plane = PLANE_JANHUD
+ hud.layer = BELOW_MOB_LAYER
+ hud.mouse_opacity = 0
+ //HUD VARIANT: Allows the hud to show up with it's normal alpha, even if the 'dirty thing' it's attached to has a low alpha (ex: dirt). If you want to disable it, simply comment out the lines between the 'HUD VARIANT' tag!
+ hud.appearance_flags = RESET_ALPHA
+ hud.alpha = 255
+ //HUD VARIANT end
+ add_overlay(hud)
diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm
index 493529cede..0f1803aa77 100644
--- a/code/game/objects/effects/decals/crayon.dm
+++ b/code/game/objects/effects/decals/crayon.dm
@@ -6,26 +6,39 @@
layer = DIRTY_LAYER
anchored = TRUE
-/obj/effect/decal/cleanable/crayon/New(location,main = "#FFFFFF",shade = "#000000",var/type = "rune")
- ..()
- loc = location
+ var/art_type
+ var/art_color
+ var/art_shade
+/obj/effect/decal/cleanable/crayon/Initialize(var/ml, main = "#FFFFFF",shade = "#000000",var/type = "rune", new_age = 0)
name = type
desc = "A [type] drawn in crayon."
+ // Persistence vars. Unused here but used downstream. If someone updates the persistance code, it's here.
+ art_type = type
+ art_color = main
+ art_shade = shade
+
switch(type)
if("rune")
type = "rune[rand(1,6)]"
if("graffiti")
type = pick("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa")
- var/icon/mainOverlay = new/icon('icons/effects/crayondecal.dmi',"[type]",2.1)
- var/icon/shadeOverlay = new/icon('icons/effects/crayondecal.dmi',"[type]s",2.1)
+ . = ..(ml, new_age) // mapload, age
- mainOverlay.Blend(main,ICON_ADD)
- shadeOverlay.Blend(shade,ICON_ADD)
+/obj/effect/decal/cleanable/crayon/update_icon()
+ cut_overlays()
+ var/icon/mainOverlay = new/icon('icons/effects/crayondecal.dmi',"[art_type]",2.1)
+ var/icon/shadeOverlay = new/icon('icons/effects/crayondecal.dmi',"[art_type]s",2.1)
- add_overlay(mainOverlay)
- add_overlay(shadeOverlay)
+ if(mainOverlay && shadeOverlay)
+ mainOverlay.Blend(art_color,ICON_ADD)
+ shadeOverlay.Blend(art_shade,ICON_ADD)
- add_hiddenprint(usr)
+ add_overlay(mainOverlay)
+ add_overlay(shadeOverlay)
+
+ add_janitor_hud_overlay()
+ return
+// CHOMPEdit End
diff --git a/code/game/objects/effects/zone_divider.dm b/code/game/objects/effects/zone_divider.dm
index fa2ea82531..3638219b20 100644
--- a/code/game/objects/effects/zone_divider.dm
+++ b/code/game/objects/effects/zone_divider.dm
@@ -13,8 +13,8 @@
// Special case to prevent us from being part of a zone during the first air master tick.
// We must merge ourselves into a zone on next tick. This will cause a bit of lag on
// startup, but it can't really be helped you know?
- if(air_master && air_master.current_cycle == 0)
+ if(SSair && SSair.current_cycle == 0)
spawn(1)
- air_master.mark_for_update(get_turf(src))
+ SSair.mark_for_update(get_turf(src))
return FALSE
return is_zone ? FALSE : TRUE // Anything except zones can pass
diff --git a/code/game/objects/items/antag_spawners.dm b/code/game/objects/items/antag_spawners.dm
index 8371f5b017..2881753189 100644
--- a/code/game/objects/items/antag_spawners.dm
+++ b/code/game/objects/items/antag_spawners.dm
@@ -118,7 +118,6 @@
to speak with your team, and learn what their plan is for today."))
R.key = C.key
-// R.Namepick() // Apparnetly making someone a merc lets them pick a name, so this isn't needed.
spawn(1)
mercs.add_antagonist(R.mind, FALSE, TRUE, FALSE, FALSE, FALSE)
diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm
index 84b8d743f6..c0f82b0b15 100644
--- a/code/game/objects/items/blueprints.dm
+++ b/code/game/objects/items/blueprints.dm
@@ -251,9 +251,9 @@
if (!isturf(NT) || (NT in found) || (NT in pending))
continue
// We ask ZAS to determine if its airtight. Thats what matters anyway right?
- if(air_master.air_blocked(T, NT))
+ if(SSair.air_blocked(T, NT))
// Okay thats the edge of the room
- if(get_area_type(NT.loc) == AREA_SPACE && air_master.air_blocked(NT, NT))
+ if(get_area_type(NT.loc) == AREA_SPACE && SSair.air_blocked(NT, NT))
found += NT // So we include walls/doors not already in any area
continue
if (istype(NT, /turf/space))
diff --git a/code/game/objects/items/blueprints_vr.dm b/code/game/objects/items/blueprints_vr.dm
index 336a6219d9..214bbff518 100644
--- a/code/game/objects/items/blueprints_vr.dm
+++ b/code/game/objects/items/blueprints_vr.dm
@@ -678,9 +678,9 @@
if(!visual && forbiddenAreas[NT.loc.type])
return ROOM_ERR_FORBIDDEN
// We ask ZAS to determine if its airtight. Thats what matters anyway right?
- if(air_master.air_blocked(T, NT))
+ if(SSair.air_blocked(T, NT))
// Okay thats the edge of the room
- if(get_area_type(NT.loc) == AREA_SPACE && air_master.air_blocked(NT, NT))
+ if(get_area_type(NT.loc) == AREA_SPACE && SSair.air_blocked(NT, NT))
found += NT // So we include walls/doors not already in any area
continue
if (istype(NT, /turf/space))
@@ -835,9 +835,9 @@
if(!get_new_area_type(NT.loc) == 1) //The contains somewhere that is NOT a buildable area.
return 3 //NOT A BUILDABLE AREA
- if(air_master.air_blocked(T, NT)) //Is the room airtight?
+ if(SSair.air_blocked(T, NT)) //Is the room airtight?
// Okay thats the edge of the room
- if(get_new_area_type(NT.loc) == 1 && air_master.air_blocked(NT, NT))
+ if(get_new_area_type(NT.loc) == 1 && SSair.air_blocked(NT, NT))
found += NT // So we include walls/doors not already in any area
continue
if (istype(NT, /turf/space))
diff --git a/code/game/objects/items/devices/scanners/guide.dm b/code/game/objects/items/devices/scanners/guide.dm
index 403a81f974..68bd33d8e8 100644
--- a/code/game/objects/items/devices/scanners/guide.dm
+++ b/code/game/objects/items/devices/scanners/guide.dm
@@ -102,7 +102,7 @@
if(D.visibility_flags & HIDDEN_SCANNER)
continue
else
- dat += span_bold("Viral Infection") + " - Inform a Virologist or the Chief Medical Officer and administer antiviral chemicals such as Spaceacilin. Limit exposure to other personnel. "
+ dat += span_bold("Viral Infection") + " - Inform a Virologist or the Chief Medical Officer and administer antiviral chemicals such as Spaceacillin. Limit exposure to other personnel. "
if(robotparts)
dat += span_bold("Robotic body parts") + " - Should not be repaired by medical personnel, refer to robotics if damaged."
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index 80e16d90c2..2d93e9c7bc 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -225,7 +225,6 @@
feedback_inc("cyborg_birth",1)
callHook("borgify", list(O))
- O.namepick()
qdel(src)
else
diff --git a/code/game/objects/items/toys/toys_vr.dm b/code/game/objects/items/toys/toys_vr.dm
index b7e2065157..443f4c3f86 100644
--- a/code/game/objects/items/toys/toys_vr.dm
+++ b/code/game/objects/items/toys/toys_vr.dm
@@ -556,35 +556,6 @@
/obj/item/toy/AI/proc/cooldownreset()
cooldown = 0
-/*
- * Hand buzzer
- */
-/obj/item/clothing/gloves/ring/buzzer/toy
- name = "steel ring"
- desc = "Torus shaped finger decoration. It has a small piece of metal on the palm-side."
- icon_state = "seal-signet"
- drop_sound = 'sound/items/drop/ring.ogg'
-
-/obj/item/clothing/gloves/ring/buzzer/toy/Touch(var/atom/A, var/proximity)
- if(proximity && istype(usr, /mob/living/carbon/human))
-
- return zap(usr, A, proximity)
- return 0
-
-/obj/item/clothing/gloves/ring/buzzer/toy/zap(var/mob/living/carbon/human/user, var/atom/movable/target, var/proximity)
- . = FALSE
- if(user.a_intent == I_HELP && battery.percent() >= 50)
- if(isliving(target))
- var/mob/living/L = target
-
- to_chat(L, span_warning("You feel a powerful shock!"))
- if(!.)
- playsound(L, 'sound/effects/sparks7.ogg', 40, 1)
- L.electrocute_act(battery.percent() * 0, src)
- return .
-
- return 0
-
/*
* Toy cuffs
*/
diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm
index 41bab1e08f..378ab6b450 100644
--- a/code/game/objects/items/trash.dm
+++ b/code/game/objects/items/trash.dm
@@ -115,6 +115,12 @@
drop_sound = 'sound/items/drop/food.ogg'
pickup_sound = 'sound/items/pickup/food.ogg'
+/obj/item/trash/turkeybones
+ name = "turkey bones"
+ icon_state = "turkeybones"
+ drop_sound = 'sound/items/drop/food.ogg'
+ pickup_sound = 'sound/items/pickup/food.ogg'
+
/obj/item/trash/pistachios
name = "pistachios packet"
icon_state = "pistachios_pack"
diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm
index ecd8df8456..3095bce584 100644
--- a/code/game/objects/items/weapons/material/shards.dm
+++ b/code/game/objects/items/weapons/material/shards.dm
@@ -65,8 +65,7 @@
var/light_glove_d = rand(2, 4)
var/no_glove_d = rand(4, 6)
var/list/forbidden_gloves = list(
- /obj/item/clothing/gloves/sterile,
- /obj/item/clothing/gloves/knuckledusters
+ /obj/item/clothing/gloves/sterile
)
if(src == user.l_hand)
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index 0e51b19eec..ad934b0d03 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -141,7 +141,7 @@
to_chat(user, span_notice("\the [src] is too full to possibly fit anything else inside of it."))
return
- if (istype(W, /obj/item/ore))
+ if (istype(W, /obj/item/ore) && !istype(W, /obj/item/ore/slag))
var/obj/item/ore/ore = W
stored_ore[ore.material]++
current_capacity++
@@ -178,6 +178,8 @@
if(current_pickup >= max_pickup)
max_pickup_reached = 1
break
+ if(istype(O, /obj/item/ore/slag))
+ continue
var/obj/item/ore/ore = O
stored_ore[ore.material]++
current_capacity++
diff --git a/code/game/objects/items/weapons/storage/firstaid_vr.dm b/code/game/objects/items/weapons/storage/firstaid_vr.dm
index ac7a0668dc..35bd4f4dea 100644
--- a/code/game/objects/items/weapons/storage/firstaid_vr.dm
+++ b/code/game/objects/items/weapons/storage/firstaid_vr.dm
@@ -71,6 +71,7 @@
/obj/item/storage/firstaid/surgery
can_hold = list(
+ /obj/item/surgical/bone_clamp,
/obj/item/surgical/bonesetter,
/obj/item/surgical/cautery,
/obj/item/surgical/circular_saw,
diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm
index adc5226093..51c745c1ce 100644
--- a/code/game/objects/random/misc.dm
+++ b/code/game/objects/random/misc.dm
@@ -263,7 +263,7 @@
prob(6);/obj/item/material/butterflyblade,
prob(6);/obj/item/material/butterflyhandle,
prob(2);/obj/item/material/butterfly/switchblade,
- prob(2);/obj/item/clothing/gloves/knuckledusters,
+ prob(2);/obj/item/clothing/accessory/knuckledusters,
prob(1);/obj/item/material/knife/tacknife,
prob(1);/obj/item/clothing/suit/storage/vest/heavy/merc,
prob(1);/obj/item/beartrap,
diff --git a/code/game/objects/random/mob_vr.dm b/code/game/objects/random/mob_vr.dm
index 6b7dfa3967..e13801e149 100644
--- a/code/game/objects/random/mob_vr.dm
+++ b/code/game/objects/random/mob_vr.dm
@@ -154,7 +154,7 @@
prob(4);/obj/item/storage/pill_bottle/zoom,
prob(4);/obj/item/material/butterfly,
prob(2);/obj/item/material/butterfly/switchblade,
- prob(2);/obj/item/clothing/gloves/knuckledusters,
+ prob(2);/obj/item/clothing/accessory/knuckledusters,
prob(2);/obj/item/reagent_containers/syringe/drugs,
prob(1);/obj/item/material/knife/tacknife,
prob(1);/obj/item/clothing/suit/storage/vest/heavy/merc,
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index 62fa4b0be0..7800bba070 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -39,6 +39,23 @@ LINEN BINS
return
..()
+/obj/item/bedsheet/verb/turn_around()
+ set name = "Turn Around"
+ set category = "Object"
+ set src in oview(1)
+
+ if(!usr || !isturf(usr.loc))
+ return
+ if(usr.stat || usr.restrained())
+ return
+ if(ismouse(usr) || (isobserver(usr) && !CONFIG_GET(flag/ghost_interaction)))
+ return
+
+ if(dir >= 2)
+ src.set_dir(1)
+ else
+ src.set_dir(2)
+
/obj/item/bedsheet/blue
icon_state = "sheetblue"
diff --git a/code/game/objects/structures/crates_lockers/closets/misc_vr.dm b/code/game/objects/structures/crates_lockers/closets/misc_vr.dm
index 1aba1626ec..f001c78f45 100644
--- a/code/game/objects/structures/crates_lockers/closets/misc_vr.dm
+++ b/code/game/objects/structures/crates_lockers/closets/misc_vr.dm
@@ -211,7 +211,7 @@
/obj/item/radio,
/obj/item/gps/explorer,
/obj/item/gun/energy/gun/protector/pilotgun/locked,
- /obj/item/clothing/gloves/watch/survival,
+ /obj/item/clothing/accessory/watch/survival,
/obj/item/clothing/accessory/storage/webbing/pilot1,
/obj/item/clothing/accessory/storage/webbing/pilot2,
/obj/item/emergency_beacon
diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm
index 86b7c70f27..5557a27cf7 100644
--- a/code/game/objects/structures/crates_lockers/largecrate.dm
+++ b/code/game/objects/structures/crates_lockers/largecrate.dm
@@ -127,6 +127,10 @@
name = "chicken crate"
starts_with = list(/mob/living/simple_mob/animal/passive/chick = 5)
+/obj/structure/largecrate/animal/turkey
+ name = "turkey crate"
+ starts_with = list(/mob/living/simple_mob/vore/turkey)
+
/obj/structure/largecrate/animal/catslug
name = "catslug carrier"
starts_with = list(/mob/living/simple_mob/vore/alienanimals/catslug)
diff --git a/code/game/objects/structures/ghost_pods/silicon.dm b/code/game/objects/structures/ghost_pods/silicon.dm
index 64ac8f5674..4f50784aed 100644
--- a/code/game/objects/structures/ghost_pods/silicon.dm
+++ b/code/game/objects/structures/ghost_pods/silicon.dm
@@ -31,7 +31,6 @@
from the pod is not a crewmember."))
R.ckey = M.ckey
visible_message(span_warning("As \the [src] opens, the eyes of the robot flicker as it is activated."))
- R.namepick()
log_and_message_admins("successfully opened \a [src] and got a Lost Drone.")
..()
@@ -57,7 +56,6 @@
definiton of 'your gravesite' is where your pod is."))
R.ckey = M.ckey
visible_message(span_warning("As \the [src] opens, the eyes of the robot flicker as it is activated."))
- R.namepick()
..()
/obj/structure/ghost_pod/ghost_activated/swarm_drone
diff --git a/code/game/objects/structures/ghost_pods/silicon_vr.dm b/code/game/objects/structures/ghost_pods/silicon_vr.dm
index cfc3b781d2..1039349f2e 100644
--- a/code/game/objects/structures/ghost_pods/silicon_vr.dm
+++ b/code/game/objects/structures/ghost_pods/silicon_vr.dm
@@ -21,7 +21,6 @@
from the pod is not a crewmember."))
R.ckey = M.ckey
visible_message(span_warning("As \the [src] opens, the eyes of the robot flicker as it is activated."))
- R.namepick()
log_and_message_admins("successfully opened \a [src] and got a Lost Drone.")
used = TRUE
return TRUE
diff --git a/code/game/objects/structures/pillows.dm b/code/game/objects/structures/pillows.dm
index 9f251db31d..075046fd81 100644
--- a/code/game/objects/structures/pillows.dm
+++ b/code/game/objects/structures/pillows.dm
@@ -40,6 +40,7 @@
icon_state = "pillowpile_large_pink"
var/pillowpilefront = "/obj/structure/bed/pillowpilefront"
var/sourcepillow = "/obj/item/bedsheet/pillow"
+ flippable = FALSE
/obj/structure/bed/pillowpilefront
name = "pillow pile"
diff --git a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
index c9b71652be..b731aa690d 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
@@ -7,6 +7,7 @@
icon_state = "nest"
var/health = 100
unacidable = TRUE
+ flippable = FALSE
/obj/structure/bed/nest/update_icon()
return
diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
index 90ecec8c8b..ffb9073731 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
@@ -21,6 +21,7 @@
var/datum/material/padding_material
var/base_icon = "bed"
var/applies_material_colour = 1
+ var/flippable = TRUE
/obj/structure/bed/New(var/newloc, var/new_material, var/new_padding_material)
..(newloc)
@@ -168,6 +169,30 @@
if(padding_material)
padding_material.place_sheet(get_turf(src), 1)
+/obj/structure/bed/verb/turn_around()
+ set name = "Turn Around"
+ set category = "Object"
+ set src in oview(1)
+
+ if(!flippable)
+ to_chat(usr,span_notice("\The [src] can't face the other direction."))
+ return
+
+ if(!usr || !isturf(usr.loc))
+ return
+ if(usr.stat || usr.restrained())
+ return
+ if(ismouse(usr) || (isobserver(usr) && !CONFIG_GET(flag/ghost_interaction)))
+ return
+ if(dir == 2)
+ src.set_dir(1)
+ else if(dir == 1)
+ src.set_dir(2)
+ else if(dir == 4)
+ src.set_dir(8)
+ else if(dir == 8)
+ src.set_dir(4)
+
/obj/structure/bed/psych
name = "psychiatrist's couch"
desc = "For prime comfort during psychiatric evaluations."
@@ -208,6 +233,7 @@
surgery_odds = 50 //VOREStation Edit
var/bedtype = /obj/structure/bed/roller
var/rollertype = /obj/item/roller
+ flippable = FALSE
/obj/structure/bed/roller/adv
name = "advanced roller bed"
@@ -347,6 +373,7 @@
catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_bed)
icon = 'icons/obj/abductor.dmi'
icon_state = "bed"
+ flippable = FALSE
/obj/structure/bed/alien/update_icon()
return // Doesn't care about material or anything else.
diff --git a/code/game/objects/structures/trash_pile_vr.dm b/code/game/objects/structures/trash_pile_vr.dm
index 26d9b82066..c53a14b659 100644
--- a/code/game/objects/structures/trash_pile_vr.dm
+++ b/code/game/objects/structures/trash_pile_vr.dm
@@ -292,7 +292,7 @@
prob(3);/obj/item/cracker,
prob(3);/obj/item/material/butterfly,
prob(3);/obj/item/material/butterfly/switchblade,
- prob(3);/obj/item/clothing/gloves/knuckledusters,
+ prob(3);/obj/item/clothing/accessory/knuckledusters,
prob(3);/obj/item/clothing/gloves/heavy_engineer,
prob(3);/obj/item/reagent_containers/syringe/drugs,
prob(2);/obj/item/implanter/sizecontrol,
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index 6b46ba2acb..6867af1386 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -91,10 +91,6 @@
dirtoverlay.alpha = min((dirt - 50) * 5, 255)
/turf/simulated/Entered(atom/A, atom/OL)
- if(movement_disabled && usr.ckey != movement_disabled_exception)
- to_chat(usr, span_danger("Movement is admin-disabled.")) //This is to identify lag problems
- return
-
if (istype(A,/mob/living))
var/mob/living/M = A
if(M.lying || M.flying) //VOREStation Edit
diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm
index d7630618e2..cfc998f72a 100644
--- a/code/game/turfs/simulated/wall_attacks.dm
+++ b/code/game/turfs/simulated/wall_attacks.dm
@@ -17,7 +17,7 @@
src.blocks_air = 0
set_opacity(0)
for(var/turf/simulated/turf in loc)
- air_master.mark_for_update(turf)
+ SSair.mark_for_update(turf)
else
can_open = WALL_OPENING
//flick("[material.icon_base]fwall_closing", src)
@@ -29,18 +29,18 @@
src.blocks_air = 1
set_opacity(1)
for(var/turf/simulated/turf in loc)
- air_master.mark_for_update(turf)
+ SSair.mark_for_update(turf)
can_open = WALL_CAN_OPEN
update_icon()
/turf/simulated/wall/proc/update_air()
- if(!air_master)
+ if(!SSair)
return
for(var/turf/simulated/turf in loc)
update_thermal(turf)
- air_master.mark_for_update(turf)
+ SSair.mark_for_update(turf)
/turf/simulated/wall/proc/update_thermal(var/turf/simulated/source)
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 213627e6e6..a44d915277 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -182,9 +182,6 @@
//There's a lot of QDELETED() calls here if someone can figure out how to optimize this but not runtime when something gets deleted by a Bump/CanPass/Cross call, lemme know or go ahead and fix this mess - kevinz000
/turf/Enter(atom/movable/mover, atom/oldloc)
- if(movement_disabled && usr.ckey != movement_disabled_exception)
- to_chat(usr, span_warning("Movement is admin-disabled.")) //This is to identify lag problems
- return
// Do not call ..()
// Byond's default turf/Enter() doesn't have the behaviour we want with Bump()
// By default byond will call Bump() on the first dense object in contents
diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm
index 72cb432e1b..54027edb89 100644
--- a/code/game/turfs/turf_changing.dm
+++ b/code/game/turfs/turf_changing.dm
@@ -21,6 +21,11 @@
if(istype(below))
below.update_icon() // To add or remove the 'ceiling-less' overlay.
+/proc/has_valid_ZAS_zone(turf/simulated/T)
+ if(!istype(T))
+ return FALSE
+ return HAS_VALID_ZONE(T)
+
//Creates a new turf
/turf/proc/ChangeTurf(var/turf/N, var/tell_universe=1, var/force_lighting_update = 0, var/preserve_outdoors = FALSE)
if (!N)
@@ -28,7 +33,8 @@
if(N == /turf/space)
var/turf/below = GetBelow(src)
- if(istype(below) && (air_master.has_valid_zone(below) || air_master.has_valid_zone(src)) && !(src.z in using_map.below_blocked_levels) && (!istype(below, /turf/unsimulated/wall) && !istype(below, /turf/simulated/sky))) // VOREStation Edit: Weird open space
+ var/zones_present = has_valid_ZAS_zone(below) || has_valid_ZAS_zone(src)
+ if(istype(below) && zones_present && !(src.z in using_map.below_blocked_levels) && (!istype(below, /turf/unsimulated/wall) && !istype(below, /turf/simulated/sky))) // VOREStation Edit: Weird open space
N = /turf/simulated/open
var/obj/fire/old_fire = fire
@@ -75,8 +81,8 @@
if(tell_universe)
universe.OnTurfChange(W)
- if(air_master)
- air_master.mark_for_update(W)
+ if(SSair)
+ SSair.mark_for_update(W)
for(var/turf/space/S in range(W, 1))
S.update_starlight()
diff --git a/code/game/turfs/unsimulated/planetary.dm b/code/game/turfs/unsimulated/planetary.dm
index c6be94c5ed..d73201c166 100644
--- a/code/game/turfs/unsimulated/planetary.dm
+++ b/code/game/turfs/unsimulated/planetary.dm
@@ -33,7 +33,7 @@
// Force ZAS to reconsider our connections because our temperature has changed
if(connections)
connections.erase_all()
- air_master.mark_for_update(src)
+ SSair.mark_for_update(src)
// Normal station/earth air.
/turf/unsimulated/wall/planetary/normal
@@ -67,4 +67,3 @@
oxygen = MOLES_O2STANDARD
nitrogen = MOLES_N2STANDARD
temperature = 310.92 // About 37.7C / 100F
-
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index f7e33d15d3..4e67482292 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -1284,23 +1284,6 @@ var/datum/announcement/minor/admin_min_announcer = new
if(!ai_number)
to_chat(usr, span_bold("No AIs located")) //Just so you know the thing is actually working and not just ignoring you.
-/datum/admins/proc/show_skills()
- set category = "Admin.Investigate"
- set name = "Show Skills"
-
- if (!istype(src,/datum/admins))
- src = usr.client.holder
- if (!istype(src,/datum/admins))
- to_chat(usr, "Error: you are not an admin!")
- return
-
- var/mob/living/carbon/human/M = tgui_input_list(usr, "Select mob.", "Select mob.", human_mob_list)
- if(!M) return
-
- show_skill_window(usr, M)
-
- return
-
/client/proc/update_mob_sprite(mob/living/carbon/human/H as mob)
set category = "Admin.Game"
set name = "Update Mob Sprite"
diff --git a/code/modules/admin/admin_verb_lists.dm b/code/modules/admin/admin_verb_lists.dm
index c0c031d244..44f5c6e1ca 100644
--- a/code/modules/admin/admin_verb_lists.dm
+++ b/code/modules/admin/admin_verb_lists.dm
@@ -84,7 +84,6 @@ var/list/admin_verbs_admin = list(
/client/proc/cmd_admin_rejuvenate,
/client/proc/toggleghostwriters,
/client/proc/toggledrones,
- /datum/admins/proc/show_skills,
/client/proc/check_customitem_activity,
/client/proc/man_up,
/client/proc/global_man_up,
@@ -355,7 +354,6 @@ var/list/admin_verbs_mod = list(
/client/proc/colorooc,
/client/proc/player_panel_new,
/client/proc/dsay,
- /datum/admins/proc/show_skills,
/datum/admins/proc/show_player_panel,
/client/proc/check_antagonists,
/client/proc/aooc,
@@ -472,7 +470,6 @@ var/list/admin_verbs_event_manager = list(
/client/proc/cmd_admin_change_custom_event,
/client/proc/cmd_admin_rejuvenate,
/client/proc/toggleghostwriters,
- /datum/admins/proc/show_skills,
/client/proc/man_up,
/client/proc/global_man_up,
/client/proc/response_team, // Response Teams admin verb,
diff --git a/code/modules/admin/admin_verb_lists_vr.dm b/code/modules/admin/admin_verb_lists_vr.dm
index 4b29645516..fac337afb8 100644
--- a/code/modules/admin/admin_verb_lists_vr.dm
+++ b/code/modules/admin/admin_verb_lists_vr.dm
@@ -99,7 +99,6 @@ var/list/admin_verbs_admin = list(
/client/proc/cmd_admin_rejuvenate,
/client/proc/toggleghostwriters,
/client/proc/toggledrones,
- /datum/admins/proc/show_skills,
/client/proc/check_customitem_activity,
/client/proc/man_up,
/client/proc/global_man_up,
@@ -405,7 +404,6 @@ var/list/admin_verbs_mod = list(
/client/proc/colorooc,
/client/proc/player_panel_new,
/client/proc/dsay,
- /datum/admins/proc/show_skills,
/datum/admins/proc/show_player_panel,
/client/proc/check_antagonists,
/client/proc/aooc,
@@ -534,7 +532,6 @@ var/list/admin_verbs_event_manager = list(
/client/proc/cmd_admin_change_custom_event,
/client/proc/cmd_admin_rejuvenate,
/client/proc/toggleghostwriters,
- /datum/admins/proc/show_skills,
/client/proc/man_up,
/client/proc/global_man_up,
/client/proc/response_team, // Response Teams admin verb,
diff --git a/code/modules/admin/modify_robot.dm b/code/modules/admin/modify_robot.dm
index 7141ae09f4..e0423f270b 100644
--- a/code/modules/admin/modify_robot.dm
+++ b/code/modules/admin/modify_robot.dm
@@ -43,9 +43,16 @@
qdel(source)
. = ..()
+/datum/eventkit/modify_robot/ui_assets(mob/user)
+ return list(
+ get_asset_datum(/datum/asset/spritesheet/robot_icons)
+ )
+
/datum/eventkit/modify_robot/tgui_data(mob/user)
. = list()
// Target section for general data
+ var/datum/asset/spritesheet/robot_icons/spritesheet = get_asset_datum(/datum/asset/spritesheet/robot_icons)
+
if(target)
.["target"] = list()
.["target"]["name"] = target.name
@@ -62,10 +69,8 @@
// Target section for options once a module has been selected
if(target.module)
.["target"]["active"] = target.icon_selected
- .["target"]["front"] = icon2base64(get_flat_icon(target,dir=SOUTH,no_anim=TRUE))
- .["target"]["side"] = icon2base64(get_flat_icon(target,dir=WEST,no_anim=TRUE))
- .["target"]["side_alt"] = icon2base64(get_flat_icon(target,dir=EAST,no_anim=TRUE))
- .["target"]["back"] = icon2base64(get_flat_icon(target,dir=NORTH,no_anim=TRUE))
+ .["target"]["sprite"] = sanitize_css_class_name("[target.sprite_datum.type]")
+ .["target"]["sprite_size"] = spritesheet.icon_size_id(.["target"]["sprite"] + "S")
.["target"]["modules"] = get_target_items(user)
var/list/module_options = list()
for(var/module in robot_modules)
@@ -110,7 +115,7 @@
.["access_options"] = access_options
// Section for source data for the module we might want to salvage
if(source)
- .["source"] += get_module_source(user)
+ .["source"] += get_module_source(user, spritesheet)
var/list/all_robots = list()
for(var/mob/living/silicon/robot/R in silicon_mob_list)
if(!R.loc)
@@ -573,10 +578,11 @@
target_items += list(list("name" = item.name, "ref" = "\ref[item]", "icon" = icon2html(item, user, sourceonly=TRUE), "desc" = item.desc))
return target_items
-/datum/eventkit/modify_robot/proc/get_module_source(var/mob/user)
+/datum/eventkit/modify_robot/proc/get_module_source(var/mob/user, var/datum/asset/spritesheet/robot_icons/spritesheet)
var/list/source_list = list()
source_list["model"] = source.module
- source_list["front"] = icon2base64(get_flat_icon(source,dir=SOUTH,no_anim=TRUE))
+ source_list["sprite"] = sanitize_css_class_name("[source.sprite_datum.type]")
+ source_list["sprite_size"] = spritesheet.icon_size_id(source_list["sprite"] + "S")
var/list/source_items = list()
for(var/obj/item in (source.module.modules | source.module.emag))
var/exists
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index d543c9e64c..198d877c91 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -599,10 +599,6 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
set category = "Admin"
set name = "Adminhelp"
- if(say_disabled) //This is here to try to identify lag problems
- to_chat(usr, span_danger("Speech is currently admin-disabled."))
- return
-
//handle muting and automuting
if(prefs.muted & MUTE_ADMINHELP)
to_chat(src, span_danger("Error: Admin-PM: You cannot send adminhelps (Muted)."))
diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm
index 922e3c326e..aa3efca68d 100644
--- a/code/modules/admin/verbs/buildmode.dm
+++ b/code/modules/admin/verbs/buildmode.dm
@@ -830,9 +830,9 @@
if (!isturf(NT) || (NT in found) || (NT in pending))
continue
// We ask ZAS to determine if its airtight. Thats what matters anyway right?
- if(air_master.air_blocked(T, NT))
+ if(SSair.air_blocked(T, NT))
// Okay thats the edge of the room
- if(get_area_type_buildmode(NT.loc) == AREA_SPACE && air_master.air_blocked(NT, NT))
+ if(get_area_type_buildmode(NT.loc) == AREA_SPACE && SSair.air_blocked(NT, NT))
found += NT // So we include walls/doors not already in any area
continue
if (istype(NT, /turf/space))
diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm
index 63b18ab07b..593be726a6 100644
--- a/code/modules/admin/verbs/diagnostics.dm
+++ b/code/modules/admin/verbs/diagnostics.dm
@@ -2,12 +2,12 @@
set category = "Debug.Investigate"
set name = "Show Air Report"
- if(!master_controller || !air_master)
- tgui_alert_async(usr,"Master_controller or air_master not found.","Air Report")
+ if(!master_controller || !SSair)
+ tgui_alert_async(usr,"Master_controller or SSair not found.","Air Report")
return
- var/active_groups = air_master.active_zones
- var/inactive_groups = air_master.zones.len - active_groups
+ var/active_groups = SSair.active_zones
+ var/inactive_groups = SSair.zones.len - active_groups
var/hotspots = 0
for(var/obj/fire/hotspot in world)
@@ -15,7 +15,7 @@
var/active_on_main_station = 0
var/inactive_on_main_station = 0
- for(var/zone/zone in air_master.zones)
+ for(var/zone/zone in SSair.zones)
var/turf/simulated/turf = locate() in zone.contents
if(turf?.z in using_map.station_levels)
if(zone.needs_update)
@@ -25,8 +25,8 @@
var/output = {"AIR SYSTEMS REPORT