Merge remote-tracking branch 'upstream/master' into departmental-clothing-vendors

This commit is contained in:
E-MonaRhg
2021-08-16 21:32:35 +02:00
40 changed files with 2443 additions and 2837 deletions
File diff suppressed because it is too large Load Diff
+29 -27
View File
@@ -1620,6 +1620,7 @@
/obj/structure/sign/securearea{
pixel_x = -32
},
/obj/machinery/suit_storage_unit/gamma,
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/gamma/space)
"fW" = (
@@ -3547,6 +3548,12 @@
/obj/structure/flora/ausbushes/sparsegrass,
/turf/simulated/floor/grass,
/area/centcom/control)
"nb" = (
/obj/machinery/autolathe/upgraded/gamma,
/obj/item/stack/sheet/glass/fifty,
/obj/item/stack/sheet/metal/fifty,
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/gamma/space)
"nc" = (
/obj/machinery/door/airlock/centcom{
name = "Gamma Armory";
@@ -4076,18 +4083,12 @@
/area/centcom/gamma)
"oJ" = (
/obj/structure/closet/secure_closet/guncabinet,
/obj/item/ammo_box/magazine/m10mm,
/obj/item/ammo_box/magazine/m10mm,
/obj/item/ammo_box/magazine/m10mm,
/obj/item/gun/projectile/automatic/pistol{
name = "pistol"
},
/obj/item/gun/projectile/automatic/pistol{
name = "pistol"
},
/obj/item/gun/projectile/automatic/pistol{
name = "pistol"
},
/obj/item/ammo_box/magazine/smgm9mm,
/obj/item/ammo_box/magazine/smgm9mm,
/obj/item/ammo_box/magazine/smgm9mm,
/obj/item/gun/projectile/automatic/proto,
/obj/item/gun/projectile/automatic/proto,
/obj/item/gun/projectile/automatic/proto,
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/gamma/space)
"oN" = (
@@ -4258,14 +4259,6 @@
/obj/structure/flora/ausbushes,
/turf/simulated/floor/grass,
/area/centcom/specops)
"pk" = (
/obj/structure/closet/secure_closet/guncabinet,
/obj/item/ammo_casing/rocket,
/obj/item/ammo_casing/rocket,
/obj/item/ammo_casing/rocket,
/obj/item/gun/rocketlauncher,
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/gamma/space)
"pl" = (
/obj/structure/window/reinforced{
dir = 1
@@ -4317,9 +4310,7 @@
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/gamma/space)
"pu" = (
/obj/mecha/combat/durand/loaded{
operation_req_access = list(1)
},
/obj/mecha/combat/marauder/ares/loaded,
/obj/structure/cable{
d1 = 4;
d2 = 8;
@@ -4527,6 +4518,11 @@
},
/turf/simulated/floor/plasteel/dark,
/area/centcom/specops)
"qf" = (
/obj/structure/closet/secure_closet/guncabinet,
/obj/item/gun/medbeam,
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/gamma/space)
"qh" = (
/obj/structure/holowindow,
/turf/simulated/floor/holofloor{
@@ -9964,6 +9960,12 @@
icon_state = "red"
},
/area/holodeck/source_knightarena)
"LN" = (
/obj/machinery/recharger/wallcharger{
pixel_x = -24
},
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/gamma/space)
"LO" = (
/obj/machinery/autolathe/upgraded{
hacked = 1
@@ -25459,8 +25461,8 @@ th
fm
of
oB
pf
pf
LN
nb
pf
fV
of
@@ -25717,7 +25719,7 @@ fm
of
oJ
pf
pk
po
pf
pq
of
@@ -25974,7 +25976,7 @@ fm
of
oW
pf
po
qf
pf
pu
of
+3 -3
View File
@@ -43,9 +43,9 @@
return num
//Returns the hex value of a number given a value assumed to be a base-ten value
/proc/num2hex(num, placeholder)
if(!isnum(num)) return
if(placeholder == null) placeholder = 2
/proc/num2hex(num, placeholder = 2)
if(!isnum(num) || num < 0)
return
var/hex = ""
while(num)
+31 -1
View File
@@ -1,9 +1,16 @@
PROCESSING_SUBSYSTEM_DEF(radiation)
name = "Radiation"
flags = SS_NO_INIT | SS_BACKGROUND
flags = SS_BACKGROUND | SS_NO_INIT
wait = 1 SECONDS
offline_implications = "Radiation will no longer function; power generation may not happen. A restart may or may not be required, depending on the situation."
var/list/warned_atoms = list()
// Cache radiation levels for each turf so it doesn't need to be done iteratively
// turf_rad_cache is the state in the current loop, and may not be 100% representative
// until processing is complete.
// prev_rad_cache is the fully evaluated radiation state cache from the previous tick.
var/list/turf_rad_cache = list()
var/list/prev_rad_cache = list()
/datum/controller/subsystem/processing/radiation/proc/warn(datum/component/radioactive/contamination)
if(!contamination || QDELETED(contamination))
@@ -16,3 +23,26 @@ PROCESSING_SUBSYSTEM_DEF(radiation)
SSblackbox.record_feedback("tally", "contaminated", 1, master.type)
var/msg = "has become contaminated with enough radiation to contaminate other objects. || Source: [contamination.source] || Strength: [contamination.strength]"
master.investigate_log(msg, "radiation")
/datum/controller/subsystem/processing/radiation/fire(resumed)
refresh_rad_cache()
. = ..()
/datum/controller/subsystem/processing/radiation/proc/get_turf_radiation(turf/place)
if (prev_rad_cache[place])
return prev_rad_cache[place]
else
return 0
/datum/controller/subsystem/processing/radiation/proc/update_rad_cache(datum/component/radioactive/thing)
var/atom/owner = thing.parent
var/turf/place = get_turf(owner)
if (turf_rad_cache[place])
turf_rad_cache[place] += thing.strength
else
turf_rad_cache[place] = thing.strength
/datum/controller/subsystem/processing/radiation/proc/refresh_rad_cache()
prev_rad_cache = turf_rad_cache.Copy()
turf_rad_cache = list()
+1
View File
@@ -46,6 +46,7 @@
if(!hl3_release_date)
return
strength -= strength / hl3_release_date
SSradiation.update_rad_cache(src)
if(strength <= RAD_BACKGROUND_RADIATION)
qdel(src)
return PROCESS_KILL
+1 -1
View File
@@ -11,7 +11,7 @@ GLOBAL_LIST_INIT(possible_changeling_IDs, list("Alpha","Beta","Gamma","Delta","E
name = "changeling"
config_tag = "changeling"
restricted_jobs = list("AI", "Cyborg")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation Brigadier General")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation General")
protected_species = list("Machine")
required_players = 15
required_enemies = 1
+1 -1
View File
@@ -48,7 +48,7 @@ GLOBAL_LIST_EMPTY(all_cults)
/datum/game_mode/cult
name = "cult"
config_tag = "cult"
restricted_jobs = list("Chaplain", "AI", "Cyborg", "Internal Affairs Agent", "Security Officer", "Warden", "Detective", "Security Pod Pilot", "Head of Security", "Captain", "Head of Personnel", "Blueshield", "Nanotrasen Representative", "Magistrate", "Brig Physician", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation Brigadier General")
restricted_jobs = list("Chaplain", "AI", "Cyborg", "Internal Affairs Agent", "Security Officer", "Warden", "Detective", "Security Pod Pilot", "Head of Security", "Captain", "Head of Personnel", "Blueshield", "Nanotrasen Representative", "Magistrate", "Brig Physician", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation General")
protected_jobs = list()
required_players = 30
required_enemies = 3
+1 -1
View File
@@ -74,7 +74,7 @@ Made by Xhuis
required_enemies = 2
recommended_enemies = 2
restricted_jobs = list("AI", "Cyborg")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Head of Personnel", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation Brigadier General")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Head of Personnel", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation General")
/datum/game_mode/shadowling/announce()
to_chat(world, "<b>The current game mode is - Shadowling!</b>")
+1 -1
View File
@@ -11,7 +11,7 @@
name = "traitor"
config_tag = "traitor"
restricted_jobs = list("Cyborg")//They are part of the AI if he is traitor so are they, they use to get double chances
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Internal Affairs Agent", "Brig Physician", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation Brigadier General")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Internal Affairs Agent", "Brig Physician", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation General")
required_players = 0
required_enemies = 1
recommended_enemies = 4
+1 -1
View File
@@ -2,7 +2,7 @@
name = "traitor+vampire"
config_tag = "traitorvamp"
traitors_possible = 3 //hard limit on traitors if scaling is turned off
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Chaplain", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer", "Solar Federation Brigadier General")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Chaplain", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer", "Solar Federation General")
restricted_jobs = list("Cyborg")
secondary_restricted_jobs = list("AI")
required_players = 10
+1 -1
View File
@@ -9,7 +9,7 @@
name = "vampire"
config_tag = "vampire"
restricted_jobs = list("AI", "Cyborg")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Chaplain", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation Brigadier General")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Chaplain", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation General")
protected_species = list("Machine")
required_players = 15
required_enemies = 1
+2 -2
View File
@@ -100,7 +100,7 @@
return get_all_centcom_access() + get_all_accesses()
if("Special Operations Officer")
return get_all_centcom_access() + get_all_accesses()
if("Solar Federation Brigadier General")
if("Solar Federation General")
return get_all_centcom_access() + get_all_accesses()
if("Nanotrasen Navy Representative")
return get_all_centcom_access() + get_all_accesses()
@@ -403,7 +403,7 @@
return list("VIP Guest","Custodian","Thunderdome Overseer","Emergency Response Team Member","Emergency Response Team Leader","Intel Officer","Medical Officer","Death Commando","Research Officer","Deathsquad Officer","Special Operations Officer","Nanotrasen Navy Representative","Nanotrasen Navy Officer","Nanotrasen Navy Captain","Supreme Commander")
/proc/get_all_solgov_jobs()
return list("Solar Federation Lieutenant","Solar Federation Specops Lieutenant","Solar Federation Marine","Solar Federation Specops Marine","Solar Federation Representative","Sol Trader","Solar Federation Brigadier General")
return list("Solar Federation Lieutenant","Solar Federation Specops Lieutenant","Solar Federation Marine","Solar Federation Specops Marine","Solar Federation Representative","Sol Trader","Solar Federation General")
//gets the actual job rank (ignoring alt titles)
//this is used solely for sechuds
+2 -2
View File
@@ -106,11 +106,11 @@
H.mind.offstation_role = TRUE
/datum/job/ntspecops/solgovspecops
title = "Solar Federation Brigadier General"
title = "Solar Federation General"
outfit = /datum/outfit/job/ntspecops/solgovspecops
/datum/outfit/job/ntspecops/solgovspecops
name = "Solar Federation Brigadier General"
name = "Solar Federation General"
uniform = /obj/item/clothing/under/rank/centcom/captain/solgov
suit = /obj/item/clothing/suit/space/deathsquad/officer/solgov
head = /obj/item/clothing/head/helmet/space/deathsquad/beret/solgov
+15
View File
@@ -66,6 +66,21 @@
component_parts += new /obj/item/stack/sheet/glass(null)
RefreshParts()
/obj/machinery/autolathe/upgraded/gamma/New()
. = ..()
component_parts = list()
component_parts += new /obj/item/circuitboard/autolathe(null)
component_parts += new /obj/item/stock_parts/matter_bin/super(null)
component_parts += new /obj/item/stock_parts/matter_bin/super(null)
component_parts += new /obj/item/stock_parts/matter_bin/super(null)
component_parts += new /obj/item/stock_parts/manipulator/pico(null)
component_parts += new /obj/item/stack/sheet/glass(null)
RefreshParts()
/obj/machinery/autolathe/upgraded/gamma/Initialize()
. = ..()
adjust_hacked(TRUE)
/obj/machinery/autolathe/Destroy()
SStgui.close_uis(wires)
QDEL_NULL(wires)
+16 -11
View File
@@ -253,7 +253,10 @@
/obj/item/key,
/obj/item/door_remote,
/obj/item/autopsy_scanner,
/obj/item/holosign_creator/atmos
/obj/item/holosign_creator/atmos,
/obj/item/clothing/gloves/color/black/forensics,
/obj/item/rcd,
/obj/item/rpd
)
// These items will NOT be preserved
var/list/do_not_preserve_items = list (
@@ -341,21 +344,23 @@
return CRYO_PRESERVE
return CRYO_DESTROY
// This function can not be undone; do not call this unless you are sure
// Also make sure there is a valid control computer
/obj/machinery/cryopod/proc/handle_contents(obj/item/I)
if(length(I.contents)) //Make sure we catch anything not handled by qdel() on the items.
if(should_preserve_item(I) != CRYO_DESTROY) // Don't remove the contents of things that need preservation
return
for(var/obj/item/O in I.contents)
if(istype(O, /obj/item/tank)) //Stop eating pockets, you fuck!
continue
handle_contents(O)
O.forceMove(src)
/obj/machinery/cryopod/proc/despawn_occupant()
//Drop all items into the pod.
for(var/obj/item/I in occupant)
occupant.unEquip(I)
I.forceMove(src)
if(I.contents.len) //Make sure we catch anything not handled by qdel() on the items.
if(should_preserve_item(I) != CRYO_DESTROY) // Don't remove the contents of things that need preservation
continue
for(var/obj/item/O in I.contents)
if(istype(O, /obj/item/tank)) //Stop eating pockets, you fuck!
continue
O.forceMove(src)
handle_contents(I)
for(var/obj/machinery/computer/cloning/cloner in GLOB.machines)
for(var/datum/dna2/record/R in cloner.records)
+9
View File
@@ -110,6 +110,15 @@
/obj/machinery/suit_storage_unit/security/hos/secure
secure = TRUE
/obj/machinery/suit_storage_unit/gamma
name = "gamma shielded suit storage unit"
suit_type = /obj/item/clothing/suit/space/hardsuit/shielded/gamma
mask_type = /obj/item/clothing/mask/gas/sechailer/swat
req_access = list(ACCESS_SECURITY)
/obj/machinery/suit_storage_unit/gamma/secure
secure = TRUE
/obj/machinery/suit_storage_unit/atmos
name = "atmospherics suit storage unit"
suit_type = /obj/item/clothing/suit/space/hardsuit/engine/atmos
+2 -2
View File
@@ -51,7 +51,7 @@
"Emergency Response Team Officer" = "dsquadradio",
"Nanotrasen Navy Officer" = "dsquadradio",
"Special Operations Officer" = "dsquadradio",
"Solar Federation Brigadier General" = "dsquadradio",
"Solar Federation General" = "dsquadradio",
"Solar Federation Specops Lieutenant" = "dsquadradio",
"Solar Federation Specops Marine" = "dsquadradio",
"Solar Federation Lieutenant" = "dsquadradio",
@@ -124,7 +124,7 @@
/// List of ERT jobs
var/list/ert_jobs = list("Emergency Response Team Officer", "Emergency Response Team Engineer", "Emergency Response Team Medic", "Emergency Response Team Leader", "Emergency Response Team Member")
/// List of CentComm jobs
var/list/cc_jobs = list("Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation Brigadier General")
var/list/cc_jobs = list("Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation General")
/// List of SolGov Marine jobs
var/list/tsf_jobs = list("Solar Federation Specops Lieutenant", "Solar Federation Specops Marine", "Solar Federation Lieutenant", "Solar Federation Marine")
// Defined so code compiles and incase someone has a non-standard job
+23
View File
@@ -44,6 +44,29 @@
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
ME.attach(src)
/obj/mecha/combat/marauder/ares
name = "Ares"
desc = "Heavy-duty, combat exosuit, adapted from rejected early versions of the Marauder to serve as a biohazard containment exosuit. This model, albeit rare, can be found among civilian populations."
icon_state = "ares"
initial_icon = "ares"
operation_req_access = list(ACCESS_SECURITY)
max_integrity = 450
armor = list(melee = 50, bullet = 40, laser = 20, energy = 20, bomb = 20, bio = 100, rad = 60, fire = 100, acid = 100)
max_temperature = 40000
wreckage = /obj/structure/mecha_wreckage/ares
max_equip = 4
/obj/mecha/combat/marauder/ares/loaded/New()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/xray(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster(src)
ME.attach(src)
/obj/mecha/combat/marauder/seraph
desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel."
name = "Seraph"
+5
View File
@@ -128,6 +128,11 @@
name = "\improper Marauder wreckage"
icon_state = "marauder-broken"
/obj/structure/mecha_wreckage/ares
name = "\improper Ares wreckage"
icon_state = "ares-broken"
desc = "The truth is you lost an expensive piece of Nanotrasen-issue equipment. That suit is going to come out of your pay, and you will remain in this corporation until you are five hundred and ten years old, which is the number of years it will take for you to pay for an Ares Biohazard Containment Exosuit you have lost!"
/obj/structure/mecha_wreckage/mauler
name = "\improper Mauler wreckage"
icon_state = "mauler-broken"
+3 -1
View File
@@ -83,7 +83,9 @@
if(!mapload)
log_world("### MAP WARNING, [src] spawned outside of mapload!")
return
var/obj/machinery/door/door = locate(/obj/machinery/door) in loc
var/obj/machinery/door/door = locate(/obj/machinery/door/airlock) in loc
if(!door)
door = locate(/obj/machinery/door/window) in loc
if(door)
door.unres_sides ^= dir
else
@@ -43,14 +43,14 @@
/obj/effect/temp_visual/ratvar/window
icon_state = "ratvarwindowglow"
layer = ABOVE_OBJ_LAYER
layer = ABOVE_WINDOW_LAYER
/obj/effect/temp_visual/ratvar/window/single
icon_state = "ratvarwindowglow_s"
/obj/effect/temp_visual/ratvar/gear
icon_state = "ratvargearglow"
layer = BELOW_OBJ_LAYER
layer = ABOVE_OBJ_LAYER
/obj/effect/temp_visual/ratvar/grille
icon_state = "ratvargrilleglow"
+5 -9
View File
@@ -702,21 +702,17 @@
reinf = FALSE
var/made_glow = FALSE
/obj/structure/window/reinforced/clockwork/Initialize(mapload, direct)
. = ..()
if(fulltile)
made_glow = TRUE
if(fulltile)
new /obj/effect/temp_visual/ratvar/window(get_turf(src))
/obj/structure/window/reinforced/clockwork/spawnDebris(location)
. = list()
. += new /obj/item/stack/tile/brass(location, (fulltile ? 2 : 1))
/obj/structure/window/reinforced/clockwork/setDir(direct)
if(!made_glow)
var/obj/effect/E = new /obj/effect/temp_visual/ratvar/window/single(get_turf(src))
E.setDir(direct)
if(fulltile)
new /obj/effect/temp_visual/ratvar/window(get_turf(src))
else
var/obj/effect/E = new /obj/effect/temp_visual/ratvar/window/single(get_turf(src))
E.setDir(direct)
made_glow = TRUE
..()
+1 -22
View File
@@ -52,9 +52,8 @@
hardness = 10
slicing_duration = 80
sheet_type = /obj/item/stack/tile/brass
sheet_amount = 1
sheet_amount = 2
girder_type = /obj/structure/clockwork/wall_gear
baseturf = /turf/simulated/floor/clockwork/reebe
var/heated
var/obj/effect/clockwork/overlay/wall/realappearance
@@ -77,25 +76,6 @@
animate(src, color = previouscolor, time = 8)
addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 8)
/turf/simulated/wall/clockwork/dismantle_wall(devastated=0, explode=0)
if(devastated)
devastate_wall()
ChangeTurf(baseturf)
else
playsound(src, 'sound/items/welder.ogg', 100, 1)
var/newgirder = break_wall()
if(newgirder) //maybe we want a gear!
transfer_fingerprints_to(newgirder)
ChangeTurf(baseturf)
for(var/obj/O in src) //Eject contents!
if(istype(O, /obj/structure/sign/poster))
var/obj/structure/sign/poster/P = O
P.roll_and_drop(src)
else
O.forceMove(src)
return TRUE
/turf/simulated/wall/clockwork/devastate_wall()
for(var/i in 1 to 2)
new/obj/item/clockwork/alloy_shards/large(src)
@@ -116,4 +96,3 @@
if(heated)
to_chat(M.occupant, "<span class='userdanger'>The wall's intense heat completely reflects your [M.name]'s attack!</span>")
M.take_damage(20, BURN)
@@ -93,7 +93,7 @@
for(var/A in loc)
var/atom/item = A
if(item && item != src) // It's possible that the item is deleted in temperature_expose
if(!QDELETED(item) && item != src) // It's possible that the item is deleted in temperature_expose
item.fire_act(null, temperature, volume)
color = heat2color(temperature)
@@ -250,7 +250,7 @@
var/turf/T = open[1]
var/dist = open[T]
open -= T
closed += T
closed[T] = TRUE
if(isspaceturf(T))
continue
@@ -305,9 +305,7 @@
if(T.density)
continue
for(var/obj/O in T)
if(O.density)
continue
if(dist == max_dist)
continue
@@ -315,10 +313,11 @@
var/turf/link = get_step(T, dir)
if (!link)
continue
var/dx = link.x - Ce.x
var/dy = link.y - Ce.y
var/target_dist = max((dist + 1 + sqrt(dx * dx + dy * dy)) / 2, dist)
if(!(link in closed))
// Check if it wasn't already visited and if you can get to that turf
if(!closed[link] && T.CanAtmosPass(link))
var/dx = link.x - Ce.x
var/dy = link.y - Ce.y
var/target_dist = max((dist + 1 + sqrt(dx * dx + dy * dy)) / 2, dist)
if(link in open)
if(open[link] > target_dist)
open[link] = target_dist
@@ -1,12 +1,11 @@
/obj/machinery/atmospherics/unary/heat_exchanger
icon = 'icons/obj/atmospherics/heat_exchanger.dmi'
icon_state = "intact"
density = 1
name = "heat exchanger"
desc = "Exchanges heat between two input gases. Setup for fast heat transfer"
can_unwrench = 1
can_unwrench = TRUE
var/obj/machinery/atmospherics/unary/heat_exchanger/partner = null
var/update_cycle
@@ -66,30 +66,10 @@
if(MODE_RAD)
show_rads()
/obj/item/clothing/glasses/meson/engine/proc/show_rads()
var/mob/living/carbon/human/user = loc
var/list/rad_places = list()
for(var/datum/component/radioactive/thing in SSradiation.processing)
var/atom/owner = thing.parent
var/turf/place = get_turf(owner)
if(rad_places[place])
rad_places[place] += thing.strength
else
rad_places[place] = thing.strength
for(var/i in rad_places)
var/turf/place = i
if(get_dist(user, place) >= range * 5) //Rads are easier to see than wires under the floor
continue
var/strength = round(rad_places[i] / 1000, 0.1)
var/image/pic = image(loc = place)
var/mutable_appearance/MA = new()
MA.maptext = MAPTEXT("[strength]k")
MA.color = "#04e604"
MA.layer = RAD_TEXT_LAYER
MA.plane = GAME_PLANE
pic.appearance = MA
flick_overlay(pic, list(user.client), 10)
user.show_rads(range * 5) // Rads are easier to see than wires under the floor
/obj/item/clothing/glasses/meson/engine/update_icon()
icon_state = "trayson-[mode]"
@@ -711,3 +711,24 @@
item_state = "syndie_helm"
item_color = "syndi"
armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100)
//////Security Version (Gamma armory only)
/obj/item/clothing/suit/space/hardsuit/shielded/gamma
name = "shielded security hardsuit"
desc = "A more advanced version of the normal security hardsuit. Comes with built in energy shielding."
icon_state = "hardsuit-sec"
item_state = "sec-hardsuit"
armor = list("melee" = 35, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75)
allowed = list(/obj/item/gun,/obj/item/flashlight,/obj/item/tank,/obj/item/melee/baton,/obj/item/reagent_containers/spray/pepper,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/restraints/handcuffs)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/gamma
/obj/item/clothing/head/helmet/space/hardsuit/shielded/gamma
name = "shielded security hardsuit helmet"
desc = "A more advanced version of the normal security hardsuit helmet. Comes with built in energy shielding."
icon_state = "hardsuit0-sec"
item_state = "sec_helm"
item_color = "sec"
armor = list("melee" = 35, "bullet" = 15, "laser" = 30,"energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75)
@@ -10,7 +10,9 @@
w_class = WEIGHT_CLASS_NORMAL // so it doesn't fit in pockets
/obj/item/clothing/accessory/holster/Destroy()
QDEL_NULL(holstered)
if(holstered?.loc == src) // Gun still in the holster
holstered.forceMove(loc)
holstered = null
return ..()
//subtypes can override this to specify what can be holstered
+8 -1
View File
@@ -289,8 +289,15 @@
/obj/item/CQC_manual/attack_self(mob/living/carbon/human/user)
if(!istype(user) || !user)
return
to_chat(user, "<span class='boldannounce'>You remember the basics of CQC.</span>")
if(user.mind) //Prevents changelings and vampires from being able to learn it
if(user.mind.changeling) //Changelings
to_chat(user, "<span class='warning'>We try multiple times, but we simply cannot grasp the basics of CQC!</span>")
return
else if(user.mind.vampire) //Vampires
to_chat(user, "<span class='warning'>Your blood lust distracts you from the basics of CQC!</span>")
return
to_chat(user, "<span class='boldannounce'>You remember the basics of CQC.</span>")
var/datum/martial_art/cqc/CQC = new(null)
CQC.teach(user)
user.drop_item()
@@ -26,6 +26,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
var/image/ghostimage = null //this mobs ghost image, for deleting and stuff
var/ghostvision = TRUE //is the ghost able to see things humans can't?
var/seedarkness = TRUE
var/seerads = FALSE // can the ghost see radiation?
/// Defines from __DEFINES/hud.dm go here based on which huds the ghost has activated.
var/list/data_hud_seen = list()
var/ghost_orbit = GHOST_ORBIT_CIRCLE
@@ -98,6 +99,8 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
if(orbit_menu)
SStgui.close_uis(orbit_menu)
QDEL_NULL(orbit_menu)
if (seerads)
STOP_PROCESSING(SSobj, src)
return ..()
/mob/dead/observer/examine(mob/user)
@@ -105,6 +108,10 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
if(!invisibility)
. += "It seems extremely obvious."
/mob/dead/observer/process()
if(seerads)
show_rads(5)
// This seems stupid, but it's the easiest way to avoid absolutely ridiculous shit from happening
// Copying an appearance directly from a mob includes it's verb list, it's invisibility, it's alpha, and it's density
// You might recognize these things as "fucking ridiculous to put in an appearance"
@@ -341,6 +348,14 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
for(var/datum/atom_hud/antag/H in GLOB.huds)
H.add_hud_to(src)
/mob/dead/observer/proc/set_radiation_view(enabled)
if (enabled)
seerads = TRUE
START_PROCESSING(SSobj, src)
else
seerads = FALSE
STOP_PROCESSING(SSobj, src)
/mob/dead/observer/verb/set_dnr()
set name = "Set DNR"
set category = "Ghost"
@@ -732,6 +747,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(mind)
mind.active = TRUE
mind.transfer_to(new_char)
if(mind.vampire)
mind.vampire.owner = new_char
mind.vampire.powers.Cut()
mind.vampire.check_vampire_upgrade(FALSE)
else
new_char.key = key
+21
View File
@@ -1459,6 +1459,27 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
/mob/proc/update_runechat_msg_location()
return
/**
* Show an overlay of radiation levels on radioactive objects.
*/
/mob/proc/show_rads(range)
for(var/turf/place in range(range, src))
var/rads = SSradiation.get_turf_radiation(place)
if (rads < RAD_BACKGROUND_RADIATION)
continue
var/strength = round(rads / 1000, 0.1)
var/image/pic = image(loc = place)
var/mutable_appearance/MA = new()
MA.maptext = MAPTEXT("[strength]k")
MA.color = "#04e604"
MA.layer = RAD_TEXT_LAYER
MA.plane = GAME_PLANE
pic.appearance = MA
flick_overlay(pic, list(client), 10)
GLOBAL_LIST_INIT(holy_areas, typecacheof(list(
/area/chapel
)))
@@ -79,7 +79,7 @@
//Saber SMG//
/obj/item/gun/projectile/automatic/proto
name = "\improper Nanotrasen Saber SMG"
desc = "A prototype three-round burst 9mm submachine gun, designated 'SABR'. Has a threaded barrel for suppressors."
desc = "A rejected prototype three-round burst 9mm submachine gun, designated 'SABR'. Surplus of this model are bouncing around armories of Nanotrasen Space Stations. Has a threaded barrel for suppressors."
icon_state = "saber"
mag_type = /obj/item/ammo_box/magazine/smgm9mm
origin_tech = "combat=4;materials=2"
@@ -133,7 +133,6 @@
color = "#A8A8A8" // rgb: 168, 168, 168
taste_description = "a CPU"
/datum/reagent/copper
name = "Copper"
id = "copper"
@@ -141,6 +140,13 @@
color = "#6E3B08" // rgb: 110, 59, 8
taste_description = "copper"
/datum/reagent/copper/reaction_obj(obj/O, volume)
if(istype(O, /obj/item/stack/sheet/metal))
var/obj/item/stack/sheet/metal/M = O
volume = round(min(volume, M.amount), 1)
new /obj/item/stack/tile/brass(get_turf(M), volume)
M.use(volume)
/datum/reagent/chromium
name = "Chromium"
id = "chromium"
@@ -204,14 +210,17 @@
if(exposed_temperature > T0C + 600)
var/turf/T = get_turf(holder.my_atom)
holder.my_atom.visible_message("<b>The oil burns!</b>")
fireflash(T, min(max(0, volume / 40), 8))
var/datum/reagents/old_holder = holder
fire_flash_log(holder, id)
if(holder)
holder.del_reagent(id) // Remove first. Else fireflash triggers a reaction again
fireflash(T, min(max(0, volume / 40), 8))
var/datum/effect_system/smoke_spread/bad/BS = new
BS.set_up(1, 0, T)
BS.start()
if(holder)
holder.add_reagent("ash", round(volume * 0.5))
holder.del_reagent(id)
if(!QDELETED(old_holder))
old_holder.add_reagent("ash", round(volume * 0.5))
/datum/reagent/oil/reaction_turf(turf/T, volume)
if(volume >= 3 && !isspaceturf(T) && !locate(/obj/effect/decal/cleanable/blood/oil) in T)
@@ -15,8 +15,8 @@
if(holder.chem_temp <= T0C - 50)
return
var/radius = min(max(0, volume / size_divisor), 8)
fireflash_sm(T, radius, rand(temp_fire - temp_deviance, temp_fire + temp_deviance), 500)
fire_flash_log(holder, id)
fireflash_sm(T, radius, rand(temp_fire - temp_deviance, temp_fire + temp_deviance), 500)
/datum/reagent/phlogiston/reaction_mob(mob/living/M, method = REAGENT_TOUCH, volume)
if(holder.chem_temp <= T0C - 50)
@@ -56,10 +56,11 @@
/datum/reagent/napalm/reaction_temperature(exposed_temperature, exposed_volume)
if(exposed_temperature > T0C + 100)
var/radius = min(max(0, volume * 0.15), 8)
fireflash_sm(get_turf(holder.my_atom), radius, rand(3000, 6000), 500)
var/turf/T = get_turf(holder.my_atom)
fire_flash_log(holder, id)
if(holder)
holder.del_reagent(id)
fireflash_sm(T, radius, rand(3000, 6000), 500)
/datum/reagent/napalm/reaction_turf(turf/T, volume)
if(isspaceturf(T))
@@ -112,19 +113,24 @@
if(holder)
holder.del_reagent(id)
return
var/will_explode = volume >= explosion_threshold
if(will_explode && holder.my_atom)
// Log beforehand
holder.my_atom.visible_message("<span class='danger'>[holder.my_atom] explodes!</span>")
message_admins("Fuel explosion ([holder.my_atom], reagent type: [id]) at [COORD(holder.my_atom.loc)]. Last touched by: [holder.my_atom.fingerprintslast ? "[holder.my_atom.fingerprintslast]" : "*null*"].")
log_game("Fuel explosion ([holder.my_atom], reagent type: [id]) at [COORD(holder.my_atom.loc)]. Last touched by: [holder.my_atom.fingerprintslast ? "[holder.my_atom.fingerprintslast]" : "*null*"].")
holder.my_atom.investigate_log("A fuel explosion, last touched by [holder.my_atom.fingerprintslast ? "[holder.my_atom.fingerprintslast]" : "*null*"], triggered at [COORD(holder.my_atom.loc)].", INVESTIGATE_BOMB)
var/turf/T = get_turf(holder.my_atom)
if(holder) // Delete the fuel from the holder before we trigger the fireball
holder.del_reagent(id)
var/radius = min(max(min_radius, volume * volume_radius_multiplier + volume_radius_modifier), max_radius)
fireflash_sm(T, radius, 2200 + radius * 250, radius * 50)
if(holder && volume >= explosion_threshold)
if(holder.my_atom)
holder.my_atom.visible_message("<span class='danger'>[holder.my_atom] explodes!</span>")
message_admins("Fuel explosion ([holder.my_atom], reagent type: [id]) at [COORD(holder.my_atom.loc)]. Last touched by: [holder.my_atom.fingerprintslast ? "[holder.my_atom.fingerprintslast]" : "*null*"].")
log_game("Fuel explosion ([holder.my_atom], reagent type: [id]) at [COORD(holder.my_atom.loc)]. Last touched by: [holder.my_atom.fingerprintslast ? "[holder.my_atom.fingerprintslast]" : "*null*"].")
holder.my_atom.investigate_log("A fuel explosion, last touched by [holder.my_atom.fingerprintslast ? "[holder.my_atom.fingerprintslast]" : "*null*"], triggered at [COORD(holder.my_atom.loc)].", INVESTIGATE_BOMB)
if(will_explode)
var/boomrange = min(max(min_explosion_radius, round(volume * volume_explosion_radius_multiplier + volume_explosion_radius_modifier)), max_explosion_radius)
explosion(T, -1, -1, boomrange, 1)
if(holder)
holder.del_reagent(id)
/datum/reagent/fuel/reaction_turf(turf/T, volume) //Don't spill the fuel, or you'll regret it
if(isspaceturf(T))
@@ -149,10 +155,11 @@
/datum/reagent/plasma/reaction_temperature(exposed_temperature, exposed_volume)
if(exposed_temperature >= T0C + 100)
fireflash(get_turf(holder.my_atom), min(max(0, volume / 10), 8))
var/turf/T = get_turf(holder.my_atom)
fire_flash_log(holder, id)
if(holder)
holder.del_reagent(id)
holder.del_reagent(id) // Remove first. Else fireflash triggers a reaction again
fireflash(T, min(max(0, volume / 10), 8))
/datum/reagent/plasma/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -241,8 +248,8 @@
if(volume < 3)
return
var/radius = min((volume - 3) * 0.15, 3)
fireflash_sm(T, radius, 4500 + volume * 500, 350)
fire_flash_log(holder, id)
fireflash_sm(T, radius, 4500 + volume * 500, 350)
/datum/reagent/clf3/reaction_mob(mob/living/M, method = REAGENT_TOUCH, volume)
if(method == REAGENT_TOUCH || method == REAGENT_INGEST)
@@ -439,10 +446,11 @@
/datum/reagent/plasma_dust/reaction_temperature(exposed_temperature, exposed_volume)
if(exposed_temperature >= T0C + 100)
fireflash(get_turf(holder.my_atom), min(max(0, volume / 10), 8))
var/turf/T = get_turf(holder.my_atom)
fire_flash_log(holder, id)
if(holder)
holder.del_reagent(id)
holder.del_reagent(id) // Remove first. Else fireflash triggers a reaction again
fireflash(T, min(max(0, volume / 10), 8))
/datum/reagent/plasma_dust/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
+10 -2
View File
@@ -16,6 +16,8 @@
var/lastrigger = ""
/// Can this tank be unwrenched
var/can_be_unwrenched = TRUE
/// If the dispenser is being blown up already. Used to avoid multiple boom calls due to itself exploding etc
var/went_boom = FALSE
/obj/structure/reagent_dispensers/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
. = ..()
@@ -53,7 +55,13 @@
if(reagents)
reagents.temperature_reagents(exposed_temperature)
/obj/structure/reagent_dispensers/proc/boom()
/obj/structure/reagent_dispensers/proc/boom(rigtrigger = FALSE, log_attack = FALSE)
if(went_boom)
return
went_boom = TRUE
do_boom(rigtrigger, log_attack)
/obj/structure/reagent_dispensers/proc/do_boom(rigtrigger = FALSE, log_attack = FALSE)
visible_message("<span class='danger'>[src] ruptures!</span>")
chem_splash(loc, 5, list(reagents))
qdel(src)
@@ -107,7 +115,7 @@
investigate_log("[key_name(P.firer)] triggered a fueltank explosion with [P.name] at [COORD(loc)]", INVESTIGATE_BOMB)
boom()
/obj/structure/reagent_dispensers/fueltank/boom(rigtrigger = FALSE, log_attack = FALSE) // Prevent case where someone who rigged the tank is blamed for the explosion when the rig isn't what triggered the explosion
/obj/structure/reagent_dispensers/fueltank/do_boom(rigtrigger = FALSE, log_attack = FALSE) // Prevent case where someone who rigged the tank is blamed for the explosion when the rig isn't what triggered the explosion
if(rigtrigger) // If the explosion is triggered by an assembly holder
log_game("A fueltank, last rigged by [lastrigger], triggered at [COORD(loc)]")
add_attack_logs(lastrigger, src, "rigged fuel tank exploded", ATKLOG_FEW)
+9 -1
View File
@@ -19,7 +19,7 @@ GLOBAL_DATUM_INIT(ghost_hud_panel, /datum/ui_module/ghost_hud_panel, new)
/datum/ui_module/ghost_hud_panel/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.observer_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui)
if(!ui)
ui = new(user, src, ui_key, "GhostHudPanel", name, 250, 171, master_ui, state)
ui = new(user, src, ui_key, "GhostHudPanel", name, 250, 207, master_ui, state)
ui.set_autoupdate(FALSE)
ui.open()
@@ -28,6 +28,8 @@ GLOBAL_DATUM_INIT(ghost_hud_panel, /datum/ui_module/ghost_hud_panel, new)
for(var/hud in hud_type_lookup)
data[hud] = (hud_type_lookup[hud] in ghost.data_hud_seen)
data["ahud"] = ghost.antagHUD
// Split radioactivity out as it isn't a true datahud
data["radioactivity"] = ghost.seerads
return data
/datum/ui_module/ghost_hud_panel/ui_act(action, list/params)
@@ -46,6 +48,12 @@ GLOBAL_DATUM_INIT(ghost_hud_panel, /datum/ui_module/ghost_hud_panel, new)
var/hud_type = hud_type_lookup[params["hud_type"]]
ghost.remove_the_hud(hud_type)
if("rads_on")
ghost.set_radiation_view(TRUE)
if("rads_off")
ghost.set_radiation_view(FALSE)
if("ahud_on")
if(!GLOB.configuration.general.allow_antag_hud && !ghost.client.holder)
to_chat(ghost, "<span class='warning'>Admins have disabled this for this round.</span>")
Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 175 KiB

After

Width:  |  Height:  |  Size: 181 KiB

@@ -8,6 +8,7 @@ export const GhostHudPanel = (props, context) => {
security,
medical,
diagnostic,
radioactivity,
ahud,
} = data;
return (
@@ -18,6 +19,8 @@ export const GhostHudPanel = (props, context) => {
<HudEntry label="Security" type="security" is_active={security} />
<HudEntry label="Diagnostic" type="diagnostic" is_active={diagnostic} />
<Divider />
<HudEntry label="Radioactivity" type="radioactivity" is_active={radioactivity} act_on={"rads_on"} act_off={"rads_off"} />
<Divider />
<HudEntry label="Antag HUD" is_active={ahud} act_on={"ahud_on"} act_off={"ahud_off"} />
</Section>
</Window.Content>
File diff suppressed because one or more lines are too long