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." 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." 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:" 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:

+ +

Omicega updated:

+ +

TheGreyWolf updated:

+ + +

16 January 2022

+

Omicega updated:

+ +

TheGreyWolf updated:

+ +

Wowzewow (Wezzy) updated:

+ +

listerla updated:

+ +

12 January 2022

Dekser updated: