diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm index 957a690f4f..4e5b6d6dfb 100644 --- a/code/__defines/species_languages.dm +++ b/code/__defines/species_languages.dm @@ -30,7 +30,7 @@ #define LANGUAGE_SOL_COMMON "Sol Common" #define LANGUAGE_UNATHI "Sinta'unathi" #define LANGUAGE_SIIK "Siik" -#define LANGUAGE_SKRELLIAN "Skrellian" +#define LANGUAGE_SKRELLIAN "Common Skrellian" #define LANGUAGE_TRADEBAND "Tradeband" #define LANGUAGE_GUTTER "Gutter" #define LANGUAGE_SIGN "Sign Language" diff --git a/code/datums/autolathe/engineering.dm b/code/datums/autolathe/engineering.dm index ce6b5f07b5..0921806ac0 100644 --- a/code/datums/autolathe/engineering.dm +++ b/code/datums/autolathe/engineering.dm @@ -58,6 +58,10 @@ name = "fax machine electronics" path =/obj/item/weapon/circuitboard/fax +/datum/category_item/autolathe/engineering/papershredder + name = "paper shredder electronics" + path =/obj/item/weapon/circuitboard/papershredder + /datum/category_item/autolathe/engineering/microwave name = "microwave electronics" path =/obj/item/weapon/circuitboard/microwave diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index cd2346a32c..71482abb33 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -49,12 +49,9 @@ datum/track/New(var/title_name, var/audio) /obj/machinery/media/jukebox/New() ..() - component_parts = list() - component_parts += new /obj/item/weapon/stock_parts/capacitor(src) - component_parts += new /obj/item/weapon/stock_parts/console_screen(src) - component_parts += new /obj/item/stack/cable_coil(src, 5) - RefreshParts() + default_apply_parts() wires = new/datum/wires/jukebox(src) + update_icon() /obj/machinery/media/jukebox/Destroy() StopPlaying() @@ -78,6 +75,10 @@ datum/track/New(var/title_name, var/audio) return if(default_deconstruction_crowbar(user, W)) return + if(istype(W, /obj/item/weapon/wirecutters)) + return wires.Interact(user) + if(istype(W, /obj/item/device/multitool)) + return wires.Interact(user) if(istype(W, /obj/item/weapon/wrench)) if(playing) StopPlaying() diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index d3107869ce..b0946bf347 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -283,6 +283,13 @@ Class Procs: return 1 return 0 +/obj/machinery/proc/default_apply_parts() + var/obj/item/weapon/circuitboard/CB = circuit + if(!istype(CB)) + return + CB.apply_default_parts(src) + RefreshParts() + /obj/machinery/proc/default_part_replacement(var/mob/user, var/obj/item/weapon/storage/part_replacer/R) if(!istype(R)) return 0 diff --git a/code/game/objects/items/weapons/circuitboards/circuitboard.dm b/code/game/objects/items/weapons/circuitboards/circuitboard.dm index f17ee1c292..d6cb806586 100644 --- a/code/game/objects/items/weapons/circuitboards/circuitboard.dm +++ b/code/game/objects/items/weapons/circuitboards/circuitboard.dm @@ -35,3 +35,22 @@ if(istype(M, build_path)) return 1 return 0 + +//Should be called from the constructor of any machine to automatically populate the default parts +/obj/item/weapon/circuitboard/proc/apply_default_parts(var/obj/machinery/M) + if(!istype(M)) + return + if(!req_components) + return + M.component_parts = list() + for(var/comp_path in req_components) + var/comp_amt = req_components[comp_path] + if(!comp_amt) + continue + + if(ispath(comp_path, /obj/item/stack)) + M.component_parts += new comp_path(contain_parts ? M : null, comp_amt) + else + for(var/i in 1 to comp_amt) + M.component_parts += new comp_path(contain_parts ? M : null) + return diff --git a/code/game/objects/items/weapons/circuitboards/machinery/papershredder.dm b/code/game/objects/items/weapons/circuitboards/machinery/papershredder.dm new file mode 100644 index 0000000000..ef4575bafb --- /dev/null +++ b/code/game/objects/items/weapons/circuitboards/machinery/papershredder.dm @@ -0,0 +1,13 @@ +#ifndef T_BOARD +#error T_BOARD macro is not defined but we need it! +#endif + +/obj/item/weapon/circuitboard/papershredder + name = T_BOARD("papershredder") + build_path = /obj/machinery/papershredder + board_type = new /datum/frame/frame_types/machine + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + req_components = list( + /obj/item/weapon/stock_parts/motor = 1, + /obj/item/weapon/stock_parts/gear = 2, + /obj/item/weapon/stock_parts/micro_laser = 1) diff --git a/code/modules/mob/language/generic.dm b/code/modules/mob/language/generic.dm index 7df164c821..ce0abbb948 100644 --- a/code/modules/mob/language/generic.dm +++ b/code/modules/mob/language/generic.dm @@ -21,12 +21,12 @@ // 'basic' language; spoken by default. /datum/language/common name = LANGUAGE_GALCOM - desc = "The common galactic tongue." + desc = "The common galactic tongue, engineered for cross-species communication." speech_verb = "says" whisper_verb = "whispers" key = "0" flags = RESTRICTED - syllables = list("blah","blah","blah","bleh","meh","neh","nah","wah") + syllables = list("vol", "zum", "coo","zoo","bi","do","ooz","ite","og","re","si","ite","ish","ar","at","on","ee","east","ma","da", "rim") //TODO flag certain languages to use the mob-type specific say_quote and then get rid of these. /datum/language/common/get_spoken_verb(var/msg_end) diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm index b69c9cca5f..8e2f2987c9 100644 --- a/code/modules/mob/language/station.dm +++ b/code/modules/mob/language/station.dm @@ -72,24 +72,25 @@ /datum/language/skrell name = LANGUAGE_SKRELLIAN - desc = "A melodic and complex language spoken by the Skrell of Qerrbalak. Some of the notes are inaudible to humans." + desc = "A set of warbles and hums, the language itself a complex mesh of both melodic and rhythmic components, exceptionally capable of conveying intent and emotion of the speaker." speech_verb = "warbles" ask_verb = "warbles" - exclaim_verb = "warbles" + exclaim_verb = "sings" + whisper_verb = "hums" colour = "skrell" key = "k" + space_chance = 30 flags = WHITELISTED - syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix","*","!") + syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix","*","!", "'") /datum/language/human name = LANGUAGE_SOL_COMMON - desc = "A bastardized hybrid of informal English and elements of Mandarin Chinese; the common language of the Sol system." + desc = "A bastardized hybrid of many languages, including Chinese, English, French, and more; it is the common language of the Sol system." speech_verb = "says" whisper_verb = "whispers" colour = "solcom" key = "1" flags = WHITELISTED - //syllables are at the bottom of the file /datum/language/human/get_spoken_verb(var/msg_end) @@ -118,7 +119,7 @@ colour = "changeling" key = "6" flags = NO_STUTTER - syllables = list("beep","beep","beep","beep","beep","boop","boop","boop","bop","bop","dee","dee","doo","doo","hiss","hss","buzz","buzz","bzz","ksssh","keey","wurr","wahh","tzzz") + syllables = list("beep","beep","beep","beep","beep","boop","boop","boop","bop","bop","dee","dee","doo","doo","hiss","hss","buzz","buzz","bzz","ksssh","keey","wurr","wahh","tzzz","shh","shk") space_chance = 10 /datum/language/machine/can_speak_special(var/mob/speaker) @@ -155,9 +156,13 @@ /* This list really long, mainly because I can't make up my mind about which mandarin syllables should be removed, and the english syllables had to be duplicated so that there is roughly a 50-50 weighting. + The other 3 languages were duplicated just so they could show occasionally. Sources: http://www.sttmedia.com/syllablefrequency-english + http://www.sttmedia.com/syllablefrequency-spanish + http://www.sttmedia.com/syllablefrequency-russian + http://www.sttmedia.com/syllablefrequency-french http://www.chinahighlights.com/travelguide/learning-chinese/pinyin-syllables.htm */ /datum/language/human/syllables = list( @@ -210,4 +215,31 @@ "al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", "le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", "ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", -"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi") +"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi", +"ah", "be", "bo", "eh", "ep", "et", "ka", "ko", "ha", "he", "ho", "ob", "oh", "op", "oc", "ot", "pa", "pe", "ct", "ta", "te", "to", +"vse", "tak", "nak", "no", "epo", "pre", "kan", "dly", "ime", "sha", "kur", "yey", "khi", "yeg", "ne", +"ion", "ne", "nas", "v", +"ah", "be", "bo", "eh", "ep", "et", "ka", "ko", "ha", "he", "ho", "ob", "oh", "op", "oc", "ot", "pa", "pe", "ct", "ta", "te", "to", +"vse", "tak", "nak", "no", "epo", "pre", "kan", "dly", "ime", "sha", "kur", "yey", "khi", "yeg", "ne", +"ion", "ne", "nas", "v", +"ah", "be", "bo", "eh", "ep", "et", "ka", "ko", "ha", "he", "ho", "ob", "oh", "op", "oc", "ot", "pa", "pe", "ct", "ta", "te", "to", +"vse", "tak", "nak", "no", "epo", "pre", "kan", "dly", "ime", "sha", "kur", "yey", "khi", "yeg", "ne", +"ion", "ne", "nas", "v", +"ai", "an", "ar", "au", "ce", "ch", "co", "de", "em", "en", "er", "es", "et", "eu", "il", "in", "is", "la", "le", +"ma", "me", "ne", "ns", "nt", "on", "ou", "pa", "qu", "ra", "re", "se", "te", "ti", "tr", "ue", "ur", "us", "ve", +"tou", "e", "eve", "hen", "son", "non", "not", "le", +"ai", "an", "ar", "au", "ce", "ch", "co", "de", "em", "en", "er", "es", "et", "eu", "il", "in", "is", "la", "le", +"ma", "me", "ne", "ns", "nt", "on", "ou", "pa", "qu", "ra", "re", "se", "te", "ti", "tr", "ue", "ur", "us", "ve", +"tou", "e", "eve", "hen", "son", "non", "not", "le", +"ai", "an", "ar", "au", "ce", "ch", "co", "de", "em", "en", "er", "es", "et", "eu", "il", "in", "is", "la", "le", +"ma", "me", "ne", "ns", "nt", "on", "ou", "pa", "qu", "ra", "re", "se", "te", "ti", "tr", "ue", "ur", "us", "ve", +"tou", "e", "eve", "hen", "son", "non", "not", "le", +"ad", "al", "an", "ar", "as", "ci", "co", "de", "do", "el", "en", "er", "es", "ie", "in", "la", "lo", "me", "na", +"no", "nt", "or", "os", "pa", "qu", "ra", "re", "ro", "se", "st", "ta", "te", "to", "ue", "un", +"tod", "ser", "su", "no", "nue", "el", +"ad", "al", "an", "ar", "as", "ci", "co", "de", "do", "el", "en", "er", "es", "ie", "in", "la", "lo", "me", "na", +"no", "nt", "or", "os", "pa", "qu", "ra", "re", "ro", "se", "st", "ta", "te", "to", "ue", "un", +"tod", "ser", "su", "no", "nue", "el", +"ad", "al", "an", "ar", "as", "ci", "co", "de", "do", "el", "en", "er", "es", "ie", "in", "la", "lo", "me", "na", +"no", "nt", "or", "os", "pa", "qu", "ra", "re", "ro", "se", "st", "ta", "te", "to", "ue", "un", +"tod", "ser", "su", "no", "nue", "el") \ No newline at end of file diff --git a/code/modules/paperwork/papershredder.dm b/code/modules/paperwork/papershredder.dm index 48e95071c5..3283e67f7d 100644 --- a/code/modules/paperwork/papershredder.dm +++ b/code/modules/paperwork/papershredder.dm @@ -1,10 +1,19 @@ +// +// Paper Shredder Machine +// /obj/machinery/papershredder name = "paper shredder" desc = "For those documents you don't want seen." - icon = 'icons/obj/bureaucracy.dmi' - icon_state = "papershredder0" + icon = 'icons/obj/papershredder.dmi' + icon_state = "shredder-off" + var/shred_anim = "shredder-shredding" density = 1 anchored = 1 + use_power = 1 + idle_power_usage = 10 + active_power_usage = 200 + power_channel = EQUIP + circuit = /obj/item/weapon/circuitboard/papershredder var/max_paper = 10 var/paperamount = 0 var/list/shred_amounts = list( @@ -16,17 +25,40 @@ /obj/item/weapon/paper_bundle = 3, ) +/obj/machinery/papershredder/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/stock_parts/motor(src) + component_parts += new /obj/item/weapon/stock_parts/gear(src) + component_parts += new /obj/item/weapon/stock_parts/gear(src) + component_parts += new /obj/item/weapon/stock_parts/micro_laser(src) + RefreshParts() + update_icon() + /obj/machinery/papershredder/attackby(var/obj/item/W, var/mob/user) if(istype(W, /obj/item/weapon/storage)) empty_bin(user, W) return + else if(istype(W, /obj/item/weapon/wrench)) + playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) + anchored = !anchored + user << "You [anchored ? "wrench" : "unwrench"] \the [src]." + return + else if(default_part_replacement(user, W)) + return + else if(default_deconstruction_screwdriver(user, W)) + return + else if(default_deconstruction_crowbar(user, W)) + return else var/paper_result for(var/shred_type in shred_amounts) if(istype(W, shred_type)) paper_result = shred_amounts[shred_type] if(paper_result) + if(inoperable()) + return // Need powah! if(paperamount == max_paper) user << "\The [src] is full; please empty it before you continue." return @@ -34,6 +66,7 @@ user.drop_from_inventory(W) qdel(W) playsound(src.loc, 'sound/items/pshred.ogg', 75, 1) + flick(shred_anim, src) if(paperamount > max_paper) user <<"\The [src] was too full, and shredded paper goes everywhere!" for(var/i=(paperamount-max_paper);i>0;i--) @@ -92,8 +125,40 @@ paperamount-- return PoolOrNew(/obj/item/weapon/shreddedp, get_turf(src)) +/obj/machinery/papershredder/power_change() + ..() + spawn(rand(0,15)) + update_icon() + /obj/machinery/papershredder/update_icon() - icon_state = "papershredder[max(0,min(5,Floor(paperamount/2)))]" + overlays.Cut() + if(operable()) + icon_state = "shredder-on" + else + icon_state = "shredder-off" + // Fullness overlay + overlays += "shredder-[max(0,min(5,Floor(paperamount/max_paper*5)))]" + if (panel_open) + overlays += "panel_open" + +// +// Shredded Paper Item +// + +/obj/item/weapon/shreddedp + name = "shredded paper" + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "shredp" + throwforce = 0 + w_class = ITEMSIZE_TINY + throw_range = 3 + throw_speed = 1 + +/obj/item/weapon/shreddedp/New() + ..() + pixel_x = rand(-5,5) + pixel_y = rand(-5,5) + if(prob(65)) color = pick("#BABABA","#7F7F7F") /obj/item/weapon/shreddedp/attackby(var/obj/item/W as obj, var/mob/user) if(istype(W, /obj/item/weapon/flame/lighter)) @@ -122,18 +187,3 @@ M.drop_from_inventory(src) PoolOrNew(/obj/effect/decal/cleanable/ash,get_turf(src)) qdel(src) - -/obj/item/weapon/shreddedp - name = "shredded paper" - icon = 'icons/obj/bureaucracy.dmi' - icon_state = "shredp" - throwforce = 0 - w_class = ITEMSIZE_TINY - throw_range = 3 - throw_speed = 1 - -/obj/item/weapon/shreddedp/New() - ..() - pixel_x = rand(-5,5) - pixel_y = rand(-5,5) - if(prob(65)) color = pick("#BABABA","#7F7F7F") diff --git a/icons/obj/jukebox.dmi b/icons/obj/jukebox.dmi index 9109049704..52386940e9 100644 Binary files a/icons/obj/jukebox.dmi and b/icons/obj/jukebox.dmi differ diff --git a/icons/obj/papershredder.dmi b/icons/obj/papershredder.dmi new file mode 100644 index 0000000000..36764945df Binary files /dev/null and b/icons/obj/papershredder.dmi differ diff --git a/nano/css/shared.css b/nano/css/shared.css index 8728102b08..dc6089716d 100644 --- a/nano/css/shared.css +++ b/nano/css/shared.css @@ -212,6 +212,10 @@ h4 { font-size: 10px; } +.multiLine { + white-space: pre-wrap; +} + .noticePlaceholder { position: relative; font-size: 12px; diff --git a/nano/templates/pai_medrecords.tmpl b/nano/templates/pai_medrecords.tmpl index 37b1d7061c..89926d3915 100644 --- a/nano/templates/pai_medrecords.tmpl +++ b/nano/templates/pai_medrecords.tmpl @@ -75,7 +75,7 @@ code/modules/mob/living/silicon/pai/software_modules.dm