diff --git a/ATTRIBUTIONS.md b/ATTRIBUTIONS.md index 3e5639a521..abaf97a0b9 100644 --- a/ATTRIBUTIONS.md +++ b/ATTRIBUTIONS.md @@ -80,3 +80,9 @@ **Creator:** VerySoft (https://github.com/TS-Rogue-Star/Rogue-Star/pull/435)
**URL:** [Website](https://rogue-star.net/)
**License:** Permission granting in writing for use by Virgo and Chomp with proper attribution +
+**File:** `icons/mob/turkey.dmi` +**Title:** Turkey
+**Creator:** VerySoft (https://github.com/TS-Rogue-Star/Rogue-Star/pull/669)
+**URL:** [Website](https://rogue-star.net/)
+**License:** Permission granted in writing for use by Virgo and Chomp with proper attribution diff --git a/code/ATMOSPHERICS/components/unary/heat_exchanger.dm b/code/ATMOSPHERICS/components/unary/heat_exchanger.dm index 7b6a5621eb..078c97af8a 100644 --- a/code/ATMOSPHERICS/components/unary/heat_exchanger.dm +++ b/code/ATMOSPHERICS/components/unary/heat_exchanger.dm @@ -36,11 +36,11 @@ if(!partner) return 0 - if(!air_master || air_master.current_cycle <= update_cycle) + if(!SSair || SSair.current_cycle <= update_cycle) return 0 - update_cycle = air_master.current_cycle - partner.update_cycle = air_master.current_cycle + update_cycle = SSair.current_cycle + partner.update_cycle = SSair.current_cycle var/air_heat_capacity = air_contents.heat_capacity() var/other_air_heat_capacity = partner.air_contents.heat_capacity() diff --git a/code/ZAS/Atom.dm b/code/ZAS/Atom.dm index bfe6fa2ad4..eeb01b4249 100644 --- a/code/ZAS/Atom.dm +++ b/code/ZAS/Atom.dm @@ -36,11 +36,11 @@ //Convenience function for atoms to update turfs they occupy /atom/movable/proc/update_nearby_tiles(need_rebuild) - if(!air_master) + if(!SSair) return 0 for(var/turf/simulated/turf in locs) - air_master.mark_for_update(turf) + SSair.mark_for_update(turf) return 1 diff --git a/code/ZAS/Connection.dm b/code/ZAS/Connection.dm index 21be29d25e..688eb12992 100644 --- a/code/ZAS/Connection.dm +++ b/code/ZAS/Connection.dm @@ -5,7 +5,7 @@ /* Overview: - Connections are made between turfs by air_master.connect(). They represent a single point where two zones converge. + Connections are made between turfs by SSair.connect(). They represent a single point where two zones converge. Class Vars: A - Always a simulated turf. @@ -60,19 +60,19 @@ Class Procs: /connection/New(turf/simulated/A, turf/simulated/B) #ifdef ZASDBG - ASSERT(air_master.has_valid_zone(A)) - //ASSERT(air_master.has_valid_zone(B)) + ASSERT(HAS_VALID_ZONE(A)) + //ASSERT(HAS_VALID_ZONE(B)) #endif src.A = A src.B = B zoneA = A.zone if(!istype(B)) mark_space() - edge = air_master.get_edge(A.zone,B) + edge = SSair.get_edge(A.zone,B) edge.add_connection(src) else zoneB = B.zone - edge = air_master.get_edge(A.zone,B.zone) + edge = SSair.get_edge(A.zone,B.zone) edge.add_connection(src) /connection/proc/mark_direct() @@ -108,7 +108,7 @@ Class Procs: erase() return - var/block_status = air_master.air_blocked(A,B) + var/block_status = SSair.air_blocked(A,B) if(block_status & AIR_BLOCKED) //to_world("Blocked connection.") erase() @@ -133,7 +133,7 @@ Class Procs: return else edge.remove_connection(src) - edge = air_master.get_edge(A.zone, B) + edge = SSair.get_edge(A.zone, B) edge.add_connection(src) zoneA = A.zone @@ -155,7 +155,7 @@ Class Procs: //to_world("Zones changed, \...") if(A.zone && B.zone) edge.remove_connection(src) - edge = air_master.get_edge(A.zone, B.zone) + edge = SSair.get_edge(A.zone, B.zone) edge.add_connection(src) zoneA = A.zone zoneB = B.zone diff --git a/code/ZAS/ConnectionGroup.dm b/code/ZAS/ConnectionGroup.dm index 0be44bb358..85b2545d36 100644 --- a/code/ZAS/ConnectionGroup.dm +++ b/code/ZAS/ConnectionGroup.dm @@ -2,7 +2,7 @@ Overview: These are what handle gas transfers between zones and into space. - They are found in a zone's edges list and in air_master.edges. + They are found in a zone's edges list and in SSair.edges. Each edge updates every air tick due to their role in gas transfer. They come in two flavors, /connection_edge/zone and /connection_edge/unsimulated. As the type names might suggest, they handle inter-zone and spacelike connections respectively. @@ -82,7 +82,7 @@ Class Procs: /connection_edge/proc/contains_zone(zone/Z) /connection_edge/proc/erase() - air_master.remove_edge(src) + SSair.remove_edge(src) //to_world("[type] Erased.") /connection_edge/proc/tick() @@ -169,19 +169,19 @@ Class Procs: if(equiv) if(direct) erase() - air_master.merge(A, B) + SSair.merge(A, B) return else A.air.equalize(B.air) - air_master.mark_edge_sleeping(src) + SSair.mark_edge_sleeping(src) - air_master.mark_zone_update(A) - air_master.mark_zone_update(B) + SSair.mark_zone_update(A) + SSair.mark_zone_update(B) /connection_edge/zone/recheck() // Edges with only one side being vacuum need processing no matter how close. if(!A.air.compare(B.air, vacuum_exception = 1)) - air_master.mark_edge_active(src) + SSair.mark_edge_active(src) //Helper proc to get connections for a zone. /connection_edge/zone/proc/get_connected_zone(zone/from) @@ -233,16 +233,16 @@ Class Procs: if(equiv) A.air.copy_from(air) - air_master.mark_edge_sleeping(src) + SSair.mark_edge_sleeping(src) - air_master.mark_zone_update(A) + SSair.mark_zone_update(A) /connection_edge/unsimulated/recheck() // Edges with only one side being vacuum need processing no matter how close. // Note: This handles the glaring flaw of a room holding pressure while exposed to space, but // does not specially handle the less common case of a simulated room exposed to an unsimulated pressurized turf. if(!A.air.compare(air, vacuum_exception = 1)) - air_master.mark_edge_active(src) + SSair.mark_edge_active(src) /proc/ShareHeat(datum/gas_mixture/A, datum/gas_mixture/B, connecting_tiles) //This implements a simplistic version of the Stefan-Boltzmann law. diff --git a/code/ZAS/ConnectionManager.dm b/code/ZAS/ConnectionManager.dm index 3890cd85f5..8d7e270cde 100644 --- a/code/ZAS/ConnectionManager.dm +++ b/code/ZAS/ConnectionManager.dm @@ -16,7 +16,7 @@ Class Procs: Preferable to accessing the connection directly because it checks validity. place(connection/c, d) - Called by air_master.connect(). Sets the connection in the specified direction to c. + Called by SSair.connect(). Sets the connection in the specified direction to c. update_all() Called after turf/update_air_properties(). Updates the validity of all connections on this turf. diff --git a/code/ZAS/Controller.dm b/code/ZAS/Controller.dm deleted file mode 100644 index 7f7b575246..0000000000 --- a/code/ZAS/Controller.dm +++ /dev/null @@ -1,231 +0,0 @@ -var/datum/controller/subsystem/air/air_master - -var/tick_multiplier = 2 - -/* - -Overview: - The air controller does everything. There are tons of procs in here. - -Class Vars: - zones - All zones currently holding one or more turfs. - edges - All processing edges. - - tiles_to_update - Tiles scheduled to update next tick. - zones_to_update - Zones which have had their air changed and need air archival. - active_hotspots - All processing fire objects. - - active_zones - The number of zones which were archived last tick. Used in debug verbs. - next_id - The next UID to be applied to a zone. Mostly useful for debugging purposes as zones do not need UIDs to function. - -Class Procs: - - mark_for_update(turf/T) - Adds the turf to the update list. When updated, update_air_properties() will be called. - When stuff changes that might affect airflow, call this. It's basically the only thing you need. - - add_zone(zone/Z) and remove_zone(zone/Z) - Adds zones to the zones list. Does not mark them for update. - - air_blocked(turf/A, turf/B) - Returns a bitflag consisting of: - AIR_BLOCKED - The connection between turfs is physically blocked. No air can pass. - ZONE_BLOCKED - There is a door between the turfs, so zones cannot cross. Air may or may not be permeable. - - has_valid_zone(turf/T) - Checks the presence and validity of T's zone. - May be called on unsimulated turfs, returning 0. - - merge(zone/A, zone/B) - Called when zones have a direct connection and equivalent pressure and temperature. - Merges the zones to create a single zone. - - connect(turf/simulated/A, turf/B) - Called by turf/update_air_properties(). The first argument must be simulated. - Creates a connection between A and B. - - mark_zone_update(zone/Z) - Adds zone to the update list. Unlike mark_for_update(), this one is called automatically whenever - air is returned from a simulated turf. - - equivalent_pressure(zone/A, zone/B) - Currently identical to A.air.compare(B.air). Returns 1 when directly connected zones are ready to be merged. - - get_edge(zone/A, zone/B) - get_edge(zone/A, turf/B) - Gets a valid connection_edge between A and B, creating a new one if necessary. - - has_same_air(turf/A, turf/B) - Used to determine if an unsimulated edge represents a specific turf. - Simulated edges use connection_edge/contains_zone() for the same purpose. - Returns 1 if A has identical gases and temperature to B. - - remove_edge(connection_edge/edge) - Called when an edge is erased. Removes it from processing. - -*/ - -// -// The rest of the air subsystem is defined in air.dm -// - -/datum/controller/subsystem/air - //Geometry lists - var/list/zones = list() - var/list/edges = list() - //Geometry updates lists - var/list/tiles_to_update = list() - var/list/zones_to_update = list() - var/list/active_fire_zones = list() - var/list/active_hotspots = list() - var/list/active_edges = list() - - var/active_zones = 0 - var/current_cycle = 0 - var/next_id = 1 //Used to keep track of zone UIDs. - -/datum/controller/subsystem/air/proc/add_zone(zone/z) - zones.Add(z) - z.name = "Zone [next_id++]" - mark_zone_update(z) - -/datum/controller/subsystem/air/proc/remove_zone(zone/z) - zones.Remove(z) - zones_to_update.Remove(z) - -/datum/controller/subsystem/air/proc/air_blocked(turf/A, turf/B) - #ifdef ZASDBG - ASSERT(isturf(A)) - ASSERT(isturf(B)) - #endif - var/ablock = A.c_airblock(B) - if(ablock == BLOCKED) return BLOCKED - return ablock | B.c_airblock(A) - -/datum/controller/subsystem/air/proc/has_valid_zone(turf/simulated/T) - #ifdef ZASDBG - ASSERT(istype(T)) - #endif - return istype(T) && T.zone && !T.zone.invalid - -/datum/controller/subsystem/air/proc/merge(zone/A, zone/B) - #ifdef ZASDBG - ASSERT(istype(A)) - ASSERT(istype(B)) - ASSERT(!A.invalid) - ASSERT(!B.invalid) - ASSERT(A != B) - #endif - if(A.contents.len < B.contents.len) - A.c_merge(B) - mark_zone_update(B) - else - B.c_merge(A) - mark_zone_update(A) - -/datum/controller/subsystem/air/proc/connect(turf/simulated/A, turf/simulated/B) - #ifdef ZASDBG - ASSERT(istype(A)) - ASSERT(isturf(B)) - ASSERT(A.zone) - ASSERT(!A.zone.invalid) - //ASSERT(B.zone) - ASSERT(A != B) - #endif - - var/block = air_master.air_blocked(A,B) - if(block & AIR_BLOCKED) return - - var/direct = !(block & ZONE_BLOCKED) - var/space = !istype(B) - - if(!space) - if(min(A.zone.contents.len, B.zone.contents.len) < ZONE_MIN_SIZE || (direct && (equivalent_pressure(A.zone,B.zone) || current_cycle == 0))) - merge(A.zone,B.zone) - return - - var/a_to_b = get_dir(A,B) - var/b_to_a = get_dir(B,A) - - if(!A.connections) A.connections = new - if(!B.connections) B.connections = new - - if(A.connections.get(a_to_b)) return - if(B.connections.get(b_to_a)) return - if(!space) - if(A.zone == B.zone) return - - - var/connection/c = new /connection(A,B) - - A.connections.place(c, a_to_b) - B.connections.place(c, b_to_a) - - if(direct) c.mark_direct() - -/datum/controller/subsystem/air/proc/mark_for_update(turf/T) - #ifdef ZASDBG - ASSERT(isturf(T)) - #endif - if(T.needs_air_update) return - tiles_to_update |= T - #ifdef ZASDBG - T.add_overlay(mark) - #endif - T.needs_air_update = 1 - -/datum/controller/subsystem/air/proc/mark_zone_update(zone/Z) - #ifdef ZASDBG - ASSERT(istype(Z)) - #endif - if(Z.needs_update) return - zones_to_update.Add(Z) - Z.needs_update = 1 - -/datum/controller/subsystem/air/proc/mark_edge_sleeping(connection_edge/E) - #ifdef ZASDBG - ASSERT(istype(E)) - #endif - if(E.sleeping) return - active_edges.Remove(E) - E.sleeping = 1 - -/datum/controller/subsystem/air/proc/mark_edge_active(connection_edge/E) - #ifdef ZASDBG - ASSERT(istype(E)) - #endif - if(!E.sleeping) return - active_edges.Add(E) - E.sleeping = 0 - -/datum/controller/subsystem/air/proc/equivalent_pressure(zone/A, zone/B) - return A.air.compare(B.air) - -/datum/controller/subsystem/air/proc/get_edge(zone/A, zone/B) - - if(istype(B)) - for(var/connection_edge/zone/edge in A.edges) - if(edge.contains_zone(B)) return edge - var/connection_edge/edge = new/connection_edge/zone(A,B) - edges.Add(edge) - edge.recheck() - return edge - else - for(var/connection_edge/unsimulated/edge in A.edges) - if(has_same_air(edge.B,B)) return edge - var/connection_edge/edge = new/connection_edge/unsimulated(A,B) - edges.Add(edge) - edge.recheck() - return edge - -/datum/controller/subsystem/air/proc/has_same_air(turf/A, turf/B) - if(A.oxygen != B.oxygen) return 0 - if(A.nitrogen != B.nitrogen) return 0 - if(A.phoron != B.phoron) return 0 - if(A.carbon_dioxide != B.carbon_dioxide) return 0 - if(A.temperature != B.temperature) return 0 - return 1 - -/datum/controller/subsystem/air/proc/remove_edge(connection_edge/E) - edges.Remove(E) - if(!E.sleeping) active_edges.Remove(E) diff --git a/code/ZAS/Diagnostic.dm b/code/ZAS/Diagnostic.dm index 7126588a30..15fcd89347 100644 --- a/code/ZAS/Diagnostic.dm +++ b/code/ZAS/Diagnostic.dm @@ -8,12 +8,12 @@ /* if(!check_rights(R_DEBUG)) return - var/result = air_master.Tick() + var/result = SSair.Tick() if(result) to_chat(src, "Successfully Processed.") else - to_chat(src, "Failed to process! ([air_master.tick_progress])") + to_chat(src, "Failed to process! ([SSair.tick_progress])") */ /client/proc/Zone_Info(turf/T as null|turf) diff --git a/code/ZAS/Fire.dm b/code/ZAS/Fire.dm index 46871cc785..9cbf665f83 100644 --- a/code/ZAS/Fire.dm +++ b/code/ZAS/Fire.dm @@ -58,7 +58,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin fuel_objs.Cut() if(!fire_tiles.len) - air_master.active_fire_zones.Remove(src) + SSair.active_fire_zones.Remove(src) /zone/proc/remove_liquidfuel(var/used_liquid_fuel, var/remove_fire=0) if(!fuel_objs.len) @@ -94,7 +94,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin return 1 fire = new(src, fl) - air_master.active_fire_zones |= zone + SSair.active_fire_zones |= zone var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in src zone.fire_tiles |= src @@ -191,7 +191,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin set_light(3, 1, color) firelevel = fl - air_master.active_hotspots.Add(src) + SSair.active_hotspots.Add(src) /obj/fire/proc/fire_color(var/env_temperature) var/temperature = max(4000*sqrt(firelevel/vsc.fire_firelevel_multiplier), env_temperature) @@ -209,7 +209,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin T.fire = null loc = null - air_master.active_hotspots.Remove(src) + SSair.active_hotspots.Remove(src) /turf/simulated/var/fire_protection = 0 //Protects newly extinguished tiles from being overrun again. diff --git a/code/ZAS/Turf.dm b/code/ZAS/Turf.dm index c05e708036..a67970c63a 100644 --- a/code/ZAS/Turf.dm +++ b/code/ZAS/Turf.dm @@ -41,9 +41,8 @@ if(istype(unsim, /turf/simulated)) var/turf/simulated/sim = unsim - if(air_master.has_valid_zone(sim)) - - air_master.connect(sim, src) + if(HAS_VALID_ZONE(sim)) + SSair.connect(sim, src) /* Simple heuristic for determining if removing the turf from it's zone will not partition the zone (A very bad thing). @@ -162,7 +161,7 @@ var/turf/simulated/sim = unsim sim.open_directions |= reverse_dir[d] - if(air_master.has_valid_zone(sim)) + if(HAS_VALID_ZONE(sim)) //Might have assigned a zone, since this happens for each direction. if(!zone) @@ -195,7 +194,7 @@ if(verbose) to_world("Connecting to [sim.zone]") #endif - air_master.connect(src, sim) + SSair.connect(src, sim) #ifdef ZASDBG @@ -210,7 +209,7 @@ if(!postponed) postponed = list() postponed.Add(unsim) - if(!air_master.has_valid_zone(src)) //Still no zone, make a new one. + if(!HAS_VALID_ZONE(src)) //Still no zone, make a new one. var/zone/newzone = new/zone() newzone.add(src) @@ -223,7 +222,7 @@ //At this point, a zone should have happened. If it hasn't, don't add more checks, fix the bug. for(var/turf/T in postponed) - air_master.connect(src, T) + SSair.connect(src, T) /turf/proc/post_update_air_properties() if(connections) connections.update_all() @@ -279,7 +278,7 @@ /turf/simulated/return_air() if(zone) if(!zone.invalid) - air_master.mark_zone_update(zone) + SSair.mark_zone_update(zone) return zone.air else if(!air) diff --git a/code/ZAS/Zone.dm b/code/ZAS/Zone.dm index d07a280d04..b6d012afe7 100644 --- a/code/ZAS/Zone.dm +++ b/code/ZAS/Zone.dm @@ -56,7 +56,7 @@ Class Procs: /zone/var/list/graphic_remove = list() /zone/New() - air_master.add_zone(src) + SSair.add_zone(src) air.temperature = TCMB air.group_multiplier = 1 air.volume = CELL_VOLUME @@ -65,7 +65,7 @@ Class Procs: #ifdef ZASDBG ASSERT(!invalid) ASSERT(istype(T)) - ASSERT(!air_master.has_valid_zone(T)) + ASSERT(!HAS_VALID_ZONE(T)) #endif var/datum/gas_mixture/turf_air = T.return_air() @@ -75,7 +75,7 @@ Class Procs: if(T.fire) var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in T fire_tiles.Add(T) - air_master.active_fire_zones |= src + SSair.active_fire_zones |= src if(fuel) fuel_objs += fuel if(air.graphic) T.update_graphic(air.graphic) @@ -122,11 +122,11 @@ Class Procs: if(E.contains_zone(into)) continue //don't need to rebuild this edge for(var/turf/T in E.connecting_turfs) - air_master.mark_for_update(T) + SSair.mark_for_update(T) /zone/proc/c_invalidate() invalid = 1 - air_master.remove_zone(src) + SSair.remove_zone(src) #ifdef ZASDBG for(var/turf/simulated/T in contents) T.dbg(invalid_zone) @@ -141,7 +141,7 @@ Class Procs: T.update_graphic(graphic_remove = air_graphic) //we need to remove the overlays so they're not doubled when the zone is rebuilt //T.dbg(invalid_zone) T.needs_air_update = 0 //Reset the marker so that it will be added to the list. - air_master.mark_for_update(T) + SSair.mark_for_update(T) /zone/proc/add_tile_air(datum/gas_mixture/tile_air) //air.volume += CELL_VOLUME @@ -152,7 +152,7 @@ Class Procs: air.group_multiplier = contents.len+1 /zone/proc/tick() - if(air.temperature >= PHORON_FLASHPOINT && !(src in air_master.active_fire_zones) && air.check_combustability() && contents.len) + if(air.temperature >= PHORON_FLASHPOINT && !(src in SSair.active_fire_zones) && air.check_combustability() && contents.len) var/turf/T = pick(contents) if(istype(T)) T.create_fire(vsc.fire_firelevel_multiplier) @@ -171,7 +171,7 @@ Class Procs: to_chat(M,name) for(var/g in air.gas) to_chat(M, "[gas_data.name[g]]: [air.gas[g]]") - to_chat(M, "P: [air.return_pressure()] kPa V: [air.volume]L T: [air.temperature]°K ([air.temperature - T0C]°C)") + to_chat(M, "P: [air.return_pressure()] kPa V: [air.volume]L T: [air.temperature]�K ([air.temperature - T0C]�C)") to_chat(M, "O2 per N2: [(air.gas["nitrogen"] ? air.gas["oxygen"]/air.gas["nitrogen"] : "N/A")] Moles: [air.total_moles]") to_chat(M, "Simulated: [contents.len] ([air.group_multiplier])") //to_chat(M, "Unsimulated: [unsimulated_contents.len]") @@ -192,4 +192,4 @@ Class Procs: to_chat(M, "Space Edges: [space_edges] ([space_coefficient] connections)") //for(var/turf/T in unsimulated_contents) - // to_chat(M, "[T] at ([T.x],[T.y])") \ No newline at end of file + // to_chat(M, "[T] at ([T.x],[T.y])") diff --git a/code/ZAS/_docs.dm b/code/ZAS/_docs.dm index 382f1f0abb..822c8ac7b2 100644 --- a/code/ZAS/_docs.dm +++ b/code/ZAS/_docs.dm @@ -15,7 +15,7 @@ Every air tick: Important Functions: -air_master.mark_for_update(turf) +SSair.mark_for_update(turf) When stuff happens, call this. It works on everything. You basically don't need to worry about any other functions besides CanPass(). diff --git a/code/__defines/ZAS.dm b/code/__defines/ZAS.dm index ba2b4b73e7..c8289fdc27 100644 --- a/code/__defines/ZAS.dm +++ b/code/__defines/ZAS.dm @@ -11,3 +11,5 @@ #define ATMOS_PASS_NO 2 // Never blocks air or zones. #define ATMOS_PASS_DENSITY 3 // Blocks air and zones if density = TRUE, allows both if density = FALSE #define ATMOS_PASS_PROC 4 // Call CanZASPass() using c_airblock + +#define HAS_VALID_ZONE(T) (T.zone && !T.zone.invalid) diff --git a/code/__defines/chemistry.dm b/code/__defines/chemistry.dm index 63ea0e136f..8213aa200f 100644 --- a/code/__defines/chemistry.dm +++ b/code/__defines/chemistry.dm @@ -41,6 +41,7 @@ #define CE_DARKSIGHT "darksight" // Gives perfect vision in dark #define REAGENTS_PER_SHEET 20 +#define REAGENTS_PER_ORE 20 // Attached to CE_ANTIBIOTIC #define ANTIBIO_NORM 1 diff --git a/code/__defines/faction.dm b/code/__defines/faction.dm index 2d975b6cbb..766c2d51aa 100644 --- a/code/__defines/faction.dm +++ b/code/__defines/faction.dm @@ -105,6 +105,7 @@ #define FACTION_SWARMER "swarmer" #define FACTION_TEPPI "teppi" #define FACTION_TUNNELCLOWN "tunnelclown" +#define FACTION_TURKEY "turkey" #define FACTION_WILD_ANIMAL "wild animal" #define FACTION_WOLFGIRL "wolfgirl" #define FACTION_WOLFTAUR "wolftaur" diff --git a/code/__defines/items_clothing.dm b/code/__defines/items_clothing.dm index a7dba8be88..2a0b2ce9de 100644 --- a/code/__defines/items_clothing.dm +++ b/code/__defines/items_clothing.dm @@ -40,6 +40,9 @@ #define ACCESSORY_SLOT_ARMOR_M 0x8000 #define ACCESSORY_SLOT_HELM_C 0x10000 //24 bit - higher than 0x80000 will overflow +#define ACCESSORY_SLOT_RING 0x20000 //rings, knuckledusters +#define ACCESSORY_SLOT_WRIST 0x40000 //wristwatches, wrist PDA maybe? + // Bitmasks for the /obj/item/var/flags_inv variable. These determine when a piece of clothing hides another, i.e. a helmet hiding glasses. // WARNING: The following flags apply only to the external suit! #define HIDEGLOVES 0x1 diff --git a/code/__defines/jobs.dm b/code/__defines/jobs.dm index c20f5e3cd9..70e38c6876 100644 --- a/code/__defines/jobs.dm +++ b/code/__defines/jobs.dm @@ -201,6 +201,7 @@ #define JOB_ALT_CONSTRUCTION_ENGINEER "Construction Engineer" #define JOB_ALT_ENGINEERING_CONTRACTOR "Engineering Contractor" #define JOB_ALT_COMPUTER_TECHNICIAN "Computer Technician" + #define JOB_ALT_SALVAGE_TECHNICIAN "Salvage Technician" #define JOB_ATMOSPHERIC_TECHNICIAN "Atmospheric Technician" // Atmospheric Technician alt titles diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm index 1f76dcac9a..80d66f555d 100644 --- a/code/_helpers/game.dm +++ b/code/_helpers/game.dm @@ -172,7 +172,7 @@ if(ismob(I)) if(!sight_check || isInSight(I, O)) - L |= recursive_content_check(I, L, recursion_limit - 1, client_check, sight_check, include_mobs, include_objects) + L |= recursive_content_check(I, L, recursion_limit - 1, client_check, sight_check, include_mobs, include_objects, ignore_show_messages) if(include_mobs) if(client_check) var/mob/M = I @@ -185,7 +185,7 @@ var/obj/check_obj = I if(ignore_show_messages || check_obj.show_messages) if(!sight_check || isInSight(I, O)) - L |= recursive_content_check(I, L, recursion_limit - 1, client_check, sight_check, include_mobs, include_objects) + L |= recursive_content_check(I, L, recursion_limit - 1, client_check, sight_check, include_mobs, include_objects, ignore_show_messages) if(include_objects) L |= I diff --git a/code/_helpers/text.dm b/code/_helpers/text.dm index 520b98d39a..725335f267 100644 --- a/code/_helpers/text.dm +++ b/code/_helpers/text.dm @@ -343,16 +343,17 @@ //The icon var could be local in the proc, but it's a waste of resources // to always create it and then throw it out. /var/icon/text_tag_icons = 'icons/chattags.dmi' -/var/list/text_tag_cache = list() +GLOBAL_LIST_EMPTY(text_tag_cache) + /proc/create_text_tag(var/tagname, var/tagdesc = tagname, var/client/C = null) if(!(C && C.prefs?.read_preference(/datum/preference/toggle/chat_tags))) return tagdesc - if(!text_tag_cache[tagname]) - var/icon/tag = icon(text_tag_icons, tagname) - text_tag_cache[tagname] = tag + if(!GLOB.text_tag_cache[tagname]) + var/datum/asset/spritesheet/chatassets = get_asset_datum(/datum/asset/spritesheet/chat) + GLOB.text_tag_cache[tagname] = chatassets.icon_tag(tagname) if(!C.tgui_panel.is_ready() || C.tgui_panel.oldchat) return "[tagdesc]" - return icon2html(text_tag_cache[tagname], C, extra_classes = "text_tag") + return GLOB.text_tag_cache[tagname] /proc/create_text_tag_old(var/tagname, var/tagdesc = tagname, var/client/C = null) if(!(C && C.prefs?.read_preference(/datum/preference/toggle/chat_tags))) @@ -620,3 +621,8 @@ return json_decode(data) catch return null + +/// Removes all non-alphanumerics from the text, keep in mind this can lead to id conflicts +/proc/sanitize_css_class_name(name) + var/static/regex/regex = new(@"[^a-zA-Z0-9]","g") + return replacetext(name, regex, "") diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index d852798dab..8b5c5d0325 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -974,7 +974,7 @@ Turf and target are seperate in case you want to teleport some distance from a t if(toupdate.len) for(var/turf/simulated/T1 in toupdate) - air_master.mark_for_update(T1) + SSair.mark_for_update(T1) return copiedobjs diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index 857ce225f6..2955d9d721 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -11,8 +11,6 @@ var/global/datum/controller/game_controller/master_controller //Set in world.New var/global/controller_iteration = 0 var/global/last_tick_duration = 0 -var/global/pipe_processing_killed = 0 - /datum/controller/game_controller var/list/shuttle_list // For debugging and VV diff --git a/code/controllers/subsystems/air.dm b/code/controllers/subsystems/air.dm index 1e5f1506ec..e008086d04 100644 --- a/code/controllers/subsystems/air.dm +++ b/code/controllers/subsystems/air.dm @@ -1,3 +1,60 @@ +/* +Overview: + SSair does everything. There are tons of procs in here. + +Class Vars: + zones - All zones currently holding one or more turfs. + edges - All processing edges. + + tiles_to_update - Tiles scheduled to update next tick. + zones_to_update - Zones which have had their air changed and need air archival. + active_hotspots - All processing fire objects. + + active_zones - The number of zones which were archived last tick. Used in debug verbs. + next_id - The next UID to be applied to a zone. Mostly useful for debugging purposes as zones do not need UIDs to function. + +Class Procs: + + mark_for_update(turf/T) + Adds the turf to the update list. When updated, update_air_properties() will be called. + When stuff changes that might affect airflow, call this. It's basically the only thing you need. + + add_zone(zone/Z) and remove_zone(zone/Z) + Adds zones to the zones list. Does not mark them for update. + + air_blocked(turf/A, turf/B) + Returns a bitflag consisting of: + AIR_BLOCKED - The connection between turfs is physically blocked. No air can pass. + ZONE_BLOCKED - There is a door between the turfs, so zones cannot cross. Air may or may not be permeable. + + merge(zone/A, zone/B) + Called when zones have a direct connection and equivalent pressure and temperature. + Merges the zones to create a single zone. + + connect(turf/simulated/A, turf/B) + Called by turf/update_air_properties(). The first argument must be simulated. + Creates a connection between A and B. + + mark_zone_update(zone/Z) + Adds zone to the update list. Unlike mark_for_update(), this one is called automatically whenever + air is returned from a simulated turf. + + equivalent_pressure(zone/A, zone/B) + Currently identical to A.air.compare(B.air). Returns 1 when directly connected zones are ready to be merged. + + get_edge(zone/A, zone/B) + get_edge(zone/A, turf/B) + Gets a valid connection_edge between A and B, creating a new one if necessary. + + has_same_air(turf/A, turf/B) + Used to determine if an unsimulated edge represents a specific turf. + Simulated edges use connection_edge/contains_zone() for the same purpose. + Returns 1 if A has identical gases and temperature to B. + + remove_edge(connection_edge/edge) + Called when an edge is erased. Removes it from processing. +*/ + // Air update stages #define SSAIR_TURFS 1 #define SSAIR_EDGES 2 @@ -30,8 +87,19 @@ SUBSYSTEM_DEF(air) // This is used to tell CI WHERE the edges are. var/list/startup_active_edge_log = list() -/datum/controller/subsystem/air/PreInit() - air_master = src + //Geometry lists + var/list/zones = list() + var/list/edges = list() + //Geometry updates lists + var/list/tiles_to_update = list() + var/list/zones_to_update = list() + var/list/active_fire_zones = list() + var/list/active_hotspots = list() + var/list/active_edges = list() + + var/active_zones = 0 + var/current_cycle = 0 + var/next_id = 1 //Used to keep track of zone UIDs. /datum/controller/subsystem/air/Initialize(timeofday) report_progress("Processing Geometry...") @@ -109,7 +177,7 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun log_and_message_admins("SSair: Was told to start a new run, but the previous run wasn't finished! currentrun.len=[currentrun.len], current_step=[current_step]") resumed = TRUE else - current_cycle++ // Begin a new air_master cycle! + current_cycle++ // Begin a new SSair cycle! current_step = SSAIR_TURFS // Start with Step 1 of course INTERNAL_PROCESS_STEP(SSAIR_TURFS, TRUE, process_tiles_to_update, cost_turfs, SSAIR_EDGES) @@ -118,7 +186,7 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun INTERNAL_PROCESS_STEP(SSAIR_HOTSPOTS, FALSE, process_active_hotspots, cost_hotspots, SSAIR_ZONES) INTERNAL_PROCESS_STEP(SSAIR_ZONES, FALSE, process_zones_to_update, cost_zones, SSAIR_DONE) - // Okay, we're done! Woo! Got thru a whole air_master cycle! + // Okay, we're done! Woo! Got thru a whole SSair cycle! if(LAZYLEN(currentrun) || current_step != SSAIR_DONE) log_and_message_admins("SSair: Was not able to complete a full air cycle despite reaching the end of fire(). This shouldn't happen.") else @@ -305,9 +373,162 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun next_fire = world.time + wait can_fire = TRUE // Unpause -// -// The procs from the ZAS Air Controller are in ZAS/Controller.dm -// +/datum/controller/subsystem/air/proc/add_zone(zone/z) + zones.Add(z) + z.name = "Zone [next_id++]" + mark_zone_update(z) + +/datum/controller/subsystem/air/proc/remove_zone(zone/z) + zones.Remove(z) + zones_to_update.Remove(z) + +/datum/controller/subsystem/air/proc/air_blocked(turf/A, turf/B) + #ifdef ZASDBG + ASSERT(isturf(A)) + ASSERT(isturf(B)) + #endif + var/ablock = A.c_airblock(B) + if(ablock == BLOCKED) + return BLOCKED + return ablock | B.c_airblock(A) + +/datum/controller/subsystem/air/proc/merge(zone/A, zone/B) + #ifdef ZASDBG + ASSERT(istype(A)) + ASSERT(istype(B)) + ASSERT(!A.invalid) + ASSERT(!B.invalid) + ASSERT(A != B) + #endif + if(A.contents.len < B.contents.len) + A.c_merge(B) + mark_zone_update(B) + else + B.c_merge(A) + mark_zone_update(A) + +/datum/controller/subsystem/air/proc/connect(turf/simulated/A, turf/simulated/B) + #ifdef ZASDBG + ASSERT(istype(A)) + ASSERT(isturf(B)) + ASSERT(A.zone) + ASSERT(!A.zone.invalid) + //ASSERT(B.zone) + ASSERT(A != B) + #endif + + var/block = SSair.air_blocked(A,B) + if(block & AIR_BLOCKED) return + + var/direct = !(block & ZONE_BLOCKED) + var/space = !istype(B) + + if(!space) + if(min(A.zone.contents.len, B.zone.contents.len) < ZONE_MIN_SIZE || (direct && (equivalent_pressure(A.zone,B.zone) || current_cycle == 0))) + merge(A.zone,B.zone) + return + + var/a_to_b = get_dir(A,B) + var/b_to_a = get_dir(B,A) + + if(!A.connections) + A.connections = new + if(!B.connections) + B.connections = new + + if(A.connections.get(a_to_b)) + return + if(B.connections.get(b_to_a)) + return + if(!space) + if(A.zone == B.zone) + return + + + var/connection/c = new /connection(A,B) + + A.connections.place(c, a_to_b) + B.connections.place(c, b_to_a) + + if(direct) c.mark_direct() + +/datum/controller/subsystem/air/proc/mark_for_update(turf/T) + #ifdef ZASDBG + ASSERT(isturf(T)) + #endif + if(T.needs_air_update) + return + tiles_to_update |= T + #ifdef ZASDBG + T.add_overlay(mark) + #endif + T.needs_air_update = 1 + +/datum/controller/subsystem/air/proc/mark_zone_update(zone/Z) + #ifdef ZASDBG + ASSERT(istype(Z)) + #endif + if(Z.needs_update) + return + zones_to_update.Add(Z) + Z.needs_update = 1 + +/datum/controller/subsystem/air/proc/mark_edge_sleeping(connection_edge/E) + #ifdef ZASDBG + ASSERT(istype(E)) + #endif + if(E.sleeping) + return + active_edges.Remove(E) + E.sleeping = 1 + +/datum/controller/subsystem/air/proc/mark_edge_active(connection_edge/E) + #ifdef ZASDBG + ASSERT(istype(E)) + #endif + if(!E.sleeping) + return + active_edges.Add(E) + E.sleeping = 0 + +/datum/controller/subsystem/air/proc/equivalent_pressure(zone/A, zone/B) + return A.air.compare(B.air) + +/datum/controller/subsystem/air/proc/get_edge(zone/A, zone/B) + if(istype(B)) + for(var/connection_edge/zone/edge in A.edges) + if(edge.contains_zone(B)) + return edge + var/connection_edge/edge = new /connection_edge/zone(A,B) + edges.Add(edge) + edge.recheck() + return edge + else + for(var/connection_edge/unsimulated/edge in A.edges) + if(has_same_air(edge.B,B)) + return edge + var/connection_edge/edge = new /connection_edge/unsimulated(A,B) + edges.Add(edge) + edge.recheck() + return edge + +/datum/controller/subsystem/air/proc/has_same_air(turf/A, turf/B) + if(A.oxygen != B.oxygen) + return FALSE + if(A.nitrogen != B.nitrogen) + return FALSE + if(A.phoron != B.phoron) + return FALSE + if(A.carbon_dioxide != B.carbon_dioxide) + return FALSE + if(A.temperature != B.temperature) + return FALSE + return TRUE + +/datum/controller/subsystem/air/proc/remove_edge(connection_edge/E) + edges.Remove(E) + if(!E.sleeping) + active_edges.Remove(E) #undef SSAIR_TURFS #undef SSAIR_EDGES diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index 702dbfddae..165748c64b 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -89,7 +89,6 @@ //Goon PS stuff, and other yet-to-be-subsystem things. options["LEGACY: master_controller"] = master_controller - options["LEGACY: air_master"] = air_master options["LEGACY: job_master"] = job_master options["LEGACY: radio_controller"] = radio_controller options["LEGACY: emergency_shuttle"] = emergency_shuttle diff --git a/code/datums/autolathe/arms.dm b/code/datums/autolathe/arms.dm index 9bceaf27e6..41caf5a74d 100644 --- a/code/datums/autolathe/arms.dm +++ b/code/datums/autolathe/arms.dm @@ -443,7 +443,7 @@ /datum/category_item/autolathe/arms/knuckledusters name = "knuckle dusters" - path =/obj/item/clothing/gloves/knuckledusters + path =/obj/item/clothing/accessory/knuckledusters hidden = 1 /datum/category_item/autolathe/arms/tacknife diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index b664a349a6..6505817fb5 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -80,7 +80,7 @@ if(prob(15/D.permeability_mod)) return - if(nutrition > 300 && prob(nutrition/10)) + if(nutrition > 300 && prob(nutrition/50)) return var/list/zone_weights = list( @@ -178,16 +178,13 @@ return FALSE var/disease = tgui_input_list(usr, "Choose virus", "Viruses", subtypesof(/datum/disease), subtypesof(/datum/disease)) - var/mob/living/carbon/human/H = tgui_input_list(usr, "Choose infectee", human_mob_list) + var/mob/living/carbon/human/H = tgui_input_list(usr, "Choose infectee", "Characters", human_mob_list) var/datum/disease/D = new disease if(isnull(D) || isnull(H)) return FALSE - if(H.stat == DEAD) - return FALSE - if(!H.HasDisease(D)) H.ForceContractDisease(D) diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 6ae5cdbb9e..22cdabb1dd 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -91,7 +91,7 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) var/cures_found = 0 for(var/C_id in cures) - if(affected_mob.reagents.has_reagent(C_id)) + if(affected_mob.bloodstr.has_reagent(C_id) || affected_mob.ingested.has_reagent(C_id)) cures_found++ if(needs_all_cures && cures_found < length(cures)) @@ -106,7 +106,7 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) if((spread_flags & SPECIAL || spread_flags & NON_CONTAGIOUS || spread_flags & BLOOD) && !force_spread) return - if(affected_mob.reagents.has_reagent("spaceacilin") || (affected_mob.nutrition > 300 && prob(affected_mob.nutrition/10))) + if(affected_mob.bloodstr.has_reagent("spaceacillin") || (affected_mob.nutrition > 300 && prob(affected_mob.nutrition/50))) return var/spread_range = 1 diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 4e593ea7f1..6eda375458 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -2,7 +2,7 @@ GLOBAL_LIST_EMPTY(archive_diseases) GLOBAL_LIST_INIT(advance_cures, list( "sodiumchloride", "sugar", "orangejuice", - "spaceacilin", "glucose", "ethanol", + "spaceacillin", "glucose", "ethanol", "dyloteane", "impedrezene", "hepanephrodaxon", "gold", "silver" )) @@ -16,6 +16,7 @@ GLOBAL_LIST_INIT(advance_cures, list( spread_text = "Unknown" viable_mobtypes = list(/mob/living/carbon/human) + var/s_processing = FALSE var/list/symptoms = list() var/id = "" @@ -36,7 +37,7 @@ GLOBAL_LIST_INIT(advance_cures, list( return /datum/disease/advance/Destroy() - if(processing) + if(s_processing) for(var/datum/symptom/S in symptoms) S.End(src) return ..() @@ -46,8 +47,8 @@ GLOBAL_LIST_INIT(advance_cures, list( return FALSE if(symptoms && length(symptoms)) - if(!processing) - processing = TRUE + if(!s_processing) + s_processing = TRUE for(var/datum/symptom/S in symptoms) S.Start(src) @@ -361,7 +362,7 @@ GLOBAL_LIST_INIT(advance_cures, list( for(var/datum/disease/advance/AD in active_diseases) AD.Refresh() - H = tgui_input_list(usr, "Choose infectee", human_mob_list) + H = tgui_input_list(usr, "Choose infectee", "Infectees", human_mob_list) if(isnull(H)) return FALSE diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/advance/symptoms/cough.dm index bdf04a9fdf..00a33e9ce6 100644 --- a/code/datums/diseases/advance/symptoms/cough.dm +++ b/code/datums/diseases/advance/symptoms/cough.dm @@ -10,7 +10,8 @@ Coughing Low Level. BONUS - Will force the affected mob to drop small items! + Will force the affected mob to drop small items. + Small spread if not wearing a mask ////////////////////////////////////// */ @@ -36,4 +37,6 @@ BONUS var/obj/item/I = M.get_active_hand() if(I && I.w_class == ITEMSIZE_SMALL) M.drop_item() + if(!M.wear_mask) // Small spread if not wearing a mask + A.spread(2) return diff --git a/code/datums/diseases/advance/symptoms/fever.dm b/code/datums/diseases/advance/symptoms/fever.dm index a9e027da9c..6e252e56cd 100644 --- a/code/datums/diseases/advance/symptoms/fever.dm +++ b/code/datums/diseases/advance/symptoms/fever.dm @@ -35,6 +35,6 @@ Bonus return /datum/symptom/fever/proc/Heat(var/mob/living/M, var/datum/disease/advance/A) - var/get_heat = (sqrt(21+A.totalTransmittable()*2))+(sqrt(20+A.totalStageSpeed()*3)) + var/get_heat = (sqrtor0(21+A.totalTransmittable()*2))+(sqrtor0(20+A.totalStageSpeed()*3)) M.bodytemperature = min(M.bodytemperature + (get_heat * A.stage), BODYTEMP_HEAT_DAMAGE_LIMIT - 1) return TRUE diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm index 28c9002c3a..e91efab1c7 100644 --- a/code/datums/diseases/advance/symptoms/flesh_eating.dm +++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm @@ -37,6 +37,6 @@ Bonus return /datum/symptom/flesh_eating/proc/Flesheat(mob/living/M, datum/disease/advance/A) - var/get_damage = ((sqrt(16-A.totalStealth()))*5) + var/get_damage = ((sqrtor0(16-A.totalStealth()))*5) M.adjustBruteLoss(get_damage) return 1 diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 1c21959872..1138d4adba 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -33,7 +33,7 @@ Bonus return /datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A) - var/get_damage = (sqrt(20+A.totalStageSpeed())*(1+rand())) + var/get_damage = max(0, (sqrtor0(20+A.totalStageSpeed())*(1+rand()))) M.adjustToxLoss(-get_damage) return TRUE @@ -144,7 +144,7 @@ Bonus level = 5 /datum/symptom/heal/dna/Heal(var/mob/living/carbon/M, var/datum/disease/advance/A) - var/amt_healed = (sqrt(20+A.totalStageSpeed()*(3+rand())))-(sqrt(16+A.totalStealth()*rand())) + var/amt_healed = max(0, (sqrtor0(20+A.totalStageSpeed()*(3+rand())))-(sqrtor0(16+A.totalStealth()*rand()))) M.adjustBrainLoss(-amt_healed) M.radiation = max(M.radiation - 3, 0) return TRUE diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm index 6f1f3ac9d3..8e19382f94 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -30,14 +30,14 @@ Bonus var/mob/living/M = A.affected_mob if(A.stage >= 3) - M.slurring = min(0, M.slurring-4) - M.druggy = min(0, M.druggy-4) + M.slurring = max(0, M.slurring-4) + M.druggy = max(0, M.druggy-4) M.reagents.remove_reagent("ethanol", 3) if(A.stage >= 4) - M.drowsyness = min(0, M.drowsyness-4) + M.drowsyness = max(0, M.drowsyness-4) if(M.reagents.has_reagent("bliss")) M.reagents.del_reagent("bliss") - M.hallucination = min(0, M.hallucination-4) + M.hallucination = max(0, M.hallucination-4) if(A.stage >= 5) if(M.reagents.get_reagent_amount("alkysine") < 10) M.reagents.add_reagent("alkysine", 5) diff --git a/code/datums/diseases/advance/symptoms/shivering.dm b/code/datums/diseases/advance/symptoms/shivering.dm index 375850ef40..f4a3059d7c 100644 --- a/code/datums/diseases/advance/symptoms/shivering.dm +++ b/code/datums/diseases/advance/symptoms/shivering.dm @@ -34,6 +34,6 @@ Bonus return /datum/symptom/shivering/proc/Chill(mob/living/M, datum/disease/advance/A) - var/get_cold = (sqrt(16+A.totalStealth()*2))+(sqrt(21+A.totalResistance()*2)) + var/get_cold = (sqrtor0(16+A.totalStealth()*2))+(sqrtor0(21+A.totalResistance()*2)) M.bodytemperature = max(M.bodytemperature - (get_cold * A.stage), BODYTEMP_COLD_DAMAGE_LIMIT + 1) return 1 diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm index d60baaa11a..63f2ab00e1 100644 --- a/code/datums/diseases/advance/symptoms/sneeze.dm +++ b/code/datums/diseases/advance/symptoms/sneeze.dm @@ -34,8 +34,10 @@ Bonus M.emote("sniff") else M.emote("sneeze") - A.spread(5) - if(prob(30)) + if(!M.wear_mask) // Spread only if they're not covering their face + A.spread(5) + + if(prob(30) && !M.wear_mask) // Same for mucus var/obj/effect/decal/cleanable/mucus/icky = new(get_turf(M)) icky.viruses |= A.Copy() diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm index c6b6cf0f17..487f466761 100644 --- a/code/datums/diseases/cold.dm +++ b/code/datums/diseases/cold.dm @@ -3,8 +3,9 @@ max_stages = 3 spread_text = "Airborne" spread_flags = AIRBORNE - cure_text = "Rest & Spaceacilin" - cures = list("spaceacilin") + cure_text = "Rest & Spaceacillin" + cures = list("spaceacillin", "chicken_soup") + needs_all_cures = FALSE agent = "XY-rhinovirus" viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey) permeability_mod = 0.5 diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm index 6a30af6f85..2962f48e9b 100644 --- a/code/datums/diseases/flu.dm +++ b/code/datums/diseases/flu.dm @@ -2,8 +2,9 @@ name = "The Flu" max_stages = 3 spread_text = "Airborne" - cure_text = "Spaceacilin" - cures = list("spaceacilin") + cure_text = "Spaceacillin" + cures = list("spaceacillin", "chicken_soup") + needs_all_cures = FALSE cure_chance = 10 agent = "H13N1 flu virion" viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey) diff --git a/code/datums/diseases/roanoake.dm b/code/datums/diseases/roanoake.dm index 91d476b3c7..412ff16ae7 100644 --- a/code/datums/diseases/roanoake.dm +++ b/code/datums/diseases/roanoake.dm @@ -4,9 +4,9 @@ stage_prob = 2 spread_text = "Blood and close contact" spread_flags = BLOOD - cure_text = "Spaceacilin" + cure_text = "Spaceacillin" agent = "Chimera cells" - cures = list("spaceacilin") + cures = list("spaceacillin") cure_chance = 10 viable_mobtypes = list(/mob/living/carbon/human) desc = "If left untreated, subject will become a xenochimera upon perishing." diff --git a/code/datums/outfits/horror_killers.dm b/code/datums/outfits/horror_killers.dm index aa45f4e23d..6f38c18df0 100644 --- a/code/datums/outfits/horror_killers.dm +++ b/code/datums/outfits/horror_killers.dm @@ -5,7 +5,6 @@ gloves = /obj/item/clothing/gloves/black mask = /obj/item/clothing/mask/gas/clown_hat head = /obj/item/clothing/head/chaplain_hood - l_ear = /obj/item/radio/headset glasses = /obj/item/clothing/glasses/thermal/plain/monocle suit = /obj/item/clothing/suit/storage/hooded/chaplain_hoodie r_pocket = /obj/item/bikehorn @@ -15,6 +14,10 @@ id_type = /obj/item/card/id/syndicate/station_access id_pda_assignment = "Tunnel Clown!" + headset = /obj/item/radio/headset + headset_alt = /obj/item/radio/headset/alt + headset_earbud = /obj/item/radio/headset/earbud + /decl/hierarchy/outfit/masked_killer name = "Masked Killer" uniform = /obj/item/clothing/under/overalls @@ -22,13 +25,16 @@ gloves = /obj/item/clothing/gloves/sterile/latex mask = /obj/item/clothing/mask/surgical head = /obj/item/clothing/head/welding - l_ear = /obj/item/radio/headset glasses = /obj/item/clothing/glasses/thermal/plain/monocle suit = /obj/item/clothing/suit/storage/apron l_pocket = /obj/item/material/knife/tacknife r_pocket = /obj/item/surgical/scalpel r_hand = /obj/item/material/twohanded/fireaxe + headset = /obj/item/radio/headset + headset_alt = /obj/item/radio/headset/alt + headset_earbud = /obj/item/radio/headset/earbud + /decl/hierarchy/outfit/masked_killer/post_equip(var/mob/living/carbon/human/H) var/victim = get_mannequin(H.ckey) for(var/obj/item/carried_item in H.get_equipped_items(TRUE)) @@ -39,7 +45,6 @@ uniform = /obj/item/clothing/under/suit_jacket{ starting_accessories=list(/obj/item/clothing/accessory/wcoat) } shoes = /obj/item/clothing/shoes/black gloves = /obj/item/clothing/gloves/black - l_ear = /obj/item/radio/headset glasses = /obj/item/clothing/glasses/sunglasses l_pocket = /obj/item/melee/energy/sword mask = /obj/item/clothing/mask/gas/clown_hat @@ -49,6 +54,10 @@ pda_slot = slot_belt pda_type = /obj/item/pda/heads + headset = /obj/item/radio/headset + headset_alt = /obj/item/radio/headset/alt + headset_earbud = /obj/item/radio/headset/earbud + /decl/hierarchy/outfit/professional/post_equip(var/mob/living/carbon/human/H) var/obj/item/storage/secure/briefcase/sec_briefcase = new(H) for(var/obj/item/briefcase_item in sec_briefcase) diff --git a/code/datums/outfits/jobs/special_vr.dm b/code/datums/outfits/jobs/special_vr.dm index bc88232d13..0e1fcf2a70 100644 --- a/code/datums/outfits/jobs/special_vr.dm +++ b/code/datums/outfits/jobs/special_vr.dm @@ -4,24 +4,30 @@ gloves = /obj/item/clothing/gloves/white shoes = /obj/item/clothing/shoes/laceup head = /obj/item/clothing/head/beret/centcom/officer - l_ear = /obj/item/radio/headset/centcom glasses = /obj/item/clothing/glasses/omnihud/all id_type = /obj/item/card/id/centcom pda_type = /obj/item/pda/centcom flags = OUTFIT_EXTENDED_SURVIVAL|OUTFIT_COMPREHENSIVE_SURVIVAL + headset = /obj/item/radio/headset/centcom + headset_alt = /obj/item/radio/headset/centcom + headset_earbud = /obj/item/radio/headset/centcom + /decl/hierarchy/outfit/job/emergency_responder name = OUTFIT_JOB_NAME("Emergency Responder") uniform = /obj/item/clothing/under/ert shoes = /obj/item/clothing/shoes/boots/swat gloves = /obj/item/clothing/gloves/swat - l_ear = /obj/item/radio/headset/ert glasses = /obj/item/clothing/glasses/sunglasses back = /obj/item/storage/backpack/satchel id_type = /obj/item/card/id/centcom/ERT pda_type = /obj/item/pda/centcom flags = OUTFIT_EXTENDED_SURVIVAL|OUTFIT_COMPREHENSIVE_SURVIVAL + headset = /obj/item/radio/headset/ert + headset_alt = /obj/item/radio/headset/ert + headset_earbud = /obj/item/radio/headset/ert + /decl/hierarchy/outfit/job/emergency_responder/post_equip(var/mob/living/carbon/human/H) ..() ert.add_antagonist(H.mind) diff --git a/code/datums/outfits/military/military.dm b/code/datums/outfits/military/military.dm index d3f9555794..fb47db35f5 100644 --- a/code/datums/outfits/military/military.dm +++ b/code/datums/outfits/military/military.dm @@ -2,4 +2,6 @@ name = "Military Uniform" hierarchy_type = /decl/hierarchy/outfit/military - l_ear = /obj/item/radio/headset \ No newline at end of file + headset = /obj/item/radio/headset + headset_alt = /obj/item/radio/headset + headset_earbud = /obj/item/radio/headset \ No newline at end of file diff --git a/code/datums/outfits/misc.dm b/code/datums/outfits/misc.dm index 556bf1d052..ef36b85038 100644 --- a/code/datums/outfits/misc.dm +++ b/code/datums/outfits/misc.dm @@ -29,7 +29,6 @@ /decl/hierarchy/outfit/soviet_soldier/admiral name = "Soviet admiral" head = /obj/item/clothing/head/hgpiratecap - l_ear = /obj/item/radio/headset/heads/captain glasses = /obj/item/clothing/glasses/thermal/plain/eyepatch suit = /obj/item/clothing/suit/hgpirate @@ -37,10 +36,13 @@ id_type = /obj/item/card/id/centcom //station id_pda_assignment = "Admiral" + headset = /obj/item/radio/headset/heads/captain + headset_alt = /obj/item/radio/headset/heads/captain + headset_earbud = /obj/item/radio/headset/heads/captain + /decl/hierarchy/outfit/merchant name = "Merchant" shoes = /obj/item/clothing/shoes/black - l_ear = /obj/item/radio/headset uniform = /obj/item/clothing/under/color/grey id_slot = slot_wear_id id_type = /obj/item/card/id/civilian //merchant @@ -48,6 +50,10 @@ pda_type = /obj/item/pda/chef //cause I like the look id_pda_assignment = "Merchant" + headset = /obj/item/radio/headset + headset_alt = /obj/item/radio/headset + headset_earbud = /obj/item/radio/headset + /decl/hierarchy/outfit/merchant/vox name = "Merchant - Vox" shoes = /obj/item/clothing/shoes/boots/jackboots/toeless diff --git a/code/datums/outfits/nanotrasen.dm b/code/datums/outfits/nanotrasen.dm index 4bf6c4f861..3fde80dd0b 100644 --- a/code/datums/outfits/nanotrasen.dm +++ b/code/datums/outfits/nanotrasen.dm @@ -3,7 +3,6 @@ uniform = /obj/item/clothing/under/rank/centcom shoes = /obj/item/clothing/shoes/laceup gloves = /obj/item/clothing/gloves/white - l_ear = /obj/item/radio/headset/heads/hop glasses = /obj/item/clothing/glasses/sunglasses id_slot = slot_wear_id @@ -11,6 +10,10 @@ pda_slot = slot_r_store pda_type = /obj/item/pda/heads + headset = /obj/item/radio/headset/heads/hop + headset_alt = /obj/item/radio/headset/heads/hop + headset_earbud = /obj/item/radio/headset/heads/hop + /decl/hierarchy/outfit/nanotrasen/representative name = "Nanotrasen representative" belt = /obj/item/clipboard @@ -19,14 +22,20 @@ /decl/hierarchy/outfit/nanotrasen/officer name = "Nanotrasen officer" head = /obj/item/clothing/head/beret/centcom/officer - l_ear = /obj/item/radio/headset/heads/captain belt = /obj/item/gun/energy id_pda_assignment = "NanoTrasen Navy Officer" + headset = /obj/item/radio/headset/heads/captain + headset_alt = /obj/item/radio/headset/heads/captain + headset_earbud = /obj/item/radio/headset/heads/captain + /decl/hierarchy/outfit/nanotrasen/captain name = "Nanotrasen captain" uniform = /obj/item/clothing/under/rank/centcom_captain - l_ear = /obj/item/radio/headset/heads/captain head = /obj/item/clothing/head/beret/centcom/captain belt = /obj/item/gun/energy id_pda_assignment = "NanoTrasen Navy Captain" + + headset = /obj/item/radio/headset/heads/captain + headset_alt = /obj/item/radio/headset/heads/captain + headset_earbud = /obj/item/radio/headset/heads/captain diff --git a/code/datums/outfits/outfit_vr.dm b/code/datums/outfits/outfit_vr.dm index 537f13d834..c343a36964 100644 --- a/code/datums/outfits/outfit_vr.dm +++ b/code/datums/outfits/outfit_vr.dm @@ -3,7 +3,6 @@ uniform = /obj/item/clothing/under/solgov/utility/army/urban shoes = /obj/item/clothing/shoes/boots/jackboots gloves = /obj/item/clothing/gloves/combat - l_ear = /obj/item/radio/headset/centcom r_pocket = /obj/item/ammo_magazine/m95 l_pocket = /obj/item/ammo_magazine/m95 l_hand = /obj/item/ammo_magazine/m95 @@ -15,6 +14,10 @@ suit = /obj/item/clothing/suit/armor/combat/USDF belt = /obj/item/storage/belt/security/tactical + headset = /obj/item/radio/headset/centcom + headset_alt = /obj/item/radio/headset/centcom + headset_earbud = /obj/item/radio/headset/centcom + /decl/hierarchy/outfit/USDF/Marine/equip_id(mob/living/carbon/human/H) var/obj/item/card/id/C = ..() C.name = "[H.real_name]'s military ID Card" @@ -29,7 +32,6 @@ name = "USDF officer" head = /obj/item/clothing/head/dress/army/command shoes = /obj/item/clothing/shoes/boots/jackboots - l_ear = /obj/item/radio/headset/centcom uniform = /obj/item/clothing/under/solgov/mildress/army/command back = /obj/item/storage/backpack/satchel belt = /obj/item/gun/projectile/revolver/consul @@ -38,6 +40,10 @@ r_hand = /obj/item/clothing/accessory/holster/hip l_hand = /obj/item/clothing/accessory/tie/black + headset = /obj/item/radio/headset/centcom + headset_alt = /obj/item/radio/headset/centcom + headset_earbud = /obj/item/radio/headset/centcom + /decl/hierarchy/outfit/USDF/Officer/equip_id(mob/living/carbon/human/H) var/obj/item/card/id/C = ..() C.name = "[H.real_name]'s military ID Card" @@ -51,7 +57,6 @@ /decl/hierarchy/outfit/solcom/representative name = "SolCom Representative" shoes = /obj/item/clothing/shoes/laceup - l_ear = /obj/item/radio/headset/centcom uniform = /obj/item/clothing/under/suit_jacket/navy back = /obj/item/storage/backpack/satchel l_pocket = /obj/item/pen/blue @@ -59,6 +64,10 @@ r_hand = /obj/item/pda/centcom l_hand = /obj/item/clipboard + headset = /obj/item/radio/headset/centcom + headset_alt = /obj/item/radio/headset/centcom + headset_earbud = /obj/item/radio/headset/centcom + /decl/hierarchy/outfit/solcom/representative/equip_id(mob/living/carbon/human/H) var/obj/item/card/id/C = ..() C.name = "[H.real_name]'s SolCom ID Card" @@ -74,7 +83,6 @@ head = /obj/item/clothing/head/helmet/combat/imperial shoes =/obj/item/clothing/shoes/leg_guard/combat/imperial gloves = /obj/item/clothing/gloves/arm_guard/combat/imperial - l_ear = /obj/item/radio/headset/syndicate uniform = /obj/item/clothing/under/imperial mask = /obj/item/clothing/mask/gas/imperial suit = /obj/item/clothing/suit/armor/combat/imperial @@ -86,12 +94,15 @@ l_hand = /obj/item/shield/energy/imperial suit_store = /obj/item/gun/energy/imperial + headset = /obj/item/radio/headset/syndicate + headset_alt = /obj/item/radio/headset/syndicate + headset_earbud = /obj/item/radio/headset/syndicate + /decl/hierarchy/outfit/imperial/officer name = "Imperial officer" head = /obj/item/clothing/head/helmet/combat/imperial/centurion shoes = /obj/item/clothing/shoes/leg_guard/combat/imperial gloves = /obj/item/clothing/gloves/arm_guard/combat/imperial - l_ear = /obj/item/radio/headset/syndicate uniform = /obj/item/clothing/under/imperial mask = /obj/item/clothing/mask/gas/imperial suit = /obj/item/clothing/suit/armor/combat/imperial/centurion @@ -102,6 +113,10 @@ l_hand = /obj/item/shield/energy/imperial suit_store = /obj/item/gun/energy/imperial + headset = /obj/item/radio/headset/syndicate + headset_alt = /obj/item/radio/headset/syndicate + headset_earbud = /obj/item/radio/headset/syndicate + /* SOUTHERN CROSS OUTFITS Keep outfits simple. Spawn with basic uniforms and minimal gear. Gear instead goes in lockers. Keep this in mind if editing. diff --git a/code/datums/outfits/spec_op.dm b/code/datums/outfits/spec_op.dm index 8fd2cb6ae4..22da415b98 100644 --- a/code/datums/outfits/spec_op.dm +++ b/code/datums/outfits/spec_op.dm @@ -2,7 +2,6 @@ name = "Special ops - Officer" uniform = /obj/item/clothing/under/syndicate/combat suit = /obj/item/clothing/suit/armor/swat/officer - l_ear = /obj/item/radio/headset/ert glasses = /obj/item/clothing/glasses/thermal/plain/eyepatch mask = /obj/item/clothing/mask/smokable/cigarette/cigar/havana head = /obj/item/clothing/head/beret //deathsquad @@ -16,6 +15,10 @@ id_desc = "Special operations ID." id_pda_assignment = "Special Operations Officer" + headset = /obj/item/radio/headset/ert + headset_alt = /obj/item/radio/headset/ert + headset_earbud = /obj/item/radio/headset/ert + /decl/hierarchy/outfit/spec_op_officer/space name = "Special ops - Officer in space" suit = /obj/item/clothing/suit/armor/swat //obj/item/clothing/suit/space/void/swat @@ -29,7 +32,6 @@ uniform = /obj/item/clothing/under/ert shoes = /obj/item/clothing/shoes/boots/swat gloves = /obj/item/clothing/gloves/swat - l_ear = /obj/item/radio/headset/ert belt = /obj/item/gun/energy/gun glasses = /obj/item/clothing/glasses/sunglasses back = /obj/item/storage/backpack/satchel @@ -37,6 +39,10 @@ id_slot = slot_wear_id id_type = /obj/item/card/id/centcom/ERT + headset = /obj/item/radio/headset/ert + headset_alt = /obj/item/radio/headset/ert + headset_earbud = /obj/item/radio/headset/ert + /decl/hierarchy/outfit/death_command name = "Spec ops - Death commando" @@ -55,7 +61,6 @@ name = "Spec ops - Mercenary" uniform = /obj/item/clothing/under/syndicate shoes = /obj/item/clothing/shoes/boots/combat - l_ear = /obj/item/radio/headset/syndicate belt = /obj/item/storage/belt/security glasses = /obj/item/clothing/glasses/sunglasses gloves = /obj/item/clothing/gloves/swat @@ -66,4 +71,8 @@ id_type = /obj/item/card/id/syndicate id_pda_assignment = "Mercenary" + headset = /obj/item/radio/headset/syndicate + headset_alt = /obj/item/radio/headset/alt/syndicate + headset_earbud = /obj/item/radio/headset/earbud/syndicate + flags = OUTFIT_HAS_BACKPACK diff --git a/code/datums/outfits/wizardry.dm b/code/datums/outfits/wizardry.dm index 96836b3edc..0cb82f75f2 100644 --- a/code/datums/outfits/wizardry.dm +++ b/code/datums/outfits/wizardry.dm @@ -1,7 +1,6 @@ /decl/hierarchy/outfit/wizard uniform = /obj/item/clothing/under/color/lightpurple shoes = /obj/item/clothing/shoes/sandal - l_ear = /obj/item/radio/headset r_pocket = /obj/item/teleportation_scroll l_hand = /obj/item/staff r_hand = /obj/item/spellbook @@ -9,6 +8,10 @@ backpack_contents = list(/obj/item/storage/box = 1) hierarchy_type = /decl/hierarchy/outfit/wizard + headset = /obj/item/radio/headset + headset_alt = /obj/item/radio/headset + headset_earbud = /obj/item/radio/headset + /decl/hierarchy/outfit/wizard/blue name = "Wizard - Blue" head = /obj/item/clothing/head/wizard diff --git a/code/datums/supplypacks/hydroponics.dm b/code/datums/supplypacks/hydroponics.dm index 84712a9f74..fad0054a36 100644 --- a/code/datums/supplypacks/hydroponics.dm +++ b/code/datums/supplypacks/hydroponics.dm @@ -95,6 +95,13 @@ containername = "Chicken crate" access = access_hydroponics +/datum/supply_pack/hydro/turkey + name = "Turkey crate" + cost = 25 + containertype = /obj/structure/largecrate/animal/turkey + containername = "Turkey crate" + access = access_hydroponics + /datum/supply_pack/hydro/seeds name = "Seeds crate" contains = list( diff --git a/code/datums/supplypacks/misc.dm b/code/datums/supplypacks/misc.dm index d03ab2b620..bc1690c7d8 100644 --- a/code/datums/supplypacks/misc.dm +++ b/code/datums/supplypacks/misc.dm @@ -80,6 +80,7 @@ /obj/item/toy/plushie/slimeplushie, /obj/item/toy/plushie/box, /obj/item/toy/plushie/borgplushie, + /obj/item/toy/plushie/borgplushie/drake/eng, /obj/item/toy/plushie/borgplushie/medihound, /obj/item/toy/plushie/borgplushie/scrubpuppy, /obj/item/toy/plushie/foxbear, diff --git a/code/datums/supplypacks/supply.dm b/code/datums/supplypacks/supply.dm index 68a6b420c0..b8bcd3f7ba 100644 --- a/code/datums/supplypacks/supply.dm +++ b/code/datums/supplypacks/supply.dm @@ -175,7 +175,7 @@ /obj/item/material/knife/tacknife/survival, /obj/item/material/knife/machete, /obj/item/clothing/accessory/holster/machete, - /obj/item/clothing/gloves/watch/survival + /obj/item/clothing/accessory/watch/survival ) cost=25 containertype = /obj/structure/closet/crate/secure/xion @@ -200,7 +200,7 @@ /obj/item/clothing/head/pilot_vr, /obj/item/clothing/under/rank/pilot1, /obj/item/gun/energy/gun/protector/pilotgun/locked, - /obj/item/clothing/gloves/watch/survival + /obj/item/clothing/accessory/watch/survival ) cost=20 containertype = /obj/structure/closet/crate/secure/xion @@ -236,7 +236,7 @@ /obj/item/clothing/accessory/holster/machete, /obj/item/storage/box/explorerkeys, /obj/item/mapping_unit, - /obj/item/clothing/gloves/watch/survival + /obj/item/clothing/accessory/watch/survival ) cost = 75 containertype = /obj/structure/closet/crate/secure/xion diff --git a/code/datums/uplink/stealthy_weapons.dm b/code/datums/uplink/stealthy_weapons.dm index 29c8009211..39cc3bf9ae 100644 --- a/code/datums/uplink/stealthy_weapons.dm +++ b/code/datums/uplink/stealthy_weapons.dm @@ -58,12 +58,6 @@ item_cost = 20 path = /obj/item/pen/blade/fountain -/datum/uplink_item/item/stealthy_weapons/angrybuzzer - name = "Morphium Shock Ring" - desc = "An enigmatic ring used to create powerful electric shocks when punching. Can be used as a brute-force method of defibrillation." - item_cost = 40 - path = /obj/item/clothing/gloves/ring/buzzer - /datum/uplink_item/item/stealthy_weapons/huntingtrap name = "Camonetted Beartraps" desc = "A box of unique beartraps which will partially cloak when deployed, allowing for more effective hunting." diff --git a/code/game/jobs/job/assistant.dm b/code/game/jobs/job/assistant.dm index 6aa9753352..e3eca95cd3 100644 --- a/code/game/jobs/job/assistant.dm +++ b/code/game/jobs/job/assistant.dm @@ -57,3 +57,118 @@ title_blurb = "A " + JOB_ALT_RESIDENT + " is an individual who resides on the station, frequently in a different part of the station than what is seen. \ They are considered to be part of the crew for most purposes, but have no real authority." title_outfit = /decl/hierarchy/outfit/job/assistant/resident + +////////////////////////////////// +// Intern +////////////////////////////////// + +/datum/job/intern + title = JOB_INTERN + flag = INTERN + departments = list(DEPARTMENT_CIVILIAN) + department_flag = ENGSEC // Ran out of bits + faction = FACTION_STATION + total_positions = -1 + spawn_positions = -1 + supervisors = "the staff from the department you're interning in" + selection_color = "#555555" + economic_modifier = 2 + access = list() //See /datum/job/intern/get_access() + minimal_access = list() //See /datum/job/intern/get_access() + outfit_type = /decl/hierarchy/outfit/job/assistant/intern + alt_titles = list(JOB_ALT_APPRENTICE_ENGINEER = /datum/alt_title/intern_eng, + JOB_ALT_MEDICAL_INTERN = /datum/alt_title/intern_med, + JOB_ALT_RESEARCH_INTERN = /datum/alt_title/intern_sci, + JOB_ALT_SECURITY_CADET = /datum/alt_title/intern_sec, + JOB_ALT_JR_CARGO_TECH = /datum/alt_title/intern_crg, + JOB_ALT_SERVER = /datum/alt_title/server, + JOB_ALT_ASSISTANT = /datum/alt_title/assistant) + job_description = "An " + JOB_INTERN + " does whatever is requested of them, often doing so in process of learning \ + another job. Though they are part of the crew, they have no real authority." + timeoff_factor = 0 // Interns, noh + requestable = FALSE + +/datum/alt_title/intern_eng + title = JOB_ALT_APPRENTICE_ENGINEER + title_blurb = "An " + JOB_ALT_APPRENTICE_ENGINEER + " attempts to provide whatever the Engineering department needs. They are not proper Engineers, and are \ + often in training to become an Engineer. An " + JOB_ALT_APPRENTICE_ENGINEER + " has no real authority." + title_outfit = /decl/hierarchy/outfit/job/assistant/engineer + +/datum/alt_title/intern_med + title = JOB_ALT_MEDICAL_INTERN + title_blurb = "A " + JOB_ALT_MEDICAL_INTERN + " attempts to provide whatever the Medical department needs. They are not proper Doctors, and are \ + often in training to become a Doctor. A " + JOB_ALT_MEDICAL_INTERN + " has no real authority." + title_outfit = /decl/hierarchy/outfit/job/assistant/medic + +/datum/alt_title/intern_sci + title = JOB_ALT_RESEARCH_INTERN + title_blurb = "A " + JOB_ALT_RESEARCH_INTERN + " attempts to provide whatever the Research department needs. They are not proper " + JOB_SCIENTIST + "s, and are \ + often in training to become a " + JOB_SCIENTIST + ". A " + JOB_ALT_RESEARCH_INTERN + " has no real authority." + title_outfit = /decl/hierarchy/outfit/job/assistant/scientist + +/datum/alt_title/intern_sec + title = JOB_ALT_SECURITY_CADET + title_blurb = "A " + JOB_ALT_SECURITY_CADET + " attempts to provide whatever the Security department needs. They are not proper Officers, and are \ + often in training to become an Officer. A " + JOB_ALT_SECURITY_CADET + " has no real authority." + title_outfit = /decl/hierarchy/outfit/job/assistant/officer + +/datum/alt_title/intern_crg + title = JOB_ALT_JR_CARGO_TECH + title_blurb = "A " + JOB_ALT_JR_CARGO_TECH + " attempts to provide whatever the Cargo department needs. They are not proper Cargo Technicians, and are \ + often in training to become a " + JOB_CARGO_TECHNICIAN + ". A " + JOB_ALT_JR_CARGO_TECH + " has no real authority." + title_outfit = /decl/hierarchy/outfit/job/assistant/cargo +/* +/datum/alt_title/intern_exp + title = "Jr. " + JOB_EXPLORER + "" + title_blurb = "A Jr. " + JOB_EXPLORER + " attempts to provide whatever the Exploration department needs. They are not proper " + JOB_EXPLORER + "s, and are \ + often in training to become an " + JOB_EXPLORER + ". A Jr. " + JOB_EXPLORER + " has no real authority." + title_outfit = /decl/hierarchy/outfit/job/assistant/explorer +*/ +/datum/alt_title/server + title = JOB_ALT_SERVER + title_blurb = "A " + JOB_ALT_SERVER + " helps out kitchen and diner staff with various tasks, primarily food delivery. A " + JOB_ALT_SERVER + " has no real authority." + title_outfit = /decl/hierarchy/outfit/job/service/server + +/datum/alt_title/assistant + title = JOB_ALT_ASSISTANT + title_blurb = "An " + JOB_ALT_ASSISTANT + " helps out wherever they might be needed. They have no authority, but can volunteer to help if help is needed." + title_outfit = /decl/hierarchy/outfit/job/service/server + +/datum/job/intern/New() + ..() + if(config) + total_positions = CONFIG_GET(number/limit_interns) + spawn_positions = CONFIG_GET(number/limit_interns) + +/datum/job/intern/get_access() + if(CONFIG_GET(flag/assistant_maint)) + return list(access_maint_tunnels) + else + return list() + +////////////////////////////////// +// Visitor +////////////////////////////////// + +/datum/job/assistant // Visitor + title = JOB_ALT_VISITOR + supervisors = "nobody! You don't work here" + job_description = "A " + JOB_ALT_VISITOR + " is just there to visit the place. They have no real authority or responsibility." + timeoff_factor = 0 + requestable = FALSE + alt_titles = list("Guest" = /datum/alt_title/guest, "Traveler" = /datum/alt_title/traveler) + +/datum/job/assistant/New() + ..() + if(config) + total_positions = CONFIG_GET(number/limit_visitors) + spawn_positions = CONFIG_GET(number/limit_visitors) + +/datum/job/assistant/get_access() + return list() + +/datum/alt_title/guest + title = "Guest" + +/datum/alt_title/traveler + title = "Traveler" diff --git a/code/game/jobs/job/assistant_vr.dm b/code/game/jobs/job/assistant_vr.dm deleted file mode 100644 index c28d801acb..0000000000 --- a/code/game/jobs/job/assistant_vr.dm +++ /dev/null @@ -1,115 +0,0 @@ -////////////////////////////////// -// Intern -////////////////////////////////// - -/datum/job/intern - title = JOB_INTERN - flag = INTERN - departments = list(DEPARTMENT_CIVILIAN) - department_flag = ENGSEC // Ran out of bits - faction = FACTION_STATION - total_positions = -1 - spawn_positions = -1 - supervisors = "the staff from the department you're interning in" - selection_color = "#555555" - economic_modifier = 2 - access = list() //See /datum/job/intern/get_access() - minimal_access = list() //See /datum/job/intern/get_access() - outfit_type = /decl/hierarchy/outfit/job/assistant/intern - alt_titles = list(JOB_ALT_APPRENTICE_ENGINEER = /datum/alt_title/intern_eng, - JOB_ALT_MEDICAL_INTERN = /datum/alt_title/intern_med, - JOB_ALT_RESEARCH_INTERN = /datum/alt_title/intern_sci, - JOB_ALT_SECURITY_CADET = /datum/alt_title/intern_sec, - JOB_ALT_JR_CARGO_TECH = /datum/alt_title/intern_crg, - JOB_ALT_SERVER = /datum/alt_title/server, - JOB_ALT_ASSISTANT = /datum/alt_title/assistant) - job_description = "An " + JOB_INTERN + " does whatever is requested of them, often doing so in process of learning \ - another job. Though they are part of the crew, they have no real authority." - timeoff_factor = 0 // Interns, noh - requestable = FALSE - -/datum/alt_title/intern_eng - title = JOB_ALT_APPRENTICE_ENGINEER - title_blurb = "An " + JOB_ALT_APPRENTICE_ENGINEER + " attempts to provide whatever the Engineering department needs. They are not proper Engineers, and are \ - often in training to become an Engineer. An " + JOB_ALT_APPRENTICE_ENGINEER + " has no real authority." - title_outfit = /decl/hierarchy/outfit/job/assistant/engineer - -/datum/alt_title/intern_med - title = JOB_ALT_MEDICAL_INTERN - title_blurb = "A " + JOB_ALT_MEDICAL_INTERN + " attempts to provide whatever the Medical department needs. They are not proper Doctors, and are \ - often in training to become a Doctor. A " + JOB_ALT_MEDICAL_INTERN + " has no real authority." - title_outfit = /decl/hierarchy/outfit/job/assistant/medic - -/datum/alt_title/intern_sci - title = JOB_ALT_RESEARCH_INTERN - title_blurb = "A " + JOB_ALT_RESEARCH_INTERN + " attempts to provide whatever the Research department needs. They are not proper " + JOB_SCIENTIST + "s, and are \ - often in training to become a " + JOB_SCIENTIST + ". A " + JOB_ALT_RESEARCH_INTERN + " has no real authority." - title_outfit = /decl/hierarchy/outfit/job/assistant/scientist - -/datum/alt_title/intern_sec - title = JOB_ALT_SECURITY_CADET - title_blurb = "A " + JOB_ALT_SECURITY_CADET + " attempts to provide whatever the Security department needs. They are not proper Officers, and are \ - often in training to become an Officer. A " + JOB_ALT_SECURITY_CADET + " has no real authority." - title_outfit = /decl/hierarchy/outfit/job/assistant/officer - -/datum/alt_title/intern_crg - title = JOB_ALT_JR_CARGO_TECH - title_blurb = "A " + JOB_ALT_JR_CARGO_TECH + " attempts to provide whatever the Cargo department needs. They are not proper Cargo Technicians, and are \ - often in training to become a " + JOB_CARGO_TECHNICIAN + ". A " + JOB_ALT_JR_CARGO_TECH + " has no real authority." - title_outfit = /decl/hierarchy/outfit/job/assistant/cargo -/* -/datum/alt_title/intern_exp - title = "Jr. " + JOB_EXPLORER + "" - title_blurb = "A Jr. " + JOB_EXPLORER + " attempts to provide whatever the Exploration department needs. They are not proper " + JOB_EXPLORER + "s, and are \ - often in training to become an " + JOB_EXPLORER + ". A Jr. " + JOB_EXPLORER + " has no real authority." - title_outfit = /decl/hierarchy/outfit/job/assistant/explorer -*/ -/datum/alt_title/server - title = JOB_ALT_SERVER - title_blurb = "A " + JOB_ALT_SERVER + " helps out kitchen and diner staff with various tasks, primarily food delivery. A " + JOB_ALT_SERVER + " has no real authority." - title_outfit = /decl/hierarchy/outfit/job/service/server - -/datum/alt_title/assistant - title = JOB_ALT_ASSISTANT - title_blurb = "An " + JOB_ALT_ASSISTANT + " helps out wherever they might be needed. They have no authority, but can volunteer to help if help is needed." - title_outfit = /decl/hierarchy/outfit/job/service/server - -/datum/job/intern/New() - ..() - if(config) - total_positions = CONFIG_GET(number/limit_interns) - spawn_positions = CONFIG_GET(number/limit_interns) - -/datum/job/intern/get_access() - if(CONFIG_GET(flag/assistant_maint)) - return list(access_maint_tunnels) - else - return list() - - -////////////////////////////////// -// Visitor -////////////////////////////////// - -/datum/job/assistant // Visitor - title = JOB_ALT_VISITOR - supervisors = "nobody! You don't work here" - job_description = "A " + JOB_ALT_VISITOR + " is just there to visit the place. They have no real authority or responsibility." - timeoff_factor = 0 - requestable = FALSE - alt_titles = list("Guest" = /datum/alt_title/guest, "Traveler" = /datum/alt_title/traveler) - -/datum/job/assistant/New() - ..() - if(config) - total_positions = CONFIG_GET(number/limit_visitors) - spawn_positions = CONFIG_GET(number/limit_visitors) - -/datum/job/assistant/get_access() - return list() - -/datum/alt_title/guest - title = "Guest" - -/datum/alt_title/traveler - title = "Traveler" diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index 6c16ac4376..767ac32923 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -28,11 +28,16 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) ideal_age_by_species = list(SPECIES_HUMAN_VATBORN = 55) /// Vatborn live shorter, no other race eligible for captain besides human/skrell banned_job_species = list(SPECIES_UNATHI, SPECIES_TAJ, SPECIES_DIONA, SPECIES_PROMETHEAN, SPECIES_ZADDAT, "mechanical", "digital") + disallow_jobhop = TRUE + pto_type = PTO_CIVILIAN + dept_time_required = 80 //Pending something more complicated + outfit_type = /decl/hierarchy/outfit/job/captain job_description = "The " + JOB_SITE_MANAGER + " manages the other Command Staff, and through them the rest of the station. Though they have access to everything, \ they do not understand everything, and are expected to delegate tasks to the appropriate crew member. The " + JOB_SITE_MANAGER + " is expected to \ have an understanding of Standard Operating Procedure, and is subject to it, and legal action, in the same way as every other crew member." - alt_titles = list(JOB_ALT_OVERSEER= /datum/alt_title/overseer) + alt_titles = list(JOB_ALT_OVERSEER= /datum/alt_title/overseer, JOB_ALT_FACILITY_DIRECTOR = /datum/alt_title/facility_director, JOB_ALT_CHIEF_SUPERVISOR = /datum/alt_title/chief_supervisor, + JOB_ALT_CAPTAIN = /datum/alt_title/captain) /* @@ -45,11 +50,22 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) /datum/job/captain/get_access() return get_all_station_access().Copy() +/datum/job/captain/get_request_reasons() + return list("Training crew", "Assembling expedition team") // Captain Alt Titles /datum/alt_title/overseer title = JOB_ALT_OVERSEER +/datum/alt_title/facility_director + title = JOB_ALT_FACILITY_DIRECTOR + +/datum/alt_title/chief_supervisor + title = JOB_ALT_CHIEF_SUPERVISOR + +/datum/alt_title/captain + title = JOB_ALT_CAPTAIN + ////////////////////////////////// // Head of Personnel ////////////////////////////////// @@ -75,29 +91,42 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) ideal_age_by_species = list(SPECIES_UNATHI = 140, SPECIES_TESHARI = 27, "mechanical" = 20, SPECIES_HUMAN_VATBORN = 20) banned_job_species = list(SPECIES_PROMETHEAN, SPECIES_ZADDAT, "digital", SPECIES_DIONA) + disallow_jobhop = TRUE + pto_type = PTO_CIVILIAN + departments = list(DEPARTMENT_COMMAND, DEPARTMENT_CIVILIAN) + departments_managed = list(DEPARTMENT_CIVILIAN, DEPARTMENT_CARGO, DEPARTMENT_PLANET) + dept_time_required = 60 + outfit_type = /decl/hierarchy/outfit/job/hop job_description = "The " + JOB_HEAD_OF_PERSONNEL + " manages the Service department, the Exploration team, and most other civilians. They also \ manage the Supply department, through the " + JOB_QUARTERMASTER + ". In addition, the " + JOB_HEAD_OF_PERSONNEL + " oversees the personal accounts \ of the crew, including their money and access. If necessary, the " + JOB_HEAD_OF_PERSONNEL + " is first in line to assume Acting Command." - alt_titles = list(JOB_ALT_CREW_RESOURCE_OFFICER = /datum/alt_title/cro) - access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers, - access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, - access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, - access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, - access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, - access_hop, access_RC_announce, access_keycard_auth, access_gateway) - minimal_access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers, - access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, - access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, - access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, - access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, - access_hop, access_RC_announce, access_keycard_auth, access_gateway) + access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers, access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, access_hop, access_RC_announce, access_clown, access_tomfoolery, access_mime, access_keycard_auth, access_gateway, access_entertainment) + minimal_access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers,access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, access_hop, access_RC_announce, access_clown, access_tomfoolery, access_mime, access_keycard_auth, access_gateway, access_entertainment) + + alt_titles = list(JOB_ALT_CREW_RESOURCE_OFFICER = /datum/alt_title/cro, JOB_ALT_DEPUTY_MANAGER = /datum/alt_title/deputy_manager, JOB_ALT_STAFF_MANAGER = /datum/alt_title/staff_manager, + JOB_ALT_FACILITY_STEWARD = /datum/alt_title/facility_steward, JOB_ALT_FIRST_MATE = /datum/alt_title/first_mate) + +/datum/job/hop/get_request_reasons() + return list("ID modification", "Training crew", "Assembling expedition team") // HOP Alt Titles /datum/alt_title/cro title = JOB_ALT_CREW_RESOURCE_OFFICER +/datum/alt_title/deputy_manager + title = JOB_ALT_DEPUTY_MANAGER + +/datum/alt_title/staff_manager + title = JOB_ALT_STAFF_MANAGER + +/datum/alt_title/facility_steward + title = JOB_ALT_FACILITY_STEWARD + +/datum/alt_title/first_mate + title = JOB_ALT_FIRST_MATE + ////////////////////////////////// // Command Secretary ////////////////////////////////// @@ -116,9 +145,29 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) minimal_player_age = 5 economic_modifier = 7 + disallow_jobhop = TRUE + pto_type = PTO_CIVILIAN + alt_titles = list(JOB_ALT_COMMAND_LIAISON = /datum/alt_title/command_liaison, JOB_ALT_COMMAND_ASSISTANT = /datum/alt_title/command_assistant, JOB_ALT_COMMAND_INTERN = /datum/alt_title/command_intern, + JOB_ALT_BRIDGE_SECRETARY = /datum/alt_title/bridge_secretary, JOB_ALT_BRIDGE_ASSISTANT = /datum/alt_title/bridge_assistant) + access = list(access_heads, access_keycard_auth) minimal_access = list(access_heads, access_keycard_auth) outfit_type = /decl/hierarchy/outfit/job/secretary job_description = "A " + JOB_COMMAND_SECRETARY + " handles paperwork duty for the Heads of Staff, so they can better focus on managing their departments. \ They are not Heads of Staff, and have no real authority." + +/datum/alt_title/command_liaison + title = JOB_ALT_COMMAND_LIAISON + +/datum/alt_title/command_assistant + title = JOB_ALT_COMMAND_ASSISTANT + +/datum/alt_title/command_intern + title = JOB_ALT_COMMAND_INTERN + +/datum/alt_title/bridge_secretary + title = JOB_ALT_BRIDGE_SECRETARY + +/datum/alt_title/bridge_assistant + title = JOB_ALT_BRIDGE_ASSISTANT diff --git a/code/game/jobs/job/captain_vr.dm b/code/game/jobs/job/captain_vr.dm deleted file mode 100644 index c127d8dfd4..0000000000 --- a/code/game/jobs/job/captain_vr.dm +++ /dev/null @@ -1,78 +0,0 @@ -/datum/job/captain - disallow_jobhop = TRUE - pto_type = PTO_CIVILIAN - dept_time_required = 80 //Pending something more complicated - alt_titles = list(JOB_ALT_OVERSEER= /datum/alt_title/overseer, JOB_ALT_FACILITY_DIRECTOR = /datum/alt_title/facility_director, JOB_ALT_CHIEF_SUPERVISOR = /datum/alt_title/chief_supervisor, - JOB_ALT_CAPTAIN = /datum/alt_title/captain) - -/datum/alt_title/facility_director - title = JOB_ALT_FACILITY_DIRECTOR - -/datum/alt_title/chief_supervisor - title = JOB_ALT_CHIEF_SUPERVISOR - -/datum/alt_title/captain - title = JOB_ALT_CAPTAIN - -/datum/job/captain/get_request_reasons() - return list("Training crew", "Assembling expedition team") - -/datum/job/hop - disallow_jobhop = TRUE - pto_type = PTO_CIVILIAN - departments = list(DEPARTMENT_COMMAND, DEPARTMENT_CIVILIAN) - departments_managed = list(DEPARTMENT_CIVILIAN, DEPARTMENT_CARGO, DEPARTMENT_PLANET) - dept_time_required = 60 - - alt_titles = list(JOB_ALT_CREW_RESOURCE_OFFICER = /datum/alt_title/cro, JOB_ALT_DEPUTY_MANAGER = /datum/alt_title/deputy_manager, JOB_ALT_STAFF_MANAGER = /datum/alt_title/staff_manager, - JOB_ALT_FACILITY_STEWARD = /datum/alt_title/facility_steward, JOB_ALT_FIRST_MATE = /datum/alt_title/first_mate) - - access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers, - access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, - access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, - access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, - access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, - access_hop, access_RC_announce, access_clown, access_tomfoolery, access_mime, access_keycard_auth, access_gateway, access_entertainment) - minimal_access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers, - access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, - access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, - access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, - access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, - access_hop, access_RC_announce, access_clown, access_tomfoolery, access_mime, access_keycard_auth, access_gateway, access_entertainment) - -/datum/alt_title/deputy_manager - title = JOB_ALT_DEPUTY_MANAGER - -/datum/alt_title/staff_manager - title = JOB_ALT_STAFF_MANAGER - -/datum/alt_title/facility_steward - title = JOB_ALT_FACILITY_STEWARD - -/datum/alt_title/first_mate - title = JOB_ALT_FIRST_MATE - -/datum/job/hop/get_request_reasons() - return list("ID modification", "Training crew", "Assembling expedition team") - - -/datum/job/secretary - disallow_jobhop = TRUE - pto_type = PTO_CIVILIAN - alt_titles = list(JOB_ALT_COMMAND_LIAISON = /datum/alt_title/command_liaison, JOB_ALT_COMMAND_ASSISTANT = /datum/alt_title/command_assistant, JOB_ALT_COMMAND_INTERN = /datum/alt_title/command_intern, - JOB_ALT_BRIDGE_SECRETARY = /datum/alt_title/bridge_secretary, JOB_ALT_BRIDGE_ASSISTANT = /datum/alt_title/bridge_assistant) - -/datum/alt_title/command_liaison - title = JOB_ALT_COMMAND_LIAISON - -/datum/alt_title/command_assistant - title = JOB_ALT_COMMAND_ASSISTANT - -/datum/alt_title/command_intern - title = JOB_ALT_COMMAND_INTERN - -/datum/alt_title/bridge_secretary - title = JOB_ALT_BRIDGE_SECRETARY - -/datum/alt_title/bridge_assistant - title = JOB_ALT_BRIDGE_ASSISTANT diff --git a/code/game/jobs/job/cargo.dm b/code/game/jobs/job/cargo.dm new file mode 100644 index 0000000000..ad56749de6 --- /dev/null +++ b/code/game/jobs/job/cargo.dm @@ -0,0 +1,122 @@ +//Cargo +////////////////////////////////// +// Quartermaster +////////////////////////////////// +/datum/job/qm + title = JOB_QUARTERMASTER + flag = QUARTERMASTER + departments = list(DEPARTMENT_CARGO) + sorting_order = 1 // QM is above the cargo techs, but below the HoP. + departments_managed = list(DEPARTMENT_CARGO) + department_flag = CIVILIAN + faction = FACTION_STATION + total_positions = 1 + spawn_positions = 1 + pto_type = PTO_CARGO + supervisors = "the " + JOB_HEAD_OF_PERSONNEL + selection_color = "#9b633e" + economic_modifier = 5 + access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station, access_RC_announce) + minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station, access_RC_announce) + banned_job_species = list("digital", SPECIES_PROMETHEAN) + + ideal_character_age = 40 + dept_time_required = 20 + + outfit_type = /decl/hierarchy/outfit/job/cargo/qm + job_description = "The " + JOB_QUARTERMASTER + " manages the Supply department, checking cargo orders and ensuring supplies get to where they are needed." + alt_titles = list(JOB_ALT_SUPPLY_CHIEF = /datum/alt_title/supply_chief, JOB_ALT_LOGISTICS_MANAGER = /datum/alt_title/logistics_manager, JOB_ALT_CARGO_SUPERVISOR = /datum/alt_title/cargo_supervisor) + +/datum/job/qm/get_request_reasons() + return list("Training crew") + +// Quartermaster Alt Titles +/datum/alt_title/supply_chief + title = JOB_ALT_SUPPLY_CHIEF + +/datum/alt_title/logistics_manager + title = JOB_ALT_LOGISTICS_MANAGER + +/datum/alt_title/cargo_supervisor + title = JOB_ALT_CARGO_SUPERVISOR + +////////////////////////////////// +// Cargo Tech +////////////////////////////////// +/datum/job/cargo_tech + title = JOB_CARGO_TECHNICIAN + flag = CARGOTECH + departments = list(DEPARTMENT_CARGO) + department_flag = CIVILIAN + faction = FACTION_STATION + total_positions = 3 + spawn_positions = 3 + pto_type = PTO_CARGO + supervisors = "the " + JOB_QUARTERMASTER + " and the " + JOB_HEAD_OF_PERSONNEL + selection_color = "#7a4f33" + access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_mining, access_mining_station) + minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting) + + outfit_type = /decl/hierarchy/outfit/job/cargo/cargo_tech + job_description = "A " + JOB_CARGO_TECHNICIAN + " fills and delivers cargo orders. They are encouraged to return delivered crates to the Cargo Shuttle, \ + because Central Command gives a partial refund." + + alt_titles = list(JOB_ALT_CARGO_LOADER = /datum/alt_title/cargo_loader, JOB_ALT_CARGO_HANDLER = /datum/alt_title/cargo_handler, JOB_ALT_SUPPLY_COURIER = /datum/alt_title/supply_courier, + JOB_ALT_DISPOSALS_SORTER = /datum/alt_title/disposal_sorter) + +/datum/alt_title/supply_courier + title = JOB_ALT_SUPPLY_COURIER + title_blurb = "A " + JOB_ALT_SUPPLY_COURIER + " is usually tasked with delivering packages or cargo directly to whoever requires it." + +/datum/alt_title/cargo_loader + title = JOB_ALT_CARGO_LOADER + title_blurb = "A " + JOB_ALT_CARGO_LOADER + " is usually tasked with more menial labor within Supply department, such as loading and unloading supply shuttle." + +/datum/alt_title/cargo_handler + title = JOB_ALT_CARGO_HANDLER + title_blurb = "A " + JOB_ALT_CARGO_HANDLER + " is usually tasked with more menial labor within Supply department, such as loading and unloading supply shuttle." + +/datum/alt_title/disposal_sorter + title = JOB_ALT_DISPOSALS_SORTER + title_blurb = "A " + JOB_ALT_DISPOSALS_SORTER + " is usually tasked with operating disposals delivery system, sorting the trash and tagging parcels for delivery." + +////////////////////////////////// +// Shaft Miner +////////////////////////////////// + +/datum/job/mining + title = JOB_SHAFT_MINER + flag = MINER + departments = list(DEPARTMENT_CARGO) + department_flag = CIVILIAN + faction = FACTION_STATION + total_positions = 4 + spawn_positions = 4 + pto_type = PTO_CARGO + supervisors = "the " + JOB_QUARTERMASTER + " and the " + JOB_HEAD_OF_PERSONNEL + selection_color = "#7a4f33" + economic_modifier = 5 + access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_mining, access_mining_station) + minimal_access = list(access_mining, access_mining_station, access_mailsorting) + + outfit_type = /decl/hierarchy/outfit/job/cargo/mining + job_description = "A " + JOB_SHAFT_MINER + " mines and processes minerals to be delivered to departments that need them." + alt_titles = list(JOB_ALT_DEEP_SPACE_MINER = /datum/alt_title/deep_space_miner, JOB_ALT_DRILL_TECHNICIAN = /datum/alt_title/drill_tech, JOB_ALT_PROSPECTOR = /datum/alt_title/prospector, + JOB_ALT_EXCAVATOR = /datum/alt_title/excavator) + +/datum/job/mining/get_request_reasons() + return list("Assembling expedition team") + +/datum/alt_title/drill_tech + title = JOB_ALT_DRILL_TECHNICIAN + title_blurb = "A " + JOB_ALT_DRILL_TECHNICIAN + " specializes in operating and maintaining the machinery needed to extract ore from veins deep below the surface." + +/datum/alt_title/deep_space_miner + title = JOB_ALT_DEEP_SPACE_MINER + title_blurb = "A " + JOB_ALT_DEEP_SPACE_MINER + " specializes primarily in mining operations in zero-g environments, mostly in asteroid and debris fields." + +/datum/alt_title/prospector + title = JOB_ALT_PROSPECTOR + +/datum/alt_title/excavator + title = JOB_ALT_EXCAVATOR diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index 663edab0a4..0604b872e4 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -12,6 +12,7 @@ faction = FACTION_STATION total_positions = 2 spawn_positions = 2 + pto_type = PTO_CIVILIAN supervisors = "the " + JOB_HEAD_OF_PERSONNEL selection_color = "#515151" access = list(access_hydroponics, access_bar, access_kitchen) @@ -19,7 +20,7 @@ outfit_type = /decl/hierarchy/outfit/job/service/bartender job_description = "A " + JOB_BARTENDER + " mixes drinks for the crew. They generally have permission to charge for drinks or deny service to unruly patrons." - alt_titles = list(JOB_ALT_BARISTA = /datum/alt_title/barista) + alt_titles = list(JOB_ALT_BARKEEPR = /datum/alt_title/barkeeper, JOB_ALT_BARMAID = /datum/alt_title/barmaid, JOB_ALT_BARISTA = /datum/alt_title/barista, JOB_ALT_MIXOLOGIST = /datum/alt_title/mixologist) // Bartender Alt Titles /datum/alt_title/barista @@ -28,6 +29,15 @@ or deny service to unruly patrons." title_outfit = /decl/hierarchy/outfit/job/service/bartender/barista +/datum/alt_title/barkeeper + title = JOB_ALT_BARKEEPR + +/datum/alt_title/barmaid + title = JOB_ALT_BARMAID + +/datum/alt_title/mixologist + title = JOB_ALT_MIXOLOGIST + ////////////////////////////////// // Chef ////////////////////////////////// @@ -40,6 +50,7 @@ faction = FACTION_STATION total_positions = 2 spawn_positions = 2 + pto_type = PTO_CIVILIAN supervisors = "the "+ JOB_HEAD_OF_PERSONNEL selection_color = "#515151" access = list(access_hydroponics, access_bar, access_kitchen) @@ -47,13 +58,20 @@ outfit_type = /decl/hierarchy/outfit/job/service/chef job_description = "A " + JOB_CHEF + " cooks food for the crew. They generally have permission to charge for food or deny service to unruly diners." - alt_titles = list(JOB_ALT_COOK = /datum/alt_title/cook) + alt_titles = list(JOB_ALT_SOUSCHEF = /datum/alt_title/souschef, JOB_ALT_COOK = /datum/alt_title/cook, JOB_ALT_KITCHEN_WORKER = /datum/alt_title/kitchen_worker) // Chef Alt Titles /datum/alt_title/cook title = JOB_ALT_COOK title_blurb = "A " + JOB_ALT_COOK + " has the same duties, though they may be less experienced." +/datum/alt_title/souschef + title = JOB_ALT_SOUSCHEF + +/datum/alt_title/kitchen_worker + title = JOB_ALT_KITCHEN_WORKER + title_blurb = "A " + JOB_ALT_KITCHEN_WORKER + " has the same duties, though they may be less experienced." + ////////////////////////////////// // Botanist ////////////////////////////////// @@ -66,6 +84,7 @@ faction = FACTION_STATION total_positions = 2 spawn_positions = 2 + pto_type = PTO_CIVILIAN supervisors = "the " + JOB_HEAD_OF_PERSONNEL selection_color = "#515151" access = list(access_hydroponics, access_bar, access_kitchen) @@ -73,89 +92,30 @@ outfit_type = /decl/hierarchy/outfit/job/service/gardener job_description = "A " + JOB_BOTANIST+ " grows plants for the " + JOB_CHEF + " and " + JOB_BARTENDER + "." - alt_titles = list(JOB_ALT_GARDENER = /datum/alt_title/gardener) + alt_titles = list(JOB_ALT_HYDROPONICIST = /datum/alt_title/hydroponicist, JOB_ALT_CULTIVATOR = /datum/alt_title/cultivator, JOB_ALT_FARMER = /datum/alt_title/farmer, + JOB_ALT_GARDENER = /datum/alt_title/gardener, JOB_ALT_FLORIST = /datum/alt_title/florsit, JOB_ALT_RANCHER = /datum/alt_title/rancher) //Botanist Alt Titles /datum/alt_title/gardener title = JOB_ALT_GARDENER title_blurb = "A " + JOB_ALT_GARDENER + " may be less professional than their counterparts, and are more likely to tend to the public gardens if they aren't needed elsewhere." -//Cargo -////////////////////////////////// -// Quartermaster -////////////////////////////////// -/datum/job/qm - title = JOB_QUARTERMASTER - flag = QUARTERMASTER - departments = list(DEPARTMENT_CARGO) - sorting_order = 1 // QM is above the cargo techs, but below the HoP. - departments_managed = list(DEPARTMENT_CARGO) - department_flag = CIVILIAN - faction = FACTION_STATION - total_positions = 1 - spawn_positions = 1 - supervisors = "the " + JOB_HEAD_OF_PERSONNEL - selection_color = "#9b633e" - economic_modifier = 5 - access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station, access_RC_announce) - minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station, access_RC_announce) - banned_job_species = list("digital", SPECIES_PROMETHEAN) +/datum/alt_title/hydroponicist + title = JOB_ALT_HYDROPONICIST - ideal_character_age = 40 +/datum/alt_title/cultivator + title = JOB_ALT_CULTIVATOR - outfit_type = /decl/hierarchy/outfit/job/cargo/qm - job_description = "The " + JOB_QUARTERMASTER + " manages the Supply department, checking cargo orders and ensuring supplies get to where they are needed." - alt_titles = list(JOB_ALT_SUPPLY_CHIEF = /datum/alt_title/supply_chief) +/datum/alt_title/farmer + title = JOB_ALT_FARMER -// Quartermaster Alt Titles -/datum/alt_title/supply_chief - title = JOB_ALT_SUPPLY_CHIEF +/datum/alt_title/florsit + title = JOB_ALT_FLORIST + title_blurb = "A " + JOB_ALT_FLORIST + " may be less professional than their counterparts, and are more likely to tend to the public gardens if they aren't needed elsewhere." -////////////////////////////////// -// Cargo Tech -////////////////////////////////// -/datum/job/cargo_tech - title = JOB_CARGO_TECHNICIAN - flag = CARGOTECH - departments = list(DEPARTMENT_CARGO) - department_flag = CIVILIAN - faction = FACTION_STATION - total_positions = 2 - spawn_positions = 2 - supervisors = "the " + JOB_QUARTERMASTER + " and the " + JOB_HEAD_OF_PERSONNEL - selection_color = "#7a4f33" - access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_mining, access_mining_station) - minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting) - - outfit_type = /decl/hierarchy/outfit/job/cargo/cargo_tech - job_description = "A " + JOB_CARGO_TECHNICIAN + " fills and delivers cargo orders. They are encouraged to return delivered crates to the Cargo Shuttle, \ - because Central Command gives a partial refund." - -////////////////////////////////// -// Shaft Miner -////////////////////////////////// - -/datum/job/mining - title = JOB_SHAFT_MINER - flag = MINER - departments = list(DEPARTMENT_CARGO) - department_flag = CIVILIAN - faction = FACTION_STATION - total_positions = 3 - spawn_positions = 3 - supervisors = "the " + JOB_QUARTERMASTER + " and the " + JOB_HEAD_OF_PERSONNEL - selection_color = "#7a4f33" - economic_modifier = 5 - access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_mining, access_mining_station) - minimal_access = list(access_mining, access_mining_station, access_mailsorting) - - outfit_type = /decl/hierarchy/outfit/job/cargo/mining - job_description = "A " + JOB_SHAFT_MINER + " mines and processes minerals to be delivered to departments that need them." - alt_titles = list(JOB_ALT_DRILL_TECHNICIAN = /datum/alt_title/drill_tech) - -/datum/alt_title/drill_tech - title = JOB_ALT_DRILL_TECHNICIAN - title_blurb = "A " + JOB_ALT_DRILL_TECHNICIAN + " specializes in operating and maintaining the machinery needed to extract ore from veins deep below the surface." +/datum/alt_title/rancher + title = JOB_ALT_RANCHER + title_blurb = "A " + JOB_ALT_RANCHER + " is tasked with the care, feeding, raising, and harvesting of livestock." //Service ////////////////////////////////// @@ -167,8 +127,9 @@ departments = list(DEPARTMENT_CIVILIAN) department_flag = CIVILIAN faction = FACTION_STATION - total_positions = 2 - spawn_positions = 2 + total_positions = 3 + spawn_positions = 3 + pto_type = PTO_CIVILIAN supervisors = "the " + JOB_HEAD_OF_PERSONNEL selection_color = "#515151" access = list(access_janitor, access_maint_tunnels) @@ -176,12 +137,23 @@ outfit_type = /decl/hierarchy/outfit/job/service/janitor job_description = "A " + JOB_JANITOR + " keeps the station clean, as long as it doesn't interfere with active crime scenes." - alt_titles = list(JOB_ALT_CUSTODIAN = /datum/alt_title/custodian) + alt_titles = list(JOB_ALT_CUSTODIAN = /datum/alt_title/custodian, JOB_ALT_SANITATION_TECHNICIAN = /datum/alt_title/sanitation_tech, + JOB_ALT_MAID = /datum/alt_title/maid, JOB_ALT_GARBAGE_COLLECTOR = /datum/alt_title/garbage_collector) // Janitor Alt Titles /datum/alt_title/custodian title = JOB_ALT_CUSTODIAN +/datum/alt_title/sanitation_tech + title = JOB_ALT_SANITATION_TECHNICIAN + +/datum/alt_title/maid + title = JOB_ALT_MAID + +/datum/alt_title/garbage_collector + title = JOB_ALT_GARBAGE_COLLECTOR + title_blurb = "A " + JOB_ALT_GARBAGE_COLLECTOR + " keeps the station clean, though focuses moreso on collecting larger trash, with wet cleaning being secondary task." + //More or less assistants ////////////////////////////////// // Librarian @@ -192,8 +164,9 @@ departments = list(DEPARTMENT_CIVILIAN) department_flag = CIVILIAN faction = FACTION_STATION - total_positions = 1 - spawn_positions = 1 + total_positions = 2 + spawn_positions = 2 + pto_type = PTO_CIVILIAN supervisors = "the " + JOB_HEAD_OF_PERSONNEL selection_color = "#515151" access = list(access_library, access_maint_tunnels) @@ -201,7 +174,9 @@ outfit_type = /decl/hierarchy/outfit/job/librarian job_description = "The " + JOB_LIBRARIAN + " curates the book selection in the Library, so the crew might enjoy it." - alt_titles = list(JOB_ALT_JOURNALIST = /datum/alt_title/journalist, JOB_ALT_WRITER = /datum/alt_title/writer) + alt_titles = list(JOB_ALT_JOURNALIST = /datum/alt_title/journalist, JOB_ALT_REPORTER = /datum/alt_title/reporter, JOB_ALT_WRITER = /datum/alt_title/writer, + JOB_ALT_HISTORIAN = /datum/alt_title/historian, JOB_ALT_ARCHIVIST = /datum/alt_title/archivist, JOB_ALT_PROFESSOR = /datum/alt_title/professor, + JOB_ALT_ACADEMIC = /datum/alt_title/academic, JOB_ALT_PHILOSOPHER = /datum/alt_title/philosopher, JOB_ALT_CURATOR = /datum/alt_title/curator) // Librarian Alt Titles /datum/alt_title/journalist @@ -213,6 +188,34 @@ title = JOB_ALT_WRITER title_blurb = "The " + JOB_ALT_WRITER + " uses the Library as a quiet place to write whatever it is they choose to write." +/datum/alt_title/reporter + title = JOB_ALT_REPORTER + title_blurb = "The " + JOB_ALT_REPORTER + " uses the Library as a base of operations, from which they can report the news and goings-on on the station with their camera." + +/datum/alt_title/historian + title = JOB_ALT_HISTORIAN + title_blurb = "The " + JOB_ALT_HISTORIAN + " uses the Library as a base of operation to record any important events occurring on station." + +/datum/alt_title/archivist + title = JOB_ALT_ARCHIVIST + title_blurb = "The " + JOB_ALT_ARCHIVIST + " uses the Library as a base of operation to record any important events occurring on station." + +/datum/alt_title/professor + title = JOB_ALT_PROFESSOR + title_blurb = "The " + JOB_ALT_PROFESSOR + " uses the Library as a base of operations to share their vast knowledge with the crew." + +/datum/alt_title/academic + title = JOB_ALT_ACADEMIC + title_blurb = "The " + JOB_ALT_ACADEMIC + " uses the Library as a base of operations to share their vast knowledge with the crew." + +/datum/alt_title/philosopher + title = JOB_ALT_PHILOSOPHER + title_blurb = "The " + JOB_ALT_PHILOSOPHER + " uses the Library as a base of operation to ruminate on nature of life and other great questions, and share their opinions with the crew." + +/datum/alt_title/curator + title = JOB_ALT_CURATOR + title_blurb = "The " + JOB_ALT_CURATOR + " uses the Library as a base of operation to gather the finest of art for display and preservation." + ////////////////////////////////// // Internal Affairs Agent ////////////////////////////////// @@ -226,6 +229,8 @@ faction = FACTION_STATION total_positions = 2 spawn_positions = 2 + pto_type = PTO_CIVILIAN + disallow_jobhop = TRUE supervisors = "company officials and Corporate Regulations" selection_color = "#515151" economic_modifier = 7 @@ -238,10 +243,233 @@ job_description = "An " + JOB_INTERNAL_AFFAIRS_AGENT + " makes sure that the crew is following Standard Operating Procedure. They also \ handle complaints against crew members, and can have issues brought to the attention of Central Command, \ assuming their paperwork is in order." + alt_titles = list(JOB_ALT_INTERNAL_AFFAIRS_LIAISON = /datum/alt_title/ia_liaison, JOB_ALT_INTERNAL_AFFAIRS_DELEGATE = /datum/alt_title/ia_delegate, + JOB_ALT_INTERNAL_AFFAIRS_INVESTIGATOR = /datum/alt_title/ia_investigator) -/* -/datum/job/lawyer/equip(var/mob/living/carbon/human/H) - . = ..() - if(.) - H.implant_loyalty(H) -*/ +/datum/alt_title/ia_liaison + title = JOB_ALT_INTERNAL_AFFAIRS_LIAISON + +/datum/alt_title/ia_delegate + title = JOB_ALT_INTERNAL_AFFAIRS_DELEGATE + +/datum/alt_title/ia_investigator + title = JOB_ALT_INTERNAL_AFFAIRS_INVESTIGATOR + +////////////////////////////////// +// Pilot +////////////////////////////////// + +/datum/job/pilot + title = JOB_PILOT + flag = PILOT + departments = list(DEPARTMENT_CIVILIAN) + department_flag = CIVILIAN + faction = FACTION_STATION + total_positions = 2 + spawn_positions = 2 + supervisors = "the " + JOB_HEAD_OF_PERSONNEL + selection_color = "#515151" + economic_modifier = 5 + minimal_player_age = 3 + pto_type = PTO_CIVILIAN + access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot) + minimal_access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot) + outfit_type = /decl/hierarchy/outfit/job/pilot + job_description = "A " + JOB_PILOT + " flies the various shuttles in the Virgo-Erigone System." + alt_titles = list(JOB_ALT_COPILOT = /datum/alt_title/co_pilot, JOB_ALT_NAVIGATOR = /datum/alt_title/navigator, JOB_ALT_HELMSMAN = /datum/alt_title/helmsman) + +/datum/alt_title/co_pilot + title = JOB_ALT_COPILOT + title_blurb = "A Co-" + JOB_ALT_COPILOT + " is there primarily to assist main pilot as well as learn from them" + +/datum/alt_title/navigator + title = JOB_ALT_NAVIGATOR + +/datum/alt_title/helmsman + title = JOB_ALT_HELMSMAN + +/datum/job/pilot/get_request_reasons() + return list("Assembling expedition team") + +////////////////////////////////// +// Entertainer +////////////////////////////////// + +/datum/job/entertainer + title = JOB_ENTERTAINER + flag = ENTERTAINER + departments = list(DEPARTMENT_CIVILIAN) + department_flag = CIVILIAN + faction = FACTION_STATION + total_positions = 4 + spawn_positions = 4 + supervisors = "the " + JOB_HEAD_OF_PERSONNEL + selection_color = "#515151" + access = list(access_entertainment) + minimal_access = list(access_entertainment) + pto_type = PTO_CIVILIAN + + outfit_type = /decl/hierarchy/outfit/job/assistant/entertainer + job_description = "An " + JOB_ENTERTAINER + " does just that, entertains! Put on plays, play music, sing songs, tell stories, or read your favorite fanfic." + alt_titles = list(JOB_ALT_PERFORMER = /datum/alt_title/performer, JOB_ALT_MUSICIAN = /datum/alt_title/musician, JOB_ALT_STAGEHAND = /datum/alt_title/stagehand, + JOB_ALT_ACTOR = /datum/alt_title/actor, JOB_ALT_DANCER = /datum/alt_title/dancer, JOB_ALT_SINGER = /datum/alt_title/singer, + JOB_ALT_MAGICIAN = /datum/alt_title/magician, JOB_ALT_COMEDIAN = /datum/alt_title/comedian, JOB_ALT_ARTIST = /datum/alt_title/tragedian, + JOB_ALT_ARTIST = /datum/alt_title/artist, JOB_ALT_GAME_MASTER = /datum/alt_title/game_master) + +// Entertainer Alt Titles +/datum/alt_title/actor + title = JOB_ALT_ACTOR + title_blurb = "An " + JOB_ALT_ACTOR + " is someone who acts out a role! Whatever sort of character it is, get into it and impress people with power of comedy and tragedy!" + +/datum/alt_title/performer + title = JOB_ALT_PERFORMER + title_blurb = "A " + JOB_ALT_PERFORMER + " is someone who performs! Whatever sort of performance will come to your mind, the world's a stage!" + +/datum/alt_title/musician + title = JOB_ALT_MUSICIAN + title_blurb = "A " + JOB_ALT_MUSICIAN + " is someone who makes music with a wide variety of musical instruments!" + +/datum/alt_title/stagehand + title = JOB_ALT_STAGEHAND + title_blurb = "A " + JOB_ALT_STAGEHAND + " typically performs everything the rest of the entertainers don't. Operate lights, shutters, windows, or narrate through your voicebox!" + +/datum/alt_title/dancer + title = JOB_ALT_DANCER + title_blurb = "A " + JOB_ALT_DANCER + " is someone who impresses people through power of their own body! From waltz to breakdance, as long as crowd as cheering!" + +/datum/alt_title/singer + title = JOB_ALT_SINGER + title_blurb = "A " + JOB_ALT_SINGER + " is someone with gift of melodious voice! Impress people with your vocal range!" + +/datum/alt_title/magician + title = JOB_ALT_MAGICIAN + title_blurb = "A " + JOB_ALT_MAGICIAN + " is someone who awes those around them with impossible! Show off your repertoire of magic tricks, while keeping the secret hidden!" + +/datum/alt_title/comedian + title = JOB_ALT_COMEDIAN + title_blurb = "A " + JOB_ALT_COMEDIAN + " will focus on making people laugh with the power of wit! Telling jokes, stand-up comedy, you are here to make others smile!" + +/datum/alt_title/tragedian + title = JOB_ALT_ARTIST + title_blurb = "A " + JOB_ALT_ARTIST + " will focus on making people think about life and world around them! Life is a tragedy, and who's better to convey its emotions than you?" + +/datum/alt_title/artist + title = JOB_ALT_ARTIST + title_blurb = "An " + JOB_ALT_ARTIST + "'s calling is to create beautiful arts! Whatever form may they take, create and have people astonished with your creativity." + +/datum/alt_title/game_master + title = JOB_ALT_GAME_MASTER + title_blurb = "A " + JOB_ALT_GAME_MASTER + " provides recreation for the crew by hosting variety of games. From cards to roleplaying to something more personalized." + +////////////////////////////////// +// Entrepreneur +////////////////////////////////// + +/datum/job/entrepreneur + title = JOB_ENTREPRENEUR + flag = ENTREPRENEUR + departments = list(DEPARTMENT_CIVILIAN) + department_flag = CIVILIAN + faction = FACTION_STATION + total_positions = 4 + spawn_positions = 4 + supervisors = "the " + JOB_HEAD_OF_PERSONNEL + selection_color = "#515151" + access = list() + minimal_access = list() + pto_type = PTO_CIVILIAN + + outfit_type = /decl/hierarchy/outfit/job/assistant/entrepreneur + job_description = "An " + JOB_ENTREPRENEUR + " is basically a visitor that obtained special permission to offer personal services to people on station. \ + They will offer people these services and, potentially, even demand payment!" + alt_titles = list(JOB_ALT_LAWYER = /datum/alt_title/lawyer, JOB_ALT_PRIVATE_EYE = /datum/alt_title/private_eye, JOB_ALT_BODYGUARD = /datum/alt_title/bodyguard, + JOB_ALT_PERSONAL_PHYSICIAN = /datum/alt_title/personal_physician, JOB_ALT_DENTIST = /datum/alt_title/dentist, JOB_ALT_FITNESS_INSTRUCTOR = /datum/alt_title/fitness_instructor, + JOB_ALT_YOGA_TEACHER = /datum/alt_title/yoga_teacher, JOB_ALT_MASSEUSE = /datum/alt_title/masseuse, JOB_ALT_TRADESPERSON = /datum/alt_title/tradesperson, + JOB_ALT_STREAMER = /datum/alt_title/streamer, JOB_ALT_INFLUENCER = /datum/alt_title/influencer, JOB_ALT_PARANORMAL_INVESTIGATOR = /datum/alt_title/paranormal_investigator, + JOB_ALT_PERSONAL_SECRETARY = /datum/alt_title/personal_secretary, JOB_ALT_STYLIST = /datum/alt_title/stylist, JOB_ALT_FISHER = /datum/alt_title/fisher, + JOB_ALT_FORTUNE_TELLER = /datum/alt_title/fortune_teller, JOB_ALT_SPIRIT_HEALER = /datum/alt_title/spirit_healer) + +/datum/alt_title/lawyer + title = JOB_ALT_LAWYER + title_blurb = "A " + JOB_ALT_LAWYER + " is knowledgable in various legal systems, including station's operations. They can try to offer their legal counsel, although nobody is really obliged to listen." + title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/personal_secretary + +/datum/alt_title/private_eye + title = JOB_ALT_PRIVATE_EYE + title_blurb = "A " + JOB_ALT_PRIVATE_EYE + " is a detective that has no credentials or equipment. But if someone wants something found without security's knowledge, they are the one to go to." + title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/private_eye + +/datum/alt_title/bodyguard + title = JOB_ALT_BODYGUARD + title_blurb = "A " + JOB_ALT_BODYGUARD + " offers service of personal protection. They may not be allowed any weapons, but their own body is weapon enough." + title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/bodyguard + +/datum/alt_title/personal_physician + title = JOB_ALT_PERSONAL_PHYSICIAN + title_blurb = "A " + JOB_ALT_PERSONAL_PHYSICIAN + " is a doctor dedicated less to Hippocratic Oath and more to the moneymaking grind. Their license may be expired, but the grindset never will be." + title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/personal_physician + +/datum/alt_title/dentist + title = JOB_ALT_DENTIST + title_blurb = "A " + JOB_ALT_DENTIST + " is a doctor that specializes in oral care. Company may not recognize them as a proper doctor, but surely their customers will." + title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/dentist + +/datum/alt_title/fitness_instructor + title = JOB_ALT_FITNESS_INSTRUCTOR + title_blurb = "A " + JOB_ALT_FITNESS_INSTRUCTOR + " dedicates themselves to improving the health of the crew through physical activity, and boy, do they need the help." + title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/fitness_instructor + +/datum/alt_title/yoga_teacher + title = JOB_ALT_YOGA_TEACHER + title_blurb = "A " + JOB_ALT_YOGA_TEACHER + " is similar to a fitness instructor, but rather than turning the round bodies into firm ones, they focus on helping people find balance and harmony." + title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/yoga_teacher + +/datum/alt_title/masseuse + title = JOB_ALT_MASSEUSE + title_blurb = "A " + JOB_ALT_MASSEUSE + " is master of physical therapy and working others' bodies with their hands." + title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/masseuse + +/datum/alt_title/tradesperson + title = JOB_ALT_TRADESPERSON + title_blurb = "A " + JOB_ALT_TRADESPERSON + " is someone attempting to make money via the most obvious act of all - buying and selling. Now if only customs allowed you to bring your goods along..." + title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/tradesperson + +/datum/alt_title/streamer + title = JOB_ALT_STREAMER + title_blurb = "A " + JOB_ALT_STREAMER + " is here to entertain. Not the crew! Their audience across exonet!" + title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/streamer + +/datum/alt_title/influencer + title = JOB_ALT_INFLUENCER + title_blurb = "An " + JOB_ALT_INFLUENCER + " has lucked out with some exonet following, and was given permission to go onstation to provide free exposure. Don't let it go to your head." + title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/influencer + +/datum/alt_title/paranormal_investigator + title = JOB_ALT_PARANORMAL_INVESTIGATOR + title_blurb = "A " + JOB_ALT_PARANORMAL_INVESTIGATOR + " looks beyond what is accepted by modern science, and searches for the true unknown. Aliens, alternate dimensions, ghosts... The truth is out there!" + title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/paranormal_investigator + +/datum/alt_title/personal_secretary + title = JOB_ALT_PERSONAL_SECRETARY + title_blurb = "A " + JOB_ALT_PERSONAL_SECRETARY + " offers services of general assistance. Although it's doubtful anyone will ever actually need those." + title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/personal_secretary + +/datum/alt_title/stylist + title = JOB_ALT_STYLIST + title_blurb = "A " + JOB_ALT_STYLIST + " offers fashion advice, as well as helps with adjusting appearance of the crew to better suit their beauty standards." + title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/stylist + +/datum/alt_title/fisher + title = JOB_ALT_FISHER + title_blurb = "A " + JOB_ALT_FISHER + " is a capable angler, who is good at obtaining large amounts of marine goods. Whether you generously give them to station or attempt to make a quick thaler by selling, it's up to you!" + title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/fisher + +/datum/alt_title/fortune_teller + title = JOB_ALT_FORTUNE_TELLER + title_blurb = "A " + JOB_ALT_FORTUNE_TELLER + " peers into the future, and offers these visions to others. Occasionally those visions may even come true!" + title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/fortune_teller + +/datum/alt_title/spirit_healer + title = JOB_ALT_SPIRIT_HEALER + title_blurb = "A " + JOB_ALT_SPIRIT_HEALER + " offers alternative forms of medicine. Rituals, magic rocks, seances... It totally works. What's that about placebo?" + title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/spirit_healer diff --git a/code/game/jobs/job/civilian_chaplain.dm b/code/game/jobs/job/civilian_chaplain.dm index 1220e3ee88..a980fd2325 100644 --- a/code/game/jobs/job/civilian_chaplain.dm +++ b/code/game/jobs/job/civilian_chaplain.dm @@ -7,6 +7,7 @@ faction = FACTION_STATION total_positions = 1 spawn_positions = 1 + pto_type = PTO_CIVILIAN supervisors = "the " + JOB_HEAD_OF_PERSONNEL selection_color = "#515151" access = list(access_morgue, access_chapel_office, access_crematorium, access_maint_tunnels) @@ -14,13 +15,34 @@ outfit_type = /decl/hierarchy/outfit/job/chaplain job_description = "The " + JOB_CHAPLAIN + " ministers to the spiritual needs of the crew." - alt_titles = list(JOB_ALT_COUNSELOR = /datum/alt_title/counselor) + alt_titles = list(JOB_ALT_MISSIONARY = /datum/alt_title/missionary, JOB_ALT_PREACHER = /datum/alt_title/preacher, JOB_ALT_PRIEST = /datum/alt_title/priest, + JOB_ALT_NUN = /datum/alt_title/nun, JOB_ALT_MONK = /datum/alt_title/monk, JOB_ALT_COUNSELOR = /datum/alt_title/counselor, + JOB_ALT_GURU = /datum/alt_title/guru) // Chaplain Alt Titles /datum/alt_title/counselor title = JOB_ALT_COUNSELOR title_blurb = "The " + JOB_ALT_COUNSELOR + " attends to the emotional needs of the crew, without a specific medicinal or spiritual focus." +/datum/alt_title/guru + title = JOB_ALT_GURU + title_blurb = "The " + JOB_ALT_GURU + " primarily tries to offer spiritual guidance to those who come seeking it." + +/datum/alt_title/missionary + title = JOB_ALT_MISSIONARY + +/datum/alt_title/preacher + title = JOB_ALT_PREACHER + +/datum/alt_title/priest + title = JOB_ALT_PRIEST + +/datum/alt_title/nun + title = JOB_ALT_NUN + +/datum/alt_title/monk + title = JOB_ALT_MONK + /datum/job/chaplain/equip(var/mob/living/carbon/human/H, var/alt_title, var/ask_questions = TRUE) . = ..() if(!.) diff --git a/code/game/jobs/job/civilian_vr.dm b/code/game/jobs/job/civilian_vr.dm deleted file mode 100644 index bd4093e403..0000000000 --- a/code/game/jobs/job/civilian_vr.dm +++ /dev/null @@ -1,426 +0,0 @@ -/datum/job/bartender - pto_type = PTO_CIVILIAN - alt_titles = list(JOB_ALT_BARKEEPR = /datum/alt_title/barkeeper, JOB_ALT_BARMAID = /datum/alt_title/barmaid, JOB_ALT_BARISTA = /datum/alt_title/barista, JOB_ALT_MIXOLOGIST = /datum/alt_title/mixologist) - -/datum/alt_title/barkeeper - title = JOB_ALT_BARKEEPR - -/datum/alt_title/barmaid - title = JOB_ALT_BARMAID - -/datum/alt_title/mixologist - title = JOB_ALT_MIXOLOGIST - - -/datum/job/chef - total_positions = 2 //IT TAKES A LOT TO MAKE A STEW - spawn_positions = 2 //A PINCH OF SALT AND LAUGHTER, TOO - pto_type = PTO_CIVILIAN - alt_titles = list(JOB_ALT_SOUSCHEF = /datum/alt_title/souschef, JOB_ALT_COOK = /datum/alt_title/cook, JOB_ALT_KITCHEN_WORKER = /datum/alt_title/kitchen_worker) - -/datum/alt_title/souschef - title = JOB_ALT_SOUSCHEF - -/datum/alt_title/kitchen_worker - title = JOB_ALT_KITCHEN_WORKER - title_blurb = "A " + JOB_ALT_KITCHEN_WORKER + " has the same duties, though they may be less experienced." - - -/datum/job/hydro - spawn_positions = 2 - pto_type = PTO_CIVILIAN - alt_titles = list(JOB_ALT_HYDROPONICIST = /datum/alt_title/hydroponicist, JOB_ALT_CULTIVATOR = /datum/alt_title/cultivator, JOB_ALT_FARMER = /datum/alt_title/farmer, - JOB_ALT_GARDENER = /datum/alt_title/gardener, JOB_ALT_FLORIST = /datum/alt_title/florsit, JOB_ALT_RANCHER = /datum/alt_title/rancher) - -/datum/alt_title/hydroponicist - title = JOB_ALT_HYDROPONICIST - -/datum/alt_title/cultivator - title = JOB_ALT_CULTIVATOR - -/datum/alt_title/farmer - title = JOB_ALT_FARMER - -/datum/alt_title/florsit - title = JOB_ALT_FLORIST - title_blurb = "A " + JOB_ALT_FLORIST + " may be less professional than their counterparts, and are more likely to tend to the public gardens if they aren't needed elsewhere." - -/datum/alt_title/rancher - title = JOB_ALT_RANCHER - title_blurb = "A " + JOB_ALT_RANCHER + " is tasked with the care, feeding, raising, and harvesting of livestock." - - -/datum/job/qm - pto_type = PTO_CARGO - dept_time_required = 20 - alt_titles = list(JOB_ALT_SUPPLY_CHIEF = /datum/alt_title/supply_chief, JOB_ALT_LOGISTICS_MANAGER = /datum/alt_title/logistics_manager, JOB_ALT_CARGO_SUPERVISOR = /datum/alt_title/cargo_supervisor) - -/datum/alt_title/logistics_manager - title = JOB_ALT_LOGISTICS_MANAGER - -/datum/alt_title/cargo_supervisor - title = JOB_ALT_CARGO_SUPERVISOR - -/datum/job/qm/get_request_reasons() - return list("Training crew") - - -/datum/job/cargo_tech - total_positions = 3 - spawn_positions = 3 - pto_type = PTO_CARGO - alt_titles = list(JOB_ALT_CARGO_LOADER = /datum/alt_title/cargo_loader, JOB_ALT_CARGO_HANDLER = /datum/alt_title/cargo_handler, JOB_ALT_SUPPLY_COURIER = /datum/alt_title/supply_courier, - JOB_ALT_DISPOSALS_SORTER = /datum/alt_title/disposal_sorter) - -/datum/alt_title/supply_courier - title = JOB_ALT_SUPPLY_COURIER - title_blurb = "A " + JOB_ALT_SUPPLY_COURIER + " is usually tasked with delivering packages or cargo directly to whoever requires it." - -/datum/alt_title/cargo_loader - title = JOB_ALT_CARGO_LOADER - title_blurb = "A " + JOB_ALT_CARGO_LOADER + " is usually tasked with more menial labor within Supply department, such as loading and unloading supply shuttle." - -/datum/alt_title/cargo_handler - title = JOB_ALT_CARGO_HANDLER - title_blurb = "A " + JOB_ALT_CARGO_HANDLER + " is usually tasked with more menial labor within Supply department, such as loading and unloading supply shuttle." - -/datum/alt_title/disposal_sorter - title = JOB_ALT_DISPOSALS_SORTER - title_blurb = "A " + JOB_ALT_DISPOSALS_SORTER + " is usually tasked with operating disposals delivery system, sorting the trash and tagging parcels for delivery." - - -/datum/job/mining - total_positions = 4 - spawn_positions = 4 - pto_type = PTO_CARGO - alt_titles = list(JOB_ALT_DEEP_SPACE_MINER = /datum/alt_title/deep_space_miner, JOB_ALT_DRILL_TECHNICIAN = /datum/alt_title/drill_tech, JOB_ALT_PROSPECTOR = /datum/alt_title/prospector, - JOB_ALT_EXCAVATOR = /datum/alt_title/excavator) - -/datum/alt_title/deep_space_miner - title = JOB_ALT_DEEP_SPACE_MINER - title_blurb = "A " + JOB_ALT_DEEP_SPACE_MINER + " specializes primarily in mining operations in zero-g environments, mostly in asteroid and debris fields." - -/datum/alt_title/prospector - title = JOB_ALT_PROSPECTOR - -/datum/alt_title/excavator - title = JOB_ALT_EXCAVATOR - -/datum/job/mining/get_request_reasons() - return list("Assembling expedition team") - - -/datum/job/janitor //Lots of janitor substations on station. - total_positions = 3 - spawn_positions = 3 - pto_type = PTO_CIVILIAN - alt_titles = list(JOB_ALT_CUSTODIAN = /datum/alt_title/custodian, JOB_ALT_SANITATION_TECHNICIAN = /datum/alt_title/sanitation_tech, - JOB_ALT_MAID = /datum/alt_title/maid, JOB_ALT_GARBAGE_COLLECTOR = /datum/alt_title/garbage_collector) - -/datum/alt_title/sanitation_tech - title = JOB_ALT_SANITATION_TECHNICIAN - -/datum/alt_title/maid - title = JOB_ALT_MAID - -/datum/alt_title/garbage_collector - title = JOB_ALT_GARBAGE_COLLECTOR - title_blurb = "A " + JOB_ALT_GARBAGE_COLLECTOR + " keeps the station clean, though focuses moreso on collecting larger trash, with wet cleaning being secondary task." - - -/datum/job/librarian - total_positions = 2 - spawn_positions = 2 - alt_titles = list(JOB_ALT_JOURNALIST = /datum/alt_title/journalist, JOB_ALT_REPORTER = /datum/alt_title/reporter, JOB_ALT_WRITER = /datum/alt_title/writer, - JOB_ALT_HISTORIAN = /datum/alt_title/historian, JOB_ALT_ARCHIVIST = /datum/alt_title/archivist, JOB_ALT_PROFESSOR = /datum/alt_title/professor, - JOB_ALT_ACADEMIC = /datum/alt_title/academic, JOB_ALT_PHILOSOPHER = /datum/alt_title/philosopher, JOB_ALT_CURATOR = /datum/alt_title/curator) - pto_type = PTO_CIVILIAN - -/datum/alt_title/reporter - title = JOB_ALT_REPORTER - title_blurb = "The " + JOB_ALT_REPORTER + " uses the Library as a base of operations, from which they can report the news and goings-on on the station with their camera." - -/datum/alt_title/historian - title = JOB_ALT_HISTORIAN - title_blurb = "The " + JOB_ALT_HISTORIAN + " uses the Library as a base of operation to record any important events occurring on station." - -/datum/alt_title/archivist - title = JOB_ALT_ARCHIVIST - title_blurb = "The " + JOB_ALT_ARCHIVIST + " uses the Library as a base of operation to record any important events occurring on station." - -/datum/alt_title/professor - title = JOB_ALT_PROFESSOR - title_blurb = "The " + JOB_ALT_PROFESSOR + " uses the Library as a base of operations to share their vast knowledge with the crew." - -/datum/alt_title/academic - title = JOB_ALT_ACADEMIC - title_blurb = "The " + JOB_ALT_ACADEMIC + " uses the Library as a base of operations to share their vast knowledge with the crew." - -/datum/alt_title/philosopher - title = JOB_ALT_PHILOSOPHER - title_blurb = "The " + JOB_ALT_PHILOSOPHER + " uses the Library as a base of operation to ruminate on nature of life and other great questions, and share their opinions with the crew." - -/datum/alt_title/curator - title = JOB_ALT_CURATOR - title_blurb = "The " + JOB_ALT_CURATOR + " uses the Library as a base of operation to gather the finest of art for display and preservation." - -/datum/job/lawyer - disallow_jobhop = TRUE - pto_type = PTO_CIVILIAN - alt_titles = list(JOB_ALT_INTERNAL_AFFAIRS_LIAISON = /datum/alt_title/ia_liaison, JOB_ALT_INTERNAL_AFFAIRS_DELEGATE = /datum/alt_title/ia_delegate, - JOB_ALT_INTERNAL_AFFAIRS_INVESTIGATOR = /datum/alt_title/ia_investigator) - -/datum/alt_title/ia_liaison - title = JOB_ALT_INTERNAL_AFFAIRS_LIAISON - -/datum/alt_title/ia_delegate - title = JOB_ALT_INTERNAL_AFFAIRS_DELEGATE - -/datum/alt_title/ia_investigator - title = JOB_ALT_INTERNAL_AFFAIRS_INVESTIGATOR - - -/datum/job/chaplain - pto_type = PTO_CIVILIAN - alt_titles = list(JOB_ALT_MISSIONARY = /datum/alt_title/missionary, JOB_ALT_PREACHER = /datum/alt_title/preacher, JOB_ALT_PRIEST = /datum/alt_title/priest, - JOB_ALT_NUN = /datum/alt_title/nun, JOB_ALT_MONK = /datum/alt_title/monk, JOB_ALT_COUNSELOR = /datum/alt_title/counselor, - JOB_ALT_GURU = /datum/alt_title/guru) - -/datum/alt_title/guru - title = JOB_ALT_GURU - title_blurb = "The " + JOB_ALT_GURU + " primarily tries to offer spiritual guidance to those who come seeking it." - -/datum/alt_title/missionary - title = JOB_ALT_MISSIONARY - -/datum/alt_title/preacher - title = JOB_ALT_PREACHER - -/datum/alt_title/priest - title = JOB_ALT_PRIEST - -/datum/alt_title/nun - title = JOB_ALT_NUN - -/datum/alt_title/monk - title = JOB_ALT_MONK - - -////////////////////////////////// -// Pilot -////////////////////////////////// - -/datum/job/pilot - title = JOB_PILOT - flag = PILOT - departments = list(DEPARTMENT_CIVILIAN) - department_flag = CIVILIAN - faction = FACTION_STATION - total_positions = 2 - spawn_positions = 2 - supervisors = "the " + JOB_HEAD_OF_PERSONNEL - selection_color = "#515151" - economic_modifier = 5 - minimal_player_age = 3 - pto_type = PTO_CIVILIAN - access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot) - minimal_access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot) - outfit_type = /decl/hierarchy/outfit/job/pilot - job_description = "A " + JOB_PILOT + " flies the various shuttles in the Virgo-Erigone System." - alt_titles = list(JOB_ALT_COPILOT = /datum/alt_title/co_pilot, JOB_ALT_NAVIGATOR = /datum/alt_title/navigator, JOB_ALT_HELMSMAN = /datum/alt_title/helmsman) - -/datum/alt_title/co_pilot - title = JOB_ALT_COPILOT - title_blurb = "A Co-" + JOB_ALT_COPILOT + " is there primarily to assist main pilot as well as learn from them" - -/datum/alt_title/navigator - title = JOB_ALT_NAVIGATOR - -/datum/alt_title/helmsman - title = JOB_ALT_HELMSMAN - -/datum/job/pilot/get_request_reasons() - return list("Assembling expedition team") - -////////////////////////////////// -// Entertainer -////////////////////////////////// - -/datum/job/entertainer - title = JOB_ENTERTAINER - flag = ENTERTAINER - departments = list(DEPARTMENT_CIVILIAN) - department_flag = CIVILIAN - faction = FACTION_STATION - total_positions = 4 - spawn_positions = 4 - supervisors = "the " + JOB_HEAD_OF_PERSONNEL - selection_color = "#515151" - access = list(access_entertainment) - minimal_access = list(access_entertainment) - pto_type = PTO_CIVILIAN - - outfit_type = /decl/hierarchy/outfit/job/assistant/entertainer - job_description = "An " + JOB_ENTERTAINER + " does just that, entertains! Put on plays, play music, sing songs, tell stories, or read your favorite fanfic." - alt_titles = list(JOB_ALT_PERFORMER = /datum/alt_title/performer, JOB_ALT_MUSICIAN = /datum/alt_title/musician, JOB_ALT_STAGEHAND = /datum/alt_title/stagehand, - JOB_ALT_ACTOR = /datum/alt_title/actor, JOB_ALT_DANCER = /datum/alt_title/dancer, JOB_ALT_SINGER = /datum/alt_title/singer, - JOB_ALT_MAGICIAN = /datum/alt_title/magician, JOB_ALT_COMEDIAN = /datum/alt_title/comedian, JOB_ALT_ARTIST = /datum/alt_title/tragedian, - JOB_ALT_ARTIST = /datum/alt_title/artist, JOB_ALT_GAME_MASTER = /datum/alt_title/game_master) - -// Entertainer Alt Titles -/datum/alt_title/actor - title = JOB_ALT_ACTOR - title_blurb = "An " + JOB_ALT_ACTOR + " is someone who acts out a role! Whatever sort of character it is, get into it and impress people with power of comedy and tragedy!" - -/datum/alt_title/performer - title = JOB_ALT_PERFORMER - title_blurb = "A " + JOB_ALT_PERFORMER + " is someone who performs! Whatever sort of performance will come to your mind, the world's a stage!" - -/datum/alt_title/musician - title = JOB_ALT_MUSICIAN - title_blurb = "A " + JOB_ALT_MUSICIAN + " is someone who makes music with a wide variety of musical instruments!" - -/datum/alt_title/stagehand - title = JOB_ALT_STAGEHAND - title_blurb = "A " + JOB_ALT_STAGEHAND + " typically performs everything the rest of the entertainers don't. Operate lights, shutters, windows, or narrate through your voicebox!" - -/datum/alt_title/dancer - title = JOB_ALT_DANCER - title_blurb = "A " + JOB_ALT_DANCER + " is someone who impresses people through power of their own body! From waltz to breakdance, as long as crowd as cheering!" - -/datum/alt_title/singer - title = JOB_ALT_SINGER - title_blurb = "A " + JOB_ALT_SINGER + " is someone with gift of melodious voice! Impress people with your vocal range!" - -/datum/alt_title/magician - title = JOB_ALT_MAGICIAN - title_blurb = "A " + JOB_ALT_MAGICIAN + " is someone who awes those around them with impossible! Show off your repertoire of magic tricks, while keeping the secret hidden!" - -/datum/alt_title/comedian - title = JOB_ALT_COMEDIAN - title_blurb = "A " + JOB_ALT_COMEDIAN + " will focus on making people laugh with the power of wit! Telling jokes, stand-up comedy, you are here to make others smile!" - -/datum/alt_title/tragedian - title = JOB_ALT_ARTIST - title_blurb = "A " + JOB_ALT_ARTIST + " will focus on making people think about life and world around them! Life is a tragedy, and who's better to convey its emotions than you?" - -/datum/alt_title/artist - title = JOB_ALT_ARTIST - title_blurb = "An " + JOB_ALT_ARTIST + "'s calling is to create beautiful arts! Whatever form may they take, create and have people astonished with your creativity." - -/datum/alt_title/game_master - title = JOB_ALT_GAME_MASTER - title_blurb = "A " + JOB_ALT_GAME_MASTER + " provides recreation for the crew by hosting variety of games. From cards to roleplaying to something more personalized." - -////////////////////////////////// -// Entrepreneur -////////////////////////////////// - -/datum/job/entrepreneur - title = JOB_ENTREPRENEUR - flag = ENTREPRENEUR - departments = list(DEPARTMENT_CIVILIAN) - department_flag = CIVILIAN - faction = FACTION_STATION - total_positions = 4 - spawn_positions = 4 - supervisors = "the " + JOB_HEAD_OF_PERSONNEL - selection_color = "#515151" - access = list() - minimal_access = list() - pto_type = PTO_CIVILIAN - - outfit_type = /decl/hierarchy/outfit/job/assistant/entrepreneur - job_description = "An " + JOB_ENTREPRENEUR + " is basically a visitor that obtained special permission to offer personal services to people on station. \ - They will offer people these services and, potentially, even demand payment!" - alt_titles = list(JOB_ALT_LAWYER = /datum/alt_title/lawyer, JOB_ALT_PRIVATE_EYE = /datum/alt_title/private_eye, JOB_ALT_BODYGUARD = /datum/alt_title/bodyguard, - JOB_ALT_PERSONAL_PHYSICIAN = /datum/alt_title/personal_physician, JOB_ALT_DENTIST = /datum/alt_title/dentist, JOB_ALT_FITNESS_INSTRUCTOR = /datum/alt_title/fitness_instructor, - JOB_ALT_YOGA_TEACHER = /datum/alt_title/yoga_teacher, JOB_ALT_MASSEUSE = /datum/alt_title/masseuse, JOB_ALT_TRADESPERSON = /datum/alt_title/tradesperson, - JOB_ALT_STREAMER = /datum/alt_title/streamer, JOB_ALT_INFLUENCER = /datum/alt_title/influencer, JOB_ALT_PARANORMAL_INVESTIGATOR = /datum/alt_title/paranormal_investigator, - JOB_ALT_PERSONAL_SECRETARY = /datum/alt_title/personal_secretary, JOB_ALT_STYLIST = /datum/alt_title/stylist, JOB_ALT_FISHER = /datum/alt_title/fisher, - JOB_ALT_FORTUNE_TELLER = /datum/alt_title/fortune_teller, JOB_ALT_SPIRIT_HEALER = /datum/alt_title/spirit_healer) - -/datum/alt_title/lawyer - title = JOB_ALT_LAWYER - title_blurb = "A " + JOB_ALT_LAWYER + " is knowledgable in various legal systems, including station's operations. They can try to offer their legal counsel, although nobody is really obliged to listen." - title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/personal_secretary - -/datum/alt_title/private_eye - title = JOB_ALT_PRIVATE_EYE - title_blurb = "A " + JOB_ALT_PRIVATE_EYE + " is a detective that has no credentials or equipment. But if someone wants something found without security's knowledge, they are the one to go to." - title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/private_eye - -/datum/alt_title/bodyguard - title = JOB_ALT_BODYGUARD - title_blurb = "A " + JOB_ALT_BODYGUARD + " offers service of personal protection. They may not be allowed any weapons, but their own body is weapon enough." - title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/bodyguard - -/datum/alt_title/personal_physician - title = JOB_ALT_PERSONAL_PHYSICIAN - title_blurb = "A " + JOB_ALT_PERSONAL_PHYSICIAN + " is a doctor dedicated less to Hippocratic Oath and more to the moneymaking grind. Their license may be expired, but the grindset never will be." - title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/personal_physician - -/datum/alt_title/dentist - title = JOB_ALT_DENTIST - title_blurb = "A " + JOB_ALT_DENTIST + " is a doctor that specializes in oral care. Company may not recognize them as a proper doctor, but surely their customers will." - title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/dentist - -/datum/alt_title/fitness_instructor - title = JOB_ALT_FITNESS_INSTRUCTOR - title_blurb = "A " + JOB_ALT_FITNESS_INSTRUCTOR + " dedicates themselves to improving the health of the crew through physical activity, and boy, do they need the help." - title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/fitness_instructor - -/datum/alt_title/yoga_teacher - title = JOB_ALT_YOGA_TEACHER - title_blurb = "A " + JOB_ALT_YOGA_TEACHER + " is similar to a fitness instructor, but rather than turning the round bodies into firm ones, they focus on helping people find balance and harmony." - title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/yoga_teacher - -/datum/alt_title/masseuse - title = JOB_ALT_MASSEUSE - title_blurb = "A " + JOB_ALT_MASSEUSE + " is master of physical therapy and working others' bodies with their hands." - title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/masseuse - -/datum/alt_title/tradesperson - title = JOB_ALT_TRADESPERSON - title_blurb = "A " + JOB_ALT_TRADESPERSON + " is someone attempting to make money via the most obvious act of all - buying and selling. Now if only customs allowed you to bring your goods along..." - title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/tradesperson - -/datum/alt_title/streamer - title = JOB_ALT_STREAMER - title_blurb = "A " + JOB_ALT_STREAMER + " is here to entertain. Not the crew! Their audience across exonet!" - title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/streamer - -/datum/alt_title/influencer - title = JOB_ALT_INFLUENCER - title_blurb = "An " + JOB_ALT_INFLUENCER + " has lucked out with some exonet following, and was given permission to go onstation to provide free exposure. Don't let it go to your head." - title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/influencer - -/datum/alt_title/paranormal_investigator - title = JOB_ALT_PARANORMAL_INVESTIGATOR - title_blurb = "A " + JOB_ALT_PARANORMAL_INVESTIGATOR + " looks beyond what is accepted by modern science, and searches for the true unknown. Aliens, alternate dimensions, ghosts... The truth is out there!" - title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/paranormal_investigator - -/datum/alt_title/personal_secretary - title = JOB_ALT_PERSONAL_SECRETARY - title_blurb = "A " + JOB_ALT_PERSONAL_SECRETARY + " offers services of general assistance. Although it's doubtful anyone will ever actually need those." - title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/personal_secretary - -/datum/alt_title/stylist - title = JOB_ALT_STYLIST - title_blurb = "A " + JOB_ALT_STYLIST + " offers fashion advice, as well as helps with adjusting appearance of the crew to better suit their beauty standards." - title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/stylist - -/datum/alt_title/fisher - title = JOB_ALT_FISHER - title_blurb = "A " + JOB_ALT_FISHER + " is a capable angler, who is good at obtaining large amounts of marine goods. Whether you generously give them to station or attempt to make a quick thaler by selling, it's up to you!" - title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/fisher - -/datum/alt_title/fortune_teller - title = JOB_ALT_FORTUNE_TELLER - title_blurb = "A " + JOB_ALT_FORTUNE_TELLER + " peers into the future, and offers these visions to others. Occasionally those visions may even come true!" - title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/fortune_teller - -/datum/alt_title/spirit_healer - title = JOB_ALT_SPIRIT_HEALER - title_blurb = "A " + JOB_ALT_SPIRIT_HEALER + " offers alternative forms of medicine. Rituals, magic rocks, seances... It totally works. What's that about placebo?" - title_outfit = /decl/hierarchy/outfit/job/assistant/entrepreneur/spirit_healer diff --git a/code/game/jobs/job/department.dm b/code/game/jobs/job/department.dm index 47d6de97ad..87ad819e24 100644 --- a/code/game/jobs/job/department.dm +++ b/code/game/jobs/job/department.dm @@ -60,7 +60,7 @@ name = "Miscellaneous" short_name = "Misc" color = "#666666" - sorting_order = 0 + sorting_order = -5 assignable = FALSE /datum/department/synthetic diff --git a/code/game/jobs/job/department_vr.dm b/code/game/jobs/job/department_vr.dm deleted file mode 100644 index 2af1d8e94f..0000000000 --- a/code/game/jobs/job/department_vr.dm +++ /dev/null @@ -1,6 +0,0 @@ -/datum/department/misc - name = "Off-Duty" - short_name = "Offduty" - color = "#666666" - sorting_order = -5 - assignable = FALSE \ No newline at end of file diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index 576739d659..c4a6b350f8 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -22,15 +22,20 @@ ideal_age_by_species = list(SPECIES_UNATHI = 140, "mechanical" = 20, SPECIES_HUMAN_VATBORN = 20) banned_job_species = list(SPECIES_TESHARI, SPECIES_DIONA, SPECIES_PROMETHEAN, SPECIES_ZADDAT, "digital") + disallow_jobhop = TRUE + pto_type = PTO_ENGINEERING + dept_time_required = 60 access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, - access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva, - access_heads, access_construction, access_sec_doors, - access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload) + access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva, + access_heads, access_construction, + access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload, access_gateway) + minimal_access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, - access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva, - access_heads, access_construction, access_sec_doors, - access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload) + access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva, + access_heads, access_construction, + access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload, access_gateway) + alt_titles = list(JOB_ALT_HEAD_ENGINEER = /datum/alt_title/head_engineer, JOB_ALT_FOREMAN = /datum/alt_title/foreman, JOB_ALT_MAINTENANCE_MANAGER = /datum/alt_title/maintenance_manager) minimal_player_age = 7 outfit_type = /decl/hierarchy/outfit/job/engineering/chief_engineer @@ -38,6 +43,18 @@ of manpower as much as they handle hands-on operations and repairs. They are also expected to keep the rest of the station informed of \ any structural threats to the station that may be hazardous to health or disruptive to work." +/datum/job/chief_engineer/get_request_reasons() + return list("Engine setup", "Construction project", "Repairs necessary", "Training crew", "Assembling expedition team") + +/datum/alt_title/head_engineer + title = JOB_ALT_HEAD_ENGINEER + +/datum/alt_title/foreman + title = JOB_ALT_FOREMAN + +/datum/alt_title/maintenance_manager + title = JOB_ALT_MAINTENANCE_MANAGER + ////////////////////////////////// // Engineer ////////////////////////////////// @@ -52,10 +69,12 @@ supervisors = "the "+ JOB_CHIEF_ENGINEER selection_color = "#5B4D20" economic_modifier = 5 + pto_type = PTO_ENGINEERING + access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics) minimal_access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction) - alt_titles = list(JOB_ALT_MAINTENANCE_TECHNICIAN = /datum/alt_title/maint_tech, - JOB_ALT_ENGINE_TECHNICIAN = /datum/alt_title/engine_tech, JOB_ALT_ELECTRICIAN = /datum/alt_title/electrician) + alt_titles = list(JOB_ALT_MAINTENANCE_TECHNICIAN = /datum/alt_title/maint_tech, JOB_ALT_ENGINE_TECHNICIAN = /datum/alt_title/engine_tech, + JOB_ALT_ELECTRICIAN = /datum/alt_title/electrician, JOB_ALT_CONSTRUCTION_ENGINEER = /datum/alt_title/construction_engi, JOB_ALT_ENGINEERING_CONTRACTOR = /datum/alt_title/engineering_contractor, JOB_ALT_COMPUTER_TECHNICIAN = /datum/alt_title/computer_tech) minimal_player_age = 3 min_age_by_species = list(SPECIES_PROMETHEAN = 2) @@ -64,6 +83,9 @@ job_description = "An " + JOB_ENGINEER + " keeps the station running. They repair damages, keep the atmosphere stable, and ensure that power is being \ generated and distributed. On quiet shifts, they may be called upon to make cosmetic alterations to the station." +/datum/job/engineer/get_request_reasons() + return list("Engine setup", "Construction project", "Repairs necessary", "Assembling expedition team") + // Engineer Alt Titles /datum/alt_title/maint_tech title = JOB_ALT_MAINTENANCE_TECHNICIAN @@ -80,6 +102,23 @@ title_blurb = "An " + JOB_ALT_ELECTRICIAN + "'s primary duty is making sure power is properly distributed thoughout the station, utilizing solars, substations, and other \ methods to ensure every department has power in an emergency." +/datum/alt_title/construction_engi + title = JOB_ALT_CONSTRUCTION_ENGINEER + title_blurb = "A " + JOB_ALT_CONSTRUCTION_ENGINEER + " fulfills similar duties to other engineers, but usually occupies spare time with construction of extra facilities in dedicated areas or \ + as additions to station layout." + +/datum/alt_title/engineering_contractor + title = JOB_ALT_ENGINEERING_CONTRACTOR + title_blurb = "An " + JOB_ALT_ENGINEERING_CONTRACTOR + " fulfills similar duties to other engineers, but isn't directly employed by NT proper." + +/datum/alt_title/computer_tech + title = JOB_ALT_COMPUTER_TECHNICIAN + title_blurb = "A " + JOB_ALT_COMPUTER_TECHNICIAN + " fulfills similar duties to other engineers, but specializes in working with software and computers. They also often deal with integrated circuits." + +/datum/alt_title/salvage_tech + title = JOB_ALT_SALVAGE_TECHNICIAN + title_blurb = "A " + JOB_ALT_SALVAGE_TECHNICIAN + " is responsible for breaking down debris and obsolete equipment to recover useful components and materials." + ////////////////////////////////// // Atmos Tech ////////////////////////////////// @@ -90,16 +129,36 @@ department_flag = ENGSEC faction = FACTION_STATION total_positions = 3 - spawn_positions = 2 + spawn_positions = 3 + pto_type = PTO_ENGINEERING supervisors = "the " + JOB_CHIEF_ENGINEER selection_color = "#5B4D20" economic_modifier = 5 access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_external_airlocks) minimal_access = list(access_eva, access_engine, access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction, access_external_airlocks) + alt_titles = list(JOB_ALT_ATMOSPHERIC_ENGINEER = /datum/alt_title/atmos_engi, JOB_ALT_ATMOSPHERIC_MAINTAINER = /datum/alt_title/atmos_maint, JOB_ALT_DISPOSALS_TECHNICIAN = /datum/alt_title/disposals_tech, + JOB_ALT_FUEL_TECHNICIAN = /datum/alt_title/refuel_tech) + minimal_player_age = 3 min_age_by_species = list(SPECIES_PROMETHEAN = 2) outfit_type = /decl/hierarchy/outfit/job/engineering/atmos job_description = "An " + JOB_ATMOSPHERIC_TECHNICIAN + " is primarily concerned with keeping the station's atmosphere breathable. They are expected to have a good \ understanding of the pipes, vents, and scrubbers that move gasses around the station, and to be familiar with proper firefighting procedure." + +/datum/job/atmos/get_request_reasons() + return list("Construction project", "Repairs necessary", "Assembling expedition team") + +/datum/alt_title/refuel_tech + title = JOB_ALT_FUEL_TECHNICIAN + +/datum/alt_title/atmos_maint + title = JOB_ALT_ATMOSPHERIC_MAINTAINER + +/datum/alt_title/atmos_engi + title = JOB_ALT_ATMOSPHERIC_ENGINEER + +/datum/alt_title/disposals_tech + title = JOB_ALT_DISPOSALS_TECHNICIAN + title_blurb = "A " + JOB_ALT_DISPOSALS_TECHNICIAN + " is an " + JOB_ATMOSPHERIC_TECHNICIAN + " still and can fulfill all the same duties, although specializes more in disposals delivery system's operations and configurations." diff --git a/code/game/jobs/job/engineering_vr.dm b/code/game/jobs/job/engineering_vr.dm deleted file mode 100644 index 17b70731db..0000000000 --- a/code/game/jobs/job/engineering_vr.dm +++ /dev/null @@ -1,71 +0,0 @@ -/datum/job/chief_engineer - disallow_jobhop = TRUE - pto_type = PTO_ENGINEERING - dept_time_required = 60 - - access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, - access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva, - access_heads, access_construction, - access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload, access_gateway) - - minimal_access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, - access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva, - access_heads, access_construction, - access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload, access_gateway) - alt_titles = list(JOB_ALT_HEAD_ENGINEER = /datum/alt_title/head_engineer, JOB_ALT_FOREMAN = /datum/alt_title/foreman, JOB_ALT_MAINTENANCE_MANAGER = /datum/alt_title/maintenance_manager) - -/datum/alt_title/head_engineer - title = JOB_ALT_HEAD_ENGINEER - -/datum/alt_title/foreman - title = JOB_ALT_FOREMAN - -/datum/alt_title/maintenance_manager - title = JOB_ALT_MAINTENANCE_MANAGER - -/datum/job/chief_engineer/get_request_reasons() - return list("Engine setup", "Construction project", "Repairs necessary", "Training crew", "Assembling expedition team") - - -/datum/job/engineer - pto_type = PTO_ENGINEERING - alt_titles = list(JOB_ALT_MAINTENANCE_TECHNICIAN = /datum/alt_title/maint_tech, JOB_ALT_ENGINE_TECHNICIAN = /datum/alt_title/engine_tech, - JOB_ALT_ELECTRICIAN = /datum/alt_title/electrician, JOB_ALT_CONSTRUCTION_ENGINEER = /datum/alt_title/construction_engi, JOB_ALT_ENGINEERING_CONTRACTOR = /datum/alt_title/engineering_contractor, JOB_ALT_COMPUTER_TECHNICIAN = /datum/alt_title/computer_tech) - -/datum/alt_title/construction_engi - title = JOB_ALT_CONSTRUCTION_ENGINEER - title_blurb = "A " + JOB_ALT_CONSTRUCTION_ENGINEER + " fulfills similar duties to other engineers, but usually occupies spare time with construction of extra facilities in dedicated areas or \ - as additions to station layout." - -/datum/alt_title/engineering_contractor - title = JOB_ALT_ENGINEERING_CONTRACTOR - title_blurb = "An " + JOB_ALT_ENGINEERING_CONTRACTOR + " fulfills similar duties to other engineers, but isn't directly employed by NT proper." - -/datum/job/engineer/get_request_reasons() - return list("Engine setup", "Construction project", "Repairs necessary", "Assembling expedition team") - -/datum/alt_title/computer_tech - title = JOB_ALT_COMPUTER_TECHNICIAN - title_blurb = "A " + JOB_ALT_COMPUTER_TECHNICIAN + " fulfills similar duties to other engineers, but specializes in working with software and computers. They also often deal with integrated circuits." - -/datum/job/atmos - spawn_positions = 3 - pto_type = PTO_ENGINEERING - alt_titles = list(JOB_ALT_ATMOSPHERIC_ENGINEER = /datum/alt_title/atmos_engi, JOB_ALT_ATMOSPHERIC_MAINTAINER = /datum/alt_title/atmos_maint, JOB_ALT_DISPOSALS_TECHNICIAN = /datum/alt_title/disposals_tech, - JOB_ALT_FUEL_TECHNICIAN = /datum/alt_title/refuel_tech) - -/datum/alt_title/atmos_maint - title = JOB_ALT_ATMOSPHERIC_MAINTAINER - -/datum/alt_title/atmos_engi - title = JOB_ALT_ATMOSPHERIC_ENGINEER - -/datum/alt_title/disposals_tech - title = JOB_ALT_DISPOSALS_TECHNICIAN - title_blurb = "A " + JOB_ALT_DISPOSALS_TECHNICIAN + " is an " + JOB_ATMOSPHERIC_TECHNICIAN + " still and can fulfill all the same duties, although specializes more in disposals delivery system's operations and configurations." - -/datum/alt_title/refuel_tech - title = JOB_ALT_FUEL_TECHNICIAN - -/datum/job/atmos/get_request_reasons() - return list("Construction project", "Repairs necessary", "Assembling expedition team") diff --git a/code/game/jobs/job/exploration_vr.dm b/code/game/jobs/job/exploration.dm similarity index 100% rename from code/game/jobs/job/exploration_vr.dm rename to code/game/jobs/job/exploration.dm diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index b191d67072..d01d60e4be 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -39,6 +39,29 @@ // Description of the job's role and minimum responsibilities. var/job_description = "This Job doesn't have a description! Please report it!" + //Requires a ckey to be whitelisted in jobwhitelist.txt + var/whitelist_only = 0 + + //Does not display this job on the occupation setup screen + var/latejoin_only = 0 + + //Every hour playing this role gains this much time off. (Can be negative for off duty jobs!) + var/timeoff_factor = 3 + + //What type of PTO is that job earning? + var/pto_type + + //Disallow joining as this job midround from off-duty position via going on-duty + var/disallow_jobhop = FALSE + + //Time required in the department as other jobs before playing this one (in hours) + var/dept_time_required = 0 + + //Do we forbid ourselves from earning PTO? + var/playtime_only = FALSE + + var/requestable = TRUE + /datum/job/New() . = ..() department_accounts = department_accounts || departments_managed @@ -184,3 +207,47 @@ if(brain_type in banned_job_species) return TRUE */ + + +// Check client-specific availability rules. +/datum/job/proc/player_has_enough_pto(client/C) + return timeoff_factor >= 0 || (C && LAZYACCESS(C.department_hours, pto_type) > 0) + +/datum/job/proc/player_has_enough_playtime(client/C) + return (available_in_playhours(C) == 0) + +/datum/job/proc/available_in_playhours(client/C) + if(C && CONFIG_GET(flag/use_playtime_restriction_for_jobs) && dept_time_required) + if(isnum(C.play_hours[pto_type])) // Has played that department before + return max(0, dept_time_required - C.play_hours[pto_type]) + else // List doesn't have that entry, maybe never played, maybe invalid PTO type (you should fix that...) + return dept_time_required // Could be 0, too, which is fine! They can play that + return 0 + +// Special treatment for some the more complicated heads + +// Captain gets every department combined +/datum/job/captain/available_in_playhours(client/C) + if(C && CONFIG_GET(flag/use_playtime_restriction_for_jobs) && dept_time_required) + var/remaining_time_needed = dept_time_required + for(var/key in C.play_hours) + if(isnum(C.play_hours[key]) && !(key == PTO_TALON)) + remaining_time_needed = max(0, remaining_time_needed - C.play_hours[key]) + return remaining_time_needed + return 0 + +// HoP gets civilian, cargo, and exploration combined +/datum/job/hop/available_in_playhours(client/C) + if(C && CONFIG_GET(flag/use_playtime_restriction_for_jobs) && dept_time_required) + var/remaining_time_needed = dept_time_required + if(isnum(C.play_hours[PTO_CIVILIAN])) + remaining_time_needed = max(0, remaining_time_needed - C.play_hours[PTO_CIVILIAN]) + if(isnum(C.play_hours[PTO_CARGO])) + remaining_time_needed = max(0, remaining_time_needed - C.play_hours[PTO_CARGO]) + if(isnum(C.play_hours[PTO_EXPLORATION])) + remaining_time_needed = max(0, remaining_time_needed - C.play_hours[PTO_EXPLORATION]) + return remaining_time_needed + return 0 + +/datum/job/proc/get_request_reasons() + return list() diff --git a/code/game/jobs/job/job_vr.dm b/code/game/jobs/job/job_vr.dm deleted file mode 100644 index 3796714b5e..0000000000 --- a/code/game/jobs/job/job_vr.dm +++ /dev/null @@ -1,66 +0,0 @@ -/datum/job - //Requires a ckey to be whitelisted in jobwhitelist.txt - var/whitelist_only = 0 - - //Does not display this job on the occupation setup screen - var/latejoin_only = 0 - - //Every hour playing this role gains this much time off. (Can be negative for off duty jobs!) - var/timeoff_factor = 3 - - //What type of PTO is that job earning? - var/pto_type - - //Disallow joining as this job midround from off-duty position via going on-duty - var/disallow_jobhop = FALSE - - //Time required in the department as other jobs before playing this one (in hours) - var/dept_time_required = 0 - - //Do we forbid ourselves from earning PTO? - var/playtime_only = FALSE - - var/requestable = TRUE - -// Check client-specific availability rules. -/datum/job/proc/player_has_enough_pto(client/C) - return timeoff_factor >= 0 || (C && LAZYACCESS(C.department_hours, pto_type) > 0) - -/datum/job/proc/player_has_enough_playtime(client/C) - return (available_in_playhours(C) == 0) - -/datum/job/proc/available_in_playhours(client/C) - if(C && CONFIG_GET(flag/use_playtime_restriction_for_jobs) && dept_time_required) - if(isnum(C.play_hours[pto_type])) // Has played that department before - return max(0, dept_time_required - C.play_hours[pto_type]) - else // List doesn't have that entry, maybe never played, maybe invalid PTO type (you should fix that...) - return dept_time_required // Could be 0, too, which is fine! They can play that - return 0 - -// Special treatment for some the more complicated heads - -// Captain gets every department combined -/datum/job/captain/available_in_playhours(client/C) - if(C && CONFIG_GET(flag/use_playtime_restriction_for_jobs) && dept_time_required) - var/remaining_time_needed = dept_time_required - for(var/key in C.play_hours) - if(isnum(C.play_hours[key]) && !(key == PTO_TALON)) - remaining_time_needed = max(0, remaining_time_needed - C.play_hours[key]) - return remaining_time_needed - return 0 - -// HoP gets civilian, cargo, and exploration combined -/datum/job/hop/available_in_playhours(client/C) - if(C && CONFIG_GET(flag/use_playtime_restriction_for_jobs) && dept_time_required) - var/remaining_time_needed = dept_time_required - if(isnum(C.play_hours[PTO_CIVILIAN])) - remaining_time_needed = max(0, remaining_time_needed - C.play_hours[PTO_CIVILIAN]) - if(isnum(C.play_hours[PTO_CARGO])) - remaining_time_needed = max(0, remaining_time_needed - C.play_hours[PTO_CARGO]) - if(isnum(C.play_hours[PTO_EXPLORATION])) - remaining_time_needed = max(0, remaining_time_needed - C.play_hours[PTO_EXPLORATION]) - return remaining_time_needed - return 0 - -/datum/job/proc/get_request_reasons() - return list() diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 9298028eb9..c8a96efad9 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -16,11 +16,13 @@ req_admin_notify = 1 economic_modifier = 10 access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads, - access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce, - access_keycard_auth, access_sec_doors, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels) + access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce, + access_keycard_auth, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels, access_gateway) + minimal_access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads, - access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce, - access_keycard_auth, access_sec_doors, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels) + access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce, + access_keycard_auth, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels, access_gateway) + alt_titles = list(JOB_ALT_CHIEF_PHYSICIAN = /datum/alt_title/chief_physician, JOB_ALT_MEDICAL_DIRECTOR = /datum/alt_title/medical_director, JOB_ALT_HEALTHCARE_MANAGER = /datum/alt_title/healthcare_manager) minimum_character_age = 25 min_age_by_species = list(SPECIES_UNATHI = 70, "mechanical" = 10, SPECIES_HUMAN_VATBORN = 14) @@ -29,12 +31,28 @@ ideal_age_by_species = list(SPECIES_UNATHI = 140, "mechanical" = 20, SPECIES_HUMAN_VATBORN = 20) banned_job_species = list(SPECIES_TESHARI, SPECIES_DIONA, SPECIES_PROMETHEAN, SPECIES_ZADDAT, "digital") + disallow_jobhop = TRUE + pto_type = PTO_MEDICAL + dept_time_required = 60 + outfit_type = /decl/hierarchy/outfit/job/medical/cmo job_description = "The CMO manages the Medical department and is a position requiring experience and skill; their goal is to ensure that their \ staff keep the station's crew healthy and whole. They are primarily interested in making sure that patients are safely found and \ transported to Medical for treatment. They are expected to keep the crew informed about threats to their health and safety, and \ about the importance of Suit Sensors." +/datum/job/cmo/get_request_reasons() + return list("Surgery pending", "Viral outbreak", "Training crew", "Assembling expedition team") + +/datum/alt_title/chief_physician + title = JOB_ALT_CHIEF_PHYSICIAN + +/datum/alt_title/medical_director + title = JOB_ALT_MEDICAL_DIRECTOR + +/datum/alt_title/healthcare_manager + title = JOB_ALT_HEALTHCARE_MANAGER + ////////////////////////////////// // Medical Doctor ////////////////////////////////// @@ -45,7 +63,8 @@ department_flag = MEDSCI faction = FACTION_STATION total_positions = 5 - spawn_positions = 3 + spawn_positions = 5 + pto_type = PTO_MEDICAL supervisors = "the " + JOB_CHIEF_MEDICAL_OFFICER selection_color = "#013D3B" economic_modifier = 7 @@ -55,14 +74,15 @@ job_description = "A " + JOB_MEDICAL_DOCTOR + " is a Jack-of-All-Trades Medical title, covering a variety of skill levels and minor specializations. They are likely \ familiar with basic first aid, and a number of accompanying medications, and can generally save, if not cure, a majority of the \ patients they encounter." - alt_titles = list( - JOB_ALT_SURGEON = /datum/alt_title/surgeon, - JOB_ALT_EMERGENCY_PHYSICIAN = /datum/alt_title/emergency_physician, - JOB_ALT_NURSE = /datum/alt_title/nurse, - JOB_ALT_VIROLOGIST = /datum/alt_title/virologist) + alt_titles = list(JOB_ALT_PHYSICIAN = /datum/alt_title/physician, JOB_ALT_MEDICAL_PRACTITIONER = /datum/alt_title/medical_practitioner, JOB_ALT_SURGEON = /datum/alt_title/surgeon, + JOB_ALT_EMERGENCY_PHYSICIAN = /datum/alt_title/emergency_physician, JOB_ALT_NURSE = /datum/alt_title/nurse, JOB_ALT_ORDERLY = /datum/alt_title/orderly, + JOB_ALT_VIROLOGIST = /datum/alt_title/virologist, JOB_ALT_MEDICAL_CONTRACTOR = /datum/alt_title/medical_contractor) min_age_by_species = list(SPECIES_PROMETHEAN = 3) +/datum/job/doctor/get_request_reasons() + return list("Surgery pending", "Viral outbreak", "Assembling expedition team") + //Medical Doctor Alt Titles /datum/alt_title/surgeon title = JOB_ALT_SURGEON @@ -90,7 +110,22 @@ to produce the various types of virus foods or mutagens." title_outfit = /decl/hierarchy/outfit/job/medical/doctor/virologist -//Chemist is a medical job damnit //YEAH FUCK YOU SCIENCE -Pete //Guys, behave -Erro +/datum/alt_title/physician + title = JOB_ALT_PHYSICIAN + +/datum/alt_title/medical_practitioner + title = JOB_ALT_MEDICAL_PRACTITIONER + +/datum/alt_title/orderly + title = JOB_ALT_ORDERLY + title_blurb = "An " + JOB_ALT_ORDERLY + " acts as Medbay's general helping hand, assisting any doctor that might need some form of help, as well as handling manual \ + and dirty labor around the department." + title_outfit = /decl/hierarchy/outfit/job/medical/doctor/nurse + +/datum/alt_title/medical_contractor + title = JOB_ALT_MEDICAL_CONTRACTOR + title_blurb = "A " + JOB_ALT_MEDICAL_CONTRACTOR + " can be anything from a full-blown doctor to the likes of a nurse or orderly, but isn't directly employed by NT proper." + ////////////////////////////////// // Chemist ////////////////////////////////// @@ -102,6 +137,7 @@ faction = FACTION_STATION total_positions = 2 spawn_positions = 2 + pto_type = PTO_MEDICAL supervisors = "the " + JOB_CHIEF_MEDICAL_OFFICER selection_color = "#013D3B" economic_modifier = 5 @@ -113,13 +149,17 @@ outfit_type = /decl/hierarchy/outfit/job/medical/chemist job_description = "A " + JOB_CHEMIST + " produces and maintains a stock of basic to advanced chemicals for medical and occasionally research use. \ They are likely to know the use and dangers of many lab-produced chemicals." - alt_titles = list(JOB_ALT_PHARMACIST = /datum/alt_title/pharmacist) + alt_titles = list(JOB_ALT_PHARMACIST = /datum/alt_title/pharmacist, JOB_ALT_PHARMACOLOGIST = /datum/alt_title/pharmacologist) // Chemist Alt Titles /datum/alt_title/pharmacist title = JOB_ALT_PHARMACIST title_blurb = "A " + JOB_ALT_PHARMACIST + " focuses on the chemical needs of the Medical Department, and often offers to fill crew prescriptions at their discretion." +/datum/alt_title/pharmacologist + title = JOB_ALT_PHARMACOLOGIST + title_blurb = "A " + JOB_ALT_PHARMACOLOGIST + " focuses on the chemical needs of the Medical Department, primarily specializing in producing more advanced forms of medicine." + /* I'm commenting out Geneticist so you can't actually see it in the job menu, given that you can't play as one - Jon. ////////////////////////////////// // Geneticist @@ -154,6 +194,7 @@ faction = FACTION_STATION total_positions = 1 spawn_positions = 1 + pto_type = PTO_MEDICAL economic_modifier = 5 supervisors = "the " + JOB_CHIEF_MEDICAL_OFFICER selection_color = "#013D3B" @@ -162,7 +203,7 @@ outfit_type = /decl/hierarchy/outfit/job/medical/psychiatrist job_description = "A " + JOB_PSYCHIATRIST + " provides mental health services to crew members in need. They may also be called upon to determine whatever \ ails the mentally unwell, frequently under Security supervision. They understand the effects of various psychoactive drugs." - alt_titles = list(JOB_ALT_PSYCHOLOGIST = /datum/alt_title/psychologist) + alt_titles = list(JOB_ALT_PSYCHOLOGIST = /datum/alt_title/psychologist, JOB_ALT_PSYCHOANALYST = /datum/alt_title/psychoanalyst, JOB_ALT_PSYCHOTHERAPIST = /datum/alt_title/psychotherapist) banned_job_species = list(SPECIES_PROMETHEAN, SPECIES_DIONA) //Psychiatrist Alt Titles @@ -172,6 +213,18 @@ called upon to determine whatever ails the mentally unwell, frequently under Security supervision." title_outfit = /decl/hierarchy/outfit/job/medical/psychiatrist/psychologist +/datum/alt_title/psychoanalyst + title = JOB_ALT_PSYCHOANALYST + title_blurb = "A " + JOB_ALT_PSYCHOANALYST + " provides mental health services to crew members in need, focusing more on therapy than medication. They may also be \ + called upon to determine whatever ails the mentally unwell, frequently under Security supervision." + title_outfit = /decl/hierarchy/outfit/job/medical/psychiatrist/psychologist + +/datum/alt_title/psychotherapist + title = JOB_ALT_PSYCHOTHERAPIST + title_blurb = "A " + JOB_ALT_PSYCHOTHERAPIST + " provides mental health services to crew members in need, focusing more on therapy than medication. They may also be \ + called upon to determine whatever ails the mentally unwell, frequently under Security supervision." + title_outfit = /decl/hierarchy/outfit/job/medical/psychiatrist/psychologist + ////////////////////////////////// // Paramedic ////////////////////////////////// @@ -181,8 +234,9 @@ departments = list(DEPARTMENT_MEDICAL) department_flag = MEDSCI faction = FACTION_STATION - total_positions = 2 - spawn_positions = 2 + total_positions = 3 + spawn_positions = 3 + pto_type = PTO_MEDICAL supervisors = "the " + JOB_CHIEF_MEDICAL_OFFICER selection_color = "#013D3B" economic_modifier = 4 @@ -191,14 +245,26 @@ outfit_type = /decl/hierarchy/outfit/job/medical/paramedic job_description = "A " + JOB_PARAMEDIC + " is primarily concerned with the recovery of patients who are unable to make it to the Medical Department on their own. \ They may also be called upon to keep patients stable when Medical is busy or understaffed." - alt_titles = list(JOB_ALT_EMERGENCY_MEDICAL_TECHNICIAN = /datum/alt_title/emt) + alt_titles = list(JOB_ALT_EMERGENCY_MEDICAL_TECHNICIAN = /datum/alt_title/emt, JOB_ALT_MEDICAL_RESPONDER = /datum/alt_title/medical_responder, JOB_ALT_SEARCH_AND_RESCUE = /datum/alt_title/sar) banned_job_species = list(SPECIES_DIONA) min_age_by_species = list(SPECIES_PROMETHEAN = 2) +/datum/job/paramedic/get_request_reasons() + return list("Assembling expedition team") + // Paramedic Alt Titles /datum/alt_title/emt title = JOB_ALT_EMERGENCY_MEDICAL_TECHNICIAN title_blurb = "An " + JOB_ALT_EMERGENCY_MEDICAL_TECHNICIAN + " is primarily concerned with the recovery of patients who are unable to make it to the Medical Department on their \ own. They are capable of keeping a patient stabilized until they reach the hands of someone with more training." title_outfit = /decl/hierarchy/outfit/job/medical/paramedic/emt + +/datum/alt_title/medical_responder + title = JOB_ALT_MEDICAL_RESPONDER + title_blurb = "A " + JOB_ALT_MEDICAL_RESPONDER + " is primarily concerned with the recovery of patients who are unable to make it to the Medical Department on their \ + own. They are capable of keeping a patient stabilized until they reach the hands of someone with more training." + title_outfit = /decl/hierarchy/outfit/job/medical/paramedic/emt + +/datum/alt_title/sar + title = JOB_ALT_SEARCH_AND_RESCUE diff --git a/code/game/jobs/job/medical_vr.dm b/code/game/jobs/job/medical_vr.dm deleted file mode 100644 index 9d08fdfcf2..0000000000 --- a/code/game/jobs/job/medical_vr.dm +++ /dev/null @@ -1,97 +0,0 @@ -/datum/job/cmo - disallow_jobhop = TRUE - pto_type = PTO_MEDICAL - dept_time_required = 60 - - access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads, - access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce, - access_keycard_auth, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels, access_gateway) - - minimal_access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads, - access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce, - access_keycard_auth, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels, access_gateway) - alt_titles = list(JOB_ALT_CHIEF_PHYSICIAN = /datum/alt_title/chief_physician, JOB_ALT_MEDICAL_DIRECTOR = /datum/alt_title/medical_director, JOB_ALT_HEALTHCARE_MANAGER = /datum/alt_title/healthcare_manager) - -/datum/alt_title/chief_physician - title = JOB_ALT_CHIEF_PHYSICIAN - -/datum/alt_title/medical_director - title = JOB_ALT_MEDICAL_DIRECTOR - -/datum/alt_title/healthcare_manager - title = JOB_ALT_HEALTHCARE_MANAGER - -/datum/job/cmo/get_request_reasons() - return list("Surgery pending", "Viral outbreak", "Training crew", "Assembling expedition team") - - -/datum/job/doctor - spawn_positions = 5 - pto_type = PTO_MEDICAL - alt_titles = list(JOB_ALT_PHYSICIAN = /datum/alt_title/physician, JOB_ALT_MEDICAL_PRACTITIONER = /datum/alt_title/medical_practitioner, JOB_ALT_SURGEON = /datum/alt_title/surgeon, - JOB_ALT_EMERGENCY_PHYSICIAN = /datum/alt_title/emergency_physician, JOB_ALT_NURSE = /datum/alt_title/nurse, JOB_ALT_ORDERLY = /datum/alt_title/orderly, - JOB_ALT_VIROLOGIST = /datum/alt_title/virologist, JOB_ALT_MEDICAL_CONTRACTOR = /datum/alt_title/medical_contractor) - -/datum/alt_title/physician - title = JOB_ALT_PHYSICIAN - -/datum/alt_title/medical_practitioner - title = JOB_ALT_MEDICAL_PRACTITIONER - -/datum/alt_title/orderly - title = JOB_ALT_ORDERLY - title_blurb = "An " + JOB_ALT_ORDERLY + " acts as Medbay's general helping hand, assisting any doctor that might need some form of help, as well as handling manual \ - and dirty labor around the department." - title_outfit = /decl/hierarchy/outfit/job/medical/doctor/nurse - -/datum/alt_title/medical_contractor - title = JOB_ALT_MEDICAL_CONTRACTOR - title_blurb = "A " + JOB_ALT_MEDICAL_CONTRACTOR + " can be anything from a full-blown doctor to the likes of a nurse or orderly, but isn't directly employed by NT proper." - -/datum/job/doctor/get_request_reasons() - return list("Surgery pending", "Viral outbreak", "Assembling expedition team") - - -/datum/job/chemist - pto_type = PTO_MEDICAL - alt_titles = list(JOB_ALT_PHARMACIST = /datum/alt_title/pharmacist, JOB_ALT_PHARMACOLOGIST = /datum/alt_title/pharmacologist) - -/datum/alt_title/pharmacologist - title = JOB_ALT_PHARMACOLOGIST - title_blurb = "A " + JOB_ALT_PHARMACOLOGIST + " focuses on the chemical needs of the Medical Department, primarily specializing in producing more advanced forms of medicine." - - -/datum/job/psychiatrist - pto_type = PTO_MEDICAL - alt_titles = list(JOB_ALT_PSYCHOLOGIST = /datum/alt_title/psychologist, JOB_ALT_PSYCHOANALYST = /datum/alt_title/psychoanalyst, JOB_ALT_PSYCHOTHERAPIST = /datum/alt_title/psychotherapist) - -/datum/alt_title/psychoanalyst - title = JOB_ALT_PSYCHOANALYST - title_blurb = "A " + JOB_ALT_PSYCHOANALYST + " provides mental health services to crew members in need, focusing more on therapy than medication. They may also be \ - called upon to determine whatever ails the mentally unwell, frequently under Security supervision." - title_outfit = /decl/hierarchy/outfit/job/medical/psychiatrist/psychologist - -/datum/alt_title/psychotherapist - title = JOB_ALT_PSYCHOTHERAPIST - title_blurb = "A " + JOB_ALT_PSYCHOTHERAPIST + " provides mental health services to crew members in need, focusing more on therapy than medication. They may also be \ - called upon to determine whatever ails the mentally unwell, frequently under Security supervision." - title_outfit = /decl/hierarchy/outfit/job/medical/psychiatrist/psychologist - - -/datum/job/paramedic - pto_type = PTO_MEDICAL - alt_titles = list(JOB_ALT_EMERGENCY_MEDICAL_TECHNICIAN = /datum/alt_title/emt, JOB_ALT_MEDICAL_RESPONDER = /datum/alt_title/medical_responder, JOB_ALT_SEARCH_AND_RESCUE = /datum/alt_title/sar) - total_positions = 3 - spawn_positions = 3 - -/datum/alt_title/medical_responder - title = JOB_ALT_MEDICAL_RESPONDER - title_blurb = "A " + JOB_ALT_MEDICAL_RESPONDER + " is primarily concerned with the recovery of patients who are unable to make it to the Medical Department on their \ - own. They are capable of keeping a patient stabilized until they reach the hands of someone with more training." - title_outfit = /decl/hierarchy/outfit/job/medical/paramedic/emt - -/datum/alt_title/sar - title = JOB_ALT_SEARCH_AND_RESCUE - -/datum/job/paramedic/get_request_reasons() - return list("Assembling expedition team") diff --git a/code/game/jobs/job/offduty_vr.dm b/code/game/jobs/job/offduty.dm similarity index 100% rename from code/game/jobs/job/offduty_vr.dm rename to code/game/jobs/job/offduty.dm diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index c67dbe59ad..a7d158ec30 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -16,13 +16,13 @@ req_admin_notify = 1 economic_modifier = 15 access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, - access_tox_storage, access_teleporter, access_sec_doors, + access_tox_storage, access_teleporter, access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage, - access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_network) + access_RC_announce, access_keycard_auth, access_tcomsat, access_xenoarch, access_eva, access_network, access_xenobotany) minimal_access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, - access_tox_storage, access_teleporter, access_sec_doors, + access_tox_storage, access_teleporter, access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage, - access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_network) + access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network, access_xenobotany) minimum_character_age = 25 minimal_player_age = 14 @@ -30,19 +30,34 @@ ideal_character_age = 50 ideal_age_by_species = list(SPECIES_UNATHI = 140, "mechanical" = 20, SPECIES_HUMAN_VATBORN = 20) banned_job_species = list(SPECIES_TESHARI, SPECIES_DIONA, SPECIES_PROMETHEAN, SPECIES_ZADDAT, "digital") + disallow_jobhop = TRUE + pto_type = PTO_SCIENCE + dept_time_required = 60 outfit_type = /decl/hierarchy/outfit/job/science/rd job_description = "The " + JOB_RESEARCH_DIRECTOR + " manages and maintains the Research department. They are required to ensure the safety of the entire crew, \ at least with regards to anything occurring in the Research department, and to inform the crew of any disruptions that \ might originate from Research. The " + JOB_RESEARCH_DIRECTOR + " often has at least passing knowledge of most of the Research department, but \ are encouraged to allow their staff to perform their own duties." - alt_titles = list(JOB_ALT_RESEARCH_SUPERVISOR = /datum/alt_title/research_supervisor) + alt_titles = list(JOB_ALT_RESEARCH_SUPERVISOR = /datum/alt_title/research_supervisor, JOB_ALT_RESEARCH_MANAGER = /datum/alt_title/research_manager, + JOB_ALT_HEAD_OF_DEVELOPMENT = /datum/alt_title/head_of_development,JOB_ALT_HEAD_SCIENTIST = /datum/alt_title/head_scientist) +/datum/job/rd/get_request_reasons() + return list("Repairs needed", "Training crew", "Assembling expedition team") // " + JOB_RESEARCH_DIRECTOR + " Alt Titles /datum/alt_title/research_supervisor title = JOB_ALT_RESEARCH_SUPERVISOR +/datum/alt_title/research_manager + title = JOB_ALT_RESEARCH_MANAGER + +/datum/alt_title/head_of_development + title = JOB_ALT_HEAD_OF_DEVELOPMENT + +/datum/alt_title/head_scientist + title = JOB_ALT_HEAD_SCIENTIST + ////////////////////////////////// // Scientist ////////////////////////////////// @@ -53,11 +68,12 @@ department_flag = MEDSCI faction = FACTION_STATION total_positions = 5 - spawn_positions = 3 + spawn_positions = 5 + pto_type = PTO_SCIENCE supervisors = "the " + JOB_RESEARCH_DIRECTOR selection_color = "#633D63" economic_modifier = 7 - access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch) + access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch, access_xenobotany) minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch) min_age_by_species = list(SPECIES_PROMETHEAN = 2) banned_job_species = list("digital") @@ -68,8 +84,12 @@ job_description = "A " + JOB_SCIENTIST + " is a generalist working in the Research department, with general knowledge of the scientific process, as well as \ the principles and requirements of Research and Development. They may also formulate experiments of their own devising, if \ they find an appropriate topic." - alt_titles = list(JOB_ALT_XENOARCHAEOLOGIST = /datum/alt_title/xenoarch, JOB_ALT_ANOMALIST = /datum/alt_title/anomalist, \ - JOB_ALT_PHORON_RESEARCHER = /datum/alt_title/phoron_research) + alt_titles = list(JOB_ALT_RESEARCHER = /datum/alt_title/researcher, JOB_ALT_LAB_ASSISTANT = /datum/alt_title/lab_assistant, JOB_ALT_XENOARCHAEOLOGIST = /datum/alt_title/xenoarch, + JOB_ALT_XENOPALEONTOLOGIST = /datum/alt_title/xenopaleontologist, JOB_ALT_ANOMALIST = /datum/alt_title/anomalist, JOB_ALT_PHORON_RESEARCHER = /datum/alt_title/phoron_research, + JOB_ALT_GAS_PHYSICIST = /datum/alt_title/gas_physicist, JOB_ALT_CIRCUIT_DESIGNER = /datum/alt_title/circuit_designer, JOB_ALT_CIRCUIT_PROGRAMMER = /datum/alt_title/circuit_programmer) + +/datum/job/scientist/get_request_reasons() + return list("Assembling expedition team") // Scientist Alt Titles /datum/alt_title/xenoarch @@ -88,6 +108,35 @@ Many " + JOB_ALT_PHORON_RESEARCHER + "s are interested in the combustability and explosive properties of gaseous phoron, as well as the specific hazards \ of working with the substance in that state." +/datum/alt_title/researcher + title = JOB_ALT_RESEARCHER + +/datum/alt_title/lab_assistant + title = JOB_ALT_LAB_ASSISTANT + title_blurb = "A " + JOB_ALT_LAB_ASSISTANT + " is a lower-level member of research staff, whose main purpose is to help scientists with their specialized work in more menial fashion, while also \ + learning the specializations in process." + +/datum/alt_title/xenopaleontologist + title = JOB_ALT_XENOPALEONTOLOGIST + title_blurb = "A " + JOB_ALT_XENOPALEONTOLOGIST + " enters digsites in search of fossils and other ancient remants of alien life. These digsites are frequently in vacuum or other inhospitable \ + locations, and as such a " + JOB_ALT_XENOPALEONTOLOGIST + " should be prepared to handle hostile evironmental conditions." + +/datum/alt_title/gas_physicist + title = JOB_ALT_GAS_PHYSICIST + title_blurb = "A " + JOB_ALT_GAS_PHYSICIST + " is a specialist in various practical applications of gasses, but currently focuses their attention on phoron, and has knowledge of its practical uses and dangers. \ + Many " + JOB_ALT_GAS_PHYSICIST + "s are interested in the combustability and explosive properties of gaseous phoron, as well as the specific hazards \ + of working with the substance in that state." + +/datum/alt_title/circuit_designer + title = JOB_ALT_CIRCUIT_DESIGNER + title_blurb = "A " + JOB_ALT_CIRCUIT_DESIGNER + " is a " + JOB_SCIENTIST + " whose expertise is working with integrated circuits. They are familar with the workings and programming of those devices. \ + They work to create various useful devices using the capabilities of integrated circuitry." + +/datum/alt_title/circuit_programmer + title = JOB_ALT_CIRCUIT_PROGRAMMER + title_blurb = "A " + JOB_ALT_CIRCUIT_PROGRAMMER + " is a " + JOB_SCIENTIST + " whose expertise is working with integrated circuits. They are familar with the workings and programming of those devices. \ + They work to create various useful devices using the capabilities of integrated circuitry." + ////////////////////////////////// // Xenobiologist ////////////////////////////////// @@ -98,7 +147,8 @@ department_flag = MEDSCI faction = FACTION_STATION total_positions = 3 - spawn_positions = 2 + spawn_positions = 3 + pto_type = PTO_SCIENCE supervisors = "the " + JOB_RESEARCH_DIRECTOR selection_color = "#633D63" economic_modifier = 7 @@ -112,15 +162,21 @@ outfit_type = /decl/hierarchy/outfit/job/science/xenobiologist job_description = "A " + JOB_XENOBIOLOGIST + " studies esoteric lifeforms, usually in the relative safety of their lab. They attempt to find ways to benefit \ from the byproducts of these lifeforms, and their main subject at present is the Giant Slime." -/*VR edit start - alt_titles = list(JOB_XENOBOTANIST = /datum/alt_title/xenobot) - Xenibiologist Alt Titles + alt_titles = list(JOB_ALT_XENOZOOLOGIST = /datum/alt_title/xenozoologist, JOB_ALT_XENOANTHROPOLOGIST = /datum/alt_title/xenoanthropologist) + +// Xenobiologist Alt Titles /datum/alt_title/xenobot title = JOB_XENOBOTANIST title_blurb = "A " + JOB_XENOBOTANIST + " grows and cares for a variety of abnormal, custom made, and frequently dangerous plant life. When the products of these plants \ is both safe and beneficial to the station, they may choose to introduce it to the rest of the crew." -VR edit end*/ + +/datum/alt_title/xenozoologist + title = JOB_ALT_XENOZOOLOGIST + +/datum/alt_title/xenoanthropologist + title = JOB_ALT_XENOANTHROPOLOGIST + title_blurb = JOB_ALT_XENOANTHROPOLOGIST + " still heavily focuses their study on alien lifeforms, but their specialty leans more towards fellow sapient beings than simple animals." ////////////////////////////////// // Roboticist @@ -131,8 +187,9 @@ VR edit end*/ departments = list(DEPARTMENT_RESEARCH) department_flag = MEDSCI faction = FACTION_STATION - total_positions = 2 + total_positions = 3 spawn_positions = 2 + pto_type = PTO_SCIENCE supervisors = "the " + JOB_RESEARCH_DIRECTOR selection_color = "#633D63" economic_modifier = 5 @@ -145,7 +202,14 @@ VR edit end*/ outfit_type = /decl/hierarchy/outfit/job/science/roboticist job_description = "A " + JOB_ROBOTICIST + " maintains and repairs the station's synthetics, including crew with prosthetic limbs. \ They can also assist the station by producing simple robots and even pilotable exosuits." - alt_titles = list(JOB_ALT_BIOMECHANICAL_ENGINEER = /datum/alt_title/biomech, JOB_ALT_MECHATRONIC_ENGINEER = /datum/alt_title/mech_tech) + alt_titles = list( + JOB_ALT_ASSEMBLY_TECHNICIAN = /datum/alt_title/assembly_tech, + JOB_ALT_BIOMECHANICAL_ENGINEER = /datum/alt_title/biomech, + JOB_ALT_MECHATRONIC_ENGINEER = /datum/alt_title/mech_tech, + JOB_ALT_SOFTWARE_ENGINEER = /datum/alt_title/software_engi) + +/datum/job/roboticist/get_request_reasons() + return list("Repairs needed") // Roboticist Alt Titles /datum/alt_title/biomech @@ -157,3 +221,41 @@ VR edit end*/ title = JOB_ALT_MECHATRONIC_ENGINEER title_blurb = "A " + JOB_ALT_MECHATRONIC_ENGINEER + " focuses on the construction and maintenance of Exosuits, and should be well versed in their use. \ They may also be called upon to work on synthetics and prosthetics, if needed." + +/datum/alt_title/software_engi + title = JOB_ALT_SOFTWARE_ENGINEER + title_blurb = "A " + JOB_ALT_SOFTWARE_ENGINEER + " specializes in working with software and firmware. They also often deal with integrated circuits." + +/datum/alt_title/assembly_tech + title = JOB_ALT_ASSEMBLY_TECHNICIAN + +////////////////////////////////// +// Xenobotanist +////////////////////////////////// +/datum/job/xenobotanist + title = JOB_XENOBOTANIST + flag = XENOBOTANIST + departments = list(DEPARTMENT_RESEARCH) + department_flag = MEDSCI + faction = FACTION_STATION + total_positions = 2 + spawn_positions = 2 + supervisors = "the " + JOB_RESEARCH_DIRECTOR + selection_color = "#633D63" + economic_modifier = 7 + access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobotany, access_hydroponics) + minimal_access = list(access_research, access_xenobotany, access_hydroponics, access_tox_storage) + pto_type = PTO_SCIENCE + + minimal_player_age = 14 + + outfit_type = /decl/hierarchy/outfit/job/science/xenobiologist + job_description = "A " + JOB_XENOBOTANIST + " grows and cares for a variety of abnormal, custom made, and frequently dangerous plant life. When the products of these plants \ + are both safe and beneficial to the station, they may choose to introduce it to the rest of the crew." + alt_titles = list(JOB_ALT_XENOHYDROPONICIST = /datum/alt_title/xenohydroponicist, JOB_ALT_XENOFLORIST = /datum/alt_title/xenoflorist) + +/datum/alt_title/xenoflorist + title = JOB_ALT_XENOFLORIST + +/datum/alt_title/xenohydroponicist + title = JOB_ALT_XENOHYDROPONICIST \ No newline at end of file diff --git a/code/game/jobs/job/science_vr.dm b/code/game/jobs/job/science_vr.dm deleted file mode 100644 index c0505e4109..0000000000 --- a/code/game/jobs/job/science_vr.dm +++ /dev/null @@ -1,134 +0,0 @@ -/datum/job/rd - disallow_jobhop = TRUE - pto_type = PTO_SCIENCE - dept_time_required = 60 - - access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, - access_tox_storage, access_teleporter, - access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage, - access_RC_announce, access_keycard_auth, access_tcomsat, access_xenoarch, access_eva, access_network, access_xenobotany) - minimal_access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, - access_tox_storage, access_teleporter, - access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage, - access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network, access_xenobotany) - alt_titles = list(JOB_ALT_RESEARCH_SUPERVISOR = /datum/alt_title/research_supervisor, JOB_ALT_RESEARCH_MANAGER = /datum/alt_title/research_manager, - JOB_ALT_HEAD_OF_DEVELOPMENT = /datum/alt_title/head_of_development,JOB_ALT_HEAD_SCIENTIST = /datum/alt_title/head_scientist) - -/datum/alt_title/research_manager - title = JOB_ALT_RESEARCH_MANAGER - -/datum/alt_title/head_of_development - title = JOB_ALT_HEAD_OF_DEVELOPMENT - -/datum/alt_title/head_scientist - title = JOB_ALT_HEAD_SCIENTIST - -/datum/job/rd/get_request_reasons() - return list("Repairs needed", "Training crew", "Assembling expedition team") - - -/datum/job/scientist - spawn_positions = 5 - pto_type = PTO_SCIENCE - alt_titles = list(JOB_ALT_RESEARCHER = /datum/alt_title/researcher, JOB_ALT_LAB_ASSISTANT = /datum/alt_title/lab_assistant, JOB_ALT_XENOARCHAEOLOGIST = /datum/alt_title/xenoarch, - JOB_ALT_XENOPALEONTOLOGIST = /datum/alt_title/xenopaleontologist, JOB_ALT_ANOMALIST = /datum/alt_title/anomalist, JOB_ALT_PHORON_RESEARCHER = /datum/alt_title/phoron_research, - JOB_ALT_GAS_PHYSICIST = /datum/alt_title/gas_physicist, JOB_ALT_CIRCUIT_DESIGNER = /datum/alt_title/circuit_designer, JOB_ALT_CIRCUIT_PROGRAMMER = /datum/alt_title/circuit_programmer) - - - access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch, access_xenobotany) - minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch) // Unchanged (for now?), mostly here for reference - -/datum/alt_title/researcher - title = JOB_ALT_RESEARCHER - -/datum/alt_title/lab_assistant - title = JOB_ALT_LAB_ASSISTANT - title_blurb = "A " + JOB_ALT_LAB_ASSISTANT + " is a lower-level member of research staff, whose main purpose is to help scientists with their specialized work in more menial fashion, while also \ - learning the specializations in process." - -/datum/alt_title/xenopaleontologist - title = JOB_ALT_XENOPALEONTOLOGIST - title_blurb = "A " + JOB_ALT_XENOPALEONTOLOGIST + " enters digsites in search of fossils and other ancient remants of alien life. These digsites are frequently in vacuum or other inhospitable \ - locations, and as such a " + JOB_ALT_XENOPALEONTOLOGIST + " should be prepared to handle hostile evironmental conditions." - -/datum/alt_title/gas_physicist - title = JOB_ALT_GAS_PHYSICIST - title_blurb = "A " + JOB_ALT_GAS_PHYSICIST + " is a specialist in various practical applications of gasses, but currently focuses their attention on phoron, and has knowledge of its practical uses and dangers. \ - Many " + JOB_ALT_GAS_PHYSICIST + "s are interested in the combustability and explosive properties of gaseous phoron, as well as the specific hazards \ - of working with the substance in that state." - -/datum/alt_title/circuit_designer - title = JOB_ALT_CIRCUIT_DESIGNER - title_blurb = "A " + JOB_ALT_CIRCUIT_DESIGNER + " is a " + JOB_SCIENTIST + " whose expertise is working with integrated circuits. They are familar with the workings and programming of those devices. \ - They work to create various useful devices using the capabilities of integrated circuitry." - -/datum/alt_title/circuit_programmer - title = JOB_ALT_CIRCUIT_PROGRAMMER - title_blurb = "A " + JOB_ALT_CIRCUIT_PROGRAMMER + " is a " + JOB_SCIENTIST + " whose expertise is working with integrated circuits. They are familar with the workings and programming of those devices. \ - They work to create various useful devices using the capabilities of integrated circuitry." - -/datum/job/scientist/get_request_reasons() - return list("Assembling expedition team") - -/datum/job/xenobiologist - spawn_positions = 3 - pto_type = PTO_SCIENCE - alt_titles = list(JOB_ALT_XENOZOOLOGIST = /datum/alt_title/xenozoologist, JOB_ALT_XENOANTHROPOLOGIST = /datum/alt_title/xenoanthropologist) - -/datum/alt_title/xenozoologist - title = JOB_ALT_XENOZOOLOGIST - -/datum/alt_title/xenoanthropologist - title = JOB_ALT_XENOANTHROPOLOGIST - title_blurb = JOB_ALT_XENOANTHROPOLOGIST + " still heavily focuses their study on alien lifeforms, but their specialty leans more towards fellow sapient beings than simple animals." - - -/datum/job/roboticist - total_positions = 3 - pto_type = PTO_SCIENCE - alt_titles = list( - JOB_ALT_ASSEMBLY_TECHNICIAN = /datum/alt_title/assembly_tech, - JOB_ALT_BIOMECHANICAL_ENGINEER = /datum/alt_title/biomech, - JOB_ALT_MECHATRONIC_ENGINEER = /datum/alt_title/mech_tech, - JOB_ALT_SOFTWARE_ENGINEER = /datum/alt_title/software_engi) - -/datum/alt_title/software_engi - title = JOB_ALT_SOFTWARE_ENGINEER - title_blurb = "A " + JOB_ALT_SOFTWARE_ENGINEER + " specializes in working with software and firmware. They also often deal with integrated circuits." - -/datum/alt_title/assembly_tech - title = JOB_ALT_ASSEMBLY_TECHNICIAN - -/datum/job/roboticist/get_request_reasons() - return list("Repairs needed") - -////////////////////////////////// -// Xenobotanist -////////////////////////////////// -/datum/job/xenobotanist - title = JOB_XENOBOTANIST - flag = XENOBOTANIST - departments = list(DEPARTMENT_RESEARCH) - department_flag = MEDSCI - faction = FACTION_STATION - total_positions = 2 - spawn_positions = 2 - supervisors = "the " + JOB_RESEARCH_DIRECTOR - selection_color = "#633D63" - economic_modifier = 7 - access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobotany, access_hydroponics) - minimal_access = list(access_research, access_xenobotany, access_hydroponics, access_tox_storage) - pto_type = PTO_SCIENCE - - minimal_player_age = 14 - - outfit_type = /decl/hierarchy/outfit/job/science/xenobiologist - job_description = "A " + JOB_XENOBOTANIST + " grows and cares for a variety of abnormal, custom made, and frequently dangerous plant life. When the products of these plants \ - are both safe and beneficial to the station, they may choose to introduce it to the rest of the crew." - alt_titles = list(JOB_ALT_XENOHYDROPONICIST = /datum/alt_title/xenohydroponicist, JOB_ALT_XENOFLORIST = /datum/alt_title/xenoflorist) - -/datum/alt_title/xenoflorist - title = JOB_ALT_XENOFLORIST - -/datum/alt_title/xenohydroponicist - title = JOB_ALT_XENOHYDROPONICIST diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 372d459e62..db2a0e051c 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -16,26 +16,31 @@ req_admin_notify = 1 economic_modifier = 10 access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, - access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, - access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting, - access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks) + access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, + access_construction, + access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks) minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, - access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, - access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting, - access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks) + access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, + access_construction, + access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks) minimum_character_age = 25 min_age_by_species = list(SPECIES_HUMAN_VATBORN = 14) minimal_player_age = 14 ideal_character_age = 50 ideal_age_by_species = list(SPECIES_HUMAN_VATBORN = 20) banned_job_species = list(SPECIES_TESHARI, SPECIES_DIONA, SPECIES_PROMETHEAN, SPECIES_ZADDAT, "digital", SPECIES_UNATHI, "mechanical") + disallow_jobhop = TRUE + pto_type = PTO_SECURITY + dept_time_required = 60 outfit_type = /decl/hierarchy/outfit/job/security/hos job_description = " The " + JOB_HEAD_OF_SECURITY + " manages the Security Department, keeping the station safe and making sure the rules are followed. They are expected to \ keep the other Department Heads, and the rest of the crew, aware of developing situations that may be a threat. If necessary, the HoS may \ perform the duties of absent Security roles, such as distributing gear from the Armory." - alt_titles = list(JOB_ALT_SECURITY_COMMANDER = /datum/alt_title/sec_commander, JOB_ALT_CHIEF_OF_SECURITY = /datum/alt_title/sec_chief) + alt_titles = list(JOB_ALT_SECURITY_COMMANDER = /datum/alt_title/sec_commander, JOB_ALT_CHIEF_OF_SECURITY = /datum/alt_title/sec_chief, JOB_ALT_SECURITY_MANAGER = /datum/alt_title/security_manager) +/datum/job/hos/get_request_reasons() + return list("Wildlife management", "Forensic investigation", "Training crew", "Assembling expedition team") // Head of Security Alt Titles /datum/alt_title/sec_commander @@ -44,6 +49,9 @@ /datum/alt_title/sec_chief title = JOB_ALT_CHIEF_OF_SECURITY +/datum/alt_title/security_manager + title = JOB_ALT_SECURITY_MANAGER + ////////////////////////////////// // Warden ////////////////////////////////// @@ -59,17 +67,32 @@ supervisors = "the " + JOB_HEAD_OF_SECURITY selection_color = "#601C1C" economic_modifier = 5 + pto_type = PTO_SECURITY + dept_time_required = 20 access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_morgue, access_external_airlocks) minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_external_airlocks) minimal_player_age = 5 banned_job_species = list(SPECIES_ZADDAT, SPECIES_PROMETHEAN, SPECIES_TESHARI, SPECIES_DIONA) - + alt_titles = list(JOB_ALT_BRIG_SENTRY = /datum/alt_title/brig_sentry, JOB_ALT_ARMORY_SUPERINTENDENT = /datum/alt_title/armory_superintendent, JOB_ALT_MASTERATARMS = /datum/alt_title/master_at_arms) outfit_type = /decl/hierarchy/outfit/job/security/warden job_description = "The " + JOB_WARDEN + " watches over the physical Security Department, making sure the Brig and Armoury are secure and in order at all times. They oversee \ prisoners that have been processed and brigged, and are responsible for their well being. The " + JOB_WARDEN + " is also in charge of distributing \ Armoury gear in a crisis, and retrieving it when the crisis has passed. In an emergency, the " + JOB_WARDEN + " may be called upon to direct the \ Security Department as a whole." +/datum/job/warden/get_request_reasons() + return list("Wildlife management") + +//Warden Alt Titles +/datum/alt_title/brig_sentry + title = JOB_ALT_BRIG_SENTRY + +/datum/alt_title/armory_superintendent + title = JOB_ALT_ARMORY_SUPERINTENDENT + +/datum/alt_title/master_at_arms + title = JOB_ALT_MASTERATARMS + ////////////////////////////////// // Detective ////////////////////////////////// @@ -81,6 +104,7 @@ faction = FACTION_STATION total_positions = 2 spawn_positions = 2 + pto_type = PTO_SECURITY supervisors = "the " + JOB_HEAD_OF_SECURITY selection_color = "#601C1C" access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_eva, access_external_airlocks, access_brig) //Vorestation edit - access_brig @@ -92,7 +116,10 @@ outfit_type = /decl/hierarchy/outfit/job/security/detective job_description = "A " + JOB_DETECTIVE + " works to help Security find criminals who have not properly been identified, through interviews and forensic work. \ For crimes only witnessed after the fact, or those with no survivors, they attempt to piece together what they can from pure evidence." - alt_titles = list(JOB_ALT_FORENSIC_TECHNICIAN = /datum/alt_title/forensic_tech) + alt_titles = list(JOB_ALT_INVESTIGATOR = /datum/alt_title/investigator, JOB_ALT_SECURITY_INSPECTOR = /datum/alt_title/security_inspector, JOB_ALT_FORENSIC_TECHNICIAN = /datum/alt_title/forensic_tech) + +/datum/job/detective/get_request_reasons() + return list("Forensic investigation") // Detective Alt Titles /datum/alt_title/forensic_tech @@ -100,6 +127,12 @@ title_blurb = "A " + JOB_ALT_FORENSIC_TECHNICIAN + " works more with hard evidence and labwork than a " + JOB_DETECTIVE + ", but they share the purpose of solving crimes." title_outfit = /decl/hierarchy/outfit/job/security/detective/forensic +/datum/alt_title/investigator + title = JOB_ALT_INVESTIGATOR + +/datum/alt_title/security_inspector + title = JOB_ALT_SECURITY_INSPECTOR + ////////////////////////////////// // Security Officer ////////////////////////////////// @@ -109,8 +142,9 @@ departments = list(DEPARTMENT_SECURITY) department_flag = ENGSEC faction = FACTION_STATION - total_positions = 4 - spawn_positions = 4 + total_positions = 5 + spawn_positions = 5 + pto_type = PTO_SECURITY supervisors = "the " + JOB_HEAD_OF_SECURITY selection_color = "#601C1C" economic_modifier = 4 @@ -123,13 +157,29 @@ job_description = "A " + JOB_SECURITY_OFFICER + " is concerned with maintaining the safety and security of the station as a whole, dealing with external threats and \ apprehending criminals. A " + JOB_SECURITY_OFFICER + " is responsible for the health, safety, and processing of any prisoner they arrest. \ No one is above the Law, not Security or Command." - alt_titles = list(JOB_ALT_JUNIOR_OFFICER = /datum/alt_title/junior_officer) + alt_titles = list(JOB_ALT_PATROL_OFFICER = /datum/alt_title/patrol_officer, JOB_ALT_SECURITY_GUARD = /datum/alt_title/security_guard, + JOB_ALT_SECURITY_DEPUTY = /datum/alt_title/security_guard, JOB_ALT_JUNIOR_OFFICER = /datum/alt_title/junior_officer, JOB_ALT_SECURITY_CONTRACTOR = /datum/alt_title/security_contractor) min_age_by_species = list(SPECIES_PROMETHEAN = 3) +/datum/job/officer/get_request_reasons() + return list("Wildlife management", "Assembling expedition team") + // Security Officer Alt Titles /datum/alt_title/junior_officer title = JOB_ALT_JUNIOR_OFFICER title_blurb = "A " + JOB_ALT_JUNIOR_OFFICER + " is an inexperienced " + JOB_SECURITY_OFFICER + ". They likely have training, but not experience, and are frequently \ paired off with a more senior co-worker. Junior Officers may also be expected to take over the boring duties of other Officers \ including patrolling the station or maintaining specific posts." + +/datum/alt_title/patrol_officer + title = JOB_ALT_PATROL_OFFICER + +/datum/alt_title/security_guard + title = JOB_ALT_SECURITY_GUARD + +/datum/alt_title/security_deputy + title = JOB_ALT_SECURITY_DEPUTY + +/datum/alt_title/security_contractor + title = JOB_ALT_SECURITY_CONTRACTOR diff --git a/code/game/jobs/job/security_vr.dm b/code/game/jobs/job/security_vr.dm deleted file mode 100644 index b7c196b334..0000000000 --- a/code/game/jobs/job/security_vr.dm +++ /dev/null @@ -1,75 +0,0 @@ -/datum/job/hos - disallow_jobhop = TRUE - pto_type = PTO_SECURITY - dept_time_required = 60 - - access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, - access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, - access_construction, - access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks) - minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, - access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, - access_construction, - access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks) - alt_titles = list(JOB_ALT_SECURITY_COMMANDER = /datum/alt_title/sec_commander, JOB_ALT_CHIEF_OF_SECURITY = /datum/alt_title/sec_chief, JOB_ALT_SECURITY_MANAGER = /datum/alt_title/security_manager) - -/datum/alt_title/security_manager - title = JOB_ALT_SECURITY_MANAGER - -/datum/job/hos/get_request_reasons() - return list("Wildlife management", "Forensic investigation", "Training crew", "Assembling expedition team") - - -/datum/job/warden - pto_type = PTO_SECURITY - dept_time_required = 20 - alt_titles = list(JOB_ALT_BRIG_SENTRY = /datum/alt_title/brig_sentry, JOB_ALT_ARMORY_SUPERINTENDENT = /datum/alt_title/armory_superintendent, JOB_ALT_MASTERATARMS = /datum/alt_title/master_at_arms) - -/datum/alt_title/brig_sentry - title = JOB_ALT_BRIG_SENTRY - -/datum/alt_title/armory_superintendent - title = JOB_ALT_ARMORY_SUPERINTENDENT - -/datum/alt_title/master_at_arms - title = JOB_ALT_MASTERATARMS - -/datum/job/warden/get_request_reasons() - return list("Wildlife management") - - -/datum/job/detective - pto_type = PTO_SECURITY - alt_titles = list(JOB_ALT_INVESTIGATOR = /datum/alt_title/investigator, JOB_ALT_SECURITY_INSPECTOR = /datum/alt_title/security_inspector, JOB_ALT_FORENSIC_TECHNICIAN = /datum/alt_title/forensic_tech) - -/datum/alt_title/investigator - title = JOB_ALT_INVESTIGATOR - -/datum/alt_title/security_inspector - title = JOB_ALT_SECURITY_INSPECTOR - -/datum/job/detective/get_request_reasons() - return list("Forensic investigation") - - -/datum/job/officer - total_positions = 5 - spawn_positions = 5 - pto_type = PTO_SECURITY - alt_titles = list(JOB_ALT_PATROL_OFFICER = /datum/alt_title/patrol_officer, JOB_ALT_SECURITY_GUARD = /datum/alt_title/security_guard, - JOB_ALT_SECURITY_DEPUTY = /datum/alt_title/security_guard, JOB_ALT_JUNIOR_OFFICER = /datum/alt_title/junior_officer, JOB_ALT_SECURITY_CONTRACTOR = /datum/alt_title/security_contractor) - -/datum/alt_title/patrol_officer - title = JOB_ALT_PATROL_OFFICER - -/datum/alt_title/security_guard - title = JOB_ALT_SECURITY_GUARD - -/datum/alt_title/security_deputy - title = JOB_ALT_SECURITY_DEPUTY - -/datum/alt_title/security_contractor - title = JOB_ALT_SECURITY_CONTRACTOR - -/datum/job/officer/get_request_reasons() - return list("Wildlife management", "Assembling expedition team") diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm index 6a5812af07..cce3f69603 100644 --- a/code/game/jobs/job/silicon.dm +++ b/code/game/jobs/job/silicon.dm @@ -19,6 +19,8 @@ has_headset = FALSE assignable = FALSE mob_type = JOB_SILICON_AI + disallow_jobhop = TRUE + pto_type = PTO_CIVILIAN outfit_type = /decl/hierarchy/outfit/job/silicon/ai job_description = "The " + JOB_AI + " oversees the operation of the station and its crew, but has no real authority over them. \ The " + JOB_AI + " is required to follow its Laws, and Lawbound Synthetics that are linked to it are expected to follow \ @@ -46,8 +48,10 @@ departments = list(DEPARTMENT_SYNTHETIC) department_flag = ENGSEC faction = FACTION_STATION - total_positions = 2 - spawn_positions = 2 + pto_type = PTO_CYBORG + minimal_player_age = 3 //1 day is a little too little time + total_positions = 4 //Along with one able to spawn later in the round. + spawn_positions = 3 //Let's have 3 able to spawn in roundstart supervisors = "your Laws and the " + JOB_AI //Nodrak selection_color = "#254C25" minimal_player_age = 1 diff --git a/code/game/jobs/job/silicon_vr.dm b/code/game/jobs/job/silicon_vr.dm deleted file mode 100644 index f5df1e3acf..0000000000 --- a/code/game/jobs/job/silicon_vr.dm +++ /dev/null @@ -1,9 +0,0 @@ -/datum/job/ai - disallow_jobhop = TRUE - pto_type = PTO_CIVILIAN - -/datum/job/cyborg - pto_type = PTO_CYBORG - minimal_player_age = 3 //1 day is a little too little time - total_positions = 4 //Along with one able to spawn later in the round. - spawn_positions = 3 //Let's have 3 able to spawn in roundstart \ No newline at end of file diff --git a/code/game/jobs/job/special_vr.dm b/code/game/jobs/job/special.dm similarity index 100% rename from code/game/jobs/job/special_vr.dm rename to code/game/jobs/job/special.dm diff --git a/code/game/machinery/computer/arcade_vr.dm b/code/game/machinery/computer/arcade_vr.dm index a1d4ebb069..80daaceb52 100644 --- a/code/game/machinery/computer/arcade_vr.dm +++ b/code/game/machinery/computer/arcade_vr.dm @@ -22,7 +22,6 @@ /obj/item/toy/redbutton = 2, /obj/item/toy/gnome = 2, /obj/item/toy/AI = 2, - /obj/item/clothing/gloves/ring/buzzer/toy = 2, /obj/item/storage/box/handcuffs/fake = 2, /obj/item/toy/nuke = 2, /obj/item/toy/minigibber = 2, diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 2f70e0436e..8055af222c 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -437,12 +437,12 @@ return ..(M) /obj/machinery/door/update_nearby_tiles(need_rebuild) - if(!air_master) + if(!SSair) return 0 for(var/turf/simulated/turf in locs) update_heat_protection(turf) - air_master.mark_for_update(turf) + SSair.mark_for_update(turf) return 1 diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index d4477eeac0..4502ed9334 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -501,15 +501,15 @@ update_nearby_tiles(need_rebuild) - if(!air_master) return 0 + if(!SSair) return 0 var/turf/simulated/source = loc var/turf/simulated/destination = get_step(source,dir) update_heat_protection(loc) - if(istype(source)) air_master.tiles_to_update += source - if(istype(destination)) air_master.tiles_to_update += destination + if(istype(source)) SSair.tiles_to_update += source + if(istype(destination)) SSair.tiles_to_update += destination return 1 */ diff --git a/code/game/objects/effects/chem/coating.dm b/code/game/objects/effects/chem/coating.dm index 2e9ad26049..13a3cb4c39 100644 --- a/code/game/objects/effects/chem/coating.dm +++ b/code/game/objects/effects/chem/coating.dm @@ -34,3 +34,5 @@ /obj/effect/decal/cleanable/chemcoating/update_icon() ..() color = reagents.get_color() + cut_overlays() + add_janitor_hud_overlay() diff --git a/code/game/objects/effects/decals/Cleanable/aliens.dm b/code/game/objects/effects/decals/Cleanable/aliens.dm index 57a32434af..37cf4c29a7 100644 --- a/code/game/objects/effects/decals/Cleanable/aliens.dm +++ b/code/game/objects/effects/decals/Cleanable/aliens.dm @@ -13,6 +13,8 @@ /obj/effect/decal/cleanable/blood/gibs/xeno/update_icon() color = "#FFFFFF" + cut_overlays() + add_janitor_hud_overlay() /obj/effect/decal/cleanable/blood/gibs/xeno/up random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6","xgibup1","xgibup1","xgibup1") @@ -30,4 +32,4 @@ random_icon_states = list("xgibmid1", "xgibmid2", "xgibmid3") /obj/effect/decal/cleanable/blood/xtracks - basecolor = "#05EE05" \ No newline at end of file + basecolor = "#05EE05" diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 184bee8bed..a27bff7038 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -70,6 +70,8 @@ var/global/list/image/splatter_cache=list() else name = initial(name) desc = initial(desc) + cut_overlays() + add_janitor_hud_overlay() /obj/effect/decal/cleanable/blood/Crossed(mob/living/carbon/human/perp) if(perp.is_incorporeal()) @@ -210,6 +212,7 @@ var/global/list/image/splatter_cache=list() icon = blood cut_overlays() add_overlay(giblets) + add_janitor_hud_overlay() /obj/effect/decal/cleanable/blood/gibs/up random_icon_states = list("gib1", "gib2", "gib3", "gib5", "gib6","gibup1","gibup1","gibup1") diff --git a/code/game/objects/effects/decals/Cleanable/robots.dm b/code/game/objects/effects/decals/Cleanable/robots.dm index b0980966a3..26a4fb11af 100644 --- a/code/game/objects/effects/decals/Cleanable/robots.dm +++ b/code/game/objects/effects/decals/Cleanable/robots.dm @@ -10,6 +10,8 @@ /obj/effect/decal/cleanable/blood/gibs/robot/update_icon() color = "#FFFFFF" + cut_overlays() + add_janitor_hud_overlay() /obj/effect/decal/cleanable/blood/gibs/robot/dry() //pieces of robots do not dry up like return @@ -49,4 +51,4 @@ /obj/effect/decal/cleanable/blood/oil/streak random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5") - amount = 2 \ No newline at end of file + amount = 2 diff --git a/code/game/objects/effects/decals/Cleanable/tracks.dm b/code/game/objects/effects/decals/Cleanable/tracks.dm index 3d9e74ca6a..400a6124a4 100644 --- a/code/game/objects/effects/decals/Cleanable/tracks.dm +++ b/code/game/objects/effects/decals/Cleanable/tracks.dm @@ -142,6 +142,7 @@ var/global/list/image/fluidtrack_cache=list() stack[stack_idx]=track add_overlay(I) updatedtracks=0 // Clear our memory of updated tracks. + add_janitor_hud_overlay() /obj/effect/decal/cleanable/blood/tracks/footprints name = "wet footprints" diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 7338689e33..a56798eae9 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -12,7 +12,6 @@ generic_filth = TRUE means when the decal is saved, it will be switched out for var/generic_filth = FALSE var/age = 0 var/list/random_icon_states = list() - var/obj/effect/decal/jan_hud/jan_icon = null /obj/effect/decal/cleanable/Initialize(var/mapload, var/_age) if(!isnull(_age)) @@ -21,12 +20,11 @@ generic_filth = TRUE means when the decal is saved, it will be switched out for src.icon_state = pick(src.random_icon_states) if(!mapload || !CONFIG_GET(flag/persistence_ignore_mapload)) SSpersistence.track_value(src, /datum/persistent/filth) - jan_icon = new/obj/effect/decal/jan_hud(src.loc) . = ..() + update_icon() /obj/effect/decal/cleanable/Destroy() SSpersistence.forget_value(src, /datum/persistent/filth) - QDEL_NULL(jan_icon) . = ..() /obj/effect/decal/cleanable/clean_blood(var/ignore = 0) @@ -40,13 +38,25 @@ generic_filth = TRUE means when the decal is saved, it will be switched out for src.icon_state = pick(src.random_icon_states) ..() -/obj/effect/decal/jan_hud - plane = PLANE_JANHUD - layer = BELOW_MOB_LAYER - vis_flags = VIS_HIDE - persist_storable = FALSE - icon = 'icons/mob/hud.dmi' - mouse_opacity = 0 -/obj/effect/decal/jan_hud/Initialize() - src.icon_state = "janhud[rand(1,9)]" +/obj/effect/decal/cleanable/update_icon() + // Overrides should not inheret from this, and instead replace it entirely to match this in some form. + // add_janitor_hud_overlay() does not pre-cut overlays, so cut_overlays() must be called first. + // This is so it may be used with update_icon() overrides that use overlays, while adding the janitor overlay at the end. + cut_overlays() + add_janitor_hud_overlay() + + +/obj/effect/decal/cleanable/proc/add_janitor_hud_overlay() + // This was original a seperate object that followed the grime, it got stuck in everything you can imagine! + // It also likely doubled the memory use of every cleanable decal on station... + var/image/hud = image('icons/mob/hud.dmi', src, "janhud[rand(1,9)]") + hud.appearance_flags = (RESET_COLOR|PIXEL_SCALE|KEEP_APART) + hud.plane = PLANE_JANHUD + hud.layer = BELOW_MOB_LAYER + hud.mouse_opacity = 0 + //HUD VARIANT: Allows the hud to show up with it's normal alpha, even if the 'dirty thing' it's attached to has a low alpha (ex: dirt). If you want to disable it, simply comment out the lines between the 'HUD VARIANT' tag! + hud.appearance_flags = RESET_ALPHA + hud.alpha = 255 + //HUD VARIANT end + add_overlay(hud) diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index 493529cede..0f1803aa77 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -6,26 +6,39 @@ layer = DIRTY_LAYER anchored = TRUE -/obj/effect/decal/cleanable/crayon/New(location,main = "#FFFFFF",shade = "#000000",var/type = "rune") - ..() - loc = location + var/art_type + var/art_color + var/art_shade +/obj/effect/decal/cleanable/crayon/Initialize(var/ml, main = "#FFFFFF",shade = "#000000",var/type = "rune", new_age = 0) name = type desc = "A [type] drawn in crayon." + // Persistence vars. Unused here but used downstream. If someone updates the persistance code, it's here. + art_type = type + art_color = main + art_shade = shade + switch(type) if("rune") type = "rune[rand(1,6)]" if("graffiti") type = pick("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa") - var/icon/mainOverlay = new/icon('icons/effects/crayondecal.dmi',"[type]",2.1) - var/icon/shadeOverlay = new/icon('icons/effects/crayondecal.dmi',"[type]s",2.1) + . = ..(ml, new_age) // mapload, age - mainOverlay.Blend(main,ICON_ADD) - shadeOverlay.Blend(shade,ICON_ADD) +/obj/effect/decal/cleanable/crayon/update_icon() + cut_overlays() + var/icon/mainOverlay = new/icon('icons/effects/crayondecal.dmi',"[art_type]",2.1) + var/icon/shadeOverlay = new/icon('icons/effects/crayondecal.dmi',"[art_type]s",2.1) - add_overlay(mainOverlay) - add_overlay(shadeOverlay) + if(mainOverlay && shadeOverlay) + mainOverlay.Blend(art_color,ICON_ADD) + shadeOverlay.Blend(art_shade,ICON_ADD) - add_hiddenprint(usr) + add_overlay(mainOverlay) + add_overlay(shadeOverlay) + + add_janitor_hud_overlay() + return +// CHOMPEdit End diff --git a/code/game/objects/effects/zone_divider.dm b/code/game/objects/effects/zone_divider.dm index fa2ea82531..3638219b20 100644 --- a/code/game/objects/effects/zone_divider.dm +++ b/code/game/objects/effects/zone_divider.dm @@ -13,8 +13,8 @@ // Special case to prevent us from being part of a zone during the first air master tick. // We must merge ourselves into a zone on next tick. This will cause a bit of lag on // startup, but it can't really be helped you know? - if(air_master && air_master.current_cycle == 0) + if(SSair && SSair.current_cycle == 0) spawn(1) - air_master.mark_for_update(get_turf(src)) + SSair.mark_for_update(get_turf(src)) return FALSE return is_zone ? FALSE : TRUE // Anything except zones can pass diff --git a/code/game/objects/items/antag_spawners.dm b/code/game/objects/items/antag_spawners.dm index 8371f5b017..2881753189 100644 --- a/code/game/objects/items/antag_spawners.dm +++ b/code/game/objects/items/antag_spawners.dm @@ -118,7 +118,6 @@ to speak with your team, and learn what their plan is for today.")) R.key = C.key -// R.Namepick() // Apparnetly making someone a merc lets them pick a name, so this isn't needed. spawn(1) mercs.add_antagonist(R.mind, FALSE, TRUE, FALSE, FALSE, FALSE) diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 84b8d743f6..c0f82b0b15 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -251,9 +251,9 @@ if (!isturf(NT) || (NT in found) || (NT in pending)) continue // We ask ZAS to determine if its airtight. Thats what matters anyway right? - if(air_master.air_blocked(T, NT)) + if(SSair.air_blocked(T, NT)) // Okay thats the edge of the room - if(get_area_type(NT.loc) == AREA_SPACE && air_master.air_blocked(NT, NT)) + if(get_area_type(NT.loc) == AREA_SPACE && SSair.air_blocked(NT, NT)) found += NT // So we include walls/doors not already in any area continue if (istype(NT, /turf/space)) diff --git a/code/game/objects/items/blueprints_vr.dm b/code/game/objects/items/blueprints_vr.dm index 336a6219d9..214bbff518 100644 --- a/code/game/objects/items/blueprints_vr.dm +++ b/code/game/objects/items/blueprints_vr.dm @@ -678,9 +678,9 @@ if(!visual && forbiddenAreas[NT.loc.type]) return ROOM_ERR_FORBIDDEN // We ask ZAS to determine if its airtight. Thats what matters anyway right? - if(air_master.air_blocked(T, NT)) + if(SSair.air_blocked(T, NT)) // Okay thats the edge of the room - if(get_area_type(NT.loc) == AREA_SPACE && air_master.air_blocked(NT, NT)) + if(get_area_type(NT.loc) == AREA_SPACE && SSair.air_blocked(NT, NT)) found += NT // So we include walls/doors not already in any area continue if (istype(NT, /turf/space)) @@ -835,9 +835,9 @@ if(!get_new_area_type(NT.loc) == 1) //The contains somewhere that is NOT a buildable area. return 3 //NOT A BUILDABLE AREA - if(air_master.air_blocked(T, NT)) //Is the room airtight? + if(SSair.air_blocked(T, NT)) //Is the room airtight? // Okay thats the edge of the room - if(get_new_area_type(NT.loc) == 1 && air_master.air_blocked(NT, NT)) + if(get_new_area_type(NT.loc) == 1 && SSair.air_blocked(NT, NT)) found += NT // So we include walls/doors not already in any area continue if (istype(NT, /turf/space)) diff --git a/code/game/objects/items/devices/scanners/guide.dm b/code/game/objects/items/devices/scanners/guide.dm index 403a81f974..68bd33d8e8 100644 --- a/code/game/objects/items/devices/scanners/guide.dm +++ b/code/game/objects/items/devices/scanners/guide.dm @@ -102,7 +102,7 @@ if(D.visibility_flags & HIDDEN_SCANNER) continue else - dat += span_bold("Viral Infection") + " - Inform a Virologist or the Chief Medical Officer and administer antiviral chemicals such as Spaceacilin. Limit exposure to other personnel.
" + dat += span_bold("Viral Infection") + " - Inform a Virologist or the Chief Medical Officer and administer antiviral chemicals such as Spaceacillin. Limit exposure to other personnel.
" if(robotparts) dat += span_bold("Robotic body parts") + " - Should not be repaired by medical personnel, refer to robotics if damaged." diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 80e16d90c2..2d93e9c7bc 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -225,7 +225,6 @@ feedback_inc("cyborg_birth",1) callHook("borgify", list(O)) - O.namepick() qdel(src) else diff --git a/code/game/objects/items/toys/toys_vr.dm b/code/game/objects/items/toys/toys_vr.dm index b7e2065157..443f4c3f86 100644 --- a/code/game/objects/items/toys/toys_vr.dm +++ b/code/game/objects/items/toys/toys_vr.dm @@ -556,35 +556,6 @@ /obj/item/toy/AI/proc/cooldownreset() cooldown = 0 -/* - * Hand buzzer - */ -/obj/item/clothing/gloves/ring/buzzer/toy - name = "steel ring" - desc = "Torus shaped finger decoration. It has a small piece of metal on the palm-side." - icon_state = "seal-signet" - drop_sound = 'sound/items/drop/ring.ogg' - -/obj/item/clothing/gloves/ring/buzzer/toy/Touch(var/atom/A, var/proximity) - if(proximity && istype(usr, /mob/living/carbon/human)) - - return zap(usr, A, proximity) - return 0 - -/obj/item/clothing/gloves/ring/buzzer/toy/zap(var/mob/living/carbon/human/user, var/atom/movable/target, var/proximity) - . = FALSE - if(user.a_intent == I_HELP && battery.percent() >= 50) - if(isliving(target)) - var/mob/living/L = target - - to_chat(L, span_warning("You feel a powerful shock!")) - if(!.) - playsound(L, 'sound/effects/sparks7.ogg', 40, 1) - L.electrocute_act(battery.percent() * 0, src) - return . - - return 0 - /* * Toy cuffs */ diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 41bab1e08f..378ab6b450 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -115,6 +115,12 @@ drop_sound = 'sound/items/drop/food.ogg' pickup_sound = 'sound/items/pickup/food.ogg' +/obj/item/trash/turkeybones + name = "turkey bones" + icon_state = "turkeybones" + drop_sound = 'sound/items/drop/food.ogg' + pickup_sound = 'sound/items/pickup/food.ogg' + /obj/item/trash/pistachios name = "pistachios packet" icon_state = "pistachios_pack" diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index ecd8df8456..3095bce584 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -65,8 +65,7 @@ var/light_glove_d = rand(2, 4) var/no_glove_d = rand(4, 6) var/list/forbidden_gloves = list( - /obj/item/clothing/gloves/sterile, - /obj/item/clothing/gloves/knuckledusters + /obj/item/clothing/gloves/sterile ) if(src == user.l_hand) diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 0e51b19eec..ad934b0d03 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -141,7 +141,7 @@ to_chat(user, span_notice("\the [src] is too full to possibly fit anything else inside of it.")) return - if (istype(W, /obj/item/ore)) + if (istype(W, /obj/item/ore) && !istype(W, /obj/item/ore/slag)) var/obj/item/ore/ore = W stored_ore[ore.material]++ current_capacity++ @@ -178,6 +178,8 @@ if(current_pickup >= max_pickup) max_pickup_reached = 1 break + if(istype(O, /obj/item/ore/slag)) + continue var/obj/item/ore/ore = O stored_ore[ore.material]++ current_capacity++ diff --git a/code/game/objects/items/weapons/storage/firstaid_vr.dm b/code/game/objects/items/weapons/storage/firstaid_vr.dm index ac7a0668dc..35bd4f4dea 100644 --- a/code/game/objects/items/weapons/storage/firstaid_vr.dm +++ b/code/game/objects/items/weapons/storage/firstaid_vr.dm @@ -71,6 +71,7 @@ /obj/item/storage/firstaid/surgery can_hold = list( + /obj/item/surgical/bone_clamp, /obj/item/surgical/bonesetter, /obj/item/surgical/cautery, /obj/item/surgical/circular_saw, diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm index adc5226093..51c745c1ce 100644 --- a/code/game/objects/random/misc.dm +++ b/code/game/objects/random/misc.dm @@ -263,7 +263,7 @@ prob(6);/obj/item/material/butterflyblade, prob(6);/obj/item/material/butterflyhandle, prob(2);/obj/item/material/butterfly/switchblade, - prob(2);/obj/item/clothing/gloves/knuckledusters, + prob(2);/obj/item/clothing/accessory/knuckledusters, prob(1);/obj/item/material/knife/tacknife, prob(1);/obj/item/clothing/suit/storage/vest/heavy/merc, prob(1);/obj/item/beartrap, diff --git a/code/game/objects/random/mob_vr.dm b/code/game/objects/random/mob_vr.dm index 6b7dfa3967..e13801e149 100644 --- a/code/game/objects/random/mob_vr.dm +++ b/code/game/objects/random/mob_vr.dm @@ -154,7 +154,7 @@ prob(4);/obj/item/storage/pill_bottle/zoom, prob(4);/obj/item/material/butterfly, prob(2);/obj/item/material/butterfly/switchblade, - prob(2);/obj/item/clothing/gloves/knuckledusters, + prob(2);/obj/item/clothing/accessory/knuckledusters, prob(2);/obj/item/reagent_containers/syringe/drugs, prob(1);/obj/item/material/knife/tacknife, prob(1);/obj/item/clothing/suit/storage/vest/heavy/merc, diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 62fa4b0be0..7800bba070 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -39,6 +39,23 @@ LINEN BINS return ..() +/obj/item/bedsheet/verb/turn_around() + set name = "Turn Around" + set category = "Object" + set src in oview(1) + + if(!usr || !isturf(usr.loc)) + return + if(usr.stat || usr.restrained()) + return + if(ismouse(usr) || (isobserver(usr) && !CONFIG_GET(flag/ghost_interaction))) + return + + if(dir >= 2) + src.set_dir(1) + else + src.set_dir(2) + /obj/item/bedsheet/blue icon_state = "sheetblue" diff --git a/code/game/objects/structures/crates_lockers/closets/misc_vr.dm b/code/game/objects/structures/crates_lockers/closets/misc_vr.dm index 1aba1626ec..f001c78f45 100644 --- a/code/game/objects/structures/crates_lockers/closets/misc_vr.dm +++ b/code/game/objects/structures/crates_lockers/closets/misc_vr.dm @@ -211,7 +211,7 @@ /obj/item/radio, /obj/item/gps/explorer, /obj/item/gun/energy/gun/protector/pilotgun/locked, - /obj/item/clothing/gloves/watch/survival, + /obj/item/clothing/accessory/watch/survival, /obj/item/clothing/accessory/storage/webbing/pilot1, /obj/item/clothing/accessory/storage/webbing/pilot2, /obj/item/emergency_beacon diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index 86b7c70f27..5557a27cf7 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -127,6 +127,10 @@ name = "chicken crate" starts_with = list(/mob/living/simple_mob/animal/passive/chick = 5) +/obj/structure/largecrate/animal/turkey + name = "turkey crate" + starts_with = list(/mob/living/simple_mob/vore/turkey) + /obj/structure/largecrate/animal/catslug name = "catslug carrier" starts_with = list(/mob/living/simple_mob/vore/alienanimals/catslug) diff --git a/code/game/objects/structures/ghost_pods/silicon.dm b/code/game/objects/structures/ghost_pods/silicon.dm index 64ac8f5674..4f50784aed 100644 --- a/code/game/objects/structures/ghost_pods/silicon.dm +++ b/code/game/objects/structures/ghost_pods/silicon.dm @@ -31,7 +31,6 @@ from the pod is not a crewmember.")) R.ckey = M.ckey visible_message(span_warning("As \the [src] opens, the eyes of the robot flicker as it is activated.")) - R.namepick() log_and_message_admins("successfully opened \a [src] and got a Lost Drone.") ..() @@ -57,7 +56,6 @@ definiton of 'your gravesite' is where your pod is.")) R.ckey = M.ckey visible_message(span_warning("As \the [src] opens, the eyes of the robot flicker as it is activated.")) - R.namepick() ..() /obj/structure/ghost_pod/ghost_activated/swarm_drone diff --git a/code/game/objects/structures/ghost_pods/silicon_vr.dm b/code/game/objects/structures/ghost_pods/silicon_vr.dm index cfc3b781d2..1039349f2e 100644 --- a/code/game/objects/structures/ghost_pods/silicon_vr.dm +++ b/code/game/objects/structures/ghost_pods/silicon_vr.dm @@ -21,7 +21,6 @@ from the pod is not a crewmember.")) R.ckey = M.ckey visible_message(span_warning("As \the [src] opens, the eyes of the robot flicker as it is activated.")) - R.namepick() log_and_message_admins("successfully opened \a [src] and got a Lost Drone.") used = TRUE return TRUE diff --git a/code/game/objects/structures/pillows.dm b/code/game/objects/structures/pillows.dm index 9f251db31d..075046fd81 100644 --- a/code/game/objects/structures/pillows.dm +++ b/code/game/objects/structures/pillows.dm @@ -40,6 +40,7 @@ icon_state = "pillowpile_large_pink" var/pillowpilefront = "/obj/structure/bed/pillowpilefront" var/sourcepillow = "/obj/item/bedsheet/pillow" + flippable = FALSE /obj/structure/bed/pillowpilefront name = "pillow pile" diff --git a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm index c9b71652be..b731aa690d 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm @@ -7,6 +7,7 @@ icon_state = "nest" var/health = 100 unacidable = TRUE + flippable = FALSE /obj/structure/bed/nest/update_icon() return diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 90ecec8c8b..ffb9073731 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -21,6 +21,7 @@ var/datum/material/padding_material var/base_icon = "bed" var/applies_material_colour = 1 + var/flippable = TRUE /obj/structure/bed/New(var/newloc, var/new_material, var/new_padding_material) ..(newloc) @@ -168,6 +169,30 @@ if(padding_material) padding_material.place_sheet(get_turf(src), 1) +/obj/structure/bed/verb/turn_around() + set name = "Turn Around" + set category = "Object" + set src in oview(1) + + if(!flippable) + to_chat(usr,span_notice("\The [src] can't face the other direction.")) + return + + if(!usr || !isturf(usr.loc)) + return + if(usr.stat || usr.restrained()) + return + if(ismouse(usr) || (isobserver(usr) && !CONFIG_GET(flag/ghost_interaction))) + return + if(dir == 2) + src.set_dir(1) + else if(dir == 1) + src.set_dir(2) + else if(dir == 4) + src.set_dir(8) + else if(dir == 8) + src.set_dir(4) + /obj/structure/bed/psych name = "psychiatrist's couch" desc = "For prime comfort during psychiatric evaluations." @@ -208,6 +233,7 @@ surgery_odds = 50 //VOREStation Edit var/bedtype = /obj/structure/bed/roller var/rollertype = /obj/item/roller + flippable = FALSE /obj/structure/bed/roller/adv name = "advanced roller bed" @@ -347,6 +373,7 @@ catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_bed) icon = 'icons/obj/abductor.dmi' icon_state = "bed" + flippable = FALSE /obj/structure/bed/alien/update_icon() return // Doesn't care about material or anything else. diff --git a/code/game/objects/structures/trash_pile_vr.dm b/code/game/objects/structures/trash_pile_vr.dm index 26d9b82066..c53a14b659 100644 --- a/code/game/objects/structures/trash_pile_vr.dm +++ b/code/game/objects/structures/trash_pile_vr.dm @@ -292,7 +292,7 @@ prob(3);/obj/item/cracker, prob(3);/obj/item/material/butterfly, prob(3);/obj/item/material/butterfly/switchblade, - prob(3);/obj/item/clothing/gloves/knuckledusters, + prob(3);/obj/item/clothing/accessory/knuckledusters, prob(3);/obj/item/clothing/gloves/heavy_engineer, prob(3);/obj/item/reagent_containers/syringe/drugs, prob(2);/obj/item/implanter/sizecontrol, diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 6b46ba2acb..6867af1386 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -91,10 +91,6 @@ dirtoverlay.alpha = min((dirt - 50) * 5, 255) /turf/simulated/Entered(atom/A, atom/OL) - if(movement_disabled && usr.ckey != movement_disabled_exception) - to_chat(usr, span_danger("Movement is admin-disabled.")) //This is to identify lag problems - return - if (istype(A,/mob/living)) var/mob/living/M = A if(M.lying || M.flying) //VOREStation Edit diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index d7630618e2..cfc998f72a 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -17,7 +17,7 @@ src.blocks_air = 0 set_opacity(0) for(var/turf/simulated/turf in loc) - air_master.mark_for_update(turf) + SSair.mark_for_update(turf) else can_open = WALL_OPENING //flick("[material.icon_base]fwall_closing", src) @@ -29,18 +29,18 @@ src.blocks_air = 1 set_opacity(1) for(var/turf/simulated/turf in loc) - air_master.mark_for_update(turf) + SSair.mark_for_update(turf) can_open = WALL_CAN_OPEN update_icon() /turf/simulated/wall/proc/update_air() - if(!air_master) + if(!SSair) return for(var/turf/simulated/turf in loc) update_thermal(turf) - air_master.mark_for_update(turf) + SSair.mark_for_update(turf) /turf/simulated/wall/proc/update_thermal(var/turf/simulated/source) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 213627e6e6..a44d915277 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -182,9 +182,6 @@ //There's a lot of QDELETED() calls here if someone can figure out how to optimize this but not runtime when something gets deleted by a Bump/CanPass/Cross call, lemme know or go ahead and fix this mess - kevinz000 /turf/Enter(atom/movable/mover, atom/oldloc) - if(movement_disabled && usr.ckey != movement_disabled_exception) - to_chat(usr, span_warning("Movement is admin-disabled.")) //This is to identify lag problems - return // Do not call ..() // Byond's default turf/Enter() doesn't have the behaviour we want with Bump() // By default byond will call Bump() on the first dense object in contents diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm index 72cb432e1b..54027edb89 100644 --- a/code/game/turfs/turf_changing.dm +++ b/code/game/turfs/turf_changing.dm @@ -21,6 +21,11 @@ if(istype(below)) below.update_icon() // To add or remove the 'ceiling-less' overlay. +/proc/has_valid_ZAS_zone(turf/simulated/T) + if(!istype(T)) + return FALSE + return HAS_VALID_ZONE(T) + //Creates a new turf /turf/proc/ChangeTurf(var/turf/N, var/tell_universe=1, var/force_lighting_update = 0, var/preserve_outdoors = FALSE) if (!N) @@ -28,7 +33,8 @@ if(N == /turf/space) var/turf/below = GetBelow(src) - if(istype(below) && (air_master.has_valid_zone(below) || air_master.has_valid_zone(src)) && !(src.z in using_map.below_blocked_levels) && (!istype(below, /turf/unsimulated/wall) && !istype(below, /turf/simulated/sky))) // VOREStation Edit: Weird open space + var/zones_present = has_valid_ZAS_zone(below) || has_valid_ZAS_zone(src) + if(istype(below) && zones_present && !(src.z in using_map.below_blocked_levels) && (!istype(below, /turf/unsimulated/wall) && !istype(below, /turf/simulated/sky))) // VOREStation Edit: Weird open space N = /turf/simulated/open var/obj/fire/old_fire = fire @@ -75,8 +81,8 @@ if(tell_universe) universe.OnTurfChange(W) - if(air_master) - air_master.mark_for_update(W) + if(SSair) + SSair.mark_for_update(W) for(var/turf/space/S in range(W, 1)) S.update_starlight() diff --git a/code/game/turfs/unsimulated/planetary.dm b/code/game/turfs/unsimulated/planetary.dm index c6be94c5ed..d73201c166 100644 --- a/code/game/turfs/unsimulated/planetary.dm +++ b/code/game/turfs/unsimulated/planetary.dm @@ -33,7 +33,7 @@ // Force ZAS to reconsider our connections because our temperature has changed if(connections) connections.erase_all() - air_master.mark_for_update(src) + SSair.mark_for_update(src) // Normal station/earth air. /turf/unsimulated/wall/planetary/normal @@ -67,4 +67,3 @@ oxygen = MOLES_O2STANDARD nitrogen = MOLES_N2STANDARD temperature = 310.92 // About 37.7C / 100F - diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index f7e33d15d3..4e67482292 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1284,23 +1284,6 @@ var/datum/announcement/minor/admin_min_announcer = new if(!ai_number) to_chat(usr, span_bold("No AIs located")) //Just so you know the thing is actually working and not just ignoring you. -/datum/admins/proc/show_skills() - set category = "Admin.Investigate" - set name = "Show Skills" - - if (!istype(src,/datum/admins)) - src = usr.client.holder - if (!istype(src,/datum/admins)) - to_chat(usr, "Error: you are not an admin!") - return - - var/mob/living/carbon/human/M = tgui_input_list(usr, "Select mob.", "Select mob.", human_mob_list) - if(!M) return - - show_skill_window(usr, M) - - return - /client/proc/update_mob_sprite(mob/living/carbon/human/H as mob) set category = "Admin.Game" set name = "Update Mob Sprite" diff --git a/code/modules/admin/admin_verb_lists.dm b/code/modules/admin/admin_verb_lists.dm index c0c031d244..44f5c6e1ca 100644 --- a/code/modules/admin/admin_verb_lists.dm +++ b/code/modules/admin/admin_verb_lists.dm @@ -84,7 +84,6 @@ var/list/admin_verbs_admin = list( /client/proc/cmd_admin_rejuvenate, /client/proc/toggleghostwriters, /client/proc/toggledrones, - /datum/admins/proc/show_skills, /client/proc/check_customitem_activity, /client/proc/man_up, /client/proc/global_man_up, @@ -355,7 +354,6 @@ var/list/admin_verbs_mod = list( /client/proc/colorooc, /client/proc/player_panel_new, /client/proc/dsay, - /datum/admins/proc/show_skills, /datum/admins/proc/show_player_panel, /client/proc/check_antagonists, /client/proc/aooc, @@ -472,7 +470,6 @@ var/list/admin_verbs_event_manager = list( /client/proc/cmd_admin_change_custom_event, /client/proc/cmd_admin_rejuvenate, /client/proc/toggleghostwriters, - /datum/admins/proc/show_skills, /client/proc/man_up, /client/proc/global_man_up, /client/proc/response_team, // Response Teams admin verb, diff --git a/code/modules/admin/admin_verb_lists_vr.dm b/code/modules/admin/admin_verb_lists_vr.dm index 4b29645516..fac337afb8 100644 --- a/code/modules/admin/admin_verb_lists_vr.dm +++ b/code/modules/admin/admin_verb_lists_vr.dm @@ -99,7 +99,6 @@ var/list/admin_verbs_admin = list( /client/proc/cmd_admin_rejuvenate, /client/proc/toggleghostwriters, /client/proc/toggledrones, - /datum/admins/proc/show_skills, /client/proc/check_customitem_activity, /client/proc/man_up, /client/proc/global_man_up, @@ -405,7 +404,6 @@ var/list/admin_verbs_mod = list( /client/proc/colorooc, /client/proc/player_panel_new, /client/proc/dsay, - /datum/admins/proc/show_skills, /datum/admins/proc/show_player_panel, /client/proc/check_antagonists, /client/proc/aooc, @@ -534,7 +532,6 @@ var/list/admin_verbs_event_manager = list( /client/proc/cmd_admin_change_custom_event, /client/proc/cmd_admin_rejuvenate, /client/proc/toggleghostwriters, - /datum/admins/proc/show_skills, /client/proc/man_up, /client/proc/global_man_up, /client/proc/response_team, // Response Teams admin verb, diff --git a/code/modules/admin/modify_robot.dm b/code/modules/admin/modify_robot.dm index 7141ae09f4..e0423f270b 100644 --- a/code/modules/admin/modify_robot.dm +++ b/code/modules/admin/modify_robot.dm @@ -43,9 +43,16 @@ qdel(source) . = ..() +/datum/eventkit/modify_robot/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/spritesheet/robot_icons) + ) + /datum/eventkit/modify_robot/tgui_data(mob/user) . = list() // Target section for general data + var/datum/asset/spritesheet/robot_icons/spritesheet = get_asset_datum(/datum/asset/spritesheet/robot_icons) + if(target) .["target"] = list() .["target"]["name"] = target.name @@ -62,10 +69,8 @@ // Target section for options once a module has been selected if(target.module) .["target"]["active"] = target.icon_selected - .["target"]["front"] = icon2base64(get_flat_icon(target,dir=SOUTH,no_anim=TRUE)) - .["target"]["side"] = icon2base64(get_flat_icon(target,dir=WEST,no_anim=TRUE)) - .["target"]["side_alt"] = icon2base64(get_flat_icon(target,dir=EAST,no_anim=TRUE)) - .["target"]["back"] = icon2base64(get_flat_icon(target,dir=NORTH,no_anim=TRUE)) + .["target"]["sprite"] = sanitize_css_class_name("[target.sprite_datum.type]") + .["target"]["sprite_size"] = spritesheet.icon_size_id(.["target"]["sprite"] + "S") .["target"]["modules"] = get_target_items(user) var/list/module_options = list() for(var/module in robot_modules) @@ -110,7 +115,7 @@ .["access_options"] = access_options // Section for source data for the module we might want to salvage if(source) - .["source"] += get_module_source(user) + .["source"] += get_module_source(user, spritesheet) var/list/all_robots = list() for(var/mob/living/silicon/robot/R in silicon_mob_list) if(!R.loc) @@ -573,10 +578,11 @@ target_items += list(list("name" = item.name, "ref" = "\ref[item]", "icon" = icon2html(item, user, sourceonly=TRUE), "desc" = item.desc)) return target_items -/datum/eventkit/modify_robot/proc/get_module_source(var/mob/user) +/datum/eventkit/modify_robot/proc/get_module_source(var/mob/user, var/datum/asset/spritesheet/robot_icons/spritesheet) var/list/source_list = list() source_list["model"] = source.module - source_list["front"] = icon2base64(get_flat_icon(source,dir=SOUTH,no_anim=TRUE)) + source_list["sprite"] = sanitize_css_class_name("[source.sprite_datum.type]") + source_list["sprite_size"] = spritesheet.icon_size_id(source_list["sprite"] + "S") var/list/source_items = list() for(var/obj/item in (source.module.modules | source.module.emag)) var/exists diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index d543c9e64c..198d877c91 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -599,10 +599,6 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) set category = "Admin" set name = "Adminhelp" - if(say_disabled) //This is here to try to identify lag problems - to_chat(usr, span_danger("Speech is currently admin-disabled.")) - return - //handle muting and automuting if(prefs.muted & MUTE_ADMINHELP) to_chat(src, span_danger("Error: Admin-PM: You cannot send adminhelps (Muted).")) diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm index 922e3c326e..aa3efca68d 100644 --- a/code/modules/admin/verbs/buildmode.dm +++ b/code/modules/admin/verbs/buildmode.dm @@ -830,9 +830,9 @@ if (!isturf(NT) || (NT in found) || (NT in pending)) continue // We ask ZAS to determine if its airtight. Thats what matters anyway right? - if(air_master.air_blocked(T, NT)) + if(SSair.air_blocked(T, NT)) // Okay thats the edge of the room - if(get_area_type_buildmode(NT.loc) == AREA_SPACE && air_master.air_blocked(NT, NT)) + if(get_area_type_buildmode(NT.loc) == AREA_SPACE && SSair.air_blocked(NT, NT)) found += NT // So we include walls/doors not already in any area continue if (istype(NT, /turf/space)) diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index 63b18ab07b..593be726a6 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -2,12 +2,12 @@ set category = "Debug.Investigate" set name = "Show Air Report" - if(!master_controller || !air_master) - tgui_alert_async(usr,"Master_controller or air_master not found.","Air Report") + if(!master_controller || !SSair) + tgui_alert_async(usr,"Master_controller or SSair not found.","Air Report") return - var/active_groups = air_master.active_zones - var/inactive_groups = air_master.zones.len - active_groups + var/active_groups = SSair.active_zones + var/inactive_groups = SSair.zones.len - active_groups var/hotspots = 0 for(var/obj/fire/hotspot in world) @@ -15,7 +15,7 @@ var/active_on_main_station = 0 var/inactive_on_main_station = 0 - for(var/zone/zone in air_master.zones) + for(var/zone/zone in SSair.zones) var/turf/simulated/turf = locate() in zone.contents if(turf?.z in using_map.station_levels) if(zone.needs_update) @@ -25,8 +25,8 @@ var/output = {"AIR SYSTEMS REPORT
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 22be10769d..5967b575b7 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 a33d77a405..1e3b8117e9 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/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index 572c1a5d26..564b087948 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -437,6 +437,45 @@ Insert("bottle-[i]", 'icons/obj/chemical.dmi', "bottle-[i]") +// Robot UI sprites +/datum/asset/spritesheet/robot_icons + name = "robot_icons" + +/datum/asset/spritesheet/robot_icons/create_spritesheets() + for(var/datum/robot_sprite/S as anything in typesof(/datum/robot_sprite)) + if(!S.name || !S.sprite_icon_state) // snowflake out those customs... they suck + continue + var/icon/I_N = icon(S.sprite_icon, S.sprite_icon_state, NORTH) + var/icon/I_S = icon(S.sprite_icon, S.sprite_icon_state, SOUTH) + var/icon/I_W = icon(S.sprite_icon, S.sprite_icon_state, WEST) + var/icon/I_E = icon(S.sprite_icon, S.sprite_icon_state, EAST) + if(S.has_eye_sprites) + var/icon/I_NE = icon(S.sprite_icon, "[S.sprite_icon_state]-eyes", NORTH) + if(I_NE) + I_N.Blend(I_NE, ICON_OVERLAY) + if(S.has_eye_sprites) + var/icon/I_SE = icon(S.sprite_icon, "[S.sprite_icon_state]-eyes", SOUTH) + if(I_SE) + I_S.Blend(I_SE, ICON_OVERLAY) + if(S.has_eye_sprites) + var/icon/I_WE = icon(S.sprite_icon, "[S.sprite_icon_state]-eyes", WEST) + if(I_WE) + I_W.Blend(I_WE, ICON_OVERLAY) + if(S.has_eye_sprites) + var/icon/I_EE = icon(S.sprite_icon, "[S.sprite_icon_state]-eyes", EAST) + if(I_EE) + I_E.Blend(I_EE, ICON_OVERLAY) + var/imgid = sanitize_css_class_name("[S.type]") + I_N.Scale(120, 120) + I_S.Scale(120, 120) + I_W.Scale(120, 120) + I_E.Scale(120, 120) + Insert(imgid + "N", I_N) + Insert(imgid + "S", I_S) + Insert(imgid + "W", I_W) + Insert(imgid + "E", I_E) + + //Cloning pod sprites for UIs /datum/asset/simple/cloning assets = list( diff --git a/code/modules/asset_cache/assets/chat.dm b/code/modules/asset_cache/assets/chat.dm index 0853ea542c..cbaf4ac35b 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 993a4126ac..73fe9978c5 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_accessories.dm b/code/modules/client/preference_setup/loadout/loadout_accessories.dm index d22bdcc20e..dcd8cf03c3 100644 --- a/code/modules/client/preference_setup/loadout/loadout_accessories.dm +++ b/code/modules/client/preference_setup/loadout/loadout_accessories.dm @@ -360,18 +360,18 @@ /datum/gear/accessory/wristband_collection display_name = "wristbands (selection)" - path = /obj/item/clothing/accessory/wristbandcollection + path = /obj/item/clothing/accessory/wristband/collection /datum/gear/accessory/wristband_collection/New() ..() var/list/wristband_lists = list( - "Green, Blue and Yellow" = /obj/item/clothing/accessory/wristbandcollection, - "Pink, Black and Red" = /obj/item/clothing/accessory/wristbandcollection/pink, - "Red and Orange" = /obj/item/clothing/accessory/wristbandcollection/les, - "White, Pink and Blue" = /obj/item/clothing/accessory/wristbandcollection/trans, - "Blue, Purple and Pink" = /obj/item/clothing/accessory/wristbandcollection/bi, - "Black, White and Grey" = /obj/item/clothing/accessory/wristbandcollection/ace, - "Spiked" = /obj/item/clothing/accessory/wristband_spiked + "Green, Blue and Yellow" = /obj/item/clothing/accessory/wristband/collection, + "Pink, Black and Red" = /obj/item/clothing/accessory/wristband/collection/pink, + "Red and Orange" = /obj/item/clothing/accessory/wristband/collection/les, + "White, Pink and Blue" = /obj/item/clothing/accessory/wristband/collection/trans, + "Blue, Purple and Pink" = /obj/item/clothing/accessory/wristband/collection/bi, + "Black, White and Grey" = /obj/item/clothing/accessory/wristband/collection/ace, + "Spiked" = /obj/item/clothing/accessory/wristband/spiked ) gear_tweaks += new/datum/gear_tweak/path(wristband_lists) diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm index c63f709505..17030caab0 100644 --- a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm @@ -271,7 +271,7 @@ // C CKEYS /datum/gear/fluff/cappy_watch - path = /obj/item/clothing/accessory/watch + path = /obj/item/clothing/accessory/watch/custom display_name = "Cappy's Pocket Watch" ckeywhitelist = list("cappycat") character_name = list("Cappy Fuzzlyfeathers") @@ -528,7 +528,7 @@ character_name = list("Elizabeth Bayou") /datum/gear/fluff/mercury_vopal_ring - path = /obj/item/clothing/gloves/ring/material/void_opal/fluff/mercury + path = /obj/item/clothing/accessory/ring/material/void_opal/fluff/mercury display_name = "Mercury's Mate Ring" ckeywhitelist = list("haloren") character_name = list("Mercury") @@ -694,6 +694,12 @@ ckeywhitelist = list("john.wayne9392") character_name = list("Harmony Pretchl") +/datum/gear/fluff/vox_dylo_pills + path = /obj/item/storage/pill_bottle/dylovene + display_name = "Dylovene pill bottle" + ckeywhitelist = list("jparker890") + character_name = list("Krey-Timinine") + /datum/gear/fluff/koyo_box path = /obj/item/storage/box/fluff/koyoakimomi display_name = "Koyo's Box" @@ -1239,6 +1245,13 @@ ckeywhitelist = list("satinisle") character_name = list("Parriz Tavakdavi") +/datum/gear/fluff/dark_tarot + path = /obj/item/deck/dark_tarot + display_name = "dark rose tarot deck" + ckeywhitelist = list("satinisle") + character_name = list("Millie Orlen") + + // T CKEYS /datum/gear/fluff/ascian_medal path = /obj/item/clothing/accessory/medal/silver/unity/tabiranth diff --git a/code/modules/client/preference_setup/loadout/loadout_general_vr.dm b/code/modules/client/preference_setup/loadout/loadout_general_vr.dm index 3909acf199..86a89ddfa8 100644 --- a/code/modules/client/preference_setup/loadout/loadout_general_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_general_vr.dm @@ -56,7 +56,6 @@ toytype["Big Red Button"] = /obj/item/toy/redbutton toytype["Garden gnome"] = /obj/item/toy/gnome toytype["Toy AI"] = /obj/item/toy/AI - toytype["Hand buzzer"] = /obj/item/clothing/gloves/ring/buzzer/toy toytype["Toy nuke"] = /obj/item/toy/nuke toytype["Toy gibber"] = /obj/item/toy/minigibber toytype["Toy xeno"] = /obj/item/toy/toy_xeno diff --git a/code/modules/client/preference_setup/loadout/loadout_gloves.dm b/code/modules/client/preference_setup/loadout/loadout_gloves.dm index 859d6a0c4c..29f22840e6 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 @@ -74,27 +75,27 @@ /datum/gear/gloves/ring display_name = "ring selection" description = "Choose from a number of rings." - path = /obj/item/clothing/gloves/ring + path = /obj/item/clothing/accessory/ring cost = 1 /datum/gear/gloves/ring/New() ..() var/ringtype = list() - ringtype["CTI ring"] = /obj/item/clothing/gloves/ring/cti - ringtype["Mariner University ring"] = /obj/item/clothing/gloves/ring/mariner - ringtype["engagement ring"] = /obj/item/clothing/gloves/ring/engagement - ringtype["signet ring"] = /obj/item/clothing/gloves/ring/seal/signet - ringtype["masonic ring"] = /obj/item/clothing/gloves/ring/seal/mason - ringtype["ring, glass"] = /obj/item/clothing/gloves/ring/material/glass - ringtype["ring, wood"] = /obj/item/clothing/gloves/ring/material/wood - ringtype["ring, plastic"] = /obj/item/clothing/gloves/ring/material/plastic - ringtype["ring, iron"] = /obj/item/clothing/gloves/ring/material/iron - ringtype["ring, bronze"] = /obj/item/clothing/gloves/ring/material/bronze - ringtype["ring, steel"] = /obj/item/clothing/gloves/ring/material/steel - ringtype["ring, copper"] = /obj/item/clothing/gloves/ring/material/copper - ringtype["ring, silver"] = /obj/item/clothing/gloves/ring/material/silver - ringtype["ring, gold"] = /obj/item/clothing/gloves/ring/material/gold - ringtype["ring, platinum"] = /obj/item/clothing/gloves/ring/material/platinum + ringtype["CTI ring"] = /obj/item/clothing/accessory/ring/cti + ringtype["Mariner University ring"] = /obj/item/clothing/accessory/ring/mariner + ringtype["engagement ring"] = /obj/item/clothing/accessory/ring/engagement + ringtype["signet ring"] = /obj/item/clothing/accessory/ring/seal/signet + ringtype["masonic ring"] = /obj/item/clothing/accessory/ring/seal/mason + ringtype["ring, glass"] = /obj/item/clothing/accessory/ring/material/glass + ringtype["ring, wood"] = /obj/item/clothing/accessory/ring/material/wood + ringtype["ring, plastic"] = /obj/item/clothing/accessory/ring/material/plastic + ringtype["ring, iron"] = /obj/item/clothing/accessory/ring/material/iron + ringtype["ring, bronze"] = /obj/item/clothing/accessory/ring/material/bronze + ringtype["ring, steel"] = /obj/item/clothing/accessory/ring/material/steel + ringtype["ring, copper"] = /obj/item/clothing/accessory/ring/material/copper + ringtype["ring, silver"] = /obj/item/clothing/accessory/ring/material/silver + ringtype["ring, gold"] = /obj/item/clothing/accessory/ring/material/gold + ringtype["ring, platinum"] = /obj/item/clothing/accessory/ring/material/platinum gear_tweaks += new/datum/gear_tweak/path(ringtype) @@ -105,14 +106,14 @@ /datum/gear/gloves/watch display_name = "wristwatch selector" description = "Pick from a range of wristwatches." - path = /obj/item/clothing/gloves/watch + path = /obj/item/clothing/accessory/watch /datum/gear/gloves/watch/New() ..() var/list/selector_watches = list( - "plain plastic"=/obj/item/clothing/gloves/watch, - "silver"=/obj/item/clothing/gloves/watch/silver, - "gold"=/obj/item/clothing/gloves/watch/gold, - "survival"=/obj/item/clothing/gloves/watch/survival + "plain plastic"=/obj/item/clothing/accessory/watch, + "silver"=/obj/item/clothing/accessory/watch/silver, + "gold"=/obj/item/clothing/accessory/watch/gold, + "survival"=/obj/item/clothing/accessory/watch/survival ) gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_watches)) diff --git a/code/modules/client/preference_setup/loadout/loadout_gloves_vr.dm b/code/modules/client/preference_setup/loadout/loadout_gloves_vr.dm index cfc0a6b105..fd25064e85 100644 --- a/code/modules/client/preference_setup/loadout/loadout_gloves_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_gloves_vr.dm @@ -1,10 +1,10 @@ /datum/gear/gloves/goldring display_name = "wedding ring, gold" - path = /obj/item/clothing/gloves/ring/wedding + path = /obj/item/clothing/accessory/ring/wedding /datum/gear/gloves/silverring display_name = "wedding ring, silver" - path = /obj/item/clothing/gloves/ring/wedding/silver + path = /obj/item/clothing/accessory/ring/wedding/silver /datum/gear/gloves/colored display_name = "gloves, colorable" diff --git a/code/modules/client/preference_setup/preference_setup.dm b/code/modules/client/preference_setup/preference_setup.dm index 1aa899e744..d43fb0529c 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 a77254d638..0000000000 --- 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) - . += "" - for(var/datum/skill/S in SKILLS[V]) - var/level = pref.skills[S.ID] - . += "" - . += "" - . += 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) - . += "" - . += "
[V]" - . += "
[S.name]
" - . = 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 31899796a2..f2d0f5b2da 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/advanced_who.dm b/code/modules/client/verbs/advanced_who.dm index 4c4af542a4..3e39936cf5 100644 --- a/code/modules/client/verbs/advanced_who.dm +++ b/code/modules/client/verbs/advanced_who.dm @@ -7,7 +7,7 @@ var/list/Lines = list() - if(holder) + if(check_rights(R_ADMIN|R_SERVER|R_MOD,FALSE,src)) for(var/client/C in GLOB.clients) var/entry = "[C.key]" if(C.holder && C.holder.fakekey) diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index 63d7793ce8..b07704693e 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/under/accessories/accessory.dm b/code/modules/clothing/accessories/accessory.dm similarity index 80% rename from code/modules/clothing/under/accessories/accessory.dm rename to code/modules/clothing/accessories/accessory.dm index 7c4b968b09..7610687a9a 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/accessories/accessory.dm @@ -12,6 +12,8 @@ var/image/inv_overlay = null // Overlay used when attached to clothing. var/image/mob_overlay = null var/overlay_state = null + var/punch_force = 0 // added melee damage + var/punch_damtype = BRUTE // added melee damage type var/concealed_holster = 0 var/mob/living/carbon/human/wearer = null // To check if the wearer changes, so species spritesheets change properly. var/list/on_rolled = list() // Used when jumpsuit sleevels are rolled ("rolled" entry) or it's rolled down ("down"). Set to "none" to hide in those states. @@ -82,6 +84,11 @@ src.forceMove(S) has_suit.add_overlay(get_inv_overlay()) + has_suit.force += force + if(istype(S,/obj/item/clothing/gloves)) + var/obj/item/clothing/gloves/has_gloves = S + has_gloves.punch_force = has_gloves.punch_force + punch_force + if(user) to_chat(user, span_notice("You attach \the [src] to \the [has_suit].")) add_fingerprint(user) @@ -90,6 +97,10 @@ if(!has_suit) return has_suit.cut_overlay(get_inv_overlay()) + has_suit.force = initial(has_suit.force) + if(istype(has_suit,/obj/item/clothing/gloves)) + var/obj/item/clothing/gloves/has_gloves = has_suit + has_gloves.punch_force = initial(has_gloves.punch_force) has_suit = null if(user) usr.put_in_hands(src) @@ -376,85 +387,6 @@ icon_state = "tesh_neckscarf" species_restricted = list(SPECIES_TESHARI) -//bracelets - -/obj/item/clothing/accessory/bracelet - name = "bracelet" - desc = "A simple silver bracelet with a clasp." - icon = 'icons/inventory/accessory/item.dmi' - icon_state = "bracelet" - w_class = ITEMSIZE_TINY - slot_flags = SLOT_TIE - slot = ACCESSORY_SLOT_DECOR - -/obj/item/clothing/accessory/bracelet/friendship - name = "friendship bracelet" - desc = "A beautiful friendship bracelet in all the colors of the rainbow." - icon_state = "friendbracelet" - -/obj/item/clothing/accessory/bracelet/friendship/verb/dedicate_bracelet() - set name = "Dedicate Bracelet" - set category = "Object" - set desc = "Dedicate your friendship bracelet to a special someone." - var/mob/M = usr - if(!M.mind) - return 0 - - var/input = sanitizeSafe(input(usr, "Who do you want to dedicate the bracelet to?", ,""), MAX_NAME_LEN) - - if(src && input && !M.stat && in_range(M,src)) - desc = "A beautiful friendship bracelet in all the colors of the rainbow. It's dedicated to [input]." - to_chat(M, "You dedicate the bracelet to [input], remembering the times you've had together.") - return 1 - - -/obj/item/clothing/accessory/bracelet/material - icon_state = "materialbracelet" - -/obj/item/clothing/accessory/bracelet/material/New(var/newloc, var/new_material) - ..(newloc) - if(!new_material) - new_material = MAT_STEEL - material = get_material_by_name(new_material) - if(!istype(material)) - qdel(src) - return - name = "[material.display_name] bracelet" - desc = "A bracelet made from [material.display_name]." - color = material.icon_colour - -/obj/item/clothing/accessory/bracelet/material/get_material() - return material - -/obj/item/clothing/accessory/bracelet/material/wood/New(var/newloc) - ..(newloc, "wood") - -/obj/item/clothing/accessory/bracelet/material/plastic/New(var/newloc) - ..(newloc, "plastic") - -/obj/item/clothing/accessory/bracelet/material/iron/New(var/newloc) - ..(newloc, "iron") - -/obj/item/clothing/accessory/bracelet/material/steel/New(var/newloc) - ..(newloc, "steel") - -/obj/item/clothing/accessory/bracelet/material/silver/New(var/newloc) - ..(newloc, "silver") - -/obj/item/clothing/accessory/bracelet/material/gold/New(var/newloc) - ..(newloc, "gold") - -/obj/item/clothing/accessory/bracelet/material/platinum/New(var/newloc) - ..(newloc, "platinum") - -/obj/item/clothing/accessory/bracelet/material/phoron/New(var/newloc) - ..(newloc, "phoron") - -/obj/item/clothing/accessory/bracelet/material/glass/New(var/newloc) - ..(newloc, "glass") - - ..() - /obj/item/clothing/accessory/halfcape name = "half cape" desc = "A tasteful half-cape, suitible for European nobles and retro anime protagonists." @@ -473,78 +405,6 @@ icon_state = "sash" slot = ACCESSORY_SLOT_OVER -/obj/item/clothing/accessory/wristband - name = "wristband" - desc = "A simple plastic wristband." - icon = 'icons/inventory/accessory/item.dmi' - icon_state = "wristband" - w_class = ITEMSIZE_TINY - slot_flags = SLOT_TIE - slot = ACCESSORY_SLOT_DECOR - -/obj/item/clothing/accessory/wristbandcollection - name = "wristband collection" - desc = "A mix of colourable plastic wristbands." - icon = 'icons/inventory/accessory/item.dmi' - icon_state = "wristband_collection" - w_class = ITEMSIZE_TINY - slot_flags = SLOT_TIE - slot = ACCESSORY_SLOT_DECOR - -/obj/item/clothing/accessory/wristbandcollection/pink - name = "wristband collection" - desc = "A mix of colourable plastic wristbands." - icon = 'icons/inventory/accessory/item.dmi' - icon_state = "wristband_collection2" - w_class = ITEMSIZE_TINY - slot_flags = SLOT_TIE - slot = ACCESSORY_SLOT_DECOR - -/obj/item/clothing/accessory/wristbandcollection/les - name = "wristband collection" - desc = "A mix of colourable plastic wristbands." - icon = 'icons/inventory/accessory/item.dmi' - icon_state = "wristband_collection3" - w_class = ITEMSIZE_TINY - slot_flags = SLOT_TIE - slot = ACCESSORY_SLOT_DECOR - -/obj/item/clothing/accessory/wristbandcollection/trans - name = "wristband collection" - desc = "A mix of colourable plastic wristbands." - icon = 'icons/inventory/accessory/item.dmi' - icon_state = "wristband_collection4" - w_class = ITEMSIZE_TINY - slot_flags = SLOT_TIE - slot = ACCESSORY_SLOT_DECOR - -/obj/item/clothing/accessory/wristbandcollection/bi - name = "wristband collection" - desc = "A mix of colourable plastic wristbands." - icon = 'icons/inventory/accessory/item.dmi' - icon_state = "wristband_collection5" - w_class = ITEMSIZE_TINY - slot_flags = SLOT_TIE - slot = ACCESSORY_SLOT_DECOR - -/obj/item/clothing/accessory/wristbandcollection/ace - name = "wristband collection" - desc = "A mix of colourable plastic wristbands." - icon = 'icons/inventory/accessory/item.dmi' - icon_state = "wristband_collection6" - w_class = ITEMSIZE_TINY - slot_flags = SLOT_TIE - slot = ACCESSORY_SLOT_DECOR - -/obj/item/clothing/accessory/wristband_spiked - name = "wristband (spiked)" - desc = "A black wristband with short spikes around it." - icon = 'icons/inventory/accessory/item.dmi' - icon_state = "wristband_spiked" - w_class = ITEMSIZE_TINY - slot_flags = SLOT_TIE - slot = ACCESSORY_SLOT_DECOR - //Gaiter scarves /obj/item/clothing/accessory/gaiter name = "red neck gaiter" diff --git a/code/modules/clothing/under/accessories/accessory_vr.dm b/code/modules/clothing/accessories/accessory_vr.dm similarity index 100% rename from code/modules/clothing/under/accessories/accessory_vr.dm rename to code/modules/clothing/accessories/accessory_vr.dm diff --git a/code/modules/clothing/under/accessories/altevian_vr.dm b/code/modules/clothing/accessories/altevian_vr.dm similarity index 100% rename from code/modules/clothing/under/accessories/altevian_vr.dm rename to code/modules/clothing/accessories/altevian_vr.dm diff --git a/code/modules/clothing/under/accessories/armband.dm b/code/modules/clothing/accessories/armband.dm similarity index 100% rename from code/modules/clothing/under/accessories/armband.dm rename to code/modules/clothing/accessories/armband.dm diff --git a/code/modules/clothing/under/accessories/armor.dm b/code/modules/clothing/accessories/armor.dm similarity index 100% rename from code/modules/clothing/under/accessories/armor.dm rename to code/modules/clothing/accessories/armor.dm diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/accessories/badges.dm similarity index 100% rename from code/modules/clothing/under/accessories/badges.dm rename to code/modules/clothing/accessories/badges.dm diff --git a/code/modules/clothing/under/accessories/badges_vr.dm b/code/modules/clothing/accessories/badges_vr.dm similarity index 100% rename from code/modules/clothing/under/accessories/badges_vr.dm rename to code/modules/clothing/accessories/badges_vr.dm diff --git a/code/modules/clothing/under/accessories/clothing.dm b/code/modules/clothing/accessories/clothing.dm similarity index 100% rename from code/modules/clothing/under/accessories/clothing.dm rename to code/modules/clothing/accessories/clothing.dm diff --git a/code/modules/clothing/under/accessories/clothing_vr.dm b/code/modules/clothing/accessories/clothing_vr.dm similarity index 100% rename from code/modules/clothing/under/accessories/clothing_vr.dm rename to code/modules/clothing/accessories/clothing_vr.dm diff --git a/code/modules/clothing/accessories/hands.dm b/code/modules/clothing/accessories/hands.dm new file mode 100644 index 0000000000..2ac4386e6a --- /dev/null +++ b/code/modules/clothing/accessories/hands.dm @@ -0,0 +1,141 @@ +/obj/item/clothing/accessory/knuckledusters + name = "knuckle dusters" + desc = "A pair of brass knuckles. Generally used to enhance the user's punches." + icon_state = "knuckledusters" + slot = ACCESSORY_SLOT_RING + slot_flags = SLOT_GLOVES + matter = list(MAT_STEEL = 500) + attack_verb = list("punched", "beaten", "struck") + siemens_coefficient = 1 + force = 10 //base punch strength is 5 + punch_force = 5 //added to base punch strength when added as a glove accessory + icon = 'icons/inventory/hands/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_gloves.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi', + ) + drop_sound = 'sound/items/drop/metalboots.ogg' + pickup_sound = 'sound/items/pickup/toolbox.ogg' + +//bracelets + +/obj/item/clothing/accessory/bracelet + name = "bracelet" + desc = "A simple silver bracelet with a clasp." + icon = 'icons/inventory/accessory/item.dmi' + icon_state = "bracelet" + w_class = ITEMSIZE_TINY + slot_flags = SLOT_GLOVES | SLOT_TIE + slot = ACCESSORY_SLOT_WRIST + +/obj/item/clothing/accessory/bracelet/friendship + name = "friendship bracelet" + desc = "A beautiful friendship bracelet in all the colors of the rainbow." + icon_state = "friendbracelet" + +/obj/item/clothing/accessory/bracelet/friendship/verb/dedicate_bracelet() + set name = "Dedicate Bracelet" + set category = "Object" + set desc = "Dedicate your friendship bracelet to a special someone." + var/mob/M = usr + if(!M.mind) + return 0 + + var/input = sanitizeSafe(input(usr, "Who do you want to dedicate the bracelet to?", ,""), MAX_NAME_LEN) + + if(src && input && !M.stat && in_range(M,src)) + desc = "A beautiful friendship bracelet in all the colors of the rainbow. It's dedicated to [input]." + to_chat(M, "You dedicate the bracelet to [input], remembering the times you've had together.") + return 1 + + +/obj/item/clothing/accessory/bracelet/material + icon_state = "materialbracelet" + +/obj/item/clothing/accessory/bracelet/material/New(var/newloc, var/new_material) + ..(newloc) + if(!new_material) + new_material = MAT_STEEL + material = get_material_by_name(new_material) + if(!istype(material)) + qdel(src) + return + name = "[material.display_name] bracelet" + desc = "A bracelet made from [material.display_name]." + color = material.icon_colour + +/obj/item/clothing/accessory/bracelet/material/get_material() + return material + +/obj/item/clothing/accessory/bracelet/material/wood/New(var/newloc) + ..(newloc, "wood") + +/obj/item/clothing/accessory/bracelet/material/plastic/New(var/newloc) + ..(newloc, "plastic") + +/obj/item/clothing/accessory/bracelet/material/iron/New(var/newloc) + ..(newloc, "iron") + +/obj/item/clothing/accessory/bracelet/material/steel/New(var/newloc) + ..(newloc, "steel") + +/obj/item/clothing/accessory/bracelet/material/silver/New(var/newloc) + ..(newloc, "silver") + +/obj/item/clothing/accessory/bracelet/material/gold/New(var/newloc) + ..(newloc, "gold") + +/obj/item/clothing/accessory/bracelet/material/platinum/New(var/newloc) + ..(newloc, "platinum") + +/obj/item/clothing/accessory/bracelet/material/phoron/New(var/newloc) + ..(newloc, "phoron") + +/obj/item/clothing/accessory/bracelet/material/glass/New(var/newloc) + ..(newloc, "glass") + +//wristbands + +/obj/item/clothing/accessory/wristband + name = "wristband" + desc = "A simple plastic wristband." + icon = 'icons/inventory/accessory/item.dmi' + icon_state = "wristband" + w_class = ITEMSIZE_TINY + slot_flags = SLOT_GLOVES | SLOT_TIE + slot = ACCESSORY_SLOT_WRIST + +/obj/item/clothing/accessory/wristband/spiked + name = "wristband (spiked)" + desc = "A black wristband with short spikes around it." + icon_state = "wristband_spiked" + +/obj/item/clothing/accessory/wristband/collection + name = "wristband collection" + desc = "A mix of colourable plastic wristbands." + icon_state = "wristband_collection" + +/obj/item/clothing/accessory/wristband/collection/pink + name = "wristband collection" + desc = "A mix of colourable plastic wristbands." + icon_state = "wristband_collection2" + +/obj/item/clothing/accessory/wristband/collection/les + name = "wristband collection" + desc = "A mix of colourable plastic wristbands." + icon_state = "wristband_collection3" + +/obj/item/clothing/accessory/wristband/collection/trans + name = "wristband collection" + desc = "A mix of colourable plastic wristbands." + icon_state = "wristband_collection4" + +/obj/item/clothing/accessory/wristband/collection/bi + name = "wristband collection" + desc = "A mix of colourable plastic wristbands." + icon_state = "wristband_collection5" + +/obj/item/clothing/accessory/wristband/collection/ace + name = "wristband collection" + desc = "A mix of colourable plastic wristbands." + icon_state = "wristband_collection6" diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/accessories/holster.dm similarity index 100% rename from code/modules/clothing/under/accessories/holster.dm rename to code/modules/clothing/accessories/holster.dm diff --git a/code/modules/clothing/under/accessories/holster_vr.dm b/code/modules/clothing/accessories/holster_vr.dm similarity index 100% rename from code/modules/clothing/under/accessories/holster_vr.dm rename to code/modules/clothing/accessories/holster_vr.dm diff --git a/code/modules/clothing/under/accessories/lockets.dm b/code/modules/clothing/accessories/lockets.dm similarity index 100% rename from code/modules/clothing/under/accessories/lockets.dm rename to code/modules/clothing/accessories/lockets.dm diff --git a/code/modules/clothing/under/accessories/permits.dm b/code/modules/clothing/accessories/permits.dm similarity index 100% rename from code/modules/clothing/under/accessories/permits.dm rename to code/modules/clothing/accessories/permits.dm diff --git a/code/modules/clothing/under/accessories/permits_vr.dm b/code/modules/clothing/accessories/permits_vr.dm similarity index 100% rename from code/modules/clothing/under/accessories/permits_vr.dm rename to code/modules/clothing/accessories/permits_vr.dm diff --git a/code/modules/clothing/accessories/rings.dm b/code/modules/clothing/accessories/rings.dm new file mode 100644 index 0000000000..361c87c854 --- /dev/null +++ b/code/modules/clothing/accessories/rings.dm @@ -0,0 +1,204 @@ +//Generic Ring + +/obj/item/clothing/accessory/ring + name = "generic ring" + desc = "Torus shaped finger decoration." + icon_state = "material" + drop_sound = 'sound/items/drop/ring.ogg' + slot = ACCESSORY_SLOT_RING + slot_flags = SLOT_GLOVES + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_gloves.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi', + ) + gender = PLURAL + w_class = ITEMSIZE_SMALL + icon = 'icons/inventory/hands/item.dmi' + drop_sound = 'sound/items/drop/ring.ogg' + pickup_sound = 'sound/items/pickup/ring.ogg' + force = 7 //base punch strength is 5 + punch_force = 2 //added to base punch strength when added as a glove accessory + siemens_coefficient = 1 + +///////////////////////////////////////// +//Standard Rings +/obj/item/clothing/accessory/ring/engagement + name = "engagement ring" + desc = "An engagement ring. It certainly looks expensive." + icon_state = "diamond" + +/obj/item/clothing/accessory/ring/engagement/attack_self(mob/user) + user.visible_message(span_warning("\The [user] gets down on one knee, presenting \the [src]."),span_warning("You get down on one knee, presenting \the [src].")) + +/obj/item/clothing/accessory/ring/cti + name = "CTI ring" + desc = "A ring commemorating graduation from CTI." + icon_state = "cti-grad" + +/obj/item/clothing/accessory/ring/mariner + name = "Mariner University ring" + desc = "A ring commemorating graduation from Mariner University." + icon_state = "mariner-grad" + + +///////////////////////////////////////// +//Reagent Rings + +/obj/item/clothing/accessory/ring/reagent + flags = OPENCONTAINER + origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 4) + +/obj/item/clothing/accessory/ring/reagent/Initialize() + . = ..() + create_reagents(15) + +/obj/item/clothing/accessory/ring/reagent/equipped(var/mob/living/carbon/human/H) + ..() + if(istype(H) && H.gloves==src) + + if(reagents.total_volume) + to_chat(H, span_danger("You feel a prick as you slip on \the [src].")) + if(H.reagents) + var/contained = reagents.get_reagents() + var/trans = reagents.trans_to_mob(H, 15, CHEM_BLOOD) + add_attack_logs(usr, H, "Injected with [name] containing [contained] transferred [trans] units") + return + +//Sleepy Ring +/obj/item/clothing/accessory/ring/reagent/sleepy + name = "silver ring" + desc = "A ring made from what appears to be silver." + icon_state = "material" + origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 5) + +/obj/item/clothing/accessory/ring/reagent/sleepy/Initialize() + . = ..() + reagents.add_reagent("chloralhydrate", 15) // Less than a sleepy-pen, but still enough to knock someone out + +///////////////////////////////////////// +//Seals and Signet Rings + +/obj/item/clothing/accessory/ring/seal + var/stamptext = null + +/obj/item/clothing/accessory/ring/seal/secgen + name = "Secretary-General's official seal" + desc = "The official seal of the Secretary-General of the Sol Central Government, featured prominently on a silver ring." + icon_state = "seal-secgen" + +/obj/item/clothing/accessory/ring/seal/mason + name = "\improper Masonic ring" + desc = "The Square and Compasses feature prominently on this Masonic ring." + icon_state = "seal-masonic" + +/obj/item/clothing/accessory/ring/seal/signet + name = "signet ring" + desc = "A signet ring, for when you're too sophisticated to sign letters." + icon_state = "seal-signet" + var/nameset = FALSE + +/obj/item/clothing/accessory/ring/seal/signet/attack_self(mob/user) + if(nameset) + to_chat(user, span_notice("The [src] has already been claimed!")) + return + + to_chat(user, span_notice("You claim the [src] as your own!")) + change_name(user) + nameset = TRUE + +/obj/item/clothing/accessory/ring/seal/signet/proc/change_name(var/signet_name = "Unknown") + name = "[signet_name]'s signet ring" + desc = "A signet ring belonging to [signet_name], for when you're too sophisticated to sign letters." + +/obj/item/clothing/accessory/ring/wedding + name = "golden wedding ring" + desc = "For showing your devotion to another person. It has a golden glimmer to it." + icon = 'icons/inventory/hands/item_vr.dmi' + icon_state = "wedring_g" + item_state = "wedring_g" + var/partnername = "" + +/obj/item/clothing/accessory/ring/wedding/attack_self(mob/user) + partnername = copytext(sanitize(input(user, "Would you like to change the holoengraving on the ring?", "Name your spouse", "Bae") as null|text),1,MAX_NAME_LEN) + name = "[initial(name)] - [partnername]" + +/obj/item/clothing/accessory/ring/wedding/silver + name = "silver wedding ring" + desc = "For showing your devotion to another person. It has a silver glimmer to it." + icon_state = "wedring_s" + item_state = "wedring_s" + +///////////////////////////////////////// +//Material Rings +/obj/item/clothing/accessory/ring/material + icon = 'icons/inventory/hands/item.dmi' + icon_state = "material" + +/obj/item/clothing/accessory/ring/material/New(var/newloc, var/new_material) + ..(newloc) + if(!new_material) + new_material = MAT_STEEL + material = get_material_by_name(new_material) + if(!istype(material)) + qdel(src) + return + name = "[material.display_name] ring" + desc = "A ring made from [material.display_name]." + color = material.icon_colour + +/obj/item/clothing/accessory/ring/material/get_material() + return material + +/obj/item/clothing/accessory/ring/material/wood/New(var/newloc) + ..(newloc, MAT_WOOD) + +/obj/item/clothing/accessory/ring/material/plastic/New(var/newloc) + ..(newloc, MAT_PLASTIC) + +/obj/item/clothing/accessory/ring/material/iron/New(var/newloc) + ..(newloc, MAT_IRON) + +/obj/item/clothing/accessory/ring/material/glass/New(var/newloc) + ..(newloc, MAT_GLASS) + +/obj/item/clothing/accessory/ring/material/steel/New(var/newloc) + ..(newloc, MAT_STEEL) + +/obj/item/clothing/accessory/ring/material/silver/New(var/newloc) + ..(newloc, MAT_SILVER) + +/obj/item/clothing/accessory/ring/material/gold/New(var/newloc) + ..(newloc, MAT_GOLD) + +/obj/item/clothing/accessory/ring/material/platinum/New(var/newloc) + ..(newloc, MAT_PLATINUM) + +/obj/item/clothing/accessory/ring/material/phoron/New(var/newloc) + ..(newloc, MAT_PHORON) + +/obj/item/clothing/accessory/ring/material/titanium/New(var/newloc) + ..(newloc, MAT_TITANIUM) + +/obj/item/clothing/accessory/ring/material/copper/New(var/newloc) + ..(newloc, MAT_COPPER) + +/obj/item/clothing/accessory/ring/material/bronze/New(var/newloc) + ..(newloc, MAT_BRONZE) + +/obj/item/clothing/accessory/ring/material/uranium/New(var/newloc) + ..(newloc, MAT_URANIUM) + +/obj/item/clothing/accessory/ring/material/osmium/New(var/newloc) + ..(newloc, MAT_OSMIUM) + +/obj/item/clothing/accessory/ring/material/lead/New(var/newloc) + ..(newloc, MAT_LEAD) + +/obj/item/clothing/accessory/ring/material/diamond/New(var/newloc) + ..(newloc, MAT_DIAMOND) + +/obj/item/clothing/accessory/ring/material/tin/New(var/newloc) + ..(newloc, MAT_TIN) + +/obj/item/clothing/accessory/ring/material/void_opal/New(var/newloc) + ..(newloc, MAT_VOPAL) diff --git a/code/modules/clothing/under/accessories/shiny_vr.dm b/code/modules/clothing/accessories/shiny_vr.dm similarity index 100% rename from code/modules/clothing/under/accessories/shiny_vr.dm rename to code/modules/clothing/accessories/shiny_vr.dm diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/accessories/storage.dm similarity index 100% rename from code/modules/clothing/under/accessories/storage.dm rename to code/modules/clothing/accessories/storage.dm diff --git a/code/modules/clothing/under/accessories/storage_vr.dm b/code/modules/clothing/accessories/storage_vr.dm similarity index 100% rename from code/modules/clothing/under/accessories/storage_vr.dm rename to code/modules/clothing/accessories/storage_vr.dm diff --git a/code/modules/clothing/under/accessories/temperature/poncho.dm b/code/modules/clothing/accessories/temperature/poncho.dm similarity index 100% rename from code/modules/clothing/under/accessories/temperature/poncho.dm rename to code/modules/clothing/accessories/temperature/poncho.dm diff --git a/code/modules/clothing/under/accessories/torch.dm b/code/modules/clothing/accessories/torch.dm similarity index 100% rename from code/modules/clothing/under/accessories/torch.dm rename to code/modules/clothing/accessories/torch.dm diff --git a/code/modules/clothing/under/accessories/torch_vr.dm b/code/modules/clothing/accessories/torch_vr.dm similarity index 100% rename from code/modules/clothing/under/accessories/torch_vr.dm rename to code/modules/clothing/accessories/torch_vr.dm diff --git a/code/modules/clothing/accessories/watches.dm b/code/modules/clothing/accessories/watches.dm new file mode 100644 index 0000000000..5a93cb94f0 --- /dev/null +++ b/code/modules/clothing/accessories/watches.dm @@ -0,0 +1,72 @@ +/obj/item/clothing/accessory/watch + name = "wristwatch" + desc = "A cheap plastic quartz-based wristwatch. Painfully archaic by modern standards, but there's something charming about it all the same." + icon_state = "wristwatch_basic" + siemens_coefficient = 1 + gender = "neuter" + slot = ACCESSORY_SLOT_WRIST + slot_flags = SLOT_GLOVES + icon = 'icons/inventory/hands/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_gloves.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi', + ) + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/hands/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/hands/mob_vox.dmi' + ) + +/obj/item/clothing/accessory/watch/examine(mob/user) + . = ..() + + if(Adjacent(user)) + . += span_notice("The current station time is [stationtime2text()].") + +/obj/item/clothing/accessory/watch/silver + name = "silver wristwatch" + desc = "A humble silver (or maybe chrome) plated wristwatch. It's quite archaic, but nonetheless classy in its own way." + icon_state = "wristwatch_silver" + +/obj/item/clothing/accessory/watch/gold + name = "gold wristwatch" + desc = "A very fancy gold-plated wristwatch. For when you want to casually show off just how wealthy you are. It even tells the time!" + icon_state = "wristwatch_gold" + +/obj/item/clothing/accessory/watch/survival + name = "survival watch" + desc = "An overengineered wristwatch that purports to be both space and water proof, and includes a compass, micro GPS beacon, and temperature and pressure sensors. The beacon is off by default, and can only transmit its location: it cannot scan for other signals." + description_fluff = "Hold ALT whilst left-clicking on the survival watch to toggle the status of its micro-beacon." + icon_state = "wristwatch_survival" + + var/obj/item/gps/gps = null + +/obj/item/clothing/accessory/watch/survival/examine(mob/user) + . = ..() + + if(Adjacent(user)) + . += span_notice("You are currently facing [dir2text(user.dir)]. The micro beacon is [gps.tracking ? "on" : "off"].") + var/TB = user.loc + if(istype(TB, /turf/)) //no point returning light level if we're not on a turf (might be *in* someone!) + var/turf/TL = TB + var/light_level = TL.get_lumcount() + if(light_level) + . += span_notice("Light Level: [TL.get_lumcount()]") + else + . += span_notice("It's too dark to see the light level!") + if(istype(TB, /turf/simulated)) //no point returning atmospheric data from unsimulated tiles (they don't track pressure anyway, only temperature) + var/turf/simulated/T = TB + var/datum/gas_mixture/env = T.return_air() + . += span_notice("Pressure: [env.return_pressure()]kPa / Temperature: [env.temperature]K ") + +/obj/item/clothing/accessory/watch/survival/New() + gps = new/obj/item/gps/watch(src) + +/obj/item/gps/watch + gps_tag = "SRV-WTCH" + +/obj/item/clothing/accessory/watch/survival/AltClick(mob/user) + . = ..() + + if(Adjacent(user)) + gps.tracking = !gps.tracking + to_chat(user,span_notice("You turn the micro beacon [gps.tracking ? "on" : "off"].")) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 45f808a148..9f8d9e9db2 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -326,6 +326,13 @@ drop_sound = 'sound/items/drop/gloves.ogg' pickup_sound = 'sound/items/pickup/gloves.ogg' + valid_accessory_slots = (\ + ACCESSORY_SLOT_RING\ + |ACCESSORY_SLOT_WRIST) + restricted_accessory_slots = (\ + ACCESSORY_SLOT_RING\ + |ACCESSORY_SLOT_WRIST) + /obj/item/clothing/proc/set_clothing_index() return @@ -422,8 +429,6 @@ if(special_attack_type && ispath(special_attack_type)) special_attack = new special_attack_type - - ///////////////////////////////////////////////////////////////////// //Rings @@ -849,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 572f45c0b5..f2002c95c6 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/antagonist.dm b/code/modules/clothing/gloves/antagonist.dm index 83e595a0dd..34574e2e53 100644 --- a/code/modules/clothing/gloves/antagonist.dm +++ b/code/modules/clothing/gloves/antagonist.dm @@ -88,70 +88,3 @@ if(proximity && istype(usr, /mob/living/carbon/human) && do_after(usr, 1 SECOND, A)) return pickpocket(usr, A, proximity) return 0 - -// Buzzer Ring - Traitor, Merc. -/obj/item/clothing/gloves/ring/buzzer - name = "ring" - desc = "A plain metal band." - description_antag = "This morphium-alloy ring continually generates an electric field, capable of electrocuting a target while not injuring the wearer.\ - The device is also capable of 'frankenstein'-ing a corpse, long after normal technology would be able to save them. The body will still be tied to the\ - normal damage limits for survival, however, so care must be taken." - icon_state = "material" - var/battery_type = /obj/item/cell/device/weapon/recharge - var/obj/item/cell/battery = null - -/obj/item/clothing/gloves/ring/buzzer/get_cell() - return battery - -/obj/item/clothing/gloves/ring/buzzer/Initialize() - . = ..() - if(!battery) - battery = new battery_type(src) - -/obj/item/clothing/gloves/ring/buzzer/Touch(var/atom/A, var/proximity) - if(proximity && istype(usr, /mob/living/carbon/human)) - return zap(usr, A, proximity) - return 0 - -/obj/item/clothing/gloves/ring/buzzer/proc/zap(var/mob/living/carbon/human/user, var/atom/movable/target, var/proximity) - . = FALSE - if(user.a_intent == I_HURT && battery.percent() >= 50) - if(isliving(target)) - var/mob/living/L = target - - if(ishuman(L) && battery.percent() >= 90) // Silent text-wise, for maximum potential for gimmicks. - var/mob/living/carbon/human/H = L - - if(H.stat == DEAD) - . = TRUE - - do_defib(H) - - to_chat(L, span_warning("You feel a powerful shock!")) - if(!.) - playsound(L, 'sound/effects/sparks7.ogg', 40, 1) - L.electrocute_act(battery.percent() * 0.25, src) - battery.emp_act(2) - return . - - return 0 - -/obj/item/clothing/gloves/ring/buzzer/proc/do_defib(var/mob/living/carbon/human/H = null) - if(!istype(H)) - return 0 - - dead_mob_list.Remove(H) - if((H in living_mob_list) || (H in dead_mob_list)) - WARNING("Mob [H] was ring-defibbed but already in the living or dead list still!") - living_mob_list += H - - H.timeofdeath = 0 - H.set_stat(UNCONSCIOUS) - H.failed_last_breath = 0 - H.reload_fullscreen() - - H.emote("gasp") - H.Weaken(rand(10,25)) - H.updatehealth() - - battery.emp_act(1) diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 32012ed330..f71010a232 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/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 3862469c85..31e641348a 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -121,21 +121,6 @@ heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE -/obj/item/clothing/gloves/knuckledusters - name = "knuckle dusters" - desc = "A pair of brass knuckles. Generally used to enhance the user's punches." - icon_state = "knuckledusters" - matter = list(MAT_STEEL = 500) - attack_verb = list("punched", "beaten", "struck") - flags = THICKMATERIAL // Stops rings from increasing hit strength - siemens_coefficient = 1 - fingerprint_chance = 100 - overgloves = 1 - force = 5 - punch_force = 5 - drop_sound = 'sound/items/drop/metalboots.ogg' - pickup_sound = 'sound/items/pickup/toolbox.ogg' - /obj/item/clothing/gloves/ranger var/glovecolor = "white" name = "ranger gloves" @@ -172,65 +157,3 @@ name = "water wings" desc = "Swim aids designed to help a wearer float in water and learn to swim." icon_state = "waterwings" - -/obj/item/clothing/gloves/watch - name = "wristwatch" - desc = "A cheap plastic quartz-based wristwatch. Painfully archaic by modern standards, but there's something charming about it all the same." - icon_state = "wristwatch_basic" - siemens_coefficient = 1 - gender = "neuter" - -/obj/item/clothing/gloves/watch/examine(mob/user) - . = ..() - - if(Adjacent(user)) - . += span_notice("The current station time is [stationtime2text()].") - -/obj/item/clothing/gloves/watch/silver - name = "silver wristwatch" - desc = "A humble silver (or maybe chrome) plated wristwatch. It's quite archaic, but nonetheless classy in its own way." - icon_state = "wristwatch_silver" - -/obj/item/clothing/gloves/watch/gold - name = "gold wristwatch" - desc = "A very fancy gold-plated wristwatch. For when you want to casually show off just how wealthy you are. It even tells the time!" - icon_state = "wristwatch_gold" - -/obj/item/clothing/gloves/watch/survival - name = "survival watch" - desc = "An overengineered wristwatch that purports to be both space and water proof, and includes a compass, micro GPS beacon, and temperature and pressure sensors. The beacon is off by default, and can only transmit its location: it cannot scan for other signals." - description_fluff = "Hold ALT whilst left-clicking on the survival watch to toggle the status of its micro-beacon." - icon_state = "wristwatch_survival" - - var/obj/item/gps/gps = null - -/obj/item/clothing/gloves/watch/survival/examine(mob/user) - . = ..() - - if(Adjacent(user) && src.loc == user) - . += span_notice("You are currently facing [dir2text(user.dir)]. The micro beacon is [gps.tracking ? "on" : "off"].") - var/TB = src.loc.loc - if(istype(TB, /turf/)) //no point returning light level if we're not on a turf (might be *in* someone!) - var/turf/TL = TB - var/light_level = TL.get_lumcount() - if(light_level) - . += span_notice("Light Level: [TL.get_lumcount()]") - else - . += span_notice("It's too dark to see the light level!") - if(istype(TB, /turf/simulated)) //no point returning atmospheric data from unsimulated tiles (they don't track pressure anyway, only temperature) - var/turf/simulated/T = TB - var/datum/gas_mixture/env = T.return_air() - . += span_notice("Pressure: [env.return_pressure()]kPa / Temperature: [env.temperature]K ") - -/obj/item/clothing/gloves/watch/survival/New() - gps = new/obj/item/gps/watch(src) - -/obj/item/gps/watch - gps_tag = "SRV-WTCH" - -/obj/item/clothing/gloves/watch/survival/AltClick(mob/user) - . = ..() - - if(Adjacent(user)) - gps.tracking = !gps.tracking - to_chat(user,span_notice("You turn the micro beacon [gps.tracking ? "on" : "off"].")) diff --git a/code/modules/clothing/rings/material.dm b/code/modules/clothing/rings/material.dm deleted file mode 100644 index 30242fef66..0000000000 --- a/code/modules/clothing/rings/material.dm +++ /dev/null @@ -1,74 +0,0 @@ -///////////////////////////////////////// -//Material Rings -/obj/item/clothing/gloves/ring/material - icon = 'icons/inventory/hands/item.dmi' - icon_state = "material" - -/obj/item/clothing/gloves/ring/material/New(var/newloc, var/new_material) - ..(newloc) - if(!new_material) - new_material = MAT_STEEL - material = get_material_by_name(new_material) - if(!istype(material)) - qdel(src) - return - name = "[material.display_name] ring" - desc = "A ring made from [material.display_name]." - color = material.icon_colour - -/obj/item/clothing/gloves/ring/material/get_material() - return material - -/obj/item/clothing/gloves/ring/material/wood/New(var/newloc) - ..(newloc, MAT_WOOD) - -/obj/item/clothing/gloves/ring/material/plastic/New(var/newloc) - ..(newloc, MAT_PLASTIC) - -/obj/item/clothing/gloves/ring/material/iron/New(var/newloc) - ..(newloc, MAT_IRON) - -/obj/item/clothing/gloves/ring/material/glass/New(var/newloc) - ..(newloc, MAT_GLASS) - -/obj/item/clothing/gloves/ring/material/steel/New(var/newloc) - ..(newloc, MAT_STEEL) - -/obj/item/clothing/gloves/ring/material/silver/New(var/newloc) - ..(newloc, MAT_SILVER) - -/obj/item/clothing/gloves/ring/material/gold/New(var/newloc) - ..(newloc, MAT_GOLD) - -/obj/item/clothing/gloves/ring/material/platinum/New(var/newloc) - ..(newloc, MAT_PLATINUM) - -/obj/item/clothing/gloves/ring/material/phoron/New(var/newloc) - ..(newloc, MAT_PHORON) - -/obj/item/clothing/gloves/ring/material/titanium/New(var/newloc) - ..(newloc, MAT_TITANIUM) - -/obj/item/clothing/gloves/ring/material/copper/New(var/newloc) - ..(newloc, MAT_COPPER) - -/obj/item/clothing/gloves/ring/material/bronze/New(var/newloc) - ..(newloc, MAT_BRONZE) - -/obj/item/clothing/gloves/ring/material/uranium/New(var/newloc) - ..(newloc, MAT_URANIUM) - -/obj/item/clothing/gloves/ring/material/osmium/New(var/newloc) - ..(newloc, MAT_OSMIUM) - -/obj/item/clothing/gloves/ring/material/lead/New(var/newloc) - ..(newloc, MAT_LEAD) - -/obj/item/clothing/gloves/ring/material/diamond/New(var/newloc) - ..(newloc, MAT_DIAMOND) - -/obj/item/clothing/gloves/ring/material/tin/New(var/newloc) - ..(newloc, MAT_TIN) - -/obj/item/clothing/gloves/ring/material/void_opal/New(var/newloc) - ..(newloc, MAT_VOPAL) \ No newline at end of file diff --git a/code/modules/clothing/rings/rings.dm b/code/modules/clothing/rings/rings.dm deleted file mode 100644 index 34678198e7..0000000000 --- a/code/modules/clothing/rings/rings.dm +++ /dev/null @@ -1,96 +0,0 @@ -//Generic Ring - -/obj/item/clothing/gloves/ring - name = "generic ring" - desc = "Torus shaped finger decoration." - icon_state = "material" - drop_sound = 'sound/items/drop/ring.ogg' - -///////////////////////////////////////// -//Standard Rings -/obj/item/clothing/gloves/ring/engagement - name = "engagement ring" - desc = "An engagement ring. It certainly looks expensive." - icon_state = "diamond" - -/obj/item/clothing/gloves/ring/engagement/attack_self(mob/user) - user.visible_message(span_warning("\The [user] gets down on one knee, presenting \the [src]."),span_warning("You get down on one knee, presenting \the [src].")) - -/obj/item/clothing/gloves/ring/cti - name = "CTI ring" - desc = "A ring commemorating graduation from CTI." - icon_state = "cti-grad" - -/obj/item/clothing/gloves/ring/mariner - name = "Mariner University ring" - desc = "A ring commemorating graduation from Mariner University." - icon_state = "mariner-grad" - - -///////////////////////////////////////// -//Reagent Rings - -/obj/item/clothing/gloves/ring/reagent - flags = OPENCONTAINER - origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 4) - -/obj/item/clothing/gloves/ring/reagent/New() - ..() - create_reagents(15) - -/obj/item/clothing/gloves/ring/reagent/equipped(var/mob/living/carbon/human/H) - ..() - if(istype(H) && H.gloves==src) - - if(reagents.total_volume) - to_chat(H, span_danger("You feel a prick as you slip on \the [src].")) - if(H.reagents) - var/contained = reagents.get_reagents() - var/trans = reagents.trans_to_mob(H, 15, CHEM_BLOOD) - add_attack_logs(usr, H, "Injected with [name] containing [contained] transferred [trans] units") - return - -//Sleepy Ring -/obj/item/clothing/gloves/ring/reagent/sleepy - name = "silver ring" - desc = "A ring made from what appears to be silver." - icon_state = "material" - origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 5) - -/obj/item/clothing/gloves/ring/reagent/sleepy/New() - ..() - reagents.add_reagent("chloralhydrate", 15) // Less than a sleepy-pen, but still enough to knock someone out - -///////////////////////////////////////// -//Seals and Signet Rings - -/obj/item/clothing/gloves/ring/seal - var/stamptext = null -/obj/item/clothing/gloves/ring/seal/secgen - name = "Secretary-General's official seal" - desc = "The official seal of the Secretary-General of the Sol Central Government, featured prominently on a silver ring." - icon_state = "seal-secgen" - -/obj/item/clothing/gloves/ring/seal/mason - name = "\improper Masonic ring" - desc = "The Square and Compasses feature prominently on this Masonic ring." - icon_state = "seal-masonic" - -/obj/item/clothing/gloves/ring/seal/signet - name = "signet ring" - desc = "A signet ring, for when you're too sophisticated to sign letters." - icon_state = "seal-signet" - var/nameset = FALSE - -/obj/item/clothing/gloves/ring/seal/signet/attack_self(mob/user) - if(nameset) - to_chat(user, span_notice("The [src] has already been claimed!")) - return - - to_chat(user, span_notice("You claim the [src] as your own!")) - change_name(user) - nameset = TRUE - -/obj/item/clothing/gloves/ring/seal/signet/proc/change_name(var/signet_name = "Unknown") - name = "[signet_name]'s signet ring" - desc = "A signet ring belonging to [signet_name], for when you're too sophisticated to sign letters." diff --git a/code/modules/clothing/rings/rings_vr.dm b/code/modules/clothing/rings/rings_vr.dm deleted file mode 100644 index 45306a7acc..0000000000 --- a/code/modules/clothing/rings/rings_vr.dm +++ /dev/null @@ -1,17 +0,0 @@ -/obj/item/clothing/gloves/ring/wedding - name = "golden wedding ring" - desc = "For showing your devotion to another person. It has a golden glimmer to it." - icon = 'icons/inventory/hands/item_vr.dmi' - icon_state = "wedring_g" - item_state = "wedring_g" - var/partnername = "" - -/obj/item/clothing/gloves/ring/wedding/attack_self(mob/user) - partnername = copytext(sanitize(input(user, "Would you like to change the holoengraving on the ring?", "Name your spouse", "Bae") as null|text),1,MAX_NAME_LEN) - name = "[initial(name)] - [partnername]" - -/obj/item/clothing/gloves/ring/wedding/silver - name = "silver wedding ring" - desc = "For showing your devotion to another person. It has a silver glimmer to it." - icon_state = "wedring_s" - item_state = "wedring_s" diff --git a/code/modules/economy/vending_machines_vr.dm b/code/modules/economy/vending_machines_vr.dm index 8d0cbff234..2daee26fa9 100644 --- a/code/modules/economy/vending_machines_vr.dm +++ b/code/modules/economy/vending_machines_vr.dm @@ -481,7 +481,7 @@ /obj/item/clothing/under/color/yellow = 5, /obj/item/clothing/shoes/black = 20, /obj/item/clothing/shoes/white = 20, - /obj/item/clothing/gloves/watch = 20 + /obj/item/clothing/accessory/watch = 20 ) prices = list() @@ -576,13 +576,13 @@ /obj/item/clothing/accessory/wcoat/swvest/blue = 5, /obj/item/clothing/accessory/wcoat/swvest/red = 5, /obj/item/clothing/accessory/wristband = 5, - /obj/item/clothing/accessory/wristbandcollection = 5, - /obj/item/clothing/accessory/wristbandcollection/pink = 5, - /obj/item/clothing/accessory/wristbandcollection/les = 5, - /obj/item/clothing/accessory/wristbandcollection/bi = 5, - /obj/item/clothing/accessory/wristbandcollection/trans = 5, - /obj/item/clothing/accessory/wristbandcollection/ace = 5, - /obj/item/clothing/accessory/wristband_spiked = 5, + /obj/item/clothing/accessory/wristband/collection = 5, + /obj/item/clothing/accessory/wristband/collection/pink = 5, + /obj/item/clothing/accessory/wristband/collection/les = 5, + /obj/item/clothing/accessory/wristband/collection/bi = 5, + /obj/item/clothing/accessory/wristband/collection/trans = 5, + /obj/item/clothing/accessory/wristband/collection/ace = 5, + /obj/item/clothing/accessory/wristband/spiked = 5, /obj/item/clothing/accessory/belt = 5, /obj/item/clothing/accessory/belt/thick = 5, /obj/item/clothing/accessory/belt/strap = 5, @@ -598,13 +598,13 @@ /obj/item/clothing/ears/earmuffs/headphones = 5, /obj/item/clothing/ears/earring/stud = 5, /obj/item/clothing/ears/earring/dangle = 5, - /obj/item/clothing/gloves/ring/mariner = 5, - /obj/item/clothing/gloves/ring/engagement = 5, - /obj/item/clothing/gloves/ring/seal/signet = 5, - /obj/item/clothing/gloves/ring/seal/mason = 5, - /obj/item/clothing/gloves/ring/material/plastic = 5, - /obj/item/clothing/gloves/ring/material/steel = 5, - /obj/item/clothing/gloves/ring/material/gold = 5, + /obj/item/clothing/accessory/ring/mariner = 5, + /obj/item/clothing/accessory/ring/engagement = 5, + /obj/item/clothing/accessory/ring/seal/signet = 5, + /obj/item/clothing/accessory/ring/seal/mason = 5, + /obj/item/clothing/accessory/ring/material/plastic = 5, + /obj/item/clothing/accessory/ring/material/steel = 5, + /obj/item/clothing/accessory/ring/material/gold = 5, /obj/item/clothing/glasses/eyepatch = 5, /obj/item/clothing/glasses/gglasses = 5, /obj/item/clothing/glasses/regular/hipster = 5, @@ -632,9 +632,9 @@ /obj/item/clothing/accessory/pride/lesbian = 5, /obj/item/clothing/accessory/pride/intersex = 5, /obj/item/clothing/accessory/pride/vore = 5, - /obj/item/clothing/gloves/watch = 5, - /obj/item/clothing/gloves/watch/silver = 5, - /obj/item/clothing/gloves/watch/gold = 5 + /obj/item/clothing/accessory/watch = 5, + /obj/item/clothing/accessory/watch/silver = 5, + /obj/item/clothing/accessory/watch/gold = 5 ) prices = list(/obj/item/clothing/accessory = 50, /obj/item/clothing/accessory/armband/med/color = 50, @@ -721,13 +721,13 @@ /obj/item/clothing/accessory/wcoat/swvest/blue = 50, /obj/item/clothing/accessory/wcoat/swvest/red = 50, /obj/item/clothing/accessory/wristband = 10, - /obj/item/clothing/accessory/wristbandcollection = 30, - /obj/item/clothing/accessory/wristbandcollection/pink = 30, - /obj/item/clothing/accessory/wristbandcollection/les = 30, - /obj/item/clothing/accessory/wristbandcollection/bi = 30, - /obj/item/clothing/accessory/wristbandcollection/trans = 30, - /obj/item/clothing/accessory/wristbandcollection/ace = 30, - /obj/item/clothing/accessory/wristband_spiked = 20, + /obj/item/clothing/accessory/wristband/collection = 30, + /obj/item/clothing/accessory/wristband/collection/pink = 30, + /obj/item/clothing/accessory/wristband/collection/les = 30, + /obj/item/clothing/accessory/wristband/collection/bi = 30, + /obj/item/clothing/accessory/wristband/collection/trans = 30, + /obj/item/clothing/accessory/wristband/collection/ace = 30, + /obj/item/clothing/accessory/wristband/spiked = 20, /obj/item/clothing/accessory/belt = 50, /obj/item/clothing/accessory/belt/thick = 50, /obj/item/clothing/accessory/belt/strap = 50, @@ -743,13 +743,13 @@ /obj/item/clothing/ears/earmuffs/headphones = 50, /obj/item/clothing/ears/earring/stud = 50, /obj/item/clothing/ears/earring/dangle = 50, - /obj/item/clothing/gloves/ring/mariner = 50, - /obj/item/clothing/gloves/ring/engagement = 50, - /obj/item/clothing/gloves/ring/seal/signet = 50, - /obj/item/clothing/gloves/ring/seal/mason = 50, - /obj/item/clothing/gloves/ring/material/plastic = 50, - /obj/item/clothing/gloves/ring/material/steel = 50, - /obj/item/clothing/gloves/ring/material/gold = 100, + /obj/item/clothing/accessory/ring/mariner = 50, + /obj/item/clothing/accessory/ring/engagement = 50, + /obj/item/clothing/accessory/ring/seal/signet = 50, + /obj/item/clothing/accessory/ring/seal/mason = 50, + /obj/item/clothing/accessory/ring/material/plastic = 50, + /obj/item/clothing/accessory/ring/material/steel = 50, + /obj/item/clothing/accessory/ring/material/gold = 100, /obj/item/clothing/glasses/eyepatch = 50, /obj/item/clothing/glasses/gglasses = 50, /obj/item/clothing/glasses/regular/hipster = 50, @@ -773,9 +773,9 @@ /obj/item/clothing/accessory/pride/lesbian = 50, /obj/item/clothing/accessory/pride/intersex = 50, /obj/item/clothing/accessory/pride/vore = 50, - /obj/item/clothing/gloves/watch = 50, - /obj/item/clothing/gloves/watch/silver = 100, - /obj/item/clothing/gloves/watch/gold = 200 + /obj/item/clothing/accessory/watch = 50, + /obj/item/clothing/accessory/watch/silver = 100, + /obj/item/clothing/accessory/watch/gold = 200 ) premium = list(/obj/item/bedsheet/rainbow = 1) contraband = list(/obj/item/clothing/mask/gas/clown_hat = 1, @@ -1963,13 +1963,13 @@ /obj/item/clothing/ears/earmuffs/headphones = 5, /obj/item/clothing/ears/earring/stud = 5, /obj/item/clothing/ears/earring/dangle = 5, - /obj/item/clothing/gloves/ring/mariner = 5, - /obj/item/clothing/gloves/ring/engagement = 5, - /obj/item/clothing/gloves/ring/seal/signet = 5, - /obj/item/clothing/gloves/ring/seal/mason = 5, - /obj/item/clothing/gloves/ring/material/plastic = 5, - /obj/item/clothing/gloves/ring/material/steel = 5, - /obj/item/clothing/gloves/ring/material/gold = 5, + /obj/item/clothing/accessory/ring/mariner = 5, + /obj/item/clothing/accessory/ring/engagement = 5, + /obj/item/clothing/accessory/ring/seal/signet = 5, + /obj/item/clothing/accessory/ring/seal/mason = 5, + /obj/item/clothing/accessory/ring/material/plastic = 5, + /obj/item/clothing/accessory/ring/material/steel = 5, + /obj/item/clothing/accessory/ring/material/gold = 5, /obj/item/clothing/glasses/eyepatch = 5, /obj/item/clothing/glasses/gglasses = 5, /obj/item/clothing/glasses/regular/hipster = 5, diff --git a/code/modules/emotes/definitions/synthetics.dm b/code/modules/emotes/definitions/synthetics.dm index de1d8d34ed..e4024fc8e9 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 25e1ea5c4f..6f5e2b9497 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 71911302b7..1410f4b17c 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 12cbdb770c..ff11cb9c33 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 08d40416da..814ce55adc 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 1cd1671a5f..c08b33b886 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 c8e043ecd5..57a58cb57d 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/games/cards.dm b/code/modules/games/cards.dm index 448ea34b5f..df4e50d63b 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -211,8 +211,8 @@ ..() -/obj/item/deck/attack_self() - shuffle() +/obj/item/deck/attack_self(mob/user) + shuffle(user) /obj/item/deck/verb/verb_shuffle() @@ -220,10 +220,9 @@ set name = "Shuffle" set desc = "Shuffle the cards in the deck." set src in view(1) - shuffle() + shuffle(usr) -/obj/item/deck/proc/shuffle() - var/mob/living/user = usr +/obj/item/deck/proc/shuffle(mob/user) if (cooldown < world.time - 10) // 15 ticks cooldown var/list/newcards = list() while(cards.len) diff --git a/code/modules/games/tarot.dm b/code/modules/games/tarot.dm index 44407c9ca2..5489bb05fd 100644 --- a/code/modules/games/tarot.dm +++ b/code/modules/games/tarot.dm @@ -41,3 +41,58 @@ cooldown = world.time else return + +///Fluff item, using a separate item rather than a subitem to customise New() + +/obj/item/deck/dark_tarot + name = "dark rose tarot deck" + desc = "A limited edition tarot deck for the scene-girl inclined!" + icon_state = "dark_tarot" + +/obj/item/deck/dark_tarot/New() + ..() + + var/datum/playingcard/P + for(var/name in list("fool","magician","high priestess","empress","emperor","hierophant","lovers","chariot","strength","hermit","wheel of fortune","justice","hanged man","death","temperance","devil","tower","star","moon","sun","judgement","world","white dragon with blue eyes","charred lizard","dark lotus","bash","reverse","rules","acid","abyss","maw")) + P = new() + P.name = "[name]" + if(name == "high priestess") + P.card_icon = "dark_high_priestess" + else if(name == "wheel of fortune") + P.card_icon = "dark_wheel" + else if(name == "hanged man") + P.card_icon = "dark_hanged" + else if(name == "white dragon with blue eyes") + P.card_icon = "dark_dragon" + else if(name == "charred lizard") + P.card_icon = "dark_lizard" + else if(name == "dark lotus") + P.card_icon = "dark_lotus" + else + P.card_icon = "dark_[name]" + P.back_icon = "dark_back_tarot" + cards += P + for(var/suit in list("wands","pentacles","cups","swords")) + for(var/number in list("ace","two","three","four","five","six","seven","eight","nine","ten","page","knight","queen","king")) + P = new() + P.name = "[number] of [suit]" + P.card_icon = "dark_[suit]" + P.back_icon = "dark_back_tarot" + cards += P + +/obj/item/deck/dark_tarot/shuffle(mob/user) + if (cooldown < world.time - 10) + var/list/newcards = list() + while(cards.len) + var/datum/playingcard/P = pick(cards) + P.name = replacetext(P.name," reversed","") + if(prob(50)) + P.name += " reversed" + newcards += P + cards -= P + cards = newcards + playsound(src, 'sound/items/cardshuffle.ogg', 50, 1) + user.visible_message("\The [user] shuffles [src].") + cooldown = world.time + else + return diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 61b2ae4df5..150e345db6 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/materials/materials/_materials.dm b/code/modules/materials/materials/_materials.dm index ca710cb04f..322e5d7bea 100644 --- a/code/modules/materials/materials/_materials.dm +++ b/code/modules/materials/materials/_materials.dm @@ -361,7 +361,7 @@ var/list/name_to_material new /datum/stack_recipe("[display_name] armor plate", /obj/item/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE), new /datum/stack_recipe("[display_name] armor plate insert", /obj/item/material/armor_plating/insert, 2, time = 40, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE), new /datum/stack_recipe("[display_name] grave marker", /obj/item/material/gravemarker, 5, time = 50, supplied_material = "[name]", pass_stack_color = TRUE), - new /datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE), + new /datum/stack_recipe("[display_name] ring", /obj/item/clothing/accessory/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE), new /datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) ) diff --git a/code/modules/materials/materials/organic/leather.dm b/code/modules/materials/materials/organic/leather.dm index fe291e4d8d..607361d07e 100644 --- a/code/modules/materials/materials/organic/leather.dm +++ b/code/modules/materials/materials/organic/leather.dm @@ -33,7 +33,7 @@ new /datum/stack_recipe("pouch, melee", /obj/item/storage/pouch/baton, 10, time = 20 SECONDS, pass_stack_color = FALSE, recycle_material = "[name]"), //vorestation Add new /datum/stack_recipe("crude [display_name] bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"), new /datum/stack_recipe("[display_name] net", /obj/item/material/fishing_net, 10, time = 5 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE), - new /datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE), + new /datum/stack_recipe("[display_name] ring", /obj/item/clothing/accessory/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE), new /datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE), new /datum/stack_recipe("[display_name] armor plate", /obj/item/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE), new /datum/stack_recipe("empty sandbag", /obj/item/stack/emptysandbag, 2, time = 2 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]"), diff --git a/code/modules/mentor/mentorhelp.dm b/code/modules/mentor/mentorhelp.dm index d801effd6e..2d748823ce 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 3bab28eae2..f679591e2d 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/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 83a81d2c36..d0f1f66f9e 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -223,7 +223,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp announce_ghost_joinleave(ghostize(1)) else var/response - if(src.client && src.client.holder) + if(check_rights(R_ADMIN|R_SERVER|R_MOD,FALSE,src)) //No need to sanity check for client and holder here as that is part of check_rights response = tgui_alert(src, "You have the ability to Admin-Ghost. The regular Ghost verb will announce your presence to dead chat. Both variants will allow you to return to your body using 'aghost'.\n\nWhat do you wish to do?", "Are you sure you want to ghost?", list("Admin Ghost", "Ghost", "Stay in body")) if(response == "Admin Ghost") if(!src.client) diff --git a/code/modules/mob/living/butchering.dm b/code/modules/mob/living/butchering.dm index 05e064acbe..ad1eecfba6 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 f4d90e9712..009667dbf4 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/ai_controlled/ai_controlled.dm b/code/modules/mob/living/carbon/human/ai_controlled/ai_controlled.dm index 82243467c8..54df0bdb0b 100644 --- a/code/modules/mob/living/carbon/human/ai_controlled/ai_controlled.dm +++ b/code/modules/mob/living/carbon/human/ai_controlled/ai_controlled.dm @@ -22,7 +22,7 @@ var/to_wear_r_radio = null var/to_wear_uniform = /obj/item/clothing/under/color/grey var/to_wear_suit = /obj/item/clothing/suit/armor/material/makeshift/glass - var/to_wear_gloves = /obj/item/clothing/gloves/ring/material/platinum + var/to_wear_gloves = /obj/item/clothing/accessory/ring/material/platinum var/to_wear_shoes = /obj/item/clothing/shoes/galoshes var/to_wear_belt = /obj/item/storage/belt/utility/full var/to_wear_l_pocket = /obj/item/soap diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 21e87074bf..90156f2f5e 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/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 73913ba295..80dabf789d 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -107,12 +107,10 @@ if(w_uniform && !(skip_gear & EXAMINE_SKIPJUMPSUIT) && w_uniform.show_examine) //Ties var/tie_msg - var/tie_msg_warn if(istype(w_uniform,/obj/item/clothing/under) && !(skip_gear & EXAMINE_SKIPTIE)) var/obj/item/clothing/under/U = w_uniform if(LAZYLEN(U.accessories)) tie_msg += ". Attached to it is" - tie_msg_warn += "! Attached to it is" var/list/accessory_descs = list() if(skip_gear & EXAMINE_SKIPHOLSTER) for(var/obj/item/clothing/accessory/A in U.accessories) @@ -139,12 +137,10 @@ //suit/armour if(wear_suit) var/tie_msg - var/tie_msg_warn if(istype(wear_suit,/obj/item/clothing/suit)) var/obj/item/clothing/suit/U = wear_suit if(LAZYLEN(U.accessories)) tie_msg += ". Attached to it is" - tie_msg_warn += "! Attached to it is" var/list/accessory_descs = list() for(var/accessory in U.accessories) accessory_descs += "\a [accessory]" @@ -185,10 +181,21 @@ //gloves if(gloves && !(skip_gear & EXAMINE_SKIPGLOVES) && gloves.show_examine) + var/gloves_acc_msg + if(istype(gloves,/obj/item/clothing/gloves)) + var/obj/item/clothing/gloves/G = gloves + if(LAZYLEN(G.accessories)) + gloves_acc_msg += ". Attached to it is" + var/list/accessory_descs = list() + for(var/obj/item/clothing/accessory/A in G.accessories) + accessory_descs += "\a [A]" + + gloves_acc_msg += " [lowertext(english_list(accessory_descs))]." if(gloves.blood_DNA) - msg += span_warning("[T.He] [T.has] [icon2html(gloves,user.client)] [gloves.gender==PLURAL?"some":"a"] [(gloves.blood_color != "#030303") ? "blood" : "oil"]-stained [gloves.name] on [T.his] hands!") + msg += span_warning("[T.He] [T.has] [icon2html(gloves,user.client)] [gloves.gender==PLURAL?"some":"a"] [(gloves.blood_color != "#030303") ? "blood" : "oil"]-stained [gloves.name] on [T.his] hands![gloves_acc_msg]") else - msg += "[T.He] [T.has] [icon2html(gloves,user.client)] \a [gloves] on [T.his] hands." + msg += "[T.He] [T.has] [icon2html(gloves,user.client)] \a [gloves] on [T.his] hands.[gloves_acc_msg]" + else if(blood_DNA && !(skip_body & EXAMINE_SKIPHANDS)) msg += span_warning("[T.He] [T.has] [(hand_blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained hands!") diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 542dafb6f6..7911b33039 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -272,8 +272,12 @@ var/obj/item/clothing/gloves/G = H.gloves real_damage += G.punch_force hit_dam_type = G.punch_damtype - if(H.pulling_punches && !attack.sharp && !attack.edge) //SO IT IS DECREED: PULLING PUNCHES WILL PREVENT THE ACTUAL DAMAGE FROM RINGS AND KNUCKLES, BUT NOT THE ADDED PAIN, BUT YOU CAN'T "PULL" A KNIFE - hit_dam_type = AGONY + else if(istype(H.gloves, /obj/item/clothing/accessory)) + var/obj/item/clothing/accessory/G = H.gloves + real_damage += G.punch_force + hit_dam_type = G.punch_damtype + if(H.pulling_punches && !attack.sharp && !attack.edge) //SO IT IS DECREED: PULLING PUNCHES WILL PREVENT THE ACTUAL DAMAGE FROM RINGS AND KNUCKLES, BUT NOT THE ADDED PAIN, BUT YOU CAN'T "PULL" A KNIFE + hit_dam_type = AGONY real_damage *= damage_multiplier rand_damage *= damage_multiplier if(HULK in H.mutations) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 8dca9ab08f..b1244ee799 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 3d07155996..7f7b2d7aad 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.dm b/code/modules/mob/living/carbon/human/species/species.dm index 72b4396d61..863e6cd0a9 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -212,6 +212,9 @@ var/can_space_freemove = FALSE // Can we freely move in space? var/can_zero_g_move = FALSE // What about just in zero-g non-space? + var/swim_mult = 1 //multiplier to our z-movement rate for swimming + var/climb_mult = 1 //multiplier to our z-movement rate for lattices/catwalks + var/item_slowdown_mod = 1 // How affected by item slowdown the species is. var/primitive_form // Lesser form, if any (ie. monkey for humans) var/greater_form // Greater form, if any, ie. human for monkeys. 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 cc02a1f64a..d4f5912d53 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/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index c2d52b273b..cce23f9361 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -242,6 +242,8 @@ reagent_tag = IS_TAJARA allergens = ALLERGEN_STIMULANT + climb_mult = 0.75 + move_trail = /obj/effect/decal/cleanable/blood/tracks/paw heat_discomfort_level = 292 diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm index e2a346158a..997aac129f 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm @@ -384,6 +384,8 @@ silk_reserve = 500 silk_max_reserve = 1000 + climb_mult = 0.75 + /datum/species/spider/handle_environment_special(var/mob/living/carbon/human/H) if(H.stat == DEAD) // If they're dead they won't need anything. return diff --git a/code/modules/mob/living/carbon/human/species/station/station_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_vr.dm index e623591f57..6532e7c749 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_vr.dm @@ -110,6 +110,7 @@ water_breather = TRUE water_movement = -4 //Negates shallow. Halves deep. + swim_mult = 0.5 flesh_color = "#AFA59E" base_color = "#777777" diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm index 84fba1d1cb..ffd9f10b88 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm @@ -188,7 +188,9 @@ /datum/trait/negative/bad_swimmer name = "Bad Swimmer" - desc = "You can't swim very well, all water slows you down a lot and you drown in deep water." + desc = "You can't swim very well, all water slows you down a lot and you drown in deep water. You also swim up and down 25% slower." cost = -1 custom_only = FALSE - var_changes = list("bad_swimmer" = 1, "water_movement" = 4) + var_changes = list("bad_swimmer" = 1, "water_movement" = 4, "swim_mult" = 1.25) + varchange_type = TRAIT_VARCHANGE_LESS_BETTER + excludes = list(/datum/trait/positive/good_swimmer) diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm index 7551915c9d..d3df8f312a 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm @@ -121,6 +121,7 @@ name = "Winged Flight" desc = "Allows you to fly by using your wings. Don't forget to bring them!" cost = 0 + custom_only = FALSE has_preferences = list("flight_vore" = list(TRAIT_PREF_TYPE_BOOLEAN, "Flight Vore enabled on spawn", TRAIT_VAREDIT_TARGET_MOB, FALSE)) /datum/trait/positive/winged_flight/apply(var/datum/species/S,var/mob/living/carbon/human/H) @@ -241,12 +242,9 @@ cost = 1 var_changes = list("throwforce_absorb_threshold" = 10) - - - /datum/trait/positive/wall_climber name = "Climber, Amateur" - desc = "You can climb certain walls without tools! This is likely a personal skill you developed." + desc = "You can climb certain walls without tools! This is likely a personal skill you developed. You can also climb lattices and ladders a little bit faster than everyone else." tutorial = "You must approach a wall and right click it and select the \ 'climb wall' verb to climb it. You suffer from a movement delay of 1.5 with this trait.\n \ Your total climb time is expected to be 17.5 seconds. Tools may reduce this. \n\n \ @@ -255,12 +253,12 @@ cost = 1 custom_only = FALSE banned_species = list(SPECIES_TAJ, SPECIES_VASILISSAN) // They got unique climbing delay. - var_changes = list("can_climb" = TRUE) + var_changes = list("can_climb" = TRUE, "climb_mult" = 0.75) excludes = list(/datum/trait/positive/wall_climber_pro, /datum/trait/positive/wall_climber_natural) /datum/trait/positive/wall_climber_natural name = "Climber, Natural" - desc = "You can climb certain walls without tools! This is likely due to the unique anatomy of your species. CUSTOM AND XENOCHIM ONLY" + desc = "You can climb certain walls without tools! This is likely due to the unique anatomy of your species. You can climb lattices and ladders slightly faster than everyone else. CUSTOM AND XENOCHIM ONLY" tutorial = "You must approach a wall and right click it and select the \ 'climb wall' verb to climb it. You suffer from a movement delay of 1.5 with this trait.\n \ Your total climb time is expected to be 17.5 seconds. Tools may reduce this. \n\n \ @@ -268,13 +266,13 @@ a climbable wall. To climbe like so, use the verb 'Climb Down Wall' in IC tab!" cost = 0 custom_only = FALSE - var_changes = list("can_climb" = TRUE) + var_changes = list("can_climb" = TRUE, "climb_mult" = 0.75) allowed_species = list(SPECIES_XENOCHIMERA, SPECIES_CUSTOM) //So that we avoid needless bloat for xenochim excludes = list(/datum/trait/positive/wall_climber_pro, /datum/trait/positive/wall_climber) /datum/trait/positive/wall_climber_pro name = "Climber, Professional" - desc = "You can climb certain walls without tools! You are a professional rock climber at this, letting you climb almost twice as fast!" + desc = "You can climb certain walls without tools! You are a professional rock climber at this, letting you climb almost twice as fast! You can also climb lattices and ladders a fair bit faster than everyone else!" tutorial = "You must approach a wall and right click it and select the \ 'climb wall' verb to climb it. Your movement delay is just 1.25 with this trait.\n \ Your climb time is expected to be 9 seconds. Tools may reduce this. \n\n \ @@ -282,7 +280,7 @@ a climbable wall. To climbe like so, use the verb 'Climb Down Wall' in IC tab!" cost = 2 custom_only = FALSE - var_changes = list("climbing_delay" = 1.25) + var_changes = list("climbing_delay" = 1.25, "climb_mult" = 0.5) varchange_type = TRAIT_VARCHANGE_LESS_BETTER excludes = list(/datum/trait/positive/wall_climber,/datum/trait/positive/wall_climber_natural) @@ -292,3 +290,14 @@ /datum/trait/positive/wall_climber_pro/apply(var/datum/species/S,var/mob/living/carbon/human/H) ..() S.can_climb = TRUE + +/datum/trait/positive/good_swimmer + name = "Pro Swimmer" + desc = "You were top of your group in swimming class! This is of questionable usefulness on most planets, but hey, maybe you'll get to visit a nice beach world someday?" + tutorial = "You move faster in water, and can move up and down z-levels faster than other swimmers!" + cost = 1 + custom_only = FALSE + var_changes = list("water_movement" = -2, "swim_mult" = 0.5) + varchange_type = TRAIT_VARCHANGE_LESS_BETTER + excludes = list(/datum/trait/negative/bad_swimmer) + banned_species = list(SPECIES_AKULA) // They already swim better than this diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 94d1e093fc..6c81144e0e 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 1a82c320cf..e791b2ee6a 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 6c573330d4..0baa98d422 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/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index fd1132d05a..c7c1a1a2fb 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -203,9 +203,6 @@ var/list/mob_hat_cache = list() can_pick_shell = FALSE update_icon() -/mob/living/silicon/robot/drone/choose_icon() - return - /mob/living/silicon/robot/drone/pick_module() return diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index 60a0bea5ab..6f92802684 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/silicon/robot/login.dm b/code/modules/mob/living/silicon/robot/login.dm index 89a136223e..ef25b1bece 100644 --- a/code/modules/mob/living/silicon/robot/login.dm +++ b/code/modules/mob/living/silicon/robot/login.dm @@ -11,11 +11,6 @@ repick_laws() // Forces synths to select an icon relevant to their module - if(!icon_selected) - icon_selection_tries = SSrobot_sprites.get_module_sprites_len(modtype, src) + 1 - choose_icon(icon_selection_tries) - - if(sprite_datum && module) - sprite_datum.do_equipment_glamour(module) + pick_module() plane_holder.set_vis(VIS_AUGMENTED, TRUE) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index a79310c02b..d10451a520 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -31,8 +31,7 @@ //Icon stuff var/datum/robot_sprite/sprite_datum // Sprite datum, holding all our sprite data - var/icon_selected = 1 // If icon selection has been completed yet - var/icon_selection_tries = 0 // Remaining attempts to select icon before a selection is forced + var/icon_selected = FALSE // If icon selection has been completed yet var/list/sprite_extra_customization = list() var/rest_style = "Default" var/notransform @@ -47,6 +46,9 @@ var/shown_robot_modules = 0 //Used to determine whether they have the module menu shown or not var/obj/screen/robot_modules_background + var/ui_theme + var/selecting_module = FALSE + //3 Modules can be activated at any one time. var/obj/item/robot_module/module = null var/module_active = null @@ -336,46 +338,17 @@ return module_sprites */ /mob/living/silicon/robot/proc/pick_module() + if(icon_selected) + return if(module) - return - var/list/modules = list() - //VOREStatation Edit Start: shell restrictions - if(shell) - if(restrict_modules_to.len > 0) - modules.Add(restrict_modules_to) - else - modules.Add(shell_module_types) - else - if(restrict_modules_to.len > 0) - modules.Add(restrict_modules_to) - else - modules.Add(robot_module_types) - if(crisis || security_level == SEC_LEVEL_RED || crisis_override) - to_chat(src, span_red("Crisis mode active. Combat module available.")) - modules |= emergency_module_types - for(var/module_name in whitelisted_module_types) - if(is_borg_whitelisted(src, module_name)) - modules |= module_name - //VOREStatation Edit End: shell restrictions - modtype = tgui_input_list(usr, "Please, select a module!", "Robot module", modules) - - if(module) - return - if(!(modtype in robot_modules)) - return - if(!is_borg_whitelisted(src, modtype)) - return - - var/module_type = robot_modules[modtype] - transform_with_anim() //VOREStation edit: sprite animation - new module_type(src) - - hands.icon_state = get_hud_module_icon() - feedback_inc("cyborg_[lowertext(modtype)]",1) - updatename() - hud_used.update_robot_modules_display() - notify_ai(ROBOT_NOTIFICATION_NEW_MODULE, module.name) - robotact?.update_static_data_for_all_viewers() + var/list/module_sprites = SSrobot_sprites.get_module_sprites(module, src) + if(module_sprites.len == 1 || !client) + sprite_datum = module_sprites[1] + sprite_datum.do_equipment_glamour(module) + return + if(!selecting_module) + var/datum/tgui_module/robot_ui_module/ui = new(src) + ui.tgui_interact(src) /mob/living/silicon/robot/proc/update_braintype() if(istype(mmi, /obj/item/mmi/digital/posibrain)) @@ -436,15 +409,12 @@ to_chat(usr, "You can't pick another custom name. [isshell(src) ? "" : "Go ask for a name change."]") return 0 - spawn(0) - var/newname - newname = sanitizeSafe(tgui_input_text(src,"You are a robot. Enter a name, or leave blank for the default name.", "Name change","", MAX_NAME_LEN), MAX_NAME_LEN) - if (newname) - custom_name = newname - sprite_name = newname + var/newname = sanitizeSafe(tgui_input_text(src,"You are a robot. Enter a name, or leave blank for the default name.", "Name change","", MAX_NAME_LEN), MAX_NAME_LEN) + if (newname) + custom_name = newname + sprite_name = newname - updatename() - update_icon() + updatename() /mob/living/silicon/robot/verb/extra_customization() set name = "Customize Appearance" @@ -744,6 +714,8 @@ to_chat(usr, span_filter_notice("You must access the borgs internals!")) else if(!src.module && U.require_module) to_chat(usr, span_filter_notice("The borg must choose a module before it can be upgraded!")) + else if(user == src && istype(W,/obj/item/borg/upgrade/utility/reset)) + to_chat(usr, span_warning("You are restricted from reseting your own module.")) else if(U.locked) to_chat(usr, span_filter_notice("The upgrade is locked and cannot be used yet!")) else @@ -796,6 +768,7 @@ notify_ai(ROBOT_NOTIFICATION_MODULE_RESET, module.name) module.Reset(src) qdel(module) + icon_selected = FALSE module = null updatename("Default") has_recoloured = FALSE @@ -903,7 +876,7 @@ else if(istype(M, /mob/living/silicon/robot)) var/mob/living/silicon/robot/R = M if(check_access(R.get_active_hand()) || istype(R.get_active_hand(), /obj/item/card/robot)) - return 1 + return TRUE return 0 /mob/living/silicon/robot/proc/check_access(obj/item/I) @@ -1088,60 +1061,6 @@ return -/mob/living/silicon/robot/proc/choose_icon(var/triesleft) - var/robot_species = null - if(!SSrobot_sprites) - to_chat(src, "Robot Sprites have not been initialized yet. How are you choosing a sprite? Harass a coder.") - return - - var/list/module_sprites = SSrobot_sprites.get_module_sprites(modtype, src) - if(!module_sprites || !module_sprites.len) - to_chat(src, "Your module appears to have no sprite options. Harass a coder.") - return - - icon_selected = 0 - icon_selection_tries = triesleft - if(module_sprites.len == 1 || !client) - if(!(sprite_datum in module_sprites)) - sprite_datum = module_sprites[1] - else - var/selection = tgui_input_list(src, "Select an icon! [triesleft ? "You have [triesleft] more chance\s." : "This is your last try."]", "Robot Icon", module_sprites) - if(selection) - sprite_datum = selection - else - sprite_datum = module_sprites[1] - if(!istype(src,/mob/living/silicon/robot/drone)) - robot_species = sprite_datum.name - if(notransform) - to_chat(src, "Your current transformation has not finished yet!") - choose_icon(icon_selection_tries) - return - else - transform_with_anim() - - var/tempheight = vis_height - update_icon() - // This is bad but I dunno other way to 'reset' our resize offset based on vis_height changes other than resizing to normal and back. - if(tempheight != vis_height) - var/tempsize = size_multiplier - resize(1) - resize(tempsize) - - - if (module_sprites.len > 1 && triesleft >= 1 && client) - icon_selection_tries-- - var/choice = tgui_alert(usr, "Look at your icon - is this what you want?", "Icon Choice", list("Yes","No")) - if(choice == "No") - choose_icon(icon_selection_tries) - return - - icon_selected = 1 - icon_selection_tries = 0 - sprite_type = robot_species - if(hands) - update_hud() - to_chat(src, span_filter_notice("Your icon has been set. You now require a module reset to change it.")) - /mob/living/silicon/robot/proc/set_default_module_icon() if(!SSrobot_sprites) return diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm index 8f8c0757e0..bc54a72e63 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm @@ -73,7 +73,7 @@ var/global/list/robot_modules = list( R.radio.recalculateChannels() R.set_default_module_icon() - R.choose_icon(SSrobot_sprites.get_module_sprites_len(R.modtype, R) + 1) + R.pick_module() if(!R.client) R.icon_selected = FALSE // It wasnt a player selecting icon? Let them do it later! @@ -93,7 +93,7 @@ var/global/list/robot_modules = list( if(R.radio) R.radio.recalculateChannels() - R.choose_icon(0) + R.set_default_module_icon() R.scrubbing = FALSE diff --git a/code/modules/mob/living/silicon/robot/robot_ui.dm b/code/modules/mob/living/silicon/robot/robot_ui.dm index f44dcb9200..8cec2aa542 100644 --- a/code/modules/mob/living/silicon/robot/robot_ui.dm +++ b/code/modules/mob/living/silicon/robot/robot_ui.dm @@ -52,6 +52,10 @@ var/mob/living/silicon/robot/R = host data["module_name"] = R.module ? "[R.module]" : null + if(R.emagged) + data["theme"] = "syndicate" + else if (R.ui_theme) + data["theme"] = R.ui_theme if(!R.module) return data diff --git a/code/modules/mob/living/silicon/robot/robot_ui_module.dm b/code/modules/mob/living/silicon/robot/robot_ui_module.dm new file mode 100644 index 0000000000..1554549633 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/robot_ui_module.dm @@ -0,0 +1,179 @@ +// Robot module selection +/datum/tgui_module/robot_ui_module + name = "Robot Module Configurator" + tgui_id = "RobotChoose" + var/selected_module + var/new_name + var/datum/robot_sprite/sprite_datum + +/datum/tgui_module/robot_ui_module/tgui_state(mob/user) + return GLOB.tgui_self_state + +/datum/tgui_module/robot_ui_module/tgui_close(mob/user) + . = ..() + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + R.selecting_module = FALSE + +/datum/tgui_module/robot_ui_module/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui) + . = ..() + if(isrobot(user) && ui) + var/mob/living/silicon/robot/R = user + R.selecting_module = TRUE + +/datum/tgui_module/robot_ui_module/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/spritesheet/robot_icons) + ) + +/datum/tgui_module/robot_ui_module/tgui_static_data() + var/list/data = ..() + + var/mob/living/silicon/robot/R = host + + var/list/modules = list() + if(R.module) + modules = list(R.modtype) + selected_module = R.modtype + else + if(LAZYLEN(R.restrict_modules_to) > 0) + modules.Add(R.restrict_modules_to) + else if(R.shell) + modules.Add(shell_module_types) + else + modules.Add(robot_module_types) + if(R.crisis || security_level == SEC_LEVEL_RED || R.crisis_override) + to_chat(R, span_red("Crisis mode active. Combat module available.")) + modules |= emergency_module_types + for(var/module_name in whitelisted_module_types) + if(is_borg_whitelisted(R, module_name)) + modules |= module_name + data["possible_modules"] = modules + if(R.emagged) + data["theme"] = "syndicate" + else if (R.ui_theme) + data["theme"] = R.ui_theme + + return data + +/datum/tgui_module/robot_ui_module/tgui_data() + var/list/data = ..() + + var/mob/living/silicon/robot/R = host + var/datum/asset/spritesheet/robot_icons/spritesheet = get_asset_datum(/datum/asset/spritesheet/robot_icons) + + data["currentName"] = new_name ? new_name : R.name + data["isDefaultName"] = !new_name + + if(selected_module) + data["selected_module"] = selected_module + if(!SSrobot_sprites) + to_chat(R, span_warning("Robot Sprites have not been initialized yet. How are you choosing a sprite? Harass a coder.")) + selected_module = null + return + + var/list/module_sprites = SSrobot_sprites.get_module_sprites(selected_module, R) + if(!module_sprites || !module_sprites.len) + to_chat(R, span_warning("Your module appears to have no sprite options. Harass a coder.")) + selected_module = null + return + var/list/available_sprites = list() + for(var/datum/robot_sprite/S in module_sprites) + var/model_type = "def" + if(istype(S, /datum/robot_sprite/dogborg)) + model_type = "wide" + if(istype(S, /datum/robot_sprite/dogborg/tall)) + model_type = "tall" + available_sprites += list(list("sprite" = S.name, "belly" = S.has_vore_belly_sprites, "type" = model_type)) + + data["possible_sprites"] = available_sprites + data["sprite_datum"] = sprite_datum + data["sprite_datum_class"] = null + data["sprite_datum_size"] = null + if(sprite_datum) + data["sprite_datum_class"] = sanitize_css_class_name("[sprite_datum.type]") + data["sprite_datum_size"] = spritesheet.icon_size_id(data["sprite_datum_class"] + "S") // just get the south icon's size, the rest will be the same + + return data + +/datum/tgui_module/robot_ui_module/tgui_act(action, params) + . = ..() + if(.) + return + + var/mob/living/silicon/robot/R = host + + switch(action) + if("pick_module") + if(R.module) + return + var/new_module = params["value"] + if(!(new_module in robot_modules)) + return + if(!is_borg_whitelisted(R, new_module)) + return + selected_module = new_module + if(sprite_datum) + var/new_datum + var/list/module_sprites = SSrobot_sprites.get_module_sprites(selected_module, R) + for(var/datum/robot_sprite/S in module_sprites) + if(S.name == sprite_datum.name) + new_datum = S + break + sprite_datum = new_datum + . = TRUE + if("pick_icon") + var/sprite = params["value"] + if(!sprite) + return + var/list/module_sprites = SSrobot_sprites.get_module_sprites(selected_module, R) + for(var/datum/robot_sprite/S in module_sprites) + if(S.name == sprite) + sprite_datum = S + break + . = TRUE + if("rename") + var/name = params["value"] + if(name) + new_name = sanitizeSafe(name, MAX_NAME_LEN) + . = TRUE + if("confirm") + R.apply_name(new_name) + R.apply_module(sprite_datum, selected_module) + R.transform_module() + close_ui() + . = TRUE + +/mob/living/silicon/robot/proc/apply_name(var/new_name) + if(!custom_name) + if (new_name) + custom_name = new_name + sprite_name = new_name + +/mob/living/silicon/robot/proc/apply_module(var/datum/robot_sprite/new_datum, var/new_module) + icon_selected = TRUE + var/module_type = robot_modules[new_module] + modtype = new_module + module = new module_type(src) + feedback_inc("cyborg_[lowertext(new_module)]",1) + updatename() + hud_used.update_robot_modules_display() + notify_ai(ROBOT_NOTIFICATION_NEW_MODULE, module.name) + robotact?.update_static_data_for_all_viewers() + sprite_datum = new_datum + if(!istype(src,/mob/living/silicon/robot/drone)) + sprite_type = sprite_datum.name + +/mob/living/silicon/robot/proc/transform_module() + transform_with_anim() + var/tempheight = vis_height + update_icon() + // This is bad but I dunno other way to 'reset' our resize offset based on vis_height changes other than resizing to normal and back. + if(tempheight != vis_height) + var/tempsize = size_multiplier + resize(1) + resize(tempsize) + if(hands) + update_hud() + sprite_datum.do_equipment_glamour(module) + to_chat(src, span_filter_notice("Your icon has been set. You now require a module reset to change it.")) diff --git a/code/modules/mob/living/silicon/robot/subtypes/gravekeeper.dm b/code/modules/mob/living/silicon/robot/subtypes/gravekeeper.dm index 73357c1071..ccf1908c16 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/gravekeeper.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/gravekeeper.dm @@ -9,6 +9,7 @@ icon_selected = FALSE can_be_antagged = FALSE restrict_modules_to = list("Gravekeeper") + ui_theme = "malfunction" /mob/living/silicon/robot/gravekeeper/init() aiCamera = new/obj/item/camera/siliconcam/robot_camera(src) diff --git a/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm b/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm index 24e449c411..9f0aa11446 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm @@ -9,6 +9,7 @@ icon_selected = FALSE restrict_modules_to = list("Lost") var/law_retries = 5 + ui_theme = "malfunction" /mob/living/silicon/robot/lost/init() aiCamera = new/obj/item/camera/siliconcam/robot_camera(src) diff --git a/code/modules/mob/living/silicon/robot/subtypes/syndicate.dm b/code/modules/mob/living/silicon/robot/subtypes/syndicate.dm index 5dd72332e4..15a8257a49 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/syndicate.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/syndicate.dm @@ -8,6 +8,7 @@ idcard_type = /obj/item/card/id/syndicate icon_selected = FALSE restrict_modules_to = list("Protector", "Mechanist", "Combat Medic") + ui_theme = "syndicate" /mob/living/silicon/robot/syndicate/init() aiCamera = new/obj/item/camera/siliconcam/robot_camera(src) 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 0000000000..9c29db15a3 --- /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 430e6efd4a..73005bc9b9 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 763e7386ab..f1c2ef7641 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 0000000000..1b599f74f8 --- /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 98361e4bb6..0000000000 --- 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 += "" - for(var/datum/skill/S in SKILLS[V]) - var/level = M.skills[S.ID] - HTML += "" - HTML += "" - HTML += "" - // secondary skills don't have an amateur level - if(S.secondary) - HTML += "" - else - HTML += "" - HTML += "" - HTML += "" - HTML += "" - HTML += "
" + span_bold("[V]") - HTML += "
[S.name]\[Untrained\]\[Amateur\]\[Trained\]\[Professional\]
" - - 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 e7b7127163..475d69193a 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 2c2a928deb..72630b09b9 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 3afb7a97aa..0000000000 --- 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/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index a686e35de7..5d018586f1 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -190,7 +190,6 @@ O.custom_speech_bubble = B.custom_speech_bubble callHook("borgify", list(O)) - O.namepick() spawn(0) // Mobs still instantly del themselves, thus we need to spawn or O will never be returned qdel(src) 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 62a97fdb72..73ea3a1b6e 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 = ui.user.mind?.get_skill_level(/datum/skill/gaming) - // var/gamerSkill = ui.user.mind?.get_skill_modifier(/datum/skill/gaming, SKILL_RANDS_MODIFIER) switch(action) if("Attack") var/attackamt = 0 //Spam prevention. diff --git a/code/modules/multiz/ladders.dm b/code/modules/multiz/ladders.dm index db56742c03..7822a87d80 100644 --- a/code/modules/multiz/ladders.dm +++ b/code/modules/multiz/ladders.dm @@ -107,7 +107,12 @@ target_ladder.audible_message(span_notice("You hear something coming [direction] \the [src]"), runemessage = "clank clank") - if(do_after(M, climb_time, src)) + var/climb_modifier = 1 + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/MS = M + climb_modifier = MS.species.climb_mult + + if(do_after(M, (climb_time * climb_modifier), src)) var/turf/T = get_turf(target_ladder) for(var/atom/A in T) if(!A.CanPass(M, M.loc, 1.5, 0)) diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index 41c026076f..98f5b27fa9 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -19,6 +19,13 @@ var/obj/mecha/mech = loc return mech.relaymove(src,direction) + var/swim_modifier = 1 + var/climb_modifier = 1 + if(istype(src,/mob/living/carbon/human)) + var/mob/living/carbon/human/MS = src + swim_modifier = MS.species.swim_mult + climb_modifier = MS.species.climb_mult + if(!can_ztravel()) to_chat(src, span_warning("You lack means of travel in that direction.")) return @@ -49,7 +56,7 @@ if(direction == DOWN) var/turf/simulated/floor/water/deep/ocean/diving/sink = start if(istype(sink) && !destination.density) - var/pull_up_time = max(3 SECONDS + (src.movement_delay() * 10), 1) + var/pull_up_time = max((3 SECONDS + (src.movement_delay() * 10) * swim_modifier), 1) to_chat(src, span_notice("You start diving underwater...")) src.audible_message(span_notice("[src] begins to dive under the water."), runemessage = "splish splosh") if(do_after(src, pull_up_time)) @@ -75,7 +82,7 @@ var/turf/simulated/floor/water/deep/ocean/diving/surface = destination if(lattice) - var/pull_up_time = max(5 SECONDS + (src.movement_delay() * 10), 1) + var/pull_up_time = max((5 SECONDS + (src.movement_delay() * 10) * climb_modifier), 1) to_chat(src, span_notice("You grab \the [lattice] and start pulling yourself upward...")) src.audible_message(span_notice("[src] begins climbing up \the [lattice]."), runemessage = "clank clang") if(do_after(src, pull_up_time)) @@ -85,7 +92,7 @@ return 0 else if(istype(surface)) - var/pull_up_time = max(5 SECONDS + (src.movement_delay() * 10), 1) + var/pull_up_time = max((5 SECONDS + (src.movement_delay() * 10) * swim_modifier), 1) to_chat(src, span_notice("You start swimming upwards...")) src.audible_message(span_notice("[src] begins to swim towards the surface."), runemessage = "splish splosh") if(do_after(src, pull_up_time)) @@ -95,7 +102,7 @@ return 0 else if(catwalk?.hatch_open) - var/pull_up_time = max(5 SECONDS + (src.movement_delay() * 10), 1) + var/pull_up_time = max((5 SECONDS + (src.movement_delay() * 10) * climb_modifier), 1) to_chat(src, span_notice("You grab the edge of \the [catwalk] and start pulling yourself upward...")) var/old_dest = destination destination = get_step(destination, dir) // mob's dir diff --git a/code/modules/organs/internal/augment/armmounted.dm b/code/modules/organs/internal/augment/armmounted.dm index 28804311a0..3845de1072 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 bbfd5742a0..f579135237 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, ui.user.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 4ef8a9be38..ac9c571184 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 fd0d3abaef..449f3bd4be 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 88542eb9b9..0473457bdc 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,9 +249,7 @@ GLOBAL_LIST_EMPTY(all_waypoints) if("move") var/ndir = text2num(params["dir"]) - if(prob(ui.user.skill_fail_chance(/datum/skill/pilot, 50, linked.skill_needed, factor = 1))) - ndir = turn(ndir,pick(90,-90)) - linked.relaymove(ui.user, ndir, accellimit) + linked.relaymove(usr, ndir, accellimit) . = TRUE if("brake") diff --git a/code/modules/overmap/ships/computers/shuttle.dm b/code/modules/overmap/ships/computers/shuttle.dm index fea0fbe7ff..8f46266d3d 100644 --- a/code/modules/overmap/ships/computers/shuttle.dm +++ b/code/modules/overmap/ships/computers/shuttle.dm @@ -34,9 +34,6 @@ to_chat(ui.user, span_warning("Unable to establish link with the shuttle.")) return TRUE - if(ismob(ui.user)) - shuttle.operator_skill = ui.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 8394744fc3..cbacd0cb3e 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/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 0b11efd130..883a4bd662 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -597,7 +597,7 @@ user << browse("[name][info_links][stamps]", "window=[name]") return - else if(istype(P, /obj/item/stamp) || istype(P, /obj/item/clothing/gloves/ring/seal)) + else if(istype(P, /obj/item/stamp) || istype(P, /obj/item/clothing/accessory/ring/seal)) if(istype(P, /obj/item/stamp)) var/obj/item/stamp/the_stamp = P if(the_stamp.stamptext) @@ -605,7 +605,7 @@ else stamps += (stamps=="" ? "
" : "
") + span_italics("This paper has been stamped with the [the_stamp.name].") else - var/obj/item/clothing/gloves/ring/seal/the_stamp = P + var/obj/item/clothing/accessory/ring/seal/the_stamp = P if(the_stamp.stamptext) stamps += (stamps=="" ? "
" : "
") + span_italics("[the_stamp.stamptext]") else diff --git a/code/modules/reagents/machinery/grinder.dm b/code/modules/reagents/machinery/grinder.dm index 096e89a943..a20920fc7e 100644 --- a/code/modules/reagents/machinery/grinder.dm +++ b/code/modules/reagents/machinery/grinder.dm @@ -1,3 +1,55 @@ +// Don't need a new list for every grinder in the game +var/global/list/sheet_reagents = list( //have a number of reagents divisible by REAGENTS_PER_SHEET (default 20) unless you like decimals. + /obj/item/stack/material/plastic = list("carbon","carbon","oxygen","chlorine","sulfur"), + /obj/item/stack/material/copper = list("copper"), + /obj/item/stack/material/wood = list("carbon","woodpulp","nitrogen","potassium","sodium"), + /obj/item/stack/material/stick = list("carbon","woodpulp","nitrogen","potassium","sodium"), + /obj/item/stack/material/log = list("carbon","woodpulp","nitrogen","potassium","sodium"), + /obj/item/stack/material/algae = list("carbon","nitrogen","nitrogen","phosphorus","phosphorus"), + /obj/item/stack/material/graphite = list("carbon"), + /obj/item/stack/material/aluminium = list("aluminum"), // The material is aluminium, but the reagent is aluminum... + /obj/item/stack/material/glass/reinforced = list("silicon","silicon","silicon","iron","carbon"), + /obj/item/stack/material/leather = list("carbon","carbon","protein","protein","triglyceride"), + /obj/item/stack/material/cloth = list("carbon","carbon","carbon","protein","sodium"), + /obj/item/stack/material/fiber = list("carbon","carbon","carbon","protein","sodium"), + /obj/item/stack/material/fur = list("carbon","carbon","carbon","sulfur","sodium"), + /obj/item/stack/material/deuterium = list("hydrogen"), + /obj/item/stack/material/glass/phoronrglass = list("silicon","silicon","silicon","phoron","phoron"), + /obj/item/stack/material/diamond = list("carbon"), + /obj/item/stack/material/durasteel = list("iron","iron","carbon","carbon","platinum"), + /obj/item/stack/material/wax = list("ethanol","triglyceride"), + /obj/item/stack/material/iron = list("iron"), + /obj/item/stack/material/uranium = list("uranium"), + /obj/item/stack/material/phoron = list("phoron"), + /obj/item/stack/material/gold = list("gold"), + /obj/item/stack/material/silver = list("silver"), + /obj/item/stack/material/platinum = list("platinum"), + /obj/item/stack/material/mhydrogen = list("hydrogen"), + /obj/item/stack/material/steel = list("iron", "carbon"), + /obj/item/stack/material/plasteel = list("iron", "iron", "carbon", "carbon", "platinum"), //8 iron, 8 carbon, 4 platinum, + /obj/item/stack/material/snow = list("water"), + /obj/item/stack/material/sandstone = list("silicon", "oxygen"), + /obj/item/stack/material/glass = list("silicon"), + /obj/item/stack/material/glass/phoronglass = list("platinum", "silicon", "silicon", "silicon"), //5 platinum, 15 silicon, + /obj/item/stack/material/supermatter = list("supermatter") + ) +var/global/list/ore_reagents = list( //have a number of reageents divisible by REAGENTS_PER_ORE (default 20) unless you like decimals. + /obj/item/ore/glass = list("silicon"), + /obj/item/ore/iron = list("iron"), + /obj/item/ore/coal = list("carbon"), + /obj/item/ore/phoron = list("phoron"), + /obj/item/ore/silver = list("silver"), + /obj/item/ore/gold = list("gold"), + /obj/item/ore/marble = list("silicon","aluminum","aluminum","sodium","calcium"), // Some nice variety here + /obj/item/ore/uranium = list("uranium"), + /obj/item/ore/diamond = list("carbon"), + /obj/item/ore/osmium = list("platinum"), // should contain osmium + /obj/item/ore/lead = list("lead"), + /obj/item/ore/hydrogen = list("hydrogen"), + /obj/item/ore/verdantium = list("radium","phoron","nitrogen","phosphorus","sodium"), // Some fun stuff to be useful with + /obj/item/ore/rutile = list("tungsten","oxygen") // Should be titanium +) + /obj/machinery/reagentgrinder name = "All-In-One Grinder" @@ -14,22 +66,6 @@ var/obj/item/reagent_containers/beaker = null var/limit = 10 var/list/holdingitems = list() - var/list/sheet_reagents = list( //have a number of reageents divisible by REAGENTS_PER_SHEET (default 20) unless you like decimals, - /obj/item/stack/material/iron = list("iron"), - /obj/item/stack/material/uranium = list("uranium"), - /obj/item/stack/material/phoron = list("phoron"), - /obj/item/stack/material/gold = list("gold"), - /obj/item/stack/material/silver = list("silver"), - /obj/item/stack/material/platinum = list("platinum"), - /obj/item/stack/material/mhydrogen = list("hydrogen"), - /obj/item/stack/material/steel = list("iron", "carbon"), - /obj/item/stack/material/plasteel = list("iron", "iron", "carbon", "carbon", "platinum"), //8 iron, 8 carbon, 4 platinum, - /obj/item/stack/material/snow = list("water"), - /obj/item/stack/material/sandstone = list("silicon", "oxygen"), - /obj/item/stack/material/glass = list("silicon"), - /obj/item/stack/material/glass/phoronglass = list("platinum", "silicon", "silicon", "silicon"), //5 platinum, 15 silicon, - /obj/item/stack/material/supermatter = list("supermatter") - ) var/static/radial_examine = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_examine") var/static/radial_eject = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_eject") @@ -137,7 +173,7 @@ return 0 - if(!sheet_reagents[O.type] && (!O.reagents || !O.reagents.total_volume)) + if(!global.sheet_reagents[O.type] && !global.ore_reagents[O.type] && (!O.reagents || !O.reagents.total_volume)) to_chat(user, "\The [O] is not suitable for blending.") return 1 @@ -228,10 +264,10 @@ if(remaining_volume <= 0) break - if(sheet_reagents[O.type]) + if(global.sheet_reagents[O.type]) var/obj/item/stack/stack = O if(istype(stack)) - var/list/sheet_components = sheet_reagents[stack.type] + var/list/sheet_components = global.sheet_reagents[stack.type] var/amount_to_take = max(0,min(stack.get_amount(),round(remaining_volume/REAGENTS_PER_SHEET))) if(amount_to_take) stack.use(amount_to_take) @@ -245,6 +281,21 @@ beaker.reagents.add_reagent(sheet_components, (amount_to_take*REAGENTS_PER_SHEET)) continue + if(global.ore_reagents[O.type]) + var/obj/item/ore/R = O + if(istype(R)) + var/list/ore_components = global.ore_reagents[R.type] + if(remaining_volume >= REAGENTS_PER_ORE) + holdingitems -= R + qdel(R) + if(islist(ore_components)) + var/amount_to_take = (REAGENTS_PER_ORE/(ore_components.len)) + for(var/i in ore_components) + beaker.reagents.add_reagent(i, amount_to_take) + else + beaker.reagents.add_reagent(ore_components, REAGENTS_PER_ORE) + continue + if(O.reagents) O.reagents.trans_to_obj(beaker, min(O.reagents.total_volume, remaining_volume)) if(O.reagents.total_volume == 0) diff --git a/code/modules/reagents/reagents/virology.dm b/code/modules/reagents/reagents/virology.dm index e2147f401d..de6e77e304 100644 --- a/code/modules/reagents/reagents/virology.dm +++ b/code/modules/reagents/reagents/virology.dm @@ -42,6 +42,7 @@ color = "#A69DA9" /datum/reagent/toxin/phoron/phoronvirusfood/weak - name = "Weakened phoronic virus food. This one seems to have been weakened, but still strong." + name = "Weakened phoronic virus food" id = "weakphoronvirusfood" + description = "Mutates viruses when mixed in blood. This one seems to have been weakened, but still strong." color = "#CEC3C6" diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index a3952a80ae..89bc7f2d88 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/modules/vore/fluffstuff/custom_boxes_vr.dm b/code/modules/vore/fluffstuff/custom_boxes_vr.dm index 741d3055a1..1ff0dbeada 100644 --- a/code/modules/vore/fluffstuff/custom_boxes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_boxes_vr.dm @@ -198,7 +198,7 @@ name = "Phi's Personal Items" has_items = list( /obj/item/clothing/accessory/medal/bronze_heart, - /obj/item/clothing/gloves/ring/seal/signet/fluff/phi) + /obj/item/clothing/accessory/ring/seal/signet/fluff/phi) // Tabiranth: Ascian /obj/item/grenade/spawnergrenade/spirit diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index 6a19ad9ec2..dcab0fdc8a 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -1687,14 +1687,14 @@ Departamental Swimsuits, for general use item_state = "kilanosuit_p_mob" //Mewchild: Phi Vietsi -/obj/item/clothing/gloves/ring/seal/signet/fluff/phi +/obj/item/clothing/accessory/ring/seal/signet/fluff/phi name = "Phi's Bone Signet Ring" desc = "A signet ring belonging to Phi, carved from the bones of something long extinct, as a ward against bad luck." icon = 'icons/vore/custom_clothes_vr.dmi' icon_state = "phi_ring" -/obj/item/clothing/gloves/ring/seal/signet/fluff/phi/change_name(var/signet_name = "Unknown") +/obj/item/clothing/accessory/ring/seal/signet/fluff/phi/change_name(var/signet_name = "Unknown") name = "[signet_name]'s Bone Signet Ring" desc = "A signet ring belonging to [signet_name], carved from the bones of something long extinct, as a ward against bad luck." @@ -1951,12 +1951,13 @@ Departamental Swimsuits, for general use icon_override = 'icons/vore/custom_clothes_vr.dmi' //CappyCat:Cappy Fuzzlyfeathers -/obj/item/clothing/accessory/watch +/obj/item/clothing/accessory/watch/custom name = "silver pocket watch" desc = "A fancy silver-plated digital pocket watch. Looks expensive." icon = 'icons/obj/deadringer.dmi' icon_state = "deadringer" w_class = ITEMSIZE_SMALL + slot = ACCESSORY_SLOT_INSIGNIA slot_flags = SLOT_ID | SLOT_BELT | SLOT_TIE //Pimientopyro:Zaku Fyodorovna @@ -2708,7 +2709,7 @@ Departamental Swimsuits, for general use //Halored: Mercury -/obj/item/clothing/gloves/ring/material/void_opal/fluff/mercury +/obj/item/clothing/accessory/ring/material/void_opal/fluff/mercury name = "Mercury's Mate Ring" desc = "A band of void opal, given to Mercury by Lumen" diff --git a/code/modules/xenoarcheaology/artifacts/replicator_vr.dm b/code/modules/xenoarcheaology/artifacts/replicator_vr.dm index 144f51bd76..e8b1ff662a 100644 --- a/code/modules/xenoarcheaology/artifacts/replicator_vr.dm +++ b/code/modules/xenoarcheaology/artifacts/replicator_vr.dm @@ -347,7 +347,7 @@ var/list/created_items = list() var/list/tgui_vore_selection = list() var/list/viable_items = list( - /obj/item/clothing/gloves/ring, + /obj/item/clothing/accessory/ring, /obj/item/clothing/gloves/evening, /obj/item/clothing/gloves/black, /obj/item/clothing/under/swimsuit/black, diff --git a/code/modules/xenoarcheaology/finds/find_spawning.dm b/code/modules/xenoarcheaology/finds/find_spawning.dm index 7c262bd350..af11c748e7 100644 --- a/code/modules/xenoarcheaology/finds/find_spawning.dm +++ b/code/modules/xenoarcheaology/finds/find_spawning.dm @@ -576,7 +576,7 @@ apply_image_decorations = TRUE if(prob(25)) apply_material_decorations = FALSE - new_item = new /obj/item/clothing/gloves/ring/material(src.loc) + new_item = new /obj/item/clothing/accessory/ring/material(src.loc) item_type = new_item.name if(ARCHAEO_CLUB) diff --git a/code/unit_tests/map_tests.dm b/code/unit_tests/map_tests.dm index e988835fc4..d6a9347784 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/config/alienwhitelist.txt b/config/alienwhitelist.txt index 9da41e180f..e604fe5f39 100644 --- a/config/alienwhitelist.txt +++ b/config/alienwhitelist.txt @@ -79,6 +79,7 @@ jademanique - Protean jademanique - Teppi jademanique - Xenochimera joltze - Black-Eyed Shadekin +jparker890 - Vox juney7 - Hanner kered2 - Protean khanivore - Protean @@ -221,3 +222,4 @@ yeehawguvnah - Xenochimera zalvine - Shadekin Empathy zammyman215 - Vox zeracyfr - Xenochimera +zwadstheiguana - Diona diff --git a/icons/inventory/accessory/mob.dmi b/icons/inventory/accessory/mob.dmi index 8b67d7d7de..9c30c1c501 100644 Binary files a/icons/inventory/accessory/mob.dmi and b/icons/inventory/accessory/mob.dmi differ diff --git a/icons/inventory/hands/item.dmi b/icons/inventory/hands/item.dmi index 228d799923..104a112bf1 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 e1825ca97c..ab825c3513 100644 Binary files a/icons/inventory/hands/mob.dmi and b/icons/inventory/hands/mob.dmi differ diff --git a/icons/mob/robot/janitor.dmi b/icons/mob/robot/janitor.dmi index 7410b353a7..3dbaa27a42 100644 Binary files a/icons/mob/robot/janitor.dmi and b/icons/mob/robot/janitor.dmi differ diff --git a/icons/mob/turkey.dmi b/icons/mob/turkey.dmi new file mode 100644 index 0000000000..8f7d1db729 Binary files /dev/null and b/icons/mob/turkey.dmi differ diff --git a/icons/mob/vore.dmi b/icons/mob/vore.dmi index 67209c83d7..33cc2020b0 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 0729f89428..0133201cba 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 6df4edab48..1abe1e3843 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 80566ece9e..a7598b39a5 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 c5ecf41b1a..26286904c7 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 276e8cb3c5..b11e83ee61 100644 Binary files a/icons/obj/pillows.dmi and b/icons/obj/pillows.dmi differ diff --git a/icons/obj/playing_cards.dmi b/icons/obj/playing_cards.dmi index 0f2e51923a..fd1679a323 100644 Binary files a/icons/obj/playing_cards.dmi and b/icons/obj/playing_cards.dmi differ diff --git a/icons/obj/trash.dmi b/icons/obj/trash.dmi index 8866b481c1..482452e8ec 100644 Binary files a/icons/obj/trash.dmi and b/icons/obj/trash.dmi differ diff --git a/maps/redgate/cybercity.dmm b/maps/redgate/cybercity.dmm index 8c1f1046b0..b5b094ca1b 100644 --- a/maps/redgate/cybercity.dmm +++ b/maps/redgate/cybercity.dmm @@ -9083,7 +9083,7 @@ /turf/simulated/floor/tiled/white, /area/redgate/city/supermarket) "lXc" = ( -/obj/item/clothing/gloves/knuckledusters, +/obj/item/clothing/accessory/knuckledusters, /turf/simulated/floor/wood/alt/tile, /area/redgate/city/fightclub) "lXi" = ( @@ -9484,7 +9484,7 @@ /obj/structure/closet/wardrobe, /obj/random/maintenance/cargo, /obj/item/clothing/glasses/goggles, -/obj/item/clothing/gloves/ring/material/plastic, +/obj/item/clothing/accessory/ring/material/plastic, /obj/item/clothing/under/cuttop/red, /turf/simulated/floor/wood, /area/redgate/city/apartments) diff --git a/maps/redgate/fantasy.dmm b/maps/redgate/fantasy.dmm index 55252e07c6..072d62751c 100644 --- a/maps/redgate/fantasy.dmm +++ b/maps/redgate/fantasy.dmm @@ -550,7 +550,7 @@ /area/redgate/fantasy/butcher) "dw" = ( /obj/structure/table/woodentable, -/obj/item/clothing/gloves/ring/material/silver, +/obj/item/clothing/accessory/ring/material/silver, /obj/structure/window/basic{ dir = 4 }, @@ -2067,7 +2067,7 @@ /area/redgate/fantasy/redgate) "mW" = ( /obj/structure/table/woodentable, -/obj/item/clothing/gloves/ring/material/diamond, +/obj/item/clothing/accessory/ring/material/diamond, /obj/structure/window/basic{ dir = 4 }, @@ -2507,7 +2507,7 @@ /area/redgate/fantasy/grocery) "pq" = ( /obj/structure/table/woodentable, -/obj/item/clothing/gloves/ring/material/gold, +/obj/item/clothing/accessory/ring/material/gold, /obj/structure/window/basic{ dir = 4 }, @@ -2906,7 +2906,7 @@ /area/redgate/fantasy/church) "rO" = ( /obj/structure/table/woodentable, -/obj/item/clothing/gloves/ring/material/wood, +/obj/item/clothing/accessory/ring/material/wood, /turf/simulated/floor/wood/alt, /area/redgate/fantasy/jewler) "rP" = ( @@ -3465,7 +3465,7 @@ /area/redgate/fantasy/butcher) "vl" = ( /obj/structure/table/rack/shelf/wood, -/obj/item/clothing/gloves/ring/material/silver, +/obj/item/clothing/accessory/ring/material/silver, /obj/machinery/light/small/torch{ dir = 8 }, @@ -3489,7 +3489,7 @@ /area/redgate/fantasy/castle) "vp" = ( /obj/structure/table/woodentable, -/obj/item/clothing/gloves/ring/material/void_opal, +/obj/item/clothing/accessory/ring/material/void_opal, /obj/structure/window/basic{ dir = 4 }, @@ -5126,7 +5126,7 @@ /area/redgate/fantasy/house) "FQ" = ( /obj/structure/table/woodentable, -/obj/item/clothing/gloves/knuckledusters, +/obj/item/clothing/accessory/knuckledusters, /turf/simulated/floor/wood/alt, /area/redgate/fantasy/house) "FS" = ( @@ -7836,7 +7836,7 @@ /area/redgate/fantasy/butcher) "WW" = ( /obj/structure/table/rack/shelf/wood, -/obj/item/clothing/gloves/ring/material/gold, +/obj/item/clothing/accessory/ring/material/gold, /turf/simulated/floor/wood/alt, /area/redgate/fantasy/jewler) "WZ" = ( @@ -8255,7 +8255,7 @@ /area/redgate/fantasy/bard) "ZP" = ( /obj/structure/table/woodentable, -/obj/item/clothing/gloves/ring/material/iron, +/obj/item/clothing/accessory/ring/material/iron, /turf/simulated/floor/wood/alt, /area/redgate/fantasy/jewler) "ZS" = ( diff --git a/maps/redgate/fantasy_dungeon.dmm b/maps/redgate/fantasy_dungeon.dmm index 64436653a2..44cc56930b 100644 --- a/maps/redgate/fantasy_dungeon.dmm +++ b/maps/redgate/fantasy_dungeon.dmm @@ -209,7 +209,7 @@ /turf/simulated/floor/concrete, /area/redgate/fantasy/castle) "ez" = ( -/obj/item/clothing/gloves/ring/material/gold, +/obj/item/clothing/accessory/ring/material/gold, /turf/simulated/mineral/floor/ignore_cavegen/cave, /area/redgate/fantasy/caves) "eP" = ( diff --git a/maps/redgate/hotsprings.dmm b/maps/redgate/hotsprings.dmm index 725aafba2a..4a8eaccc54 100644 --- a/maps/redgate/hotsprings.dmm +++ b/maps/redgate/hotsprings.dmm @@ -1209,7 +1209,7 @@ /obj/random/mouseray, /obj/random/cash/huge, /obj/item/clothing/ears/earring/dangle/diamond, -/obj/item/clothing/gloves/ring/material/diamond, +/obj/item/clothing/accessory/ring/material/diamond, /obj/structure/closet/grave/dirthole, /obj/random/coin, /turf/simulated/floor/outdoors/dirt{ diff --git a/maps/redgate/islands_underwater.dmm b/maps/redgate/islands_underwater.dmm index 834ec9585a..5f25f246f3 100644 --- a/maps/redgate/islands_underwater.dmm +++ b/maps/redgate/islands_underwater.dmm @@ -848,7 +848,7 @@ /turf/simulated/floor/water/underwater/sand, /area/redgate/islands/ruins) "qY" = ( -/obj/item/clothing/gloves/ring/material/gold, +/obj/item/clothing/accessory/ring/material/gold, /turf/simulated/floor/water/underwater/sand, /area/redgate/islands/ruins) "rk" = ( diff --git a/maps/redgate/jungle.dmm b/maps/redgate/jungle.dmm index de8eeff00d..b8a99f781a 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/redgate/train_upper.dmm b/maps/redgate/train_upper.dmm index f5921a71d0..56b0847229 100644 --- a/maps/redgate/train_upper.dmm +++ b/maps/redgate/train_upper.dmm @@ -3121,8 +3121,8 @@ /obj/structure/closet/cabinet, /obj/item/clothing/under/suit_jacket, /obj/item/clothing/shoes/dress, -/obj/item/clothing/gloves/ring/wedding, -/obj/item/clothing/gloves/ring/wedding, +/obj/item/clothing/accessory/ring/wedding, +/obj/item/clothing/accessory/ring/wedding, /obj/item/clothing/accessory/bowtie/black, /turf/simulated/floor/wood, /area/redgate/train/dorm6) diff --git a/maps/southern_cross/job/outfits.dm b/maps/southern_cross/job/outfits.dm index 2a1cf6d67b..f2ef7db2ee 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 4a75431dda..87e5ba518d 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 15bb7139ee..a6d068408d 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/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/door/firedoor/glass, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled/eris/steel/brown_platform, -/area/quartermaster/storage) +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/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/submaps/admin_use_vr/kk_mercship.dmm b/maps/submaps/admin_use_vr/kk_mercship.dmm index 899fd7f736..7a8048d4fa 100644 --- a/maps/submaps/admin_use_vr/kk_mercship.dmm +++ b/maps/submaps/admin_use_vr/kk_mercship.dmm @@ -9996,8 +9996,8 @@ /obj/machinery/recharger/wallcharger{ pixel_y = 20 }, -/obj/item/clothing/gloves/knuckledusters, -/obj/item/clothing/gloves/knuckledusters, +/obj/item/clothing/accessory/knuckledusters, +/obj/item/clothing/accessory/knuckledusters, /obj/item/flash, /obj/item/flash, /obj/item/laser_pointer/upgraded, diff --git a/maps/submaps/depreciated_vr/mercbase.dmm b/maps/submaps/depreciated_vr/mercbase.dmm index ca3b40f71b..234417b727 100644 --- a/maps/submaps/depreciated_vr/mercbase.dmm +++ b/maps/submaps/depreciated_vr/mercbase.dmm @@ -2463,11 +2463,11 @@ }, /area/antag/antag_base) "dM" = ( -/obj/item/clothing/gloves/knuckledusters, -/obj/item/clothing/gloves/knuckledusters, -/obj/item/clothing/gloves/knuckledusters, -/obj/item/clothing/gloves/knuckledusters, -/obj/item/clothing/gloves/knuckledusters, +/obj/item/clothing/accessory/knuckledusters, +/obj/item/clothing/accessory/knuckledusters, +/obj/item/clothing/accessory/knuckledusters, +/obj/item/clothing/accessory/knuckledusters, +/obj/item/clothing/accessory/knuckledusters, /obj/structure/table/steel, /obj/effect/floor_decal/borderfloorblack{ dir = 6 diff --git a/maps/submaps/surface_submaps/wilderness/drgnplateu.dmm b/maps/submaps/surface_submaps/wilderness/drgnplateu.dmm index 2f202bffda..7043f0230e 100644 --- a/maps/submaps/surface_submaps/wilderness/drgnplateu.dmm +++ b/maps/submaps/surface_submaps/wilderness/drgnplateu.dmm @@ -41,7 +41,7 @@ /obj/structure/flora/grass/green{ pixel_x = -8 }, -/obj/item/clothing/gloves/ring/material/gold, +/obj/item/clothing/accessory/ring/material/gold, /obj/item/clothing/ears/earring/stud/gold, /obj/item/gun/projectile/deagle/gold{ pixel_x = -11; diff --git a/maps/tether/tether-05-station1.dmm b/maps/tether/tether-05-station1.dmm index 010b2f41e2..712a50b3be 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 7dc03f38e2..758b707b9e 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/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotComponent.tsx b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotComponent.tsx index 293db7da7d..165b95af2e 100644 --- a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotComponent.tsx +++ b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotComponent.tsx @@ -2,16 +2,17 @@ import { capitalize } from 'common/string'; import { useState } from 'react'; import { useBackend } from 'tgui/backend'; import { + Box, Button, Divider, Flex, Icon, - Image, Input, Section, Stack, Tabs, } from 'tgui/components'; +import { classes } from 'tgui-core/react'; import { NoSpriteWarning } from '../components'; import { @@ -163,15 +164,18 @@ export const ModifyRobotComponent = (props: { - + + + + + + + diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotModules.tsx b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotModules.tsx index 045025ccd5..85ad5a6da4 100644 --- a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotModules.tsx +++ b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotModules.tsx @@ -13,6 +13,7 @@ import { Section, Stack, } from 'tgui/components'; +import { classes } from 'tgui-core/react'; import { NoSpriteWarning } from '../components'; import { prepareSearch } from '../functions'; @@ -47,7 +48,8 @@ export const ModifyRobotModules = (props: { /> {!!source && ( - + + + + + + + { /> - + + + + + + + { /> - + + + + + + + { + const { act } = useBackend(); + const { currentName, isDefaultName, sprite, size } = props; + + return ( +
act('confirm')}> + Confirm + + } + > + + + + Name: + + + + act('rename', { value })} + maxLength={52} + textColor={isDefaultName ? 'red' : undefined} + /> + + + + + {!!sprite && !!size && ( + <> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + )} +
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/RobotChoose/ModuleSection.tsx b/tgui/packages/tgui/interfaces/RobotChoose/ModuleSection.tsx new file mode 100644 index 0000000000..c90dbbe7be --- /dev/null +++ b/tgui/packages/tgui/interfaces/RobotChoose/ModuleSection.tsx @@ -0,0 +1,47 @@ +import { createSearch } from 'common/string'; +import { useState } from 'react'; +import { Input, Section, Stack } from 'tgui-core/components'; + +import { SelectorElement } from './SelectorElement'; + +export const ModuleSection = (props: { + title: string; + sortable?: string[]; + selected?: string; +}) => { + const { title, sortable, selected } = props; + + const [searchText, setSearchText] = useState(''); + + const searcher = createSearch(searchText, (element: string) => { + return element; + }); + + const filtered = sortable?.filter(searcher); + + return ( +
+ + setSearchText(value)} + /> + + + + {!!filtered && + filtered.map((filter) => ( + + ))} + + +
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/RobotChoose/SelectorElement.tsx b/tgui/packages/tgui/interfaces/RobotChoose/SelectorElement.tsx new file mode 100644 index 0000000000..3279ce7882 --- /dev/null +++ b/tgui/packages/tgui/interfaces/RobotChoose/SelectorElement.tsx @@ -0,0 +1,34 @@ +import { useBackend } from 'tgui/backend'; +import { Button, Flex, Icon, Stack } from 'tgui-core/components'; + +export const SelectorElement = (props: { + option: string; + action: string; + selected?: string | null; + belly?: boolean; +}) => { + const { act } = useBackend(); + const { option, action, selected, belly } = props; + + return ( + + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/RobotChoose/SpriteSection.tsx b/tgui/packages/tgui/interfaces/RobotChoose/SpriteSection.tsx new file mode 100644 index 0000000000..d287792d02 --- /dev/null +++ b/tgui/packages/tgui/interfaces/RobotChoose/SpriteSection.tsx @@ -0,0 +1,80 @@ +import { useState } from 'react'; +import { Button, Input, Section, Stack } from 'tgui-core/components'; + +import { robotSpriteSearcher } from './functions'; +import { SelectorElement } from './SelectorElement'; +import { spriteOption } from './types'; + +export const SpriteSection = (props: { + title: string; + selected?: string | null; + sortable?: spriteOption[]; +}) => { + const { title, sortable, selected } = props; + + const [searchText, setSearchText] = useState(''); + const [includeDefault, setIncludeDefault] = useState(false); + const [includeWide, setInclideDog] = useState(false); + const [includeTall, setIncludeTall] = useState(false); + + const filtered = robotSpriteSearcher( + searchText, + includeDefault, + includeWide, + includeTall, + sortable, + ); + return ( +
+ setIncludeDefault(!includeDefault)} + > + Def + + setInclideDog(!includeWide)} + > + Wide + + setIncludeTall(!includeTall)} + > + Tall + + + } + > + + setSearchText(value)} + /> + + + + {!!filtered && + filtered.map((filter) => ( + + ))} + + +
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/RobotChoose/functions.ts b/tgui/packages/tgui/interfaces/RobotChoose/functions.ts new file mode 100644 index 0000000000..db60717e88 --- /dev/null +++ b/tgui/packages/tgui/interfaces/RobotChoose/functions.ts @@ -0,0 +1,47 @@ +import { filter } from 'common/collections'; +import { flow } from 'common/fp'; +import { createSearch } from 'common/string'; + +import { spriteOption } from './types'; + +export function robotSpriteSearcher( + searchText: string, + includeDefault: boolean, + includeWide: boolean, + includeTall: boolean, + sprites?: spriteOption[], +): spriteOption[] { + const testSearch = createSearch( + searchText, + (sprite: spriteOption) => sprite.sprite, + ); + if (!sprites) { + return []; + } + let subtypes: string[] = []; + if (includeDefault) { + subtypes.push('def'); + } + if (includeWide) { + subtypes.push('wide'); + } + if (includeTall) { + subtypes.push('tall'); + } + return flow([ + (sprites: spriteOption[]) => { + if (!searchText) { + return sprites; + } else { + return filter(sprites, testSearch); + } + }, + (sprites: spriteOption[]) => { + if (!subtypes.length) { + return sprites; + } else { + return filter(sprites, (sprite) => subtypes.includes(sprite.type)); + } + }, + ])(sprites); +} diff --git a/tgui/packages/tgui/interfaces/RobotChoose/index.tsx b/tgui/packages/tgui/interfaces/RobotChoose/index.tsx new file mode 100644 index 0000000000..91d8dcb7d5 --- /dev/null +++ b/tgui/packages/tgui/interfaces/RobotChoose/index.tsx @@ -0,0 +1,49 @@ +import { useBackend } from 'tgui/backend'; +import { Window } from 'tgui/layouts'; +import { Stack } from 'tgui-core/components'; + +import { IconSection } from './IconSection'; +import { ModuleSection } from './ModuleSection'; +import { SpriteSection } from './SpriteSection'; +import { Data } from './types'; + +export const RobotChoose = (props) => { + const { data } = useBackend(); + + const { + possible_modules, + possible_sprites, + selected_module, + sprite_datum, + theme, + currentName, + isDefaultName, + sprite_datum_class, + sprite_datum_size, + } = data; + + return ( + + + + + + + + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/RobotChoose/types.ts b/tgui/packages/tgui/interfaces/RobotChoose/types.ts new file mode 100644 index 0000000000..06d691c589 --- /dev/null +++ b/tgui/packages/tgui/interfaces/RobotChoose/types.ts @@ -0,0 +1,13 @@ +export type Data = { + possible_modules: string[]; + possible_sprites?: spriteOption[]; + currentName: string; + isDefaultName: boolean; + theme?: string; + selected_module?: string; + sprite_datum?: string | null; + sprite_datum_class?: string | null; + sprite_datum_size?: string | null; +}; + +export type spriteOption = { sprite: string; belly: boolean; type: string }; diff --git a/tgui/packages/tgui/interfaces/Robotact/index.tsx b/tgui/packages/tgui/interfaces/Robotact/index.tsx index 94b9725334..1ab5ea486a 100644 --- a/tgui/packages/tgui/interfaces/Robotact/index.tsx +++ b/tgui/packages/tgui/interfaces/Robotact/index.tsx @@ -18,7 +18,7 @@ export const Robotact = (props) => { } return ( - + {content} ); diff --git a/tgui/packages/tgui/interfaces/Robotact/types.ts b/tgui/packages/tgui/interfaces/Robotact/types.ts index bd33676d99..b4232ff6e4 100644 --- a/tgui/packages/tgui/interfaces/Robotact/types.ts +++ b/tgui/packages/tgui/interfaces/Robotact/types.ts @@ -31,6 +31,7 @@ export type Data = { max_health: number; light_color: string; + theme?: string; // Modules modules_static: Module[]; diff --git a/vorestation.dme b/vorestation.dme index 07be19acdd..6cfbf26f07 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" @@ -2129,6 +2119,29 @@ #include "code\modules\clothing\clothing_accessories.dm" #include "code\modules\clothing\clothing_icons.dm" #include "code\modules\clothing\clothing_vr.dm" +#include "code\modules\clothing\accessories\accessory.dm" +#include "code\modules\clothing\accessories\accessory_vr.dm" +#include "code\modules\clothing\accessories\altevian_vr.dm" +#include "code\modules\clothing\accessories\armband.dm" +#include "code\modules\clothing\accessories\armor.dm" +#include "code\modules\clothing\accessories\badges.dm" +#include "code\modules\clothing\accessories\badges_vr.dm" +#include "code\modules\clothing\accessories\clothing.dm" +#include "code\modules\clothing\accessories\clothing_vr.dm" +#include "code\modules\clothing\accessories\hands.dm" +#include "code\modules\clothing\accessories\holster.dm" +#include "code\modules\clothing\accessories\holster_vr.dm" +#include "code\modules\clothing\accessories\lockets.dm" +#include "code\modules\clothing\accessories\permits.dm" +#include "code\modules\clothing\accessories\permits_vr.dm" +#include "code\modules\clothing\accessories\rings.dm" +#include "code\modules\clothing\accessories\shiny_vr.dm" +#include "code\modules\clothing\accessories\storage.dm" +#include "code\modules\clothing\accessories\storage_vr.dm" +#include "code\modules\clothing\accessories\torch.dm" +#include "code\modules\clothing\accessories\torch_vr.dm" +#include "code\modules\clothing\accessories\watches.dm" +#include "code\modules\clothing\accessories\temperature\poncho.dm" #include "code\modules\clothing\ears\earrings.dm" #include "code\modules\clothing\ears\ears.dm" #include "code\modules\clothing\glasses\glasses.dm" @@ -2174,9 +2187,6 @@ #include "code\modules\clothing\masks\shiny_vr.dm" #include "code\modules\clothing\masks\tesh_synth_facemask.dm" #include "code\modules\clothing\masks\voice.dm" -#include "code\modules\clothing\rings\material.dm" -#include "code\modules\clothing\rings\rings.dm" -#include "code\modules\clothing\rings\rings_vr.dm" #include "code\modules\clothing\shoes\boots.dm" #include "code\modules\clothing\shoes\boots_vr.dm" #include "code\modules\clothing\shoes\colour.dm" @@ -2285,26 +2295,6 @@ #include "code\modules\clothing\under\solgov_vr.dm" #include "code\modules\clothing\under\syndicate.dm" #include "code\modules\clothing\under\tribal.dm" -#include "code\modules\clothing\under\accessories\accessory.dm" -#include "code\modules\clothing\under\accessories\accessory_vr.dm" -#include "code\modules\clothing\under\accessories\altevian_vr.dm" -#include "code\modules\clothing\under\accessories\armband.dm" -#include "code\modules\clothing\under\accessories\armor.dm" -#include "code\modules\clothing\under\accessories\badges.dm" -#include "code\modules\clothing\under\accessories\badges_vr.dm" -#include "code\modules\clothing\under\accessories\clothing.dm" -#include "code\modules\clothing\under\accessories\clothing_vr.dm" -#include "code\modules\clothing\under\accessories\holster.dm" -#include "code\modules\clothing\under\accessories\holster_vr.dm" -#include "code\modules\clothing\under\accessories\lockets.dm" -#include "code\modules\clothing\under\accessories\permits.dm" -#include "code\modules\clothing\under\accessories\permits_vr.dm" -#include "code\modules\clothing\under\accessories\shiny_vr.dm" -#include "code\modules\clothing\under\accessories\storage.dm" -#include "code\modules\clothing\under\accessories\storage_vr.dm" -#include "code\modules\clothing\under\accessories\torch.dm" -#include "code\modules\clothing\under\accessories\torch_vr.dm" -#include "code\modules\clothing\under\accessories\temperature\poncho.dm" #include "code\modules\clothing\under\jobs\civilian.dm" #include "code\modules\clothing\under\jobs\engineering.dm" #include "code\modules\clothing\under\jobs\medsci.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" @@ -3163,6 +3152,7 @@ #include "code\modules\mob\living\silicon\robot\robot_movement.dm" #include "code\modules\mob\living\silicon\robot\robot_remote_control.dm" #include "code\modules\mob\living\silicon\robot\robot_ui.dm" +#include "code\modules\mob\living\silicon\robot\robot_ui_module.dm" #include "code\modules\mob\living\silicon\robot\dogborg\dog_modules_vr.dm" #include "code\modules\mob\living\silicon\robot\dogborg\dog_sleeper_vr.dm" #include "code\modules\mob\living\silicon\robot\drone\drone.dm" @@ -3417,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" @@ -3456,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" @@ -4406,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"