diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm
index 440874ffd2e..626da0e6e89 100644
--- a/code/__defines/species_languages.dm
+++ b/code/__defines/species_languages.dm
@@ -39,6 +39,7 @@
// Species languages
#define LANGUAGE_SOL_COMMON "Sol Common"
+#define LANGUAGE_ELYRAN_STANDARD "Elyran Standard"
#define LANGUAGE_UNATHI "Sinta'unathi"
#define LANGUAGE_SIIK_MAAS "Siik'maas"
#define LANGUAGE_SIIK_TAJR "Siik'tajr"
diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm
index d2a77952a6e..c07fbfd062b 100644
--- a/code/game/jobs/job/job.dm
+++ b/code/game/jobs/job/job.dm
@@ -119,8 +119,8 @@
var/datum/faction/F = faction
if(!F.is_default)
var/new_outfit = F.titles_to_loadout[title]
- var/datum/outfit/O = new new_outfit
- if(O)
+ if(ispath(new_outfit))
+ var/datum/outfit/O = new new_outfit
O.pre_equip(H, TRUE)
O.equip(H, TRUE)
return
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index 70f0b8dadf2..659215d0b7b 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -17,21 +17,21 @@
update_icon()
/obj/machinery/cell_charger/update_icon()
- icon_state = "ccharger[charging ? 1 : 0]"
-
if(charging && !(stat & (BROKEN|NOPOWER)) )
var/newlevel = round(charging.percent() * 4.0 / 99)
if(chargelevel != newlevel)
-
cut_overlays()
add_overlay("ccharger-o[newlevel]")
-
chargelevel = newlevel
+ add_overlay("ccharger-on")
else
cut_overlays()
+ if(!charging)
+ return
+
/obj/machinery/cell_charger/examine(mob/user)
if(!..(user, 5))
return
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index 1a710e4963e..4b531b77dd7 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -416,6 +416,12 @@
..()
update_icon()
+/obj/item/storage/lockbox/vials/forensic
+ icon_state = "vialbox6"
+ locked = FALSE
+ starts_with = list(/obj/item/reagent_containers/glass/beaker/vial = 6)
+ req_access = list(access_forensics_lockers)
+
/obj/item/storage/box/fancy/chocolate_box
name = "chocolate box"
desc = "A lot like life, you never know what you're going to get."
diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm
index 415cd08efea..f252c6371a1 100644
--- a/code/game/objects/items/weapons/surgery_tools.dm
+++ b/code/game/objects/items/weapons/surgery_tools.dm
@@ -303,7 +303,9 @@
/obj/item/surgery/scalpel = 1,
/obj/item/surgery/surgicaldrill = 1,
/obj/item/autopsy_scanner = 1,
- /obj/item/device/mass_spectrometer = 1
+ /obj/item/device/mass_spectrometer = 1,
+ /obj/item/reagent_containers/glass/beaker/vial = 1,
+ /obj/item/reagent_containers/syringe = 1
)
can_hold = list(
diff --git a/code/modules/admin/verbs/bluespacetech.dm b/code/modules/admin/verbs/bluespacetech.dm
index a1fa9b5565e..662c8540873 100644
--- a/code/modules/admin/verbs/bluespacetech.dm
+++ b/code/modules/admin/verbs/bluespacetech.dm
@@ -106,6 +106,7 @@
// Other station species' languages
bst.add_language(LANGUAGE_SKRELLIAN)
bst.add_language(LANGUAGE_SOL_COMMON)
+ bst.add_language(LANGUAGE_ELYRAN_STANDARD)
bst.add_language(LANGUAGE_ROOTSONG)
bst.add_language(LANGUAGE_VAURCA)
// Synthetics
diff --git a/code/modules/background/citizenship/human.dm b/code/modules/background/citizenship/human.dm
index 486c5ba27a4..c2196d8891d 100644
--- a/code/modules/background/citizenship/human.dm
+++ b/code/modules/background/citizenship/human.dm
@@ -189,11 +189,10 @@
/datum/citizenship/dominia
name = CITIZENSHIP_DOMINIA
- description = "A heavily religious absolute monarchy with its capital, Nova Luxembourg, on the planet of Dominia in the X'yr Vharn'p system. This autocratic state is ruled by His \
- Imperial Majesty Boleslaw Keeser. The Empire of Dominia was proclaimed in 2437 by Unathi raiders who invaded the planet of Moroz, a colony which had been isolated for hundreds of \
- years. Imperial society is dominated by the Great and Minor Houses under the Emperor and is very socio-economically stratified due to the so-called blood debt, \
- known as the Mor'iz'al. All citizens are born with the Mor'iz'al debt in exchange for the privileges of citizenship, a debt that takes a lifetime or more to pay off. \
- Indebted citizens are known as Ma'zals, forming the massive underclass in Dominia. Many in the Empire follow a strict code of honor."
+ description = "A heavily religious absolute monarchy with its capital, Nova Luxembourg, on the planet of Moroz in the Mira Sancta system. This autocratic state is ruled by \
+ His Imperial Majesty Boleslaw Keeser. The Empire of Dominia was proclaimed in 2385 by then-Emperor Godwin Keeser, unifying a colony which had been isolated for hundreds of years. \
+ Imperial society is dominated by the Great and Minor Houses under the Emperor and is very socio-economically stratified due to the so-called blood debt, known as the Mor’iz’al."
+
consular_outfit = /datum/outfit/job/representative/consular/dominia
job_species_blacklist = list(
diff --git a/code/modules/background/religion/human.dm b/code/modules/background/religion/human.dm
index 9601a124be7..bd1335c5e5d 100644
--- a/code/modules/background/religion/human.dm
+++ b/code/modules/background/religion/human.dm
@@ -36,12 +36,14 @@
/datum/religion/moroz
name = RELIGION_MOROZ
- description = "A rapidly expanding religion that borrows from largly from the Sk'akh religion founded by former High Lord Precentor, Tribune Lien Jakaab and former Sk'akh Priest, \
- Tribune Kasam Kaelesi. Worship revolves around a gender neutral supreme being known commonly as \"Goddess\" in all languages. As a gender neutral God the being is often \
- called 'he' or 'she' interchangeably to represent that she/he is a collection of all the faithful. The elites of the religion are made up of the Tribunal who commune directly with \
- the \"Goddess\". From their communions, the Tribunal create edicts to be followed by the faithful. Disobeying an edict can be met with the death penalty in the worse case, typically \
- by firing squad or ritual suicide. Like Sk'akh, the Goddess can be either male or female and is often called Three of One because the spirits combine into three minor aspects within \
- the Goddess: the Soldier, the Scholar, the Artisan. These three spirits are personifications of the most important aspects of Dominia society."
+ description = "The state religion of the Empire of Dominia, the Moroz Holy Tribunal is an eclectic mixture of old Earth faiths and the adaptations given to those faiths by the \
+ colonists of Moroz. More conservative members of the faith are known to adopt some traits from Sk'akh, a recently arrived faith in the Empire. Worship revolves around a \
+ female supreme being known commonly as 'Goddess' in all languages. The elites of the religion are made up of the Tribunal members that commune directly with the Goddess. \
+ From their communions, the Tribunal create edicts to be followed by the faithful. Disobeying an edict can be met with the death penalty in the worse case, typically \
+ by firing squad or ritual suicide. It is rumored by the faithful that the Tribunal possess psionic powers gifted to them by the Goddess. The Goddess is often called \
+ Three of One due to her three minor aspects: the Soldier, the Scholar, the Artisan. These three spirits are personifications of the most important aspects of Dominia society. \
+ Tribunal priests agree that all three are equally important, and that malign spirits can be attracted by an imbalance in the Great Three. Priests often stress the importance \
+ of balance, both in matters of spirit, in society, and in personal life."
book_name = "tribunal codex"
/datum/religion/trinary
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 11f90e3a2a4..ed6f0910b7c 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -6,7 +6,7 @@
var/flash_protection = FLASH_PROTECTION_NONE // Sets the item's level of flash protection.
var/tint = TINT_NONE // Sets the item's level of visual impairment tint.
var/list/species_restricted = null //Only these species can wear this kit.
- var/gunshot_residue //Used by forensics.
+ var/list/gunshot_residue //Used by forensics.
var/list/accessories
var/list/valid_accessory_slots
@@ -56,7 +56,7 @@
// Aurora forensics port.
/obj/item/clothing/clean_blood()
. = ..()
- gunshot_residue = null
+ LAZYCLEARLIST(gunshot_residue)
/obj/item/proc/negates_gravity()
return 0
diff --git a/code/modules/clothing/under/accessories/xeno/unathi.dm b/code/modules/clothing/under/accessories/xeno/unathi.dm
index d45a35e7b37..44cd10f6a4c 100644
--- a/code/modules/clothing/under/accessories/xeno/unathi.dm
+++ b/code/modules/clothing/under/accessories/xeno/unathi.dm
@@ -5,11 +5,15 @@
icon = 'icons/obj/unathi_items.dmi'
icon_state = "sinta_hood"
item_state = "sinta_hood_up"
- slot_flags = SLOT_TIE|SLOT_HEAD
+ slot_flags = SLOT_TIE|SLOT_HEAD|SLOT_EARS
+ flags_inv = BLOCKHAIR|BLOCKHEADHAIR
contained_sprite = TRUE
action_button_name = "Adjust Hood"
var/up = TRUE
+/obj/item/clothing/accessory/sinta_hood/get_ear_examine_text(var/mob/user, var/ear_text = "left")
+ return "on [user.get_pronoun("his")] head"
+
/obj/item/clothing/accessory/sinta_hood/attack_self()
toggle()
@@ -34,6 +38,9 @@
update_worn_icon()
update_clothing_icon()
update_icon()
+ if(ishuman(usr))
+ var/mob/living/carbon/human/H = usr
+ H.update_hair()
/obj/item/clothing/accessory/unathi
name = "gyazo belt"
diff --git a/code/modules/detectivework/microscope/dnascanner.dm b/code/modules/detectivework/microscope/dnascanner.dm
index 6ce527e22a1..3eba6060a12 100644
--- a/code/modules/detectivework/microscope/dnascanner.dm
+++ b/code/modules/detectivework/microscope/dnascanner.dm
@@ -99,7 +99,7 @@
last_process_worldtime = world.time
/obj/machinery/dnaforensics/proc/complete_scan()
- visible_message("[icon2html(src, viewers(get_turf(src)))] makes an insistent chime.", range = 2)
+ visible_message(SPAN_NOTICE("[icon2html(src, viewers(get_turf(src)))] makes an insistent chime."), range = 2)
update_icon()
if(bloodsamp)
var/obj/item/paper/P = new()
@@ -110,13 +110,15 @@
//dna data itself
var/data = "No scan information available."
if(bloodsamp.dna != null)
- data = "Spectometric analysis on provided sample has determined the presence of [bloodsamp.dna.len] strings of DNA.
"
+ data = "Spectometric analysis on provided sample has determined the presence of [length(bloodsamp.dna)] string\s of DNA.
"
for(var/blood in bloodsamp.dna)
- data += "Blood type: [bloodsamp.dna[blood]]
\nDNA: [blood]
"
+ if(bloodsamp.dna[blood])
+ data += "Blood type: [bloodsamp.dna[blood]]
"
+ data += "DNA: [blood]
"
else
data += "No DNA found.
"
- info = "[src] analysis report #[report_num]
"
- info += "Scanned item:
[bloodsamp.name]
[bloodsamp.desc]
" + data
+ info = "[src] analysis report #[report_num]
"
+ info += "Scanned item: [bloodsamp.name]
" + data
P.set_content_unsafe(pname, info)
print(P)
scanning = 0
diff --git a/code/modules/detectivework/microscope/microscope.dm b/code/modules/detectivework/microscope/microscope.dm
index 91a4536ae6c..fd735214aef 100644
--- a/code/modules/detectivework/microscope/microscope.dm
+++ b/code/modules/detectivework/microscope/microscope.dm
@@ -10,7 +10,9 @@
density = 1
var/obj/item/sample = null
- var/report_num = 0
+ var/report_fiber_num = 0
+ var/report_print_num = 0
+ var/report_gsr_num = 0
/obj/machinery/microscope/attackby(obj/item/W as obj, mob/user as mob)
@@ -43,47 +45,56 @@
var/info
report.stamped = list(/obj/item/stamp)
report.overlays = list("paper_stamped")
- report_num++
if(istype(sample, /obj/item/forensics/slide))
var/obj/item/forensics/slide/slide = sample
if(slide.has_swab)
var/obj/item/forensics/swab/swab = slide.has_swab
-
- pname = "GSR report #[report_num]"
- info = "Scanned item:
[swab.name]
"
-
- if(swab.gsr)
- info += "Residue from a [swab.gsr] bullet detected."
+ report_gsr_num++
+ pname = "GSR report #[report_gsr_num]"
+ info = "GSR anaylsis report #[report_gsr_num]
"
+ if(length(swab.gsr))
+ info += "Residue analysis of the [swab.name] has determined the presence of the following residues."
+ for(var/gsr in swab.gsr)
+ info += "- Residue from a [gsr] bullet detected.
"
+ info += "
"
else
info += "No gunpowder residue found."
else if(slide.has_sample)
var/obj/item/sample/fibers/fibers = slide.has_sample
- pname = "Fiber report #[report_num]"
- info = "Scanned item:
[initial(fibers.name)]
"
+ report_fiber_num++
+ pname = "Fiber report #[report_fiber_num]"
if(fibers.evidence)
- info = "Molecular analysis on [fibers.name] has determined the presence of unique fiber strings.
"
+ info = "Fiber anaylsis report #[report_fiber_num]
"
+ info += "Source locations: "
+ info += "[english_list(fibers.source, "no sources were found", ", ", ", ", "")].
"
+ info += "Molecular analysis on [fibers.name] has determined the presence of unique fiber strings."
for(var/fiber in fibers.evidence)
- info += SPAN_NOTICE("Most likely match for fibers: [fiber]
")
+ info += "- Most likely match for fibers: [fiber]
"
+ info += "
"
else
info += "No fibers found."
else
- pname = "Empty slide report #[report_num]"
+ pname = "Empty slide report #[report_fiber_num]"
info = "Evidence suggests that there's nothing in this slide."
else if(istype(sample, /obj/item/sample/print))
- pname = "Fingerprint report #[report_num]"
- info = "Fingerprint analysis report #[report_num]: [sample.name]
"
+ report_print_num++
+ pname = "Fingerprint report #[report_print_num]"
var/obj/item/sample/print/card = sample
+ info = "Fingerprint analysis report #[report_print_num]
"
+ info += "Source locations: "
+ info += "[english_list(card.source, "no sources were found", ", ", ", ", "")].
"
if(card.evidence && card.evidence.len)
- info += "Surface analysis has determined unique fingerprint strings:
"
+ info += "Surface analysis has determined unique fingerprint strings:"
for(var/prints in card.evidence)
- info += SPAN_NOTICE("Fingerprint string: ")
+ info += "- Fingerprint string: "
if(!is_complete_print(prints))
info += "INCOMPLETE PRINT"
else
info += "[prints]"
- info += "
"
+ info += " "
+ info += "
"
else
info += "No information available."
diff --git a/code/modules/detectivework/tools/evidencebag.dm b/code/modules/detectivework/tools/evidencebag.dm
index cbf2c097253..1073821072e 100644
--- a/code/modules/detectivework/tools/evidencebag.dm
+++ b/code/modules/detectivework/tools/evidencebag.dm
@@ -102,8 +102,8 @@
/obj/item/evidencebag/attackby(obj/item/W as obj, mob/user as mob)
if(W.ispen() || istype(W, /obj/item/device/flashlight/pen))
var/tmp_label = sanitizeSafe(input(user, "Enter a label for [name]", "Label", label_text), MAX_NAME_LEN)
- if(length(tmp_label) > 15)
- to_chat(user, "The label can be at most 15 characters long.")
+ if(length(tmp_label) > MAX_NAME_LEN)
+ to_chat(user, SPAN_NOTICE("The label can be at most [MAX_NAME_LEN] characters long."))
else
to_chat(user, "You set the label to \"[tmp_label]\".")
label_text = tmp_label
diff --git a/code/modules/detectivework/tools/sample_kits.dm b/code/modules/detectivework/tools/sample_kits.dm
index bcd08995e72..15ce1012a1c 100644
--- a/code/modules/detectivework/tools/sample_kits.dm
+++ b/code/modules/detectivework/tools/sample_kits.dm
@@ -2,28 +2,32 @@
name = "forensic sample"
icon = 'icons/obj/forensics.dmi'
w_class = ITEMSIZE_TINY
- var/list/evidence = list()
+ var/list/evidence
+ var/list/source
+ var/label_text = ""
-/obj/item/sample/New(var/newloc, var/atom/supplied)
+/obj/item/sample/Initialize(var/newloc, var/atom/supplied)
..(newloc)
if(supplied)
copy_evidence(supplied)
- name = "[initial(name)] (\the [initial(supplied.name)])"
+ name = "[initial(name)] ([supplied.get_swab_name()])"
+ LAZYADD(source, supplied.get_swab_name())
-/obj/item/sample/print/New(var/newloc, var/atom/supplied)
+/obj/item/sample/print/Initialize(var/newloc, var/atom/supplied)
..(newloc, supplied)
- if(evidence && evidence.len)
+ if(LAZYLEN(evidence))
icon_state = "fingerprint1"
/obj/item/sample/proc/copy_evidence(var/atom/supplied)
if(supplied.suit_fibers && supplied.suit_fibers.len)
- evidence = supplied.suit_fibers.Copy()
+ LAZYADD(evidence, supplied.suit_fibers.Copy())
supplied.suit_fibers.Cut()
/obj/item/sample/proc/merge_evidence(var/obj/item/sample/supplied, var/mob/user)
if(!supplied.evidence || !supplied.evidence.len)
return 0
- evidence |= supplied.evidence
+ LAZYDISTINCTADD(evidence, supplied.evidence)
+ LAZYDISTINCTADD(source, supplied.source)
name = "[initial(name)] (combined)"
to_chat(user, SPAN_NOTICE("You transfer the contents of \the [initial(supplied.name)] into \the [src]."))
return 1
@@ -32,10 +36,11 @@
if(!supplied.evidence || !supplied.evidence.len)
return 0
for(var/print in supplied.evidence)
- if(evidence[print])
- evidence[print] = stringmerge(evidence[print],supplied.evidence[print])
+ if(LAZYISIN(evidence, print))
+ LAZYSET(evidence, print, stringmerge(evidence[print],supplied.evidence[print]))
else
- evidence[print] = supplied.evidence[print]
+ LAZYSET(evidence, print, supplied.evidence[print])
+ LAZYDISTINCTADD(source, supplied.source)
name = "[initial(name)] (combined)"
to_chat(user, SPAN_NOTICE("You overlay \the [src] and \the [initial(supplied.name)], combining the print records."))
return 1
@@ -46,8 +51,38 @@
if(merge_evidence(O, user))
qdel(O)
return 1
+ else if (O.ispen())
+ var/tmp_label = sanitizeSafe(input(user, "Enter a label for [name]", "Label", label_text), MAX_NAME_LEN)
+ if(length(tmp_label) > MAX_NAME_LEN)
+ to_chat(user, SPAN_WARNING("The label can be at most [MAX_NAME_LEN] characters long."))
+ else
+ to_chat(user, SPAN_NOTICE("You set the label to \"[tmp_label]\"."))
+ label_text = tmp_label
+ update_name_label()
+ return
return ..()
+/obj/item/sample/proc/update_name_label()
+ if(label_text == null)
+ name = initial(name)
+ else
+ name = "[initial(name)] ([label_text])"
+
+/obj/item/sample/Initialize(var/newloc, var/atom/supplied)
+ ..(newloc)
+ if(supplied)
+ copy_evidence(supplied)
+ name = "[initial(name)] ([supplied.get_swab_name()])"
+ LAZYADD(source, supplied.get_swab_name())
+
+/atom/proc/get_swab_name()
+ return "\the [initial(name)]"
+
+/obj/machinery/door/get_swab_name()
+ if(name != initial(name))
+ return "\the [initial(name)]: [name]"
+ return ..()
+
/obj/item/sample/fibers
name = "fiber bag"
desc = "Used to hold fiber evidence for the detective."
@@ -65,7 +100,7 @@
item_state = "paper"
/obj/item/sample/print/attack_self(var/mob/user)
- if(evidence && evidence.len)
+ if(LAZYLEN(evidence))
return
if(!ishuman(user))
return
@@ -76,7 +111,8 @@
to_chat(user, SPAN_NOTICE("You firmly press your fingertips onto the card."))
var/fullprint = H.get_full_print()
- evidence[fullprint] = fullprint
+ LAZYSET(evidence, fullprint, fullprint)
+ LAZYADD(source, "[H.name]")
name = "[initial(name)] (\the [H])"
icon_state = "fingerprint1"
@@ -85,7 +121,7 @@
if(!ishuman(M))
return ..()
- if(evidence && evidence.len)
+ if(LAZYLEN(evidence))
return 0
var/mob/living/carbon/human/H = M
@@ -112,8 +148,9 @@
return 1
user.visible_message("[user] takes a copy of \the [H]'s fingerprints.")
var/fullprint = H.get_full_print()
- evidence[fullprint] = fullprint
+ LAZYSET(evidence, fullprint, fullprint)
copy_evidence(src)
+ LAZYADD(source, "[H.name]")
name = "[initial(name)] (\the [H])"
icon_state = "fingerprint1"
return 1
@@ -122,7 +159,7 @@
/obj/item/sample/print/copy_evidence(var/atom/supplied)
if(supplied.fingerprints && supplied.fingerprints.len)
for(var/print in supplied.fingerprints)
- evidence[print] = supplied.fingerprints[print]
+ LAZYSET(evidence, print, supplied.fingerprints[print])
supplied.fingerprints.Cut()
/obj/item/forensics/sample_kit
diff --git a/code/modules/detectivework/tools/swabs.dm b/code/modules/detectivework/tools/swabs.dm
index 2608803356e..c17890e0dd6 100644
--- a/code/modules/detectivework/tools/swabs.dm
+++ b/code/modules/detectivework/tools/swabs.dm
@@ -14,7 +14,7 @@
\n\nGSR samples are put in a slide and examined in a microscope. \
\nBlood and DNA samples are checked in the DNA analyzer"
icon_state = "swab"
- var/gsr = 0
+ var/list/gsr
var/list/dna
var/used
drop_sound = 'sound/items/drop/glass.ogg'
@@ -70,17 +70,17 @@
return
if(H.gloves)
var/obj/item/clothing/B = H.gloves
- if(!B.gunshot_residue)
+ if(!LAZYLEN(B.gunshot_residue))
to_chat(user, SPAN_WARNING("There is no residue on [H]'s [B]."))
return
user.visible_message("[user] swabs [H]'s [B] for a sample.")
- gsr = B.gunshot_residue
+ LAZYADD(gsr, B.gunshot_residue)
else
- if(!H.gunshot_residue)
+ if(!LAZYLEN(H.gunshot_residue))
to_chat(user, SPAN_WARNING("There is no residue on [H]'s palms."))
return
user.visible_message("[user] swabs [H]'s palm for a sample.")
- gsr = H.gunshot_residue
+ LAZYADD(gsr, H.gunshot_residue)
sample_type = "GSR"
else
return
@@ -134,10 +134,10 @@
if (EVIDENCE_TYPE_GSR)
var/obj/item/clothing/B = A
- if(!istype(B) || !B.gunshot_residue)
+ if(!istype(B) || !LAZYLEN(B.gunshot_residue))
to_chat(user, SPAN_WARNING("There is no residue on \the [A]."))
return
- gsr = B.gunshot_residue
+ LAZYADD(gsr, B.gunshot_residue)
sample_type = "residue"
if (EVIDENCE_TYPE_SALIVA)
diff --git a/code/modules/ghostroles/spawner/human/responseteams/human/elyra.dm b/code/modules/ghostroles/spawner/human/responseteams/human/elyra.dm
index 84df23b041d..688d0e7d937 100644
--- a/code/modules/ghostroles/spawner/human/responseteams/human/elyra.dm
+++ b/code/modules/ghostroles/spawner/human/responseteams/human/elyra.dm
@@ -8,7 +8,7 @@
outfit = /datum/outfit/admin/ert/elyran_trooper
possible_species = list(SPECIES_HUMAN)
- extra_languages = list(LANGUAGE_SOL_COMMON)
+ extra_languages = list(LANGUAGE_ELYRAN_STANDARD)
/datum/ghostspawner/human/ert/elyra/leader
short_name = "elyra_leadertrooper"
diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css
index 79fd9543a48..e43096c05cb 100644
--- a/code/modules/goonchat/browserassets/css/browserOutput.css
+++ b/code/modules/goonchat/browserassets/css/browserOutput.css
@@ -358,6 +358,7 @@ h1.alert, h2.alert {color: #a4bad6;}
.vaurca {color: #b9b943;}
.soghun {color: #2cad2c;}
.solcom {color: #5f5fd4;}
+.elyran {color: #e2bb4e;}
.soghun_alt {color: #1d9b1d;}
.changeling {color: #ad14ad;}
.rough {font-family: "Trebuchet MS", cursive, sans-serif;}
diff --git a/code/modules/goonchat/browserassets/css/browserOutput_white.css b/code/modules/goonchat/browserassets/css/browserOutput_white.css
index 80340a6d81a..5b6f1f6775f 100644
--- a/code/modules/goonchat/browserassets/css/browserOutput_white.css
+++ b/code/modules/goonchat/browserassets/css/browserOutput_white.css
@@ -355,6 +355,7 @@ h1.alert, h2.alert {color: #000080;}
.vaurca {color: #9e9e39;}
.soghun {color: #228B22;}
.solcom {color: #22228B;}
+.elyran {color: #c79322;}
.soghun_alt {color: #024402;}
.changeling {color: #800080;}
.rough {font-family: "Trebuchet MS", cursive, sans-serif;}
diff --git a/code/modules/goonchat/browserassets/css/styles_template.css b/code/modules/goonchat/browserassets/css/styles_template.css
index 2a13df5ddbe..3ab0a06ebca 100644
--- a/code/modules/goonchat/browserassets/css/styles_template.css
+++ b/code/modules/goonchat/browserassets/css/styles_template.css
@@ -325,6 +325,7 @@ h1.alert, h2.alert {color: #000080;}
.vaurca {color: #9e9e39;}
.soghun {color: #228B22;}
.solcom {color: #22228B;}
+.elyran {color: #c79322;}
.soghun_alt {color: #024402;}
.changeling {color: #800080;}
.rough {font-family: "Trebuchet MS", cursive, sans-serif;}
diff --git a/code/modules/mob/abstract/new_player/sprite_accessories.dm b/code/modules/mob/abstract/new_player/sprite_accessories.dm
index 147428d82b4..0ef14c891dd 100644
--- a/code/modules/mob/abstract/new_player/sprite_accessories.dm
+++ b/code/modules/mob/abstract/new_player/sprite_accessories.dm
@@ -4313,12 +4313,17 @@ Follow by example and make good judgement based on length which list to include
body_parts = list(BP_CHEST)
species_allowed = list(/datum/species/human, /datum/species/human/offworlder, /datum/species/diona, /datum/species/diona/coeu, /datum/species/machine/shell, /datum/species/skrell, /datum/species/skrell/axiori, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi)
- tat_heart
- name = "Tattoo (Heart, Chest)"
- icon_state = "tat_heart"
- body_parts = list(BP_CHEST)
+ tat_heart_arm
+ name = "Tattoo (Heart, Left Arm)"
+ icon_state = "tat_lheart"
+ body_parts = list(BP_L_ARM)
species_allowed = list(/datum/species/human, /datum/species/diona, /datum/species/diona/coeu, /datum/species/machine/shell, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi)
+ right
+ name = "Tattoo (Heart, Right Arm)"
+ icon_state = "tat_rheart"
+ body_parts = list(BP_R_ARM)
+
tat_heart_back
name = "Tattoo (Heart, Lower Back)"
icon_state = "tat_heartback"
@@ -4560,6 +4565,7 @@ Follow by example and make good judgement based on length which list to include
skr_tears
name = "Tear Stains"
+ icon = 'icons/mob/human_races/markings_skrell.dmi'
icon_state = "skr_tears"
body_parts = list(BP_HEAD)
species_allowed = list(/datum/species/skrell,/datum/species/skrell/axiori,/datum/species/zombie/skrell)
@@ -4567,6 +4573,7 @@ Follow by example and make good judgement based on length which list to include
skr_axiori_eyes
name = "Axiori Eyes"
+ icon = 'icons/mob/human_races/markings_skrell.dmi'
icon_state = "skr_axiori_eyes"
body_parts = list(BP_HEAD)
species_allowed = list(/datum/species/skrell, /datum/species/zombie/skrell,/datum/species/zombie/skrell)
@@ -4574,7 +4581,8 @@ Follow by example and make good judgement based on length which list to include
skr_arms
name = "Skrell Arms"
- icon_state = "skrell_arms"
+ icon = 'icons/mob/human_races/markings_skrell.dmi'
+ icon_state = "skr_arms"
body_parts = list(BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND)
species_allowed = list(/datum/species/skrell,/datum/species/skrell/axiori,/datum/species/zombie/skrell)
@@ -4603,7 +4611,7 @@ Follow by example and make good judgement based on length which list to include
name = "Skrell Stomach"
icon = 'icons/mob/human_races/markings_skrell.dmi'
icon_state = "skr_stomach"
- body_parts = list(BP_CHEST)
+ body_parts = list(BP_CHEST, BP_GROIN)
species_allowed = list(/datum/species/skrell,/datum/species/skrell/axiori,/datum/species/zombie/skrell)
skr_chin
diff --git a/code/modules/mob/language/generic.dm b/code/modules/mob/language/generic.dm
index 7be04cc94c5..1ffaa0e37eb 100644
--- a/code/modules/mob/language/generic.dm
+++ b/code/modules/mob/language/generic.dm
@@ -80,7 +80,7 @@
signlang_verb = list("signs", "gestures")
sing_verb = null
colour = "i"
- key = "4"
+ key = "s"
flags = NO_STUTTER|SIGNLANG
// Helper
diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm
index 7f29cdaf67d..ccfe8622661 100644
--- a/code/modules/mob/language/station.dm
+++ b/code/modules/mob/language/station.dm
@@ -298,6 +298,20 @@
else
return ..()
+//Placeholder stuff for now, a lot of it
+/datum/language/elyran
+ name = LANGUAGE_ELYRAN_STANDARD
+ short = "ELY"
+ desc = "Elyran Standard is the official tongue of the Republic of Elyra. Constructed using elements of Farsi, Arabic, and Turkish, influence from all three of these languages can be seen throughout its grammar and vocabulary."
+ colour = "elyran"
+ written_style = "elyranstandard"
+ key = "4"
+ flags = WHITELISTED | TCOMSSIM
+ syllables = list("af", "if", "ba", "ta", "tha", "id", "jem", "ha", "kha", "dal", "dhl", "ra", "zay", "sen", "um", "shn", "sid", "ad", "ta", "za", "ayn", "gha", "zir", "yn", "fa", "qaf", "iam", "mim", "al", "ja", "non", "ha", "waw", "ya",
+ "hem", "zah", "hml", "ks", "ini", "da", "ks", "iga", "ih", "la", "ulf", "xe", "ayw", "sit", "ah", "aarah", "jalaa", "sirt", "kurt", "turhk", "ust", "irk", "kir", "mir", "ach", "oglu", "bolu", "shek", "she", "ghoz", "miya", "ejdan",
+ "haaz", "quq", "taab", "shanha", "an", "saa", "seh", "an'", "e'", "a'", "em'")
+ allow_accents = TRUE
+
/datum/language/machine
name = LANGUAGE_EAL
short = "EAL"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 003517cdd9d..b2692cf7fa1 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1291,7 +1291,7 @@
update_inv_gloves(1)
germ_level = 0
- gunshot_residue = null
+ LAZYCLEARLIST(gunshot_residue)
if(clean_feet && !shoes)
footprint_color = null
feet_blood_DNA = null
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index e8f1e24542e..79cb756fe8c 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -95,7 +95,7 @@
var/hand_blood_color
var/list/flavor_texts = list()
- var/gunshot_residue
+ var/list/gunshot_residue
var/pulling_punches // Are you trying not to hurt your opponent?
mob_bump_flag = HUMAN
diff --git a/code/modules/mob/living/carbon/human/human_species.dm b/code/modules/mob/living/carbon/human/human_species.dm
index cb4bb5e4765..32f4b6cfdfb 100644
--- a/code/modules/mob/living/carbon/human/human_species.dm
+++ b/code/modules/mob/living/carbon/human/human_species.dm
@@ -244,6 +244,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy/mannequin)
/mob/living/carbon/human/terminator/Initialize(mapload)
. = ..(mapload, SPECIES_IPC_TERMINATOR)
add_language(LANGUAGE_SOL_COMMON, 1)
+ add_language(LANGUAGE_ELYRAN_STANDARD, 1)
add_language(LANGUAGE_UNATHI, 1)
add_language(LANGUAGE_SIIK_MAAS, 1)
add_language(LANGUAGE_SKRELLIAN, 1)
diff --git a/code/modules/mob/living/carbon/human/species/station/human/human.dm b/code/modules/mob/living/carbon/human/species/station/human/human.dm
index 77777140304..b79883b2974 100644
--- a/code/modules/mob/living/carbon/human/species/station/human/human.dm
+++ b/code/modules/mob/living/carbon/human/species/station/human/human.dm
@@ -24,7 +24,7 @@
megacorporations have sparked secretive factions to fight their influence, while there is always the risk of someone digging too \
deep into the secrets of the galaxy..."
num_alternate_languages = 2
- secondary_langs = list(LANGUAGE_SOL_COMMON)
+ secondary_langs = list(LANGUAGE_SOL_COMMON, LANGUAGE_ELYRAN_STANDARD)
name_language = null // Use the first-name last-name generator rather than a language scrambler
mob_size = 9
spawn_flags = CAN_JOIN
diff --git a/code/modules/mob/living/carbon/human/species/station/skrell/skrell.dm b/code/modules/mob/living/carbon/human/species/station/skrell/skrell.dm
index 28600ad9cc4..b0d4f615800 100644
--- a/code/modules/mob/living/carbon/human/species/station/skrell/skrell.dm
+++ b/code/modules/mob/living/carbon/human/species/station/skrell/skrell.dm
@@ -83,13 +83,13 @@
default_h_style = "Skrell Short Tentacles"
- allowed_citizenships = list(CITIZENSHIP_JARGON, CITIZENSHIP_BIESEL, CITIZENSHIP_SOL, CITIZENSHIP_COALITION, CITIZENSHIP_ELYRA, CITIZENSHIP_ERIDANI)
+ allowed_citizenships = list(CITIZENSHIP_JARGON, CITIZENSHIP_BIESEL, CITIZENSHIP_SOL, CITIZENSHIP_COALITION, CITIZENSHIP_ERIDANI)
allowed_religions = list(RELIGION_QEBLAK, RELIGION_WEISHII, RELIGION_SUURKA, RELIGION_KIRGUL, RELIGION_NONE, RELIGION_OTHER)
default_citizenship = CITIZENSHIP_JARGON
default_accent = ACCENT_SKRELL
allowed_accents = list(ACCENT_SKRELL, ACCENT_HOMEWORLD, ACCENT_QERRMALIC, ACCENT_ALIOSE, ACCENT_AWEIJI, ACCENT_TRAVERSE, ACCENT_CETI, ACCENT_GIBSON, ACCENT_COC, ACCENT_ERIDANI,
- ACCENT_ERIDANIDREG, ACCENT_VENUS, ACCENT_JUPITER, ACCENT_MARTIAN, ACCENT_ELYRA, ACCENT_SILVERSUN_EXPATRIATE, ACCENT_EUROPA, ACCENT_VALKYRIE, ACCENT_MICTLAN)
+ ACCENT_ERIDANIDREG, ACCENT_VENUS, ACCENT_JUPITER, ACCENT_MARTIAN, ACCENT_SILVERSUN_EXPATRIATE, ACCENT_EUROPA, ACCENT_VALKYRIE, ACCENT_MICTLAN)
zombie_type = SPECIES_ZOMBIE_SKRELL
bodyfall_sound = /decl/sound_category/bodyfall_skrell_sound
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 042b541d337..12b3bdb1972 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -158,6 +158,7 @@ var/list/ai_verbs_default = list(
add_language(LANGUAGE_ROBOT, TRUE)
add_language(LANGUAGE_TCB, TRUE)
add_language(LANGUAGE_SOL_COMMON, FALSE)
+ add_language(LANGUAGE_ELYRAN_STANDARD, FALSE)
add_language(LANGUAGE_UNATHI, FALSE)
add_language(LANGUAGE_SIIK_MAAS, FALSE)
add_language(LANGUAGE_SKRELLIAN, FALSE)
diff --git a/code/modules/mob/living/silicon/ai/ai_remote_control.dm b/code/modules/mob/living/silicon/ai/ai_remote_control.dm
index 65124885cad..d4c0eeda6b0 100644
--- a/code/modules/mob/living/silicon/ai/ai_remote_control.dm
+++ b/code/modules/mob/living/silicon/ai/ai_remote_control.dm
@@ -4,6 +4,7 @@
networks = list(NETWORK_COMMAND)
languages = list(
LANGUAGE_SOL_COMMON = TRUE,
+ LANGUAGE_ELYRAN_STANDARD = TRUE,
LANGUAGE_TRADEBAND = TRUE,
LANGUAGE_UNATHI = TRUE,
LANGUAGE_SIIK_MAAS = TRUE,
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 1480e4a95f0..366b9e520a4 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -174,6 +174,7 @@
//Default languages without universal translator software
add_language(LANGUAGE_SOL_COMMON, 1)
+ add_language(LANGUAGE_ELYRAN_STANDARD, 1)
add_language(LANGUAGE_TRADEBAND, 1)
add_language(LANGUAGE_GUTTER, 1)
add_language(LANGUAGE_EAL, 1)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 82bbd772f88..eaacf5d79d0 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -22,6 +22,7 @@ var/global/list/robot_modules = list(
var/networks = list()
var/languages = list( //Any listed language will be understandable. Any set to TRUE will be speakable
LANGUAGE_SOL_COMMON = TRUE,
+ LANGUAGE_ELYRAN_STANDARD = TRUE,
LANGUAGE_TRADEBAND = TRUE,
LANGUAGE_UNATHI = FALSE,
LANGUAGE_SIIK_MAAS = FALSE,
@@ -608,6 +609,7 @@ var/global/list/robot_modules = list(
networks = list(NETWORK_SERVICE)
languages = list(
LANGUAGE_SOL_COMMON = TRUE,
+ LANGUAGE_ELYRAN_STANDARD = TRUE,
LANGUAGE_TRADEBAND = TRUE,
LANGUAGE_UNATHI = TRUE,
LANGUAGE_SIIK_MAAS = TRUE,
@@ -839,6 +841,7 @@ var/global/list/robot_modules = list(
name = "syndicate robot module"
languages = list(
LANGUAGE_SOL_COMMON = TRUE,
+ LANGUAGE_ELYRAN_STANDARD = TRUE,
LANGUAGE_TRADEBAND = TRUE,
LANGUAGE_UNATHI = TRUE,
LANGUAGE_SIIK_MAAS = TRUE,
@@ -1084,6 +1087,7 @@ var/global/list/robot_modules = list(
name = "bluespace robot module"
languages = list(
LANGUAGE_TCB = TRUE,
+ LANGUAGE_ELYRAN_STANDARD = TRUE,
LANGUAGE_GUTTER = TRUE,
LANGUAGE_SIGN = TRUE,
LANGUAGE_TRADEBAND = TRUE,
diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm
index c7371e4d1e7..bc00197f216 100644
--- a/code/modules/paperwork/filingcabinet.dm
+++ b/code/modules/paperwork/filingcabinet.dm
@@ -33,7 +33,8 @@
/obj/item/clothing/accessory/badge,
/obj/item/pack,
/obj/item/hand,
- /obj/item/key
+ /obj/item/key,
+ /obj/item/paper_scanner
)
diff --git a/code/modules/power/batteryrack.dm b/code/modules/power/batteryrack.dm
index 9480a1a7d73..d782a38fe6c 100644
--- a/code/modules/power/batteryrack.dm
+++ b/code/modules/power/batteryrack.dm
@@ -34,20 +34,6 @@
cells_amount++
capacity = C * 40 //Basic cells are such crap. Hyper cells needed to get on normal SMES levels.
-
-/obj/machinery/power/smes/batteryrack/update_icon()
- cut_overlays()
- if(stat & BROKEN) return
-
- if (output_attempt)
- add_overlay("gsmes_outputting")
- if(inputting)
- add_overlay("gsmes_charging")
-
- var/clevel = chargedisplay()
- if(clevel>0)
- add_overlay("gsmes_og[clevel]")
-
/obj/machinery/power/smes/batteryrack/chargedisplay()
return round(4 * charge/(capacity ? capacity : 5e6))
@@ -100,19 +86,10 @@
)
/obj/machinery/power/smes/batteryrack/makeshift/update_icon()
- cut_overlays()
- if(stat & BROKEN) return
-
- if (output_attempt)
- add_overlay("gsmes_outputting")
- if(inputting)
- add_overlay("gsmes_charging")
- if (overcharge_percent > 100)
- add_overlay("gsmes_overcharge")
- else
- var/clevel = chargedisplay()
- if(clevel>0)
- add_overlay("gsmes_og[clevel]")
+ .=..()
+ if(overcharge_percent > 100)
+ cut_overlays()
+ add_overlay("smes-crit")
//This mess of if-elses and magic numbers handles what happens if the engies don't pay attention and let it eat too much charge
//What happens depends on how much capacity has the ghetto smes and how much it is overcharged.
diff --git a/code/modules/power/breaker_box.dm b/code/modules/power/breaker_box.dm
index 91d644d99c8..7b5abf41491 100644
--- a/code/modules/power/breaker_box.dm
+++ b/code/modules/power/breaker_box.dm
@@ -10,8 +10,6 @@
icon = 'icons/obj/power.dmi'
icon_state = "bbox_off"
//directwired = 0
- var/icon_state_on = "bbox_on"
- var/icon_state_off = "bbox_off"
density = 1
anchored = 1
var/on = 0
@@ -24,6 +22,9 @@
LAZYADD(SSpower.breaker_boxes, src)
return ..()
+/obj/machinery/power/breakerbox/update_icon()
+ icon_state = "bbox_[on ? "on" : "off"]"
+
/obj/machinery/power/breakerbox/Destroy()
LAZYREMOVE(SSpower.breaker_boxes, src)
SSmachinery.queue_rcon_update()
@@ -40,29 +41,30 @@
/obj/machinery/power/breakerbox/activated/LateInitialize()
set_state(1)
+>>>>>>> master
/obj/machinery/power/breakerbox/examine(mob/user)
..()
if(on)
- to_chat(user, "It seems to be online.")
+ to_chat(user, SPAN_GOOD("It seems to be online."))
else
- to_chat(user, "It seems to be offline.")
+ to_chat(user, SPAN_BAD("It seems to be offline."))
/obj/machinery/power/breakerbox/attack_ai(mob/user)
if(!ai_can_interact(user))
return
if(update_locked)
- to_chat(user, "System locked. Please try again later.")
+ to_chat(user, SPAN_BAD("System locked. Please try again later."))
return
if(busy)
- to_chat(user, "System is busy. Please wait until current operation is finished before changing power settings.")
+ to_chat(user, SPAN_BAD("System is busy. Please wait until current operation is finished before changing power settings."))
return
busy = 1
- to_chat(user, "Updating power settings..")
+ to_chat(user, SPAN_GOOD("Updating power settings..."))
if(do_after(user, 50))
set_state(!on)
- to_chat(user, "Update Completed. New setting:[on ? "on": "off"]")
+ to_chat(user, SPAN_GOOD("Update Completed. New setting:[on ? "on": "off"]"))
update_locked = 1
addtimer(CALLBACK(src, .proc/reset_locked), 600)
busy = 0
@@ -73,22 +75,21 @@
/obj/machinery/power/breakerbox/attack_hand(mob/user)
if(update_locked)
- to_chat(user, "System locked. Please try again later.")
+ to_chat(user, SPAN_BAD("System locked. Please try again later."))
return
if(busy)
- to_chat(user, "System is busy. Please wait until current operation is finished before changing power settings.")
+ to_chat(user, SPAN_BAD("System is busy. Please wait until current operation is finished before changing power settings."))
return
busy = 1
for(var/mob/O in viewers(user))
- O.show_message(text("[user] started reprogramming [src]!"), 1)
+ O.show_message(SPAN_WARNING("[user] started reprogramming [src]!"), 1)
if(do_after(user, 50))
set_state(!on)
- user.visible_message(\
- "[user.name] [on ? "enabled" : "disabled"] the breaker box!",\
- "You [on ? "enabled" : "disabled"] the breaker box!")
+ user.visible_message(SPAN_NOTICE("[user.name] [on ? "enabled" : "disabled"] the breaker box!"), \
+ SPAN_NOTICE("You [on ? "enabled" : "disabled"] the breaker box!"))
update_locked = 1
addtimer(CALLBACK(src, .proc/reset_locked), 600)
busy = 0
@@ -98,13 +99,13 @@
var/newtag = input(user, "Enter new RCON tag. Use \"NO_TAG\" to disable RCON or leave empty to cancel.", "SMES RCON system") as text
if(newtag)
RCon_tag = newtag
- to_chat(user, "You changed the RCON tag to: [newtag]")
+ to_chat(user, SPAN_NOTICE("You changed the RCON tag to: [newtag]"))
SSmachinery.queue_rcon_update()
/obj/machinery/power/breakerbox/proc/set_state(var/state)
on = state
+ update_icon()
if(on)
- icon_state = icon_state_on
var/list/connection_dirs = list()
for(var/direction in directions)
for(var/obj/structure/cable/C in get_step(src,direction))
@@ -129,7 +130,6 @@
C.mergeDiagonalsNetworks(C.d2)
else
- icon_state = icon_state_off
for(var/obj/structure/cable/C in src.loc)
qdel(C)
@@ -139,3 +139,11 @@
set_state(!on)
update_locked = 1
addtimer(CALLBACK(src, .proc/reset_locked), 600)
+
+/obj/machinery/power/breakerbox/activated
+ icon_state = "bbox_on"
+
+ // Enabled on server startup. Used in substations to keep them in bypass mode.
+/obj/machinery/power/breakerbox/activated/Initialize()
+ . = ..()
+ set_state(1)
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index 1ccb8377f09..059c0a12403 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -3,7 +3,8 @@
name = "Placeholder Generator" //seriously, don't use this. It can't be anchored without VV magic.
desc = "A portable generator for emergency backup power"
icon = 'icons/obj/power.dmi'
- icon_state = "portgen0"
+ icon_state = "portgen0_0"
+ var/base_icon = "portgen0"
density = TRUE
anchored = FALSE
@@ -57,6 +58,10 @@
soundloop.start()
return
+/obj/machinery/power/port_gen/update_icon()
+ icon_state = "[base_icon]_[active]"
+ return ..()
+
/obj/machinery/power/port_gen/examine(mob/user)
if(!..(user, 1))
return
@@ -369,11 +374,11 @@
if(href_list["action"] == "enable")
if(!active && HasFuel() && !IsBroken())
active = TRUE
- icon_state = "portgen1"
+ update_icon()
if(href_list["action"] == "disable")
if (active)
active = FALSE
- icon_state = "portgen0"
+ update_icon()
if(href_list["action"] == "eject")
if(!active)
DropFuel()
@@ -388,7 +393,8 @@
/obj/machinery/power/port_gen/pacman/super
name = "S.U.P.E.R.P.A.C.M.A.N.-type Portable Generator"
desc = "A power generator that utilizes uranium sheets as fuel. Can run for much longer than the standard PACMAN type generators. Rated for 80 kW max safe output."
- icon_state = "portgen1"
+ icon_state = "portgen1_0"
+ base_icon = "portgen1"
sheet_path = /obj/item/stack/material/uranium
sheet_name = "Uranium Sheets"
time_per_sheet = 576 //same power output, but a 50 sheet stack will last 2 hours at max safe power
@@ -415,7 +421,8 @@
/obj/machinery/power/port_gen/pacman/mrs
name = "M.R.S.P.A.C.M.A.N.-type Portable Generator"
desc = "An advanced power generator that runs on tritium. Rated for 200 kW maximum safe output!"
- icon_state = "portgen2"
+ icon_state = "portgen2_0"
+ base_icon = "portgen2"
sheet_path = /obj/item/stack/material/tritium
sheet_name = "Tritium Fuel Sheets"
diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm
index bbf9d83ab52..e87f9c49705 100644
--- a/code/modules/power/smes_construction.dm
+++ b/code/modules/power/smes_construction.dm
@@ -329,9 +329,10 @@
// Parameters: None
// Description: Allows us to use special icon overlay for critical SMESs
/obj/machinery/power/smes/buildable/update_icon()
- if (failing)
+ if(failing)
cut_overlays()
add_overlay("smes-crit")
+ add_overlay("smes-crit_screen")
else
..()
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index 7bd1e49757b..a16f8309807 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -101,10 +101,10 @@
var/mob/living/carbon/human/H = loc
if(istype(H))
if(!istype(H.gloves, /obj/item/clothing))
- H.gunshot_residue = chambered.caliber
+ LAZYDISTINCTADD(H.gunshot_residue, chambered.caliber)
else
var/obj/item/clothing/G = H.gloves
- G.gunshot_residue = chambered.caliber
+ LAZYDISTINCTADD(G.gunshot_residue, chambered.caliber)
switch(handle_casings)
if(DELETE_CASINGS)
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 942e15511b1..43c653a0a67 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -256,6 +256,13 @@
can_tamper = FALSE
reagents_to_add = list(/decl/reagent/acid = 1000)
+/obj/structure/reagent_dispensers/peppertank/luminol
+ name = "luminol dispenser"
+ desc = "A dispenser to refill luminol bottles."
+ icon_state = "luminoltank"
+ amount_per_transfer_from_this = 50
+ reagents_to_add = list(/decl/reagent/luminol = 1000)
+
//Water Cooler
/obj/structure/reagent_dispensers/water_cooler
diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm
index 1bd09ceba4b..012ad27db45 100644
--- a/code/modules/scripting/Implementations/Telecomms.dm
+++ b/code/modules/scripting/Implementations/Telecomms.dm
@@ -63,7 +63,8 @@
//Language macros
interpreter.SetVar("L_BASIC", LANGUAGE_TCB)
- interpreter.SetVar("L_SOL", LANGUAGE_SOL_COMMON)
+ interpreter.SetVar("L_SOL", LANGUAGE_SOL_COMMON)
+ interpreter.SetVar("L_ELYRAN", LANGUAGE_ELYRAN_STANDARD)
interpreter.SetVar("L_TRADE", LANGUAGE_TRADEBAND)
interpreter.SetVar("L_GUTTER", LANGUAGE_GUTTER)
interpreter.SetVar("L_MAAS", LANGUAGE_SIIK_MAAS)
diff --git a/code/stylesheet.dm b/code/stylesheet.dm
index 82ed522058e..9b17771c5a7 100644
--- a/code/stylesheet.dm
+++ b/code/stylesheet.dm
@@ -98,6 +98,7 @@ h1.alert, h2.alert {color: #000000;}
.vaurca {color: #9e9e39;}
.soghun {color: #228B22;}
.solcom {color: #22228B;}
+.elyran {color: #c79322;}
.soghun_alt {color: #024402;}
.changeling {color: #800080;}
.rough {font-family: "Trebuchet MS", cursive, sans-serif;}
diff --git a/html/browser/paper_languages.css b/html/browser/paper_languages.css
index c0dd598c3f5..1c7c426e332 100644
--- a/html/browser/paper_languages.css
+++ b/html/browser/paper_languages.css
@@ -33,6 +33,9 @@
.solcommon.understood { font-family: mo5v56; }
.solcommon.scramble { font-family: ducados; }
+.elyranstandard.understood {font-family: gelasio; }
+.elyranstandard.scramble {font-family: mo5v56; }
+
.tradeband.understood { font-family: gelasio; }
.tradeband.scramble { font-family: gelasio; }
diff --git a/html/changelog.html b/html/changelog.html
index 46daac086b6..3c232715c3d 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -35,6 +35,60 @@
-->
+
17 January 2022
+
Geeves updated:
+
+ - Fixed a bug where faction overrides caused certain occupations to runtime when creating their outfits.
+
+
Omicega updated:
+
+ - Added the new language Elyran Standard, selectable by humans and IPCs. Its language key is ,4.
+ - Moves the Sign Language language key to ,s from ,4.
+
+
TheGreyWolf updated:
+
+ - Fingerprint & fiber reports now show all source locations, even when combined and doors will have the door's name attached.
+ - Added the ability to rename fingerprint cards & fiber bags.
+ - Changed the layout of the various forensic machine reports.
+ - Each report from the forensic machines are now numbered per evidence type (fiber, fingerprint, GSR, DNA) rather than combined amount of reports.
+ - Gunshot residue now shows all residue on something rather than only the most recent.
+
+
+
16 January 2022
+
Omicega updated:
+
+ - Removed Elyran citizenship and accent choices from Skrell.
+
+
TheGreyWolf updated:
+
+ - Business cards no longer change color when copied in a photocopier.
+ - Photocopiers toner now gets used correctly.
+ - The sinta hood now fits in the ear slot.
+ - The vial box in the forensic lab can now be locked by swiping an id card with forensic access.
+ - Added a syringe and vial to autopsy trays.
+ - Paper scanners now fit in filing cabinets.
+ - The forensic lab and investigations office now have luminol refillers.
+ - Fixes vial box sprites.
+ - The investigation lab ringers now clearly indicates the call comes from there when a pda is linked.
+ - Autopsy now has a second bodybag box.
+ - Re-arranged some equipment in the forensic lab and added a closet.
+ - The investigations office now has a button to open the door.
+ - Replaced one of the three no smoking signs in the security reception with a notice board.
+ - The forensic lab doors now permits anyone to leave regardless of access.
+
+
Wowzewow (Wezzy) updated:
+
+ - Updates sprites for APCs, SMES, Battery racks, Breaker boxes, Power cells and their chargers.
+
+
listerla updated:
+
+ - Punk Shave, Half-Shaved Bun is no longer one pixel too low on the right facing sprite.
+ - Added left and right arm heart tattoos. Credit for sprite goes to KasparoVy.
+ - Fixed Skrell stomach marking, removed nonexistent heart tattoo marking.
+ - Warding sphere sheath animation no longer makes the entire sprite relocate downwards.
+ - Dominian citizenship selection blurb now uses far more recent lore, rather than a several year old outdated one.
+
+
12 January 2022
Dekser updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 9e777454039..8124177889c 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -22364,3 +22364,53 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- tweak: Slightly altered the Unathi brain sprite.
- rscdel: Removed the Skrells appendix for the simple reason that Skrell and Humans
evolved separately and shouldn't share an exact same useless organ.
+2022-01-16:
+ Omicega:
+ - tweak: Removed Elyran citizenship and accent choices from Skrell.
+ TheGreyWolf:
+ - tweak: Business cards no longer change color when copied in a photocopier.
+ - bugfix: Photocopiers toner now gets used correctly.
+ - rscadd: The sinta hood now fits in the ear slot.
+ - rscadd: The vial box in the forensic lab can now be locked by swiping an id card
+ with forensic access.
+ - rscadd: Added a syringe and vial to autopsy trays.
+ - rscadd: Paper scanners now fit in filing cabinets.
+ - rscadd: The forensic lab and investigations office now have luminol refillers.
+ - bugfix: Fixes vial box sprites.
+ - bugfix: The investigation lab ringers now clearly indicates the call comes from
+ there when a pda is linked.
+ - maptweak: Autopsy now has a second bodybag box.
+ - maptweak: Re-arranged some equipment in the forensic lab and added a closet.
+ - maptweak: The investigations office now has a button to open the door.
+ - maptweak: Replaced one of the three no smoking signs in the security reception
+ with a notice board.
+ - maptweak: The forensic lab doors now permits anyone to leave regardless of access.
+ Wowzewow (Wezzy):
+ - imageadd: Updates sprites for APCs, SMES, Battery racks, Breaker boxes, Power
+ cells and their chargers.
+ listerla:
+ - bugfix: Punk Shave, Half-Shaved Bun is no longer one pixel too low on the right
+ facing sprite.
+ - imageadd: Added left and right arm heart tattoos. Credit for sprite goes to KasparoVy.
+ - bugfix: Fixed Skrell stomach marking, removed nonexistent heart tattoo marking.
+ - bugfix: Warding sphere sheath animation no longer makes the entire sprite relocate
+ downwards.
+ - tweak: Dominian citizenship selection blurb now uses far more recent lore, rather
+ than a several year old outdated one.
+2022-01-17:
+ Geeves:
+ - bugfix: Fixed a bug where faction overrides caused certain occupations to runtime
+ when creating their outfits.
+ Omicega:
+ - rscadd: Added the new language Elyran Standard, selectable by humans and IPCs.
+ Its language key is ,4.
+ - tweak: Moves the Sign Language language key to ,s from ,4.
+ TheGreyWolf:
+ - rscadd: Fingerprint & fiber reports now show all source locations, even when
+ combined and doors will have the door's name attached.
+ - rscadd: Added the ability to rename fingerprint cards & fiber bags.
+ - tweak: Changed the layout of the various forensic machine reports.
+ - tweak: Each report from the forensic machines are now numbered per evidence type
+ (fiber, fingerprint, GSR, DNA) rather than combined amount of reports.
+ - bugfix: Gunshot residue now shows all residue on something rather than only the
+ most recent.
diff --git a/html/changelogs/CopyTweak.yml b/html/changelogs/CopyTweak.yml
deleted file mode 100644
index df7dc08c9fc..00000000000
--- a/html/changelogs/CopyTweak.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: TheGreyWolf
-
-delete-after: True
-
-changes:
- - tweak: "Business cards no longer change color when copied in a photocopier."
- - bugfix: "Photocopiers toner now gets used correctly."
diff --git a/html/changelogs/Markings.yml b/html/changelogs/Markings.yml
new file mode 100644
index 00000000000..59bb46f4acf
--- /dev/null
+++ b/html/changelogs/Markings.yml
@@ -0,0 +1,3 @@
+Delete-after: true
+author: listerla
+changes: []
diff --git a/html/changelogs/PunkBunFix.yml b/html/changelogs/PunkBunFix.yml
deleted file mode 100644
index fa851accbc5..00000000000
--- a/html/changelogs/PunkBunFix.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: listerla
-
-delete-after: True
-
-changes:
- - bugfix: "Punk Shave, Half-Shaved Bun is no longer one pixel too low on the right facing sprite."
\ No newline at end of file
diff --git a/html/changelogs/WardingSphere.yml b/html/changelogs/WardingSphere.yml
deleted file mode 100644
index 9700aef5114..00000000000
--- a/html/changelogs/WardingSphere.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: listerla
-
-delete-after: True
-
-changes:
- - bugfix: "Warding sphere sheath animation no longer makes the entire sprite relocate downwards."
-
diff --git a/icons/mob/human_races/markings.dmi b/icons/mob/human_races/markings.dmi
index c91051c67a0..fdd9ac14ade 100644
Binary files a/icons/mob/human_races/markings.dmi and b/icons/mob/human_races/markings.dmi differ
diff --git a/icons/mob/human_races/markings_skrell.dmi b/icons/mob/human_races/markings_skrell.dmi
index 7fa8cbd81af..85836529e9a 100644
Binary files a/icons/mob/human_races/markings_skrell.dmi and b/icons/mob/human_races/markings_skrell.dmi differ
diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi
index 8fe4b044afb..aaf2e3bee7f 100644
Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ
diff --git a/icons/obj/reagent_dispensers.dmi b/icons/obj/reagent_dispensers.dmi
index 55ea0ed3c2f..1ccd8cdfab7 100644
Binary files a/icons/obj/reagent_dispensers.dmi and b/icons/obj/reagent_dispensers.dmi differ
diff --git a/icons/obj/unathi_items.dmi b/icons/obj/unathi_items.dmi
index adaad24fef0..6fb2f704a9e 100644
Binary files a/icons/obj/unathi_items.dmi and b/icons/obj/unathi_items.dmi differ
diff --git a/icons/obj/vialbox.dmi b/icons/obj/vialbox.dmi
index c08b5cfeabb..15195a708c2 100644
Binary files a/icons/obj/vialbox.dmi and b/icons/obj/vialbox.dmi differ
diff --git a/maps/aurora/aurora-4_mainlevel.dmm b/maps/aurora/aurora-4_mainlevel.dmm
index c7aafd7905c..de3cc6526b8 100644
--- a/maps/aurora/aurora-4_mainlevel.dmm
+++ b/maps/aurora/aurora-4_mainlevel.dmm
@@ -393,14 +393,10 @@
"aaU" = (
/obj/effect/floor_decal/corner/beige/diagonal,
/obj/structure/table/glass,
-/obj/item/reagent_containers/glass/beaker/large,
/obj/machinery/camera/network/security{
c_tag = "Security - Forensics Lab Port";
dir = 4
},
-/obj/item/storage/box/folders/blue{
- pixel_y = 15
- },
/turf/simulated/floor/tiled/white,
/area/security/forensics_laboratory)
"aaV" = (
@@ -448,11 +444,10 @@
pixel_x = -3;
pixel_y = 7
},
-/obj/item/pen{
- pixel_x = 5;
- pixel_y = 5
- },
/obj/item/pen/red,
+/obj/item/pen{
+ pixel_x = -4
+ },
/turf/simulated/floor/tiled/white,
/area/security/forensics_laboratory)
"abc" = (
@@ -462,11 +457,16 @@
/area/security/forensics_laboratory)
"abd" = (
/obj/effect/floor_decal/corner/beige/diagonal,
-/obj/structure/table/glass,
+/obj/structure/closet{
+ name = "Forensic Closet"
+ },
+/obj/item/storage/box/swabs,
+/obj/item/storage/box/folders/blue,
/obj/item/reagent_containers/spray/cleaner{
pixel_x = 2;
pixel_y = 4
},
+/obj/item/storage/box/evidence,
/turf/simulated/floor/tiled/white,
/area/security/forensics_laboratory)
"abe" = (
@@ -701,6 +701,9 @@
name = "Forensic Laboratory";
req_access = list(4)
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 8
+ },
/turf/simulated/floor/tiled,
/area/security/forensics_laboratory)
"abE" = (
@@ -963,8 +966,8 @@
},
/obj/machinery/ringer_button{
id = "investigation_ringer";
- pixel_x = 5;
- pixel_y = 5
+ pixel_x = 6;
+ pixel_y = 6
},
/turf/simulated/floor/tiled,
/area/security/forensics_laboratory)
@@ -1338,6 +1341,9 @@
name = "Forensic Laboratory";
req_access = list(4)
},
+/obj/effect/map_effect/door_helper/unres{
+ dir = 8
+ },
/turf/simulated/floor/tiled,
/area/security/forensics_laboratory)
"acQ" = (
@@ -3256,12 +3262,13 @@
"agu" = (
/obj/structure/table/standard,
/obj/item/storage/box/bodybags,
-/obj/item/device/healthanalyzer,
/obj/machinery/requests_console{
department = "Autopsy";
departmentType = 5;
pixel_x = -32
},
+/obj/item/storage/box/bodybags,
+/obj/item/device/healthanalyzer,
/turf/simulated/floor/tiled{
name = "cooled floor";
temperature = 278
@@ -3981,7 +3988,7 @@
},
/obj/item/pen/red,
/obj/machinery/ringer{
- department = "Security";
+ department = "Forensic Lab";
id = "investigation_ringer";
pixel_x = -30;
req_access = list(1)
@@ -21620,13 +21627,15 @@
/obj/effect/floor_decal/corner/blue{
dir = 6
},
-/obj/structure/sign/nosmoking_2{
- pixel_x = 32
- },
/obj/machinery/disposal,
/obj/structure/disposalpipe/trunk{
dir = 8
},
+/obj/structure/noticeboard{
+ layer = 3.3;
+ pixel_x = 32;
+ pixel_y = 2
+ },
/turf/simulated/floor/tiled,
/area/security/brig/control_room)
"aLF" = (
@@ -60443,6 +60452,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/structure/disposalpipe/segment,
/obj/machinery/door/airlock/security{
+ id_tag = "investdoor";
name = "Investigations Office";
req_access = list(4)
},
@@ -64939,6 +64949,7 @@
/obj/machinery/firealarm/north,
/obj/structure/table/standard,
/obj/item/paper_scanner,
+/obj/item/paper_scanner,
/turf/simulated/floor/tiled/dark,
/area/security/forensics_office{
name = "Security - Investigations Office"
@@ -65527,7 +65538,7 @@
dir = 1
},
/obj/machinery/ringer{
- department = "Security";
+ department = "Forensic Lab";
id = "investigation_ringer";
pixel_y = 30;
req_access = list(1)
@@ -65763,7 +65774,7 @@
"phk" = (
/obj/effect/floor_decal/corner/beige/diagonal,
/obj/machinery/ringer{
- department = "Security";
+ department = "Forensic Lab";
id = "investigation_ringer";
pixel_y = -30;
req_access = list(1)
@@ -66619,6 +66630,9 @@
/area/maintenance/medbay)
"qHy" = (
/obj/structure/coatrack,
+/obj/structure/reagent_dispensers/peppertank/luminol{
+ pixel_x = -31
+ },
/turf/simulated/floor/lino/grey,
/area/security/forensics_office{
name = "Security - Investigations Office"
@@ -67066,7 +67080,7 @@
dir = 4
},
/obj/machinery/ringer{
- department = "Security";
+ department = "Forensic Lab";
id = "investigation_ringer";
pixel_x = 30;
req_access = list(1)
@@ -69425,6 +69439,10 @@
/obj/machinery/light{
dir = 1
},
+/obj/structure/reagent_dispensers/peppertank/luminol{
+ pixel_x = 0;
+ pixel_y = 32
+ },
/turf/simulated/floor/tiled/white,
/area/security/forensics_laboratory)
"vgB" = (
@@ -70583,12 +70601,14 @@
"xcZ" = (
/obj/effect/floor_decal/corner/beige/diagonal,
/obj/structure/table/glass,
-/obj/item/paper_scanner,
/obj/machinery/requests_console{
department = "Forensics Lab";
departmentType = 5;
pixel_y = 30
},
+/obj/item/paper_scanner{
+ pixel_x = -8
+ },
/turf/simulated/floor/tiled/white,
/area/security/forensics_laboratory)
"xdi" = (
@@ -70892,11 +70912,11 @@
"xxd" = (
/obj/effect/floor_decal/corner/beige/diagonal,
/obj/structure/table/glass,
-/obj/item/storage/box/swabs{
- pixel_x = 5;
- pixel_y = 5
+/obj/item/storage/lockbox/vials/forensic,
+/obj/item/reagent_containers/glass/beaker/large{
+ pixel_x = 15;
+ pixel_y = 2
},
-/obj/item/storage/box/fancy/vials,
/turf/simulated/floor/tiled/white,
/area/security/forensics_laboratory)
"xxw" = (
@@ -71341,11 +71361,23 @@
/area/library)
"yiH" = (
/obj/structure/table/standard,
-/obj/item/paper_bin,
-/obj/item/pen,
+/obj/item/paper_bin{
+ pixel_x = 7
+ },
/obj/effect/floor_decal/corner/blue{
dir = 10
},
+/obj/machinery/button/remote/airlock{
+ id = "investdoor";
+ name = "Office Door";
+ pixel_x = -6;
+ pixel_y = 8;
+ req_access = list(4)
+ },
+/obj/item/pen{
+ pixel_x = -4
+ },
+/obj/item/pen/red,
/turf/simulated/floor/tiled/dark,
/area/security/forensics_office{
name = "Security - Investigations Office"