Merge remote-tracking branch 'upstream/master'

This commit is contained in:
BongaTheProto
2022-08-20 17:16:19 -05:00
68 changed files with 549 additions and 304 deletions

View File

@@ -44,6 +44,9 @@
/// from SSsun when the sun changes position : (primary_sun, suns)
#define COMSIG_SUN_MOVED "sun_moved"
///from SSsecurity_level when the security level changes : (new_level)
#define COMSIG_SECURITY_LEVEL_CHANGED "security_level_changed"
/// from SSactivity for things that add threat but aren't "global" (e.g. phylacteries)
#define COMSIG_THREAT_CALC "threat_calculation"

View File

@@ -111,6 +111,7 @@
#define INIT_ORDER_SOUNDS 83
#define INIT_ORDER_INSTRUMENTS 82
#define INIT_ORDER_VIS 80
#define INIT_ORDER_SECURITY_LEVEL 79 // We need to load before events so that it has a security level to choose from.
#define INIT_ORDER_ACHIEVEMENTS 77
#define INIT_ORDER_RESEARCH 75
#define INIT_ORDER_STATION 74 //This is high priority because it manipulates a lot of the subsystems that will initialize after it.

View File

@@ -157,10 +157,7 @@
#undef RGB_FORMAT_SHORT
#undef RGB_FORMAT_LONG
/// Makes sure the input color is text with a # at the start followed by 6 hexadecimal characters. Examples: "#ff1234", "#A38321", COLOR_GREEN_GRAY
/proc/sanitize_ooccolor(color)
if(length(color) != length_char(color))
CRASH("Invalid characters in color '[color]'")
var/list/HSL = rgb2hsl(hex2num(copytext(color, 2, 4)), hex2num(copytext(color, 4, 6)), hex2num(copytext(color, 6, 8)))
HSL[3] = min(HSL[3],0.4)
var/list/RGB = hsl2rgb(arglist(HSL))
return "#[num2hex(RGB[1],2)][num2hex(RGB[2],2)][num2hex(RGB[3],2)]"
var/static/regex/color_regex = regex(@"^#[0-9a-fA-F]{6}$")
return findtext(color, color_regex) ? color : GLOB.normal_ooc_colour

View File

@@ -0,0 +1,114 @@
// NOT THE SAME AS TG! THIS IS BAREMETAL JUST TO MAKE COMSIGS WORK!
SUBSYSTEM_DEF(security_level)
name = "Security Level"
can_fire = FALSE // We will control when we fire in this subsystem
init_order = INIT_ORDER_SECURITY_LEVEL
/**
* Sets a new security level as our current level
*
* This is how everything should change the security level.
*
* Arguments:
* * new_level - The new security level that will become our current level
*/
/datum/controller/subsystem/security_level/proc/set_level(new_level)
if(!isnum(new_level))
new_level = GLOB.all_security_levels.Find()
//Will not be announced if you try to set to the same level as it already is
if(new_level >= SEC_LEVEL_GREEN && new_level <= SEC_LEVEL_DELTA && new_level != GLOB.security_level)
switch(new_level)
if(SEC_LEVEL_GREEN)
minor_announce(CONFIG_GET(string/alert_green), "Attention! Security level lowered to green:")
if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL)
if(GLOB.security_level >= SEC_LEVEL_RED)
SSshuttle.emergency.modTimer(4)
else if(GLOB.security_level == SEC_LEVEL_AMBER)
SSshuttle.emergency.modTimer(2.5)
else
SSshuttle.emergency.modTimer(1.66)
GLOB.security_level = SEC_LEVEL_GREEN
for(var/obj/machinery/firealarm/FA in GLOB.machines)
if(is_station_level(FA.z))
FA.update_icon()
if(SEC_LEVEL_BLUE)
if(GLOB.security_level < SEC_LEVEL_BLUE)
minor_announce(CONFIG_GET(string/alert_blue_upto), "Attention! Security level elevated to blue:",1)
if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL)
SSshuttle.emergency.modTimer(0.6)
else
minor_announce(CONFIG_GET(string/alert_blue_downto), "Attention! Security level lowered to blue:")
if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL)
if(GLOB.security_level >= SEC_LEVEL_RED)
SSshuttle.emergency.modTimer(2.4)
else
SSshuttle.emergency.modTimer(1.5)
GLOB.security_level = SEC_LEVEL_BLUE
sound_to_playing_players('sound/misc/voybluealert.ogg', volume = 50) // Citadel change - Makes alerts play a sound
for(var/obj/machinery/firealarm/FA in GLOB.machines)
if(is_station_level(FA.z))
FA.update_icon()
if(SEC_LEVEL_AMBER)
if(GLOB.security_level < SEC_LEVEL_AMBER)
minor_announce(CONFIG_GET(string/alert_amber_upto), "Attention! Security level elevated to amber:",1)
if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL)
if(GLOB.security_level == SEC_LEVEL_GREEN)
SSshuttle.emergency.modTimer(0.4)
else
SSshuttle.emergency.modTimer(0.66)
else
minor_announce(CONFIG_GET(string/alert_amber_downto), "Attention! Security level lowered to amber:")
if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL)
SSshuttle.emergency.modTimer(1.6)
GLOB.security_level = SEC_LEVEL_AMBER
sound_to_playing_players('sound/effects/alert.ogg', volume = 50) // Citadel change - Makes alerts play a sound
for(var/obj/machinery/firealarm/FA in GLOB.machines)
if(is_station_level(FA.z))
FA.update_icon()
if(SEC_LEVEL_RED)
if(GLOB.security_level < SEC_LEVEL_RED)
minor_announce(CONFIG_GET(string/alert_red_upto), "Attention! Code red!",1)
if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL)
if(GLOB.security_level == SEC_LEVEL_GREEN)
SSshuttle.emergency.modTimer(0.25)
else if(GLOB.security_level == SEC_LEVEL_BLUE)
SSshuttle.emergency.modTimer(0.416)
else
SSshuttle.emergency.modTimer(0.625)
else
minor_announce(CONFIG_GET(string/alert_red_downto), "Attention! Code red!")
GLOB.security_level = SEC_LEVEL_RED
sound_to_playing_players('sound/misc/voyalert.ogg', volume = 50) // Citadel change - Makes alerts play a sound
for(var/obj/machinery/firealarm/FA in GLOB.machines)
if(is_station_level(FA.z))
FA.update_icon()
for(var/obj/machinery/computer/shuttle/pod/pod in GLOB.machines)
pod.admin_controlled = FALSE
if(SEC_LEVEL_DELTA)
minor_announce(CONFIG_GET(string/alert_delta), "Attention! Delta security level reached!",1)
if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL)
if(GLOB.security_level < SEC_LEVEL_BLUE)
SSshuttle.emergency.modTimer(0.25)
else if(GLOB.security_level == SEC_LEVEL_BLUE)
SSshuttle.emergency.modTimer(0.416)
else
SSshuttle.emergency.modTimer(0.625)
GLOB.security_level = SEC_LEVEL_DELTA
sound_to_playing_players('sound/misc/deltakalaxon.ogg') // Citadel change - Makes alerts play a sound
for(var/obj/machinery/firealarm/FA in GLOB.machines)
if(is_station_level(FA.z))
FA.update_icon()
for(var/obj/machinery/computer/shuttle/pod/pod in GLOB.machines)
pod.admin_controlled = FALSE
if(new_level >= SEC_LEVEL_RED)
for(var/obj/machinery/door/D in GLOB.machines)
if(D.red_alert_access)
D.visible_message("<span class='notice'>[D] whirrs as it automatically lifts access requirements!</span>")
playsound(D, 'sound/machines/boltsup.ogg', 50, TRUE)
SEND_SIGNAL(src, COMSIG_SECURITY_LEVEL_CHANGED, new_level)
SSblackbox.record_feedback("tally", "security_level_changes", 1, NUM2SECLEVEL(GLOB.security_level))
SSnightshift.check_nightshift()
else
return

View File

@@ -35,5 +35,8 @@
/datum/skill_modifier/job/level/wiring/basic
level_mod = JOB_SKILL_BASIC
/datum/skill_modifier/job/level/wiring/expert
level_mod = JOB_SKILL_EXPERT
/datum/skill_modifier/job/level/dwarfy/blacksmithing
target_skills = /datum/skill/level/dwarfy/blacksmithing

View File

@@ -11,7 +11,7 @@
/obj/item/encryptionkey/Initialize(mapload)
. = ..()
if(!channels.len)
if(!length(channels) && !translate_binary)
desc = "An encryption key for a radio headset. Has no special codes in it. You should probably tell a coder!"
/obj/item/encryptionkey/examine(mob/user)
@@ -22,6 +22,8 @@
examine_text_list += "[GLOB.channel_tokens[i]] - [lowertext(i)]"
. += "<span class='notice'>It can access the following channels; [jointext(examine_text_list, ", ")].</span>"
if(translate_binary)
. += "<span class='notice'>It also allows access to the special binary channel used by silicons."
/obj/item/encryptionkey/syndicate
name = "syndicate encryption key"

View File

@@ -1,7 +1,7 @@
/obj/item/dnainjector
name = "\improper DNA injector"
desc = "This injects the person with DNA."
icon = 'icons/obj/items_and_weapons.dmi'
icon = 'icons/obj/syringe.dmi'
icon_state = "dnainjector"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'

View File

@@ -1,7 +1,7 @@
/obj/item/implantcase
name = "implant case"
desc = "A glass case containing an implant."
icon = 'icons/obj/items_and_weapons.dmi'
icon = 'icons/obj/syringe.dmi'
icon_state = "implantcase-0"
item_state = "implantcase"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'

View File

@@ -1,7 +1,7 @@
/obj/item/implanter
name = "implanter"
desc = "A sterile automatic implant injector."
icon = 'icons/obj/items_and_weapons.dmi'
icon = 'icons/obj/syringe.dmi'
icon_state = "implanter0"
item_state = "syringe_0"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'

View File

@@ -357,8 +357,69 @@
item_state = "duffel-med"
/obj/item/storage/backpack/duffelbag/med/surgery
name = "surgical duffel bag"
desc = "A large duffel bag for holding extra medical supplies - this one seems to be designed for holding surgical tools."
name = "surgical tools case"
desc = "A large plastic case for holding surgical tools or most other medical supplies you could imagine."
icon_state = "firstaid-surgery"
item_state = "firstaid"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
slot_flags = NONE
/obj/item/storage/backpack/duffelbag/med/surgery/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
var/static/list/can_hold = typecacheof(list(
/obj/item/healthanalyzer,
/obj/item/dnainjector,
/obj/item/reagent_containers/dropper,
/obj/item/reagent_containers/glass/beaker,
/obj/item/reagent_containers/glass/bottle,
/obj/item/reagent_containers/pill,
/obj/item/reagent_containers/syringe,
/obj/item/reagent_containers/medspray,
/obj/item/lighter,
/obj/item/storage/fancy/cigarettes,
/obj/item/storage/pill_bottle,
/obj/item/stack/medical,
/obj/item/flashlight/pen,
/obj/item/extinguisher/mini,
/obj/item/reagent_containers/hypospray,
/obj/item/hypospray/mkii,
/obj/item/sensor_device,
/obj/item/radio,
/obj/item/clothing/gloves/,
/obj/item/lazarus_injector,
/obj/item/bikehorn/rubberducky,
/obj/item/clothing/mask/surgical,
/obj/item/clothing/mask/breath,
/obj/item/clothing/mask/breath/medical,
/obj/item/surgical_drapes,
/obj/item/scalpel,
/obj/item/circular_saw,
/obj/item/bonesetter,
/obj/item/surgicaldrill,
/obj/item/retractor,
/obj/item/cautery,
/obj/item/hemostat,
/obj/item/geiger_counter,
/obj/item/clothing/neck/stethoscope,
/obj/item/stamp,
/obj/item/clothing/glasses,
/obj/item/wrench/medical,
/obj/item/clothing/mask/muzzle,
/obj/item/storage/bag/chemistry,
/obj/item/storage/bag/bio,
/obj/item/reagent_containers/blood,
/obj/item/tank/internals/emergency_oxygen,
/obj/item/gun/syringe/syndicate,
/obj/item/implantcase,
/obj/item/implant,
/obj/item/implanter,
/obj/item/pinpointer/crew,
/obj/item/reagent_containers/chem_pack,
/obj/item/stack/sticky_tape
))
STR.can_hold = can_hold
/obj/item/storage/backpack/duffelbag/med/surgery/PopulateContents()
new /obj/item/scalpel(src)
@@ -368,6 +429,7 @@
new /obj/item/surgicaldrill(src)
new /obj/item/cautery(src)
new /obj/item/bonesetter(src)
new /obj/item/stack/medical/bone_gel(src)
new /obj/item/surgical_drapes(src)
new /obj/item/clothing/mask/surgical(src)
new /obj/item/reagent_containers/medspray/sterilizine(src)

View File

@@ -105,7 +105,7 @@
/obj/item/storage/briefcase/medical
name = "medical briefcase"
icon_state = "medbriefcase"
icon_state = "firstaid-briefcase"
desc = "A white with a blue cross brieface, this is meant to hold medical gear that would not be able to normally fit in a bag."
/obj/item/storage/briefcase/medical/PopulateContents()

View File

@@ -18,12 +18,6 @@
throw_speed = 3
throw_range = 7
var/empty = FALSE
var/list/possible_icons = list("firstaid","firstaid2","firstaid3","firstaid4")
/obj/item/storage/firstaid/Initialize(mapload)
. = ..()
if(LAZYLEN(possible_icons))
icon_state = pick(possible_icons)
/obj/item/storage/firstaid/regular
icon_state = "firstaid"
@@ -45,7 +39,7 @@
new /obj/item/healthanalyzer(src)
/obj/item/storage/firstaid/emergency
icon_state = "medbriefcase"
icon_state = "firstaid-briefcase"
name = "emergency first-aid kit"
desc = "A very simple first aid kit meant to secure and stabilize serious wounds for later treatment."
@@ -75,12 +69,30 @@
new /obj/item/stack/medical/mesh(src)
new /obj/item/stack/medical/mesh(src)
/obj/item/storage/firstaid/brute
name = "trauma treatment kit"
desc = "A first aid kit for when you get toolboxed."
icon_state = "firstaid-brute"
item_state = "firstaid-brute"
/obj/item/storage/firstaid/brute/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] begins beating [user.p_them()]self over the head with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return BRUTELOSS
/obj/item/storage/firstaid/brute/PopulateContents()
if(empty)
return
for(var/i in 1 to 4)
new /obj/item/reagent_containers/pill/patch/styptic(src)
new /obj/item/stack/medical/gauze(src)
new /obj/item/stack/medical/gauze(src)
new /obj/item/healthanalyzer(src)
/obj/item/storage/firstaid/fire
name = "burn treatment kit"
desc = "A specialized medical kit for when the toxins lab <i>-spontaneously-</i> burns down."
icon_state = "burn"
item_state = "firstaid-ointment"
possible_icons = list("burn","burn2","burn3","burn4")
icon_state = "firstaid-burn"
item_state = "firstaid-burn"
/obj/item/storage/firstaid/fire/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] begins rubbing \the [src] against [user.p_them()]self! It looks like [user.p_theyre()] trying to start a fire!</span>")
@@ -99,9 +111,8 @@
/obj/item/storage/firstaid/toxin
name = "toxin treatment kit"
desc = "Used to treat toxic blood content and radiation poisoning."
icon_state = "toxin"
icon_state = "firstaid-toxin"
item_state = "firstaid-toxin"
possible_icons = list("toxin","toxin2","toxin3","toxin4")
/obj/item/storage/firstaid/toxin/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] begins licking the lead paint off \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
@@ -116,38 +127,11 @@
new /obj/item/storage/pill_bottle/charcoal(src)
new /obj/item/healthanalyzer(src)
/obj/item/storage/firstaid/radbgone
name = "radiation treatment kit"
desc = "Used to treat minor toxic blood content and major radiation poisoning."
icon_state = "rad"
item_state = "firstaid-toxin"
possible_icons = list("rad","rad2","rad3")
/obj/item/storage/firstaid/radbgone/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] begins licking the lead paint off \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return TOXLOSS
/obj/item/storage/firstaid/radbgone/PopulateContents()
if(empty)
return
if(prob(50))
new /obj/item/reagent_containers/pill/mutarad(src)
if(prob(80))
new /obj/item/reagent_containers/pill/antirad_plus(src)
new /obj/item/reagent_containers/syringe/charcoal(src)
new /obj/item/storage/pill_bottle/charcoal(src)
new /obj/item/reagent_containers/pill/mutadone(src)
new /obj/item/reagent_containers/pill/antirad(src)
new /obj/item/reagent_containers/food/drinks/bottle/vodka(src)
new /obj/item/healthanalyzer(src)
/obj/item/storage/firstaid/o2
name = "oxygen deprivation treatment kit"
desc = "A box full of oxygen goodies."
icon_state = "oxy"
icon_state = "firstaid-o2"
item_state = "firstaid-o2"
possible_icons = list("oxy", "oxy2", "oxy3", "oxy4")
/obj/item/storage/firstaid/o2/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] begins hitting [user.p_their()] neck with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
@@ -162,31 +146,11 @@
new /obj/item/reagent_containers/hypospray/medipen(src)
new /obj/item/healthanalyzer(src)
/obj/item/storage/firstaid/brute
name = "brute trauma treatment kit"
desc = "A first aid kit for when you get toolboxed."
icon_state = "brute"
item_state = "firstaid-brute"
possible_icons = list("brute", "brute2", "brute3", "brute4")
/obj/item/storage/firstaid/brute/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] begins beating [user.p_them()]self over the head with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return BRUTELOSS
/obj/item/storage/firstaid/brute/PopulateContents()
if(empty)
return
for(var/i in 1 to 4)
new /obj/item/reagent_containers/pill/patch/styptic(src)
new /obj/item/stack/medical/gauze(src)
new /obj/item/stack/medical/gauze(src)
new /obj/item/healthanalyzer(src)
/obj/item/storage/firstaid/tactical
name = "combat medical kit"
name = "tactical first-aid kit"
desc = "I hope you've got insurance."
icon_state = "tactical"
possible_icons = null
icon_state = "firstaid-tactical"
item_state = "firstaid-tactical"
/obj/item/storage/firstaid/tactical/ComponentInitialize()
. = ..()
@@ -208,7 +172,6 @@
new /obj/item/clothing/glasses/hud/health/night/syndicate(src)
/obj/item/storage/firstaid/tactical/nukeop
name = "improved combat medical kit"
/obj/item/storage/firstaid/tactical/nukeop/PopulateContents()
if(empty)
@@ -222,6 +185,30 @@
new /obj/item/reagent_containers/syringe/lethal/choral(src) // what the fuck does anyone use this piece of shit for
new /obj/item/clothing/glasses/hud/health/night/syndicate(src)
/obj/item/storage/firstaid/radbgone
name = "radiation treatment kit"
desc = "Used to treat minor toxic blood content and major radiation poisoning."
icon_state = "firstaid-rad"
item_state = "firstaid-rad"
/obj/item/storage/firstaid/radbgone/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] begins licking the lead paint off \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return TOXLOSS
/obj/item/storage/firstaid/radbgone/PopulateContents()
if(empty)
return
if(prob(50))
new /obj/item/reagent_containers/pill/mutarad(src)
if(prob(80))
new /obj/item/reagent_containers/pill/antirad_plus(src)
new /obj/item/reagent_containers/syringe/charcoal(src)
new /obj/item/storage/pill_bottle/charcoal(src)
new /obj/item/reagent_containers/pill/mutadone(src)
new /obj/item/reagent_containers/pill/antirad(src)
new /obj/item/reagent_containers/food/drinks/bottle/vodka(src)
new /obj/item/healthanalyzer(src)
/*
* Pill Bottles
*/
@@ -479,12 +466,12 @@
name = "hypospray kit"
desc = "It's a kit designed for containing a hypospray and specific treatment chemical-filled vials."
icon_state = "firstaid-mini"
item_state = "firstaid"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
throw_speed = 3
throw_range = 7
var/empty = FALSE
item_state = "firstaid"
custom_price = PRICE_ABOVE_NORMAL
custom_premium_price = PRICE_EXPENSIVE
@@ -497,7 +484,7 @@
/obj/item/reagent_containers/glass/bottle/vial))
/obj/item/storage/hypospraykit/regular
icon_state = "firstaid-mini"
name = "first-aid hypospray kit"
desc = "A hypospray kit with general use vials."
/obj/item/storage/hypospraykit/regular/PopulateContents()
@@ -507,11 +494,24 @@
new /obj/item/reagent_containers/glass/bottle/vial/small/tricord(src)
new /obj/item/reagent_containers/glass/bottle/vial/small/tricord(src)
/obj/item/storage/hypospraykit/brute
name = "trauma hypospray kit"
icon_state = "firstaid-brute-mini"
item_state = "firstaid-brute"
/obj/item/storage/hypospraykit/brute/PopulateContents()
if(empty)
return
new /obj/item/hypospray/mkii/brute(src)
new /obj/item/reagent_containers/glass/bottle/vial/small/bicaridine(src)
new /obj/item/reagent_containers/glass/bottle/vial/small/bicaridine(src)
/obj/item/storage/hypospraykit/fire
name = "burn treatment hypospray kit"
desc = "A specialized hypospray kit for burn treatments. Apply with sass."
icon_state = "burn-mini"
item_state = "firstaid-ointment"
icon_state = "firstaid-burn-mini"
item_state = "firstaid-burn"
/obj/item/storage/hypospraykit/fire/PopulateContents()
if(empty)
@@ -522,7 +522,7 @@
/obj/item/storage/hypospraykit/toxin
name = "toxin treatment hypospray kit"
icon_state = "toxin-mini"
icon_state = "firstaid-toxin-mini"
item_state = "firstaid-toxin"
/obj/item/storage/hypospraykit/toxin/PopulateContents()
@@ -534,7 +534,7 @@
/obj/item/storage/hypospraykit/o2
name = "oxygen deprivation hypospray kit"
icon_state = "oxy-mini"
icon_state = "firstaid-o2-mini"
item_state = "firstaid-o2"
/obj/item/storage/hypospraykit/o2/PopulateContents()
@@ -546,9 +546,39 @@
/obj/item/storage/hypospraykit/enlarge
name = "organomegaly trauma hypospray kit"
icon_state = "enlarge-mini"
icon_state = "firstaid-enlarge-mini"
item_state = "firstaid-brute"
/obj/item/storage/hypospraykit/tactical
name = "tactical first-aid hypospray kit"
desc = "A hypospray kit best suited for combat situations."
icon_state = "firstaid-tactical-mini"
item_state = "firstaid-tactical-mini"
/obj/item/storage/hypospraykit/tactical/PopulateContents()
if(empty)
return
new /obj/item/defibrillator/compact/combat/loaded(src)
new /obj/item/hypospray/mkii/CMO/combat(src)
new /obj/item/reagent_containers/glass/bottle/vial/large/combat(src)
new /obj/item/reagent_containers/glass/bottle/vial/large/combat(src)
/obj/item/storage/hypospraykit/cmo
name = "deluxe hypospray kit"
desc = "A kit containing a Deluxe hypospray and Vials."
icon_state = "firstaid-rad-mini"
item_state = "firstaid-rad"
/obj/item/storage/hypospraykit/cmo/PopulateContents()
if(empty)
return
new /obj/item/hypospray/mkii/CMO(src)
new /obj/item/reagent_containers/glass/bottle/vial/large/tricord(src)
new /obj/item/reagent_containers/glass/bottle/vial/large/charcoal(src)
new /obj/item/reagent_containers/glass/bottle/vial/large/salglu(src)
new /obj/item/reagent_containers/glass/bottle/vial/large/dexalin(src)
new /obj/item/reagent_containers/glass/bottle/vial/large/synthflesh(src)
/obj/item/storage/hypospraykit/enlarge/PopulateContents()
if(empty)
return
@@ -563,46 +593,6 @@
new /obj/item/reagent_containers/glass/bottle/vial/small/buttreduction(src)
new /obj/item/reagent_containers/glass/bottle/vial/small/buttreduction(src)
/obj/item/storage/hypospraykit/brute
name = "brute trauma hypospray kit"
icon_state = "brute-mini"
item_state = "firstaid-brute"
/obj/item/storage/hypospraykit/brute/PopulateContents()
if(empty)
return
new /obj/item/hypospray/mkii/brute(src)
new /obj/item/reagent_containers/glass/bottle/vial/small/bicaridine(src)
new /obj/item/reagent_containers/glass/bottle/vial/small/bicaridine(src)
/obj/item/storage/hypospraykit/tactical
name = "combat hypospray kit"
desc = "A hypospray kit best suited for combat situations."
icon_state = "tactical-mini"
/obj/item/storage/hypospraykit/tactical/PopulateContents()
if(empty)
return
new /obj/item/defibrillator/compact/combat/loaded(src)
new /obj/item/hypospray/mkii/CMO/combat(src)
new /obj/item/reagent_containers/glass/bottle/vial/large/combat(src)
new /obj/item/reagent_containers/glass/bottle/vial/large/combat(src)
/obj/item/storage/hypospraykit/cmo
name = "deluxe hypospray kit"
desc = "A kit containing a Deluxe hypospray and Vials."
icon_state = "tactical-mini"
/obj/item/storage/hypospraykit/cmo/PopulateContents()
if(empty)
return
new /obj/item/hypospray/mkii/CMO(src)
new /obj/item/reagent_containers/glass/bottle/vial/large/tricord(src)
new /obj/item/reagent_containers/glass/bottle/vial/large/charcoal(src)
new /obj/item/reagent_containers/glass/bottle/vial/large/salglu(src)
new /obj/item/reagent_containers/glass/bottle/vial/large/dexalin(src)
new /obj/item/reagent_containers/glass/bottle/vial/large/synthflesh(src)
/obj/item/storage/box/vials
name = "box of hypovials"

View File

@@ -151,17 +151,18 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list(
return
var/turf/open/newTurf = .
newTurf.air.copy_from(stashed_air)
update_air_ref(planetary_atmos ? 1 : 2)
newTurf.update_air_ref(planetary_atmos ? 1 : 2)
QDEL_NULL(stashed_air)
else
flags |= CHANGETURF_RECALC_ADJACENT
if(ispath(path,/turf/closed))
flags |= CHANGETURF_RECALC_ADJACENT
update_air_ref(-1)
. = ..()
var/turf/open/newTurf = .
newTurf.update_air_ref(-1)
else
. = ..()
if(!istype(air,/datum/gas_mixture))
Initalize_Atmos(0)
var/turf/open/newTurf = .
newTurf.Initalize_Atmos(0)
// Take off the top layer turf and replace it with the next baseturf down
/turf/proc/ScrapeAway(amount=1, flags)

View File

@@ -218,11 +218,10 @@
flash_color(L, flash_color = "#C80000", flash_time = 10)
/turf/open/Initalize_Atmos(times_fired)
if(!blocks_air)
if(!istype(air,/datum/gas_mixture/turf))
air = new(2500,src)
air.copy_from_turf(src)
update_air_ref(planetary_atmos ? 1 : 2)
if(!istype(air,/datum/gas_mixture/turf))
air = new(2500,src)
air.copy_from_turf(src)
update_air_ref(planetary_atmos ? 1 : 2)
update_visuals()

View File

@@ -86,7 +86,7 @@
min_requirements[R.get_gas()] = MOLES_GAS_VISIBLE
name = "[R.name] condensation"
id = "[R.type] condensation"
condensing_reagent = R
condensing_reagent = GLOB.chemical_reagents_list[R.type]
exclude = FALSE
/datum/gas_reaction/condensation/react(datum/gas_mixture/air, datum/holder)
@@ -101,7 +101,10 @@
var/G = condensing_reagent.get_gas()
var/amt = air.get_moles(G)
air.adjust_moles(G, -min(initial(condensing_reagent.condensation_amount), amt))
reagents_holder.add_reagent(condensing_reagent, amt)
if(air.get_moles(G) < MOLES_GAS_VISIBLE)
amt += air.get_moles(G)
air.set_moles(G, 0.0)
reagents_holder.add_reagent(condensing_reagent.type, amt)
. = REACTING
for(var/atom/movable/AM in location)
if(location.intact && AM.level == 1)

View File

@@ -85,7 +85,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
. = "Exit gateway unpowered."
/datum/gateway_destination/gateway/get_target_turf()
return get_step(target_gateway, SOUTH)
return get_step(target_gateway.portal,SOUTH)
/datum/gateway_destination/gateway/post_transfer(atom/movable/AM)
. = ..()
@@ -112,7 +112,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
/datum/gateway_destination/gateway/home/proc/check_exile_implant(mob/living/L)
for(var/obj/item/implant/exile/E in L.implants)//Checking that there is an exile implant
to_chat(L, "<span class='userdanger'>The station gate has detected your exile implant and is blocking your entry.</span>")
to_chat(L, span_userdanger("The station gate has detected your exile implant and is blocking your entry."))
return TRUE
return FALSE
@@ -156,8 +156,6 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
bound_y = 0
density = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 100
active_power_usage = 5000
var/calibrated = TRUE
@@ -173,14 +171,22 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
var/obj/effect/gateway_portal_bumper/portal
/// Visual object for handling the viscontents
var/obj/effect/gateway_portal_effect/portal_visuals
/// Overlay of the lights. They light up fully when it charges fully.
var/image/light_overlay
/obj/machinery/gateway/Initialize(mapload)
generate_destination()
update_icon()
update_appearance()
portal_visuals = new
vis_contents += portal_visuals
return ..()
/obj/machinery/gateway/Destroy()
destination.target_gateway = null
GLOB.gateway_destinations -= destination
destination = null
return ..()
/obj/machinery/gateway/proc/generate_destination()
destination = new destination_type
destination.name = destination_name
@@ -194,7 +200,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
QDEL_NULL(portal)
if(use_power == ACTIVE_POWER_USE)
use_power = IDLE_POWER_USE
update_icon()
update_appearance()
portal_visuals.reset_visuals()
/obj/machinery/gateway/process()
@@ -202,6 +208,15 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
if(target)
deactivate()
return
if(light_overlay)
return
for(var/datum/gateway_destination/destination as anything in GLOB.gateway_destinations)
if(!destination.is_available())
continue
light_overlay = image(icon, "portal_light")
light_overlay.alpha = 0
animate(light_overlay, 3 SECONDS, alpha = 255)
add_overlay(light_overlay)
/obj/machinery/gateway/safe_throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = MOVE_FORCE_STRONG, gentle = FALSE)
return
@@ -218,7 +233,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
portal_visuals.setup_visuals(target)
generate_bumper()
use_power = ACTIVE_POWER_USE
update_icon()
update_appearance()
/obj/machinery/gateway/proc/Transfer(atom/movable/AM)
if(!target || !target.incoming_pass_check(AM))
@@ -243,9 +258,9 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
/obj/machinery/gateway/multitool_act(mob/living/user, obj/item/I)
if(calibrated)
to_chat(user, "<span class='alert'>The gate is already calibrated, there is no work for you to do here.</span>")
to_chat(user, span_alert("The gate is already calibrated, there is no work for you to do here."))
else
to_chat(user, "<span class='boldnotice'>Recalibration successful!</span>: \black This gate's systems have been fine tuned. Travel to this gate will now be on target.")
to_chat(user, "[span_boldnotice("Recalibration successful!")]: \black This gate's systems have been fine tuned. Travel to this gate will now be on target.")
calibrated = TRUE
return TRUE
@@ -258,7 +273,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
. = ..()
if(!target)
if(!GLOB.the_gateway)
to_chat(user,"<span class='warning'>Home gateway is not responding!</span>")
to_chat(user,span_warning("Home gateway is not responding!"))
if(GLOB.the_gateway.target)
GLOB.the_gateway.deactivate() //this will turn the home gateway off so that it's free for us to connect to
activate(GLOB.the_gateway.destination)
@@ -276,6 +291,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
try_to_linkup()
/obj/machinery/computer/gateway_control/ui_interact(mob/user, datum/tgui/ui)
. = ..()
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "Gateway", name)
@@ -350,15 +366,11 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
if(!our_destination)
return
add_filter("portal_alpha", 1, list("type" = "alpha", "icon" = icon(alpha_icon, alpha_icon_state), "x" = 32, "y" = 32))
add_filter("portal_blur", 1, list("type" = "blur", "size" = 0.5))
add_filter("portal_ripple", 1, list("type" = "ripple", "size" = 2, "radius" = 1, "falloff" = 1, "y" = 7))
animate(get_filter("portal_ripple"), time = 1.3 SECONDS, loop = -1, easing = LINEAR_EASING, radius = 32)
/// DISABLED DUE TO BYOND BUG CAUSING STACK OVERFLOWS OF ANY HUMAN INSTANTIATION NEAR AN ACTIVATED GATEWAY.
/// Probably due to it referencing each other through the gateway (there's a deep loop, maybe BYOND isn't catching something when it usually would)
//var/turf/center_turf = our_destination.get_target_turf()
//vis_contents += block(locate(center_turf.x - 1, center_turf.y - 1, center_turf.z), locate(center_turf.x + 1, center_turf.y + 1, center_turf.z))
var/turf/center_turf = our_destination.get_target_turf()
vis_contents += block(locate(center_turf.x - 1, center_turf.y - 1, center_turf.z), locate(center_turf.x + 1, center_turf.y + 1, center_turf.z))

View File

@@ -2804,12 +2804,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("ooccolor")
var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference",ooccolor) as color|null
if(new_ooccolor)
ooccolor = new_ooccolor
ooccolor = sanitize_ooccolor(new_ooccolor)
if("aooccolor")
var/new_aooccolor = input(user, "Choose your Antag OOC colour:", "Game Preference",ooccolor) as color|null
if(new_aooccolor)
aooccolor = new_aooccolor
aooccolor = sanitize_ooccolor(new_aooccolor)
if("bag")
var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference") as null|anything in GLOB.backbaglist

View File

@@ -108,16 +108,38 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8")
else
GLOB.dooc_allowed = !GLOB.dooc_allowed
/client/proc/set_ooc(newColor as color)
/client/proc/set_ooc()
set name = "Set Player OOC Color"
set desc = "Modifies player OOC Color"
set category = "Admin.Fun"
GLOB.OOC_COLOR = sanitize_ooccolor(newColor)
if(IsAdminAdvancedProcCall())
return
var/newColor = input(src, "Please select the new player OOC color.", "OOC color") as color|null
if(isnull(newColor))
return
if(!check_rights(R_FUN))
message_admins("[usr.key] has attempted to use the Set Player OOC Color verb!")
log_admin("[key_name(usr)] tried to set player ooc color without authorization.")
return
var/new_color = sanitize_ooccolor(newColor)
message_admins("[key_name_admin(usr)] has set the players' ooc color to [new_color].")
log_admin("[key_name_admin(usr)] has set the player ooc color to [new_color].")
GLOB.OOC_COLOR = new_color
/client/proc/reset_ooc()
set name = "Reset Player OOC Color"
set desc = "Returns player OOC Color to default"
set category = "Admin.Fun"
if(IsAdminAdvancedProcCall())
return
if(alert(usr, "Are you sure you want to reset the OOC color of all players?", "Reset Player OOC Color", "Yes", "No") != "Yes")
return
if(!check_rights(R_FUN))
message_admins("[usr.key] has attempted to use the Reset Player OOC Color verb!")
log_admin("[key_name(usr)] tried to reset player ooc color without authorization.")
return
message_admins("[key_name_admin(usr)] has reset the players' ooc color.")
log_admin("[key_name_admin(usr)] has reset player ooc color.")
GLOB.OOC_COLOR = null
/client/verb/colorooc() //this is admin and people who bought byond.
@@ -129,11 +151,12 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8")
return
var/new_ooccolor = input(src, "Please select your OOC color.", "OOC color", prefs.ooccolor) as color|null
if(new_ooccolor)
prefs.ooccolor = sanitize_ooccolor(new_ooccolor)
prefs.save_preferences()
if(isnull(new_ooccolor))
return
new_ooccolor = sanitize_ooccolor(new_ooccolor)
prefs.ooccolor = new_ooccolor
prefs.save_preferences()
SSblackbox.record_feedback("tally", "admin_verb", 1, "Set OOC Color") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
/client/verb/resetcolorooc()
set name = "Reset Your OOC Color"

View File

@@ -21,7 +21,7 @@
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_ENG
starting_modifiers = list(/datum/skill_modifier/job/level/wiring/basic, /datum/skill_modifier/job/affinity/wiring)
starting_modifiers = list(/datum/skill_modifier/job/level/wiring, /datum/skill_modifier/job/affinity/wiring)
display_order = JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN
threat = 0.5

View File

@@ -31,7 +31,7 @@
paycheck = PAYCHECK_COMMAND
paycheck_department = ACCOUNT_ENG
starting_modifiers = list(/datum/skill_modifier/job/level/wiring, /datum/skill_modifier/job/affinity/wiring)
starting_modifiers = list(/datum/skill_modifier/job/level/wiring/expert, /datum/skill_modifier/job/affinity/wiring)
display_order = JOB_DISPLAY_ORDER_CHIEF_ENGINEER
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/paraplegic, /datum/quirk/insanity)

View File

@@ -34,6 +34,7 @@
paycheck_department = ACCOUNT_SCI
display_order = JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR
starting_modifiers = list(/datum/skill_modifier/job/level/wiring)
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity)
threat = 5

View File

@@ -18,7 +18,7 @@
minimal_access = list(ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_SCI
starting_modifiers = list(/datum/skill_modifier/job/level/wiring/basic)
display_order = JOB_DISPLAY_ORDER_SCIENTIST
threat = 1.2

View File

@@ -29,8 +29,10 @@
var/brightness_on = 7
var/wielded = FALSE // track wielded status on item
/obj/item/kinetic_crusher/cyborg //probably give this a unique sprite later
desc = "An integrated version of the standard kinetic crusher with a grinded down axe head to dissuade mis-use against crewmen. Deals damage equal to the standard crusher against creatures, however."
/obj/item/kinetic_crusher/cyborg
icon_state = "crusher-cyborg"
item_state = "crusher0-cyborg"
desc = "An integrated version of the standard kinetic crusher with a kinetic dampener module installed to limit harmful usage misusage against organics. Deals damage equal to the standard crusher against creatures."
force = 10 //wouldn't want to give a borg a 20 brute melee weapon unemagged now would we
detonation_damage = 60
wielded = 1

View File

@@ -3,7 +3,7 @@
desc = "A scanner that checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations."
name = "manual mining scanner"
icon = 'icons/obj/device.dmi'
icon_state = "mining1"
icon_state = "miningmanual"
item_state = "analyzer"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
@@ -33,7 +33,7 @@
/obj/item/t_scanner/adv_mining_scanner
desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. This one has an extended range."
name = "advanced automatic mining scanner"
icon_state = "mining0"
icon_state = "adv_mining0"
item_state = "analyzer"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
@@ -47,6 +47,7 @@
/obj/item/t_scanner/adv_mining_scanner/lesser
name = "automatic mining scanner"
desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations."
icon_state = "mining0"
range = 4
cooldown = 50

View File

@@ -95,7 +95,7 @@
/obj/item/pickaxe/drill
name = "mining drill"
icon_state = "handdrill"
item_state = "jackhammer"
item_state = "handdrill"
slot_flags = ITEM_SLOT_BELT
toolspeed = 0.6 //available from roundstart, faster than a pickaxe.
usesound = 'sound/weapons/drill.ogg'
@@ -115,12 +115,14 @@
/obj/item/pickaxe/drill/diamonddrill
name = "diamond-tipped mining drill"
icon_state = "diamonddrill"
item_state = "diamonddrill"
toolspeed = 0.4
desc = "Yours is the drill that will pierce the heavens!"
/obj/item/pickaxe/drill/cyborg/diamond //This is the BORG version!
name = "diamond-tipped cyborg mining drill" //To inherit the NODROP_1 flag, and easier to change borg specific drill mechanics.
icon_state = "diamonddrill"
item_state = "diamonddrill"
toolspeed = 0.4
digrange = 2

View File

@@ -770,6 +770,12 @@
total_mass_on = 5
attack_speed = 0
attack_unwieldlyness = CLICK_CD_MELEE * 0.5
/// how much stamina does it cost to roll?
var/roll_stamcost = 15
/// how far are we rolling?
var/roll_range = 3
/// do you spin when dodgerolling
var/roll_orientation = TRUE
/obj/item/melee/transforming/cleaving_saw/examine(mob/user)
. = ..()
@@ -815,6 +821,11 @@
else
B.add_stacks(bleed_stacks_per_hit)
/obj/item/melee/transforming/cleaving_saw/AltClick(mob/user)
. = ..()
roll_orientation = !roll_orientation
to_chat(user, span_notice("You are now [roll_orientation ? "rolling" : "quick-stepping"] when you dodge. (This only affects if you spin or not during a dodge.)"))
/obj/item/melee/transforming/cleaving_saw/attack(mob/living/target, mob/living/carbon/human/user)
if(!active || swiping || !target.density || get_turf(target) == get_turf(user))
if(!active)
@@ -834,6 +845,43 @@
melee_attack_chain(user, L)
swiping = FALSE
/obj/item/melee/transforming/cleaving_saw/alt_pre_attack(atom/A, mob/living/user, params)
return TRUE // Let's dance.
/obj/item/melee/transforming/cleaving_saw/altafterattack(atom/target, mob/living/user, proximity_flag, click_parameters)
if(user.IsImmobilized()) // no free dodgerolls
return
var/turf/where_to = get_turf(target)
user.apply_damage(damage = roll_stamcost, damagetype = STAMINA)
user.Immobilize(0.8 SECONDS) // you dont get to adjust your roll
user.throw_at(where_to, range = roll_range, speed = 1, force = MOVE_FORCE_NORMAL, spin = roll_orientation)
user.apply_status_effect(/datum/status_effect/dodgeroll_iframes)
playsound(user, 'sound/effects/body-armor-rolling.ogg', 50, FALSE)
return ..()
/datum/status_effect/dodgeroll_iframes
id = "dodgeroll_dodging"
alert_type = null
status_type = STATUS_EFFECT_REFRESH
duration = 0.8 SECONDS // worth tweaking?
/datum/status_effect/dodgeroll_iframes/on_apply()
. = ..()
RegisterSignal(owner, COMSIG_LIVING_RUN_BLOCK, .proc/trolled)
/datum/status_effect/dodgeroll_iframes/on_remove()
UnregisterSignal(owner, list(
COMSIG_LIVING_RUN_BLOCK
))
return ..()
/datum/status_effect/dodgeroll_iframes/proc/trolled(mob/living/source, real_attack, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list)
SIGNAL_HANDLER
owner.balloon_alert_to_viewers("missed!")
playsound(src, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1)
return_list[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_PASSTHROUGH
return BLOCK_SUCCESS | BLOCK_SHOULD_REDIRECT | BLOCK_TARGET_DODGED
//Dragon
/obj/structure/closet/crate/necropolis/dragon

View File

@@ -725,6 +725,8 @@
var/bleed_amount = bleedDragAmount()
blood_volume = max(blood_volume - bleed_amount, 0) //that depends on our brute damage.
if(bleed_amount < 0.1)
return
var/newdir = get_dir(target_turf, start)
if(newdir != direction)
newdir = newdir | direction

View File

@@ -57,8 +57,11 @@
var/time = time2text(world.realtime,"hh:mm:ss")
var/turf/T = get_turf(src)
if(!istype(T))
T = get_turf(usr)
var/logging_data
if(usr)
if(usr && T)
logging_data = "[time] <B>:</B> [usr.key] used [src] @ location ([T.x],[T.y],[T.z]) <B>:</B> [format_frequency(signal_frequency)]/[signal_code]"
GLOB.lastsignalers.Add(logging_data)

View File

@@ -11,6 +11,7 @@
name = "ninja shoes"
desc = "A pair of running shoes. Excellent for running and even better for smashing skulls."
icon_state = "s-ninja"
item_state = "s-ninja"
permeability_coefficient = 0.01
clothing_flags = NOSLIP
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF

View File

@@ -182,6 +182,8 @@
n_shoes = ninja.shoes
ADD_TRAIT(n_shoes, TRAIT_NODROP, NINJA_SUIT_TRAIT)
n_shoes.slowdown--
n_shoes.icon_state = "s-ninjan"
n_shoes.item_state = "s-ninjan"
n_gloves = ninja.gloves
ADD_TRAIT(n_gloves, TRAIT_NODROP, NINJA_SUIT_TRAIT)
n_gloves.icon_state = "s-ninjan"
@@ -212,6 +214,8 @@
if(n_shoes)
REMOVE_TRAIT(n_shoes, TRAIT_NODROP, NINJA_SUIT_TRAIT)
n_shoes.slowdown++
n_shoes.icon_state = "s-ninja"
n_shoes.item_state = "s-ninja"
if(n_gloves)
n_gloves.icon_state = "s-ninja"
n_gloves.item_state = "s-ninja"

View File

@@ -175,6 +175,7 @@
/obj/item/gun/energy/plasmacutter/adv
name = "advanced plasma cutter"
icon_state = "adv_plasmacutter"
item_state = "adv_plasmacutter"
force = 15
ammo_type = list(/obj/item/ammo_casing/energy/plasma/adv)

View File

@@ -257,8 +257,6 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
return rs.Join(" | ")
/datum/reagent/proc/define_gas()
if(reagent_state == SOLID)
return null // doesn't make that much sense
var/list/cached_reactions = GLOB.chemical_reactions_list
for(var/reaction in cached_reactions[src.type])
var/datum/chemical_reaction/C = reaction

View File

@@ -405,6 +405,8 @@
metabolization_rate = 0.5 * REAGENTS_METABOLISM
chemical_flags = REAGENT_ALL_PROCESS
overdose_threshold = 60
boiling_point = T0C+100
gas = GAS_H2O
taste_description = "sweetness and salt"
var/extra_regen = 0.25 // in addition to acting as temporary blood, also add this much to their actual blood per tick
var/last_added = 0
@@ -692,6 +694,7 @@
description = "Rapidly restores oxygen deprivation as well as preventing more of it to an extent. Causes jittering."
reagent_state = LIQUID
color = "#00FFFF"
boiling_point = 300
metabolization_rate = 0.25 * REAGENTS_METABOLISM
pH = 2

View File

@@ -266,24 +266,27 @@
/datum/reagent/water/reaction_turf(turf/open/T, reac_volume)
if (!istype(T))
return
var/CT = cooling_temperature
if(holder?.chem_temp > T0C + 100)
T.atmos_spawn_air("[GAS_H2O]=[reac_volume/molarity];TEMP=[holder.chem_temp]")
else
var/CT = cooling_temperature
if(reac_volume >= 5)
T.MakeSlippery(TURF_WET_WATER, 10 SECONDS, min(reac_volume*1.5 SECONDS, 60 SECONDS))
if(reac_volume >= 5)
T.MakeSlippery(TURF_WET_WATER, 10 SECONDS, min(reac_volume*1.5 SECONDS, 60 SECONDS))
for(var/mob/living/simple_animal/slime/M in T)
M.apply_water()
for(var/mob/living/simple_animal/slime/M in T)
M.apply_water()
var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in T)
if(hotspot && !isspaceturf(T))
if(T.air)
var/datum/gas_mixture/G = T.air
G.set_temperature(max(min(G.return_temperature()-(CT*1000),G.return_temperature()/CT),TCMB))
G.react(src)
qdel(hotspot)
var/obj/effect/acid/A = (locate(/obj/effect/acid) in T)
if(A)
A.acid_level = max(A.acid_level - reac_volume*50, 0)
var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in T)
if(hotspot && !isspaceturf(T))
if(T.air)
var/datum/gas_mixture/G = T.air
G.set_temperature(max(min(G.return_temperature()-(CT*1000),G.return_temperature()/CT),TCMB))
G.react(src)
qdel(hotspot)
var/obj/effect/acid/A = (locate(/obj/effect/acid) in T)
if(A)
A.acid_level = max(A.acid_level - reac_volume*50, 0)
/*
* Water reaction to an object
@@ -562,9 +565,11 @@
chemical_flags = REAGENT_ALL_PROCESS
color = "#009CA8" // rgb: 0, 156, 168
taste_description = "cherry" // by popular demand
boiling_point = 330
var/lube_kind = TURF_WET_LUBE ///What kind of slipperiness gets added to turfs.
/datum/reagent/lube/reaction_turf(turf/open/T, reac_volume)
..()
if (!istype(T))
return
if(reac_volume >= 1)
@@ -1324,6 +1329,8 @@
taste_description = "sourness"
boiling_point = T0C+50
pH = 5.5
molarity = 1
condensation_amount = MOLES_GAS_VISIBLE_STEP
/datum/reagent/space_cleaner/reaction_obj(obj/O, reac_volume)
if(istype(O, /obj/effect/decal/cleanable) || istype(O, /obj/item/projectile/bullet/reusable/foam_dart) || istype(O, /obj/item/ammo_casing/caseless/foam_dart))
@@ -1871,6 +1878,15 @@
reagent_state = LIQUID
taste_description = "solvent"//It's neutral though..?
color = "#e6e6e6"
boiling_point = 329.2
/datum/reagent/acetone/define_gas()
var/datum/gas/G = ..()
G.fire_burn_rate = 1 / 4
G.fire_products = list(GAS_H2O = 3, GAS_CO2 = 3)
G.enthalpy = -217100
G.fire_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST
return G
/datum/reagent/colorful_reagent
name = "Colorful Reagent"
@@ -2002,6 +2018,7 @@
reagent_state = LIQUID
color = "#A70FFF"
taste_description = "dryness"
boiling_point = 310
pH = 10.7
value = REAGENT_VALUE_UNCOMMON
@@ -2268,6 +2285,7 @@
color = "#AAAAAA55"
taste_description = "water"
metabolization_rate = 0.25 * REAGENTS_METABOLISM
boiling_point = 325
value = REAGENT_VALUE_RARE
pH = 15
@@ -2507,6 +2525,8 @@
reagent_state = LIQUID
color = "#FFFFFF" // rgb: 255, 255, 255
can_synth = FALSE
// you know i wouldn't
// boiling_point = T0C + 100
nutriment_factor = 0.5 * REAGENTS_METABOLISM
var/decal_path = /obj/effect/decal/cleanable/semen

View File

@@ -14,101 +14,4 @@ GLOBAL_LIST_INIT(all_security_levels, list("green", "blue", "amber", "red", "del
//config.alert_desc_blue_downto
/proc/set_security_level(level)
if(!isnum(level))
level = GLOB.all_security_levels.Find(level)
//Will not be announced if you try to set to the same level as it already is
if(level >= SEC_LEVEL_GREEN && level <= SEC_LEVEL_DELTA && level != GLOB.security_level)
switch(level)
if(SEC_LEVEL_GREEN)
minor_announce(CONFIG_GET(string/alert_green), "Attention! Security level lowered to green:")
if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL)
if(GLOB.security_level >= SEC_LEVEL_RED)
SSshuttle.emergency.modTimer(4)
else if(GLOB.security_level == SEC_LEVEL_AMBER)
SSshuttle.emergency.modTimer(2.5)
else
SSshuttle.emergency.modTimer(1.66)
GLOB.security_level = SEC_LEVEL_GREEN
for(var/obj/machinery/firealarm/FA in GLOB.machines)
if(is_station_level(FA.z))
FA.update_icon()
if(SEC_LEVEL_BLUE)
if(GLOB.security_level < SEC_LEVEL_BLUE)
minor_announce(CONFIG_GET(string/alert_blue_upto), "Attention! Security level elevated to blue:",1)
if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL)
SSshuttle.emergency.modTimer(0.6)
else
minor_announce(CONFIG_GET(string/alert_blue_downto), "Attention! Security level lowered to blue:")
if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL)
if(GLOB.security_level >= SEC_LEVEL_RED)
SSshuttle.emergency.modTimer(2.4)
else
SSshuttle.emergency.modTimer(1.5)
GLOB.security_level = SEC_LEVEL_BLUE
sound_to_playing_players('sound/misc/voybluealert.ogg', volume = 50) // Citadel change - Makes alerts play a sound
for(var/obj/machinery/firealarm/FA in GLOB.machines)
if(is_station_level(FA.z))
FA.update_icon()
if(SEC_LEVEL_AMBER)
if(GLOB.security_level < SEC_LEVEL_AMBER)
minor_announce(CONFIG_GET(string/alert_amber_upto), "Attention! Security level elevated to amber:",1)
if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL)
if(GLOB.security_level == SEC_LEVEL_GREEN)
SSshuttle.emergency.modTimer(0.4)
else
SSshuttle.emergency.modTimer(0.66)
else
minor_announce(CONFIG_GET(string/alert_amber_downto), "Attention! Security level lowered to amber:")
if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL)
SSshuttle.emergency.modTimer(1.6)
GLOB.security_level = SEC_LEVEL_AMBER
sound_to_playing_players('sound/effects/alert.ogg', volume = 50) // Citadel change - Makes alerts play a sound
for(var/obj/machinery/firealarm/FA in GLOB.machines)
if(is_station_level(FA.z))
FA.update_icon()
if(SEC_LEVEL_RED)
if(GLOB.security_level < SEC_LEVEL_RED)
minor_announce(CONFIG_GET(string/alert_red_upto), "Attention! Code red!",1)
if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL)
if(GLOB.security_level == SEC_LEVEL_GREEN)
SSshuttle.emergency.modTimer(0.25)
else if(GLOB.security_level == SEC_LEVEL_BLUE)
SSshuttle.emergency.modTimer(0.416)
else
SSshuttle.emergency.modTimer(0.625)
else
minor_announce(CONFIG_GET(string/alert_red_downto), "Attention! Code red!")
GLOB.security_level = SEC_LEVEL_RED
sound_to_playing_players('sound/misc/voyalert.ogg', volume = 50) // Citadel change - Makes alerts play a sound
for(var/obj/machinery/firealarm/FA in GLOB.machines)
if(is_station_level(FA.z))
FA.update_icon()
for(var/obj/machinery/computer/shuttle/pod/pod in GLOB.machines)
pod.admin_controlled = FALSE
if(SEC_LEVEL_DELTA)
minor_announce(CONFIG_GET(string/alert_delta), "Attention! Delta security level reached!",1)
if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL)
if(GLOB.security_level < SEC_LEVEL_BLUE)
SSshuttle.emergency.modTimer(0.25)
else if(GLOB.security_level == SEC_LEVEL_BLUE)
SSshuttle.emergency.modTimer(0.416)
else
SSshuttle.emergency.modTimer(0.625)
GLOB.security_level = SEC_LEVEL_DELTA
sound_to_playing_players('sound/misc/deltakalaxon.ogg') // Citadel change - Makes alerts play a sound
for(var/obj/machinery/firealarm/FA in GLOB.machines)
if(is_station_level(FA.z))
FA.update_icon()
for(var/obj/machinery/computer/shuttle/pod/pod in GLOB.machines)
pod.admin_controlled = FALSE
if(level >= SEC_LEVEL_RED)
for(var/obj/machinery/door/D in GLOB.machines)
if(D.red_alert_access)
D.visible_message("<span class='notice'>[D] whirrs as it automatically lifts access requirements!</span>")
playsound(D, 'sound/machines/boltsup.ogg', 50, TRUE)
SSblackbox.record_feedback("tally", "security_level_changes", 1, NUM2SECLEVEL(GLOB.security_level))
SSnightshift.check_nightshift()
else
return
SSsecurity_level.set_level(level)

View File

@@ -538,6 +538,10 @@
density = FALSE
clockwork = TRUE //it'd look weird
/obj/machinery/computer/shuttle/pod/Initialize(mapload)
. = ..()
RegisterSignal(SSsecurity_level, COMSIG_SECURITY_LEVEL_CHANGED, .proc/check_lock)
/obj/machinery/computer/shuttle/pod/ComponentInitialize()
. = ..()
AddElement(/datum/element/update_icon_blocker)
@@ -555,6 +559,21 @@
if(possible_destinations == initial(possible_destinations) || override)
possible_destinations = "pod_lavaland[idnum]"
/**
* Signal handler for checking if we should lock or unlock escape pods accordingly to a newly set security level
*
* Arguments:
* * source The datum source of the signal
* * new_level The new security level that is in effect
*/
/obj/machinery/computer/shuttle/pod/proc/check_lock(datum/source, new_level)
SIGNAL_HANDLER
if(obj_flags & EMAGGED)
return
admin_controlled = !(new_level < SEC_LEVEL_RED)
/obj/docking_port/stationary/random
name = "escape pod"
id = "pod"

View File

@@ -118,7 +118,7 @@
O.on_find(user)
organs -= O
organs[O.name] = O
I = show_radial_menu(user, target, organs, custom_check = FALSE, require_near = TRUE, tooltips = TRUE)
I = show_radial_menu(user, target, organs, require_near = TRUE, tooltips = TRUE)
if(I && user && target && user.Adjacent(target) && user.get_active_held_item() == tool)
I = organs[I]
if(!I)

View File

@@ -3,6 +3,8 @@
desc = "Retracts stuff."
icon = 'icons/obj/surgery.dmi'
icon_state = "retractor"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
custom_materials = list(/datum/material/iron=6000, /datum/material/glass=3000)
item_flags = SURGICAL_TOOL
flags_1 = CONDUCT_1
@@ -19,7 +21,6 @@
/obj/item/retractor/advanced
name = "mechanical pinches"
desc = "An agglomerate of rods and gears."
icon = 'icons/obj/surgery.dmi'
icon_state = "retractor_a"
toolspeed = 0.7
@@ -41,8 +42,6 @@
/obj/item/retractor/augment
name = "retractor"
desc = "Micro-mechanical manipulator for retracting stuff."
icon = 'icons/obj/surgery.dmi'
icon_state = "retractor"
custom_materials = list(/datum/material/iron=6000, /datum/material/glass=3000)
flags_1 = CONDUCT_1
w_class = WEIGHT_CLASS_TINY
@@ -60,6 +59,8 @@
desc = "You think you have seen this before."
icon = 'icons/obj/surgery.dmi'
icon_state = "hemostat"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
custom_materials = list(/datum/material/iron=5000, /datum/material/glass=2500)
item_flags = SURGICAL_TOOL
flags_1 = CONDUCT_1
@@ -77,8 +78,6 @@
/obj/item/hemostat/augment
name = "hemostat"
desc = "Tiny servos power a pair of pincers to stop bleeding."
icon = 'icons/obj/surgery.dmi'
icon_state = "hemostat"
custom_materials = list(/datum/material/iron=5000, /datum/material/glass=2500)
flags_1 = CONDUCT_1
w_class = WEIGHT_CLASS_TINY
@@ -98,6 +97,8 @@
desc = "This stops bleeding."
icon = 'icons/obj/surgery.dmi'
icon_state = "cautery"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
custom_materials = list(/datum/material/iron=2500, /datum/material/glass=750)
item_flags = SURGICAL_TOOL
flags_1 = CONDUCT_1
@@ -116,8 +117,6 @@
/obj/item/cautery/augment
name = "cautery"
desc = "A heated element that cauterizes wounds."
icon = 'icons/obj/surgery.dmi'
icon_state = "cautery"
custom_materials = list(/datum/material/iron=2500, /datum/material/glass=750)
flags_1 = CONDUCT_1
w_class = WEIGHT_CLASS_TINY
@@ -136,8 +135,8 @@
desc = "You can drill using this item. You dig?"
icon = 'icons/obj/surgery.dmi'
icon_state = "drill"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
hitsound = 'sound/weapons/circsawhit.ogg'
custom_materials = list(/datum/material/iron=10000, /datum/material/glass=6000)
item_flags = SURGICAL_TOOL
@@ -157,7 +156,6 @@
/obj/item/surgicaldrill/advanced
name = "searing tool"
desc = "It projects a high power laser used for medical application."
icon = 'icons/obj/surgery.dmi'
icon_state = "surgicaldrill_a"
hitsound = 'sound/items/welder.ogg'
heat = 3500
@@ -184,8 +182,6 @@
/obj/item/surgicaldrill/augment
name = "surgical drill"
desc = "Effectively a small power drill contained within your arm, edges dulled to prevent tissue damage. May or may not pierce the heavens."
icon = 'icons/obj/surgery.dmi'
icon_state = "drill"
hitsound = 'sound/weapons/circsawhit.ogg'
custom_materials = list(/datum/material/iron=10000, /datum/material/glass=6000)
flags_1 = CONDUCT_1
@@ -229,12 +225,11 @@
/obj/item/scalpel/advanced
name = "laser scalpel"
desc = "An advanced scalpel which uses laser technology to cut."
icon = 'icons/obj/surgery.dmi'
icon_state = "scalpel_a"
hitsound = 'sound/weapons/blade1.ogg'
force = 16
toolspeed = 0.7
light_color = LIGHT_COLOR_GREEN
light_color = LIGHT_COLOR_BLUE
sharpness = SHARP_POINTY
heat = 3500
@@ -264,8 +259,6 @@
/obj/item/scalpel/augment
name = "scalpel"
desc = "Ultra-sharp blade attached directly to your bone for extra-accuracy."
icon = 'icons/obj/surgery.dmi'
icon_state = "scalpel"
flags_1 = CONDUCT_1
force = 10
w_class = WEIGHT_CLASS_TINY
@@ -327,8 +320,6 @@
/obj/item/circular_saw/augment
name = "circular saw"
desc = "A small but very fast spinning saw. Edges dulled to prevent accidental cutting inside of the surgeon."
icon = 'icons/obj/surgery.dmi'
icon_state = "saw"
hitsound = 'sound/weapons/circsawhit.ogg'
mob_throw_hit_sound = 'sound/weapons/pierce.ogg'
flags_1 = CONDUCT_1
@@ -465,7 +456,7 @@
name = "bonesetter"
desc = "For setting things right."
icon = 'icons/obj/surgery.dmi'
icon_state = "bone setter"
icon_state = "bonesetter"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
custom_materials = list(/datum/material/iron=5000, /datum/material/glass=2500)

View File

@@ -149,10 +149,45 @@
2022-08-20:
BongaTheProto:
- code_imp: Updates rust_g to 1.0.2
- qol: Upgrades our donator system to support automatic updates! Making sure all donators always have at least the loadout tiers perk
Hatterhat:
- tweak: Chief engineers now have expert wiring skills, as befitting a crew member
of their assumed caliber. Atmos techs also get more wire skill.
- tweak: Research directors now have trained wiring skills, and scientists have
basic wiring expertise.
- rscadd: 'Cleaving saws now have a Certified FromSoft Classic mechanic: dodge-rolling.
Combat mode RMB with it inhand to use.'
Linzolle:
- rscadd: radial menu to organ manipulation surgery
Onule, PositiveEntropy, TetraZeta, Axietheaxolotl, Thgvr, AdipemDragon:
- imageadd: Completely resprites all medkits!
- imageadd: Completely resprites all medical tools!
- imageadd: Removes the clamp sprite and instead creates separate hemostat and retractor
inhand sprites!
- imageadd: Adds missing inhands for the bonesetter, advanced med tools, tactical
medkit, surgical drill and bone gel!
Putnam3145:
- bugfix: Stake (maybe)
- bugfix: Caches the auxmos file if found
- balance: Sandstorm now happens less often, tends to be less powerful and is announced.
- bugfix: update air ref more aggressively
- bugfix: Binary translator key now has a proper description
- rscadd: Space lube, drying agent, salbutamol, colorful reagent, drying agent chem
gases
- bugfix: Signal commander works now
- tweak: Infinite blood trails are no longer possible
Rohesie:
- tweak: Admins and byond users can now set their OOC color to light values and
it will save in the preferences.
zeroisthebiggay:
- tweak: cauteries searing tools and energy scalpels now have heat and can be used
to light cigarettes
- imageadd: crushers
- imageadd: glaives
- imageadd: drills
- imageadd: mining scammers
- imageadd: my mom
- imageadd: new ninja sprites
- imageadd: makes the long gloves look more like their normal counterparts
- imageadd: mauler gauntlets have lost a grand total of three pixels in order to
make them slimmer

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 513 KiB

After

Width:  |  Height:  |  Size: 513 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 743 B

After

Width:  |  Height:  |  Size: 958 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 759 B

After

Width:  |  Height:  |  Size: 954 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 KiB

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 129 KiB

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

View File

@@ -444,6 +444,7 @@
#include "code\controllers\subsystem\radio.dm"
#include "code\controllers\subsystem\research.dm"
#include "code\controllers\subsystem\runechat.dm"
#include "code\controllers\subsystem\security_level.dm"
#include "code\controllers\subsystem\server_maint.dm"
#include "code\controllers\subsystem\shuttle.dm"
#include "code\controllers\subsystem\sound_loops.dm"