diff --git a/ATTRIBUTIONS.md b/ATTRIBUTIONS.md
index 3e5639a5217..abaf97a0b98 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 7b6a5621eb1..078c97af8a1 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 bfe6fa2ad4d..eeb01b42495 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 21be29d25e1..688eb129922 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 0be44bb3584..85b2545d36e 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 3890cd85f5c..8d7e270cde0 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 7f7b5752469..00000000000
--- 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 7126588a30f..15fcd893479 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 46871cc785e..9cbf665f83b 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 c05e708036b..a67970c63aa 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 d07a280d040..b6d012afe7d 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 382f1f0abbf..822c8ac7b2a 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 ba2b4b73e76..c8289fdc271 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/faction.dm b/code/__defines/faction.dm
index 2d975b6cbb6..766c2d51aac 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/_helpers/text.dm b/code/_helpers/text.dm
index 3357116d308..725335f267a 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)))
diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm
index 057f988dcb9..59be2633d78 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 857ce225f62..2955d9d7213 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 1e5f1506ec6..e008086d04b 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 702dbfddaeb..165748c64b1 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/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm
index b664a349a61..6505817fb55 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 6ae5cdbb9e0..22cdabb1dd6 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 4e593ea7f13..6eda375458b 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 bdf04a9fdf4..00a33e9ce64 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/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm
index f02ad95c32f..1138d4adba9 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 = (sqrtor0(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 = (sqrtor0(20+A.totalStageSpeed()*(3+rand())))-(sqrtor0(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 6f1f3ac9d36..8e19382f94e 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/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm
index d60baaa11a2..63f2ab00e19 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 c6b6cf0f17e..487f466761c 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 6a30af6f859..2962f48e9b4 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 91d476b3c74..412ff16ae75 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 aa45f4e23d8..6f38c18df0e 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 bc88232d130..0e1fcf2a70e 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 d3f95557945..fb47db35f5a 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 556bf1d0521..ef36b85038f 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 4bf6c4f8615..3fde80dd0bb 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 537f13d834f..c343a36964c 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 8fd2cb6ae4c..22da415b98b 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 96836b3edc2..0cb82f75f28 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 84712a9f74b..fad0054a36f 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/game/jobs/job/assistant.dm b/code/game/jobs/job/assistant.dm
index 6aa97533523..e3eca95cd38 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 c28d801acbd..00000000000
--- 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 6c16ac43760..767ac329236 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 c127d8dfd43..00000000000
--- 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 00000000000..ad56749de66
--- /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 663edab0a45..0604b872e4e 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/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/job/lawyer/equip(var/mob/living/carbon/human/H)
- . = ..()
- if(.)
- H.implant_loyalty(H)
-*/
+/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 1220e3ee88f..a980fd2325f 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 bd4093e4033..00000000000
--- 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 47d6de97ad1..87ad819e242 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 2af1d8e94fe..00000000000
--- 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 576739d659b..c4a6b350f89 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 bb784a8c961..00000000000
--- a/code/game/jobs/job/engineering_vr.dm
+++ /dev/null
@@ -1,75 +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/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."
-
-/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 b191d670722..d01d60e4be9 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 3796714b5ea..00000000000
--- 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 9298028eb96..c8a96efad98 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 9d08fdfcf29..00000000000
--- 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 c67dbe59ad3..a7d158ec30b 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 c0505e4109e..00000000000
--- 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 372d459e620..db2a0e051ce 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 b7c196b3345..00000000000
--- 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 6a5812af073..cce3f69603c 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 f5df1e3acfc..00000000000
--- 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/doors/door.dm b/code/game/machinery/doors/door.dm
index 2f70e0436e0..8055af222cc 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 d4477eeac00..4502ed93343 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 2e9ad26049c..13a3cb4c393 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 57a32434af2..37cf4c29a7e 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 184bee8bede..a27bff7038d 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 b0980966a30..26a4fb11af6 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 3d9e74ca6a2..400a6124a4c 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 7338689e33a..a56798eae94 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 493529cedeb..0f1803aa779 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
+
+/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)
- mainOverlay.Blend(main,ICON_ADD)
- shadeOverlay.Blend(shade,ICON_ADD)
+ if(mainOverlay && shadeOverlay)
+ mainOverlay.Blend(art_color,ICON_ADD)
+ shadeOverlay.Blend(art_shade,ICON_ADD)
- add_overlay(mainOverlay)
- add_overlay(shadeOverlay)
+ add_overlay(mainOverlay)
+ add_overlay(shadeOverlay)
- add_hiddenprint(usr)
+ 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 fa2ea82531c..3638219b20f 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/blueprints.dm b/code/game/objects/items/blueprints.dm
index 84b8d743f6c..c0f82b0b153 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 336a6219d90..214bbff5185 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 403a81f9747..68bd33d8e8d 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/trash.dm b/code/game/objects/items/trash.dm
index 41bab1e08f8..378ab6b450d 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/storage/firstaid_vr.dm b/code/game/objects/items/weapons/storage/firstaid_vr.dm
index ac7a0668dc9..35bd4f4dea0 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/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index 62fa4b0be00..7800bba0707 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/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm
index 86b7c70f27f..5557a27cf79 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/pillows.dm b/code/game/objects/structures/pillows.dm
index 9f251db31d5..075046fd81a 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 ac1fa248670..8d31e3a3ada 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 90ecec8c8b3..ffb9073731f 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/turfs/simulated.dm b/code/game/turfs/simulated.dm
index 6b46ba2acbe..6867af1386c 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 d7630618e2b..cfc998f72a1 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 8751a723377..0b3b88a8d50 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 72cb432e1bc..54027edb899 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 c6be94c5ed0..d73201c1661 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 f7e33d15d3a..4e674822928 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 c0c031d2443..44f5c6e1cae 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 4b29645516b..fac337afb8a 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/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index d543c9e64c5..198d877c91f 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 922e3c326ef..aa3efca68dc 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 63b18ab07b8..593be726a6b 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
General Processing Data
- Cycle: [air_master.current_cycle]
- Groups: [air_master.zones.len]
+ Cycle: [SSair.current_cycle]
+ Groups: [SSair.zones.len]
---- Active: [active_groups]
---- Inactive: [inactive_groups]
---- Active on station: [active_on_main_station]
@@ -36,7 +36,7 @@
Hotspot Processing: [hotspots]
Geometry Processing Data
- Tile Update: [air_master.tiles_to_update.len]
+ Tile Update: [SSair.tiles_to_update.len]
"}
usr << browse(output,"window=airreport")
@@ -127,11 +127,11 @@
to_chat(src, "Only administrators may use this command.")
return
- if(!air_master)
+ if(!SSair)
to_chat(usr, "Cannot find air_system")
return
var/datum/air_group/dead_groups = list()
- for(var/datum/air_group/group in air_master.air_groups)
+ for(var/datum/air_group/group in SSair.air_groups)
if (!group.group_processing)
dead_groups += group
var/datum/air_group/dest_group = pick(dead_groups)
@@ -149,7 +149,7 @@
to_chat(src, "Only administrators may use this command.")
return
- if(!air_master)
+ if(!SSair)
to_chat(usr, "Cannot find air_system")
return
diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm
index 22be10769d9..5967b575b71 100644
--- a/code/modules/admin/verbs/mapping.dm
+++ b/code/modules/admin/verbs/mapping.dm
@@ -146,12 +146,6 @@ var/list/debug_verbs = list (
,/client/proc/print_jobban_old
,/client/proc/print_jobban_old_filter
,/client/proc/forceEvent
- ,/client/proc/break_all_air_groups
- ,/client/proc/regroup_all_air_groups
- ,/client/proc/kill_pipe_processing
- ,/client/proc/kill_air_processing
- ,/client/proc/disable_communication
- ,/client/proc/disable_movement
,/client/proc/Zone_Info
,/client/proc/Test_ZAS_Connection
,/client/proc/ZoneTick
@@ -345,80 +339,3 @@ var/list/debug_verbs = list (
to_world("There are [count] objects of type [type_path] in the game world")
feedback_add_details("admin_verb","mOBJ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-
-var/global/prevent_airgroup_regroup = 0
-
-/client/proc/break_all_air_groups()
- set category = "Mapping"
- set name = "Break All Airgroups"
-
- /*prevent_airgroup_regroup = 1
- for(var/datum/air_group/AG in air_master.air_groups)
- AG.suspend_group_processing()
- message_admins("[src.ckey] used 'Break All Airgroups'")*/
-
-/client/proc/regroup_all_air_groups()
- set category = "Mapping"
- set name = "Regroup All Airgroups Attempt"
-
- to_chat(usr, span_red("Proc disabled.")) //Why not.. Delete the procs instead?
-
- /*prevent_airgroup_regroup = 0
- for(var/datum/air_group/AG in air_master.air_groups)
- AG.check_regroup()
- message_admins("[src.ckey] used 'Regroup All Airgroups Attempt'")*/
-
-/client/proc/kill_pipe_processing()
- set category = "Mapping"
- set name = "Kill pipe processing"
-
- to_chat(usr, span_red("Proc disabled."))
-
- /*pipe_processing_killed = !pipe_processing_killed
- if(pipe_processing_killed)
- message_admins("[src.ckey] used 'kill pipe processing', stopping all pipe processing.")
- else
- message_admins("[src.ckey] used 'kill pipe processing', restoring all pipe processing.")*/
-
-/client/proc/kill_air_processing()
- set category = "Mapping"
- set name = "Kill air processing"
-
- to_chat(usr, span_red("Proc disabled."))
-
- /*air_processing_killed = !air_processing_killed
- if(air_processing_killed)
- message_admins("[src.ckey] used 'kill air processing', stopping all air processing.")
- else
- message_admins("[src.ckey] used 'kill air processing', restoring all air processing.")*/
-
-//This proc is intended to detect lag problems relating to communication procs
-var/global/say_disabled = 0
-/client/proc/disable_communication()
- set category = "Mapping"
- set name = "Disable all communication verbs"
-
- to_chat(usr, span_red("Proc disabled."))
-
- /*say_disabled = !say_disabled
- if(say_disabled)
- message_admins("[src.ckey] used 'Disable all communication verbs', killing all communication methods.")
- else
- message_admins("[src.ckey] used 'Disable all communication verbs', restoring all communication methods.")*/
-
-//This proc is intended to detect lag problems relating to movement
-var/global/movement_disabled = 0
-var/global/movement_disabled_exception //This is the client that calls the proc, so he can continue to run around to gauge any change to lag.
-/client/proc/disable_movement()
- set category = "Mapping"
- set name = "Disable all movement"
-
- to_chat(usr, span_red("Proc disabled."))
-
- /*movement_disabled = !movement_disabled
- if(movement_disabled)
- message_admins("[src.ckey] used 'Disable all movement', killing all movement.")
- movement_disabled_exception = usr.ckey
- else
- message_admins("[src.ckey] used 'Disable all movement', restoring all movement.")*/
diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index a33d77a4054..1e3b8117e9e 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -2,10 +2,6 @@
set category = "IC.Game"
set name = "Pray"
- if(say_disabled) //This is here to try to identify lag problems
- to_chat(usr, span_red("Speech is currently admin-disabled."))
- return
-
var/raw_msg = sanitize(tgui_input_text(usr, "Prayers are sent to staff but do not open tickets or go to Discord. If you have a technical difficulty or an event/spice idea/hook - please ahelp instead. Thank you!", "Pray", null, MAX_MESSAGE_LEN))
if(!raw_msg) return
diff --git a/code/modules/asset_cache/assets/chat.dm b/code/modules/asset_cache/assets/chat.dm
index 0853ea542c7..cbaf4ac35bd 100644
--- a/code/modules/asset_cache/assets/chat.dm
+++ b/code/modules/asset_cache/assets/chat.dm
@@ -2,5 +2,4 @@
name = "chat"
/datum/asset/spritesheet/chat/create_spritesheets()
- //honk
- //This function has to be overridden otherwise it will generate runtimes
+ InsertAll("", text_tag_icons) // OOC, LOOC ect icons
diff --git a/code/modules/blob2/overmind/overmind.dm b/code/modules/blob2/overmind/overmind.dm
index 993a4126ac1..73fe9978c5a 100644
--- a/code/modules/blob2/overmind/overmind.dm
+++ b/code/modules/blob2/overmind/overmind.dm
@@ -116,7 +116,7 @@ var/list/overminds = list()
if(client)
if(message)
client.handle_spam_prevention(MUTE_IC)
- if((client.prefs.muted & MUTE_IC) || say_disabled)
+ if((client.prefs.muted & MUTE_IC))
to_chat(src, span_warning("You cannot speak in IC (Muted)."))
return
diff --git a/code/modules/client/preference_setup/loadout/loadout_gloves.dm b/code/modules/client/preference_setup/loadout/loadout_gloves.dm
index fa712ecd276..29f22840e69 100644
--- a/code/modules/client/preference_setup/loadout/loadout_gloves.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_gloves.dm
@@ -58,7 +58,7 @@
/datum/gear/gloves/fingerless
display_name = "fingerless gloves"
- description = "A pair of gloves that don't actually cover the fingers. Available in classic black or recolourable white."
+ description = "A pair of gloves that don't actually cover the fingers. Available in classic black or recolourable white, with or without cutouts."
path = /obj/item/clothing/gloves/fingerless
/datum/gear/gloves/fingerless/New()
@@ -66,7 +66,8 @@
var/list/selector_uniforms = list(
"black"=/obj/item/clothing/gloves/fingerless,
"black, alt" =/obj/item/clothing/gloves/fingerless/alt,
- "recolourable white"=/obj/item/clothing/gloves/fingerless_recolourable
+ "recolourable white"=/obj/item/clothing/gloves/fingerless_recolourable,
+ "recolourable, alt"=/obj/item/clothing/gloves/fingerless_recolourable/alt
)
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
gear_tweaks += gear_tweak_free_color_choice
diff --git a/code/modules/client/preference_setup/preference_setup.dm b/code/modules/client/preference_setup/preference_setup.dm
index 1aa899e744e..d43fb0529c2 100644
--- a/code/modules/client/preference_setup/preference_setup.dm
+++ b/code/modules/client/preference_setup/preference_setup.dm
@@ -7,11 +7,6 @@
sort_order = 1
category_item_type = /datum/category_item/player_setup_item/general
-/datum/category_group/player_setup_category/skill_preferences
- name = "Skills"
- sort_order = 2
- category_item_type = /datum/category_item/player_setup_item/skills
-
/datum/category_group/player_setup_category/occupation_preferences
name = "Occupation"
sort_order = 3
diff --git a/code/modules/client/preference_setup/skills/skills.dm b/code/modules/client/preference_setup/skills/skills.dm
deleted file mode 100644
index a77254d6383..00000000000
--- a/code/modules/client/preference_setup/skills/skills.dm
+++ /dev/null
@@ -1,89 +0,0 @@
-/datum/category_item/player_setup_item/skills
- name = "Skills"
- sort_order = 1
-
-/datum/category_item/player_setup_item/skills/load_character(list/save_data)
- pref.skills = check_list_copy(save_data["skills"])
- pref.used_skillpoints = save_data["used_skillpoints"]
- pref.skill_specialization = save_data["skill_specialization"]
-
-/datum/category_item/player_setup_item/skills/save_character(list/save_data)
- save_data["skills"] = check_list_copy(pref.skills)
- save_data["used_skillpoints"] = pref.used_skillpoints
- save_data["skill_specialization"] = pref.skill_specialization
-
-/datum/category_item/player_setup_item/skills/sanitize_character()
- if(SKILLS == null) setup_skills()
- if(!pref.skills) pref.skills = list()
- if(!pref.skills.len) pref.ZeroSkills()
- if(pref.used_skillpoints < 0) pref.used_skillpoints = 0
-
-// Moved from /datum/preferences/proc/copy_to()
-/datum/category_item/player_setup_item/skills/copy_to_mob(var/mob/living/carbon/human/character)
- character.skills = pref.skills
- character.used_skillpoints = pref.used_skillpoints
-
-/datum/category_item/player_setup_item/skills/content()
- . = list()
- . += span_bold("Select your Skills") + "
"
- . += "Current skill level: [pref.GetSkillClass(pref.used_skillpoints)] ([pref.used_skillpoints])
"
- . += "Use preconfigured skillset
"
- . += ""
- for(var/V in SKILLS)
- . += "[V]"
- . += " |
"
- for(var/datum/skill/S in SKILLS[V])
- var/level = pref.skills[S.ID]
- . += ""
- . += "[S.name] | "
- . += skill_to_button(S, "Untrained", level, SKILL_NONE)
- // secondary skills don't have an amateur level
- if(S.secondary)
- . += " | "
- else
- . += skill_to_button(S, "Amateur", level, SKILL_BASIC)
- . += skill_to_button(S, "Trained", level, SKILL_ADEPT)
- . += skill_to_button(S, "Professional", level, SKILL_EXPERT)
- . += "
"
- . += "
"
- . = jointext(.,null)
-
-/datum/category_item/player_setup_item/proc/skill_to_button(var/skill, var/level_name, var/current_level, var/selection_level)
- if(current_level == selection_level)
- return "" + span_linkOn("[level_name]") + " | "
- return "[level_name] | "
-
-/datum/category_item/player_setup_item/skills/OnTopic(href, href_list, user)
- if(href_list["skillinfo"])
- var/datum/skill/S = locate(href_list["skillinfo"])
- var/HTML = span_bold("[S.name]") + "
[S.desc]"
- user << browse(HTML, "window=\ref[user]skillinfo")
- return TOPIC_HANDLED
-
- else if(href_list["setskill"])
- var/datum/skill/S = locate(href_list["setskill"])
- var/value = text2num(href_list["newvalue"])
- pref.skills[S.ID] = value
- pref.CalculateSkillPoints()
- return TOPIC_REFRESH
-
- else if(href_list["preconfigured"])
- var/selected = tgui_input_list(user, "Select a skillset", "Skillset", SKILL_PRE)
- if(!selected || !CanUseTopic(user)) return
-
- pref.ZeroSkills(1)
- for(var/V in SKILL_PRE[selected])
- if(V == "field")
- pref.skill_specialization = SKILL_PRE[selected]["field"]
- continue
- pref.skills[V] = SKILL_PRE[selected][V]
- pref.CalculateSkillPoints()
-
- return TOPIC_REFRESH
-
- else if(href_list["setspecialization"])
- pref.skill_specialization = href_list["setspecialization"]
- pref.CalculateSkillPoints()
- return TOPIC_REFRESH
-
- return ..()
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 31899796a2f..f2d0f5b2da4 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -122,10 +122,6 @@ var/list/preferences_datums = list()
//Keeps track of preferrence for not getting any wanted jobs
var/alternate_option = 1
- var/used_skillpoints = 0
- var/skill_specialization = null
- var/list/skills = list() // skills can range from 0 to 3
-
// maps each organ to either null(intact), "cyborg" or "amputated"
// will probably not be able to do this for head and torso ;)
var/list/organ_data = list()
@@ -233,58 +229,6 @@ var/list/preferences_datums = list()
value_cache = null
return ..()
-/datum/preferences/proc/ZeroSkills(var/forced = 0)
- for(var/V in SKILLS) for(var/datum/skill/S in SKILLS[V])
- if(!skills.Find(S.ID) || forced)
- skills[S.ID] = SKILL_NONE
-
-/datum/preferences/proc/CalculateSkillPoints()
- used_skillpoints = 0
- for(var/V in SKILLS) for(var/datum/skill/S in SKILLS[V])
- var/multiplier = 1
- switch(skills[S.ID])
- if(SKILL_NONE)
- used_skillpoints += 0 * multiplier
- if(SKILL_BASIC)
- used_skillpoints += 1 * multiplier
- if(SKILL_ADEPT)
- // secondary skills cost less
- if(S.secondary)
- used_skillpoints += 1 * multiplier
- else
- used_skillpoints += 3 * multiplier
- if(SKILL_EXPERT)
- // secondary skills cost less
- if(S.secondary)
- used_skillpoints += 3 * multiplier
- else
- used_skillpoints += 6 * multiplier
-
-/datum/preferences/proc/GetSkillClass(points)
- return CalculateSkillClass(points, age)
-
-/proc/CalculateSkillClass(points, age)
- if(points <= 0) return "Unconfigured"
- // skill classes describe how your character compares in total points
- points -= min(round((age - 20) / 2.5), 4) // every 2.5 years after 20, one extra skillpoint
- if(age > 30)
- points -= round((age - 30) / 5) // every 5 years after 30, one extra skillpoint
- switch(points)
- if(-1000 to 3)
- return "Terrifying"
- if(4 to 6)
- return "Below Average"
- if(7 to 10)
- return "Average"
- if(11 to 14)
- return "Above Average"
- if(15 to 18)
- return "Exceptional"
- if(19 to 24)
- return "Genius"
- if(24 to 1000)
- return "God"
-
/datum/preferences/proc/ShowChoices(mob/user)
if(!user || !user.client) return
diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm
index 63d7793ce86..b07704693e0 100644
--- a/code/modules/client/verbs/ooc.dm
+++ b/code/modules/client/verbs/ooc.dm
@@ -3,9 +3,6 @@
set name = "OOC"
set category = "OOC.Chat"
- if(say_disabled) //This is here to try to identify lag problems
- to_chat(usr, span_warning("Speech is currently admin-disabled."))
- return
if(!mob) return
if(IsGuestKey(key))
@@ -86,10 +83,6 @@
set desc = "Local OOC, seen only by those in view."
set category = "OOC.Chat"
- if(say_disabled) //This is here to try to identify lag problems
- to_chat(usr, span_danger("Speech is currently admin-disabled."))
- return
-
if(!mob)
return
diff --git a/code/modules/clothing/accessories/hands.dm b/code/modules/clothing/accessories/hands.dm
index befe128fc71..2ac4386e6a2 100644
--- a/code/modules/clothing/accessories/hands.dm
+++ b/code/modules/clothing/accessories/hands.dm
@@ -25,7 +25,7 @@
icon = 'icons/inventory/accessory/item.dmi'
icon_state = "bracelet"
w_class = ITEMSIZE_TINY
- slot_flags = SLOT_GLOVES
+ slot_flags = SLOT_GLOVES | SLOT_TIE
slot = ACCESSORY_SLOT_WRIST
/obj/item/clothing/accessory/bracelet/friendship
@@ -102,7 +102,7 @@
icon = 'icons/inventory/accessory/item.dmi'
icon_state = "wristband"
w_class = ITEMSIZE_TINY
- slot_flags = SLOT_GLOVES
+ slot_flags = SLOT_GLOVES | SLOT_TIE
slot = ACCESSORY_SLOT_WRIST
/obj/item/clothing/accessory/wristband/spiked
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index a69ddf2ab0e..9f8d9e9db24 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -854,7 +854,9 @@
|ACCESSORY_SLOT_TIE\
|ACCESSORY_SLOT_RANK\
|ACCESSORY_SLOT_DEPT\
- |ACCESSORY_SLOT_OVER)
+ |ACCESSORY_SLOT_OVER\
+ |ACCESSORY_SLOT_RING\
+ |ACCESSORY_SLOT_WRIST)
restricted_accessory_slots = (\
ACCESSORY_SLOT_UTILITY\
|ACCESSORY_SLOT_WEAPON\
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index 572f45c0b5d..f2002c95c65 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -422,6 +422,7 @@ BLIND // can't see anything
icon_state = "blindfold"
item_state_slots = list(slot_r_hand_str = "blindfold", slot_l_hand_str = "blindfold")
flash_protection = FLASH_PROTECTION_MAJOR
+ body_parts_covered = EYES
tint = BLIND
drop_sound = 'sound/items/drop/gloves.ogg'
pickup_sound = 'sound/items/pickup/gloves.ogg'
@@ -436,6 +437,7 @@ BLIND // can't see anything
desc = "A thin blindfold to help protect sensitive eyes while still allowing some sight"
icon_state = "blindfoldwhite"
flash_protection = FLASH_PROTECTION_MODERATE //not as thick, only offers some protection
+ body_parts_covered = EYES
tint = TINT_HEAVY
/obj/item/clothing/glasses/sunglasses/blindfold/tape
@@ -445,6 +447,7 @@ BLIND // can't see anything
icon_state = "tape_cross"
item_state_slots = list(slot_r_hand_str = null, slot_l_hand_str = null)
w_class = ITEMSIZE_TINY
+ body_parts_covered = EYES
/obj/item/clothing/glasses/sunglasses/prescription
name = "prescription sunglasses"
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index 32012ed330c..f71010a2325 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -100,3 +100,6 @@
name = "fingerless gloves"
icon_state = "fingerlessgloves_rc"
fingerprint_chance = 100
+
+/obj/item/clothing/gloves/fingerless_recolourable/alt
+ icon_state = "fingerlessgloves_rc_alt"
diff --git a/code/modules/emotes/definitions/synthetics.dm b/code/modules/emotes/definitions/synthetics.dm
index de1d8d34ed7..e4024fc8e9b 100644
--- a/code/modules/emotes/definitions/synthetics.dm
+++ b/code/modules/emotes/definitions/synthetics.dm
@@ -78,3 +78,21 @@
emote_message_3p = "chirps."
emote_sound = 'sound/voice/robochirp.ogg'
sound_vary = TRUE
+
+/decl/emote/audible/synth/ding
+ key = "ding"
+ emote_message_1p = "You ding at TARGET!"
+ emote_message_1p = "You ding."
+ emote_message_3p_target = "dings at TARGET!"
+ emote_message_3p = "dings."
+ emote_sound = 'sound/machines/ding.ogg'
+ sound_vary = TRUE
+
+/decl/emote/audible/synth/microwave
+ key = "microwave"
+ emote_message_1p = "You make microwave noises at TARGET!"
+ emote_message_1p = "You make microwave noises."
+ emote_message_3p_target = "makes microwave noises at TARGET!"
+ emote_message_3p = "makes microwave noises."
+ emote_sound = 'sound/machines/kitchen/microwave/microwave-mid2.ogg'
+ sound_vary = TRUE
diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm
index 25e1ea5c4f1..6f5e2b9497b 100644
--- a/code/modules/events/disease_outbreak.dm
+++ b/code/modules/events/disease_outbreak.dm
@@ -24,7 +24,7 @@ GLOBAL_LIST_EMPTY(current_pending_diseases)
else
stack_trace("Disease Outbreak: Invalid Event Level [severity]. Expected: 1-2")
virus = /datum/disease/cold
- chosen_disease = new virus()
+ chosen_disease = new virus
else
if(severity == EVENT_LEVEL_MAJOR)
chosen_disease = create_virus(severity * pick(2,3)) //50% chance for a major disease instead of a moderate one
@@ -37,7 +37,7 @@ GLOBAL_LIST_EMPTY(current_pending_diseases)
GLOB.current_pending_diseases += chosen_disease
var/list/candidates = list()
- for(var/mob/living/carbon/human/G in player_list)
+ for(var/mob/living/carbon/human/G in human_mob_list)
if(G.mind && G.stat != DEAD && G.is_client_active(5) && !player_is_antag(G.mind))
var/area/A = get_area(G)
if(!A)
@@ -48,17 +48,18 @@ GLOBAL_LIST_EMPTY(current_pending_diseases)
continue
if(isbelly(G.loc))
continue
- if(!G.CanContractDisease())
+ if(G.species.virus_immune)
continue
candidates += G
var/chosen_infect = rand(3, 5)
while(chosen_infect)
- var/mob/living/carbon/human/H = pick(candidates)
- H.ContractDisease(chosen_disease)
- candidates -= H
-
+ if(!isemptylist(candidates))
+ var/mob/living/carbon/human/H = pick(candidates)
+ H.ForceContractDisease(chosen_disease)
+ candidates -= H
+ chosen_infect--
//Creates a virus with a harmful effect, guaranteed to be spreadable by contact or airborne
/datum/event/disease_outbreak/proc/create_virus(max_severity = 6)
diff --git a/code/modules/events/event_container_vr.dm b/code/modules/events/event_container_vr.dm
index 71911302b78..1410f4b17cd 100644
--- a/code/modules/events/event_container_vr.dm
+++ b/code/modules/events/event_container_vr.dm
@@ -108,6 +108,7 @@
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob", /datum/event/blob, 10, list(ASSIGNMENT_ENGINEER = 60), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 30, list(ASSIGNMENT_ENGINEER = 15), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Supply Demand", /datum/event/supply_demand, 0, list(ASSIGNMENT_ANY = 5, ASSIGNMENT_SCIENCE = 15, ASSIGNMENT_GARDENER = 10, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_MEDICAL = 15), 1),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Disease Outbreak", /datum/event/disease_outbreak, -30, list(ASSIGNMENT_MEDICAL = 30, ASSIGNMENT_ANY = 1), 1, min_jobs = list(ASSIGNMENT_MEDICAL = 2)),
))
#undef ASSIGNMENT_ANY
diff --git a/code/modules/events/meteors.dm b/code/modules/events/meteors.dm
index 12cbdb770ce..ff11cb9c33b 100644
--- a/code/modules/events/meteors.dm
+++ b/code/modules/events/meteors.dm
@@ -127,10 +127,8 @@
. = ..()
if(!victim)
return
- var/skill = victim.get_helm_skill()
var/speed = victim.get_speed()
- if(skill >= SKILL_PROF)
- . = round(. * 0.5)
+ . = round(. * 0.5)
if(victim.is_still()) //Standing still means less shit flies your way
. = round(. * 0.1)
if(speed < SHIP_SPEED_SLOW) //Slow and steady
@@ -140,10 +138,4 @@
//Smol ship evasion
if(victim.vessel_size < SHIP_SIZE_LARGE && speed < SHIP_SPEED_FAST)
- var/skill_needed = SKILL_PROF
- if(speed < SHIP_SPEED_SLOW)
- skill_needed = SKILL_ADEPT
- if(victim.vessel_size < SHIP_SIZE_SMALL)
- skill_needed = skill_needed - 1
- if(skill >= max(skill_needed, victim.skill_needed))
- . = round(. * 0.5)
+ . = round(. * 0.5)
diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm
index 08d40416daf..814ce55adc1 100644
--- a/code/modules/food/food/snacks.dm
+++ b/code/modules/food/food/snacks.dm
@@ -334,10 +334,14 @@
S.food_inserted_micros = list()
S.food_inserted_micros += F
food_inserted_micros -= F
+ on_slice_extra()
qdel(src)
return
+/obj/item/reagent_containers/food/snacks/proc/on_slice_extra()
+ return
+
/obj/item/reagent_containers/food/snacks/MouseDrop_T(mob/living/M, mob/user)
if(!user.stat && istype(M) && (M == user) && Adjacent(M) && (M.get_effective_size(TRUE) <= 0.50) && food_can_insert_micro)
if(!food_inserted_micros)
@@ -3510,6 +3514,7 @@
trash = /obj/item/trash/plate
bitesize = 2
+/* OLD RECIPE
/obj/item/reagent_containers/food/snacks/sliceable/turkey
name = "turkey"
desc = "Tastes like chicken."
@@ -3536,6 +3541,51 @@
icon_state = "turkey_drumstick"
trash = /obj/item/trash/plate
bitesize = 2
+*/
+
+/obj/item/reagent_containers/food/snacks/sliceable/turkey
+ name = "turkey"
+ desc = "Tastes like chicken."
+ icon = 'icons/obj/food.dmi'
+ icon_state = "roastturkey"
+ slice_path = /obj/item/reagent_containers/food/snacks/turkeyslice
+ slices_num = 6
+ w_class = 2
+ nutriment_amt = 20
+ nutriment_desc = list("turkey" = 20)
+ bitesize = 5
+ trash = /obj/item/trash/turkeybones
+ var/list/extra_product = list(/obj/item/reagent_containers/food/snacks/turkeydrumstick = 2,
+ /obj/item/trash/turkeybones = 1)
+
+/obj/item/reagent_containers/food/snacks/sliceable/turkey/Initialize()
+ . = ..()
+ reagents.add_reagent("blackpepper", 1)
+ reagents.add_reagent("sodiumchloride", 1)
+ reagents.add_reagent("cookingoil", 1)
+
+/obj/item/reagent_containers/food/snacks/sliceable/turkey/on_slice_extra()
+ for(var/i in extra_product)
+ for(var/j=1 to extra_product[i])
+ new i(src.loc)
+
+/obj/item/reagent_containers/food/snacks/turkeyslice
+ name = "turkey'n'mash"
+ desc = "Turkey slices with some delicious stuffing."
+ icon = 'icons/obj/food.dmi'
+ icon_state = "roastturkeynmash"
+ trash = /obj/item/trash/plate
+ bitesize = 2
+
+/obj/item/reagent_containers/food/snacks/turkeydrumstick
+ name = "turkey drumstick"
+ desc = "The best part!"
+ icon = 'icons/obj/food.dmi'
+ icon_state = "roastturkeydrumstick"
+ trash = null
+ nutriment_amt = 8
+ nutriment_desc = list("turkey" = 20)
+ bitesize = 2
/obj/item/reagent_containers/food/snacks/sliceable/suppermatter
name = "suppermatter"
diff --git a/code/modules/food/food/snacks/meat.dm b/code/modules/food/food/snacks/meat.dm
index 1cd1671a5f6..c08b33b8865 100644
--- a/code/modules/food/food/snacks/meat.dm
+++ b/code/modules/food/food/snacks/meat.dm
@@ -131,6 +131,16 @@
reagents.add_reagent("spidertoxin",6)
reagents.remove_reagent("pacid",6)
+/obj/item/reagent_containers/food/snacks/rawturkey
+ name = "raw turkey"
+ desc = "Naked and hollow."
+ icon_state = "rawturkey"
+ bitesize = 2.5
+
+/obj/item/reagent_containers/food/snacks/rawturkey/Initialize()
+ . = ..()
+ reagents.add_reagent("protein", 10)
+
/obj/item/reagent_containers/food/snacks/meat/fox
name = "foxmeat"
desc = "The fox doesn't say a goddamn thing, now."
diff --git a/code/modules/food/recipes_oven.dm b/code/modules/food/recipes_oven.dm
index c8e043ecd5c..57a58cb57d5 100644
--- a/code/modules/food/recipes_oven.dm
+++ b/code/modules/food/recipes_oven.dm
@@ -33,6 +33,7 @@
reagent_mix = RECIPE_REAGENT_REPLACE
result = /obj/item/reagent_containers/food/snacks/ribplate
+/* OLD RECIPE
/datum/recipe/turkey
appliance = OVEN
reagents = list("sodiumchloride" = 1, "blackpepper" = 1)
@@ -41,6 +42,17 @@
/obj/item/reagent_containers/food/snacks/stuffing
)
result = /obj/item/reagent_containers/food/snacks/sliceable/turkey
+*/
+
+/datum/recipe/turkey
+ appliance = OVEN
+ fruit = list("potato" = 1)
+ reagents = list("sodiumchloride" = 1, "blackpepper" = 1)
+ items = list(
+ /obj/item/reagent_containers/food/snacks/rawturkey,
+ /obj/item/reagent_containers/food/snacks/stuffing
+ )
+ result = /obj/item/reagent_containers/food/snacks/sliceable/turkey
/datum/recipe/tofurkey
appliance = OVEN
diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm
index 61b2ae4df5b..150e345db6c 100644
--- a/code/modules/hydroponics/seed.dm
+++ b/code/modules/hydroponics/seed.dm
@@ -254,11 +254,11 @@
var/no_los
var/turf/last_turf = origin_turf
for(var/turf/target_turf in getline(origin_turf,neighbor))
- if(air_master.air_blocked(last_turf, target_turf))
+ if(SSair.air_blocked(last_turf, target_turf))
no_los = 1
break
last_turf = target_turf
- if(!no_los && air_master.air_blocked(origin_turf, neighbor))
+ if(!no_los && SSair.air_blocked(origin_turf, neighbor))
no_los = 1
if(no_los)
closed_turfs |= neighbor
diff --git a/code/modules/mentor/mentorhelp.dm b/code/modules/mentor/mentorhelp.dm
index d801effd6eb..2d748823ce1 100644
--- a/code/modules/mentor/mentorhelp.dm
+++ b/code/modules/mentor/mentorhelp.dm
@@ -420,10 +420,6 @@ GLOBAL_DATUM_INIT(mhelp_tickets, /datum/mentor_help_tickets, new)
set category = "Admin"
set name = "Mentorhelp"
- 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: Mentor-PM: You cannot send adminhelps (Muted)."))
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 3bab28eae20..f679591e2d6 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -173,8 +173,8 @@ var/list/mining_overlay_cache = list()
recalculate_directional_opacity()
if(ticker && ticker.current_state == GAME_STATE_PLAYING)
reconsider_lights()
- if(air_master)
- air_master.mark_for_update(src)
+ if(SSair)
+ SSair.mark_for_update(src)
/turf/simulated/mineral/proc/get_cached_border(var/cache_id, var/direction, var/icon_file, var/icon_state, var/offset = 32)
//Cache miss
diff --git a/code/modules/mob/living/butchering.dm b/code/modules/mob/living/butchering.dm
index 05e064acbe8..ad1eecfba60 100644
--- a/code/modules/mob/living/butchering.dm
+++ b/code/modules/mob/living/butchering.dm
@@ -3,6 +3,7 @@
/mob/living
var/meat_amount = 0 // How much meat to drop from this mob when butchered
var/obj/meat_type // The meat object to drop
+ var/name_the_meat = TRUE
var/gib_on_butchery = FALSE
var/butchery_drops_organs = TRUE // Do we spawn and/or drop organs when butchered?
@@ -17,7 +18,8 @@
being_butchered = TRUE
while(meat_amount > 0 && do_after(user, 0.5 SECONDS * (mob_size / 10), src))
var/obj/item/meat = new meat_type(get_turf(src))
- meat.name = "[src.name] [meat.name]"
+ if(name_the_meat)
+ meat.name = "[src.name] [meat.name]"
new /obj/effect/decal/cleanable/blood/splatter(get_turf(src))
meat_amount--
being_butchered = FALSE
diff --git a/code/modules/mob/living/carbon/breathe.dm b/code/modules/mob/living/carbon/breathe.dm
index f4d90e97120..009667dbf4b 100644
--- a/code/modules/mob/living/carbon/breathe.dm
+++ b/code/modules/mob/living/carbon/breathe.dm
@@ -2,7 +2,7 @@
//Start of a breath chain, calls breathe()
/mob/living/carbon/handle_breathing()
- if(air_master.current_cycle%4==2 || failed_last_breath || (health < CONFIG_GET(number/health_threshold_crit))) //First, resolve location and get a breath
+ if(SSair.current_cycle%4==2 || failed_last_breath || (health < CONFIG_GET(number/health_threshold_crit))) //First, resolve location and get a breath
breathe()
/mob/living/carbon/proc/breathe()
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 21e87074bf3..90156f2f5ef 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -9,6 +9,8 @@ var/list/_human_default_emotes = list(
/decl/emote/audible/synth/dwoop,
/decl/emote/audible/synth/boop,
/decl/emote/audible/synth/robochirp,
+ /decl/emote/audible/synth/ding,
+ /decl/emote/audible/synth/microwave,
/decl/emote/visible/nod,
/decl/emote/visible/shake,
/decl/emote/visible/shiver,
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 8dca9ab08f8..b1244ee799d 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -82,10 +82,6 @@
var/obj/item/l_store = null
var/obj/item/s_store = null
- var/used_skillpoints = 0
- var/skill_specialization = null
- var/list/skills = list()
-
var/voice = "" //Instead of new say code calling GetVoice() over and over and over, we're just going to ask this variable, which gets updated in Life()
var/special_voice = "" // For changing our voice. Used by a symptom.
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 3d071559965..7f7b2d7aadb 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -1780,7 +1780,7 @@
stomach_contents.Remove(M)
qdel(M)
continue
- if(air_master.current_cycle%3==1)
+ if(SSair.current_cycle%3==1)
if(!(M.status_flags & GODMODE))
M.adjustBruteLoss(5)
adjust_nutrition(10)
diff --git a/code/modules/mob/living/carbon/human/species/species_attack.dm b/code/modules/mob/living/carbon/human/species/species_attack.dm
index cc02a1f64a4..d4f5912d53e 100644
--- a/code/modules/mob/living/carbon/human/species/species_attack.dm
+++ b/code/modules/mob/living/carbon/human/species/species_attack.dm
@@ -25,11 +25,9 @@
edge = TRUE
/datum/unarmed_attack/claws/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
- var/skill = user.skills["combat"]
var/obj/item/organ/external/affecting = target.get_organ(zone)
var/datum/gender/T = gender_datums[user.get_visible_gender()]
var/datum/gender/TT = gender_datums[target.get_visible_gender()]
- if(!skill) skill = 1
attack_damage = CLAMP(attack_damage, 1, 5)
if(target == user)
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 94d1e093fca..6c81144e0ee 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -149,7 +149,7 @@ var/list/channel_to_radio_key = new
if(client)
if(message)
client.handle_spam_prevention(MUTE_IC)
- if((client.prefs.muted & MUTE_IC) || say_disabled)
+ if((client.prefs.muted & MUTE_IC))
to_chat(src, span_warning("You cannot speak in IC (Muted)."))
return
diff --git a/code/modules/mob/living/silicon/emote.dm b/code/modules/mob/living/silicon/emote.dm
index 1a82c320cfc..e791b2ee6a8 100644
--- a/code/modules/mob/living/silicon/emote.dm
+++ b/code/modules/mob/living/silicon/emote.dm
@@ -9,6 +9,8 @@ var/list/_silicon_default_emotes = list(
/decl/emote/audible/synth/dwoop,
/decl/emote/audible/synth/boop,
/decl/emote/audible/synth/robochirp,
+ /decl/emote/audible/synth/ding,
+ /decl/emote/audible/synth/microwave,
/decl/emote/audible/synth/security,
/decl/emote/audible/synth/security/halt
)
diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
index 6c573330d47..0baa98d422b 100644
--- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
+++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
@@ -579,7 +579,7 @@
'sound/vore/digest12.ogg')
playsound(src, churnsound, vol = 100, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/preference/toggle/digestion_noises)
//If the timing is right, and there are items to be touched
- if(air_master.current_cycle%3==1 && length(touchable_items))
+ if(SSair.current_cycle%3==1 && length(touchable_items))
//Burn all the mobs or add them to the exclusion list
for(var/mob/living/T in (touchable_items))
diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm
index 60a0bea5ab7..6f92802684b 100644
--- a/code/modules/mob/living/silicon/robot/emote.dm
+++ b/code/modules/mob/living/silicon/robot/emote.dm
@@ -25,6 +25,8 @@ var/list/_robot_default_emotes = list(
/decl/emote/audible/synth/dwoop,
/decl/emote/audible/synth/boop,
/decl/emote/audible/synth/robochirp,
+ /decl/emote/audible/synth/ding,
+ /decl/emote/audible/synth/microwave,
/decl/emote/audible/synth/security,
/decl/emote/audible/synth/security/halt,
//VOREStation Add
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/turkeygirl.dm b/code/modules/mob/living/simple_mob/subtypes/animal/turkeygirl.dm
new file mode 100644
index 00000000000..9c29db15a3a
--- /dev/null
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/turkeygirl.dm
@@ -0,0 +1,101 @@
+//turkey - sprites and writing done by VerySoft
+/mob/living/simple_mob/vore/turkeygirl
+ name = "turkeygirl"
+ desc = "A feathered woman! She looks like some kind of plump turkey!"
+ tt_desc = "Meleagris gallopian"
+ icon = 'icons/mob/turkey.dmi'
+ icon_state = "turkeygirl"
+ icon_living = "turkeygirl"
+ icon_dead = "turkeygirl-dead"
+
+ health = 100
+ maxHealth = 100
+
+ has_hands = TRUE
+
+ faction = "turkey"
+
+ response_help = "hugs"
+ response_disarm = "pushes"
+ response_harm = "punches"
+ attacktext = list("pecked")
+
+ has_langs = list(LANGUAGE_GALCOM , LANGUAGE_ANIMAL)
+
+ meat_amount = 100
+ meat_type = /obj/item/reagent_containers/food/snacks/meat/chicken
+
+ ai_holder_type = /datum/ai_holder/simple_mob/passive
+
+ say_list_type = /datum/say_list/turkey
+
+ vore_active = 1
+ vore_capacity = 2
+ vore_bump_chance = 10
+ vore_pounce_chance = 10
+ vore_pounce_maxhealth = 999
+ vore_ignores_undigestable = 0
+ vore_default_mode = DM_SELECT
+ vore_icons = SA_ICON_LIVING
+ vore_stomach_name = "Stomach"
+ vore_default_contamination_flavor = "Wet"
+ vore_default_contamination_color = "grey"
+ vore_default_item_mode = IM_DIGEST
+ vore_standing_too = TRUE
+
+/mob/living/simple_mob/vore/turkeygirl/init_vore()
+ ..()
+ var/obj/belly/B = vore_selected
+ B.name = "stomach"
+ B.desc = "The hot churning stomach of a turkey girl! The doughy flesh presses inward to form to your figure, thick slime coating everything, and very shortly that includes you as well! There isn't any escaping that constant full body motion, as her body works to ball yours up into a tight little package. Gurgling and glubbing with every shifting movement, while her pulse throbs through the flesh all around you with every beat of her heart. All in all, one thing is for certain! You've become turkey stuffing! Oh no..."
+ B.mode_flags = DM_FLAG_THICKBELLY | DM_FLAG_NUMBING
+ B.belly_fullscreen = "anibelly"
+ B.digest_brute = 1
+ B.digest_burn = 6
+ B.digestchance = 0
+ B.absorbchance = 0
+ B.escapechance = 15
+ B.colorization_enabled = TRUE
+ B.belly_fullscreen_color = "#521717"
+
+/datum/say_list/turkey
+ speak = list("Gobble!", "Gobble gobble!", "Gobble gobble gobble!", "Give me something to be thankful for~", "Could use something to gobble~", "Why don't you make a pilgrimage over here and give me something good to eat?", "I want a treat... I could bite you too if you like~", "What's your favorite time of year?", "Autumn is the best time of year~", "You just gonna let a girl go hungry?")
+
+/mob/living/simple_mob/vore/turkeygirl/update_icon()
+ . = ..()
+ if(stat == DEAD)
+ return
+ if(vore_fullness == 2 || nutrition >= 5000)
+ icon_state = "[icon_living]-2"
+
+ else if(vore_fullness == 1 || nutrition >= 2500)
+ icon_state = "[icon_living]-1"
+ if(resting)
+ icon_state = "[icon_state]-resting"
+
+/mob/living/simple_mob/vore/turkeygirl/attackby(var/obj/item/reagent_containers/food/snacks/O as obj, var/mob/user as mob)
+ if(stat)
+ return ..()
+
+ if(!istype(O, /obj/item/reagent_containers/food/snacks))
+ return ..()
+
+ if(nutrition >= max_nutrition)
+ if(user == src)
+ to_chat(src, span_notice("You're too full to eat another bite."))
+ return
+ to_chat(user, span_notice("\The [src] seems too full to eat."))
+ return
+
+ user.setClickCooldown(user.get_attack_speed(O))
+ if(O.reagents)
+ O.reagents.trans_to_mob(src, O.bitesize, CHEM_INGEST)
+ adjust_nutrition(O.bitesize * 20)
+ O.bitecount ++
+ O.On_Consume(src)
+ if(O)
+ to_chat(user, span_notice("\The [src] takes a bite of \the [O]."))
+ if(user != src)
+ to_chat(src, span_notice("\The [user] feeds \the [O] to you."))
+ playsound(src, 'sound/items/eatfood.ogg', 75, 1)
+ update_icon()
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/redpanda.dm b/code/modules/mob/living/simple_mob/subtypes/vore/redpanda.dm
index 430e6efd4a3..73005bc9b9b 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/redpanda.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/redpanda.dm
@@ -9,7 +9,7 @@
icon_rest = "wah_rest"
icon = 'icons/mob/vore.dmi'
- faction = FACTION_REDPANDA //stop naming stuff vaguely
+ faction = FACTION_REDPANDA
maxHealth = 30
health = 30
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub_larva.dm b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub_larva.dm
index 763e7386ab5..f1c2ef76417 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub_larva.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub_larva.dm
@@ -88,7 +88,7 @@ var/global/list/grub_machine_overlays = list()
return
if(istype(loc, /obj/machinery))
- if(machine_effect && air_master.current_cycle%30)
+ if(machine_effect && SSair.current_cycle%30)
for(var/mob/M in player_list)
M << machine_effect
if(prob(10))
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/turkey.dm b/code/modules/mob/living/simple_mob/subtypes/vore/turkey.dm
new file mode 100644
index 00000000000..1b599f74f82
--- /dev/null
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/turkey.dm
@@ -0,0 +1,43 @@
+/mob/living/simple_mob/vore/turkey
+ name = "turkey"
+ desc = "A large turkey, all ready for stuffing."
+ tt_desc = "Meleagris gallopavo"
+
+ icon_state = "turkey"
+ icon_living = "turkey"
+ icon_dead = "turkeydead"
+ icon_rest = "turkeyrest"
+ icon = 'icons/mob/vore.dmi'
+
+ faction = FACTION_TURKEY
+ maxHealth = 25
+ health = 25
+
+ meat_amount = 1
+ meat_type = /obj/item/reagent_containers/food/snacks/rawturkey
+ name_the_meat = FALSE
+
+ response_help = "pats"
+ response_disarm = "gently pushes aside"
+ response_harm = "hits"
+
+ harm_intent_damage = 3
+ melee_damage_lower = 3
+ melee_damage_upper = 1
+ attacktext = list("pecked")
+
+ say_list_type = /datum/say_list/turkey
+ ai_holder_type = /datum/ai_holder/simple_mob/passive
+
+ allow_mind_transfer = TRUE
+
+ vore_active = 1
+ vore_bump_chance = 10
+ vore_bump_emote = "greedily leaps at"
+ vore_default_mode = DM_HOLD
+ vore_icons = SA_ICON_LIVING
+
+/datum/say_list/turkey
+ speak = list("GOBBLEGOBBLE!","Gobble?","Gobblegobble...")
+ emote_hear = list("gobbles!")
+ emote_see = list("flaps its wings","pecks something on the floor","puffs up its feathers")
diff --git a/code/modules/mob/new_player/skill.dm b/code/modules/mob/new_player/skill.dm
deleted file mode 100644
index 98361e4bb69..00000000000
--- a/code/modules/mob/new_player/skill.dm
+++ /dev/null
@@ -1,213 +0,0 @@
-var/global/const
- SKILL_NONE = 0
- SKILL_BASIC = 1
- SKILL_ADEPT = 2
- SKILL_EXPERT = 3
- SKILL_PROF = 4
-
-/datum/skill/var
- ID = "none" // ID of the skill, used in code
- name = "None" // name of the skill
- desc = "Placeholder skill" // detailed description of the skill
- field = "Misc" // the field under which the skill will be listed
- secondary = 0 // secondary skills only have two levels and cost significantly less
-
-var/global/list/SKILLS = null
-var/list/SKILL_ENGINEER = list("field" = "Engineering", "EVA" = SKILL_BASIC, "construction" = SKILL_ADEPT, "electrical" = SKILL_BASIC, "engines" = SKILL_ADEPT)
-var/list/SKILL_ORGAN_ROBOTICIST = list("field" = "Science", "devices" = SKILL_ADEPT, "electrical" = SKILL_BASIC, "computer" = SKILL_ADEPT, "anatomy" = SKILL_BASIC)
-var/list/SKILL_SECURITY_OFFICER = list("field" = "Security", "combat" = SKILL_BASIC, "weapons" = SKILL_ADEPT, "law" = SKILL_ADEPT, "forensics" = SKILL_BASIC)
-var/list/SKILL_CHEMIST = list("field" = "Science", "chemistry" = SKILL_ADEPT, "science" = SKILL_ADEPT, "medical" = SKILL_BASIC, "devices" = SKILL_BASIC)
-var/global/list/SKILL_PRE = list(JOB_ENGINEER = SKILL_ENGINEER, JOB_ROBOTICIST = SKILL_ORGAN_ROBOTICIST, JOB_SECURITY_OFFICER = SKILL_SECURITY_OFFICER, JOB_CHEMIST = SKILL_CHEMIST)
-
-/datum/skill/management
- ID = "management"
- name = "Command"
- desc = "Your ability to manage and commandeer other crew members."
-
-/datum/skill/combat
- ID = "combat"
- name = "Close Combat"
- desc = "This skill describes your training in hand-to-hand combat or melee weapon usage. While expertise in this area is rare in the era of firearms, experts still exist among athletes."
- field = "Security"
-
-/datum/skill/weapons
- ID = "weapons"
- name = "Weapons Expertise"
- desc = "This skill describes your expertise with and knowledge of weapons. A low level in this skill implies knowledge of simple weapons, for example tazers and flashes. A high level in this skill implies knowledge of complex weapons, such as grenades, riot shields, pulse rifles or bombs. A low level in this skill is typical for security officers, a high level of this skill is typical for special agents and soldiers."
- field = "Security"
-
-/datum/skill/EVA
- ID = "EVA"
- name = "Extra-vehicular activity"
- desc = "This skill describes your skill and knowledge of space-suits and working in vacuum."
- field = "Engineering"
- secondary = 1
-
-/datum/skill/forensics
- ID = "forensics"
- name = "Forensics"
- desc = "Describes your skill at performing forensic examinations and identifying vital evidence. Does not cover analytical abilities, and as such isn't the only indicator for your investigation skill. Note that in order to perform autopsy, the surgery skill is also required."
- field = "Security"
-
-/datum/skill/construction
- ID = "construction"
- name = "Construction"
- desc = "Your ability to construct various buildings, such as walls, floors, tables and so on. Note that constructing devices such as APCs additionally requires the Electronics skill. A low level of this skill is typical for janitors, a high level of this skill is typical for engineers."
- field = "Engineering"
-
-/datum/skill/management
- ID = "management"
- name = "Command"
- desc = "Your ability to manage and commandeer other crew members."
-
-/datum/skill/knowledge/law
- ID = "law"
- name = "Corporate Law"
- desc = "Your knowledge of corporate law and procedures. This includes Corporate Regulations, as well as general station rulings and procedures. A low level in this skill is typical for security officers, a high level in this skill is typical for Site Managers."
- field = "Security"
- secondary = 1
-
-/datum/skill/devices
- ID = "devices"
- name = "Complex Devices"
- desc = "Describes the ability to assemble complex devices, such as computers, circuits, printers, robots or gas tank assemblies(bombs). Note that if a device requires electronics or programming, those skills are also required in addition to this skill."
- field = "Science"
-
-/datum/skill/electrical
- ID = "electrical"
- name = "Electrical Engineering"
- desc = "This skill describes your knowledge of electronics and the underlying physics. A low level of this skill implies you know how to lay out wiring and configure powernets, a high level of this skill is required for working complex electronic devices such as circuits or bots."
- field = "Engineering"
-
-/datum/skill/atmos
- ID = "atmos"
- name = "Atmospherics"
- desc = "Describes your knowledge of piping, air distribution and gas dynamics."
- field = "Engineering"
-
-/datum/skill/engines
- ID = "engines"
- name = "Engines"
- desc = "Describes your knowledge of the various engine types common on space stations, such as the singularity or anti-matter engine."
- field = "Engineering"
- secondary = 1
-
-/datum/skill/computer
- ID = "computer"
- name = "Information Technology"
- desc = "Describes your understanding of computers, software and communication. Not a requirement for using computers, but definitely helps. Used in telecommunications and programming of computers and AIs."
- field = "Science"
-
-/datum/skill/pilot
- ID = "pilot"
- name = "Heavy Machinery Operation"
- desc = "Describes your experience and understanding of operating heavy machinery, which includes mechs and other large exosuits. Used in piloting mechs."
- field = "Engineering"
-
-/datum/skill/medical
- ID = "medical"
- name = "Medicine"
- desc = "Covers an understanding of the human body and medicine. At a low level, this skill gives a basic understanding of applying common types of medicine, and a rough understanding of medical devices like the health analyzer. At a high level, this skill grants exact knowledge of all the medicine available on the station, as well as the ability to use complex medical devices like the body scanner or mass spectrometer."
- field = "Medical"
-
-/datum/skill/anatomy
- ID = "anatomy"
- name = "Anatomy"
- desc = "Gives you a detailed insight of the human body. A high skill in this is required to perform surgery.This skill may also help in examining alien biology."
- field = "Medical"
-
-/datum/skill/virology
- ID = "virology"
- name = "Virology"
- desc = "This skill implies an understanding of microorganisms and their effects on humans."
- field = "Medical"
-
-/datum/skill/genetics
- ID = "genetics"
- name = "Genetics"
- desc = "Implies an understanding of how DNA works and the structure of the human DNA."
- field = "Science"
-
-/datum/skill/chemistry
- ID = "chemistry"
- name = "Chemistry"
- desc = "Experience with mixing chemicals, and an understanding of what the effect will be. This doesn't cover an understanding of the effect of chemicals on the human body, as such the medical skill is also required for medical chemists."
- field = "Science"
-
-/datum/skill/botany
- ID = "botany"
- name = "Botany"
- desc = "Describes how good a character is at growing and maintaining plants."
-
-/datum/skill/cooking
- ID = "cooking"
- name = "Cooking"
- desc = "Describes a character's skill at preparing meals and other consumable goods. This includes mixing alcoholic beverages."
-
-/datum/skill/science
- ID = "science"
- name = "Science"
- desc = "Your experience and knowledge with scientific methods and processes."
- field = "Science"
-
-/datum/attribute/var
- ID = "none"
- name = "None"
- desc = "This is a placeholder"
-
-
-/proc/setup_skills()
- if(SKILLS == null)
- SKILLS = list()
- for(var/T in subtypesof(/datum/skill))
- var/datum/skill/S = new T
- if(S.ID != "none")
- if(!SKILLS.Find(S.field))
- SKILLS[S.field] = list()
- var/list/L = SKILLS[S.field]
- L += S
-
-
-/mob/living/carbon/human/proc/GetSkillClass(points)
- return CalculateSkillClass(points, age)
-
-/proc/show_skill_window(var/mob/user, var/mob/living/carbon/human/M)
- if(!istype(M)) return
- if(SKILLS == null)
- setup_skills()
-
- if(!M.skills || M.skills.len == 0)
- to_chat(user, "There are no skills to display.")
- return
-
- var/HTML = ""
- HTML += span_bold("Select your Skills") + "
"
- HTML += "Current skill level: [M.GetSkillClass(M.used_skillpoints)] ([M.used_skillpoints])
"
- HTML += ""
- for(var/V in SKILLS)
- HTML += "" + span_bold("[V]")
- HTML += " |
"
- for(var/datum/skill/S in SKILLS[V])
- var/level = M.skills[S.ID]
- HTML += ""
- HTML += "[S.name] | "
- HTML += "\[Untrained\] | "
- // secondary skills don't have an amateur level
- if(S.secondary)
- HTML += " | "
- else
- HTML += "\[Amateur\] | "
- HTML += "\[Trained\] | "
- HTML += "\[Professional\] | "
- HTML += "
"
- HTML += "
"
-
- user << browse(null, "window=preferences")
- user << browse(HTML, "window=show_skills;size=600x800")
- return
-
-/mob/living/carbon/human/verb/show_skills()
- set category = "IC.Game"
- set name = "Show Own Skills"
-
- show_skill_window(src, src)
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index e7b71271632..475d69193a6 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -32,9 +32,6 @@
set desc = "Emote to nearby people (and your pred/prey)"
set hidden = 1
- if(say_disabled) //This is here to try to identify lag problems
- to_chat(usr, span_red("Speech is currently admin-disabled."))
- return
//VOREStation Addition Start
if(forced_psay)
pme(message)
@@ -56,10 +53,6 @@
usr.emote(message)
/mob/proc/say_dead(var/message)
- if(say_disabled) //This is here to try to identify lag problems
- to_chat(usr, span_danger("Speech is currently admin-disabled."))
- return
-
if(!client)
return // Clientless mobs shouldn't be trying to talk in deadchat.
diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm
index 2c2a928deb3..72630b09b9b 100644
--- a/code/modules/mob/say_vr.dm
+++ b/code/modules/mob/say_vr.dm
@@ -8,9 +8,6 @@
set desc = "Emote to nearby people (and your pred/prey)"
set hidden = 1
- if(say_disabled) //This is here to try to identify lag problems
- to_chat(usr, "Speech is currently admin-disabled.")
- return
if(forced_psay)
pme(message)
return
@@ -30,9 +27,6 @@
set category = "IC.Subtle"
set desc = "Emote to nearby people, with ability to choose which specific portion of people you wish to target."
- if(say_disabled) //This is here to try to identify lag problems
- to_chat(usr, "Speech is currently admin-disabled.")
- return
if(forced_psay)
pme(message)
return
diff --git a/code/modules/mob/skillset.dm b/code/modules/mob/skillset.dm
deleted file mode 100644
index 3afb7a97aaf..00000000000
--- a/code/modules/mob/skillset.dm
+++ /dev/null
@@ -1,12 +0,0 @@
-
-// We don't actually have a skills system, so return max skill for everything.
-/mob/proc/get_skill_value(skill_path)
- return SKILL_EXPERT
-
-// A generic way of modifying success probabilities via skill values. Higher factor means skills have more effect. fail_chance is the chance at SKILL_NONE.
-/mob/proc/skill_fail_chance(skill_path, fail_chance, no_more_fail = SKILL_EXPERT, factor = 1)
- var/points = get_skill_value(skill_path)
- if(points >= no_more_fail)
- return 0
- else
- return fail_chance * 2 ** (factor*(SKILL_BASIC - points))
diff --git a/code/modules/modular_computers/file_system/programs/generic/game.dm b/code/modules/modular_computers/file_system/programs/generic/game.dm
index 8cf049aff72..bffa14c5124 100644
--- a/code/modules/modular_computers/file_system/programs/generic/game.dm
+++ b/code/modules/modular_computers/file_system/programs/generic/game.dm
@@ -39,7 +39,6 @@
if(istype(computer))
computer.update_icon()
ticket_count += 1
- // user?.mind?.adjust_experience(/datum/skill/gaming, 50)
sleep(10)
else if(player_hp <= 0 || player_mp <= 0)
heads_up = "You have been defeated... how will the station survive?"
@@ -48,7 +47,6 @@
program_icon_state = "arcade_off"
if(istype(computer))
computer.update_icon()
- // user?.mind?.adjust_experience(/datum/skill/gaming, 10)
sleep(10)
// This handles the boss "AI".
@@ -115,8 +113,6 @@
if(computer)
printer = computer.nano_printer
- // var/gamerSkillLevel = usr.mind?.get_skill_level(/datum/skill/gaming)
- // var/gamerSkill = usr.mind?.get_skill_modifier(/datum/skill/gaming, SKILL_RANDS_MODIFIER)
switch(action)
if("Attack")
var/attackamt = 0 //Spam prevention.
diff --git a/code/modules/organs/internal/augment/armmounted.dm b/code/modules/organs/internal/augment/armmounted.dm
index 28804311a0b..3845de10722 100644
--- a/code/modules/organs/internal/augment/armmounted.dm
+++ b/code/modules/organs/internal/augment/armmounted.dm
@@ -62,6 +62,10 @@
icon_state = "augment_box"
w_class = ITEMSIZE_SMALL
+ // Needs to be redefined here, or the switch statement beneath with no default case can never change target limb... Also prevents putting it in your shoulder when it's a hand implant.
+ organ_tag = O_AUG_R_HAND
+ parent_organ = BP_R_HAND
+ target_slot = slot_r_hand
integrated_object_type = /obj/item/portable_scanner
diff --git a/code/modules/overmap/disperser/disperser_console.dm b/code/modules/overmap/disperser/disperser_console.dm
index 928180711fe..25571cca6d1 100644
--- a/code/modules/overmap/disperser/disperser_console.dm
+++ b/code/modules/overmap/disperser/disperser_console.dm
@@ -6,9 +6,6 @@
icon_state = "computer"
circuit = /obj/item/circuitboard/disperser
- core_skill = /datum/skill/pilot
- var/skill_offset = SKILL_ADEPT - 1 //After which skill level it starts to matter. -1, because we have to index from zero
-
icon_keyboard = "rd_key"
icon_screen = "teleport"
@@ -151,7 +148,6 @@
data["range"] = range
data["next_shot"] = round(get_next_shot_seconds())
data["nopower"] = !data["faillink"] && (!front.powered() || !middle.powered() || !back.powered())
- data["skill"] = user.get_skill_value(core_skill) > skill_offset
var/charge = "UNKNOWN ERROR"
if(get_charge_type() == OVERMAP_WEAKNESS_NONE)
@@ -184,7 +180,7 @@
. = TRUE
if("skill_calibration")
- for(var/i = 1 to min(caldigit, usr.get_skill_value(core_skill) - skill_offset))
+ for(var/i = 1 to 2)
calibration[i] = calexpected[i]
. = TRUE
diff --git a/code/modules/overmap/overmap_shuttle.dm b/code/modules/overmap/overmap_shuttle.dm
index 4ef8a9be386..ac9c5711847 100644
--- a/code/modules/overmap/overmap_shuttle.dm
+++ b/code/modules/overmap/overmap_shuttle.dm
@@ -9,8 +9,6 @@
var/obj/effect/overmap/visitable/ship/landable/myship //my overmap ship object
category = /datum/shuttle/autodock/overmap
- var/skill_needed = SKILL_BASIC
- var/operator_skill = SKILL_BASIC
/datum/shuttle/autodock/overmap/New(var/_name, var/obj/effect/shuttle_landmark/start_waypoint)
..(_name, start_waypoint)
@@ -54,15 +52,7 @@
/datum/shuttle/autodock/overmap/get_travel_time()
var/distance_mod = get_dist(waypoint_sector(current_location),waypoint_sector(next_location))
- var/skill_mod = 0.2*(skill_needed - operator_skill)
- return move_time * (1 + distance_mod + skill_mod)
-
-/datum/shuttle/autodock/overmap/process_launch()
- if(prob(10*max(0, skill_needed - operator_skill)))
- var/places = get_possible_destinations()
- var/place = pick(places)
- set_destination(places[place])
- ..()
+ return move_time * (1 + distance_mod)
/datum/shuttle/autodock/overmap/proc/set_destination(var/obj/effect/shuttle_landmark/A)
if(A != current_location)
@@ -187,4 +177,4 @@
// Walls hide stuff inside them, but we want to be visible.
/obj/structure/fuel_port/hide()
- return
\ No newline at end of file
+ return
diff --git a/code/modules/overmap/ships/computers/computer_shims.dm b/code/modules/overmap/ships/computers/computer_shims.dm
index fd0d3abaefc..449f3bd4be5 100644
--- a/code/modules/overmap/ships/computers/computer_shims.dm
+++ b/code/modules/overmap/ships/computers/computer_shims.dm
@@ -49,7 +49,6 @@
// Skills
//
/obj/machinery/computer/ship
- var/core_skill = /datum/skill/devices //The skill used for skill checks for this machine (mostly so subtypes can use different skills).
var/ai_control = TRUE //VOREStation Edit
//
diff --git a/code/modules/overmap/ships/computers/helm.dm b/code/modules/overmap/ships/computers/helm.dm
index 5895b3bb849..bbd17919997 100644
--- a/code/modules/overmap/ships/computers/helm.dm
+++ b/code/modules/overmap/ships/computers/helm.dm
@@ -20,7 +20,6 @@ GLOBAL_LIST_EMPTY(all_waypoints)
icon_screen = "helm"
light_color = "#7faaff"
circuit = /obj/item/circuitboard/helm
- core_skill = /datum/skill/pilot
var/autopilot = 0
var/autopilot_disabled = TRUE
var/list/known_sectors = list()
@@ -77,13 +76,10 @@ GLOBAL_LIST_EMPTY(all_waypoints)
// All other cases, move toward direction
else if(speed + acceleration <= speedlimit)
linked.accelerate(direction, accellimit)
- linked.operator_skill = null//if this is on you can't dodge meteors
return
/obj/machinery/computer/ship/helm/relaymove(var/mob/user, direction)
if(viewing_overmap(user) && linked)
- if(prob(user.skill_fail_chance(/datum/skill/pilot, 50, linked.skill_needed, factor = 1)))
- direction = turn(direction,pick(90,-90))
linked.relaymove(user, direction, accellimit)
return 1
@@ -253,8 +249,6 @@ GLOBAL_LIST_EMPTY(all_waypoints)
if("move")
var/ndir = text2num(params["dir"])
- if(prob(usr.skill_fail_chance(/datum/skill/pilot, 50, linked.skill_needed, factor = 1)))
- ndir = turn(ndir,pick(90,-90))
linked.relaymove(usr, ndir, accellimit)
. = TRUE
diff --git a/code/modules/overmap/ships/computers/shuttle.dm b/code/modules/overmap/ships/computers/shuttle.dm
index 5ad197e0500..bfa14482a2b 100644
--- a/code/modules/overmap/ships/computers/shuttle.dm
+++ b/code/modules/overmap/ships/computers/shuttle.dm
@@ -34,10 +34,6 @@
to_chat(usr, span_warning("Unable to establish link with the shuttle."))
return TRUE
- if(ismob(usr))
- var/mob/user = usr
- shuttle.operator_skill = user.get_skill_value(/datum/skill/pilot)
-
switch(action)
if("pick")
var/list/possible_d = shuttle.get_possible_destinations()
diff --git a/code/modules/overmap/ships/ship.dm b/code/modules/overmap/ships/ship.dm
index 8394744fc35..cbacd0cb3e9 100644
--- a/code/modules/overmap/ships/ship.dm
+++ b/code/modules/overmap/ships/ship.dm
@@ -39,8 +39,6 @@
var/engines_state = 0 //global on/off toggle for all engines
var/thrust_limit = 1 //global thrust limit for all engines, 0..1
var/halted = 0 //admin halt or other stop.
- var/skill_needed = SKILL_ADEPT //piloting skill needed to steer it without going in random dir
- var/operator_skill
//VOREStation add
var/last_sound = 0 //The last time a ship sound was played //VOREStation add
var/sound_cooldown = 10 SECONDS //VOREStation add
@@ -67,7 +65,6 @@
/obj/effect/overmap/visitable/ship/relaymove(mob/user, direction, accel_limit)
accelerate(direction, accel_limit)
- operator_skill = user.get_skill_value(/datum/skill/pilot)
/obj/effect/overmap/visitable/ship/proc/is_still()
return !MOVING(speed[1]) && !MOVING(speed[2])
@@ -285,9 +282,6 @@
if(!SSshuttles.overmap_halted)
halted = 0
-/obj/effect/overmap/visitable/ship/proc/get_helm_skill()//delete this mover operator skill to overmap obj
- return operator_skill
-
/obj/effect/overmap/visitable/ship/populate_sector_objects()
..()
for(var/obj/machinery/computer/ship/S in global.machines)
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index a3952a80aee..89bc7f2d881 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -113,8 +113,6 @@
for(var/atom/movable/A in affecting)
if(istype(A,/obj/effect/abstract)) // Flashlight's lights are not physical objects
continue
- if(istype(A,/obj/effect/decal/jan_hud)) // Ignore these too
- continue
if(!A.anchored)
if(A.loc == src.loc) // prevents the object from being affected if it's not currently here.
step(A,movedir)
diff --git a/code/unit_tests/map_tests.dm b/code/unit_tests/map_tests.dm
index e988835fc4d..d6a93477845 100644
--- a/code/unit_tests/map_tests.dm
+++ b/code/unit_tests/map_tests.dm
@@ -124,10 +124,10 @@
/datum/unit_test/active_edges/start_test()
- var/active_edges = air_master.active_edges.len
+ var/active_edges = SSair.active_edges.len
var/list/edge_log = list()
if(active_edges)
- for(var/connection_edge/E in air_master.active_edges)
+ for(var/connection_edge/E in SSair.active_edges)
var/a_temp = E.A.air.temperature
var/a_moles = E.A.air.total_moles
var/a_vol = E.A.air.volume
diff --git a/icons/inventory/hands/item.dmi b/icons/inventory/hands/item.dmi
index 3adca7d964f..104a112bf1a 100644
Binary files a/icons/inventory/hands/item.dmi and b/icons/inventory/hands/item.dmi differ
diff --git a/icons/inventory/hands/mob.dmi b/icons/inventory/hands/mob.dmi
index bf041c8a023..ab825c3513d 100644
Binary files a/icons/inventory/hands/mob.dmi and b/icons/inventory/hands/mob.dmi differ
diff --git a/icons/mob/turkey.dmi b/icons/mob/turkey.dmi
new file mode 100644
index 00000000000..8f7d1db729a
Binary files /dev/null and b/icons/mob/turkey.dmi differ
diff --git a/icons/mob/vore.dmi b/icons/mob/vore.dmi
index 67209c83d73..33cc2020b06 100644
Binary files a/icons/mob/vore.dmi and b/icons/mob/vore.dmi differ
diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi
index 0729f894288..0133201cba5 100644
Binary files a/icons/obj/food.dmi and b/icons/obj/food.dmi differ
diff --git a/icons/obj/furniture.dmi b/icons/obj/furniture.dmi
index 6df4edab483..1abe1e3843e 100644
Binary files a/icons/obj/furniture.dmi and b/icons/obj/furniture.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index 80566ece9e4..a7598b39a53 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/items_vr.dmi b/icons/obj/items_vr.dmi
index c5ecf41b1ac..26286904c79 100644
Binary files a/icons/obj/items_vr.dmi and b/icons/obj/items_vr.dmi differ
diff --git a/icons/obj/pillows.dmi b/icons/obj/pillows.dmi
index 276e8cb3c5f..b11e83ee617 100644
Binary files a/icons/obj/pillows.dmi and b/icons/obj/pillows.dmi differ
diff --git a/icons/obj/trash.dmi b/icons/obj/trash.dmi
index 8866b481c1d..482452e8ecc 100644
Binary files a/icons/obj/trash.dmi and b/icons/obj/trash.dmi differ
diff --git a/maps/redgate/jungle.dmm b/maps/redgate/jungle.dmm
index de8eeff00d0..b8a99f781a1 100644
--- a/maps/redgate/jungle.dmm
+++ b/maps/redgate/jungle.dmm
@@ -1732,7 +1732,7 @@
key_id = "gold";
name = "gold key"
},
-/obj/item/spellbook/oneuse/knock,
+/obj/random/fantasy_item,
/obj/random/fantasy_item,
/turf/simulated/floor/tiled/yellow,
/area/redgate/jungle/temple)
diff --git a/maps/southern_cross/job/outfits.dm b/maps/southern_cross/job/outfits.dm
index 2a1cf6d67b0..f2ef7db2ee6 100644
--- a/maps/southern_cross/job/outfits.dm
+++ b/maps/southern_cross/job/outfits.dm
@@ -10,7 +10,6 @@ Keep outfits simple. Spawn with basic uniforms and minimal gear. Gear instead go
name = OUTFIT_JOB_NAME("Explorer")
shoes = /obj/item/clothing/shoes/boots/winter/explorer
uniform = /obj/item/clothing/under/explorer
- l_ear = /obj/item/radio/headset/explorer
id_slot = slot_wear_id
pda_slot = slot_l_store
pda_type = /obj/item/pda/explorer //VORESTation Edit - Better Brown
@@ -19,6 +18,10 @@ Keep outfits simple. Spawn with basic uniforms and minimal gear. Gear instead go
flags = OUTFIT_HAS_BACKPACK|OUTFIT_COMPREHENSIVE_SURVIVAL
backpack_contents = list(/obj/item/clothing/accessory/permit/gun/planetside = 1)
+ headset = /obj/item/radio/headset/explorer
+ headset_alt = /obj/item/radio/headset/explorer
+ headset_earbud = /obj/item/radio/headset/explorer
+
/decl/hierarchy/outfit/job/explorer2/post_equip(mob/living/carbon/human/H)
..()
for(var/obj/item/clothing/accessory/permit/gun/planetside/permit in H.back.contents)
@@ -43,7 +46,6 @@ Keep outfits simple. Spawn with basic uniforms and minimal gear. Gear instead go
suit = /obj/item/clothing/suit/storage/toggle/bomber/pilot
gloves = /obj/item/clothing/gloves/fingerless
glasses = /obj/item/clothing/glasses/fakesunglasses/aviator
- l_ear = /obj/item/radio/headset/pilot/alt
uniform_accessories = list(/obj/item/clothing/accessory/storage/webbing/pilot1 = 1)
id_slot = slot_wear_id
pda_slot = slot_belt
@@ -52,12 +54,15 @@ Keep outfits simple. Spawn with basic uniforms and minimal gear. Gear instead go
id_pda_assignment = JOB_PILOT
flags = OUTFIT_HAS_BACKPACK|OUTFIT_COMPREHENSIVE_SURVIVAL
+ headset = /obj/item/radio/headset/pilot/alt
+ headset_alt = /obj/item/radio/headset/pilot/alt
+ headset_earbud = /obj/item/radio/headset/pilot/alt
+
/decl/hierarchy/outfit/job/medical/sar
name = OUTFIT_JOB_NAME("Field Medic") //VOREStation Edit
uniform = /obj/item/clothing/under/utility/blue
//suit = /obj/item/clothing/suit/storage/hooded/wintercoat/medical/sar //VOREStation Edit
shoes = /obj/item/clothing/shoes/boots/winter/explorer
- l_ear = /obj/item/radio/headset/sar
l_hand = /obj/item/storage/firstaid/regular
belt = /obj/item/storage/belt/medical/emt
pda_slot = slot_l_store
@@ -65,3 +70,7 @@ Keep outfits simple. Spawn with basic uniforms and minimal gear. Gear instead go
pda_type = /obj/item/pda/sar //VOREStation Add
id_pda_assignment = "Field Medic" //VOREStation Edit
flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL|OUTFIT_COMPREHENSIVE_SURVIVAL
+
+ headset = /obj/item/radio/headset/sar
+ headset_alt = /obj/item/radio/headset/sar
+ headset_earbud = /obj/item/radio/headset/sar
diff --git a/maps/stellar_delight/stellar_delight1.dmm b/maps/stellar_delight/stellar_delight1.dmm
index 4a75431ddac..87e5ba518dc 100644
--- a/maps/stellar_delight/stellar_delight1.dmm
+++ b/maps/stellar_delight/stellar_delight1.dmm
@@ -590,7 +590,6 @@
master_tag = "xenobio_airlock_control";
name = "Xenobiology Access Button";
pixel_y = -32;
- req_access = null;
req_one_access = list(47,55)
},
/obj/machinery/door/airlock/angled_bay/standard/color{
@@ -3323,6 +3322,10 @@
/obj/machinery/recharger,
/turf/simulated/floor/tiled/techfloor,
/area/rnd/workshop)
+"gv" = (
+/mob/living/simple_mob/animal/passive/mouse/jerboa/leggy,
+/turf/simulated/floor/tiled/eris/steel/cargo,
+/area/stellardelight/deck1/miningequipment)
"gw" = (
/obj/structure/closet/crate,
/obj/random/maintenance,
@@ -3807,7 +3810,6 @@
master_tag = "xenobio_airlock_control";
name = "Xenobiology Access Button";
pixel_y = 32;
- req_access = null;
req_one_access = list(47,55)
},
/obj/machinery/door/airlock/angled_bay/standard/color{
@@ -4507,7 +4509,6 @@
dir = 4;
door_color = "#ffffff";
name = "maintenance access";
- req_one_access = null;
stripe_color = "#5a19a8"
},
/turf/simulated/floor/tiled/steel_ridged,
@@ -4747,8 +4748,7 @@
/obj/machinery/button/crematorium{
id = "crematorium";
pixel_x = 25;
- req_access = list();
- req_one_access = null
+ req_access = list()
},
/turf/simulated/floor/tiled/dark,
/area/chapel/chapel_morgue)
@@ -4980,8 +4980,7 @@
/obj/machinery/button/remote/blast_door{
id = "librarywindowlockdown";
name = "Window Lockdown";
- pixel_y = 25;
- req_access = null
+ pixel_y = 25
},
/turf/simulated/floor/carpet,
/area/library)
@@ -5791,8 +5790,12 @@
/turf/simulated/floor/tiled/dark,
/area/security/lobby)
"lC" = (
-/obj/item/bedsheet/bluedouble,
-/obj/structure/bed/double/padded,
+/obj/item/bedsheet/bluedouble{
+ dir = 1
+ },
+/obj/structure/bed/double/padded{
+ dir = 1
+ },
/obj/structure/curtain/black,
/turf/simulated/floor/carpet,
/area/stellardelight/deck1/dorms/dorm8)
@@ -6503,7 +6506,6 @@
dir = 8;
door_color = "#333333";
name = "Away Mission Meeting Room";
- req_one_access = null;
stripe_color = "#5a19a8"
},
/turf/simulated/floor/tiled/steel_ridged,
@@ -9910,7 +9912,6 @@
/obj/machinery/door/airlock/angled_bay/standard/glass{
door_color = "#8c1d11";
name = "Brig";
- req_access = null;
req_one_access = list(38,63);
stripe_color = "#d27428"
},
@@ -10494,7 +10495,6 @@
name = "EVA Shutter";
pixel_x = -5;
pixel_y = 24;
- req_access = null;
req_one_access = list(18,19,43,67)
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
@@ -11712,7 +11712,6 @@
dir = 4;
door_color = "#ffffff";
name = "maintenance access";
- req_one_access = null;
stripe_color = "#5a19a8"
},
/turf/simulated/floor/tiled/steel_ridged,
@@ -12874,8 +12873,12 @@
/turf/simulated/floor/tiled/steel_grid,
/area/assembly/robotics)
"AP" = (
-/obj/item/bedsheet/bluedouble,
-/obj/structure/bed/double/padded,
+/obj/item/bedsheet/bluedouble{
+ dir = 1
+ },
+/obj/structure/bed/double/padded{
+ dir = 1
+ },
/obj/structure/curtain/black,
/turf/simulated/floor/carpet,
/area/stellardelight/deck1/dorms/dorm5)
@@ -13243,7 +13246,6 @@
dir = 4;
door_color = "#333333";
name = "Shuttle Bay";
- req_one_access = null;
stripe_color = "#5a19a8"
},
/turf/simulated/floor/tiled/steel_ridged,
@@ -15639,7 +15641,6 @@
door_color = "#a6753d";
name = "Shuttle Bay";
req_access = list(31);
- req_one_access = null;
stripe_color = "#3b2b1a"
},
/turf/simulated/floor/tiled/steel_ridged,
@@ -17497,7 +17498,6 @@
/obj/machinery/door/airlock/angled_bay/standard/glass{
door_color = "#8c1d11";
name = "Brig";
- req_access = null;
req_one_access = list(38,63);
stripe_color = "#d27428"
},
@@ -17961,7 +17961,6 @@
dir = 4;
door_color = "#a88860";
name = "Mining Shuttle";
- req_access = null;
req_one_access = list(31,5);
stripe_color = "#69461a"
},
@@ -18065,7 +18064,6 @@
door_color = "#2e2e2e";
fill_color = "#2e2e2e";
name = "Chapel Morgue";
- req_access = null;
stripe_color = "#deaf43"
},
/turf/simulated/floor/tiled/steel_ridged,
@@ -18373,7 +18371,6 @@
door_color = "#8c1d11";
name = "maintenance access";
req_access = list(4);
- req_one_access = null;
stripe_color = "#8c1d11"
},
/obj/structure/cable/pink{
@@ -21290,8 +21287,12 @@
/turf/simulated/floor,
/area/maintenance/stellardelight/deck1/exploration)
"Tc" = (
-/obj/item/bedsheet/orangedouble,
-/obj/structure/bed/double/padded,
+/obj/item/bedsheet/orangedouble{
+ dir = 1
+ },
+/obj/structure/bed/double/padded{
+ dir = 1
+ },
/obj/structure/curtain/black,
/turf/simulated/floor/carpet/purcarpet,
/area/stellardelight/deck1/dorms/dorm7)
@@ -21421,7 +21422,6 @@
/obj/machinery/door/airlock/angled_bay/standard/glass{
door_color = "#ffffff";
name = "Xenobiology";
- req_access = null;
req_one_access = list(47,55);
stripe_color = "#5a19a8"
},
@@ -21619,8 +21619,12 @@
/turf/simulated/floor/tiled/dark,
/area/security/armoury)
"TN" = (
-/obj/item/bedsheet/orangedouble,
-/obj/structure/bed/double/padded,
+/obj/item/bedsheet/orangedouble{
+ dir = 1
+ },
+/obj/structure/bed/double/padded{
+ dir = 1
+ },
/obj/structure/curtain/black,
/turf/simulated/floor/carpet/purcarpet,
/area/stellardelight/deck1/dorms/dorm6)
@@ -33765,7 +33769,7 @@ pV
xf
aT
MG
-vC
+gv
vi
xf
ww
diff --git a/maps/stellar_delight/stellar_delight2.dmm b/maps/stellar_delight/stellar_delight2.dmm
index 15bb7139ee5..a6d068408db 100644
--- a/maps/stellar_delight/stellar_delight2.dmm
+++ b/maps/stellar_delight/stellar_delight2.dmm
@@ -21,18 +21,9 @@
/turf/simulated/floor/tiled/eris/white/bluecorner,
/area/medical/chemistry)
"ae" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 8
- },
-/obj/effect/floor_decal/steeldecal/steel_decals4,
-/obj/effect/floor_decal/steeldecal/steel_decals4{
- dir = 10
+/obj/machinery/requests_console/preset/cargo{
+ dir = 8;
+ pixel_x = 30
},
/turf/simulated/floor/tiled/eris/steel/cargo,
/area/quartermaster/storage)
@@ -954,14 +945,14 @@
/turf/simulated/floor,
/area/maintenance/stellardelight/deck2/portfore)
"bQ" = (
-/obj/structure/closet/secure_closet/quartermaster,
-/obj/item/storage/backpack/dufflebag,
-/obj/machinery/atmospherics/unary/vent_scrubber/on{
- dir = 1
- },
/obj/machinery/firealarm/angled{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
/turf/simulated/floor/wood,
/area/quartermaster/qm)
"bR" = (
@@ -1085,9 +1076,16 @@
/turf/simulated/floor/plating,
/area/engineering/storage)
"ce" = (
-/obj/machinery/vending/wardrobe/cargodrobe,
-/obj/machinery/status_display/supply_display{
- pixel_y = 32
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/effect/floor_decal/steeldecal/steel_decals4{
+ dir = 4
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals4{
+ dir = 9
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
},
/turf/simulated/floor/tiled/eris/steel/cargo,
/area/quartermaster/storage)
@@ -3355,18 +3353,14 @@
/turf/simulated/floor/tiled/techmaint,
/area/engineering/atmos/storage)
"gN" = (
-/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
- dir = 8
- },
/obj/effect/floor_decal/steeldecal/steel_decals4{
dir = 4
},
/obj/effect/floor_decal/steeldecal/steel_decals4{
dir = 9
},
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/tiled/eris/steel/brown_platform,
/area/quartermaster/storage)
"gO" = (
@@ -3580,7 +3574,6 @@
/obj/machinery/door/airlock/angled_bay/standard/glass{
door_color = "#e6ab22";
name = "Engineering EVA Storage";
- req_access = null;
req_one_access = list(11,24);
stripe_color = "#913013"
},
@@ -4057,9 +4050,6 @@
/area/engineering/atmos/storage)
"iB" = (
/obj/structure/filingcabinet/filingcabinet,
-/obj/machinery/requests_console/preset/cargo{
- pixel_y = 30
- },
/turf/simulated/floor/tiled/eris/steel/brown_platform,
/area/quartermaster/storage)
"iC" = (
@@ -4433,6 +4423,20 @@
},
/turf/simulated/floor/tiled,
/area/stellardelight/deck2/aftport)
+"ju" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/fuel{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
+/turf/simulated/floor/tiled/eris/steel/cargo,
+/area/quartermaster/storage)
"jv" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 10
@@ -5249,26 +5253,10 @@
/turf/simulated/floor/tiled/eris/white/bluecorner,
/area/medical/reception)
"le" = (
-/obj/machinery/door/firedoor/glass,
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 8
- },
-/obj/machinery/door/airlock/angled_bay/standard/color{
- dir = 4;
- door_color = "#a6753d";
- fill_color = "#75736f";
- name = "Quartermaster";
- req_access = list(41);
- stripe_color = "#3b2b1a"
- },
-/turf/simulated/floor/tiled/steel_ridged,
-/area/quartermaster/qm)
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/eris/steel/cargo,
+/area/quartermaster/storage)
"lf" = (
/obj/machinery/portable_atmospherics/hydroponics,
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
@@ -6021,14 +6009,14 @@
/turf/simulated/floor/tiled/techfloor,
/area/engineering/atmos/monitoring)
"mE" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
+ },
/obj/structure/cable/yellow{
- icon_state = "4-8"
+ icon_state = "2-4"
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
+ dir = 6
},
/turf/simulated/floor/wood,
/area/quartermaster/qm)
@@ -8177,7 +8165,6 @@
/obj/machinery/door/airlock/angled_bay/standard/glass{
door_color = "#e6ab22";
name = "Engineering Workshop";
- req_access = null;
req_one_access = list(11,24);
stripe_color = "#913013"
},
@@ -9683,11 +9670,10 @@
/turf/simulated/floor/tiled/eris/steel/brown_platform,
/area/crew_quarters/bar)
"uY" = (
-/obj/structure/cable/yellow{
- icon_state = "1-8"
- },
-/turf/simulated/floor/tiled/eris/steel/brown_platform,
-/area/quartermaster/storage)
+/obj/structure/closet/secure_closet/quartermaster,
+/obj/item/storage/backpack/dufflebag,
+/turf/simulated/floor/wood,
+/area/quartermaster/qm)
"uZ" = (
/obj/machinery/button/remote/blast_door{
dir = 8;
@@ -9880,9 +9866,6 @@
/turf/simulated/floor,
/area/engineering/atmos/monitoring)
"vy" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
/obj/structure/cable/yellow{
icon_state = "2-8"
},
@@ -10582,10 +10565,10 @@
/turf/simulated/floor/tiled/white,
/area/medical/surgery)
"xk" = (
-/obj/machinery/photocopier,
/obj/machinery/light{
dir = 1
},
+/obj/machinery/vending/wardrobe/cargodrobe,
/turf/simulated/floor/tiled/eris/steel/cargo,
/area/quartermaster/storage)
"xl" = (
@@ -11078,7 +11061,6 @@
door_color = "#e6ab22";
name = "maintenance access";
req_access = list(11,24);
- req_one_access = null;
stripe_color = "#e6ab22"
},
/obj/structure/cable/orange{
@@ -12493,7 +12475,6 @@
/obj/machinery/door/firedoor/glass,
/obj/machinery/door/airlock/angled_bay/standard/glass{
door_color = "#9c9c9c";
- fill_color = null;
name = "Commons";
stripe_color = "#89bd66"
},
@@ -12570,6 +12551,13 @@
/obj/machinery/camera/network/cargo,
/obj/item/retail_scanner/cargo,
/obj/item/stamp/accepted,
+/obj/machinery/button/remote/blast_door{
+ dir = 8;
+ id = "cargo_desk";
+ name = "Cargo Shutter Control";
+ pixel_x = 24;
+ pixel_y = 24
+ },
/turf/simulated/floor/tiled/eris/steel/brown_platform,
/area/quartermaster/storage)
"BN" = (
@@ -13226,6 +13214,9 @@
/obj/structure/cable/yellow{
icon_state = "4-8"
},
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 9
+ },
/turf/simulated/floor/wood,
/area/quartermaster/qm)
"Ds" = (
@@ -13889,18 +13880,9 @@
/turf/simulated/floor/tiled/white,
/area/medical/surgery)
"EM" = (
-/obj/structure/cable/yellow{
- icon_state = "2-4"
- },
/obj/machinery/light{
dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 8
- },
/turf/simulated/floor/tiled/eris/steel/brown_platform,
/area/quartermaster/storage)
"EN" = (
@@ -14101,9 +14083,7 @@
/obj/machinery/embedded_controller/radio/simple_docking_controller{
frequency = 1380;
id_tag = "cargo_bay";
- pixel_y = 24;
- req_one_access = null;
- tag_door = null
+ pixel_y = 24
},
/obj/structure/cable{
icon_state = "4-8"
@@ -16315,7 +16295,6 @@
},
/obj/machinery/door/airlock/angled_bay/standard/glass{
door_color = "#9c9c9c";
- fill_color = null;
name = "Commons";
stripe_color = "#89bd66"
},
@@ -16980,6 +16959,12 @@
req_access = list(50)
},
/obj/machinery/door/firedoor/glass,
+/obj/machinery/door/blast/shutters{
+ id = "cargo_desk";
+ layer = 3.3;
+ name = "Cargo Shutters";
+ dir = 2
+ },
/turf/simulated/floor/tiled/monotile,
/area/quartermaster/storage)
"Lv" = (
@@ -18905,6 +18890,9 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 9
},
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 8
+ },
/turf/simulated/floor/wood,
/area/quartermaster/qm)
"PE" = (
@@ -19441,9 +19429,7 @@
tag_east_con = 0.79;
tag_north = 1;
tag_north_con = 0.21;
- tag_south = 2;
- tag_south_con = null;
- tag_west_con = null
+ tag_south = 2
},
/turf/simulated/floor/tiled/techmaint,
/area/engineering/atmos/storage)
@@ -19641,7 +19627,6 @@
/obj/machinery/door/airlock/angled_bay/standard/glass{
door_color = "#e6ab22";
name = "Engineering Monitoring Room";
- req_access = null;
req_one_access = list(11,24);
stripe_color = "#913013"
},
@@ -19741,6 +19726,17 @@
},
/turf/simulated/floor/airless,
/area/engineering/engine_room)
+"Rt" = (
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/structure/cable/yellow{
+ icon_state = "1-8"
+ },
+/turf/simulated/floor/tiled/eris/steel/cargo,
+/area/quartermaster/storage)
"Ru" = (
/turf/simulated/floor/glass/reinforced,
/area/stellardelight/deck2/starboard)
@@ -19890,11 +19886,16 @@
/turf/simulated/floor/tiled/techmaint,
/area/engineering/atmos/storage)
"RO" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
+/obj/machinery/door/firedoor/glass,
+/obj/structure/window/bay/reinforced,
+/obj/structure/low_wall/bay/reinforced/brown,
+/obj/machinery/door/blast/shutters{
+ id = "cargo_desk";
+ layer = 3.3;
+ name = "Cargo Shutters";
+ dir = 2
},
-/mob/living/simple_mob/animal/passive/mouse/jerboa/leggy,
-/turf/simulated/floor/tiled/eris/steel/brown_platform,
+/turf/simulated/floor,
/area/quartermaster/storage)
"RP" = (
/obj/structure/table/reinforced,
@@ -20945,13 +20946,21 @@
/turf/simulated/floor/tiled/techfloor,
/area/engineering/atmos/monitoring)
"Um" = (
+/obj/machinery/door/firedoor/glass,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/structure/cable/yellow{
- icon_state = "4-8"
+ icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/turf/simulated/floor/tiled/eris/steel/brown_platform,
-/area/quartermaster/storage)
+/obj/machinery/door/airlock/angled_bay/standard/color{
+ door_color = "#a6753d";
+ fill_color = "#75736f";
+ name = "Quartermaster";
+ req_access = list(41);
+ stripe_color = "#3b2b1a"
+ },
+/turf/simulated/floor/tiled/steel_ridged,
+/area/quartermaster/qm)
"Un" = (
/obj/machinery/atmospherics/binary/pump/on{
dir = 1;
@@ -21966,9 +21975,7 @@
/obj/machinery/firealarm/angled{
dir = 4
},
-/obj/structure/closet/crate/bin{
- anchored = 1
- },
+/obj/machinery/photocopier,
/turf/simulated/floor/tiled/eris/steel/cargo,
/area/quartermaster/storage)
"WF" = (
@@ -22597,6 +22604,7 @@
pixel_y = 5
},
/obj/item/cartridge/quartermaster,
+/obj/machinery/atmospherics/unary/vent_scrubber/on,
/turf/simulated/floor/wood,
/area/quartermaster/qm)
"XY" = (
@@ -33004,7 +33012,7 @@ eB
OP
TS
XN
-NN
+RO
ou
vy
mw
@@ -33148,7 +33156,7 @@ zj
We
Lu
CS
-vq
+zj
Rh
gO
vq
@@ -33288,9 +33296,9 @@ eB
dq
zj
GE
-NN
-BM
RO
+BM
+zj
pl
LF
oC
@@ -33432,7 +33440,7 @@ zj
GE
do
iB
-vq
+zj
XJ
MM
nz
@@ -33574,7 +33582,7 @@ wH
Sv
sk
gN
-Um
+bB
wR
wR
fz
@@ -33716,7 +33724,7 @@ zj
DV
do
EM
-uY
+zj
hS
hS
bW
@@ -33856,7 +33864,7 @@ eB
gq
HZ
Nj
-NN
+RO
ae
gt
WE
@@ -33999,7 +34007,7 @@ YY
Nf
Nf
YY
-le
+YY
YY
YY
xk
@@ -34138,16 +34146,16 @@ ZF
ci
eB
cX
-ed
+uY
du
dJ
mE
bQ
-YY
+Um
ce
-BO
-Ui
-dN
+Rt
+le
+ju
pD
jQ
jQ
diff --git a/maps/tether/tether-05-station1.dmm b/maps/tether/tether-05-station1.dmm
index 010b2f41e25..712a50b3be2 100644
--- a/maps/tether/tether-05-station1.dmm
+++ b/maps/tether/tether-05-station1.dmm
@@ -788,7 +788,6 @@
id = "EngineEmitterPortWest2";
name = "Engine Room Blast Doors";
pixel_x = 25;
- req_access = null;
req_one_access = list(11,24)
},
/obj/machinery/atmospherics/unary/vent_scrubber/on{
@@ -2468,6 +2467,12 @@
icon_state = "1-2"
},
/obj/machinery/door/firedoor/glass,
+/obj/machinery/door/blast/shutters{
+ dir = 2;
+ id = "cargo_shutter";
+ layer = 3.3;
+ name = "Cargo Shutters"
+ },
/turf/simulated/floor/tiled,
/area/quartermaster/office)
"aer" = (
@@ -8016,7 +8021,6 @@
/obj/machinery/door/airlock/multi_tile/glass{
dir = 2;
name = "Gateway/EVA Prep Room";
- req_access = null;
req_one_access = list(18,19,43,67)
},
/turf/simulated/floor/tiled/steel_ridged,
@@ -8588,6 +8592,12 @@
/obj/structure/grille,
/obj/structure/window/reinforced/full,
/obj/structure/disposalpipe/segment,
+/obj/machinery/door/blast/shutters{
+ dir = 2;
+ id = "cargo_shutter";
+ layer = 3.3;
+ name = "Cargo Shutters"
+ },
/turf/simulated/floor/plating,
/area/quartermaster/office)
"avz" = (
@@ -12706,8 +12716,7 @@
/obj/structure/plasticflaps,
/obj/machinery/conveyor{
dir = 8;
- id = "miningops";
- movedir = null
+ id = "miningops"
},
/turf/simulated/floor/plating,
/area/quartermaster/belterdock/refinery)
@@ -14869,6 +14878,19 @@
fancy_shuttle_tag = "secbus"
},
/area/shuttle/securiship/engines)
+"cbX" = (
+/obj/machinery/door/firedoor/glass,
+/obj/machinery/door/firedoor/glass,
+/obj/structure/grille,
+/obj/structure/window/reinforced/full,
+/obj/machinery/door/blast/shutters{
+ dir = 2;
+ id = "cargo_shutter";
+ layer = 3.3;
+ name = "Cargo Shutters"
+ },
+/turf/simulated/floor/plating,
+/area/quartermaster/office)
"cbY" = (
/obj/machinery/atmospherics/unary/vent_pump/on{
dir = 4
@@ -20522,6 +20544,12 @@
/obj/structure/window/reinforced/full,
/obj/machinery/door/firedoor/glass,
/obj/structure/disposalpipe/segment,
+/obj/machinery/door/blast/shutters{
+ dir = 2;
+ id = "cargo_shutter";
+ layer = 3.3;
+ name = "Cargo Shutters"
+ },
/turf/simulated/floor/plating,
/area/quartermaster/office)
"hUm" = (
@@ -27351,8 +27379,7 @@
"pty" = (
/obj/machinery/conveyor{
dir = 8;
- id = "miningops";
- movedir = null
+ id = "miningops"
},
/turf/simulated/floor/plating,
/area/quartermaster/belterdock/refinery)
@@ -29631,8 +29658,7 @@
dir = 4;
id = "medivac blast";
name = "window blast shields";
- pixel_y = 1;
- req_access = null
+ pixel_y = 1
},
/turf/simulated/floor/tiled,
/area/shuttle/medivac/cockpit)
@@ -29926,8 +29952,7 @@
/obj/machinery/mineral/input,
/obj/machinery/conveyor{
dir = 8;
- id = "miningops";
- movedir = null
+ id = "miningops"
},
/turf/simulated/floor/plating,
/area/quartermaster/belterdock/refinery)
@@ -30435,7 +30460,14 @@
/obj/machinery/requests_console{
department = "Cargo Bay";
departmentType = 2;
- pixel_y = 32
+ pixel_y = 32;
+ pixel_x = -6
+ },
+/obj/machinery/button/remote/blast_door{
+ id = "cargo_shutter";
+ name = "Cargo Shutter Control";
+ pixel_x = 10;
+ pixel_y = 24
},
/turf/simulated/floor/tiled,
/area/quartermaster/office)
@@ -30943,8 +30975,7 @@
/obj/machinery/mineral/output,
/obj/machinery/conveyor{
dir = 8;
- id = "miningops";
- movedir = null
+ id = "miningops"
},
/turf/simulated/floor/plating,
/area/quartermaster/belterdock/refinery)
@@ -31985,8 +32016,7 @@
frequency = 1380;
id_tag = "securiship_bay";
pixel_x = 24;
- pixel_y = -26;
- req_one_access = null
+ pixel_y = -26
},
/turf/simulated/floor/tiled,
/area/tether/station/dock_two)
@@ -34459,6 +34489,12 @@
/obj/machinery/door/firedoor/glass,
/obj/structure/grille,
/obj/structure/window/reinforced/full,
+/obj/machinery/door/blast/shutters{
+ dir = 2;
+ id = "cargo_shutter";
+ layer = 3.3;
+ name = "Cargo Shutters"
+ },
/turf/simulated/floor/plating,
/area/quartermaster/office)
@@ -44910,7 +44946,7 @@ oWu
qkG
mkL
iDA
-yjH
+cbX
tnC
tWj
jhJ
diff --git a/maps/tether/tether_jobs.dm b/maps/tether/tether_jobs.dm
index 7dc03f38e29..758b707b9e0 100644
--- a/maps/tether/tether_jobs.dm
+++ b/maps/tether/tether_jobs.dm
@@ -177,8 +177,6 @@
id_type = /obj/item/card/id/talon/captain
id_slot = slot_wear_id
pda_type = null
-
- l_ear = /obj/item/radio/headset/talon
glasses = /obj/item/clothing/glasses/sunglasses
uniform = /obj/item/clothing/under/rank/talon/command
shoes = /obj/item/clothing/shoes/brown
@@ -186,6 +184,10 @@
satchel_one = /obj/item/storage/backpack/satchel/talon
messenger_bag = /obj/item/storage/backpack/messenger/talon
+ headset = /obj/item/radio/headset/talon
+ headset_alt = /obj/item/radio/headset/talon
+ headset_earbud = /obj/item/radio/headset/talon
+
/decl/hierarchy/outfit/job/talon_pilot
name = OUTFIT_JOB_NAME(JOB_TALON_PILOT)
@@ -194,7 +196,6 @@
pda_type = null
flags = OUTFIT_HAS_BACKPACK|OUTFIT_COMPREHENSIVE_SURVIVAL
- l_ear = /obj/item/radio/headset/talon
shoes = /obj/item/clothing/shoes/black
head = /obj/item/clothing/head/pilot_vr/talon
uniform = /obj/item/clothing/under/rank/talon/pilot
@@ -206,6 +207,10 @@
satchel_one = /obj/item/storage/backpack/satchel/talon
messenger_bag = /obj/item/storage/backpack/messenger/talon
+ headset = /obj/item/radio/headset/talon
+ headset_alt = /obj/item/radio/headset/talon
+ headset_earbud = /obj/item/radio/headset/talon
+
/decl/hierarchy/outfit/job/talon_doctor
name = OUTFIT_JOB_NAME(JOB_TALON_DOCTOR)
hierarchy_type = /decl/hierarchy/outfit/job
@@ -214,7 +219,6 @@
id_slot = slot_wear_id
pda_type = null
- l_ear = /obj/item/radio/headset/talon
shoes = /obj/item/clothing/shoes/white
backpack = /obj/item/storage/backpack/medic
satchel_one = /obj/item/storage/backpack/satchel/med
@@ -227,6 +231,10 @@
satchel_one = /obj/item/storage/backpack/satchel/talon
messenger_bag = /obj/item/storage/backpack/messenger/talon
+ headset = /obj/item/radio/headset/talon
+ headset_alt = /obj/item/radio/headset/talon
+ headset_earbud = /obj/item/radio/headset/talon
+
/decl/hierarchy/outfit/job/talon_security
name = OUTFIT_JOB_NAME(JOB_ALT_TALON_SECURITY)
hierarchy_type = /decl/hierarchy/outfit/job
@@ -236,7 +244,6 @@
pda_type = null
backpack_contents = list(/obj/item/handcuffs = 1)
- l_ear = /obj/item/radio/headset/talon
gloves = /obj/item/clothing/gloves/black
shoes = /obj/item/clothing/shoes/boots/jackboots
backpack = /obj/item/storage/backpack/security
@@ -248,6 +255,10 @@
satchel_one = /obj/item/storage/backpack/satchel/talon
messenger_bag = /obj/item/storage/backpack/messenger/talon
+ headset = /obj/item/radio/headset/talon
+ headset_alt = /obj/item/radio/headset/talon
+ headset_earbud = /obj/item/radio/headset/talon
+
/decl/hierarchy/outfit/job/talon_engineer
name = OUTFIT_JOB_NAME(JOB_TALON_ENGINEER)
hierarchy_type = /decl/hierarchy/outfit/job
@@ -257,7 +268,6 @@
pda_type = null
flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL
- l_ear = /obj/item/radio/headset/talon
belt = /obj/item/storage/belt/utility/full
shoes = /obj/item/clothing/shoes/boots/workboots
r_pocket = /obj/item/t_scanner
@@ -270,6 +280,10 @@
satchel_one = /obj/item/storage/backpack/satchel/talon
messenger_bag = /obj/item/storage/backpack/messenger/talon
+ headset = /obj/item/radio/headset/talon
+ headset_alt = /obj/item/radio/headset/talon
+ headset_earbud = /obj/item/radio/headset/talon
+
/decl/hierarchy/outfit/job/talon_miner
name = OUTFIT_JOB_NAME(JOB_TALON_MINER)
hierarchy_type = /decl/hierarchy/outfit/job
@@ -279,7 +293,6 @@
pda_type = null
flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL
- l_ear = /obj/item/radio/headset/talon
shoes = /obj/item/clothing/shoes/boots/workboots
r_pocket = /obj/item/storage/bag/ore
l_pocket = /obj/item/tool/crowbar
@@ -287,3 +300,7 @@
backpack = /obj/item/storage/backpack/talon
satchel_one = /obj/item/storage/backpack/satchel/talon
messenger_bag = /obj/item/storage/backpack/messenger/talon
+
+ headset = /obj/item/radio/headset/talon
+ headset_alt = /obj/item/radio/headset/talon
+ headset_earbud = /obj/item/radio/headset/talon
diff --git a/maps/~map_system/_map_selection.dm b/maps/~map_system/_map_selection.dm
index 47ff0d984d0..879f058f545 100644
--- a/maps/~map_system/_map_selection.dm
+++ b/maps/~map_system/_map_selection.dm
@@ -5,8 +5,8 @@
/* FOR LIVE SERVER */
/*********************/
-//#define USE_MAP_TETHER
-#define USE_MAP_STELLARDELIGHT
+#define USE_MAP_TETHER
+//#define USE_MAP_STELLARDELIGHT
//#define USE_MAP_GROUNDBASE
// Debug
diff --git a/tgui/packages/tgui/interfaces/OvermapDisperser.tsx b/tgui/packages/tgui/interfaces/OvermapDisperser.tsx
index 7a2ec522edf..6987397c7b0 100644
--- a/tgui/packages/tgui/interfaces/OvermapDisperser.tsx
+++ b/tgui/packages/tgui/interfaces/OvermapDisperser.tsx
@@ -21,7 +21,6 @@ type Data = {
range: number;
next_shot: number;
nopower: BooleanLike;
- skill: BooleanLike;
chargeload: string | null;
};
diff --git a/vorestation.dme b/vorestation.dme
index dbe63b1438f..6cfbf26f078 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -901,28 +901,19 @@
#include "code\game\jobs\whitelist_vr.dm"
#include "code\game\jobs\job\_alt_title.dm"
#include "code\game\jobs\job\assistant.dm"
-#include "code\game\jobs\job\assistant_vr.dm"
#include "code\game\jobs\job\captain.dm"
-#include "code\game\jobs\job\captain_vr.dm"
+#include "code\game\jobs\job\cargo.dm"
#include "code\game\jobs\job\civilian.dm"
#include "code\game\jobs\job\civilian_chaplain.dm"
-#include "code\game\jobs\job\civilian_vr.dm"
#include "code\game\jobs\job\department.dm"
-#include "code\game\jobs\job\department_vr.dm"
#include "code\game\jobs\job\engineering.dm"
-#include "code\game\jobs\job\engineering_vr.dm"
#include "code\game\jobs\job\job.dm"
-#include "code\game\jobs\job\job_vr.dm"
#include "code\game\jobs\job\medical.dm"
-#include "code\game\jobs\job\medical_vr.dm"
-#include "code\game\jobs\job\offduty_vr.dm"
+#include "code\game\jobs\job\offduty.dm"
#include "code\game\jobs\job\science.dm"
-#include "code\game\jobs\job\science_vr.dm"
#include "code\game\jobs\job\security.dm"
-#include "code\game\jobs\job\security_vr.dm"
#include "code\game\jobs\job\silicon.dm"
-#include "code\game\jobs\job\silicon_vr.dm"
-#include "code\game\jobs\job\special_vr.dm"
+#include "code\game\jobs\job\special.dm"
#include "code\game\machinery\adv_med.dm"
#include "code\game\machinery\adv_med_vr.dm"
#include "code\game\machinery\ai_slipper.dm"
@@ -2090,7 +2081,6 @@
#include "code\modules\client\preference_setup\loadout\loadout_xeno.dm"
#include "code\modules\client\preference_setup\loadout\loadout_xeno_vr.dm"
#include "code\modules\client\preference_setup\occupation\occupation.dm"
-#include "code\modules\client\preference_setup\skills\skills.dm"
#include "code\modules\client\preference_setup\volume_sliders\01_volume.dm"
#include "code\modules\client\preference_setup\volume_sliders\02_media.dm"
#include "code\modules\client\preference_setup\vore\01_ears.dm"
@@ -2889,7 +2879,6 @@
#include "code\modules\mob\mob_transformation_simple.dm"
#include "code\modules\mob\say.dm"
#include "code\modules\mob\say_vr.dm"
-#include "code\modules\mob\skillset.dm"
#include "code\modules\mob\theme_lists.dm"
#include "code\modules\mob\transform_procs.dm"
#include "code\modules\mob\typing_indicator.dm"
@@ -3418,6 +3407,7 @@
#include "code\modules\mob\living\simple_mob\subtypes\vore\sonadile.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\stalker.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\succubi.dm"
+#include "code\modules\mob\living\simple_mob\subtypes\vore\turkey.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\vampire.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\vore.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\vore_hostile.dm"
@@ -3457,7 +3447,6 @@
#include "code\modules\mob\new_player\poll.dm"
#include "code\modules\mob\new_player\preferences_setup.dm"
#include "code\modules\mob\new_player\preferences_setup_vr.dm"
-#include "code\modules\mob\new_player\skill.dm"
#include "code\modules\mob\new_player\sprite_accessories.dm"
#include "code\modules\mob\new_player\sprite_accessories_ear.dm"
#include "code\modules\mob\new_player\sprite_accessories_ear_vr.dm"
@@ -4407,7 +4396,6 @@
#include "code\ZAS\Connection.dm"
#include "code\ZAS\ConnectionGroup.dm"
#include "code\ZAS\ConnectionManager.dm"
-#include "code\ZAS\Controller.dm"
#include "code\ZAS\Debug.dm"
#include "code\ZAS\Diagnostic.dm"
#include "code\ZAS\Fire.dm"